diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index ae1ccbc47b..0000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "fe-lang-v2", - "image": "mcr.microsoft.com/devcontainers/rust:latest", - "features": { - "ghcr.io/devcontainers/features/node:1": {}, - "ghcr.io/devcontainers/features/github-cli:1": {}, - }, - "extensions": [ - "GitHub.vscode-github-actions", - "ms-vsliveshare.vsliveshare", - "vadimcn.vscode-lldb", - "matklad.rust-analyzer", - "serayuzgur.crates", - "tamasfe.even-better-toml", - "usernamehw.errorlens", - "aaron-bond.better-comments", - "yzhang.markdown-all-in-one" - ], - "settings": { - "explorer.compactFolders": false, - "editor.rulers": [ - 80 - ], - "workbench.colorTheme": "Default Dark+", - "workbench.preferredDarkColorTheme": "Monokai", - "workbench.colorCustomizations": { - "editorRuler.foreground": "#5f5f62" - }, - "workbench.activityBar.location": "top" - } -} \ No newline at end of file diff --git a/.github/install_deps.sh b/.github/install_deps.sh deleted file mode 100755 index 55220da57c..0000000000 --- a/.github/install_deps.sh +++ /dev/null @@ -1,4 +0,0 @@ -sudo apt-get update -sudo apt-get install -y libboost-all-dev -sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 50 -sudo update-alternatives --set g++ "/usr/bin/g++-10" \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 17f77b6277..0000000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,181 +0,0 @@ -name: CI - -on: - push: - branches: [master] - tags: - - v* - - pull_request: - -env: - CARGO_TERM_COLOR: always - CARGO_INCREMENTAL: 0 - CARGO_PROFILE_TEST_DEBUG: 0 - RUST_BACKTRACE: full - SOLC_VERSION: v0.8.30 - -jobs: - lint: - runs-on: ubuntu-latest - env: - RUSTFLAGS: "-D warnings" - steps: - - uses: actions/checkout@v5 - - name: Install rust - uses: dtolnay/rust-toolchain@stable - with: - toolchain: stable - components: rustfmt, clippy - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - name: Validate release notes entry - run: ./newsfragments/validate_files.py - - name: Lint with rustfmt - run: cargo fmt --all -- --check - - name: Lint with clippy - run: cargo clippy --locked --workspace --all-targets --all-features -- -D clippy::all - - test: - # Build & Test runs on all platforms - runs-on: ${{ matrix.os }} - strategy: - matrix: - include: - - os: ubuntu-latest - - os: macOS-latest - - os: windows-latest - steps: - - uses: actions/checkout@v5 - - name: Install rust - uses: dtolnay/rust-toolchain@stable - with: - toolchain: stable - - name: Cache solc - id: solc-cache - uses: actions/cache@v4 - with: - path: ${{ runner.os == 'Windows' && format('{0}\\solc-{1}.exe', runner.temp, env.SOLC_VERSION) || format('{0}/solc-{1}', runner.temp, env.SOLC_VERSION) }} - key: solc-${{ runner.os }}-${{ env.SOLC_VERSION }} - - name: Download solc (Linux/macOS) - if: steps.solc-cache.outputs.cache-hit != 'true' && runner.os != 'Windows' - run: | - set -euo pipefail - if [ "${{ runner.os }}" = "Linux" ]; then - url="https://github.com/ethereum/solidity/releases/download/${SOLC_VERSION}/solc-static-linux" - else - url="https://github.com/ethereum/solidity/releases/download/${SOLC_VERSION}/solc-macos" - fi - curl -Ls "$url" -o "$RUNNER_TEMP/solc-${SOLC_VERSION}" - chmod +x "$RUNNER_TEMP/solc-${SOLC_VERSION}" - - name: Download solc (Windows) - if: steps.solc-cache.outputs.cache-hit != 'true' && runner.os == 'Windows' - shell: pwsh - run: | - $url = "https://github.com/ethereum/solidity/releases/download/$env:SOLC_VERSION/solc-windows.exe" - $output = "$env:RUNNER_TEMP\solc-$env:SOLC_VERSION.exe" - Invoke-WebRequest -Uri $url -OutFile $output - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: stable - - name: Install cargo-nextest - uses: taiki-e/install-action@nextest - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - with: - cache-workspace-crates: true - - name: Build - run: cargo test --release --workspace --all-features --no-run --locked --exclude fe-language-server --exclude fe-bench - - name: Run tests - env: - FE_SOLC_PATH: ${{ runner.os == 'Windows' && format('{0}\\solc-{1}.exe', runner.temp, env.SOLC_VERSION) || format('{0}/solc-{1}', runner.temp, env.SOLC_VERSION) }} - run: cargo nextest run --release --workspace --all-features --no-fail-fast --locked --exclude fe-language-server --exclude fe-bench - - wasm-wasi-check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v5 - - name: Install rust - uses: dtolnay/rust-toolchain@stable - with: - toolchain: stable - - name: Install WASM targets - run: | - rustup target add wasm32-unknown-unknown - rustup target add wasm32-wasip1 - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - name: Check core crates for wasm32-unknown-unknown - run: cargo check --locked -p fe-common -p fe-parser -p fe-hir --target wasm32-unknown-unknown - - name: Check filesystem crates for wasm32-wasip1 - run: cargo check --locked -p fe-driver -p fe-resolver --target wasm32-wasip1 - - release: - # Only run this when we push a tag - if: startsWith(github.ref, 'refs/tags/') - runs-on: ${{ matrix.os }} - needs: [lint, test, wasm-wasi-check] - permissions: - contents: write - strategy: - matrix: - include: - - os: ubuntu-latest - target: x86_64-unknown-linux-gnu - BIN_FILE: fe_linux_amd64 - EXT: "" - EXTRA_FEATURES: "" - STRIP: strip - - os: ubuntu-latest - target: aarch64-unknown-linux-gnu - BIN_FILE: fe_linux_arm64 - EXT: "" - EXTRA_FEATURES: "--features vendored-openssl" - STRIP: aarch64-linux-gnu-strip - - os: macOS-latest - target: aarch64-apple-darwin - BIN_FILE: fe_mac_arm64 - EXT: "" - EXTRA_FEATURES: "" - STRIP: strip - - os: macOS-latest - target: x86_64-apple-darwin - BIN_FILE: fe_mac_amd64 - EXT: "" - EXTRA_FEATURES: "--features vendored-openssl" - STRIP: strip - - os: windows-latest - target: x86_64-pc-windows-msvc - BIN_FILE: fe_windows_amd64.exe - EXT: ".exe" - EXTRA_FEATURES: "" - STRIP: "" - - steps: - - uses: actions/checkout@v5 - - name: Install cross-compilation toolchain (Linux ARM64) - if: matrix.target == 'aarch64-unknown-linux-gnu' - run: | - sudo apt-get update - sudo apt-get install -y gcc-aarch64-linux-gnu - - name: Install rust - uses: dtolnay/rust-toolchain@stable - with: - toolchain: stable - targets: ${{ matrix.target }} - - name: Build - env: - CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc - run: cargo build --locked --release --target ${{ matrix.target }} ${{ matrix.EXTRA_FEATURES }} - - name: Strip binary (Unix) - if: runner.os != 'Windows' - run: ${{ matrix.STRIP }} target/${{ matrix.target }}/release/fe - - name: Rename binary - shell: bash - run: mv target/${{ matrix.target }}/release/fe${{ matrix.EXT }} target/${{ matrix.target }}/release/${{ matrix.BIN_FILE }} - - name: Release - uses: softprops/action-gh-release@v2 - with: - files: target/${{ matrix.target }}/release/${{ matrix.BIN_FILE }} - prerelease: true diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 06c273070c..0000000000 --- a/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -.idea -/target -**/*.rs.bk -tarpaulin-report.html -/output -/docs/tmp_snippets -.vscode -.DS_Store - -# OpenSpec and AI assistant files -openspec/ -AGENTS.md -CLAUDE.md -.claude/ -.gemini/ - -# Local debug artifacts -stackify_*.txt -trace_*.txt diff --git a/.towncrier.template.md b/.towncrier.template.md deleted file mode 100644 index 997b6e4354..0000000000 --- a/.towncrier.template.md +++ /dev/null @@ -1,28 +0,0 @@ -{% for section, _ in sections.items() %} -{%- if section %}{{section}}{% endif -%} - -{% if sections[section] %} -{% for category, val in definitions.items() if category in sections[section]%} -### {{ definitions[category]['name'] }} - -{% if definitions[category]['showcontent'] %} -{% for text, values in sections[section][category].items() %} -- {{ values|join(', ') }} {{ text }} -{% endfor %} - -{% else %} -- {{ sections[section][category]['']|join(', ') }} - -{% endif %} -{% if sections[section][category]|length == 0 %} -No significant changes. - -{% else %} -{% endif %} - -{% endfor %} -{% else %} -No significant changes. - -{% endif %} -{% endfor %} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 5629d148dc..0000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}/crates/language-server/editors/vscode", - "${workspaceFolder}/crates/", - "--disable-extensions" - ], - "name": "Launch Fe VSCode Extension", - "outFiles": [ - "${workspaceFolder}/crates/language-server/editors/vscode/out/**/*.js" - ], - "preLaunchTask": "compile-vscode-extension", - "request": "launch", - "type": "extensionHost", - "env": { - "RUST_BACKTRACE": "full", - "NODE_ENV": "development" - } - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index e1f31fd4b7..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "editor.tabSize": 4, - "rust-analyzer.linkedProjects": [ - "./crates/language-server/Cargo.toml" - ], -} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 471a8d4df9..0000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "compile-vscode-extension", - "type": "shell", - "command": "npm install && npm run compile", - "options": { - "cwd": "${workspaceFolder}/crates/language-server/editors/vscode" - }, - "problemMatcher": [] - } - ] -} \ No newline at end of file diff --git a/.zed/settings.json b/.zed/settings.json deleted file mode 100644 index 59859a5956..0000000000 --- a/.zed/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "languages": { - "Fe": { - "enable_language_server": false - } - } -} diff --git a/CLI.md b/CLI.md deleted file mode 100644 index 346cf4cb7a..0000000000 --- a/CLI.md +++ /dev/null @@ -1,507 +0,0 @@ -# Fe CLI behavior (current implementation) - -This document describes the **current** behavior of the `fe` CLI as implemented in this repository (crate `crates/fe`). -It is not a stability guarantee. - -## Conventions - -### Global options - -- `--color `: controls colored output (default: `auto`). - -### Output streams - -- **Stdout**: “normal” command output (e.g. artifact paths, formatted file paths, dependency trees). -- **Stderr**: diagnostics, errors, warnings, and hints. - -### Message prefixes - -User-facing diagnostics follow these conventions: - -- `Error: ...` for errors (typically causes non-zero exit for `build`, `check`, `test`, `fmt --check`). -- `Warning: ...` for non-fatal warnings. -- `Hint: ...` for suggestions following an error. - -The CLI intentionally does **not** use emoji/icon markers. - -### Exit codes - -- `0` on success. -- `1` on failure. -- `2` on CLI usage/argument parsing errors (emitted by `clap`, e.g. unknown flags or missing values). - -Notable exceptions: - -- `fe check` / `fe build` / `fe tree` on a workspace root with **no members** prints a warning explaining why (no members configured, or configured paths don't exist) and exits `0`. - -### Paths and UTF-8 - -Many CLI paths use `camino::Utf8PathBuf` internally. If a relevant path (including the current directory) is not valid UTF-8, the CLI may error. - -### Colors - -Some subcommands emit ANSI-colored output: - -- `fe fmt --check` prints colored diffs. -- `fe test` prints colored `ok` / `FAILED`. -- `fe tree` renders cycle nodes in red via ANSI escape codes. - -Color emission is controlled by `--color` and respects common environment conventions (`CLICOLOR_FORCE`, `NO_COLOR`, `CLICOLOR`) in `auto` mode. - -## Target resolution (paths vs workspace member names) - -Several subcommands take a single “target” argument which can be: - -- a **standalone** `.fe` file, -- a **directory** containing `fe.toml` (ingot root or workspace root), -- or a **workspace member name** (when run from within a workspace context). - -The general rules are: - -1) **`fe.toml` file paths are rejected**. Pass the containing directory instead. -2) A path that is a **file** must end in `.fe` to be treated as a source file. -3) A path that is a **directory** must contain `fe.toml` to be treated as a project. -4) A **workspace member name** is only considered when the argument: - - looks like a name (ASCII alphanumeric and `_`), and - - the current working directory is inside a workspace context that contains a matching member. - - If the argument also exists as a filesystem path, the CLI requires that the name and path refer to the same member (see disambiguation below). - - Note: name lookup uses the workspace’s “default selection” of members. If the workspace `fe.toml` sets `default-members`, only those members are considered by default; non-default members may need to be targeted by path. - -### Disambiguation: “name” vs existing path - -If the argument both: - -- looks like a workspace member name, **and** -- exists as a path, - -then the CLI requires that they refer to the **same** workspace member; otherwise it errors with a disambiguation message (e.g. “argument matches a workspace member name but does not match the provided path”). - -### Standalone vs ingot context for `.fe` files - -For `build` and `check`: - -- If you pass a `.fe` file that lives under an **ingot** (nearest ancestor `fe.toml` parses as an ingot config), the command runs in **ingot context** (so imports resolve as they would from the ingot). - - Override: `--standalone` forces standalone mode for that `.fe` file target. -- If you pass a `.fe` file that lives under a **workspace root** (nearest ancestor `fe.toml` parses as a workspace config), the command treats the file as **standalone** unless you explicitly target the workspace/ingot by passing a directory or member name. - -## `fe build` - -Compiles Fe contracts to EVM bytecode. - -- `--backend sonatina` (default): generates bytecode directly (no `solc` required). -- `--backend yul`: emits Yul and invokes `solc`. - -### Synopsis - -``` -fe build [--standalone] [--contract ] [--backend ] [--opt-level ] [--optimize] [--solc ] [--out-dir ] [--report [--report-out ] [--report-failed-only]] [path] -``` - -If `path` is omitted, it defaults to `.`. - -### Inputs - -`fe build` accepts: - -- a `.fe` file path (standalone mode unless the file is inside an ingot; see above), -- an ingot directory (contains `fe.toml` parsing as `[ingot]`), -- a workspace root directory (contains `fe.toml` parsing as `[workspace]`), -- a workspace member name (when run from inside a workspace). - -### Output directory - -- Standalone `.fe` file default: `/out` -- Ingot directory default: `/out` -- Workspace root default: `/out` -- Override: `--out-dir ` - - If `` is relative, it is resolved relative to the **current working directory**. - - Note: default output directories are derived from the **canonicalized** (absolute) target path, so the printed `Wrote ...` paths are absolute by default unless `--out-dir` is set. - -### What gets built - -#### Standalone `.fe` file target - -- The compiler analyzes the file’s top-level module. -- Contracts are discovered and, by default, **all** contracts in that module are built. - -#### Ingot target - -- The ingot and its dependencies are resolved/initialized. -- `src/lib.fe` is treated as the ingot’s root module. If it is missing, the CLI behaves as if an empty `src/lib.fe` existed (a “phantom” root module). -- Contracts are discovered across the ingot’s entire source set (`src/**/*.fe` top-level modules), not only `src/lib.fe`. -- By default, **all** discovered contracts are built. - -#### Workspace root target - -Workspace builds use a **flat output directory**: - -- All member artifacts are written directly into the same `out` directory. -- Before building, the CLI checks for **artifact name collisions** across workspace members: - - Artifact filenames are derived from a sanitized contract name (see below). - - Collision detection is **case-insensitive** (e.g. `Foo` and `foo` collide) to avoid filesystem-dependent behavior on case-insensitive filesystems. - - If multiple contracts (possibly from different members) map to the same artifact base name, the build errors and lists the conflicts. - -Workspace member selection: - -- The set of members considered is the workspace’s “default selection”. - - If `default-members` is present, only those members are built. - - Otherwise, all discovered members are built (including any `dev` members). -- Workspace builds skip members with **zero** contracts; if all selected members have zero contracts, the build fails with `Error: No contracts found to build`. - -### Contract selection: `--contract ` - -- For standalone files and ingots: - - If `` exists, only that contract is built. - - If not found, the build errors and prints “Available contracts:” with a list. -- For workspace roots: - - If **exactly one** workspace member contains the contract, that member is built for that contract. - - If **zero** members contain the contract, it errors. - - It also prints “Available contracts:” for the workspace (unique contract names), capped at `50`, followed by `... and N more` if applicable. - - If **multiple** members contain the contract, it errors and prints a “Matches:” list and a hint to build a specific member by name or path. - -### Backend selection: `--backend ` - -`fe build` currently supports: - -- `sonatina` (default): directly generates EVM bytecode via Sonatina IR. - - `--opt-level ` controls Sonatina optimizations (see below). - - `--solc` is ignored; if passed, it prints `Warning: --solc is only used with --backend yul; ignoring --solc`. - - `FE_SOLC_PATH` is ignored. -- `yul`: emits Yul and invokes `solc` to produce bytecode. - -### Solc selection (Yul backend only): `--solc` and `FE_SOLC_PATH` - -When `--backend yul`, `fe build` invokes `solc` using: - -1) `--solc ` if provided (highest priority), -2) `FE_SOLC_PATH` if set, -3) otherwise `solc` resolved via `PATH`. - -If `solc` fails, `fe build` prints an error and a hint: - -``` -Error: solc failed for contract "":
-Hint: install solc, set FE_SOLC_PATH, or pass --solc . -``` - -### Optimization - -Optimization is controlled by `--opt-level ` (and the `--optimize` shorthand). - -Defaults: - -- `--opt-level` defaults to `1` (for both backends). - -Backend behavior: - -- Yul backend: `--opt-level 0` disables the solc optimizer, and `--opt-level 1` / `2` enables it. - - Note: `--opt-level 2` currently has no additional effect over `--opt-level 1` for solc; the CLI prints a warning. -- Sonatina backend: `--opt-level ` controls Sonatina optimizations: - - `0`: none - - `1`: balanced (default) - - `2`: aggressive - -`--optimize` is shorthand for `--opt-level 1`. - -- If you pass `--optimize --opt-level 0`, the CLI errors. -- If you pass `--optimize --opt-level 2`, it has no effect. - -### Artifacts and filenames - -For each built contract, `fe build` writes: - -- `/.bin` (deploy bytecode, hex + trailing newline) -- `/.runtime.bin` (runtime bytecode, hex + trailing newline) - -For the Sonatina backend, `.bin` is the **init section** bytes and `.runtime.bin` is the **runtime section** bytes. - -The on-screen output is per-artifact: - -``` -Wrote /.bin -Wrote /.runtime.bin -``` - -Filenames are “sanitized” from contract names: - -- Allowed: ASCII alphanumeric, `_`, `-` -- Other characters become `_` -- If the sanitized name is empty, it becomes `contract` - -This sanitization is also what the workspace collision check uses. - -### Reports: `--report` - -`fe build` can optionally write a `.tar.gz` debugging report (useful for sharing failures): - -- `--report`: enable report generation. -- `--report-out `: output path (default: `fe-build-report.tar.gz`). -- `--report-failed-only`: only write the report if `fe build` fails. - -The build report is best-effort and includes: - -- `inputs/`: the ingot or `.fe` file inputs (same rules as `fe check` / `fe test`). -- `artifacts/`: emitted IR (e.g. Yul) and bytecode artifacts (when available). -- `errors/`: best-effort captured errors/panics (if any). -- `meta/`: environment and tool metadata. - -## `fe check` - -Type-checks and analyzes Fe code (no bytecode output). - -### Synopsis - -``` -fe check [--standalone] [--dump-mir] [--report [--report-out ] [--report-failed-only]] [path] -``` - -If `path` is omitted, it defaults to `.`. - -### Inputs - -Same target resolution rules as `fe build`: - -- `.fe` file, ingot directory, workspace root directory, or workspace member name. - -### Workspace behavior - -- `fe check ` checks all members in the workspace’s default selection. - - If the workspace `fe.toml` sets `default-members`, only those member paths are checked. - - Otherwise, all discovered members are checked. -- If the selection is empty, it prints a warning explaining why (no members configured, or configured paths don't exist on disk) and exits `0`. - -### Dependency errors - -When checking an ingot with dependencies, if downstream ingots have errors, `fe check` prints a summary line: - -- `Error: Downstream ingot has errors` -- or `Error: Downstream ingots have errors` - -Then, for each dependency with errors, it prints a short header (name/version when available) and its URL, followed by emitted diagnostics. - -### Optional outputs - -- `--dump-mir`: prints MIR for the root module (only when there are no analysis errors). - -### Reports: `--report` - -`fe check` can optionally write a `.tar.gz` debugging report (useful for sharing failures): - -- `--report`: enable report generation. -- `--report-out `: output path (default: `fe-check-report.tar.gz`). -- `--report-failed-only`: only write the report if `fe check` fails. - -The check report is analysis-only and includes: - -- `inputs/`: the ingot or `.fe` file inputs. -- `errors/`: diagnostics output (when available). -- `artifacts/`: MIR dump (when available). -- `meta/`: environment and tool metadata. - -## `fe tree` - -Prints the ingot dependency tree. - -### Synopsis - -``` -fe tree [path] -``` - -If `path` is omitted, it defaults to `.`. - -### Inputs - -`fe tree` accepts: - -- a directory path (ingot root or workspace root), -- a workspace member name (when run from inside a workspace). - -Unlike `build`/`check`, `fe tree` does not take a `.fe` file target. - -### Output format - -The tree output is a text tree using `├──`/`└──` connectors. - -Annotations: - -- Cycle closures are labeled with ` [cycle]`. -- Local → remote edges are labeled with ` [remote]`. -- Nodes that are part of a cycle are rendered in red via ANSI escape codes. - - This respects `--color` (and `NO_COLOR` in `auto` mode). - -### Workspace roots - -When the target is a workspace root, `fe tree` prints a separate tree per member, each preceded by: - -``` -== == -``` - -### Diagnostics and exit status - -If `fe tree` prints any `Error:` diagnostics (including ingot initialization diagnostics like dependency cycles), it exits `1`. - -Even when it exits `1`, it still prints the dependency tree for the target (best-effort). - -## `fe fmt` - -Formats Fe source code. - -### Synopsis - -``` -fe fmt [path] [--check] -``` - -### Inputs - -- If `path` is a file: formats that single file. -- If `path` is a directory: formats all `.fe` files under that directory (recursive). -- If `path` is omitted: finds the current project root (via `fe.toml`) and formats all `.fe` files under `/src`. - -### `--check` - -- Does not write changes. -- Prints a unified diff for each file that would change. -- Exits `1` if any files are unformatted (or if IO errors occur). - -## `fe test` - -Runs Fe tests via the test harness (revm-based execution). - -### Synopsis - -``` -fe test [--filter ] [--jobs ] [--grouped] [--show-logs] [--debug[=]] [--backend ] [--solc ] [--opt-level ] [--optimize] [--trace-evm] [--trace-evm-keep ] [--trace-evm-stack-n ] [--sonatina-symtab] [--debug-dir ] [--report [--report-out ]] [--report-dir [--report-failed-only]] [--call-trace] [path]... -``` - -### Inputs - -- Zero or more paths (files or directories). -- Supports glob patterns (e.g. `crates/fe/tests/fixtures/fe_test/*.fe`). -- When omitted, defaults to the current project root (like `cargo test`). - -### Discovery and filtering - -- Tests are functions marked with a `#[test]` attribute. -- `--filter ` is a substring match against the test’s name. - -### Execution - -- `--jobs ` controls how many suites run in parallel (`0` = auto). -- By default, parallel execution uses per-test jobs after suite discovery. -- `--grouped` keeps suite-by-suite execution (each worker runs whole suites). - -### Debugging - -- `--debug[=]` prints Yul output when using the Yul backend. -- `--trace-evm`, `--trace-evm-keep`, `--trace-evm-stack-n` enable EVM opcode tracing. -- `--sonatina-symtab` dumps the Sonatina runtime symbol table (function offsets/sizes). -- `--debug-dir ` writes debug outputs (traces, symtabs) into a directory. -- `--call-trace` prints a normalized call trace for each test (backend comparison). - -### Output - -- Per-test output is `PASS [s] ` / `FAIL [s] ` (colored). -- In multi-input runs, output is tabular: ` `, with suite names colored magenta. -- Progress/status labels include `COMPILING`, `READY` (blue), `PASS` (green), `FAIL` (red), and `ERROR` (red). -- `--show-logs` prints EVM logs (when available). -- A summary is printed if at least one test ran. -- If a suite has no tests, it prints `Warning: No tests found in ` and continues (exit code is still `0` if there are no failures elsewhere). - -### Reports: `--report` and `--report-dir` - -- `--report` writes a single `.tar.gz` report (default output: `fe-test-report.tar.gz`). -- `--report-dir ` writes one `.tar.gz` report per input suite into `` (useful with globs). -- `--report-failed-only` only writes per-suite reports for failing suites (requires `--report-dir`). - -### Solc dependency - -Default backend is `sonatina`. - -When `--backend yul`, `fe test` compiles generated Yul using `solc` selected by: - -1) `--solc ` if provided (highest priority), -2) `FE_SOLC_PATH` if set, -3) otherwise `solc` resolved via `PATH`. - -Optimization flags: - -- Optimization is controlled by `--opt-level ` (and the `--optimize` shorthand). -- Sonatina backend: `--opt-level ` controls the optimization pipeline. -- Yul backend: `--opt-level 0` disables the solc optimizer, and `--opt-level 1` / `2` enables it. - - Note: `--opt-level 2` currently has no additional effect over `--opt-level 1` for Yul/solc; the CLI prints a warning. -- `--optimize` is shorthand for `--opt-level 1`. - - If you pass `--optimize --opt-level 0`, the CLI errors. - -When `--backend sonatina`, `fe test` generates bytecode directly and does not require `solc` (`--solc` is ignored with a warning). - -## `fe new` - -Creates a new ingot or workspace layout. - -### Synopsis - -``` -fe new [--workspace] [--name ] [--version ] -``` - -### Behavior - -- `fe new ` creates an ingot: - - `/fe.toml` (ingot config) - - `/src/lib.fe` (conventional root module; missing `src/lib.fe` is treated as an empty root module) -- `fe new --workspace ` creates a workspace root with `/fe.toml`. - -Safety checks: - -- Refuses to overwrite an existing `fe.toml` or `src/lib.fe`. -- Errors if the target path exists and is a file. - -Workspace suggestion: - -- After creating an ingot, if an enclosing workspace is detected, `fe new` may print a suggestion to add the ingot path to the workspace’s `members` (or `members.main` for grouped configs). -- If workspace member discovery fails, it prints a warning: - -``` -Warning: failed to check workspace members:
-``` - -## `fe completion` - -Generates shell completion scripts for `fe`. - -### Synopsis - -``` -fe completion -``` - -This writes the completion script to **stdout**. Supported shells are determined by `clap_complete` (commonly: `bash`, `zsh`, `fish`, `powershell`, `elvish`). - -## `fe lsif` - -Generates an LSIF index for code navigation. - -### Synopsis - -``` -fe lsif [-o, --output ] [path] -``` - -- If `path` is omitted, it defaults to `.`. -- If `--output` is omitted, the index is written to **stdout**. - -## `fe scip` - -Generates a SCIP index for code navigation. - -### Synopsis - -``` -fe scip [-o, --output ] [path] -``` - -- If `path` is omitted, it defaults to `.`. -- `--output` defaults to `index.scip`. diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index a49ca4d846..0000000000 --- a/Cargo.lock +++ /dev/null @@ -1,6426 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "act-locally" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef9a921eb67a664d9e4d4ec3cc00caac360326f12625edc77ec3f5ce60fa7254" -dependencies = [ - "futures", - "smol", - "tracing", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[package]] -name = "alloy-eip2124" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "crc", - "serde", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-eip2930" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", -] - -[[package]] -name = "alloy-eip7702" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "k256", - "serde", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-eip7928" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3231de68d5d6e75332b7489cfcc7f4dfabeba94d990a10e4b923af0e6623540" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", -] - -[[package]] -name = "alloy-eips" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def1626eea28d48c6cc0a6f16f34d4af0001906e4f889df6c660b39c86fd044d" -dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702", - "alloy-eip7928", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "auto_impl", - "borsh", - "c-kzg", - "derive_more 2.0.1", - "either", - "serde", - "serde_with", - "sha2", - "thiserror 2.0.18", -] - -[[package]] -name = "alloy-primitives" -version = "1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b1483f8c2562bf35f0270b697d5b5fe8170464e935bd855a4c5eaf6f89b354" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more 2.0.1", - "foldhash 0.2.0", - "hashbrown 0.16.1", - "indexmap 2.13.0", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.9.2", - "rapidhash", - "ruint", - "rustc-hash 2.1.1", - "serde", - "sha3", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93e50f64a77ad9c5470bf2ad0ca02f228da70c792a8f06634801e202579f35e" -dependencies = [ - "alloy-rlp-derive", - "arrayvec 0.7.6", - "bytes", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8849c74c9ca0f5a03da1c865e3eb6f768df816e67dd3721a398a8a7e398011" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "alloy-serde" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6d631f8b975229361d8af7b2c749af31c73b3cf1352f90e144ddb06227105e" -dependencies = [ - "alloy-primitives", - "serde", - "serde_json", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" - -[[package]] -name = "annotate-snippets" -version = "0.12.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e4850548ff4a25a77ce3bda7241874e17fb702ea551f0cc62a2dbe052f1272" -dependencies = [ - "anstyle", - "unicode-width 0.2.2", -] - -[[package]] -name = "anstream" -version = "0.6.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" - -[[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-query" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.61.2", -] - -[[package]] -name = "anyhow" -version = "1.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" - -[[package]] -name = "arc-swap" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" -dependencies = [ - "rustversion", -] - -[[package]] -name = "ark-bls12-381" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df4dcc01ff89867cd86b0da835f23c3f02738353aaee7dde7495af71363b8d5" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-bn254" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-r1cs-std", - "ark-std 0.5.0", -] - -[[package]] -name = "ark-ec" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-poly", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.5", - "itertools 0.13.0", - "num-bigint", - "num-integer", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" -dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.1", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm 0.5.0", - "ark-ff-macros 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "arrayvec 0.7.6", - "digest 0.10.7", - "educe", - "itertools 0.13.0", - "num-bigint", - "num-traits", - "paste", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-asm" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.116", -] - -[[package]] -name = "ark-ff-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "ark-poly" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" -dependencies = [ - "ahash", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "educe", - "fnv", - "hashbrown 0.15.5", -] - -[[package]] -name = "ark-r1cs-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" -dependencies = [ - "ark-ec", - "ark-ff 0.5.0", - "ark-relations", - "ark-std 0.5.0", - "educe", - "num-bigint", - "num-integer", - "num-traits", - "tracing", -] - -[[package]] -name = "ark-relations" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" -dependencies = [ - "ark-ff 0.5.0", - "ark-std 0.5.0", - "tracing", - "tracing-subscriber 0.2.25", -] - -[[package]] -name = "ark-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-serialize-derive", - "ark-std 0.5.0", - "arrayvec 0.7.6", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "ark-std" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "ark-std" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "ascii_tree" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6c635b3aa665c649ad1415f1573c85957dfa47690ec27aebe7ec17efe3c643" - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-compat" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ba85bc55464dcbf728b56d97e119d673f4cf9062be330a9a26f3acf504a590" -dependencies = [ - "futures-core", - "futures-io", - "once_cell", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "async-executor" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix 1.1.3", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-lock" -version = "3.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener 5.4.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-lsp" -version = "0.2.1" -source = "git+https://github.com/micahscopes/async-lsp?branch=pub-inner-type-id#5ce6e1ba89162d90825bafdd4f9d265fa9909d02" -dependencies = [ - "futures", - "lsp-types", - "pin-project-lite", - "rustix 0.38.44", - "serde", - "serde_json", - "thiserror 2.0.18", - "tokio", - "tower-layer", - "tower-service", - "tracing", - "waitpid-any", -] - -[[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-process" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" -dependencies = [ - "async-channel 2.5.0", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener 5.4.1", - "futures-lite", - "rustix 1.1.3", -] - -[[package]] -name = "async-signal" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.1.3", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-std" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" -dependencies = [ - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "aurora-engine-modexp" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518bc5745a6264b5fd7b09dffb9667e400ee9e2bbe18555fac75e1fe9afa0df9" -dependencies = [ - "hex", - "num", -] - -[[package]] -name = "auto_impl" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "az" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5eb007b7cacc6c660343e96f650fedf4b5a77512399eb952ca6642cf8d13f7" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - -[[package]] -name = "beef" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" - -[[package]] -name = "bimap" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" - -[[package]] -name = "bit-set" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitcoin-io" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" - -[[package]] -name = "bitcoin_hashes" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" -dependencies = [ - "bitcoin-io", - "hex-conservative", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" - -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel 2.5.0", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - -[[package]] -name = "blst" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "borsh" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" -dependencies = [ - "borsh-derive", - "cfg_aliases", -] - -[[package]] -name = "borsh-derive" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" -dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "boxcar" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e" - -[[package]] -name = "bumpalo" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" - -[[package]] -name = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "2.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "camino" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[package]] -name = "cc" -version = "1.2.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" -dependencies = [ - "iana-time-zone", - "num-traits", - "serde", - "windows-link", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - -[[package]] -name = "clap" -version = "4.5.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_complete" -version = "4.5.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c757a3b7e39161a4e56f9365141ada2a6c915a8622c408ab6bb4b5d047371031" -dependencies = [ - "clap", -] - -[[package]] -name = "clap_derive" -version = "4.5.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "clap_lex" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width 0.1.14", -] - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - -[[package]] -name = "colored" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" -dependencies = [ - "lazy_static", - "windows-sys 0.59.0", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-hex" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" -dependencies = [ - "cfg-if", - "cpufeatures", - "proptest", - "serde_core", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const_format" -version = "0.2.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "countme" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "cranelift-bitset" -version = "0.115.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720b93bd86ebbb23ebfb2db1ed44d54b2ecbdbb2d034d485bc64aa605ee787ab" - -[[package]] -name = "cranelift-bitset" -version = "0.126.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006fe8776f6d81acb83571f52e7737a54c6dec1ba75e2b7b5a68af15451f88ee" - -[[package]] -name = "cranelift-entity" -version = "0.115.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760af4b5e051b5f82097a27274b917e3751736369fa73660513488248d27f23d" -dependencies = [ - "cranelift-bitset 0.115.1", -] - -[[package]] -name = "cranelift-entity" -version = "0.126.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcca10e8c33eac67a45be4e09d236e274697831ca6bf4c4a927f7570eb8436a8" -dependencies = [ - "cranelift-bitset 0.126.2", -] - -[[package]] -name = "crc" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "criterion" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" -dependencies = [ - "anes", - "cast", - "ciborium", - "clap", - "criterion-plot", - "is-terminal", - "itertools 0.10.5", - "num-traits", - "once_cell", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" -dependencies = [ - "cast", - "itertools 0.10.5", -] - -[[package]] -name = "crossbeam" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "csv" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde_core", -] - -[[package]] -name = "csv-core" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" -dependencies = [ - "memchr", -] - -[[package]] -name = "darling" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.116", -] - -[[package]] -name = "darling_macro" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", - "rayon", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive-where" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", -] - -[[package]] -name = "derive_more" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" -dependencies = [ - "derive_more-impl 2.0.1", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "derive_more-impl" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", - "unicode-xid", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "dir-test" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62c013fe825864f3e4593f36426c1fa7a74f5603f13ca8d1af7a990c1cd94a79" -dependencies = [ - "dir-test-macros", -] - -[[package]] -name = "dir-test-macros" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d42f54d7b4a6bc2400fe5b338e35d1a335787585375322f49c5d5fe7b243da7e" -dependencies = [ - "glob", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "dogged" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2638df109789fe360f0d9998c5438dd19a36678aaf845e46f285b688b1a1657a" - -[[package]] -name = "dot-generator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aaac7ada45f71873ebce336491d1c1bc4a7c8042c7cea978168ad59e805b871" -dependencies = [ - "dot-structures", -] - -[[package]] -name = "dot-structures" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cfcded997a93eb31edd639361fa33fd229a8784e953b37d71035fe3890b7b" - -[[package]] -name = "dot2" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855423f2158bcc73798b3b9a666ec4204597a72370dc91dbdb8e7f9519de8cc3" - -[[package]] -name = "dot2" -version = "1.0.0" -source = "git+https://github.com/sanpii/dot2.rs.git#5c4ffa7182d3e6c14b91b94bb9efaad1e218022b" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "egglog" -version = "1.0.0" -source = "git+https://github.com/sbillig/egglog?rev=ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef#ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef" -dependencies = [ - "chrono", - "clap", - "csv", - "dyn-clone", - "egglog-add-primitive", - "egglog-ast", - "egglog-bridge", - "egglog-core-relations", - "egglog-numeric-id", - "egglog-reports", - "egraph-serialize", - "env_logger", - "hashbrown 0.16.1", - "im-rc", - "indexmap 2.13.0", - "log", - "mimalloc", - "num", - "ordered-float", - "rayon", - "ruint", - "rustc-hash 2.1.1", - "serde_json", - "thiserror 2.0.18", - "web-time", -] - -[[package]] -name = "egglog-add-primitive" -version = "1.0.0" -source = "git+https://github.com/sbillig/egglog?rev=ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef#ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef" -dependencies = [ - "quote", - "syn 2.0.116", -] - -[[package]] -name = "egglog-ast" -version = "1.0.0" -source = "git+https://github.com/sbillig/egglog?rev=ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef#ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef" -dependencies = [ - "ordered-float", -] - -[[package]] -name = "egglog-bridge" -version = "1.0.0" -source = "git+https://github.com/sbillig/egglog?rev=ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef#ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef" -dependencies = [ - "anyhow", - "dyn-clone", - "egglog-core-relations", - "egglog-numeric-id", - "egglog-reports", - "egglog-union-find", - "hashbrown 0.16.1", - "indexmap 2.13.0", - "log", - "num-rational", - "once_cell", - "ordered-float", - "petgraph", - "rayon", - "smallvec 1.15.1", - "thiserror 2.0.18", - "web-time", -] - -[[package]] -name = "egglog-concurrency" -version = "1.0.0" -source = "git+https://github.com/sbillig/egglog?rev=ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef#ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef" -dependencies = [ - "arc-swap", - "egglog-numeric-id", - "rayon", - "smallvec 1.15.1", -] - -[[package]] -name = "egglog-core-relations" -version = "1.0.0" -source = "git+https://github.com/sbillig/egglog?rev=ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef#ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef" -dependencies = [ - "anyhow", - "bumpalo", - "crossbeam", - "crossbeam-queue", - "dashmap", - "dyn-clone", - "egglog-concurrency", - "egglog-numeric-id", - "egglog-reports", - "egglog-union-find", - "fixedbitset", - "hashbrown 0.16.1", - "indexmap 2.13.0", - "log", - "num", - "once_cell", - "petgraph", - "rand 0.9.2", - "rayon", - "rustc-hash 2.1.1", - "smallvec 1.15.1", - "thiserror 2.0.18", - "web-time", -] - -[[package]] -name = "egglog-numeric-id" -version = "1.0.0" -source = "git+https://github.com/sbillig/egglog?rev=ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef#ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef" -dependencies = [ - "rayon", -] - -[[package]] -name = "egglog-reports" -version = "1.0.0" -source = "git+https://github.com/sbillig/egglog?rev=ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef#ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef" -dependencies = [ - "clap", - "hashbrown 0.16.1", - "indexmap 2.13.0", - "rustc-hash 2.1.1", - "serde", - "serde_json", - "web-time", -] - -[[package]] -name = "egglog-union-find" -version = "1.0.0" -source = "git+https://github.com/sbillig/egglog?rev=ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef#ba6d7081a0a788a3a1c2abc75771cdc6ed0fe0ef" -dependencies = [ - "crossbeam", - "egglog-concurrency", - "egglog-numeric-id", -] - -[[package]] -name = "egraph-serialize" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0977732fb537ace6f8c15ce160ebdda78b6502b4866d3b904e4fe752e2be4702" -dependencies = [ - "graphviz-rust", - "indexmap 2.13.0", - "once_cell", - "ordered-float", - "serde", - "serde_json", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "ena" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1" -dependencies = [ - "dogged", - "log", -] - -[[package]] -name = "enum-ordinalize" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "env_filter" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "env_logger" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "jiff", - "log", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror 1.0.69", - "uint 0.9.5", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types 0.12.2", - "scale-info", - "uint 0.9.5", -] - -[[package]] -name = "ethers-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec 0.7.6", - "bytes", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array", - "k256", - "num_enum", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror 1.0.69", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener 5.4.1", - "pin-project-lite", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec 0.7.6", - "auto_impl", - "bytes", -] - -[[package]] -name = "fastrlp" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" -dependencies = [ - "arrayvec 0.7.6", - "auto_impl", - "bytes", -] - -[[package]] -name = "fe" -version = "26.0.0-alpha.7" -dependencies = [ - "camino", - "clap", - "clap_complete", - "colored", - "cranelift-entity 0.115.1", - "crossbeam-channel", - "dir-test", - "fe-codegen", - "fe-common", - "fe-contract-harness", - "fe-driver", - "fe-fmt", - "fe-hir", - "fe-language-server", - "fe-mir", - "fe-resolver", - "fe-solc-runner", - "fe-test-utils", - "glob", - "hex", - "petgraph", - "rustc-hash 2.1.1", - "scip", - "serde_json", - "similar", - "smol_str 0.1.24", - "tempfile", - "tokio", - "toml", - "tracing", - "url", - "walkdir", -] - -[[package]] -name = "fe-bench" -version = "26.0.0-alpha.7" -dependencies = [ - "camino", - "criterion", - "fe-common", - "fe-driver", - "fe-parser", - "tracing", - "url", - "walkdir", -] - -[[package]] -name = "fe-codegen" -version = "26.0.0-alpha.7" -dependencies = [ - "dir-test", - "fe-common", - "fe-driver", - "fe-hir", - "fe-mir", - "fe-test-utils", - "hex", - "num-bigint", - "rustc-hash 2.1.1", - "smallvec 1.15.1", - "sonatina-codegen", - "sonatina-ir", - "sonatina-triple", - "sonatina-verifier", - "tracing", - "url", -] - -[[package]] -name = "fe-common" -version = "26.0.0-alpha.7" -dependencies = [ - "camino", - "fe-parser", - "ordermap", - "paste", - "petgraph", - "radix_immutable", - "rust-embed", - "rustc-hash 2.1.1", - "salsa", - "serde-semver", - "smol_str 0.1.24", - "toml", - "tracing", - "typed-path", - "url", -] - -[[package]] -name = "fe-contract-harness" -version = "26.0.0-alpha.7" -dependencies = [ - "ethers-core", - "fe-codegen", - "fe-common", - "fe-driver", - "fe-mir", - "fe-solc-runner", - "hex", - "revm", - "serde_json", - "thiserror 1.0.69", - "tracing", - "url", -] - -[[package]] -name = "fe-driver" -version = "26.0.0-alpha.7" -dependencies = [ - "camino", - "codespan-reporting", - "fe-common", - "fe-hir", - "fe-mir", - "fe-resolver", - "glob", - "petgraph", - "salsa", - "smol_str 0.1.24", - "tempfile", - "tracing", - "url", -] - -[[package]] -name = "fe-fmt" -version = "26.0.0-alpha.7" -dependencies = [ - "dir-test", - "fe-parser", - "fe-test-utils", - "pretty", -] - -[[package]] -name = "fe-hir" -version = "26.0.0-alpha.7" -dependencies = [ - "ascii_tree", - "bitflags 2.11.0", - "camino", - "codespan-reporting", - "cranelift-entity 0.115.1", - "derive_more 1.0.0", - "dir-test", - "dot2 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either", - "ena", - "fe-common", - "fe-driver", - "fe-parser", - "fe-test-utils", - "indexmap 2.13.0", - "itertools 0.14.0", - "num-bigint", - "num-traits", - "paste", - "rustc-hash 2.1.1", - "salsa", - "smallvec 1.15.1", - "smallvec 2.0.0-alpha.12", - "thin-vec", - "tiny-keccak", - "tracing", - "url", -] - -[[package]] -name = "fe-language-server" -version = "26.0.0-alpha.7" -dependencies = [ - "act-locally", - "anyhow", - "async-compat", - "async-lsp", - "async-std", - "camino", - "clap", - "codespan-reporting", - "dir-test", - "fe-codegen", - "fe-common", - "fe-driver", - "fe-fmt", - "fe-hir", - "fe-mir", - "fe-parser", - "fe-resolver", - "fe-test-utils", - "futures", - "futures-batch", - "rustc-hash 2.1.1", - "salsa", - "serde_json", - "smol_str 0.1.24", - "tempfile", - "tokio", - "tokio-util", - "tower", - "tracing", - "tracing-subscriber 0.3.22", - "tracing-tree", - "url", -] - -[[package]] -name = "fe-mir" -version = "26.0.0-alpha.7" -dependencies = [ - "cranelift-entity 0.115.1", - "dir-test", - "fe-common", - "fe-driver", - "fe-hir", - "fe-test-utils", - "num-bigint", - "num-traits", - "rustc-hash 2.1.1", - "url", -] - -[[package]] -name = "fe-parser" -version = "26.0.0-alpha.7" -dependencies = [ - "derive_more 1.0.0", - "dir-test", - "fe-test-utils", - "lazy_static", - "logos", - "num_enum", - "rowan", - "smallvec 2.0.0-alpha.12", - "tracing", - "tracing-subscriber 0.3.22", - "tree-sitter", - "tree-sitter-fe", - "unwrap-infallible", - "wasm-bindgen", - "wasm-bindgen-test", -] - -[[package]] -name = "fe-resolver" -version = "26.0.0-alpha.7" -dependencies = [ - "camino", - "dir-test", - "fe-common", - "fe-test-utils", - "git2", - "glob", - "indexmap 2.13.0", - "petgraph", - "sha2", - "smol_str 0.1.24", - "tempfile", - "toml", - "tracing", - "url", -] - -[[package]] -name = "fe-solc-runner" -version = "26.0.0-alpha.7" -dependencies = [ - "fe-contract-harness", - "indexmap 2.13.0", - "serde_json", -] - -[[package]] -name = "fe-test-utils" -version = "26.0.0-alpha.7" -dependencies = [ - "fe-common", - "insta", - "regex", - "tracing", - "tracing-subscriber 0.3.22", - "tracing-tree", - "url", -] - -[[package]] -name = "fe-uitest" -version = "26.0.0-alpha.7" -dependencies = [ - "dir-test", - "fe-common", - "fe-driver", - "fe-hir", - "fe-mir", - "fe-test-utils", - "url", - "wasm-bindgen-test", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.5", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-batch" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f444c45a1cb86f2a7e301469fd50a82084a60dadc25d94529a8312276ecb71a" -dependencies = [ - "futures", - "futures-timer", - "pin-utils", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", -] - -[[package]] -name = "getrandom" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", - "wasip3", -] - -[[package]] -name = "git2" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" -dependencies = [ - "bitflags 2.11.0", - "libc", - "libgit2-sys", - "log", - "openssl-probe", - "openssl-sys", - "url", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "gmp-mpfr-sys" -version = "1.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60f8970a75c006bb2f8ae79c6768a116dd215fa8346a87aed99bf9d82ca43394" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "graphviz-rust" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db134cb611668917cabf340af9a39518426f9a10827b4cedcb4cdcf84443f6d0" -dependencies = [ - "dot-generator", - "dot-structures", - "into-attr", - "into-attr-derive", - "pest", - "pest_derive", - "rand 0.9.2", - "tempfile", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.1.5", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", - "serde", - "serde_core", -] - -[[package]] -name = "hashlink" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" -dependencies = [ - "hashbrown 0.15.5", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-conservative" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" -dependencies = [ - "arrayvec 0.7.6", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec 1.15.1", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec 1.15.1", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "im-rc" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1955a75fa080c677d3972822ec4bad316169ab1cfc6c257a942c2265dbe5fe" -dependencies = [ - "bitmaps", - "rand_core 0.6.4", - "rand_xoshiro", - "sized-chunks", - "typenum", - "version_check", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[package]] -name = "insta" -version = "1.46.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e82db8c87c7f1ccecb34ce0c24399b8a73081427f3c7c50a5d597925356115e4" -dependencies = [ - "once_cell", - "regex", - "similar", - "tempfile", -] - -[[package]] -name = "into-attr" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18b48c537e49a709e678caec3753a7dba6854661a1eaa27675024283b3f8b376" -dependencies = [ - "dot-structures", -] - -[[package]] -name = "into-attr-derive" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecac7c1ae6cd2c6a3a64d1061a8bdc7f52ff62c26a831a2301e54c1b5d70d5b1" -dependencies = [ - "dot-generator", - "dot-structures", - "into-attr", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "is-terminal" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" - -[[package]] -name = "jiff" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c867c356cc096b33f4981825ab281ecba3db0acefe60329f044c1789d94c6543" -dependencies = [ - "jiff-static", - "log", - "portable-atomic", - "portable-atomic-util", - "serde_core", -] - -[[package]] -name = "jiff-static" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", -] - -[[package]] -name = "keccak" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "keccak-asm" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b646a74e746cd25045aa0fd42f4f7f78aa6d119380182c7e63a5593c4ab8df6f" -dependencies = [ - "digest 0.10.7", - "sha3-asm", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "libc" -version = "0.2.182" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" - -[[package]] -name = "libgit2-sys" -version = "0.17.0+1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" -dependencies = [ - "cc", - "libc", - "libssh2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -] - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libmimalloc-sys" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "libssh2-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libz-sys" -version = "1.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -dependencies = [ - "value-bag", -] - -[[package]] -name = "logos" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff472f899b4ec2d99161c51f60ff7075eeb3097069a36050d8037a6325eb8154" -dependencies = [ - "logos-derive", -] - -[[package]] -name = "logos-codegen" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "192a3a2b90b0c05b27a0b2c43eecdb7c415e29243acc3f89cc8247a5b693045c" -dependencies = [ - "beef", - "fnv", - "lazy_static", - "proc-macro2", - "quote", - "regex-syntax", - "rustc_version 0.4.1", - "syn 2.0.116", -] - -[[package]] -name = "logos-derive" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "605d9697bcd5ef3a42d38efc51541aa3d6a4a25f7ab6d1ed0da5ac632a26b470" -dependencies = [ - "logos-codegen", -] - -[[package]] -name = "lsp-types" -version = "0.95.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e34d33a8e9b006cd3fc4fe69a921affa097bae4bb65f76271f4644f9a334365" -dependencies = [ - "bitflags 1.3.2", - "serde", - "serde_json", - "serde_repr", - "url", -] - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[package]] -name = "mimalloc" -version = "0.1.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8" -dependencies = [ - "libmimalloc-sys", -] - -[[package]] -name = "minicov" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4869b6a491569605d66d3952bcdf03df789e5b536e5f0cf7758a7f08a55ae24d" -dependencies = [ - "cc", - "walkdir", -] - -[[package]] -name = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - -[[package]] -name = "oorandom" -version = "11.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" - -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec 0.7.6", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-src" -version = "300.5.5+3.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f1787d533e03597a7934fd0a765f0d28e94ecc5fb7789f8053b1e699a56f709" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "ordered-float" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" -dependencies = [ - "num-traits", - "rand 0.8.5", - "serde", -] - -[[package]] -name = "ordermap" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b100f7dd605611822d30e182214d3c02fdefce2d801d23993f6b6ba6ca1392af" -dependencies = [ - "indexmap 2.13.0", -] - -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2", -] - -[[package]] -name = "parity-scale-codec" -version = "3.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" -dependencies = [ - "arrayvec 0.7.6", - "bitvec", - "byte-slice-cast", - "const_format", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "rustversion", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec 1.15.1", - "windows-link", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pest" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" -dependencies = [ - "memchr", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "pest_meta" -version = "2.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" -dependencies = [ - "pest", - "sha2", -] - -[[package]] -name = "petgraph" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" -dependencies = [ - "fixedbitset", - "hashbrown 0.15.5", - "indexmap 2.13.0", - "serde", -] - -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_macros", - "phf_shared", - "serde", -] - -[[package]] -name = "phf_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" -dependencies = [ - "fastrand", - "phf_shared", -] - -[[package]] -name = "phf_macros" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plotters" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" - -[[package]] -name = "plotters-svg" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.1.3", - "windows-sys 0.61.2", -] - -[[package]] -name = "portable-atomic" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" - -[[package]] -name = "portable-atomic-util" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" -dependencies = [ - "portable-atomic", -] - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "pretty" -version = "0.12.5" -source = "git+https://github.com/sbillig/pretty.rs?branch=max-width-group#33cbcf85447a2237eead7175352a52dc26923a1e" -dependencies = [ - "arrayvec 0.5.2", - "typed-arena", - "unicode-width 0.2.2", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.116", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint 0.9.5", -] - -[[package]] -name = "primitive-types" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721a1da530b5a2633218dc9f75713394c983c352be88d2d7c9ee85e2c4c21794" -dependencies = [ - "fixed-hash", - "uint 0.10.0", -] - -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.11.0", - "num-traits", - "rand 0.9.2", - "rand_chacha 0.9.0", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "protobuf" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65a1d4ddae7d8b5de68153b48f6aa3bba8cb002b243dbdbc55a5afbc98f99f4" -dependencies = [ - "once_cell", - "protobuf-support", - "thiserror 1.0.69", -] - -[[package]] -name = "protobuf-support" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e36c2f31e0a47f9280fb347ef5e461ffcd2c52dd520d8e216b52f93b0b0d7d6" -dependencies = [ - "thiserror 1.0.69", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "radix_immutable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dafbb83194e5cbdc904a1cb110deb10368327536b8129ca0f361f21dbd7a5703" -dependencies = [ - "once_cell", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "serde", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", - "serde", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", - "serde", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", - "serde", -] - -[[package]] -name = "rand_xorshift" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" -dependencies = [ - "rand_core 0.9.5", -] - -[[package]] -name = "rand_xoshiro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rapidhash" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111325c42c4bafae99e777cd77b40dea9a2b30c69e9d8c74b6eccd7fba4337de" -dependencies = [ - "rustversion", -] - -[[package]] -name = "rayon" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" - -[[package]] -name = "revm" -version = "33.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c85ed0028f043f87b3c88d4a4cb6f0a76440085523b6a8afe5ff003cf418054" -dependencies = [ - "revm-bytecode", - "revm-context", - "revm-context-interface", - "revm-database", - "revm-database-interface", - "revm-handler", - "revm-inspector", - "revm-interpreter", - "revm-precompile", - "revm-primitives", - "revm-state", -] - -[[package]] -name = "revm-bytecode" -version = "7.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2c6b5e6e8dd1e28a4a60e5f46615d4ef0809111c9e63208e55b5c7058200fb0" -dependencies = [ - "bitvec", - "phf", - "revm-primitives", - "serde", -] - -[[package]] -name = "revm-context" -version = "12.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f038f0c9c723393ac897a5df9140b21cfa98f5753a2cb7d0f28fa430c4118abf" -dependencies = [ - "bitvec", - "cfg-if", - "derive-where", - "revm-bytecode", - "revm-context-interface", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-context-interface" -version = "13.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "431c9a14e4ef1be41ae503708fd02d974f80ef1f2b6b23b5e402e8d854d1b225" -dependencies = [ - "alloy-eip2930", - "alloy-eip7702", - "auto_impl", - "either", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-database" -version = "9.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "980d8d6bba78c5dd35b83abbb6585b0b902eb25ea4448ed7bfba6283b0337191" -dependencies = [ - "alloy-eips", - "revm-bytecode", - "revm-database-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-database-interface" -version = "8.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cce03e3780287b07abe58faf4a7f5d8be7e81321f93ccf3343c8f7755602bae" -dependencies = [ - "auto_impl", - "either", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-handler" -version = "14.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d44f8f6dbeec3fecf9fe55f78ef0a758bdd92ea46cd4f1ca6e2a946b32c367f3" -dependencies = [ - "auto_impl", - "derive-where", - "revm-bytecode", - "revm-context", - "revm-context-interface", - "revm-database-interface", - "revm-interpreter", - "revm-precompile", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-inspector" -version = "14.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5617e49216ce1ca6c8826bcead0386bc84f49359ef67cde6d189961735659f93" -dependencies = [ - "auto_impl", - "either", - "revm-context", - "revm-database-interface", - "revm-handler", - "revm-interpreter", - "revm-primitives", - "revm-state", - "serde", - "serde_json", -] - -[[package]] -name = "revm-interpreter" -version = "31.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ec36405f7477b9dccdc6caa3be19adf5662a7a0dffa6270cdb13a090c077e5" -dependencies = [ - "revm-bytecode", - "revm-context-interface", - "revm-primitives", - "revm-state", - "serde", -] - -[[package]] -name = "revm-precompile" -version = "31.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a62958af953cc4043e93b5be9b8497df84cc3bd612b865c49a7a7dfa26a84e2" -dependencies = [ - "ark-bls12-381", - "ark-bn254", - "ark-ec", - "ark-ff 0.5.0", - "ark-serialize 0.5.0", - "arrayref", - "aurora-engine-modexp", - "c-kzg", - "cfg-if", - "k256", - "p256", - "revm-primitives", - "ripemd", - "rug", - "secp256k1", - "sha2", -] - -[[package]] -name = "revm-primitives" -version = "21.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e161db429d465c09ba9cbff0df49e31049fe6b549e28eb0b7bd642fcbd4412" -dependencies = [ - "alloy-primitives", - "num_enum", - "once_cell", - "serde", -] - -[[package]] -name = "revm-state" -version = "8.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d8be953b7e374dbdea0773cf360debed8df394ea8d82a8b240a6b5da37592fc" -dependencies = [ - "bitflags 2.11.0", - "revm-bytecode", - "revm-primitives", - "serde", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rlp-derive", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rowan" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417a3a9f582e349834051b8a10c8d71ca88da4211e4093528e36b9845f6b5f21" -dependencies = [ - "countme", - "hashbrown 0.14.5", - "rustc-hash 1.1.0", - "text-size", -] - -[[package]] -name = "rug" -version = "1.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de190ec858987c79cad4da30e19e546139b3339331282832af004d0ea7829639" -dependencies = [ - "az", - "gmp-mpfr-sys", - "libc", - "libm", -] - -[[package]] -name = "ruint" -version = "1.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "ark-ff 0.5.0", - "bytes", - "fastrlp 0.3.1", - "fastrlp 0.4.0", - "num-bigint", - "num-integer", - "num-traits", - "parity-scale-codec", - "primitive-types 0.12.2", - "proptest", - "rand 0.8.5", - "rand 0.9.2", - "rlp", - "ruint-macro", - "serde_core", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" - -[[package]] -name = "rust-embed" -version = "8.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" -dependencies = [ - "proc-macro2", - "quote", - "rust-embed-utils", - "syn 2.0.116", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" -dependencies = [ - "sha2", - "walkdir", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.27", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.11.0", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" -dependencies = [ - "bitflags 2.11.0", - "errno", - "libc", - "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "rusty-fork" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "salsa" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be22155f8d9732518b2db2bf379fe6f0b2375e76b08b7c8fe6c1b887d548c24" -dependencies = [ - "boxcar", - "crossbeam-queue", - "dashmap", - "hashbrown 0.15.5", - "hashlink", - "indexmap 2.13.0", - "parking_lot", - "portable-atomic", - "rayon", - "rustc-hash 2.1.1", - "salsa-macro-rules", - "salsa-macros", - "smallvec 1.15.1", - "thin-vec", - "tracing", -] - -[[package]] -name = "salsa-macro-rules" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55a7ef0a84e336f7c5f0332d81727f5629fe042d2aa556c75307afebc9f78a5" - -[[package]] -name = "salsa-macros" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d0e88a9c0c0d231a63f83dcd1a2c5e5d11044fac4b65bc9ad3b68ab48b0a0ab" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.116", - "synstructure", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scale-info" -version = "2.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" -dependencies = [ - "cfg-if", - "derive_more 1.0.0", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "scip" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0cc97469a1eef9e457bd6e935c8727d2e18c59489f06cd98207a6439a6498c" -dependencies = [ - "protobuf", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" -dependencies = [ - "bitcoin_hashes", - "rand 0.9.2", - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb913707158fadaf0d8702c2db0e857de66eb003ccfdda5924b5f5ac98efb38" -dependencies = [ - "cc", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "semver-parser" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" -dependencies = [ - "pest", -] - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-semver" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9418264b4789ea78183e45ed1785323a0a9d28c24b612c2f360ce86d3c87c301" -dependencies = [ - "proc-macro2", - "quote", - "semver 1.0.27", - "serde", - "serde-semver-derive", - "syn 1.0.109", -] - -[[package]] -name = "serde-semver-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb59c4005cc1e817ddad0dbc3b9af809cf49c989d0da46f735edf9629c0db19" -dependencies = [ - "proc-macro2", - "quote", - "semver 1.0.27", - "syn 1.0.109", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "indexmap 2.13.0", - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_with" -version = "3.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" -dependencies = [ - "base64", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.13.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sha3-asm" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b31139435f327c93c6038ed350ae4588e2c70a13d50599509fee6349967ba35a" -dependencies = [ - "cc", - "cfg-if", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "similar" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" - -[[package]] -name = "siphasher" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" - -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps", - "typenum", -] - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "smallvec" -version = "2.0.0-alpha.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef784004ca8777809dcdad6ac37629f0a97caee4c685fcea805278d81dd8b857" - -[[package]] -name = "smol" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-net", - "async-process", - "blocking", - "futures-lite", -] - -[[package]] -name = "smol_str" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9" -dependencies = [ - "serde", -] - -[[package]] -name = "smol_str" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f7a918bd2a9951d18ee6e48f076843e8e73a9a5d22cf05bcd4b7a81bdd04e17" -dependencies = [ - "borsh", - "serde_core", -] - -[[package]] -name = "socket2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "sonatina-codegen" -version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=2aae7f0#2aae7f0728958d47f6cb06bf79ab718698de06e8" -dependencies = [ - "bit-set", - "cranelift-entity 0.126.2", - "dashmap", - "egglog", - "indexmap 2.13.0", - "rustc-hash 2.1.1", - "smallvec 1.15.1", - "sonatina-ir", - "sonatina-macros", - "sonatina-triple", - "sonatina-verifier", -] - -[[package]] -name = "sonatina-ir" -version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=2aae7f0#2aae7f0728958d47f6cb06bf79ab718698de06e8" -dependencies = [ - "bitflags 2.11.0", - "cranelift-entity 0.126.2", - "dashmap", - "dot2 1.0.0 (git+https://github.com/sanpii/dot2.rs.git)", - "dyn-clone", - "indexmap 2.13.0", - "primitive-types 0.14.0", - "rayon", - "rustc-hash 2.1.1", - "smallvec 1.15.1", - "smol_str 0.3.5", - "sonatina-macros", - "sonatina-triple", -] - -[[package]] -name = "sonatina-macros" -version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=2aae7f0#2aae7f0728958d47f6cb06bf79ab718698de06e8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "sonatina-parser" -version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=2aae7f0#2aae7f0728958d47f6cb06bf79ab718698de06e8" -dependencies = [ - "annotate-snippets", - "bimap", - "cranelift-entity 0.126.2", - "derive_more 2.0.1", - "either", - "hex", - "pest", - "pest_derive", - "rustc-hash 2.1.1", - "smallvec 1.15.1", - "smol_str 0.3.5", - "sonatina-ir", - "sonatina-triple", -] - -[[package]] -name = "sonatina-triple" -version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=2aae7f0#2aae7f0728958d47f6cb06bf79ab718698de06e8" -dependencies = [ - "thiserror 2.0.18", -] - -[[package]] -name = "sonatina-verifier" -version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=2aae7f0#2aae7f0728958d47f6cb06bf79ab718698de06e8" -dependencies = [ - "cranelift-entity 0.126.2", - "rayon", - "rustc-hash 2.1.1", - "smallvec 1.15.1", - "sonatina-ir", - "sonatina-macros", - "sonatina-parser", - "sonatina-triple", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2231b7c3057d5e4ad0156fb3dc807d900806020c5ffa3ee6ff2c8c76fb8520" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.116", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.116" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" -dependencies = [ - "fastrand", - "getrandom 0.4.1", - "once_cell", - "rustix 1.1.3", - "windows-sys 0.61.2", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "text-size" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" - -[[package]] -name = "thin-vec" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "tokio" -version = "1.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" -dependencies = [ - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.13.0", - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.23.10+spec-1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" -dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.0.9+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" -dependencies = [ - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" -dependencies = [ - "matchers", - "once_cell", - "regex-automata", - "sharded-slab", - "thread_local", - "tracing", - "tracing-core", -] - -[[package]] -name = "tracing-tree" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac87aa03b6a4d5a7e4810d1a80c19601dbe0f8a837e9177f23af721c7ba7beec" -dependencies = [ - "nu-ansi-term", - "tracing-core", - "tracing-log", - "tracing-subscriber 0.3.22", -] - -[[package]] -name = "tree-sitter" -version = "0.24.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5387dffa7ffc7d2dae12b50c6f7aab8ff79d6210147c6613561fc3d474c6f75" -dependencies = [ - "cc", - "regex", - "regex-syntax", - "streaming-iterator", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-fe" -version = "26.0.0-alpha.7" -dependencies = [ - "cc", - "tree-sitter", - "tree-sitter-language", -] - -[[package]] -name = "tree-sitter-language" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009994f150cc0cd50ff54917d5bc8bffe8cad10ca10d81c34da2ec421ae61782" - -[[package]] -name = "typed-arena" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" - -[[package]] -name = "typed-path" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[package]] -name = "ucd-trie" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "uint" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "unwrap-infallible" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "151ac09978d3c2862c4e39b557f4eceee2cc72150bc4cb4f16abf061b6e381fb" - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "value-bag" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - -[[package]] -name = "waitpid-any" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0189157c93c54d86e5c61ddf0c1223baa25e5bfb2f6f9983c678985b028d7c12" -dependencies = [ - "rustix 0.38.44", - "windows-sys 0.52.0", -] - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" -dependencies = [ - "cfg-if", - "futures-util", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.116", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-bindgen-test" -version = "0.3.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45649196a53b0b7a15101d845d44d2dda7374fc1b5b5e2bbf58b7577ff4b346d" -dependencies = [ - "async-trait", - "cast", - "js-sys", - "libm", - "minicov", - "nu-ansi-term", - "num-traits", - "oorandom", - "serde", - "serde_json", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-bindgen-test-macro", - "wasm-bindgen-test-shared", -] - -[[package]] -name = "wasm-bindgen-test-macro" -version = "0.3.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f579cdd0123ac74b94e1a4a72bd963cf30ebac343f2df347da0b8df24cdebed2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "wasm-bindgen-test-shared" -version = "0.2.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8145dd1593bf0fb137dbfa85b8be79ec560a447298955877804640e40c2d6ea" - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.13.0", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.11.0", - "hashbrown 0.15.5", - "indexmap 2.13.0", - "semver 1.0.27", -] - -[[package]] -name = "web-sys" -version = "0.3.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -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 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[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_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[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_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[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_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[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_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[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_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap 2.13.0", - "prettyplease", - "syn 2.0.116", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.116", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.11.0", - "indexmap 2.13.0", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.13.0", - "log", - "semver 1.0.27", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.116", -] - -[[package]] -name = "zmij" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index c07189e371..0000000000 --- a/Cargo.toml +++ /dev/null @@ -1,94 +0,0 @@ -[workspace] -members = ["crates/*"] -resolver = "2" - -[workspace.package] -edition = "2024" - -[workspace.dependencies] -common = { path = "crates/common", package = "fe-common" } -driver = { path = "crates/driver", package = "fe-driver" } -fmt = { path = "crates/fmt", package = "fe-fmt" } -hir = { path = "crates/hir", package = "fe-hir" } -parser = { path = "crates/parser", package = "fe-parser" } -test-utils = { path = "crates/test-utils", package = "fe-test-utils" } -resolver = { path = "crates/resolver", package = "fe-resolver" } -codegen = { path = "crates/codegen", package = "fe-codegen" } -language-server = { path = "crates/language-server", package = "fe-language-server" } -mir = { path = "crates/mir", package = "fe-mir" } -cranelift-entity = "0.115" -url = "2.5.4" -camino = "1.1.9" -typed-path = "0.12.3" -clap = { version = "4.5.26", features = ["derive"] } -clap_complete = "4.5.65" -codespan-reporting = "0.11" -derive_more = { version = "1.0", default-features = false, features = [ - "from", - "try_into", -] } -dir-test = "0.4" -glob = "0.3.2" -crossbeam-channel = "0.5.15" -rustc-hash = "2.1.0" -num-bigint = "0.4" -num-traits = "0.2" -paste = "1.0.15" -salsa = "0.20" -smallvec = { version = "2.0.0-alpha.11" } -smallvec1 = { version = "1", package = "smallvec" } -thin-vec = "0.2.14" -smol_str = { version = "0.1", features = ["serde"] } -serde-semver = "0.2.1" -tracing = "0.1.41" -tracing-subscriber = { version = "0.3.19", default-features = false, features = ["std", "fmt", "env-filter"] } -tracing-tree = "0.4.0" -wasm-bindgen-test = "0.3" -semver = "1.0.26" -petgraph = "0.8" -sonatina-ir = { git = "https://github.com/fe-lang/sonatina", rev = "2aae7f0" } -sonatina-triple = { git = "https://github.com/fe-lang/sonatina", rev = "2aae7f0" } -sonatina-codegen = { git = "https://github.com/fe-lang/sonatina", rev = "2aae7f0" } -sonatina-verifier = { git = "https://github.com/fe-lang/sonatina", rev = "2aae7f0" } - -[profile.dev] -# Set to 0 to make the build faster and debugging more difficult. -debug = 0 - -[profile.test] -# Set to 0 to make the build faster and debugging more difficult. -debug = 0 - -[profile.dev.package] -revm = { opt-level = 3 } -revm-bytecode = { opt-level = 3 } -revm-context = { opt-level = 3 } -revm-context-interface = { opt-level = 3 } -revm-database = { opt-level = 3 } -revm-database-interface = { opt-level = 3 } -revm-handler = { opt-level = 3 } -revm-inspector = { opt-level = 3 } -revm-interpreter = { opt-level = 3 } -revm-precompile = { opt-level = 3 } -revm-primitives = { opt-level = 3 } -revm-state = { opt-level = 3 } -sonatina-ir = { opt-level = 3 } -sonatina-codegen = { opt-level = 3 } -sonatina-verifier = { opt-level = 3 } - -[profile.test.package] -revm = { opt-level = 3 } -revm-bytecode = { opt-level = 3 } -revm-context = { opt-level = 3 } -revm-context-interface = { opt-level = 3 } -revm-database = { opt-level = 3 } -revm-database-interface = { opt-level = 3 } -revm-handler = { opt-level = 3 } -revm-inspector = { opt-level = 3 } -revm-interpreter = { opt-level = 3 } -revm-precompile = { opt-level = 3 } -revm-primitives = { opt-level = 3 } -revm-state = { opt-level = 3 } -sonatina-ir = { opt-level = 3 } -sonatina-codegen = { opt-level = 3 } -sonatina-verifier = { opt-level = 3 } diff --git a/LICENSE-APACHE b/LICENSE-APACHE deleted file mode 100644 index 1b5ec8b78e..0000000000 --- a/LICENSE-APACHE +++ /dev/null @@ -1,176 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS diff --git a/Makefile b/Makefile deleted file mode 100644 index e74a2fa47a..0000000000 --- a/Makefile +++ /dev/null @@ -1,73 +0,0 @@ -.PHONY: docker-test -docker-test: - docker run \ - --rm \ - --volume "$(shell pwd):/mnt" \ - --workdir '/mnt' \ - rustlang/rust:nightly \ - cargo test --workspace - -.PHONY: docker-wasm-test -docker-wasm-test: - docker run \ - --rm \ - --volume "$(shell pwd):/mnt" \ - --workdir '/mnt' \ - rust:latest \ - /bin/bash -c "rustup target add wasm32-unknown-unknown && cargo test -p fe-common -p fe-parser -p fe-hir -p fe-hir-analysis --target wasm32-unknown-unknown" - -.PHONY: check-wasm -check-wasm: - @echo "Checking core crates for wasm32-unknown-unknown..." - cargo check -p fe-common -p fe-parser -p fe-hir -p fe-hir-analysis --target wasm32-unknown-unknown - @echo "✓ Core crates support wasm32-unknown-unknown" - -.PHONY: check-wasi -check-wasi: - @echo "Checking filesystem-dependent crates for wasm32-wasip1..." - cargo check -p fe-driver -p fe-resolver --target wasm32-wasip1 - @echo "✓ Filesystem crates support wasm32-wasip1" - -.PHONY: check-wasm-all -check-wasm-all: check-wasm check-wasi - @echo "✓ All WASM/WASI checks passed" - -.PHONY: coverage -coverage: - cargo tarpaulin --workspace --all-features --verbose --timeout 120 --exclude-files 'tests/*' --exclude-files 'main.rs' --out xml html -- --skip differential:: - -.PHONY: clippy -clippy: - cargo clippy --workspace --all-targets --all-features -- -D warnings -A clippy::upper-case-acronyms -A clippy::large-enum-variant -W clippy::print_stdout -W clippy::print_stderr - -.PHONY: rustfmt -rustfmt: - cargo fmt --all -- --check - -.PHONY: lint -lint: rustfmt clippy - -.PHONY: build-docs -build-docs: - cargo doc --no-deps --workspace - -README.md: src/main.rs - cargo readme --no-title --no-indent-headings > README.md - -notes: - towncrier build --yes --version $(version) - git commit -m "Compile release notes" - -release: - # Ensure release notes where generated before running the release command - ./newsfragments/validate_files.py is-empty - cargo release $(version) --execute --all --no-tag --no-push - # Run the tests again because we may have to adjust some based on the update version - cargo test --workspace - -push-tag: - # Run `make release version=` first - ./newsfragments/validate_files.py is-empty - # Tag the release with the current version number - git tag "v$$(cargo pkgid fe | cut -d# -f2 | cut -d: -f2)" - git push --tags upstream diff --git a/README.md b/README.md deleted file mode 100644 index 6d816e8b77..0000000000 --- a/README.md +++ /dev/null @@ -1,27 +0,0 @@ - -# Fe - -The Fe compiler is in the late stages of a major compiler rewrite. The `master` branch supports `fe check`/`fe test` and includes an experimental `fe build` for EVM bytecode generation (default backend: Sonatina), but language/codegen coverage is still evolving. -For the older version of the compiler, see the [legacy branch](https://github.com/argotorg/fe/tree/legacy). - -## Overview - -Fe is a statically typed language for the Ethereum Virtual Machine (EVM). The syntax and type system is similar to rust's, with the addition of higher-kinded types. We're exploring additional type system, syntax, and semantic changes. - -## Debugging tests - -`fe test` has a few flags that are useful when debugging runtime/codegen issues: - -- EVM trace (last 400 steps): `RUSTC_WRAPPER= cargo run -q -p fe -- test --backend sonatina --trace-evm --trace-evm-keep 400 --trace-evm-stack-n 18 ` -- Sonatina symtab + stackify traces written to files: `RUSTC_WRAPPER= cargo run -q -p fe -- test --backend sonatina --sonatina-symtab --sonatina-stackify-trace --sonatina-stackify-filter solencoder --debug-dir target/fe-debug ` - -## Community - -- Twitter: [@official_fe](https://twitter.com/official_fe) -- Chat: - - We've recently moved to [Zulip](https://fe-lang.zulipchat.com/join/dqvssgylulrmjmp2dx7vcbrq/) - - The [Discord](https://discord.gg/ywpkAXFjZH) server is still live, but our preference is zulip. - -## License - -Licensed under Apache License, Version 2.0. diff --git a/crates/language-server/test_files/messy/dangling.fe b/compiler-docs/.lock similarity index 100% rename from crates/language-server/test_files/messy/dangling.fe rename to compiler-docs/.lock diff --git a/compiler-docs/crates.js b/compiler-docs/crates.js new file mode 100644 index 0000000000..93cbe18ad9 --- /dev/null +++ b/compiler-docs/crates.js @@ -0,0 +1,2 @@ +window.ALL_CRATES = ["fe","fe_abi","fe_analyzer","fe_codegen","fe_common","fe_compiler_test_utils","fe_compiler_tests","fe_compiler_tests_legacy","fe_driver","fe_library","fe_mir","fe_parser","fe_test_files","fe_test_runner","fe_yulc"]; +//{"start":21,"fragment_lengths":[4,9,14,13,12,25,20,27,12,13,9,12,16,17,10]} \ No newline at end of file diff --git a/compiler-docs/fe/all.html b/compiler-docs/fe/all.html new file mode 100644 index 0000000000..8a7290f6d0 --- /dev/null +++ b/compiler-docs/fe/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe/fn.main.html b/compiler-docs/fe/fn.main.html new file mode 100644 index 0000000000..82130c514b --- /dev/null +++ b/compiler-docs/fe/fn.main.html @@ -0,0 +1 @@ +main in fe - Rust

Function main

Source
pub(crate) fn main()
\ No newline at end of file diff --git a/compiler-docs/fe/index.html b/compiler-docs/fe/index.html new file mode 100644 index 0000000000..3e7a86a51b --- /dev/null +++ b/compiler-docs/fe/index.html @@ -0,0 +1 @@ +fe - Rust

Crate fe

Source

Modules§

task 🔒

Structs§

FelangCli 🔒

Functions§

main 🔒
\ No newline at end of file diff --git a/compiler-docs/fe/sidebar-items.js b/compiler-docs/fe/sidebar-items.js new file mode 100644 index 0000000000..0e912cd34b --- /dev/null +++ b/compiler-docs/fe/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["main"],"mod":["task"],"struct":["FelangCli"]}; \ No newline at end of file diff --git a/compiler-docs/fe/struct.FelangCli.html b/compiler-docs/fe/struct.FelangCli.html new file mode 100644 index 0000000000..4775bcd101 --- /dev/null +++ b/compiler-docs/fe/struct.FelangCli.html @@ -0,0 +1,109 @@ +FelangCli in fe - Rust

Struct FelangCli

Source
pub(crate) struct FelangCli {
+    pub(crate) command: Commands,
+}

Fields§

§command: Commands

Trait Implementations§

Source§

impl Args for FelangCli

Source§

fn augment_args<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_args_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

impl CommandFactory for FelangCli

Source§

fn into_app<'b>() -> Command<'b>

Deprecated, replaced with CommandFactory::command
Source§

fn into_app_for_update<'b>() -> Command<'b>

Deprecated, replaced with CommandFactory::command_for_update
§

fn command<'help>() -> App<'help>

Build a [Command] that can instantiate Self. Read more
§

fn command_for_update<'help>() -> App<'help>

Build a [Command] that can update self. Read more
Source§

impl FromArgMatches for FelangCli

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

impl Parser for FelangCli

§

fn parse() -> Self

Parse from std::env::args_os(), exit on error
§

fn try_parse() -> Result<Self, Error>

Parse from std::env::args_os(), return Err on error.
§

fn parse_from<I, T>(itr: I) -> Self
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, exit on error
§

fn try_parse_from<I, T>(itr: I) -> Result<Self, Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Parse from iterator, return Err on error.
§

fn update_from<I, T>(&mut self, itr: I)
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, exit on error
§

fn try_update_from<I, T>(&mut self, itr: I) -> Result<(), Error>
where + I: IntoIterator<Item = T>, + T: Into<OsString> + Clone,

Update from iterator, return Err on error.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/build/constant.DEFAULT_OUTPUT_DIR_NAME.html b/compiler-docs/fe/task/build/constant.DEFAULT_OUTPUT_DIR_NAME.html new file mode 100644 index 0000000000..279c8f306e --- /dev/null +++ b/compiler-docs/fe/task/build/constant.DEFAULT_OUTPUT_DIR_NAME.html @@ -0,0 +1 @@ +DEFAULT_OUTPUT_DIR_NAME in fe::task::build - Rust

Constant DEFAULT_OUTPUT_DIR_NAME

Source
const DEFAULT_OUTPUT_DIR_NAME: &str = "output";
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/enum.Emit.html b/compiler-docs/fe/task/build/enum.Emit.html new file mode 100644 index 0000000000..7f420a5ec4 --- /dev/null +++ b/compiler-docs/fe/task/build/enum.Emit.html @@ -0,0 +1,117 @@ +Emit in fe::task::build - Rust

Enum Emit

Source
enum Emit {
+    Abi,
+    Ast,
+    LoweredAst,
+    Bytecode,
+    RuntimeBytecode,
+    Tokens,
+    Yul,
+}

Variants§

§

Abi

§

Ast

§

LoweredAst

§

Bytecode

§

RuntimeBytecode

§

Tokens

§

Yul

Trait Implementations§

Source§

impl Clone for Emit

Source§

fn clone(&self) -> Emit

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Emit

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Ord for Emit

Source§

fn cmp(&self, other: &Emit) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Emit

Source§

fn eq(&self, other: &Emit) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Emit

Source§

fn partial_cmp(&self, other: &Emit) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl ValueEnum for Emit

Source§

fn value_variants<'a>() -> &'a [Self]

All possible argument values, in display order.
Source§

fn to_possible_value<'a>(&self) -> Option<PossibleValue<'a>>

The canonical argument value. Read more
§

fn from_str(input: &str, ignore_case: bool) -> Result<Self, String>

Parse an argument into Self.
Source§

impl Copy for Emit

Source§

impl Eq for Emit

Source§

impl StructuralPartialEq for Emit

Auto Trait Implementations§

§

impl Freeze for Emit

§

impl RefUnwindSafe for Emit

§

impl Send for Emit

§

impl Sync for Emit

§

impl Unpin for Emit

§

impl UnwindSafe for Emit

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DynClone for T
where + T: Clone,

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.build.html b/compiler-docs/fe/task/build/fn.build.html new file mode 100644 index 0000000000..06e47bd07a --- /dev/null +++ b/compiler-docs/fe/task/build/fn.build.html @@ -0,0 +1 @@ +build in fe::task::build - Rust

Function build

Source
pub fn build(compile_arg: BuildArgs)
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.build_ingot.html b/compiler-docs/fe/task/build/fn.build_ingot.html new file mode 100644 index 0000000000..731f0f1c63 --- /dev/null +++ b/compiler-docs/fe/task/build/fn.build_ingot.html @@ -0,0 +1 @@ +build_ingot in fe::task::build - Rust

Function build_ingot

Source
fn build_ingot(compile_arg: &BuildArgs) -> (String, CompiledModule)
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.build_single_file.html b/compiler-docs/fe/task/build/fn.build_single_file.html new file mode 100644 index 0000000000..9d2e80117f --- /dev/null +++ b/compiler-docs/fe/task/build/fn.build_single_file.html @@ -0,0 +1 @@ +build_single_file in fe::task::build - Rust

Function build_single_file

Source
fn build_single_file(compile_arg: &BuildArgs) -> (String, CompiledModule)
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.ioerr_to_string.html b/compiler-docs/fe/task/build/fn.ioerr_to_string.html new file mode 100644 index 0000000000..bf0d40ceb3 --- /dev/null +++ b/compiler-docs/fe/task/build/fn.ioerr_to_string.html @@ -0,0 +1 @@ +ioerr_to_string in fe::task::build - Rust

Function ioerr_to_string

Source
fn ioerr_to_string(error: Error) -> String
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.mir_dump.html b/compiler-docs/fe/task/build/fn.mir_dump.html new file mode 100644 index 0000000000..171a825f4f --- /dev/null +++ b/compiler-docs/fe/task/build/fn.mir_dump.html @@ -0,0 +1 @@ +mir_dump in fe::task::build - Rust

Function mir_dump

Source
fn mir_dump(input_path: &str)
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.verify_nonexistent_or_empty.html b/compiler-docs/fe/task/build/fn.verify_nonexistent_or_empty.html new file mode 100644 index 0000000000..cd45f60fe9 --- /dev/null +++ b/compiler-docs/fe/task/build/fn.verify_nonexistent_or_empty.html @@ -0,0 +1 @@ +verify_nonexistent_or_empty in fe::task::build - Rust

Function verify_nonexistent_or_empty

Source
fn verify_nonexistent_or_empty(dir: &Path) -> Result<(), String>
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.write_compiled_module.html b/compiler-docs/fe/task/build/fn.write_compiled_module.html new file mode 100644 index 0000000000..28de4cffeb --- /dev/null +++ b/compiler-docs/fe/task/build/fn.write_compiled_module.html @@ -0,0 +1,7 @@ +write_compiled_module in fe::task::build - Rust

Function write_compiled_module

Source
fn write_compiled_module(
+    module: CompiledModule,
+    file_content: &str,
+    targets: &[Emit],
+    output_dir: &str,
+    overwrite: bool,
+) -> Result<(), String>
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/fn.write_output.html b/compiler-docs/fe/task/build/fn.write_output.html new file mode 100644 index 0000000000..e70f5a321b --- /dev/null +++ b/compiler-docs/fe/task/build/fn.write_output.html @@ -0,0 +1 @@ +write_output in fe::task::build - Rust

Function write_output

Source
fn write_output(path: &Path, content: &str) -> Result<(), String>
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/index.html b/compiler-docs/fe/task/build/index.html new file mode 100644 index 0000000000..dc6416c344 --- /dev/null +++ b/compiler-docs/fe/task/build/index.html @@ -0,0 +1 @@ +fe::task::build - Rust

Module build

Source

Structs§

BuildArgs

Enums§

Emit 🔒

Constants§

DEFAULT_OUTPUT_DIR_NAME 🔒

Functions§

build
build_ingot 🔒
build_single_file 🔒
ioerr_to_string 🔒
mir_dump 🔒
verify_nonexistent_or_empty 🔒
write_compiled_module 🔒
write_output 🔒
\ No newline at end of file diff --git a/compiler-docs/fe/task/build/sidebar-items.js b/compiler-docs/fe/task/build/sidebar-items.js new file mode 100644 index 0000000000..77dc7c0ee2 --- /dev/null +++ b/compiler-docs/fe/task/build/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["DEFAULT_OUTPUT_DIR_NAME"],"enum":["Emit"],"fn":["build","build_ingot","build_single_file","ioerr_to_string","mir_dump","verify_nonexistent_or_empty","write_compiled_module","write_output"],"struct":["BuildArgs"]}; \ No newline at end of file diff --git a/compiler-docs/fe/task/build/struct.BuildArgs.html b/compiler-docs/fe/task/build/struct.BuildArgs.html new file mode 100644 index 0000000000..3063cf4dd9 --- /dev/null +++ b/compiler-docs/fe/task/build/struct.BuildArgs.html @@ -0,0 +1,106 @@ +BuildArgs in fe::task::build - Rust

Struct BuildArgs

Source
pub struct BuildArgs {
+    input_path: String,
+    output_dir: String,
+    emit: Vec<Emit>,
+    mir: bool,
+    overwrite: bool,
+    optimize: Option<bool>,
+}

Fields§

§input_path: String§output_dir: String§emit: Vec<Emit>§mir: bool§overwrite: bool§optimize: Option<bool>

Trait Implementations§

Source§

impl Args for BuildArgs

Source§

fn augment_args<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_args_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

impl FromArgMatches for BuildArgs

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/check/fn.check.html b/compiler-docs/fe/task/check/fn.check.html new file mode 100644 index 0000000000..2b42078f4a --- /dev/null +++ b/compiler-docs/fe/task/check/fn.check.html @@ -0,0 +1 @@ +check in fe::task::check - Rust

Function check

Source
pub fn check(args: CheckArgs)
\ No newline at end of file diff --git a/compiler-docs/fe/task/check/fn.check_ingot.html b/compiler-docs/fe/task/check/fn.check_ingot.html new file mode 100644 index 0000000000..b4a82e71a4 --- /dev/null +++ b/compiler-docs/fe/task/check/fn.check_ingot.html @@ -0,0 +1 @@ +check_ingot in fe::task::check - Rust

Function check_ingot

Source
fn check_ingot(db: &mut Db, input_path: &str) -> Vec<Diagnostic>
\ No newline at end of file diff --git a/compiler-docs/fe/task/check/fn.check_single_file.html b/compiler-docs/fe/task/check/fn.check_single_file.html new file mode 100644 index 0000000000..bf273fcae4 --- /dev/null +++ b/compiler-docs/fe/task/check/fn.check_single_file.html @@ -0,0 +1 @@ +check_single_file in fe::task::check - Rust

Function check_single_file

Source
fn check_single_file(db: &mut Db, input_path: &str) -> Vec<Diagnostic>
\ No newline at end of file diff --git a/compiler-docs/fe/task/check/index.html b/compiler-docs/fe/task/check/index.html new file mode 100644 index 0000000000..003cfb34e9 --- /dev/null +++ b/compiler-docs/fe/task/check/index.html @@ -0,0 +1 @@ +fe::task::check - Rust

Module check

Source

Structs§

CheckArgs

Functions§

check
check_ingot 🔒
check_single_file 🔒
\ No newline at end of file diff --git a/compiler-docs/fe/task/check/sidebar-items.js b/compiler-docs/fe/task/check/sidebar-items.js new file mode 100644 index 0000000000..f883328035 --- /dev/null +++ b/compiler-docs/fe/task/check/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["check","check_ingot","check_single_file"],"struct":["CheckArgs"]}; \ No newline at end of file diff --git a/compiler-docs/fe/task/check/struct.CheckArgs.html b/compiler-docs/fe/task/check/struct.CheckArgs.html new file mode 100644 index 0000000000..97749b9dc5 --- /dev/null +++ b/compiler-docs/fe/task/check/struct.CheckArgs.html @@ -0,0 +1,101 @@ +CheckArgs in fe::task::check - Rust

Struct CheckArgs

Source
pub struct CheckArgs {
+    input_path: String,
+}

Fields§

§input_path: String

Trait Implementations§

Source§

impl Args for CheckArgs

Source§

fn augment_args<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_args_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

impl FromArgMatches for CheckArgs

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/enum.Commands.html b/compiler-docs/fe/task/enum.Commands.html new file mode 100644 index 0000000000..5549dd7a78 --- /dev/null +++ b/compiler-docs/fe/task/enum.Commands.html @@ -0,0 +1,103 @@ +Commands in fe::task - Rust

Enum Commands

Source
pub enum Commands {
+    Build(BuildArgs),
+    Check(CheckArgs),
+    New(NewProjectArgs),
+}

Variants§

Trait Implementations§

Source§

impl FromArgMatches for Commands

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut<'b>( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

impl Subcommand for Commands

Source§

fn augment_subcommands<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_subcommands_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

fn has_subcommand(__clap_name: &str) -> bool

Test whether Self can parse a specific subcommand

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/index.html b/compiler-docs/fe/task/index.html new file mode 100644 index 0000000000..6c8eb00da9 --- /dev/null +++ b/compiler-docs/fe/task/index.html @@ -0,0 +1 @@ +fe::task - Rust

Module task

Source

Re-exports§

pub use build::build;
pub use build::BuildArgs;
pub use check::check;
pub use check::CheckArgs;
pub use new::create_new_project;
pub use new::NewProjectArgs;

Modules§

build 🔒
check 🔒
new 🔒

Enums§

Commands
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/constant.SRC_TEMPLATE_DIR.html b/compiler-docs/fe/task/new/constant.SRC_TEMPLATE_DIR.html new file mode 100644 index 0000000000..4e1d7a71a4 --- /dev/null +++ b/compiler-docs/fe/task/new/constant.SRC_TEMPLATE_DIR.html @@ -0,0 +1 @@ +SRC_TEMPLATE_DIR in fe::task::new - Rust

Constant SRC_TEMPLATE_DIR

Source
const SRC_TEMPLATE_DIR: Dir<'_>;
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/fn.create_new_project.html b/compiler-docs/fe/task/new/fn.create_new_project.html new file mode 100644 index 0000000000..1f8b390245 --- /dev/null +++ b/compiler-docs/fe/task/new/fn.create_new_project.html @@ -0,0 +1 @@ +create_new_project in fe::task::new - Rust

Function create_new_project

Source
pub fn create_new_project(args: NewProjectArgs)
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/fn.create_project.html b/compiler-docs/fe/task/new/fn.create_project.html new file mode 100644 index 0000000000..3899c24e82 --- /dev/null +++ b/compiler-docs/fe/task/new/fn.create_project.html @@ -0,0 +1 @@ +create_project in fe::task::new - Rust

Function create_project

Source
fn create_project(name: &str, path: &Path)
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/index.html b/compiler-docs/fe/task/new/index.html new file mode 100644 index 0000000000..9142b7d15d --- /dev/null +++ b/compiler-docs/fe/task/new/index.html @@ -0,0 +1 @@ +fe::task::new - Rust

Module new

Source

Structs§

NewProjectArgs

Constants§

SRC_TEMPLATE_DIR 🔒

Functions§

create_new_project
create_project 🔒
\ No newline at end of file diff --git a/compiler-docs/fe/task/new/sidebar-items.js b/compiler-docs/fe/task/new/sidebar-items.js new file mode 100644 index 0000000000..23184c9740 --- /dev/null +++ b/compiler-docs/fe/task/new/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["SRC_TEMPLATE_DIR"],"fn":["create_new_project","create_project"],"struct":["NewProjectArgs"]}; \ No newline at end of file diff --git a/compiler-docs/fe/task/new/struct.NewProjectArgs.html b/compiler-docs/fe/task/new/struct.NewProjectArgs.html new file mode 100644 index 0000000000..8e5a929364 --- /dev/null +++ b/compiler-docs/fe/task/new/struct.NewProjectArgs.html @@ -0,0 +1,101 @@ +NewProjectArgs in fe::task::new - Rust

Struct NewProjectArgs

Source
pub struct NewProjectArgs {
+    name: String,
+}

Fields§

§name: String

Trait Implementations§

Source§

impl Args for NewProjectArgs

Source§

fn augment_args<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can instantiate Self. Read more
Source§

fn augment_args_for_update<'b>(__clap_app: Command<'b>) -> Command<'b>

Append to [Command] so it can update self. Read more
Source§

impl FromArgMatches for NewProjectArgs

Source§

fn from_arg_matches(__clap_arg_matches: &ArgMatches) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn from_arg_matches_mut( + __clap_arg_matches: &mut ArgMatches, +) -> Result<Self, Error>

Instantiate Self from [ArgMatches], parsing the arguments as needed. Read more
Source§

fn update_from_arg_matches( + &mut self, + __clap_arg_matches: &ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.
Source§

fn update_from_arg_matches_mut( + &mut self, + __clap_arg_matches: &mut ArgMatches, +) -> Result<(), Error>

Assign values from ArgMatches to self.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe/task/sidebar-items.js b/compiler-docs/fe/task/sidebar-items.js new file mode 100644 index 0000000000..d29fbf5b5e --- /dev/null +++ b/compiler-docs/fe/task/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Commands"],"mod":["build","check","new"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/all.html b/compiler-docs/fe_abi/all.html new file mode 100644 index 0000000000..9ec1c72c36 --- /dev/null +++ b/compiler-docs/fe_abi/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_abi/contract/index.html b/compiler-docs/fe_abi/contract/index.html new file mode 100644 index 0000000000..66eac489b8 --- /dev/null +++ b/compiler-docs/fe_abi/contract/index.html @@ -0,0 +1 @@ +fe_abi::contract - Rust

Module contract

Source

Structs§

AbiContract
\ No newline at end of file diff --git a/compiler-docs/fe_abi/contract/sidebar-items.js b/compiler-docs/fe_abi/contract/sidebar-items.js new file mode 100644 index 0000000000..745d35a877 --- /dev/null +++ b/compiler-docs/fe_abi/contract/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AbiContract"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/contract/struct.AbiContract.html b/compiler-docs/fe_abi/contract/struct.AbiContract.html new file mode 100644 index 0000000000..a0a5247575 --- /dev/null +++ b/compiler-docs/fe_abi/contract/struct.AbiContract.html @@ -0,0 +1,20 @@ +AbiContract in fe_abi::contract - Rust

Struct AbiContract

Source
pub struct AbiContract { /* private fields */ }

Implementations§

Source§

impl AbiContract

Source

pub fn new(funcs: Vec<AbiFunction>, events: Vec<AbiEvent>) -> Self

Trait Implementations§

Source§

impl Clone for AbiContract

Source§

fn clone(&self) -> AbiContract

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiContract

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiContract

Source§

fn eq(&self, other: &AbiContract) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiContract

Source§

fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error>

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiContract

Source§

impl StructuralPartialEq for AbiContract

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/event/index.html b/compiler-docs/fe_abi/event/index.html new file mode 100644 index 0000000000..60ebefd14e --- /dev/null +++ b/compiler-docs/fe_abi/event/index.html @@ -0,0 +1 @@ +fe_abi::event - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_abi/event/sidebar-items.js b/compiler-docs/fe_abi/event/sidebar-items.js new file mode 100644 index 0000000000..bc46aa71df --- /dev/null +++ b/compiler-docs/fe_abi/event/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AbiEvent","AbiEventField","AbiEventSignature"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/event/struct.AbiEvent.html b/compiler-docs/fe_abi/event/struct.AbiEvent.html new file mode 100644 index 0000000000..543908885b --- /dev/null +++ b/compiler-docs/fe_abi/event/struct.AbiEvent.html @@ -0,0 +1,26 @@ +AbiEvent in fe_abi::event - Rust

Struct AbiEvent

Source
pub struct AbiEvent {
+    pub ty: &'static str,
+    pub name: String,
+    pub inputs: Vec<AbiEventField>,
+    pub anonymous: bool,
+}

Fields§

§ty: &'static str§name: String§inputs: Vec<AbiEventField>§anonymous: bool

Implementations§

Source§

impl AbiEvent

Source

pub fn new(name: String, fields: Vec<AbiEventField>, anonymous: bool) -> Self

Source

pub fn signature(&self) -> AbiEventSignature

Trait Implementations§

Source§

impl Clone for AbiEvent

Source§

fn clone(&self) -> AbiEvent

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiEvent

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiEvent

Source§

fn eq(&self, other: &AbiEvent) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiEvent

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiEvent

Source§

impl StructuralPartialEq for AbiEvent

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/event/struct.AbiEventField.html b/compiler-docs/fe_abi/event/struct.AbiEventField.html new file mode 100644 index 0000000000..ca33b265c0 --- /dev/null +++ b/compiler-docs/fe_abi/event/struct.AbiEventField.html @@ -0,0 +1,25 @@ +AbiEventField in fe_abi::event - Rust

Struct AbiEventField

Source
pub struct AbiEventField {
+    pub name: String,
+    pub ty: AbiType,
+    pub indexed: bool,
+}

Fields§

§name: String§ty: AbiType§indexed: bool

Implementations§

Source§

impl AbiEventField

Source

pub fn new(name: String, ty: impl Into<AbiType>, indexed: bool) -> Self

Trait Implementations§

Source§

impl Clone for AbiEventField

Source§

fn clone(&self) -> AbiEventField

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiEventField

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiEventField

Source§

fn eq(&self, other: &AbiEventField) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiEventField

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiEventField

Source§

impl StructuralPartialEq for AbiEventField

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/event/struct.AbiEventSignature.html b/compiler-docs/fe_abi/event/struct.AbiEventSignature.html new file mode 100644 index 0000000000..2a88718a1b --- /dev/null +++ b/compiler-docs/fe_abi/event/struct.AbiEventSignature.html @@ -0,0 +1,11 @@ +AbiEventSignature in fe_abi::event - Rust

Struct AbiEventSignature

Source
pub struct AbiEventSignature { /* private fields */ }

Implementations§

Source§

impl AbiEventSignature

Source

pub fn signature(&self) -> &str

Source

pub fn hash_hex(&self) -> String

Source

pub fn hash_raw(&self) -> [u8; 32]

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/enum.AbiFunctionType.html b/compiler-docs/fe_abi/function/enum.AbiFunctionType.html new file mode 100644 index 0000000000..07e47d69f6 --- /dev/null +++ b/compiler-docs/fe_abi/function/enum.AbiFunctionType.html @@ -0,0 +1,27 @@ +AbiFunctionType in fe_abi::function - Rust

Enum AbiFunctionType

Source
pub enum AbiFunctionType {
+    Function,
+    Constructor,
+    Receive,
+    Payable,
+    Fallback,
+}

Variants§

§

Function

§

Constructor

§

Receive

§

Payable

§

Fallback

Trait Implementations§

Source§

impl Clone for AbiFunctionType

Source§

fn clone(&self) -> AbiFunctionType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiFunctionType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiFunctionType

Source§

fn eq(&self, other: &AbiFunctionType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiFunctionType

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for AbiFunctionType

Source§

impl Eq for AbiFunctionType

Source§

impl StructuralPartialEq for AbiFunctionType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/enum.CtxParam.html b/compiler-docs/fe_abi/function/enum.CtxParam.html new file mode 100644 index 0000000000..6cec50bda7 --- /dev/null +++ b/compiler-docs/fe_abi/function/enum.CtxParam.html @@ -0,0 +1,15 @@ +CtxParam in fe_abi::function - Rust

Enum CtxParam

Source
pub enum CtxParam {
+    None,
+    Imm,
+    Mut,
+}

Variants§

§

None

§

Imm

§

Mut

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/enum.SelfParam.html b/compiler-docs/fe_abi/function/enum.SelfParam.html new file mode 100644 index 0000000000..c7015b4cbf --- /dev/null +++ b/compiler-docs/fe_abi/function/enum.SelfParam.html @@ -0,0 +1,15 @@ +SelfParam in fe_abi::function - Rust

Enum SelfParam

Source
pub enum SelfParam {
+    None,
+    Imm,
+    Mut,
+}

Variants§

§

None

§

Imm

§

Mut

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/enum.StateMutability.html b/compiler-docs/fe_abi/function/enum.StateMutability.html new file mode 100644 index 0000000000..230dad6cb9 --- /dev/null +++ b/compiler-docs/fe_abi/function/enum.StateMutability.html @@ -0,0 +1,27 @@ +StateMutability in fe_abi::function - Rust

Enum StateMutability

Source
pub enum StateMutability {
+    Pure,
+    View,
+    Nonpayable,
+    Payable,
+}
Expand description

The mutability of a public function.

+

Variants§

§

Pure

§

View

§

Nonpayable

§

Payable

Implementations§

Trait Implementations§

Source§

impl Clone for StateMutability

Source§

fn clone(&self) -> StateMutability

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StateMutability

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for StateMutability

Source§

fn eq(&self, other: &StateMutability) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for StateMutability

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for StateMutability

Source§

impl StructuralPartialEq for StateMutability

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/index.html b/compiler-docs/fe_abi/function/index.html new file mode 100644 index 0000000000..53d7db5e90 --- /dev/null +++ b/compiler-docs/fe_abi/function/index.html @@ -0,0 +1 @@ +fe_abi::function - Rust

Module function

Source

Structs§

AbiFunction
AbiFunctionSelector

Enums§

AbiFunctionType
CtxParam
SelfParam
StateMutability
The mutability of a public function.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/sidebar-items.js b/compiler-docs/fe_abi/function/sidebar-items.js new file mode 100644 index 0000000000..7dfdacc3d1 --- /dev/null +++ b/compiler-docs/fe_abi/function/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AbiFunctionType","CtxParam","SelfParam","StateMutability"],"struct":["AbiFunction","AbiFunctionSelector"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/function/struct.AbiFunction.html b/compiler-docs/fe_abi/function/struct.AbiFunction.html new file mode 100644 index 0000000000..afe2f86207 --- /dev/null +++ b/compiler-docs/fe_abi/function/struct.AbiFunction.html @@ -0,0 +1,27 @@ +AbiFunction in fe_abi::function - Rust

Struct AbiFunction

Source
pub struct AbiFunction { /* private fields */ }

Implementations§

Source§

impl AbiFunction

Source

pub fn new( + func_type: AbiFunctionType, + name: String, + args: Vec<(String, AbiType)>, + ret_ty: Option<AbiType>, + state_mutability: StateMutability, +) -> Self

Source

pub fn selector(&self) -> AbiFunctionSelector

Trait Implementations§

Source§

impl Clone for AbiFunction

Source§

fn clone(&self) -> AbiFunction

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiFunction

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiFunction

Source§

fn eq(&self, other: &AbiFunction) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiFunction

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiFunction

Source§

impl StructuralPartialEq for AbiFunction

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/function/struct.AbiFunctionSelector.html b/compiler-docs/fe_abi/function/struct.AbiFunctionSelector.html new file mode 100644 index 0000000000..3e15665f2f --- /dev/null +++ b/compiler-docs/fe_abi/function/struct.AbiFunctionSelector.html @@ -0,0 +1,12 @@ +AbiFunctionSelector in fe_abi::function - Rust

Struct AbiFunctionSelector

Source
pub struct AbiFunctionSelector { /* private fields */ }

Implementations§

Source§

impl AbiFunctionSelector

Source

pub fn selector_signature(&self) -> &str

Source

pub fn selector_raw(&self) -> [u8; 4]

Source

pub fn hex(&self) -> String

Returns first 4 bytes of signature hash in hex.

+

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/index.html b/compiler-docs/fe_abi/index.html new file mode 100644 index 0000000000..2f8dc4b42e --- /dev/null +++ b/compiler-docs/fe_abi/index.html @@ -0,0 +1 @@ +fe_abi - Rust

Crate fe_abi

Source

Modules§

contract
event
function
types
\ No newline at end of file diff --git a/compiler-docs/fe_abi/sidebar-items.js b/compiler-docs/fe_abi/sidebar-items.js new file mode 100644 index 0000000000..16c17313a0 --- /dev/null +++ b/compiler-docs/fe_abi/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["contract","event","function","types"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/types/enum.AbiType.html b/compiler-docs/fe_abi/types/enum.AbiType.html new file mode 100644 index 0000000000..e89e292d38 --- /dev/null +++ b/compiler-docs/fe_abi/types/enum.AbiType.html @@ -0,0 +1,34 @@ +AbiType in fe_abi::types - Rust

Enum AbiType

Source
pub enum AbiType {
+    UInt(usize),
+    Int(usize),
+    Address,
+    Bool,
+    Function,
+    Array {
+        elem_ty: Box<AbiType>,
+        len: usize,
+    },
+    Tuple(Vec<AbiTupleField>),
+    Bytes,
+    String,
+}

Variants§

§

UInt(usize)

§

Int(usize)

§

Address

§

Bool

§

Function

§

Array

Fields

§elem_ty: Box<AbiType>
§len: usize
§

Tuple(Vec<AbiTupleField>)

§

Bytes

§

String

Implementations§

Source§

impl AbiType

Source

pub fn selector_type_name(&self) -> String

Source

pub fn abi_type_name(&self) -> String

Source

pub fn header_size(&self) -> usize

Source

pub fn is_primitive(&self) -> bool

Source

pub fn is_bytes(&self) -> bool

Source

pub fn is_string(&self) -> bool

Source

pub fn is_static(&self) -> bool

Source

pub fn size(&self) -> Option<usize>

Returns bytes size of the encoded type if the type is static.

+

Trait Implementations§

Source§

impl Clone for AbiType

Source§

fn clone(&self) -> AbiType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiType

Source§

fn eq(&self, other: &AbiType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiType

Source§

fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error>

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiType

Source§

impl StructuralPartialEq for AbiType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_abi/types/index.html b/compiler-docs/fe_abi/types/index.html new file mode 100644 index 0000000000..cd69943a39 --- /dev/null +++ b/compiler-docs/fe_abi/types/index.html @@ -0,0 +1 @@ +fe_abi::types - Rust

Module types

Source

Structs§

AbiTupleField

Enums§

AbiType
\ No newline at end of file diff --git a/compiler-docs/fe_abi/types/sidebar-items.js b/compiler-docs/fe_abi/types/sidebar-items.js new file mode 100644 index 0000000000..eb93bd85b4 --- /dev/null +++ b/compiler-docs/fe_abi/types/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AbiType"],"struct":["AbiTupleField"]}; \ No newline at end of file diff --git a/compiler-docs/fe_abi/types/struct.AbiTupleField.html b/compiler-docs/fe_abi/types/struct.AbiTupleField.html new file mode 100644 index 0000000000..8050698fb6 --- /dev/null +++ b/compiler-docs/fe_abi/types/struct.AbiTupleField.html @@ -0,0 +1,24 @@ +AbiTupleField in fe_abi::types - Rust

Struct AbiTupleField

Source
pub struct AbiTupleField {
+    pub name: String,
+    pub ty: AbiType,
+}

Fields§

§name: String§ty: AbiType

Implementations§

Source§

impl AbiTupleField

Source

pub fn new(name: String, ty: impl Into<AbiType>) -> Self

Trait Implementations§

Source§

impl Clone for AbiTupleField

Source§

fn clone(&self) -> AbiTupleField

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiTupleField

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AbiTupleField

Source§

fn eq(&self, other: &AbiTupleField) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for AbiTupleField

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for AbiTupleField

Source§

impl StructuralPartialEq for AbiTupleField

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/all.html b/compiler-docs/fe_analyzer/all.html new file mode 100644 index 0000000000..5055222619 --- /dev/null +++ b/compiler-docs/fe_analyzer/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Enums

Traits

Functions

Type Aliases

Constants

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/enum.ContractTypeMethod.html b/compiler-docs/fe_analyzer/builtins/enum.ContractTypeMethod.html new file mode 100644 index 0000000000..6ce0429d93 --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/enum.ContractTypeMethod.html @@ -0,0 +1,25 @@ +ContractTypeMethod in fe_analyzer::builtins - Rust

Enum ContractTypeMethod

Source
pub enum ContractTypeMethod {
+    Create,
+    Create2,
+}

Variants§

§

Create

§

Create2

Implementations§

Trait Implementations§

Source§

impl AsRef<str> for ContractTypeMethod

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for ContractTypeMethod

Source§

fn clone(&self) -> ContractTypeMethod

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractTypeMethod

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for ContractTypeMethod

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<ContractTypeMethod, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl PartialEq for ContractTypeMethod

Source§

fn eq(&self, other: &ContractTypeMethod) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl TryFrom<&str> for ContractTypeMethod

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from( + s: &str, +) -> Result<ContractTypeMethod, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for ContractTypeMethod

Source§

impl Eq for ContractTypeMethod

Source§

impl StructuralPartialEq for ContractTypeMethod

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/enum.GlobalFunction.html b/compiler-docs/fe_analyzer/builtins/enum.GlobalFunction.html new file mode 100644 index 0000000000..64f1bbfeaf --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/enum.GlobalFunction.html @@ -0,0 +1,33 @@ +GlobalFunction in fe_analyzer::builtins - Rust

Enum GlobalFunction

Source
pub enum GlobalFunction {
+    Keccak256,
+}

Variants§

§

Keccak256

Trait Implementations§

Source§

impl AsRef<str> for GlobalFunction

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for GlobalFunction

Source§

fn clone(&self) -> GlobalFunction

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GlobalFunction

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for GlobalFunction

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<GlobalFunction, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for GlobalFunction

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl IntoEnumIterator for GlobalFunction

Source§

impl Ord for GlobalFunction

Source§

fn cmp(&self, other: &GlobalFunction) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for GlobalFunction

Source§

fn eq(&self, other: &GlobalFunction) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for GlobalFunction

Source§

fn partial_cmp(&self, other: &GlobalFunction) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TryFrom<&str> for GlobalFunction

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<GlobalFunction, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for GlobalFunction

Source§

impl Eq for GlobalFunction

Source§

impl StructuralPartialEq for GlobalFunction

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/enum.Intrinsic.html b/compiler-docs/fe_analyzer/builtins/enum.Intrinsic.html new file mode 100644 index 0000000000..b097b48ecd --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/enum.Intrinsic.html @@ -0,0 +1,109 @@ +Intrinsic in fe_analyzer::builtins - Rust

Enum Intrinsic

Source
pub enum Intrinsic {
+
Show 76 variants __stop, + __add, + __sub, + __mul, + __div, + __sdiv, + __mod, + __smod, + __exp, + __not, + __lt, + __gt, + __slt, + __sgt, + __eq, + __iszero, + __and, + __or, + __xor, + __byte, + __shl, + __shr, + __sar, + __addmod, + __mulmod, + __signextend, + __keccak256, + __pc, + __pop, + __mload, + __mstore, + __mstore8, + __sload, + __sstore, + __msize, + __gas, + __address, + __balance, + __selfbalance, + __caller, + __callvalue, + __calldataload, + __calldatasize, + __calldatacopy, + __codesize, + __codecopy, + __extcodesize, + __extcodecopy, + __returndatasize, + __returndatacopy, + __extcodehash, + __create, + __create2, + __call, + __callcode, + __delegatecall, + __staticcall, + __return, + __revert, + __selfdestruct, + __invalid, + __log0, + __log1, + __log2, + __log3, + __log4, + __chainid, + __basefee, + __origin, + __gasprice, + __blockhash, + __coinbase, + __timestamp, + __number, + __prevrandao, + __gaslimit, +
}
Expand description

The evm functions exposed by yul.

+

Variants§

§

__stop

§

__add

§

__sub

§

__mul

§

__div

§

__sdiv

§

__mod

§

__smod

§

__exp

§

__not

§

__lt

§

__gt

§

__slt

§

__sgt

§

__eq

§

__iszero

§

__and

§

__or

§

__xor

§

__byte

§

__shl

§

__shr

§

__sar

§

__addmod

§

__mulmod

§

__signextend

§

__keccak256

§

__pc

§

__pop

§

__mload

§

__mstore

§

__mstore8

§

__sload

§

__sstore

§

__msize

§

__gas

§

__address

§

__balance

§

__selfbalance

§

__caller

§

__callvalue

§

__calldataload

§

__calldatasize

§

__calldatacopy

§

__codesize

§

__codecopy

§

__extcodesize

§

__extcodecopy

§

__returndatasize

§

__returndatacopy

§

__extcodehash

§

__create

§

__create2

§

__call

§

__callcode

§

__delegatecall

§

__staticcall

§

__return

§

__revert

§

__selfdestruct

§

__invalid

§

__log0

§

__log1

§

__log2

§

__log3

§

__log4

§

__chainid

§

__basefee

§

__origin

§

__gasprice

§

__blockhash

§

__coinbase

§

__timestamp

§

__number

§

__prevrandao

§

__gaslimit

Implementations§

Source§

impl Intrinsic

Source

pub fn arg_count(&self) -> usize

Source

pub fn return_type(&self) -> Base

Trait Implementations§

Source§

impl AsRef<str> for Intrinsic

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for Intrinsic

Source§

fn clone(&self) -> Intrinsic

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Intrinsic

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for Intrinsic

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Intrinsic, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for Intrinsic

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl IntoEnumIterator for Intrinsic

Source§

impl Ord for Intrinsic

Source§

fn cmp(&self, other: &Intrinsic) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Intrinsic

Source§

fn eq(&self, other: &Intrinsic) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Intrinsic

Source§

fn partial_cmp(&self, other: &Intrinsic) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TryFrom<&str> for Intrinsic

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<Intrinsic, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for Intrinsic

Source§

impl Eq for Intrinsic

Source§

impl StructuralPartialEq for Intrinsic

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/enum.ValueMethod.html b/compiler-docs/fe_analyzer/builtins/enum.ValueMethod.html new file mode 100644 index 0000000000..20a0de590d --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/enum.ValueMethod.html @@ -0,0 +1,25 @@ +ValueMethod in fe_analyzer::builtins - Rust

Enum ValueMethod

Source
pub enum ValueMethod {
+    ToMem,
+    AbiEncode,
+}

Variants§

§

ToMem

§

AbiEncode

Trait Implementations§

Source§

impl AsRef<str> for ValueMethod

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for ValueMethod

Source§

fn clone(&self) -> ValueMethod

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ValueMethod

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for ValueMethod

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<ValueMethod, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for ValueMethod

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ValueMethod

Source§

fn eq(&self, other: &ValueMethod) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl TryFrom<&str> for ValueMethod

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<ValueMethod, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for ValueMethod

Source§

impl Eq for ValueMethod

Source§

impl StructuralPartialEq for ValueMethod

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/index.html b/compiler-docs/fe_analyzer/builtins/index.html new file mode 100644 index 0000000000..d24a8254de --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/index.html @@ -0,0 +1 @@ +fe_analyzer::builtins - Rust

Module builtins

Source

Structs§

GlobalFunctionIter
IntrinsicIter

Enums§

ContractTypeMethod
GlobalFunction
Intrinsic
The evm functions exposed by yul.
ValueMethod
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/sidebar-items.js b/compiler-docs/fe_analyzer/builtins/sidebar-items.js new file mode 100644 index 0000000000..261c3e4c84 --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ContractTypeMethod","GlobalFunction","Intrinsic","ValueMethod"],"struct":["GlobalFunctionIter","IntrinsicIter"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/struct.GlobalFunctionIter.html b/compiler-docs/fe_analyzer/builtins/struct.GlobalFunctionIter.html new file mode 100644 index 0000000000..4cbc8c8d2e --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/struct.GlobalFunctionIter.html @@ -0,0 +1,221 @@ +GlobalFunctionIter in fe_analyzer::builtins - Rust

Struct GlobalFunctionIter

Source
pub struct GlobalFunctionIter { /* private fields */ }

Trait Implementations§

Source§

impl Clone for GlobalFunctionIter

Source§

fn clone(&self) -> GlobalFunctionIter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DoubleEndedIterator for GlobalFunctionIter

Source§

fn next_back(&mut self) -> Option<<Self as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
Source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.37.0 · Source§

fn nth_back(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element from the end of the iterator. Read more
1.27.0 · Source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes +elements starting from the back of the iterator. Read more
1.27.0 · Source§

fn rfold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single, +final value, starting from the back. Read more
1.27.0 · Source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
Source§

impl ExactSizeIterator for GlobalFunctionIter

Source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
Source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
Source§

impl Iterator for GlobalFunctionIter

Source§

type Item = GlobalFunction

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<<Self as Iterator>::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn nth(&mut self, n: usize) -> Option<<Self as Iterator>::Item>

Returns the nth element of the iterator. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
where + T: 'a, + Self: Sized + DoubleEndedIterator<Item = &'a mut T>, + P: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate, +such that all those that return true precede all those that return false. +Returns the number of true elements found. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn rposition<P>(&mut self, predicate: P) -> Option<usize>
where + P: FnMut(Self::Item) -> bool, + Self: Sized + ExactSizeIterator + DoubleEndedIterator,

Searches for an element in an iterator from the right, returning its +index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn rev(self) -> Rev<Self>
where + Self: Sized + DoubleEndedIterator,

Reverses an iterator’s direction. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/builtins/struct.IntrinsicIter.html b/compiler-docs/fe_analyzer/builtins/struct.IntrinsicIter.html new file mode 100644 index 0000000000..f4e7ab9d86 --- /dev/null +++ b/compiler-docs/fe_analyzer/builtins/struct.IntrinsicIter.html @@ -0,0 +1,221 @@ +IntrinsicIter in fe_analyzer::builtins - Rust

Struct IntrinsicIter

Source
pub struct IntrinsicIter { /* private fields */ }

Trait Implementations§

Source§

impl Clone for IntrinsicIter

Source§

fn clone(&self) -> IntrinsicIter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DoubleEndedIterator for IntrinsicIter

Source§

fn next_back(&mut self) -> Option<<Self as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
Source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.37.0 · Source§

fn nth_back(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element from the end of the iterator. Read more
1.27.0 · Source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes +elements starting from the back of the iterator. Read more
1.27.0 · Source§

fn rfold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single, +final value, starting from the back. Read more
1.27.0 · Source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
Source§

impl ExactSizeIterator for IntrinsicIter

Source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
Source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
Source§

impl Iterator for IntrinsicIter

Source§

type Item = Intrinsic

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<<Self as Iterator>::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn nth(&mut self, n: usize) -> Option<<Self as Iterator>::Item>

Returns the nth element of the iterator. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
where + T: 'a, + Self: Sized + DoubleEndedIterator<Item = &'a mut T>, + P: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate, +such that all those that return true precede all those that return false. +Returns the number of true elements found. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn rposition<P>(&mut self, predicate: P) -> Option<usize>
where + P: FnMut(Self::Item) -> bool, + Self: Sized + ExactSizeIterator + DoubleEndedIterator,

Searches for an element in an iterator from the right, returning its +index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn rev(self) -> Rev<Self>
where + Self: Sized + DoubleEndedIterator,

Reverses an iterator’s direction. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/constant.EMITTABLE_TRAIT_NAME.html b/compiler-docs/fe_analyzer/constants/constant.EMITTABLE_TRAIT_NAME.html new file mode 100644 index 0000000000..49409555cf --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/constant.EMITTABLE_TRAIT_NAME.html @@ -0,0 +1 @@ +EMITTABLE_TRAIT_NAME in fe_analyzer::constants - Rust

Constant EMITTABLE_TRAIT_NAME

Source
pub const EMITTABLE_TRAIT_NAME: &str = "Emittable";
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/constant.EMIT_FN_NAME.html b/compiler-docs/fe_analyzer/constants/constant.EMIT_FN_NAME.html new file mode 100644 index 0000000000..c7deb53ab1 --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/constant.EMIT_FN_NAME.html @@ -0,0 +1 @@ +EMIT_FN_NAME in fe_analyzer::constants - Rust

Constant EMIT_FN_NAME

Source
pub const EMIT_FN_NAME: &str = "emit";
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/constant.INDEXED.html b/compiler-docs/fe_analyzer/constants/constant.INDEXED.html new file mode 100644 index 0000000000..e35f5e2582 --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/constant.INDEXED.html @@ -0,0 +1 @@ +INDEXED in fe_analyzer::constants - Rust

Constant INDEXED

Source
pub const INDEXED: &str = "indexed";
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/constant.MAX_INDEXED_EVENT_FIELDS.html b/compiler-docs/fe_analyzer/constants/constant.MAX_INDEXED_EVENT_FIELDS.html new file mode 100644 index 0000000000..969bd77f45 --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/constant.MAX_INDEXED_EVENT_FIELDS.html @@ -0,0 +1 @@ +MAX_INDEXED_EVENT_FIELDS in fe_analyzer::constants - Rust

Constant MAX_INDEXED_EVENT_FIELDS

Source
pub const MAX_INDEXED_EVENT_FIELDS: usize = 3;
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/index.html b/compiler-docs/fe_analyzer/constants/index.html new file mode 100644 index 0000000000..770c9f3c6a --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/index.html @@ -0,0 +1 @@ +fe_analyzer::constants - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/constants/sidebar-items.js b/compiler-docs/fe_analyzer/constants/sidebar-items.js new file mode 100644 index 0000000000..6d34019cd5 --- /dev/null +++ b/compiler-docs/fe_analyzer/constants/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["EMITTABLE_TRAIT_NAME","EMIT_FN_NAME","INDEXED","MAX_INDEXED_EVENT_FIELDS"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/enum.AdjustmentKind.html b/compiler-docs/fe_analyzer/context/enum.AdjustmentKind.html new file mode 100644 index 0000000000..577f7235ad --- /dev/null +++ b/compiler-docs/fe_analyzer/context/enum.AdjustmentKind.html @@ -0,0 +1,26 @@ +AdjustmentKind in fe_analyzer::context - Rust

Enum AdjustmentKind

Source
pub enum AdjustmentKind {
+    Copy,
+    Load,
+    IntSizeIncrease,
+    StringSizeIncrease,
+}

Variants§

§

Copy

§

Load

Load from storage ptr

+
§

IntSizeIncrease

§

StringSizeIncrease

Trait Implementations§

Source§

impl Clone for AdjustmentKind

Source§

fn clone(&self) -> AdjustmentKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AdjustmentKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AdjustmentKind

Source§

fn eq(&self, other: &AdjustmentKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for AdjustmentKind

Source§

impl Eq for AdjustmentKind

Source§

impl StructuralPartialEq for AdjustmentKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/enum.CallType.html b/compiler-docs/fe_analyzer/context/enum.CallType.html new file mode 100644 index 0000000000..f89400e6de --- /dev/null +++ b/compiler-docs/fe_analyzer/context/enum.CallType.html @@ -0,0 +1,53 @@ +CallType in fe_analyzer::context - Rust

Enum CallType

Source
pub enum CallType {
+    BuiltinFunction(GlobalFunction),
+    Intrinsic(Intrinsic),
+    BuiltinValueMethod {
+        method: ValueMethod,
+        typ: TypeId,
+    },
+    BuiltinAssociatedFunction {
+        contract: ContractId,
+        function: ContractTypeMethod,
+    },
+    AssociatedFunction {
+        typ: TypeId,
+        function: FunctionId,
+    },
+    ValueMethod {
+        typ: TypeId,
+        method: FunctionId,
+    },
+    TraitValueMethod {
+        trait_id: TraitId,
+        method: FunctionSigId,
+        generic_type: Generic,
+    },
+    External {
+        contract: ContractId,
+        function: FunctionId,
+    },
+    Pure(FunctionId),
+    TypeConstructor(TypeId),
+    EnumConstructor(EnumVariantId),
+}
Expand description

The type of a function call.

+

Variants§

§

BuiltinFunction(GlobalFunction)

§

Intrinsic(Intrinsic)

§

BuiltinValueMethod

Fields

§

BuiltinAssociatedFunction

Fields

§contract: ContractId
§

AssociatedFunction

Fields

§function: FunctionId
§

ValueMethod

Fields

§method: FunctionId
§

TraitValueMethod

Fields

§trait_id: TraitId
§generic_type: Generic
§

External

Fields

§contract: ContractId
§function: FunctionId
§

Pure(FunctionId)

§

TypeConstructor(TypeId)

§

EnumConstructor(EnumVariantId)

Implementations§

Source§

impl CallType

Source

pub fn function(&self) -> Option<FunctionId>

Source

pub fn function_name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn is_unsafe(&self, db: &dyn AnalyzerDb) -> bool

Trait Implementations§

Source§

impl Clone for CallType

Source§

fn clone(&self) -> CallType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CallType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for CallType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl PartialEq for CallType

Source§

fn eq(&self, other: &CallType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for CallType

Source§

impl StructuralPartialEq for CallType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/enum.Constant.html b/compiler-docs/fe_analyzer/context/enum.Constant.html new file mode 100644 index 0000000000..846df665b0 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/enum.Constant.html @@ -0,0 +1,34 @@ +Constant in fe_analyzer::context - Rust

Enum Constant

Source
pub enum Constant {
+    Int(BigInt),
+    Address(BigInt),
+    Bool(bool),
+    Str(SmolStr),
+}
Expand description

Represents constant value.

+

Variants§

§

Int(BigInt)

§

Address(BigInt)

§

Bool(bool)

§

Str(SmolStr)

Implementations§

Source§

impl Constant

Source

pub fn from_num_str( + context: &mut dyn AnalyzerContext, + s: &str, + typ: &Type, + span: Span, +) -> Result<Self, ConstEvalError>

Returns constant from numeric literal represented by string.

+
§Panics
+

Panics if s is invalid string for numeric literal.

+

Trait Implementations§

Source§

impl Clone for Constant

Source§

fn clone(&self) -> Constant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Constant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Constant

Source§

fn eq(&self, other: &Constant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Constant

Source§

impl StructuralPartialEq for Constant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/enum.NamedThing.html b/compiler-docs/fe_analyzer/context/enum.NamedThing.html new file mode 100644 index 0000000000..a4e5f66890 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/enum.NamedThing.html @@ -0,0 +1,41 @@ +NamedThing in fe_analyzer::context - Rust

Enum NamedThing

Source
pub enum NamedThing {
+    Item(Item),
+    EnumVariant(EnumVariantId),
+    SelfValue {
+        decl: Option<SelfDecl>,
+        parent: Option<Item>,
+        span: Option<Span>,
+    },
+    Variable {
+        name: SmolStr,
+        typ: Result<TypeId, TypeError>,
+        is_const: bool,
+        span: Span,
+    },
+}

Variants§

§

Item(Item)

§

EnumVariant(EnumVariantId)

§

SelfValue

Fields

§decl: Option<SelfDecl>

Function self parameter.

+
§parent: Option<Item>

The function’s parent, if any. If None, self has been +used in a module-level function.

+
§span: Option<Span>
§

Variable

Fields

§name: SmolStr
§is_const: bool
§span: Span

Implementations§

Source§

impl NamedThing

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn is_builtin(&self) -> bool

Source

pub fn item_kind_display_name(&self) -> &str

Source

pub fn resolve_path_segment( + &self, + db: &dyn AnalyzerDb, + segment: &SmolStr, +) -> Option<NamedThing>

Trait Implementations§

Source§

impl Clone for NamedThing

Source§

fn clone(&self) -> NamedThing

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for NamedThing

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for NamedThing

Source§

fn eq(&self, other: &NamedThing) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for NamedThing

Source§

impl StructuralPartialEq for NamedThing

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/index.html b/compiler-docs/fe_analyzer/context/index.html new file mode 100644 index 0000000000..685f43f9ea --- /dev/null +++ b/compiler-docs/fe_analyzer/context/index.html @@ -0,0 +1 @@ +fe_analyzer::context - Rust

Module context

Source

Structs§

Adjustment
Analysis
DiagnosticVoucher
This should only be created by AnalyzerContext.
ExpressionAttributes
Contains contextual information relating to an expression AST node.
FunctionBody
Label
TempContext

Enums§

AdjustmentKind
CallType
The type of a function call.
Constant
Represents constant value.
NamedThing

Traits§

AnalyzerContext
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/sidebar-items.js b/compiler-docs/fe_analyzer/context/sidebar-items.js new file mode 100644 index 0000000000..efc87ffddd --- /dev/null +++ b/compiler-docs/fe_analyzer/context/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AdjustmentKind","CallType","Constant","NamedThing"],"struct":["Adjustment","Analysis","DiagnosticVoucher","ExpressionAttributes","FunctionBody","Label","TempContext"],"trait":["AnalyzerContext"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.Adjustment.html b/compiler-docs/fe_analyzer/context/struct.Adjustment.html new file mode 100644 index 0000000000..53e66b80be --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.Adjustment.html @@ -0,0 +1,23 @@ +Adjustment in fe_analyzer::context - Rust

Struct Adjustment

Source
pub struct Adjustment {
+    pub into: TypeId,
+    pub kind: AdjustmentKind,
+}

Fields§

§into: TypeId§kind: AdjustmentKind

Trait Implementations§

Source§

impl Clone for Adjustment

Source§

fn clone(&self) -> Adjustment

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Adjustment

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Adjustment

Source§

fn eq(&self, other: &Adjustment) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Adjustment

Source§

impl Eq for Adjustment

Source§

impl StructuralPartialEq for Adjustment

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.Analysis.html b/compiler-docs/fe_analyzer/context/struct.Analysis.html new file mode 100644 index 0000000000..917432c986 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.Analysis.html @@ -0,0 +1,29 @@ +Analysis in fe_analyzer::context - Rust

Struct Analysis

Source
pub struct Analysis<T> {
+    pub value: T,
+    pub diagnostics: Rc<[Diagnostic]>,
+}

Fields§

§value: T§diagnostics: Rc<[Diagnostic]>

Implementations§

Source§

impl<T> Analysis<T>

Source

pub fn new(value: T, diagnostics: Rc<[Diagnostic]>) -> Self

Source

pub fn sink_diagnostics(&self, sink: &mut impl DiagnosticSink)

Source

pub fn has_diag(&self) -> bool

Trait Implementations§

Source§

impl<T: Clone> Clone for Analysis<T>

Source§

fn clone(&self) -> Analysis<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Debug> Debug for Analysis<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T: Hash> Hash for Analysis<T>

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<T: PartialEq> PartialEq for Analysis<T>

Source§

fn eq(&self, other: &Analysis<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl<T: Eq> Eq for Analysis<T>

Source§

impl<T> StructuralPartialEq for Analysis<T>

Auto Trait Implementations§

§

impl<T> Freeze for Analysis<T>
where + T: Freeze,

§

impl<T> RefUnwindSafe for Analysis<T>
where + T: RefUnwindSafe,

§

impl<T> !Send for Analysis<T>

§

impl<T> !Sync for Analysis<T>

§

impl<T> Unpin for Analysis<T>
where + T: Unpin,

§

impl<T> UnwindSafe for Analysis<T>
where + T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.DiagnosticVoucher.html b/compiler-docs/fe_analyzer/context/struct.DiagnosticVoucher.html new file mode 100644 index 0000000000..afa3155d57 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.DiagnosticVoucher.html @@ -0,0 +1,23 @@ +DiagnosticVoucher in fe_analyzer::context - Rust

Struct DiagnosticVoucher

Source
pub struct DiagnosticVoucher(/* private fields */);
Expand description

This should only be created by AnalyzerContext.

+

Implementations§

Trait Implementations§

Source§

impl Clone for DiagnosticVoucher

Source§

fn clone(&self) -> DiagnosticVoucher

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DiagnosticVoucher

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for DiagnosticVoucher

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for DiagnosticVoucher

Source§

fn eq(&self, other: &DiagnosticVoucher) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for DiagnosticVoucher

Source§

impl StructuralPartialEq for DiagnosticVoucher

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.ExpressionAttributes.html b/compiler-docs/fe_analyzer/context/struct.ExpressionAttributes.html new file mode 100644 index 0000000000..526890b1c3 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.ExpressionAttributes.html @@ -0,0 +1,33 @@ +ExpressionAttributes in fe_analyzer::context - Rust

Struct ExpressionAttributes

Source
pub struct ExpressionAttributes {
+    pub typ: TypeId,
+    pub const_value: Option<Constant>,
+    pub type_adjustments: Vec<Adjustment>,
+}
Expand description

Contains contextual information relating to an expression AST node.

+

Fields§

§typ: TypeId§const_value: Option<Constant>§type_adjustments: Vec<Adjustment>

Implementations§

Trait Implementations§

Source§

impl Clone for ExpressionAttributes

Source§

fn clone(&self) -> ExpressionAttributes

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ExpressionAttributes

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for ExpressionAttributes

Source§

fn format( + &self, + db: &dyn AnalyzerDb, + f: &mut Formatter<'_>, +) -> Result<(), Error>

Source§

impl PartialEq for ExpressionAttributes

Source§

fn eq(&self, other: &ExpressionAttributes) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ExpressionAttributes

Source§

impl StructuralPartialEq for ExpressionAttributes

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.FunctionBody.html b/compiler-docs/fe_analyzer/context/struct.FunctionBody.html new file mode 100644 index 0000000000..47047453f2 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.FunctionBody.html @@ -0,0 +1,26 @@ +FunctionBody in fe_analyzer::context - Rust

Struct FunctionBody

Source
pub struct FunctionBody {
+    pub expressions: IndexMap<NodeId, ExpressionAttributes>,
+    pub matches: IndexMap<NodeId, PatternMatrix>,
+    pub var_types: IndexMap<NodeId, TypeId>,
+    pub calls: IndexMap<NodeId, CallType>,
+    pub spans: HashMap<NodeId, Span>,
+}

Fields§

§expressions: IndexMap<NodeId, ExpressionAttributes>§matches: IndexMap<NodeId, PatternMatrix>§var_types: IndexMap<NodeId, TypeId>§calls: IndexMap<NodeId, CallType>§spans: HashMap<NodeId, Span>

Trait Implementations§

Source§

impl Clone for FunctionBody

Source§

fn clone(&self) -> FunctionBody

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionBody

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionBody

Source§

fn default() -> FunctionBody

Returns the “default value” for a type. Read more
Source§

impl PartialEq for FunctionBody

Source§

fn eq(&self, other: &FunctionBody) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionBody

Source§

impl StructuralPartialEq for FunctionBody

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.Label.html b/compiler-docs/fe_analyzer/context/struct.Label.html new file mode 100644 index 0000000000..0dc1c80e76 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.Label.html @@ -0,0 +1,34 @@ +Label in fe_analyzer::context - Rust

Struct Label

Source
pub struct Label {
+    pub style: LabelStyle,
+    pub span: Span,
+    pub message: String,
+}

Fields§

§style: LabelStyle§span: Span§message: String

Implementations§

Source§

impl Label

Source

pub fn primary<S>(span: Span, message: S) -> Label
where + S: Into<String>,

Create a primary label with the given message. This will underline the +given span with carets (^^^^).

+
Source

pub fn secondary<S>(span: Span, message: S) -> Label
where + S: Into<String>,

Create a secondary label with the given message. This will underline the +given span with hyphens (----).

+
Source

pub fn into_cs_label(self) -> Label<SourceFileId>

Convert into a [codespan_reporting::Diagnostic::Label]

+

Trait Implementations§

Source§

impl Clone for Label

Source§

fn clone(&self) -> Label

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Label

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Hash for Label

Source§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Label

Source§

fn eq(&self, other: &Label) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Label

Source§

impl StructuralPartialEq for Label

Auto Trait Implementations§

§

impl Freeze for Label

§

impl RefUnwindSafe for Label

§

impl Send for Label

§

impl Sync for Label

§

impl Unpin for Label

§

impl UnwindSafe for Label

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/struct.TempContext.html b/compiler-docs/fe_analyzer/context/struct.TempContext.html new file mode 100644 index 0000000000..470d480444 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/struct.TempContext.html @@ -0,0 +1,63 @@ +TempContext in fe_analyzer::context - Rust

Struct TempContext

Source
pub struct TempContext {
+    pub diagnostics: RefCell<Vec<Diagnostic>>,
+}

Fields§

§diagnostics: RefCell<Vec<Diagnostic>>

Trait Implementations§

Source§

impl AnalyzerContext for TempContext

Source§

fn db(&self) -> &dyn AnalyzerDb

Source§

fn resolve_name( + &self, + _name: &str, + _span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source§

fn resolve_path( + &self, + _path: &Path, + _span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors
Source§

fn resolve_visible_path(&self, _path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors
Source§

fn resolve_any_path(&self, _path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors
Source§

fn add_expression(&self, _node: &Node<Expr>, _attributes: ExpressionAttributes)

Attribute contextual information to an expression node. Read more
Source§

fn update_expression( + &self, + _node: &Node<Expr>, + _f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes. Read more
Source§

fn expr_typ(&self, _expr: &Node<Expr>) -> Type

Returns a type of an expression. Read more
Source§

fn add_constant( + &self, + _name: &Node<SmolStr>, + _expr: &Node<Expr>, + _value: Constant, +)

Add evaluated constant value in a constant declaration to the context.
Source§

fn constant_value_by_name( + &self, + _name: &SmolStr, + _span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.
Source§

fn parent(&self) -> Item

Returns an item enclosing current context. Read more
Source§

fn module(&self) -> ModuleId

Returns the module enclosing current context.
Source§

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context. Read more
Source§

fn add_call(&self, _node: &Node<Expr>, _call_type: CallType)

Panics Read more
Source§

fn get_call(&self, _node: &Node<Expr>) -> Option<CallType>

Source§

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.
Source§

fn inherits_type(&self, _typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.
Source§

fn add_diagnostic(&self, diag: Diagnostic)

Source§

fn get_context_type(&self) -> Option<TypeId>

Returns the Context type, if it is defined.
Source§

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source§

fn root_item(&self) -> Item

Returns a non-function item that encloses a context. Read more
Source§

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source§

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source§

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source§

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source§

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source§

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Source§

impl Default for TempContext

Source§

fn default() -> TempContext

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/context/trait.AnalyzerContext.html b/compiler-docs/fe_analyzer/context/trait.AnalyzerContext.html new file mode 100644 index 0000000000..4d8ed43d32 --- /dev/null +++ b/compiler-docs/fe_analyzer/context/trait.AnalyzerContext.html @@ -0,0 +1,178 @@ +AnalyzerContext in fe_analyzer::context - Rust

Trait AnalyzerContext

Source
pub trait AnalyzerContext {
+
Show 27 methods // Required methods + fn resolve_name( + &self, + name: &str, + span: Span, + ) -> Result<Option<NamedThing>, IncompleteItem>; + fn resolve_path( + &self, + path: &Path, + span: Span, + ) -> Result<NamedThing, FatalError>; + fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>; + fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>; + fn add_diagnostic(&self, diag: Diagnostic); + fn db(&self) -> &dyn AnalyzerDb; + fn add_expression( + &self, + node: &Node<Expr>, + attributes: ExpressionAttributes, + ); + fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), + ); + fn expr_typ(&self, expr: &Node<Expr>) -> Type; + fn add_constant( + &self, + name: &Node<SmolStr>, + expr: &Node<Expr>, + value: Constant, + ); + fn constant_value_by_name( + &self, + name: &SmolStr, + span: Span, + ) -> Result<Option<Constant>, IncompleteItem>; + fn parent(&self) -> Item; + fn module(&self) -> ModuleId; + fn parent_function(&self) -> FunctionId; + fn add_call(&self, node: &Node<Expr>, call_type: CallType); + fn get_call(&self, node: &Node<Expr>) -> Option<CallType>; + fn is_in_function(&self) -> bool; + fn inherits_type(&self, typ: BlockScopeType) -> bool; + fn get_context_type(&self) -> Option<TypeId>; + + // Provided methods + fn error( + &self, + message: &str, + label_span: Span, + label: &str, + ) -> DiagnosticVoucher { ... } + fn root_item(&self) -> Item { ... } + fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, + ) -> DiagnosticVoucher { ... } + fn not_yet_implemented( + &self, + feature: &str, + span: Span, + ) -> DiagnosticVoucher { ... } + fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, + ) -> DiagnosticVoucher { ... } + fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, + ) -> DiagnosticVoucher { ... } + fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, + ) -> DiagnosticVoucher { ... } + fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher { ... } +
}

Required Methods§

Source

fn resolve_name( + &self, + name: &str, + span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source

fn resolve_path( + &self, + path: &Path, + span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors

+
Source

fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors

+
Source

fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors

+
Source

fn add_diagnostic(&self, diag: Diagnostic)

Source

fn db(&self) -> &dyn AnalyzerDb

Source

fn add_expression(&self, node: &Node<Expr>, attributes: ExpressionAttributes)

Attribute contextual information to an expression node.

+
§Panics
+

Panics if an entry already exists for the node id.

+
Source

fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes.

+
§Panics
+

Panics if an entry does not already exist for the node id.

+
Source

fn expr_typ(&self, expr: &Node<Expr>) -> Type

Returns a type of an expression.

+
§Panics
+

Panics if type analysis is not performed for an expr.

+
Source

fn add_constant(&self, name: &Node<SmolStr>, expr: &Node<Expr>, value: Constant)

Add evaluated constant value in a constant declaration to the context.

+
Source

fn constant_value_by_name( + &self, + name: &SmolStr, + span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.

+
Source

fn parent(&self) -> Item

Returns an item enclosing current context.

+
§Example
contract Foo:
+    fn foo():
+       if ...:
+           ...
+       else:
+           ...
+

If the context is in then block, then this function returns +Item::Function(..).

+
Source

fn module(&self) -> ModuleId

Returns the module enclosing current context.

+
Source

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context.

+
§Panics
+

Panics if a context is not in a function. Use Self::is_in_function +to determine whether a context is in a function.

+
Source

fn add_call(&self, node: &Node<Expr>, call_type: CallType)

§Panics
+

Panics if a context is not in a function. Use Self::is_in_function +to determine whether a context is in a function.

+
Source

fn get_call(&self, node: &Node<Expr>) -> Option<CallType>

Source

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.

+
Source

fn inherits_type(&self, typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.

+
Source

fn get_context_type(&self) -> Option<TypeId>

Returns the Context type, if it is defined.

+

Provided Methods§

Source

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source

fn root_item(&self) -> Item

Returns a non-function item that encloses a context.

+
§Example
contract Foo:
+    fn foo():
+       if ...:
+           ...
+       else:
+           ...
+

If the context is in then block, then this function returns +Item::Type(TypeDef::Contract(..)).

+
Source

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/index.html b/compiler-docs/fe_analyzer/db/index.html new file mode 100644 index 0000000000..a370ea9a1e --- /dev/null +++ b/compiler-docs/fe_analyzer/db/index.html @@ -0,0 +1 @@ +fe_analyzer::db - Rust

Module db

Source

Structs§

AllImplsQuery
AnalyzerDbGroupStorage__
AnalyzerDbStorage
Representative struct for the query group.
ContractAllFieldsQuery
ContractAllFunctionsQuery
ContractCallFunctionQuery
ContractDependencyGraphQuery
ContractFieldMapQuery
ContractFieldTypeQuery
ContractFunctionMapQuery
ContractInitFunctionQuery
ContractPublicFunctionMapQuery
ContractRuntimeDependencyGraphQuery
EnumAllFunctionsQuery
EnumAllVariantsQuery
EnumDependencyGraphQuery
EnumFunctionMapQuery
EnumVariantKindQuery
EnumVariantMapQuery
FunctionBodyQuery
FunctionDependencyGraphQuery
FunctionSignatureQuery
FunctionSigsQuery
ImplAllFunctionsQuery
ImplForQuery
ImplFunctionMapQuery
IngotExternalIngotsQuery
IngotFilesQuery
IngotModulesQuery
IngotRootModuleQuery
InternAttributeLookupQuery
InternAttributeQuery
InternContractFieldLookupQuery
InternContractFieldQuery
InternContractLookupQuery
InternContractQuery
InternEnumLookupQuery
InternEnumQuery
InternEnumVariantLookupQuery
InternEnumVariantQuery
InternFunctionLookupQuery
InternFunctionQuery
InternFunctionSigLookupQuery
InternFunctionSigQuery
InternImplLookupQuery
InternImplQuery
InternIngotLookupQuery
InternIngotQuery
InternModuleConstLookupQuery
InternModuleConstQuery
InternModuleLookupQuery
InternModuleQuery
InternStructFieldLookupQuery
InternStructFieldQuery
InternStructLookupQuery
InternStructQuery
InternTraitLookupQuery
InternTraitQuery
InternTypeAliasLookupQuery
InternTypeAliasQuery
InternTypeLookupQuery
InternTypeQuery
ModuleAllImplsQuery
ModuleAllItemsQuery
ModuleConstantTypeQuery
ModuleConstantValueQuery
ModuleConstantsQuery
ModuleContractsQuery
ModuleFilePathQuery
ModuleImplMapQuery
ModuleIsIncompleteQuery
ModuleItemMapQuery
ModuleParentModuleQuery
ModuleParseQuery
ModuleStructsQuery
ModuleSubmodulesQuery
ModuleTestsQuery
ModuleUsedItemMapQuery
RootIngotQuery
StructAllFieldsQuery
StructAllFunctionsQuery
StructDependencyGraphQuery
StructFieldMapQuery
StructFieldTypeQuery
StructFunctionMapQuery
TestDb
TraitAllFunctionsQuery
TraitFunctionMapQuery
TraitIsImplementedForQuery
TypeAliasTypeQuery

Traits§

AnalyzerDb
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/sidebar-items.js b/compiler-docs/fe_analyzer/db/sidebar-items.js new file mode 100644 index 0000000000..c0c5935442 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["AllImplsQuery","AnalyzerDbGroupStorage__","AnalyzerDbStorage","ContractAllFieldsQuery","ContractAllFunctionsQuery","ContractCallFunctionQuery","ContractDependencyGraphQuery","ContractFieldMapQuery","ContractFieldTypeQuery","ContractFunctionMapQuery","ContractInitFunctionQuery","ContractPublicFunctionMapQuery","ContractRuntimeDependencyGraphQuery","EnumAllFunctionsQuery","EnumAllVariantsQuery","EnumDependencyGraphQuery","EnumFunctionMapQuery","EnumVariantKindQuery","EnumVariantMapQuery","FunctionBodyQuery","FunctionDependencyGraphQuery","FunctionSignatureQuery","FunctionSigsQuery","ImplAllFunctionsQuery","ImplForQuery","ImplFunctionMapQuery","IngotExternalIngotsQuery","IngotFilesQuery","IngotModulesQuery","IngotRootModuleQuery","InternAttributeLookupQuery","InternAttributeQuery","InternContractFieldLookupQuery","InternContractFieldQuery","InternContractLookupQuery","InternContractQuery","InternEnumLookupQuery","InternEnumQuery","InternEnumVariantLookupQuery","InternEnumVariantQuery","InternFunctionLookupQuery","InternFunctionQuery","InternFunctionSigLookupQuery","InternFunctionSigQuery","InternImplLookupQuery","InternImplQuery","InternIngotLookupQuery","InternIngotQuery","InternModuleConstLookupQuery","InternModuleConstQuery","InternModuleLookupQuery","InternModuleQuery","InternStructFieldLookupQuery","InternStructFieldQuery","InternStructLookupQuery","InternStructQuery","InternTraitLookupQuery","InternTraitQuery","InternTypeAliasLookupQuery","InternTypeAliasQuery","InternTypeLookupQuery","InternTypeQuery","ModuleAllImplsQuery","ModuleAllItemsQuery","ModuleConstantTypeQuery","ModuleConstantValueQuery","ModuleConstantsQuery","ModuleContractsQuery","ModuleFilePathQuery","ModuleImplMapQuery","ModuleIsIncompleteQuery","ModuleItemMapQuery","ModuleParentModuleQuery","ModuleParseQuery","ModuleStructsQuery","ModuleSubmodulesQuery","ModuleTestsQuery","ModuleUsedItemMapQuery","RootIngotQuery","StructAllFieldsQuery","StructAllFunctionsQuery","StructDependencyGraphQuery","StructFieldMapQuery","StructFieldTypeQuery","StructFunctionMapQuery","TestDb","TraitAllFunctionsQuery","TraitFunctionMapQuery","TraitIsImplementedForQuery","TypeAliasTypeQuery"],"trait":["AnalyzerDb"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.AllImplsQuery.html b/compiler-docs/fe_analyzer/db/struct.AllImplsQuery.html new file mode 100644 index 0000000000..c5240bc929 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.AllImplsQuery.html @@ -0,0 +1,46 @@ +AllImplsQuery in fe_analyzer::db - Rust

Struct AllImplsQuery

Source
pub struct AllImplsQuery;

Implementations§

Source§

impl AllImplsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl AllImplsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for AllImplsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for AllImplsQuery

Source§

fn default() -> AllImplsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for AllImplsQuery

Source§

const QUERY_INDEX: u16 = 83u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "all_impls"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ImplId]>

What value does the query return?
Source§

type Storage = DerivedStorage<AllImplsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for AllImplsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for AllImplsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.AnalyzerDbGroupStorage__.html b/compiler-docs/fe_analyzer/db/struct.AnalyzerDbGroupStorage__.html new file mode 100644 index 0000000000..99521e72b5 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.AnalyzerDbGroupStorage__.html @@ -0,0 +1,113 @@ +AnalyzerDbGroupStorage__ in fe_analyzer::db - Rust

Struct AnalyzerDbGroupStorage__

Source
pub struct AnalyzerDbGroupStorage__ {
Show 87 fields + pub intern_ingot: Arc<<InternIngotQuery as Query>::Storage>, + pub lookup_intern_ingot: Arc<<InternIngotLookupQuery as Query>::Storage>, + pub intern_module: Arc<<InternModuleQuery as Query>::Storage>, + pub lookup_intern_module: Arc<<InternModuleLookupQuery as Query>::Storage>, + pub intern_module_const: Arc<<InternModuleConstQuery as Query>::Storage>, + pub lookup_intern_module_const: Arc<<InternModuleConstLookupQuery as Query>::Storage>, + pub intern_struct: Arc<<InternStructQuery as Query>::Storage>, + pub lookup_intern_struct: Arc<<InternStructLookupQuery as Query>::Storage>, + pub intern_struct_field: Arc<<InternStructFieldQuery as Query>::Storage>, + pub lookup_intern_struct_field: Arc<<InternStructFieldLookupQuery as Query>::Storage>, + pub intern_enum: Arc<<InternEnumQuery as Query>::Storage>, + pub lookup_intern_enum: Arc<<InternEnumLookupQuery as Query>::Storage>, + pub intern_attribute: Arc<<InternAttributeQuery as Query>::Storage>, + pub lookup_intern_attribute: Arc<<InternAttributeLookupQuery as Query>::Storage>, + pub intern_enum_variant: Arc<<InternEnumVariantQuery as Query>::Storage>, + pub lookup_intern_enum_variant: Arc<<InternEnumVariantLookupQuery as Query>::Storage>, + pub intern_trait: Arc<<InternTraitQuery as Query>::Storage>, + pub lookup_intern_trait: Arc<<InternTraitLookupQuery as Query>::Storage>, + pub intern_impl: Arc<<InternImplQuery as Query>::Storage>, + pub lookup_intern_impl: Arc<<InternImplLookupQuery as Query>::Storage>, + pub intern_type_alias: Arc<<InternTypeAliasQuery as Query>::Storage>, + pub lookup_intern_type_alias: Arc<<InternTypeAliasLookupQuery as Query>::Storage>, + pub intern_contract: Arc<<InternContractQuery as Query>::Storage>, + pub lookup_intern_contract: Arc<<InternContractLookupQuery as Query>::Storage>, + pub intern_contract_field: Arc<<InternContractFieldQuery as Query>::Storage>, + pub lookup_intern_contract_field: Arc<<InternContractFieldLookupQuery as Query>::Storage>, + pub intern_function_sig: Arc<<InternFunctionSigQuery as Query>::Storage>, + pub lookup_intern_function_sig: Arc<<InternFunctionSigLookupQuery as Query>::Storage>, + pub intern_function: Arc<<InternFunctionQuery as Query>::Storage>, + pub lookup_intern_function: Arc<<InternFunctionLookupQuery as Query>::Storage>, + pub intern_type: Arc<<InternTypeQuery as Query>::Storage>, + pub lookup_intern_type: Arc<<InternTypeLookupQuery as Query>::Storage>, + pub ingot_files: Arc<<IngotFilesQuery as Query>::Storage>, + pub ingot_external_ingots: Arc<<IngotExternalIngotsQuery as Query>::Storage>, + pub root_ingot: Arc<<RootIngotQuery as Query>::Storage>, + pub ingot_modules: Arc<<IngotModulesQuery as Query>::Storage>, + pub ingot_root_module: Arc<<IngotRootModuleQuery as Query>::Storage>, + pub module_file_path: Arc<<ModuleFilePathQuery as Query>::Storage>, + pub module_parse: Arc<<ModuleParseQuery as Query>::Storage>, + pub module_is_incomplete: Arc<<ModuleIsIncompleteQuery as Query>::Storage>, + pub module_all_items: Arc<<ModuleAllItemsQuery as Query>::Storage>, + pub module_all_impls: Arc<<ModuleAllImplsQuery as Query>::Storage>, + pub module_item_map: Arc<<ModuleItemMapQuery as Query>::Storage>, + pub module_impl_map: Arc<<ModuleImplMapQuery as Query>::Storage>, + pub module_contracts: Arc<<ModuleContractsQuery as Query>::Storage>, + pub module_structs: Arc<<ModuleStructsQuery as Query>::Storage>, + pub module_constants: Arc<<ModuleConstantsQuery as Query>::Storage>, + pub module_used_item_map: Arc<<ModuleUsedItemMapQuery as Query>::Storage>, + pub module_parent_module: Arc<<ModuleParentModuleQuery as Query>::Storage>, + pub module_submodules: Arc<<ModuleSubmodulesQuery as Query>::Storage>, + pub module_tests: Arc<<ModuleTestsQuery as Query>::Storage>, + pub module_constant_type: Arc<<ModuleConstantTypeQuery as Query>::Storage>, + pub module_constant_value: Arc<<ModuleConstantValueQuery as Query>::Storage>, + pub contract_all_functions: Arc<<ContractAllFunctionsQuery as Query>::Storage>, + pub contract_function_map: Arc<<ContractFunctionMapQuery as Query>::Storage>, + pub contract_public_function_map: Arc<<ContractPublicFunctionMapQuery as Query>::Storage>, + pub contract_init_function: Arc<<ContractInitFunctionQuery as Query>::Storage>, + pub contract_call_function: Arc<<ContractCallFunctionQuery as Query>::Storage>, + pub contract_all_fields: Arc<<ContractAllFieldsQuery as Query>::Storage>, + pub contract_field_map: Arc<<ContractFieldMapQuery as Query>::Storage>, + pub contract_field_type: Arc<<ContractFieldTypeQuery as Query>::Storage>, + pub contract_dependency_graph: Arc<<ContractDependencyGraphQuery as Query>::Storage>, + pub contract_runtime_dependency_graph: Arc<<ContractRuntimeDependencyGraphQuery as Query>::Storage>, + pub function_signature: Arc<<FunctionSignatureQuery as Query>::Storage>, + pub function_body: Arc<<FunctionBodyQuery as Query>::Storage>, + pub function_dependency_graph: Arc<<FunctionDependencyGraphQuery as Query>::Storage>, + pub struct_all_fields: Arc<<StructAllFieldsQuery as Query>::Storage>, + pub struct_field_map: Arc<<StructFieldMapQuery as Query>::Storage>, + pub struct_field_type: Arc<<StructFieldTypeQuery as Query>::Storage>, + pub struct_all_functions: Arc<<StructAllFunctionsQuery as Query>::Storage>, + pub struct_function_map: Arc<<StructFunctionMapQuery as Query>::Storage>, + pub struct_dependency_graph: Arc<<StructDependencyGraphQuery as Query>::Storage>, + pub enum_all_variants: Arc<<EnumAllVariantsQuery as Query>::Storage>, + pub enum_variant_map: Arc<<EnumVariantMapQuery as Query>::Storage>, + pub enum_all_functions: Arc<<EnumAllFunctionsQuery as Query>::Storage>, + pub enum_function_map: Arc<<EnumFunctionMapQuery as Query>::Storage>, + pub enum_dependency_graph: Arc<<EnumDependencyGraphQuery as Query>::Storage>, + pub enum_variant_kind: Arc<<EnumVariantKindQuery as Query>::Storage>, + pub trait_all_functions: Arc<<TraitAllFunctionsQuery as Query>::Storage>, + pub trait_function_map: Arc<<TraitFunctionMapQuery as Query>::Storage>, + pub trait_is_implemented_for: Arc<<TraitIsImplementedForQuery as Query>::Storage>, + pub impl_all_functions: Arc<<ImplAllFunctionsQuery as Query>::Storage>, + pub impl_function_map: Arc<<ImplFunctionMapQuery as Query>::Storage>, + pub all_impls: Arc<<AllImplsQuery as Query>::Storage>, + pub impl_for: Arc<<ImplForQuery as Query>::Storage>, + pub function_sigs: Arc<<FunctionSigsQuery as Query>::Storage>, + pub type_alias_type: Arc<<TypeAliasTypeQuery as Query>::Storage>, +
}

Fields§

§intern_ingot: Arc<<InternIngotQuery as Query>::Storage>§lookup_intern_ingot: Arc<<InternIngotLookupQuery as Query>::Storage>§intern_module: Arc<<InternModuleQuery as Query>::Storage>§lookup_intern_module: Arc<<InternModuleLookupQuery as Query>::Storage>§intern_module_const: Arc<<InternModuleConstQuery as Query>::Storage>§lookup_intern_module_const: Arc<<InternModuleConstLookupQuery as Query>::Storage>§intern_struct: Arc<<InternStructQuery as Query>::Storage>§lookup_intern_struct: Arc<<InternStructLookupQuery as Query>::Storage>§intern_struct_field: Arc<<InternStructFieldQuery as Query>::Storage>§lookup_intern_struct_field: Arc<<InternStructFieldLookupQuery as Query>::Storage>§intern_enum: Arc<<InternEnumQuery as Query>::Storage>§lookup_intern_enum: Arc<<InternEnumLookupQuery as Query>::Storage>§intern_attribute: Arc<<InternAttributeQuery as Query>::Storage>§lookup_intern_attribute: Arc<<InternAttributeLookupQuery as Query>::Storage>§intern_enum_variant: Arc<<InternEnumVariantQuery as Query>::Storage>§lookup_intern_enum_variant: Arc<<InternEnumVariantLookupQuery as Query>::Storage>§intern_trait: Arc<<InternTraitQuery as Query>::Storage>§lookup_intern_trait: Arc<<InternTraitLookupQuery as Query>::Storage>§intern_impl: Arc<<InternImplQuery as Query>::Storage>§lookup_intern_impl: Arc<<InternImplLookupQuery as Query>::Storage>§intern_type_alias: Arc<<InternTypeAliasQuery as Query>::Storage>§lookup_intern_type_alias: Arc<<InternTypeAliasLookupQuery as Query>::Storage>§intern_contract: Arc<<InternContractQuery as Query>::Storage>§lookup_intern_contract: Arc<<InternContractLookupQuery as Query>::Storage>§intern_contract_field: Arc<<InternContractFieldQuery as Query>::Storage>§lookup_intern_contract_field: Arc<<InternContractFieldLookupQuery as Query>::Storage>§intern_function_sig: Arc<<InternFunctionSigQuery as Query>::Storage>§lookup_intern_function_sig: Arc<<InternFunctionSigLookupQuery as Query>::Storage>§intern_function: Arc<<InternFunctionQuery as Query>::Storage>§lookup_intern_function: Arc<<InternFunctionLookupQuery as Query>::Storage>§intern_type: Arc<<InternTypeQuery as Query>::Storage>§lookup_intern_type: Arc<<InternTypeLookupQuery as Query>::Storage>§ingot_files: Arc<<IngotFilesQuery as Query>::Storage>§ingot_external_ingots: Arc<<IngotExternalIngotsQuery as Query>::Storage>§root_ingot: Arc<<RootIngotQuery as Query>::Storage>§ingot_modules: Arc<<IngotModulesQuery as Query>::Storage>§ingot_root_module: Arc<<IngotRootModuleQuery as Query>::Storage>§module_file_path: Arc<<ModuleFilePathQuery as Query>::Storage>§module_parse: Arc<<ModuleParseQuery as Query>::Storage>§module_is_incomplete: Arc<<ModuleIsIncompleteQuery as Query>::Storage>§module_all_items: Arc<<ModuleAllItemsQuery as Query>::Storage>§module_all_impls: Arc<<ModuleAllImplsQuery as Query>::Storage>§module_item_map: Arc<<ModuleItemMapQuery as Query>::Storage>§module_impl_map: Arc<<ModuleImplMapQuery as Query>::Storage>§module_contracts: Arc<<ModuleContractsQuery as Query>::Storage>§module_structs: Arc<<ModuleStructsQuery as Query>::Storage>§module_constants: Arc<<ModuleConstantsQuery as Query>::Storage>§module_used_item_map: Arc<<ModuleUsedItemMapQuery as Query>::Storage>§module_parent_module: Arc<<ModuleParentModuleQuery as Query>::Storage>§module_submodules: Arc<<ModuleSubmodulesQuery as Query>::Storage>§module_tests: Arc<<ModuleTestsQuery as Query>::Storage>§module_constant_type: Arc<<ModuleConstantTypeQuery as Query>::Storage>§module_constant_value: Arc<<ModuleConstantValueQuery as Query>::Storage>§contract_all_functions: Arc<<ContractAllFunctionsQuery as Query>::Storage>§contract_function_map: Arc<<ContractFunctionMapQuery as Query>::Storage>§contract_public_function_map: Arc<<ContractPublicFunctionMapQuery as Query>::Storage>§contract_init_function: Arc<<ContractInitFunctionQuery as Query>::Storage>§contract_call_function: Arc<<ContractCallFunctionQuery as Query>::Storage>§contract_all_fields: Arc<<ContractAllFieldsQuery as Query>::Storage>§contract_field_map: Arc<<ContractFieldMapQuery as Query>::Storage>§contract_field_type: Arc<<ContractFieldTypeQuery as Query>::Storage>§contract_dependency_graph: Arc<<ContractDependencyGraphQuery as Query>::Storage>§contract_runtime_dependency_graph: Arc<<ContractRuntimeDependencyGraphQuery as Query>::Storage>§function_signature: Arc<<FunctionSignatureQuery as Query>::Storage>§function_body: Arc<<FunctionBodyQuery as Query>::Storage>§function_dependency_graph: Arc<<FunctionDependencyGraphQuery as Query>::Storage>§struct_all_fields: Arc<<StructAllFieldsQuery as Query>::Storage>§struct_field_map: Arc<<StructFieldMapQuery as Query>::Storage>§struct_field_type: Arc<<StructFieldTypeQuery as Query>::Storage>§struct_all_functions: Arc<<StructAllFunctionsQuery as Query>::Storage>§struct_function_map: Arc<<StructFunctionMapQuery as Query>::Storage>§struct_dependency_graph: Arc<<StructDependencyGraphQuery as Query>::Storage>§enum_all_variants: Arc<<EnumAllVariantsQuery as Query>::Storage>§enum_variant_map: Arc<<EnumVariantMapQuery as Query>::Storage>§enum_all_functions: Arc<<EnumAllFunctionsQuery as Query>::Storage>§enum_function_map: Arc<<EnumFunctionMapQuery as Query>::Storage>§enum_dependency_graph: Arc<<EnumDependencyGraphQuery as Query>::Storage>§enum_variant_kind: Arc<<EnumVariantKindQuery as Query>::Storage>§trait_all_functions: Arc<<TraitAllFunctionsQuery as Query>::Storage>§trait_function_map: Arc<<TraitFunctionMapQuery as Query>::Storage>§trait_is_implemented_for: Arc<<TraitIsImplementedForQuery as Query>::Storage>§impl_all_functions: Arc<<ImplAllFunctionsQuery as Query>::Storage>§impl_function_map: Arc<<ImplFunctionMapQuery as Query>::Storage>§all_impls: Arc<<AllImplsQuery as Query>::Storage>§impl_for: Arc<<ImplForQuery as Query>::Storage>§function_sigs: Arc<<FunctionSigsQuery as Query>::Storage>§type_alias_type: Arc<<TypeAliasTypeQuery as Query>::Storage>

Implementations§

Source§

impl AnalyzerDbGroupStorage__

Source

pub fn new(group_index: u16) -> Self

Source§

impl AnalyzerDbGroupStorage__

Source

pub fn fmt_index( + &self, + db: &(dyn AnalyzerDb + '_), + input: DatabaseKeyIndex, + fmt: &mut Formatter<'_>, +) -> Result

Source

pub fn maybe_changed_since( + &self, + db: &(dyn AnalyzerDb + '_), + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

Source

pub fn for_each_query( + &self, + _runtime: &Runtime, + op: &mut dyn FnMut(&dyn QueryStorageMassOps), +)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.AnalyzerDbStorage.html b/compiler-docs/fe_analyzer/db/struct.AnalyzerDbStorage.html new file mode 100644 index 0000000000..3f8e33df65 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.AnalyzerDbStorage.html @@ -0,0 +1,12 @@ +AnalyzerDbStorage in fe_analyzer::db - Rust

Struct AnalyzerDbStorage

Source
pub struct AnalyzerDbStorage {}
Expand description

Representative struct for the query group.

+

Trait Implementations§

Source§

impl HasQueryGroup<AnalyzerDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<AnalyzerDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl QueryGroup for AnalyzerDbStorage

Source§

type DynDb = dyn AnalyzerDb

Dyn version of the associated database trait.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractAllFieldsQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractAllFieldsQuery.html new file mode 100644 index 0000000000..5d8ac81e8a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractAllFieldsQuery.html @@ -0,0 +1,46 @@ +ContractAllFieldsQuery in fe_analyzer::db - Rust

Struct ContractAllFieldsQuery

Source
pub struct ContractAllFieldsQuery;

Implementations§

Source§

impl ContractAllFieldsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractAllFieldsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractAllFieldsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractAllFieldsQuery

Source§

fn default() -> ContractAllFieldsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractAllFieldsQuery

Source§

const QUERY_INDEX: u16 = 58u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_all_fields"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ContractFieldId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractAllFieldsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractAllFieldsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractAllFieldsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractAllFunctionsQuery.html new file mode 100644 index 0000000000..188f5ec338 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractAllFunctionsQuery.html @@ -0,0 +1,46 @@ +ContractAllFunctionsQuery in fe_analyzer::db - Rust

Struct ContractAllFunctionsQuery

Source
pub struct ContractAllFunctionsQuery;

Implementations§

Source§

impl ContractAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractAllFunctionsQuery

Source§

fn default() -> ContractAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 53u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractCallFunctionQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractCallFunctionQuery.html new file mode 100644 index 0000000000..0180d87564 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractCallFunctionQuery.html @@ -0,0 +1,46 @@ +ContractCallFunctionQuery in fe_analyzer::db - Rust

Struct ContractCallFunctionQuery

Source
pub struct ContractCallFunctionQuery;

Implementations§

Source§

impl ContractCallFunctionQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractCallFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractCallFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractCallFunctionQuery

Source§

fn default() -> ContractCallFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractCallFunctionQuery

Source§

const QUERY_INDEX: u16 = 57u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_call_function"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Option<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractCallFunctionQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractCallFunctionQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractCallFunctionQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractDependencyGraphQuery.html new file mode 100644 index 0000000000..4a9b9a2d9f --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractDependencyGraphQuery.html @@ -0,0 +1,46 @@ +ContractDependencyGraphQuery in fe_analyzer::db - Rust

Struct ContractDependencyGraphQuery

Source
pub struct ContractDependencyGraphQuery;

Implementations§

Source§

impl ContractDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractDependencyGraphQuery

Source§

fn default() -> ContractDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 61u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = DepGraphWrapper

What value does the query return?
Source§

type Storage = DerivedStorage<ContractDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractFieldMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractFieldMapQuery.html new file mode 100644 index 0000000000..c898195876 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractFieldMapQuery.html @@ -0,0 +1,46 @@ +ContractFieldMapQuery in fe_analyzer::db - Rust

Struct ContractFieldMapQuery

Source
pub struct ContractFieldMapQuery;

Implementations§

Source§

impl ContractFieldMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractFieldMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractFieldMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractFieldMapQuery

Source§

fn default() -> ContractFieldMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractFieldMapQuery

Source§

const QUERY_INDEX: u16 = 59u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_field_map"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractFieldMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractFieldMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractFieldMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractFieldTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractFieldTypeQuery.html new file mode 100644 index 0000000000..24bc236413 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractFieldTypeQuery.html @@ -0,0 +1,46 @@ +ContractFieldTypeQuery in fe_analyzer::db - Rust

Struct ContractFieldTypeQuery

Source
pub struct ContractFieldTypeQuery;

Implementations§

Source§

impl ContractFieldTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractFieldTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractFieldTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractFieldTypeQuery

Source§

fn default() -> ContractFieldTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractFieldTypeQuery

Source§

const QUERY_INDEX: u16 = 60u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_field_type"

Name of the query method (e.g., foo)
Source§

type Key = ContractFieldId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<TypeId, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractFieldTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractFieldTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractFieldTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractFunctionMapQuery.html new file mode 100644 index 0000000000..8441e64474 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractFunctionMapQuery.html @@ -0,0 +1,46 @@ +ContractFunctionMapQuery in fe_analyzer::db - Rust

Struct ContractFunctionMapQuery

Source
pub struct ContractFunctionMapQuery;

Implementations§

Source§

impl ContractFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractFunctionMapQuery

Source§

fn default() -> ContractFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 54u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_function_map"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractInitFunctionQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractInitFunctionQuery.html new file mode 100644 index 0000000000..4f27665b25 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractInitFunctionQuery.html @@ -0,0 +1,46 @@ +ContractInitFunctionQuery in fe_analyzer::db - Rust

Struct ContractInitFunctionQuery

Source
pub struct ContractInitFunctionQuery;

Implementations§

Source§

impl ContractInitFunctionQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractInitFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractInitFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractInitFunctionQuery

Source§

fn default() -> ContractInitFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractInitFunctionQuery

Source§

const QUERY_INDEX: u16 = 56u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_init_function"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Option<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractInitFunctionQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractInitFunctionQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractInitFunctionQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractPublicFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractPublicFunctionMapQuery.html new file mode 100644 index 0000000000..5b8e12fa9a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractPublicFunctionMapQuery.html @@ -0,0 +1,46 @@ +ContractPublicFunctionMapQuery in fe_analyzer::db - Rust

Struct ContractPublicFunctionMapQuery

Source
pub struct ContractPublicFunctionMapQuery;

Implementations§

Source§

impl ContractPublicFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractPublicFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractPublicFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractPublicFunctionMapQuery

Source§

fn default() -> ContractPublicFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractPublicFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 55u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_public_function_map"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<IndexMap<SmolStr, FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<ContractPublicFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractPublicFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractPublicFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ContractRuntimeDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.ContractRuntimeDependencyGraphQuery.html new file mode 100644 index 0000000000..4cfc3d6d2a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ContractRuntimeDependencyGraphQuery.html @@ -0,0 +1,46 @@ +ContractRuntimeDependencyGraphQuery in fe_analyzer::db - Rust

Struct ContractRuntimeDependencyGraphQuery

Source
pub struct ContractRuntimeDependencyGraphQuery;

Implementations§

Source§

impl ContractRuntimeDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ContractRuntimeDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ContractRuntimeDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ContractRuntimeDependencyGraphQuery

Source§

fn default() -> ContractRuntimeDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ContractRuntimeDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 62u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "contract_runtime_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = DepGraphWrapper

What value does the query return?
Source§

type Storage = DerivedStorage<ContractRuntimeDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ContractRuntimeDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ContractRuntimeDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumAllFunctionsQuery.html new file mode 100644 index 0000000000..308ea807ab --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumAllFunctionsQuery.html @@ -0,0 +1,46 @@ +EnumAllFunctionsQuery in fe_analyzer::db - Rust

Struct EnumAllFunctionsQuery

Source
pub struct EnumAllFunctionsQuery;

Implementations§

Source§

impl EnumAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumAllFunctionsQuery

Source§

fn default() -> EnumAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 74u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionId]>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumAllVariantsQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumAllVariantsQuery.html new file mode 100644 index 0000000000..d68a2e2a34 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumAllVariantsQuery.html @@ -0,0 +1,46 @@ +EnumAllVariantsQuery in fe_analyzer::db - Rust

Struct EnumAllVariantsQuery

Source
pub struct EnumAllVariantsQuery;

Implementations§

Source§

impl EnumAllVariantsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumAllVariantsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumAllVariantsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumAllVariantsQuery

Source§

fn default() -> EnumAllVariantsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumAllVariantsQuery

Source§

const QUERY_INDEX: u16 = 72u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_all_variants"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[EnumVariantId]>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumAllVariantsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumAllVariantsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumAllVariantsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumDependencyGraphQuery.html new file mode 100644 index 0000000000..3b374d9f7a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumDependencyGraphQuery.html @@ -0,0 +1,46 @@ +EnumDependencyGraphQuery in fe_analyzer::db - Rust

Struct EnumDependencyGraphQuery

Source
pub struct EnumDependencyGraphQuery;

Implementations§

Source§

impl EnumDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumDependencyGraphQuery

Source§

fn default() -> EnumDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 76u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<DepGraphWrapper>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumFunctionMapQuery.html new file mode 100644 index 0000000000..61fd562c64 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumFunctionMapQuery.html @@ -0,0 +1,46 @@ +EnumFunctionMapQuery in fe_analyzer::db - Rust

Struct EnumFunctionMapQuery

Source
pub struct EnumFunctionMapQuery;

Implementations§

Source§

impl EnumFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumFunctionMapQuery

Source§

fn default() -> EnumFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 75u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_function_map"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumVariantKindQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumVariantKindQuery.html new file mode 100644 index 0000000000..7faec237a5 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumVariantKindQuery.html @@ -0,0 +1,46 @@ +EnumVariantKindQuery in fe_analyzer::db - Rust

Struct EnumVariantKindQuery

Source
pub struct EnumVariantKindQuery;

Implementations§

Source§

impl EnumVariantKindQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumVariantKindQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumVariantKindQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumVariantKindQuery

Source§

fn default() -> EnumVariantKindQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumVariantKindQuery

Source§

const QUERY_INDEX: u16 = 77u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_variant_kind"

Name of the query method (e.g., foo)
Source§

type Key = EnumVariantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<EnumVariantKind, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumVariantKindQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumVariantKindQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumVariantKindQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.EnumVariantMapQuery.html b/compiler-docs/fe_analyzer/db/struct.EnumVariantMapQuery.html new file mode 100644 index 0000000000..6a4a1141f2 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.EnumVariantMapQuery.html @@ -0,0 +1,46 @@ +EnumVariantMapQuery in fe_analyzer::db - Rust

Struct EnumVariantMapQuery

Source
pub struct EnumVariantMapQuery;

Implementations§

Source§

impl EnumVariantMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl EnumVariantMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for EnumVariantMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumVariantMapQuery

Source§

fn default() -> EnumVariantMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for EnumVariantMapQuery

Source§

const QUERY_INDEX: u16 = 73u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "enum_variant_map"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<EnumVariantMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for EnumVariantMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for EnumVariantMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.FunctionBodyQuery.html b/compiler-docs/fe_analyzer/db/struct.FunctionBodyQuery.html new file mode 100644 index 0000000000..297833ea1d --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.FunctionBodyQuery.html @@ -0,0 +1,46 @@ +FunctionBodyQuery in fe_analyzer::db - Rust

Struct FunctionBodyQuery

Source
pub struct FunctionBodyQuery;

Implementations§

Source§

impl FunctionBodyQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FunctionBodyQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FunctionBodyQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionBodyQuery

Source§

fn default() -> FunctionBodyQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FunctionBodyQuery

Source§

const QUERY_INDEX: u16 = 64u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "function_body"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<FunctionBody>>

What value does the query return?
Source§

type Storage = DerivedStorage<FunctionBodyQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FunctionBodyQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FunctionBodyQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.FunctionDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.FunctionDependencyGraphQuery.html new file mode 100644 index 0000000000..214ec25ca8 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.FunctionDependencyGraphQuery.html @@ -0,0 +1,46 @@ +FunctionDependencyGraphQuery in fe_analyzer::db - Rust

Struct FunctionDependencyGraphQuery

Source
pub struct FunctionDependencyGraphQuery;

Implementations§

Source§

impl FunctionDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FunctionDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FunctionDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionDependencyGraphQuery

Source§

fn default() -> FunctionDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FunctionDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 65u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "function_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = DepGraphWrapper

What value does the query return?
Source§

type Storage = DerivedStorage<FunctionDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FunctionDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FunctionDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.FunctionSignatureQuery.html b/compiler-docs/fe_analyzer/db/struct.FunctionSignatureQuery.html new file mode 100644 index 0000000000..7db836b28c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.FunctionSignatureQuery.html @@ -0,0 +1,46 @@ +FunctionSignatureQuery in fe_analyzer::db - Rust

Struct FunctionSignatureQuery

Source
pub struct FunctionSignatureQuery;

Implementations§

Source§

impl FunctionSignatureQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FunctionSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FunctionSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionSignatureQuery

Source§

fn default() -> FunctionSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FunctionSignatureQuery

Source§

const QUERY_INDEX: u16 = 63u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "function_signature"

Name of the query method (e.g., foo)
Source§

type Key = FunctionSigId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<FunctionSignature>>

What value does the query return?
Source§

type Storage = DerivedStorage<FunctionSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FunctionSignatureQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FunctionSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.FunctionSigsQuery.html b/compiler-docs/fe_analyzer/db/struct.FunctionSigsQuery.html new file mode 100644 index 0000000000..afa29d4743 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.FunctionSigsQuery.html @@ -0,0 +1,46 @@ +FunctionSigsQuery in fe_analyzer::db - Rust

Struct FunctionSigsQuery

Source
pub struct FunctionSigsQuery;

Implementations§

Source§

impl FunctionSigsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FunctionSigsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FunctionSigsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FunctionSigsQuery

Source§

fn default() -> FunctionSigsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FunctionSigsQuery

Source§

const QUERY_INDEX: u16 = 85u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "function_sigs"

Name of the query method (e.g., foo)
Source§

type Key = (TypeId, SmolStr)

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionSigId]>

What value does the query return?
Source§

type Storage = DerivedStorage<FunctionSigsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FunctionSigsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FunctionSigsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + (key0, key1): <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ImplAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.ImplAllFunctionsQuery.html new file mode 100644 index 0000000000..d2601f0d0c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ImplAllFunctionsQuery.html @@ -0,0 +1,46 @@ +ImplAllFunctionsQuery in fe_analyzer::db - Rust

Struct ImplAllFunctionsQuery

Source
pub struct ImplAllFunctionsQuery;

Implementations§

Source§

impl ImplAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ImplAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ImplAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ImplAllFunctionsQuery

Source§

fn default() -> ImplAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ImplAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 81u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "impl_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = ImplId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ImplAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ImplAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ImplAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ImplForQuery.html b/compiler-docs/fe_analyzer/db/struct.ImplForQuery.html new file mode 100644 index 0000000000..4ac94dbf33 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ImplForQuery.html @@ -0,0 +1,46 @@ +ImplForQuery in fe_analyzer::db - Rust

Struct ImplForQuery

Source
pub struct ImplForQuery;

Implementations§

Source§

impl ImplForQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ImplForQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ImplForQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ImplForQuery

Source§

fn default() -> ImplForQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ImplForQuery

Source§

const QUERY_INDEX: u16 = 84u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "impl_for"

Name of the query method (e.g., foo)
Source§

type Key = (TypeId, TraitId)

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Option<ImplId>

What value does the query return?
Source§

type Storage = DerivedStorage<ImplForQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ImplForQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ImplForQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + (key0, key1): <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ImplFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ImplFunctionMapQuery.html new file mode 100644 index 0000000000..186619a7c8 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ImplFunctionMapQuery.html @@ -0,0 +1,46 @@ +ImplFunctionMapQuery in fe_analyzer::db - Rust

Struct ImplFunctionMapQuery

Source
pub struct ImplFunctionMapQuery;

Implementations§

Source§

impl ImplFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ImplFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ImplFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ImplFunctionMapQuery

Source§

fn default() -> ImplFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ImplFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 82u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "impl_function_map"

Name of the query method (e.g., foo)
Source§

type Key = ImplId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ImplFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ImplFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ImplFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.IngotExternalIngotsQuery.html b/compiler-docs/fe_analyzer/db/struct.IngotExternalIngotsQuery.html new file mode 100644 index 0000000000..41d55d1ff9 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.IngotExternalIngotsQuery.html @@ -0,0 +1,39 @@ +IngotExternalIngotsQuery in fe_analyzer::db - Rust

Struct IngotExternalIngotsQuery

Source
pub struct IngotExternalIngotsQuery;

Implementations§

Source§

impl IngotExternalIngotsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl IngotExternalIngotsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for IngotExternalIngotsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for IngotExternalIngotsQuery

Source§

fn default() -> IngotExternalIngotsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for IngotExternalIngotsQuery

Source§

const QUERY_INDEX: u16 = 33u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "ingot_external_ingots"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<IndexMap<SmolStr, IngotId>>

What value does the query return?
Source§

type Storage = InputStorage<IngotExternalIngotsQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for IngotExternalIngotsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.IngotFilesQuery.html b/compiler-docs/fe_analyzer/db/struct.IngotFilesQuery.html new file mode 100644 index 0000000000..d787d7bb7e --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.IngotFilesQuery.html @@ -0,0 +1,39 @@ +IngotFilesQuery in fe_analyzer::db - Rust

Struct IngotFilesQuery

Source
pub struct IngotFilesQuery;

Implementations§

Source§

impl IngotFilesQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl IngotFilesQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for IngotFilesQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for IngotFilesQuery

Source§

fn default() -> IngotFilesQuery

Returns the “default value” for a type. Read more
Source§

impl Query for IngotFilesQuery

Source§

const QUERY_INDEX: u16 = 32u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "ingot_files"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[SourceFileId]>

What value does the query return?
Source§

type Storage = InputStorage<IngotFilesQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for IngotFilesQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.IngotModulesQuery.html b/compiler-docs/fe_analyzer/db/struct.IngotModulesQuery.html new file mode 100644 index 0000000000..cb8d5de3b9 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.IngotModulesQuery.html @@ -0,0 +1,46 @@ +IngotModulesQuery in fe_analyzer::db - Rust

Struct IngotModulesQuery

Source
pub struct IngotModulesQuery;

Implementations§

Source§

impl IngotModulesQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl IngotModulesQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for IngotModulesQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for IngotModulesQuery

Source§

fn default() -> IngotModulesQuery

Returns the “default value” for a type. Read more
Source§

impl Query for IngotModulesQuery

Source§

const QUERY_INDEX: u16 = 35u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "ingot_modules"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ModuleId]>

What value does the query return?
Source§

type Storage = DerivedStorage<IngotModulesQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for IngotModulesQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for IngotModulesQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.IngotRootModuleQuery.html b/compiler-docs/fe_analyzer/db/struct.IngotRootModuleQuery.html new file mode 100644 index 0000000000..76f06f8d13 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.IngotRootModuleQuery.html @@ -0,0 +1,46 @@ +IngotRootModuleQuery in fe_analyzer::db - Rust

Struct IngotRootModuleQuery

Source
pub struct IngotRootModuleQuery;

Implementations§

Source§

impl IngotRootModuleQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl IngotRootModuleQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for IngotRootModuleQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for IngotRootModuleQuery

Source§

fn default() -> IngotRootModuleQuery

Returns the “default value” for a type. Read more
Source§

impl Query for IngotRootModuleQuery

Source§

const QUERY_INDEX: u16 = 36u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "ingot_root_module"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Option<ModuleId>

What value does the query return?
Source§

type Storage = DerivedStorage<IngotRootModuleQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for IngotRootModuleQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for IngotRootModuleQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternAttributeLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternAttributeLookupQuery.html new file mode 100644 index 0000000000..672572971b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternAttributeLookupQuery.html @@ -0,0 +1,39 @@ +InternAttributeLookupQuery in fe_analyzer::db - Rust

Struct InternAttributeLookupQuery

Source
pub struct InternAttributeLookupQuery;

Implementations§

Source§

impl InternAttributeLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternAttributeLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternAttributeLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternAttributeLookupQuery

Source§

fn default() -> InternAttributeLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternAttributeLookupQuery

Source§

const QUERY_INDEX: u16 = 13u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_attribute"

Name of the query method (e.g., foo)
Source§

type Key = AttributeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Attribute>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternAttributeLookupQuery, InternAttributeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternAttributeLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternAttributeQuery.html b/compiler-docs/fe_analyzer/db/struct.InternAttributeQuery.html new file mode 100644 index 0000000000..fcdddcb21a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternAttributeQuery.html @@ -0,0 +1,39 @@ +InternAttributeQuery in fe_analyzer::db - Rust

Struct InternAttributeQuery

Source
pub struct InternAttributeQuery;

Implementations§

Source§

impl InternAttributeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternAttributeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternAttributeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternAttributeQuery

Source§

fn default() -> InternAttributeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternAttributeQuery

Source§

const QUERY_INDEX: u16 = 12u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_attribute"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Attribute>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AttributeId

What value does the query return?
Source§

type Storage = InternedStorage<InternAttributeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternAttributeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternContractFieldLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternContractFieldLookupQuery.html new file mode 100644 index 0000000000..cac88e41b3 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternContractFieldLookupQuery.html @@ -0,0 +1,39 @@ +InternContractFieldLookupQuery in fe_analyzer::db - Rust

Struct InternContractFieldLookupQuery

Source
pub struct InternContractFieldLookupQuery;

Implementations§

Source§

impl InternContractFieldLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternContractFieldLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternContractFieldLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternContractFieldLookupQuery

Source§

fn default() -> InternContractFieldLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternContractFieldLookupQuery

Source§

const QUERY_INDEX: u16 = 25u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_contract_field"

Name of the query method (e.g., foo)
Source§

type Key = ContractFieldId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<ContractField>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternContractFieldLookupQuery, InternContractFieldQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternContractFieldLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternContractFieldQuery.html b/compiler-docs/fe_analyzer/db/struct.InternContractFieldQuery.html new file mode 100644 index 0000000000..5a6784b97b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternContractFieldQuery.html @@ -0,0 +1,39 @@ +InternContractFieldQuery in fe_analyzer::db - Rust

Struct InternContractFieldQuery

Source
pub struct InternContractFieldQuery;

Implementations§

Source§

impl InternContractFieldQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternContractFieldQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternContractFieldQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternContractFieldQuery

Source§

fn default() -> InternContractFieldQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternContractFieldQuery

Source§

const QUERY_INDEX: u16 = 24u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_contract_field"

Name of the query method (e.g., foo)
Source§

type Key = Rc<ContractField>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ContractFieldId

What value does the query return?
Source§

type Storage = InternedStorage<InternContractFieldQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternContractFieldQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternContractLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternContractLookupQuery.html new file mode 100644 index 0000000000..2c75382b76 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternContractLookupQuery.html @@ -0,0 +1,39 @@ +InternContractLookupQuery in fe_analyzer::db - Rust

Struct InternContractLookupQuery

Source
pub struct InternContractLookupQuery;

Implementations§

Source§

impl InternContractLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternContractLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternContractLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternContractLookupQuery

Source§

fn default() -> InternContractLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternContractLookupQuery

Source§

const QUERY_INDEX: u16 = 23u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_contract"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Contract>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternContractLookupQuery, InternContractQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternContractLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternContractQuery.html b/compiler-docs/fe_analyzer/db/struct.InternContractQuery.html new file mode 100644 index 0000000000..3524c4a400 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternContractQuery.html @@ -0,0 +1,39 @@ +InternContractQuery in fe_analyzer::db - Rust

Struct InternContractQuery

Source
pub struct InternContractQuery;

Implementations§

Source§

impl InternContractQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternContractQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternContractQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternContractQuery

Source§

fn default() -> InternContractQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternContractQuery

Source§

const QUERY_INDEX: u16 = 22u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_contract"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Contract>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ContractId

What value does the query return?
Source§

type Storage = InternedStorage<InternContractQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternContractQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternEnumLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternEnumLookupQuery.html new file mode 100644 index 0000000000..bf8b0e8ec1 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternEnumLookupQuery.html @@ -0,0 +1,39 @@ +InternEnumLookupQuery in fe_analyzer::db - Rust

Struct InternEnumLookupQuery

Source
pub struct InternEnumLookupQuery;

Implementations§

Source§

impl InternEnumLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternEnumLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternEnumLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternEnumLookupQuery

Source§

fn default() -> InternEnumLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternEnumLookupQuery

Source§

const QUERY_INDEX: u16 = 11u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_enum"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Enum>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternEnumLookupQuery, InternEnumQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternEnumLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternEnumQuery.html b/compiler-docs/fe_analyzer/db/struct.InternEnumQuery.html new file mode 100644 index 0000000000..444a2c1b62 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternEnumQuery.html @@ -0,0 +1,39 @@ +InternEnumQuery in fe_analyzer::db - Rust

Struct InternEnumQuery

Source
pub struct InternEnumQuery;

Implementations§

Source§

impl InternEnumQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternEnumQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternEnumQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternEnumQuery

Source§

fn default() -> InternEnumQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternEnumQuery

Source§

const QUERY_INDEX: u16 = 10u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_enum"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Enum>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = EnumId

What value does the query return?
Source§

type Storage = InternedStorage<InternEnumQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternEnumQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternEnumVariantLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternEnumVariantLookupQuery.html new file mode 100644 index 0000000000..da8afe1ce7 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternEnumVariantLookupQuery.html @@ -0,0 +1,39 @@ +InternEnumVariantLookupQuery in fe_analyzer::db - Rust

Struct InternEnumVariantLookupQuery

Source
pub struct InternEnumVariantLookupQuery;

Implementations§

Source§

impl InternEnumVariantLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternEnumVariantLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternEnumVariantLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternEnumVariantLookupQuery

Source§

fn default() -> InternEnumVariantLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternEnumVariantLookupQuery

Source§

const QUERY_INDEX: u16 = 15u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_enum_variant"

Name of the query method (e.g., foo)
Source§

type Key = EnumVariantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<EnumVariant>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternEnumVariantLookupQuery, InternEnumVariantQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternEnumVariantLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternEnumVariantQuery.html b/compiler-docs/fe_analyzer/db/struct.InternEnumVariantQuery.html new file mode 100644 index 0000000000..2566fbd534 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternEnumVariantQuery.html @@ -0,0 +1,39 @@ +InternEnumVariantQuery in fe_analyzer::db - Rust

Struct InternEnumVariantQuery

Source
pub struct InternEnumVariantQuery;

Implementations§

Source§

impl InternEnumVariantQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternEnumVariantQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternEnumVariantQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternEnumVariantQuery

Source§

fn default() -> InternEnumVariantQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternEnumVariantQuery

Source§

const QUERY_INDEX: u16 = 14u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_enum_variant"

Name of the query method (e.g., foo)
Source§

type Key = Rc<EnumVariant>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = EnumVariantId

What value does the query return?
Source§

type Storage = InternedStorage<InternEnumVariantQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternEnumVariantQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternFunctionLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternFunctionLookupQuery.html new file mode 100644 index 0000000000..3cbab6ff1f --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternFunctionLookupQuery.html @@ -0,0 +1,39 @@ +InternFunctionLookupQuery in fe_analyzer::db - Rust

Struct InternFunctionLookupQuery

Source
pub struct InternFunctionLookupQuery;

Implementations§

Source§

impl InternFunctionLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFunctionLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFunctionLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFunctionLookupQuery

Source§

fn default() -> InternFunctionLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFunctionLookupQuery

Source§

const QUERY_INDEX: u16 = 29u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_function"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Function>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternFunctionLookupQuery, InternFunctionQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFunctionLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternFunctionQuery.html b/compiler-docs/fe_analyzer/db/struct.InternFunctionQuery.html new file mode 100644 index 0000000000..cccc00c331 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternFunctionQuery.html @@ -0,0 +1,39 @@ +InternFunctionQuery in fe_analyzer::db - Rust

Struct InternFunctionQuery

Source
pub struct InternFunctionQuery;

Implementations§

Source§

impl InternFunctionQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFunctionQuery

Source§

fn default() -> InternFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFunctionQuery

Source§

const QUERY_INDEX: u16 = 28u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_function"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Function>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = InternedStorage<InternFunctionQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFunctionQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternFunctionSigLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternFunctionSigLookupQuery.html new file mode 100644 index 0000000000..371ca265c4 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternFunctionSigLookupQuery.html @@ -0,0 +1,39 @@ +InternFunctionSigLookupQuery in fe_analyzer::db - Rust

Struct InternFunctionSigLookupQuery

Source
pub struct InternFunctionSigLookupQuery;

Implementations§

Source§

impl InternFunctionSigLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFunctionSigLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFunctionSigLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFunctionSigLookupQuery

Source§

fn default() -> InternFunctionSigLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFunctionSigLookupQuery

Source§

const QUERY_INDEX: u16 = 27u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_function_sig"

Name of the query method (e.g., foo)
Source§

type Key = FunctionSigId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionSig>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternFunctionSigLookupQuery, InternFunctionSigQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFunctionSigLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternFunctionSigQuery.html b/compiler-docs/fe_analyzer/db/struct.InternFunctionSigQuery.html new file mode 100644 index 0000000000..a8955fb2b1 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternFunctionSigQuery.html @@ -0,0 +1,39 @@ +InternFunctionSigQuery in fe_analyzer::db - Rust

Struct InternFunctionSigQuery

Source
pub struct InternFunctionSigQuery;

Implementations§

Source§

impl InternFunctionSigQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFunctionSigQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFunctionSigQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFunctionSigQuery

Source§

fn default() -> InternFunctionSigQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFunctionSigQuery

Source§

const QUERY_INDEX: u16 = 26u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_function_sig"

Name of the query method (e.g., foo)
Source§

type Key = Rc<FunctionSig>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionSigId

What value does the query return?
Source§

type Storage = InternedStorage<InternFunctionSigQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFunctionSigQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternImplLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternImplLookupQuery.html new file mode 100644 index 0000000000..499a97f977 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternImplLookupQuery.html @@ -0,0 +1,39 @@ +InternImplLookupQuery in fe_analyzer::db - Rust

Struct InternImplLookupQuery

Source
pub struct InternImplLookupQuery;

Implementations§

Source§

impl InternImplLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternImplLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternImplLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternImplLookupQuery

Source§

fn default() -> InternImplLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternImplLookupQuery

Source§

const QUERY_INDEX: u16 = 19u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_impl"

Name of the query method (e.g., foo)
Source§

type Key = ImplId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Impl>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternImplLookupQuery, InternImplQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternImplLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternImplQuery.html b/compiler-docs/fe_analyzer/db/struct.InternImplQuery.html new file mode 100644 index 0000000000..b0b814e79b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternImplQuery.html @@ -0,0 +1,39 @@ +InternImplQuery in fe_analyzer::db - Rust

Struct InternImplQuery

Source
pub struct InternImplQuery;

Implementations§

Source§

impl InternImplQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternImplQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternImplQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternImplQuery

Source§

fn default() -> InternImplQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternImplQuery

Source§

const QUERY_INDEX: u16 = 18u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_impl"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Impl>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ImplId

What value does the query return?
Source§

type Storage = InternedStorage<InternImplQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternImplQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternIngotLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternIngotLookupQuery.html new file mode 100644 index 0000000000..f1d4291e45 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternIngotLookupQuery.html @@ -0,0 +1,39 @@ +InternIngotLookupQuery in fe_analyzer::db - Rust

Struct InternIngotLookupQuery

Source
pub struct InternIngotLookupQuery;

Implementations§

Source§

impl InternIngotLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternIngotLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternIngotLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternIngotLookupQuery

Source§

fn default() -> InternIngotLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternIngotLookupQuery

Source§

const QUERY_INDEX: u16 = 1u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_ingot"

Name of the query method (e.g., foo)
Source§

type Key = IngotId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Ingot>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternIngotLookupQuery, InternIngotQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternIngotLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternIngotQuery.html b/compiler-docs/fe_analyzer/db/struct.InternIngotQuery.html new file mode 100644 index 0000000000..c03e8f5c6b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternIngotQuery.html @@ -0,0 +1,39 @@ +InternIngotQuery in fe_analyzer::db - Rust

Struct InternIngotQuery

Source
pub struct InternIngotQuery;

Implementations§

Source§

impl InternIngotQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternIngotQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternIngotQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternIngotQuery

Source§

fn default() -> InternIngotQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternIngotQuery

Source§

const QUERY_INDEX: u16 = 0u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_ingot"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Ingot>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = IngotId

What value does the query return?
Source§

type Storage = InternedStorage<InternIngotQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternIngotQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternModuleConstLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternModuleConstLookupQuery.html new file mode 100644 index 0000000000..9129f2841b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternModuleConstLookupQuery.html @@ -0,0 +1,39 @@ +InternModuleConstLookupQuery in fe_analyzer::db - Rust

Struct InternModuleConstLookupQuery

Source
pub struct InternModuleConstLookupQuery;

Implementations§

Source§

impl InternModuleConstLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternModuleConstLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternModuleConstLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternModuleConstLookupQuery

Source§

fn default() -> InternModuleConstLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternModuleConstLookupQuery

Source§

const QUERY_INDEX: u16 = 5u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_module_const"

Name of the query method (e.g., foo)
Source§

type Key = ModuleConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<ModuleConstant>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternModuleConstLookupQuery, InternModuleConstQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternModuleConstLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternModuleConstQuery.html b/compiler-docs/fe_analyzer/db/struct.InternModuleConstQuery.html new file mode 100644 index 0000000000..11156c9729 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternModuleConstQuery.html @@ -0,0 +1,39 @@ +InternModuleConstQuery in fe_analyzer::db - Rust

Struct InternModuleConstQuery

Source
pub struct InternModuleConstQuery;

Implementations§

Source§

impl InternModuleConstQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternModuleConstQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternModuleConstQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternModuleConstQuery

Source§

fn default() -> InternModuleConstQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternModuleConstQuery

Source§

const QUERY_INDEX: u16 = 4u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_module_const"

Name of the query method (e.g., foo)
Source§

type Key = Rc<ModuleConstant>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ModuleConstantId

What value does the query return?
Source§

type Storage = InternedStorage<InternModuleConstQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternModuleConstQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternModuleLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternModuleLookupQuery.html new file mode 100644 index 0000000000..16be75a9ce --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternModuleLookupQuery.html @@ -0,0 +1,39 @@ +InternModuleLookupQuery in fe_analyzer::db - Rust

Struct InternModuleLookupQuery

Source
pub struct InternModuleLookupQuery;

Implementations§

Source§

impl InternModuleLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternModuleLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternModuleLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternModuleLookupQuery

Source§

fn default() -> InternModuleLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternModuleLookupQuery

Source§

const QUERY_INDEX: u16 = 3u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_module"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Module>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternModuleLookupQuery, InternModuleQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternModuleLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternModuleQuery.html b/compiler-docs/fe_analyzer/db/struct.InternModuleQuery.html new file mode 100644 index 0000000000..6de8fb5928 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternModuleQuery.html @@ -0,0 +1,39 @@ +InternModuleQuery in fe_analyzer::db - Rust

Struct InternModuleQuery

Source
pub struct InternModuleQuery;

Implementations§

Source§

impl InternModuleQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternModuleQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternModuleQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternModuleQuery

Source§

fn default() -> InternModuleQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternModuleQuery

Source§

const QUERY_INDEX: u16 = 2u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_module"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Module>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ModuleId

What value does the query return?
Source§

type Storage = InternedStorage<InternModuleQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternModuleQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternStructFieldLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternStructFieldLookupQuery.html new file mode 100644 index 0000000000..aab62a9633 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternStructFieldLookupQuery.html @@ -0,0 +1,39 @@ +InternStructFieldLookupQuery in fe_analyzer::db - Rust

Struct InternStructFieldLookupQuery

Source
pub struct InternStructFieldLookupQuery;

Implementations§

Source§

impl InternStructFieldLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternStructFieldLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternStructFieldLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternStructFieldLookupQuery

Source§

fn default() -> InternStructFieldLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternStructFieldLookupQuery

Source§

const QUERY_INDEX: u16 = 9u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_struct_field"

Name of the query method (e.g., foo)
Source§

type Key = StructFieldId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<StructField>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternStructFieldLookupQuery, InternStructFieldQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternStructFieldLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternStructFieldQuery.html b/compiler-docs/fe_analyzer/db/struct.InternStructFieldQuery.html new file mode 100644 index 0000000000..4c25f4edea --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternStructFieldQuery.html @@ -0,0 +1,39 @@ +InternStructFieldQuery in fe_analyzer::db - Rust

Struct InternStructFieldQuery

Source
pub struct InternStructFieldQuery;

Implementations§

Source§

impl InternStructFieldQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternStructFieldQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternStructFieldQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternStructFieldQuery

Source§

fn default() -> InternStructFieldQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternStructFieldQuery

Source§

const QUERY_INDEX: u16 = 8u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_struct_field"

Name of the query method (e.g., foo)
Source§

type Key = Rc<StructField>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = StructFieldId

What value does the query return?
Source§

type Storage = InternedStorage<InternStructFieldQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternStructFieldQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternStructLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternStructLookupQuery.html new file mode 100644 index 0000000000..0561ba9672 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternStructLookupQuery.html @@ -0,0 +1,39 @@ +InternStructLookupQuery in fe_analyzer::db - Rust

Struct InternStructLookupQuery

Source
pub struct InternStructLookupQuery;

Implementations§

Source§

impl InternStructLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternStructLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternStructLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternStructLookupQuery

Source§

fn default() -> InternStructLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternStructLookupQuery

Source§

const QUERY_INDEX: u16 = 7u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_struct"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Struct>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternStructLookupQuery, InternStructQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternStructLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternStructQuery.html b/compiler-docs/fe_analyzer/db/struct.InternStructQuery.html new file mode 100644 index 0000000000..77e038d7ab --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternStructQuery.html @@ -0,0 +1,39 @@ +InternStructQuery in fe_analyzer::db - Rust

Struct InternStructQuery

Source
pub struct InternStructQuery;

Implementations§

Source§

impl InternStructQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternStructQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternStructQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternStructQuery

Source§

fn default() -> InternStructQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternStructQuery

Source§

const QUERY_INDEX: u16 = 6u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_struct"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Struct>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = StructId

What value does the query return?
Source§

type Storage = InternedStorage<InternStructQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternStructQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTraitLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTraitLookupQuery.html new file mode 100644 index 0000000000..49627c53ce --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTraitLookupQuery.html @@ -0,0 +1,39 @@ +InternTraitLookupQuery in fe_analyzer::db - Rust

Struct InternTraitLookupQuery

Source
pub struct InternTraitLookupQuery;

Implementations§

Source§

impl InternTraitLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTraitLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTraitLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTraitLookupQuery

Source§

fn default() -> InternTraitLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTraitLookupQuery

Source§

const QUERY_INDEX: u16 = 17u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_trait"

Name of the query method (e.g., foo)
Source§

type Key = TraitId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Trait>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternTraitLookupQuery, InternTraitQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTraitLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTraitQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTraitQuery.html new file mode 100644 index 0000000000..10158b546c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTraitQuery.html @@ -0,0 +1,39 @@ +InternTraitQuery in fe_analyzer::db - Rust

Struct InternTraitQuery

Source
pub struct InternTraitQuery;

Implementations§

Source§

impl InternTraitQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTraitQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTraitQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTraitQuery

Source§

fn default() -> InternTraitQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTraitQuery

Source§

const QUERY_INDEX: u16 = 16u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_trait"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Trait>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TraitId

What value does the query return?
Source§

type Storage = InternedStorage<InternTraitQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTraitQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTypeAliasLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTypeAliasLookupQuery.html new file mode 100644 index 0000000000..cea85ec198 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTypeAliasLookupQuery.html @@ -0,0 +1,39 @@ +InternTypeAliasLookupQuery in fe_analyzer::db - Rust

Struct InternTypeAliasLookupQuery

Source
pub struct InternTypeAliasLookupQuery;

Implementations§

Source§

impl InternTypeAliasLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTypeAliasLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTypeAliasLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTypeAliasLookupQuery

Source§

fn default() -> InternTypeAliasLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTypeAliasLookupQuery

Source§

const QUERY_INDEX: u16 = 21u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_type_alias"

Name of the query method (e.g., foo)
Source§

type Key = TypeAliasId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<TypeAlias>

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternTypeAliasLookupQuery, InternTypeAliasQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTypeAliasLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTypeAliasQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTypeAliasQuery.html new file mode 100644 index 0000000000..dd604a3c65 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTypeAliasQuery.html @@ -0,0 +1,39 @@ +InternTypeAliasQuery in fe_analyzer::db - Rust

Struct InternTypeAliasQuery

Source
pub struct InternTypeAliasQuery;

Implementations§

Source§

impl InternTypeAliasQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTypeAliasQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTypeAliasQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTypeAliasQuery

Source§

fn default() -> InternTypeAliasQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTypeAliasQuery

Source§

const QUERY_INDEX: u16 = 20u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_type_alias"

Name of the query method (e.g., foo)
Source§

type Key = Rc<TypeAlias>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeAliasId

What value does the query return?
Source§

type Storage = InternedStorage<InternTypeAliasQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTypeAliasQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTypeLookupQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTypeLookupQuery.html new file mode 100644 index 0000000000..abae3d37ff --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTypeLookupQuery.html @@ -0,0 +1,39 @@ +InternTypeLookupQuery in fe_analyzer::db - Rust

Struct InternTypeLookupQuery

Source
pub struct InternTypeLookupQuery;

Implementations§

Source§

impl InternTypeLookupQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTypeLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTypeLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTypeLookupQuery

Source§

fn default() -> InternTypeLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTypeLookupQuery

Source§

const QUERY_INDEX: u16 = 31u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Type

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternTypeLookupQuery, InternTypeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTypeLookupQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.InternTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.InternTypeQuery.html new file mode 100644 index 0000000000..cdfbacab86 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.InternTypeQuery.html @@ -0,0 +1,39 @@ +InternTypeQuery in fe_analyzer::db - Rust

Struct InternTypeQuery

Source
pub struct InternTypeQuery;

Implementations§

Source§

impl InternTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternTypeQuery

Source§

fn default() -> InternTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternTypeQuery

Source§

const QUERY_INDEX: u16 = 30u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_type"

Name of the query method (e.g., foo)
Source§

type Key = Type

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeId

What value does the query return?
Source§

type Storage = InternedStorage<InternTypeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleAllImplsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleAllImplsQuery.html new file mode 100644 index 0000000000..f501748782 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleAllImplsQuery.html @@ -0,0 +1,46 @@ +ModuleAllImplsQuery in fe_analyzer::db - Rust

Struct ModuleAllImplsQuery

Source
pub struct ModuleAllImplsQuery;

Implementations§

Source§

impl ModuleAllImplsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleAllImplsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleAllImplsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleAllImplsQuery

Source§

fn default() -> ModuleAllImplsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleAllImplsQuery

Source§

const QUERY_INDEX: u16 = 41u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_all_impls"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<[ImplId]>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleAllImplsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleAllImplsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleAllImplsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleAllItemsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleAllItemsQuery.html new file mode 100644 index 0000000000..925c5f1260 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleAllItemsQuery.html @@ -0,0 +1,46 @@ +ModuleAllItemsQuery in fe_analyzer::db - Rust

Struct ModuleAllItemsQuery

Source
pub struct ModuleAllItemsQuery;

Implementations§

Source§

impl ModuleAllItemsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleAllItemsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleAllItemsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleAllItemsQuery

Source§

fn default() -> ModuleAllItemsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleAllItemsQuery

Source§

const QUERY_INDEX: u16 = 40u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_all_items"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[Item]>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleAllItemsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleAllItemsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleAllItemsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleConstantTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleConstantTypeQuery.html new file mode 100644 index 0000000000..23389c0595 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleConstantTypeQuery.html @@ -0,0 +1,46 @@ +ModuleConstantTypeQuery in fe_analyzer::db - Rust

Struct ModuleConstantTypeQuery

Source
pub struct ModuleConstantTypeQuery;

Implementations§

Source§

impl ModuleConstantTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleConstantTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleConstantTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleConstantTypeQuery

Source§

fn default() -> ModuleConstantTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleConstantTypeQuery

Source§

const QUERY_INDEX: u16 = 51u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_constant_type"

Name of the query method (e.g., foo)
Source§

type Key = ModuleConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<TypeId, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleConstantTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleConstantTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleConstantTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleConstantValueQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleConstantValueQuery.html new file mode 100644 index 0000000000..93eddecf14 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleConstantValueQuery.html @@ -0,0 +1,46 @@ +ModuleConstantValueQuery in fe_analyzer::db - Rust

Struct ModuleConstantValueQuery

Source
pub struct ModuleConstantValueQuery;

Implementations§

Source§

impl ModuleConstantValueQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleConstantValueQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleConstantValueQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleConstantValueQuery

Source§

fn default() -> ModuleConstantValueQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleConstantValueQuery

Source§

const QUERY_INDEX: u16 = 52u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_constant_value"

Name of the query method (e.g., foo)
Source§

type Key = ModuleConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<Constant, ConstEvalError>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleConstantValueQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleConstantValueQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleConstantValueQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleConstantsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleConstantsQuery.html new file mode 100644 index 0000000000..92ceb862db --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleConstantsQuery.html @@ -0,0 +1,46 @@ +ModuleConstantsQuery in fe_analyzer::db - Rust

Struct ModuleConstantsQuery

Source
pub struct ModuleConstantsQuery;

Implementations§

Source§

impl ModuleConstantsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleConstantsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleConstantsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleConstantsQuery

Source§

fn default() -> ModuleConstantsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleConstantsQuery

Source§

const QUERY_INDEX: u16 = 46u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_constants"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<ModuleConstantId>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleConstantsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleConstantsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleConstantsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleContractsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleContractsQuery.html new file mode 100644 index 0000000000..697f53dfcd --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleContractsQuery.html @@ -0,0 +1,46 @@ +ModuleContractsQuery in fe_analyzer::db - Rust

Struct ModuleContractsQuery

Source
pub struct ModuleContractsQuery;

Implementations§

Source§

impl ModuleContractsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleContractsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleContractsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleContractsQuery

Source§

fn default() -> ModuleContractsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleContractsQuery

Source§

const QUERY_INDEX: u16 = 44u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_contracts"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ContractId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleContractsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleContractsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleContractsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleFilePathQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleFilePathQuery.html new file mode 100644 index 0000000000..f39fc1dd50 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleFilePathQuery.html @@ -0,0 +1,46 @@ +ModuleFilePathQuery in fe_analyzer::db - Rust

Struct ModuleFilePathQuery

Source
pub struct ModuleFilePathQuery;

Implementations§

Source§

impl ModuleFilePathQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleFilePathQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleFilePathQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleFilePathQuery

Source§

fn default() -> ModuleFilePathQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleFilePathQuery

Source§

const QUERY_INDEX: u16 = 37u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_file_path"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = SmolStr

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleFilePathQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleFilePathQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleFilePathQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleImplMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleImplMapQuery.html new file mode 100644 index 0000000000..440b237414 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleImplMapQuery.html @@ -0,0 +1,46 @@ +ModuleImplMapQuery in fe_analyzer::db - Rust

Struct ModuleImplMapQuery

Source
pub struct ModuleImplMapQuery;

Implementations§

Source§

impl ModuleImplMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleImplMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleImplMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleImplMapQuery

Source§

fn default() -> ModuleImplMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleImplMapQuery

Source§

const QUERY_INDEX: u16 = 43u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_impl_map"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleImplMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleImplMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleImplMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleIsIncompleteQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleIsIncompleteQuery.html new file mode 100644 index 0000000000..337224339f --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleIsIncompleteQuery.html @@ -0,0 +1,46 @@ +ModuleIsIncompleteQuery in fe_analyzer::db - Rust

Struct ModuleIsIncompleteQuery

Source
pub struct ModuleIsIncompleteQuery;

Implementations§

Source§

impl ModuleIsIncompleteQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleIsIncompleteQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleIsIncompleteQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleIsIncompleteQuery

Source§

fn default() -> ModuleIsIncompleteQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleIsIncompleteQuery

Source§

const QUERY_INDEX: u16 = 39u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_is_incomplete"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = bool

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleIsIncompleteQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleIsIncompleteQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleIsIncompleteQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleItemMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleItemMapQuery.html new file mode 100644 index 0000000000..372d641cda --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleItemMapQuery.html @@ -0,0 +1,46 @@ +ModuleItemMapQuery in fe_analyzer::db - Rust

Struct ModuleItemMapQuery

Source
pub struct ModuleItemMapQuery;

Implementations§

Source§

impl ModuleItemMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleItemMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleItemMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleItemMapQuery

Source§

fn default() -> ModuleItemMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleItemMapQuery

Source§

const QUERY_INDEX: u16 = 42u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_item_map"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, Item>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleItemMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleItemMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleItemMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleParentModuleQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleParentModuleQuery.html new file mode 100644 index 0000000000..5ad1595697 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleParentModuleQuery.html @@ -0,0 +1,46 @@ +ModuleParentModuleQuery in fe_analyzer::db - Rust

Struct ModuleParentModuleQuery

Source
pub struct ModuleParentModuleQuery;

Implementations§

Source§

impl ModuleParentModuleQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleParentModuleQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleParentModuleQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleParentModuleQuery

Source§

fn default() -> ModuleParentModuleQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleParentModuleQuery

Source§

const QUERY_INDEX: u16 = 48u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_parent_module"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Option<ModuleId>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleParentModuleQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleParentModuleQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleParentModuleQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleParseQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleParseQuery.html new file mode 100644 index 0000000000..7ac5786ef4 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleParseQuery.html @@ -0,0 +1,46 @@ +ModuleParseQuery in fe_analyzer::db - Rust

Struct ModuleParseQuery

Source
pub struct ModuleParseQuery;

Implementations§

Source§

impl ModuleParseQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleParseQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleParseQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleParseQuery

Source§

fn default() -> ModuleParseQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleParseQuery

Source§

const QUERY_INDEX: u16 = 38u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_parse"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<Module>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleParseQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleParseQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleParseQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleStructsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleStructsQuery.html new file mode 100644 index 0000000000..61a9313f0c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleStructsQuery.html @@ -0,0 +1,46 @@ +ModuleStructsQuery in fe_analyzer::db - Rust

Struct ModuleStructsQuery

Source
pub struct ModuleStructsQuery;

Implementations§

Source§

impl ModuleStructsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleStructsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleStructsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleStructsQuery

Source§

fn default() -> ModuleStructsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleStructsQuery

Source§

const QUERY_INDEX: u16 = 45u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_structs"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[StructId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleStructsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleStructsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleStructsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleSubmodulesQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleSubmodulesQuery.html new file mode 100644 index 0000000000..0458e651e5 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleSubmodulesQuery.html @@ -0,0 +1,46 @@ +ModuleSubmodulesQuery in fe_analyzer::db - Rust

Struct ModuleSubmodulesQuery

Source
pub struct ModuleSubmodulesQuery;

Implementations§

Source§

impl ModuleSubmodulesQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleSubmodulesQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleSubmodulesQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleSubmodulesQuery

Source§

fn default() -> ModuleSubmodulesQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleSubmodulesQuery

Source§

const QUERY_INDEX: u16 = 49u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_submodules"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[ModuleId]>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleSubmodulesQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleSubmodulesQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleSubmodulesQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleTestsQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleTestsQuery.html new file mode 100644 index 0000000000..8a17c81cda --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleTestsQuery.html @@ -0,0 +1,46 @@ +ModuleTestsQuery in fe_analyzer::db - Rust

Struct ModuleTestsQuery

Source
pub struct ModuleTestsQuery;

Implementations§

Source§

impl ModuleTestsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleTestsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleTestsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleTestsQuery

Source§

fn default() -> ModuleTestsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleTestsQuery

Source§

const QUERY_INDEX: u16 = 50u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_tests"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Vec<FunctionId>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleTestsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleTestsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleTestsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.ModuleUsedItemMapQuery.html b/compiler-docs/fe_analyzer/db/struct.ModuleUsedItemMapQuery.html new file mode 100644 index 0000000000..2642ffd162 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.ModuleUsedItemMapQuery.html @@ -0,0 +1,46 @@ +ModuleUsedItemMapQuery in fe_analyzer::db - Rust

Struct ModuleUsedItemMapQuery

Source
pub struct ModuleUsedItemMapQuery;

Implementations§

Source§

impl ModuleUsedItemMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl ModuleUsedItemMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for ModuleUsedItemMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ModuleUsedItemMapQuery

Source§

fn default() -> ModuleUsedItemMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for ModuleUsedItemMapQuery

Source§

const QUERY_INDEX: u16 = 47u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "module_used_item_map"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

What value does the query return?
Source§

type Storage = DerivedStorage<ModuleUsedItemMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for ModuleUsedItemMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for ModuleUsedItemMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.RootIngotQuery.html b/compiler-docs/fe_analyzer/db/struct.RootIngotQuery.html new file mode 100644 index 0000000000..b021fefef6 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.RootIngotQuery.html @@ -0,0 +1,39 @@ +RootIngotQuery in fe_analyzer::db - Rust

Struct RootIngotQuery

Source
pub struct RootIngotQuery;

Implementations§

Source§

impl RootIngotQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl RootIngotQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for RootIngotQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for RootIngotQuery

Source§

fn default() -> RootIngotQuery

Returns the “default value” for a type. Read more
Source§

impl Query for RootIngotQuery

Source§

const QUERY_INDEX: u16 = 34u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "root_ingot"

Name of the query method (e.g., foo)
Source§

type Key = ()

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = IngotId

What value does the query return?
Source§

type Storage = InputStorage<RootIngotQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for RootIngotQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructAllFieldsQuery.html b/compiler-docs/fe_analyzer/db/struct.StructAllFieldsQuery.html new file mode 100644 index 0000000000..ff756b032a --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructAllFieldsQuery.html @@ -0,0 +1,46 @@ +StructAllFieldsQuery in fe_analyzer::db - Rust

Struct StructAllFieldsQuery

Source
pub struct StructAllFieldsQuery;

Implementations§

Source§

impl StructAllFieldsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructAllFieldsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructAllFieldsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructAllFieldsQuery

Source§

fn default() -> StructAllFieldsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructAllFieldsQuery

Source§

const QUERY_INDEX: u16 = 66u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_all_fields"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[StructFieldId]>

What value does the query return?
Source§

type Storage = DerivedStorage<StructAllFieldsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructAllFieldsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructAllFieldsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.StructAllFunctionsQuery.html new file mode 100644 index 0000000000..2ee9aab29c --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructAllFunctionsQuery.html @@ -0,0 +1,46 @@ +StructAllFunctionsQuery in fe_analyzer::db - Rust

Struct StructAllFunctionsQuery

Source
pub struct StructAllFunctionsQuery;

Implementations§

Source§

impl StructAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructAllFunctionsQuery

Source§

fn default() -> StructAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 69u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionId]>

What value does the query return?
Source§

type Storage = DerivedStorage<StructAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructDependencyGraphQuery.html b/compiler-docs/fe_analyzer/db/struct.StructDependencyGraphQuery.html new file mode 100644 index 0000000000..6b72d2e3f3 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructDependencyGraphQuery.html @@ -0,0 +1,46 @@ +StructDependencyGraphQuery in fe_analyzer::db - Rust

Struct StructDependencyGraphQuery

Source
pub struct StructDependencyGraphQuery;

Implementations§

Source§

impl StructDependencyGraphQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructDependencyGraphQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructDependencyGraphQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructDependencyGraphQuery

Source§

fn default() -> StructDependencyGraphQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructDependencyGraphQuery

Source§

const QUERY_INDEX: u16 = 71u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_dependency_graph"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<DepGraphWrapper>

What value does the query return?
Source§

type Storage = DerivedStorage<StructDependencyGraphQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructDependencyGraphQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructDependencyGraphQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructFieldMapQuery.html b/compiler-docs/fe_analyzer/db/struct.StructFieldMapQuery.html new file mode 100644 index 0000000000..bd43bbb173 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructFieldMapQuery.html @@ -0,0 +1,46 @@ +StructFieldMapQuery in fe_analyzer::db - Rust

Struct StructFieldMapQuery

Source
pub struct StructFieldMapQuery;

Implementations§

Source§

impl StructFieldMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructFieldMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructFieldMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructFieldMapQuery

Source§

fn default() -> StructFieldMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructFieldMapQuery

Source§

const QUERY_INDEX: u16 = 67u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_field_map"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<StructFieldMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructFieldMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructFieldMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructFieldTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.StructFieldTypeQuery.html new file mode 100644 index 0000000000..75ed50ad53 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructFieldTypeQuery.html @@ -0,0 +1,46 @@ +StructFieldTypeQuery in fe_analyzer::db - Rust

Struct StructFieldTypeQuery

Source
pub struct StructFieldTypeQuery;

Implementations§

Source§

impl StructFieldTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructFieldTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructFieldTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructFieldTypeQuery

Source§

fn default() -> StructFieldTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructFieldTypeQuery

Source§

const QUERY_INDEX: u16 = 68u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_field_type"

Name of the query method (e.g., foo)
Source§

type Key = StructFieldId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<TypeId, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<StructFieldTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructFieldTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructFieldTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.StructFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.StructFunctionMapQuery.html new file mode 100644 index 0000000000..dcdc45f88d --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.StructFunctionMapQuery.html @@ -0,0 +1,46 @@ +StructFunctionMapQuery in fe_analyzer::db - Rust

Struct StructFunctionMapQuery

Source
pub struct StructFunctionMapQuery;

Implementations§

Source§

impl StructFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl StructFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for StructFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructFunctionMapQuery

Source§

fn default() -> StructFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for StructFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 70u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "struct_function_map"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<StructFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for StructFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for StructFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TestDb.html b/compiler-docs/fe_analyzer/db/struct.TestDb.html new file mode 100644 index 0000000000..62de4a0f87 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TestDb.html @@ -0,0 +1,123 @@ +TestDb in fe_analyzer::db - Rust

Struct TestDb

Source
pub struct TestDb { /* private fields */ }

Trait Implementations§

Source§

impl Database for TestDb

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

impl DatabaseOps for TestDb

Source§

fn ops_database(&self) -> &dyn Database

Upcast this type to a dyn Database.
Source§

fn ops_salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
Source§

fn ops_salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

fn fmt_index(&self, input: DatabaseKeyIndex, fmt: &mut Formatter<'_>) -> Result

Formats a database key index in a human readable fashion.
Source§

fn maybe_changed_since( + &self, + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

True if the computed value for input may have changed since revision.
Source§

fn for_each_query(&self, op: &mut dyn FnMut(&dyn QueryStorageMassOps))

Executes the callback for each kind of query.
Source§

impl DatabaseStorageTypes for TestDb

Source§

type DatabaseStorage = __SalsaDatabaseStorage

Defines the “storage type”, where all the query data is kept. +This type is defined by the database_storage macro.
Source§

impl Default for TestDb

Source§

fn default() -> TestDb

Returns the “default value” for a type. Read more
Source§

impl HasQueryGroup<AnalyzerDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<AnalyzerDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<SourceDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl Upcast<dyn SourceDb> for TestDb

Source§

fn upcast(&self) -> &(dyn SourceDb + 'static)

Source§

impl UpcastMut<dyn SourceDb> for TestDb

Source§

fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static)

Auto Trait Implementations§

§

impl !Freeze for TestDb

§

impl RefUnwindSafe for TestDb

§

impl !Send for TestDb

§

impl !Sync for TestDb

§

impl Unpin for TestDb

§

impl UnwindSafe for TestDb

Blanket Implementations§

Source§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

Source§

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

Source§

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

Source§

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

Source§

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

Source§

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

Source§

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

Source§

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

Source§

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

Source§

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

Source§

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

Source§

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

Source§

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

Source§

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

Source§

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

Source§

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

Source§

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

Source§

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

Source§

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

Source§

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

Source§

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

Source§

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

Source§

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

Source§

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

Source§

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

Source§

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

Source§

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

Source§

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

Source§

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

Source§

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

Source§

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

Source§

fn intern_type(&self, key0: Type) -> TypeId

Source§

fn lookup_intern_type(&self, key0: TypeId) -> Type

Source§

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

Source§

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input. Read more
Source§

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again. Read more
Source§

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

Source§

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input. Read more
Source§

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again. Read more
Source§

fn root_ingot(&self) -> IngotId

Source§

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input. Read more
Source§

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again. Read more
Source§

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

Source§

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

Source§

fn module_file_path(&self, key0: ModuleId) -> SmolStr

Source§

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

Source§

fn module_is_incomplete(&self, key0: ModuleId) -> bool

Source§

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

Source§

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

Source§

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

Source§

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

Source§

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

Source§

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

Source§

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

Source§

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

Source§

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

Source§

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

Source§

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

Source§

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

Source§

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

Source§

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source§

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source§

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

Source§

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

Source§

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

Source§

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

Source§

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

Source§

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

Source§

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

Source§

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

Source§

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

Source§

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

Source§

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

Source§

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

Source§

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source§

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

Source§

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

Source§

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

Source§

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

Source§

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source§

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

Source§

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

Source§

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

Source§

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

Source§

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

Source§

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

Source§

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source§

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

Source§

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

Source§

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

Source§

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

Source§

fn intern_file(&self, key0: File) -> SourceFileId

Source§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
Source§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
Source§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
Source§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source§

fn file_name(&self, key0: SourceFileId) -> SmolStr

Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TraitAllFunctionsQuery.html b/compiler-docs/fe_analyzer/db/struct.TraitAllFunctionsQuery.html new file mode 100644 index 0000000000..77b9992e5d --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TraitAllFunctionsQuery.html @@ -0,0 +1,46 @@ +TraitAllFunctionsQuery in fe_analyzer::db - Rust

Struct TraitAllFunctionsQuery

Source
pub struct TraitAllFunctionsQuery;

Implementations§

Source§

impl TraitAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl TraitAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for TraitAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TraitAllFunctionsQuery

Source§

fn default() -> TraitAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for TraitAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 78u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "trait_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = TraitId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[FunctionSigId]>

What value does the query return?
Source§

type Storage = DerivedStorage<TraitAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for TraitAllFunctionsQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for TraitAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TraitFunctionMapQuery.html b/compiler-docs/fe_analyzer/db/struct.TraitFunctionMapQuery.html new file mode 100644 index 0000000000..cb07bdd92e --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TraitFunctionMapQuery.html @@ -0,0 +1,46 @@ +TraitFunctionMapQuery in fe_analyzer::db - Rust

Struct TraitFunctionMapQuery

Source
pub struct TraitFunctionMapQuery;

Implementations§

Source§

impl TraitFunctionMapQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl TraitFunctionMapQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for TraitFunctionMapQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TraitFunctionMapQuery

Source§

fn default() -> TraitFunctionMapQuery

Returns the “default value” for a type. Read more
Source§

impl Query for TraitFunctionMapQuery

Source§

const QUERY_INDEX: u16 = 79u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "trait_function_map"

Name of the query method (e.g., foo)
Source§

type Key = TraitId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

What value does the query return?
Source§

type Storage = DerivedStorage<TraitFunctionMapQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for TraitFunctionMapQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for TraitFunctionMapQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TraitIsImplementedForQuery.html b/compiler-docs/fe_analyzer/db/struct.TraitIsImplementedForQuery.html new file mode 100644 index 0000000000..e5725533bf --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TraitIsImplementedForQuery.html @@ -0,0 +1,46 @@ +TraitIsImplementedForQuery in fe_analyzer::db - Rust

Struct TraitIsImplementedForQuery

Source
pub struct TraitIsImplementedForQuery;

Implementations§

Source§

impl TraitIsImplementedForQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl TraitIsImplementedForQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for TraitIsImplementedForQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TraitIsImplementedForQuery

Source§

fn default() -> TraitIsImplementedForQuery

Returns the “default value” for a type. Read more
Source§

impl Query for TraitIsImplementedForQuery

Source§

const QUERY_INDEX: u16 = 80u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "trait_is_implemented_for"

Name of the query method (e.g., foo)
Source§

type Key = (TraitId, TypeId)

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = bool

What value does the query return?
Source§

type Storage = DerivedStorage<TraitIsImplementedForQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for TraitIsImplementedForQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for TraitIsImplementedForQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + (key0, key1): <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/struct.TypeAliasTypeQuery.html b/compiler-docs/fe_analyzer/db/struct.TypeAliasTypeQuery.html new file mode 100644 index 0000000000..3531c7dd71 --- /dev/null +++ b/compiler-docs/fe_analyzer/db/struct.TypeAliasTypeQuery.html @@ -0,0 +1,46 @@ +TypeAliasTypeQuery in fe_analyzer::db - Rust

Struct TypeAliasTypeQuery

Source
pub struct TypeAliasTypeQuery;

Implementations§

Source§

impl TypeAliasTypeQuery

Source

pub fn in_db(self, db: &dyn AnalyzerDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl TypeAliasTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn AnalyzerDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for TypeAliasTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TypeAliasTypeQuery

Source§

fn default() -> TypeAliasTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for TypeAliasTypeQuery

Source§

const QUERY_INDEX: u16 = 86u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "type_alias_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeAliasId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Analysis<Result<TypeId, TypeError>>

What value does the query return?
Source§

type Storage = DerivedStorage<TypeAliasTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for TypeAliasTypeQuery

Source§

type DynDb = dyn AnalyzerDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = AnalyzerDbStorage

Associate query group struct.
Source§

type GroupStorage = AnalyzerDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for TypeAliasTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

Source§

fn recover( + db: &<Self as QueryDb<'_>>::DynDb, + cycle: &[DatabaseKeyIndex], + key0: &<Self as Query>::Key, +) -> Option<<Self as Query>::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/db/trait.AnalyzerDb.html b/compiler-docs/fe_analyzer/db/trait.AnalyzerDb.html new file mode 100644 index 0000000000..9845da493b --- /dev/null +++ b/compiler-docs/fe_analyzer/db/trait.AnalyzerDb.html @@ -0,0 +1,318 @@ +AnalyzerDb in fe_analyzer::db - Rust

Trait AnalyzerDb

Source
pub trait AnalyzerDb:
+    Database
+    + HasQueryGroup<AnalyzerDbStorage>
+    + SourceDb
+    + Upcast<dyn SourceDb>
+    + UpcastMut<dyn SourceDb> {
+
Show 93 methods // Required methods + fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId; + fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>; + fn intern_module(&self, key0: Rc<Module>) -> ModuleId; + fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>; + fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId; + fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, + ) -> Rc<ModuleConstant>; + fn intern_struct(&self, key0: Rc<Struct>) -> StructId; + fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>; + fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId; + fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>; + fn intern_enum(&self, key0: Rc<Enum>) -> EnumId; + fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>; + fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId; + fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>; + fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId; + fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>; + fn intern_trait(&self, key0: Rc<Trait>) -> TraitId; + fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>; + fn intern_impl(&self, key0: Rc<Impl>) -> ImplId; + fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>; + fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId; + fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>; + fn intern_contract(&self, key0: Rc<Contract>) -> ContractId; + fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>; + fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId; + fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, + ) -> Rc<ContractField>; + fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId; + fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>; + fn intern_function(&self, key0: Rc<Function>) -> FunctionId; + fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>; + fn intern_type(&self, key0: Type) -> TypeId; + fn lookup_intern_type(&self, key0: TypeId) -> Type; + fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>; + fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>); + fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, + ); + fn ingot_external_ingots( + &self, + key0: IngotId, + ) -> Rc<IndexMap<SmolStr, IngotId>>; + fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + ); + fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, + ); + fn root_ingot(&self) -> IngotId; + fn set_root_ingot(&mut self, value__: IngotId); + fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, + ); + fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>; + fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>; + fn module_file_path(&self, key0: ModuleId) -> SmolStr; + fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>; + fn module_is_incomplete(&self, key0: ModuleId) -> bool; + fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>; + fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>; + fn module_item_map( + &self, + key0: ModuleId, + ) -> Analysis<Rc<IndexMap<SmolStr, Item>>>; + fn module_impl_map( + &self, + key0: ModuleId, + ) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>; + fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>; + fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>; + fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>; + fn module_used_item_map( + &self, + key0: ModuleId, + ) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>; + fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>; + fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>; + fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>; + fn module_constant_type( + &self, + key0: ModuleConstantId, + ) -> Analysis<Result<TypeId, TypeError>>; + fn module_constant_value( + &self, + key0: ModuleConstantId, + ) -> Analysis<Result<Constant, ConstEvalError>>; + fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>; + fn contract_function_map( + &self, + key0: ContractId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>; + fn contract_public_function_map( + &self, + key0: ContractId, + ) -> Rc<IndexMap<SmolStr, FunctionId>>; + fn contract_init_function( + &self, + key0: ContractId, + ) -> Analysis<Option<FunctionId>>; + fn contract_call_function( + &self, + key0: ContractId, + ) -> Analysis<Option<FunctionId>>; + fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>; + fn contract_field_map( + &self, + key0: ContractId, + ) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>; + fn contract_field_type( + &self, + key0: ContractFieldId, + ) -> Analysis<Result<TypeId, TypeError>>; + fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper; + fn contract_runtime_dependency_graph( + &self, + key0: ContractId, + ) -> DepGraphWrapper; + fn function_signature( + &self, + key0: FunctionSigId, + ) -> Analysis<Rc<FunctionSignature>>; + fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>; + fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper; + fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>; + fn struct_field_map( + &self, + key0: StructId, + ) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>; + fn struct_field_type( + &self, + key0: StructFieldId, + ) -> Analysis<Result<TypeId, TypeError>>; + fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>; + fn struct_function_map( + &self, + key0: StructId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>; + fn struct_dependency_graph( + &self, + key0: StructId, + ) -> Analysis<DepGraphWrapper>; + fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>; + fn enum_variant_map( + &self, + key0: EnumId, + ) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>; + fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>; + fn enum_function_map( + &self, + key0: EnumId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>; + fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>; + fn enum_variant_kind( + &self, + key0: EnumVariantId, + ) -> Analysis<Result<EnumVariantKind, TypeError>>; + fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>; + fn trait_function_map( + &self, + key0: TraitId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>; + fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool; + fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>; + fn impl_function_map( + &self, + key0: ImplId, + ) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>; + fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>; + fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>; + fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>; + fn type_alias_type( + &self, + key0: TypeAliasId, + ) -> Analysis<Result<TypeId, TypeError>>; +
}

Required Methods§

Source

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

Source

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

Source

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

Source

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

Source

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

Source

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

Source

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

Source

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

Source

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

Source

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

Source

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

Source

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

Source

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

Source

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

Source

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

Source

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

Source

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

Source

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

Source

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

Source

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

Source

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

Source

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

Source

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

Source

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

Source

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

Source

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

Source

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

Source

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

Source

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

Source

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

Source

fn intern_type(&self, key0: Type) -> TypeId

Source

fn lookup_intern_type(&self, key0: TypeId) -> Type

Source

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

Source

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input.

+

See ingot_files for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again.

+

See ingot_files for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

Source

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input.

+

See ingot_external_ingots for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again.

+

See ingot_external_ingots for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn root_ingot(&self) -> IngotId

Source

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input.

+

See root_ingot for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again.

+

See root_ingot for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

Source

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

Source

fn module_file_path(&self, key0: ModuleId) -> SmolStr

Source

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

Source

fn module_is_incomplete(&self, key0: ModuleId) -> bool

Source

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

Source

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

Source

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

Source

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

Source

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

Source

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

Source

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

Source

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

Source

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

Source

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

Source

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

Source

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

Source

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

Source

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

Source

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

Source

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

Source

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

Source

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

Source

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

Source

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

Source

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

Source

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

Source

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

Source

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

Source

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

Source

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

Source

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

Source

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

Source

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

Source

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

Source

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

Source

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

Source

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

Source

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

Source

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

Source

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

Source

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

Source

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

Source

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

Source

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

Source

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

Source

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

Source

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Implementors§

Source§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/index.html b/compiler-docs/fe_analyzer/display/index.html new file mode 100644 index 0000000000..fd30e471ee --- /dev/null +++ b/compiler-docs/fe_analyzer/display/index.html @@ -0,0 +1 @@ +fe_analyzer::display - Rust

Module display

Source

Structs§

DisplayableWrapper

Traits§

DisplayWithDb
Displayable
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/sidebar-items.js b/compiler-docs/fe_analyzer/display/sidebar-items.js new file mode 100644 index 0000000000..f7c350dff7 --- /dev/null +++ b/compiler-docs/fe_analyzer/display/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["DisplayableWrapper"],"trait":["DisplayWithDb","Displayable"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/struct.DisplayableWrapper.html b/compiler-docs/fe_analyzer/display/struct.DisplayableWrapper.html new file mode 100644 index 0000000000..fc93dafbd9 --- /dev/null +++ b/compiler-docs/fe_analyzer/display/struct.DisplayableWrapper.html @@ -0,0 +1,14 @@ +DisplayableWrapper in fe_analyzer::display - Rust

Struct DisplayableWrapper

Source
pub struct DisplayableWrapper<'a, T> { /* private fields */ }

Implementations§

Source§

impl<'a, T> DisplayableWrapper<'a, T>

Source

pub fn new(db: &'a dyn AnalyzerDb, inner: T) -> Self

Source

pub fn child(&self, inner: T) -> Self

Trait Implementations§

Source§

impl<T: DisplayWithDb> Display for DisplayableWrapper<'_, T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, T> Freeze for DisplayableWrapper<'a, T>
where + T: Freeze,

§

impl<'a, T> !RefUnwindSafe for DisplayableWrapper<'a, T>

§

impl<'a, T> !Send for DisplayableWrapper<'a, T>

§

impl<'a, T> !Sync for DisplayableWrapper<'a, T>

§

impl<'a, T> Unpin for DisplayableWrapper<'a, T>
where + T: Unpin,

§

impl<'a, T> !UnwindSafe for DisplayableWrapper<'a, T>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/trait.DisplayWithDb.html b/compiler-docs/fe_analyzer/display/trait.DisplayWithDb.html new file mode 100644 index 0000000000..ef93391626 --- /dev/null +++ b/compiler-docs/fe_analyzer/display/trait.DisplayWithDb.html @@ -0,0 +1,5 @@ +DisplayWithDb in fe_analyzer::display - Rust

Trait DisplayWithDb

Source
pub trait DisplayWithDb {
+    // Required method
+    fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result;
+}

Required Methods§

Source

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Implementations on Foreign Types§

Source§

impl<T> DisplayWithDb for &T
where + T: DisplayWithDb + ?Sized,

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/display/trait.Displayable.html b/compiler-docs/fe_analyzer/display/trait.Displayable.html new file mode 100644 index 0000000000..fa0df23414 --- /dev/null +++ b/compiler-docs/fe_analyzer/display/trait.Displayable.html @@ -0,0 +1,10 @@ +Displayable in fe_analyzer::display - Rust

Trait Displayable

Source
pub trait Displayable: DisplayWithDb {
+    // Provided method
+    fn display<'a, 'b>(
+        &'a self,
+        db: &'b dyn AnalyzerDb,
+    ) -> DisplayableWrapper<'b, &'a Self> { ... }
+}

Provided Methods§

Source

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/enum.BinaryOperationError.html b/compiler-docs/fe_analyzer/errors/enum.BinaryOperationError.html new file mode 100644 index 0000000000..d0e5d19402 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/enum.BinaryOperationError.html @@ -0,0 +1,25 @@ +BinaryOperationError in fe_analyzer::errors - Rust

Enum BinaryOperationError

Source
pub enum BinaryOperationError {
+    TypesNotCompatible,
+    TypesNotNumeric,
+    RightTooLarge,
+    RightIsSigned,
+    NotEqualAndUnsigned,
+}
Expand description

Errors that can result from a binary operation

+

Variants§

§

TypesNotCompatible

§

TypesNotNumeric

§

RightTooLarge

§

RightIsSigned

§

NotEqualAndUnsigned

Trait Implementations§

Source§

impl Debug for BinaryOperationError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for BinaryOperationError

Source§

fn eq(&self, other: &BinaryOperationError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for BinaryOperationError

Source§

impl StructuralPartialEq for BinaryOperationError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/enum.IndexingError.html b/compiler-docs/fe_analyzer/errors/enum.IndexingError.html new file mode 100644 index 0000000000..47ec16a5ff --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/enum.IndexingError.html @@ -0,0 +1,22 @@ +IndexingError in fe_analyzer::errors - Rust

Enum IndexingError

Source
pub enum IndexingError {
+    WrongIndexType,
+    NotSubscriptable,
+}
Expand description

Errors that can result from indexing

+

Variants§

§

WrongIndexType

§

NotSubscriptable

Trait Implementations§

Source§

impl Debug for IndexingError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for IndexingError

Source§

fn eq(&self, other: &IndexingError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for IndexingError

Source§

impl StructuralPartialEq for IndexingError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/enum.TypeCoercionError.html b/compiler-docs/fe_analyzer/errors/enum.TypeCoercionError.html new file mode 100644 index 0000000000..5575fc21f9 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/enum.TypeCoercionError.html @@ -0,0 +1,26 @@ +TypeCoercionError in fe_analyzer::errors - Rust

Enum TypeCoercionError

Source
pub enum TypeCoercionError {
+    RequiresToMem,
+    Incompatible,
+    SelfContractType,
+}
Expand description

Errors that can result from an implicit type coercion

+

Variants§

§

RequiresToMem

Value is in storage and must be explicitly moved with .to_mem()

+
§

Incompatible

Value type cannot be coerced to the expected type

+
§

SelfContractType

self contract used where an external contract value is expected

+

Trait Implementations§

Source§

impl Debug for TypeCoercionError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for TypeCoercionError

Source§

fn eq(&self, other: &TypeCoercionError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TypeCoercionError

Source§

impl StructuralPartialEq for TypeCoercionError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.duplicate_name_error.html b/compiler-docs/fe_analyzer/errors/fn.duplicate_name_error.html new file mode 100644 index 0000000000..751bad02c8 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.duplicate_name_error.html @@ -0,0 +1,6 @@ +duplicate_name_error in fe_analyzer::errors - Rust

Function duplicate_name_error

Source
pub fn duplicate_name_error(
+    message: &str,
+    name: &str,
+    original: Span,
+    duplicate: Span,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.error.html b/compiler-docs/fe_analyzer/errors/fn.error.html new file mode 100644 index 0000000000..4c55b98f52 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.error.html @@ -0,0 +1,5 @@ +error in fe_analyzer::errors - Rust

Function error

Source
pub fn error(
+    message: impl Into<String>,
+    label_span: Span,
+    label: impl Into<String>,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.fancy_error.html b/compiler-docs/fe_analyzer/errors/fn.fancy_error.html new file mode 100644 index 0000000000..c27dc869d3 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.fancy_error.html @@ -0,0 +1,5 @@ +fancy_error in fe_analyzer::errors - Rust

Function fancy_error

Source
pub fn fancy_error(
+    message: impl Into<String>,
+    labels: Vec<Label>,
+    notes: Vec<String>,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.name_conflict_error.html b/compiler-docs/fe_analyzer/errors/fn.name_conflict_error.html new file mode 100644 index 0000000000..5f028c8a25 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.name_conflict_error.html @@ -0,0 +1,7 @@ +name_conflict_error in fe_analyzer::errors - Rust

Function name_conflict_error

Source
pub fn name_conflict_error(
+    name_kind: &str,
+    name: &str,
+    original: &NamedThing,
+    original_span: Option<Span>,
+    duplicate_span: Span,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.not_yet_implemented.html b/compiler-docs/fe_analyzer/errors/fn.not_yet_implemented.html new file mode 100644 index 0000000000..e6b7f25353 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.not_yet_implemented.html @@ -0,0 +1 @@ +not_yet_implemented in fe_analyzer::errors - Rust

Function not_yet_implemented

Source
pub fn not_yet_implemented(feature: impl Display, span: Span) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.self_contract_type_error.html b/compiler-docs/fe_analyzer/errors/fn.self_contract_type_error.html new file mode 100644 index 0000000000..1d53810ab0 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.self_contract_type_error.html @@ -0,0 +1 @@ +self_contract_type_error in fe_analyzer::errors - Rust

Function self_contract_type_error

Source
pub fn self_contract_type_error(span: Span, typ: &dyn Display) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.to_mem_error.html b/compiler-docs/fe_analyzer/errors/fn.to_mem_error.html new file mode 100644 index 0000000000..b5b5876827 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.to_mem_error.html @@ -0,0 +1 @@ +to_mem_error in fe_analyzer::errors - Rust

Function to_mem_error

Source
pub fn to_mem_error(span: Span) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/fn.type_error.html b/compiler-docs/fe_analyzer/errors/fn.type_error.html new file mode 100644 index 0000000000..964c33edc9 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/fn.type_error.html @@ -0,0 +1,6 @@ +type_error in fe_analyzer::errors - Rust

Function type_error

Source
pub fn type_error(
+    message: impl Into<String>,
+    span: Span,
+    expected: impl Display,
+    actual: impl Display,
+) -> Diagnostic
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/index.html b/compiler-docs/fe_analyzer/errors/index.html new file mode 100644 index 0000000000..21d1532fc0 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/index.html @@ -0,0 +1,7 @@ +fe_analyzer::errors - Rust

Module errors

Source
Expand description

Semantic errors.

+

Structs§

AlreadyDefined
Error to be returned from APIs that should reject duplicate definitions
ConstEvalError
Error indicating constant evaluation failed.
FatalError
Error to be returned when otherwise no meaningful information can be returned. +Can’t be created unless a diagnostic has been emitted, and thus a DiagnosticVoucher +has been obtained. (See comment on TypeError)
IncompleteItem
Error returned by ModuleId::resolve_name if the name is not found, and parsing of the module +failed. In this case, emitting an error message about failure to resolve the name might be misleading, +because the file may in fact contain an item with the given name, somewhere after the syntax error that caused +parsing to fail.
TypeError
Error indicating that a type is invalid.

Enums§

BinaryOperationError
Errors that can result from a binary operation
IndexingError
Errors that can result from indexing
TypeCoercionError
Errors that can result from an implicit type coercion

Functions§

duplicate_name_error
error
fancy_error
name_conflict_error
not_yet_implemented
self_contract_type_error
to_mem_error
type_error
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/sidebar-items.js b/compiler-docs/fe_analyzer/errors/sidebar-items.js new file mode 100644 index 0000000000..79106423cd --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["BinaryOperationError","IndexingError","TypeCoercionError"],"fn":["duplicate_name_error","error","fancy_error","name_conflict_error","not_yet_implemented","self_contract_type_error","to_mem_error","type_error"],"struct":["AlreadyDefined","ConstEvalError","FatalError","IncompleteItem","TypeError"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.AlreadyDefined.html b/compiler-docs/fe_analyzer/errors/struct.AlreadyDefined.html new file mode 100644 index 0000000000..68bab7222c --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.AlreadyDefined.html @@ -0,0 +1,12 @@ +AlreadyDefined in fe_analyzer::errors - Rust

Struct AlreadyDefined

Source
pub struct AlreadyDefined(/* private fields */);
Expand description

Error to be returned from APIs that should reject duplicate definitions

+

Implementations§

Trait Implementations§

Source§

impl Debug for AlreadyDefined

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<AlreadyDefined> for FatalError

Source§

fn from(err: AlreadyDefined) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.ConstEvalError.html b/compiler-docs/fe_analyzer/errors/struct.ConstEvalError.html new file mode 100644 index 0000000000..d11229c38f --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.ConstEvalError.html @@ -0,0 +1,33 @@ +ConstEvalError in fe_analyzer::errors - Rust

Struct ConstEvalError

Source
pub struct ConstEvalError(/* private fields */);
Expand description

Error indicating constant evaluation failed.

+

This error emitted when

+
    +
  1. an expression can’t be evaluated in compilation time
  2. +
  3. arithmetic overflow occurred during evaluation
  4. +
  5. zero division is detected during evaluation
  6. +
+

Can’t be created unless a diagnostic has been emitted, and thus a DiagnosticVoucher +has been obtained. (See comment on TypeError)

+

NOTE: Clone is required because these are stored in a salsa db. +Please don’t clone these manually.

+

Implementations§

Trait Implementations§

Source§

impl Clone for ConstEvalError

Source§

fn clone(&self) -> ConstEvalError

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstEvalError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<ConstEvalError> for FatalError

Source§

fn from(err: ConstEvalError) -> Self

Converts to this type from the input type.
Source§

impl From<ConstEvalError> for TypeError

Source§

fn from(err: ConstEvalError) -> Self

Converts to this type from the input type.
Source§

impl From<FatalError> for ConstEvalError

Source§

fn from(err: FatalError) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for ConstEvalError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<TypeError> for ConstEvalError

Source§

fn from(err: TypeError) -> Self

Converts to this type from the input type.
Source§

impl Hash for ConstEvalError

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ConstEvalError

Source§

fn eq(&self, other: &ConstEvalError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ConstEvalError

Source§

impl StructuralPartialEq for ConstEvalError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.FatalError.html b/compiler-docs/fe_analyzer/errors/struct.FatalError.html new file mode 100644 index 0000000000..b1dc54341f --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.FatalError.html @@ -0,0 +1,16 @@ +FatalError in fe_analyzer::errors - Rust

Struct FatalError

Source
pub struct FatalError(/* private fields */);
Expand description

Error to be returned when otherwise no meaningful information can be returned. +Can’t be created unless a diagnostic has been emitted, and thus a DiagnosticVoucher +has been obtained. (See comment on TypeError)

+

Implementations§

Source§

impl FatalError

Source

pub fn new(voucher: DiagnosticVoucher) -> Self

Create a FatalError instance, given a “voucher” +obtained by emitting an error via an AnalyzerContext.

+

Trait Implementations§

Source§

impl Debug for FatalError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<AlreadyDefined> for FatalError

Source§

fn from(err: AlreadyDefined) -> Self

Converts to this type from the input type.
Source§

impl From<ConstEvalError> for FatalError

Source§

fn from(err: ConstEvalError) -> Self

Converts to this type from the input type.
Source§

impl From<FatalError> for ConstEvalError

Source§

fn from(err: FatalError) -> Self

Converts to this type from the input type.
Source§

impl From<FatalError> for TypeError

Source§

fn from(err: FatalError) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for FatalError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<TypeError> for FatalError

Source§

fn from(err: TypeError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.IncompleteItem.html b/compiler-docs/fe_analyzer/errors/struct.IncompleteItem.html new file mode 100644 index 0000000000..2c8c7f1f53 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.IncompleteItem.html @@ -0,0 +1,15 @@ +IncompleteItem in fe_analyzer::errors - Rust

Struct IncompleteItem

Source
pub struct IncompleteItem(/* private fields */);
Expand description

Error returned by ModuleId::resolve_name if the name is not found, and parsing of the module +failed. In this case, emitting an error message about failure to resolve the name might be misleading, +because the file may in fact contain an item with the given name, somewhere after the syntax error that caused +parsing to fail.

+

Implementations§

Source§

impl IncompleteItem

Source

pub fn new() -> Self

Trait Implementations§

Source§

impl Debug for IncompleteItem

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<IncompleteItem> for ConstEvalError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for FatalError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for TypeError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/errors/struct.TypeError.html b/compiler-docs/fe_analyzer/errors/struct.TypeError.html new file mode 100644 index 0000000000..b152fe77d0 --- /dev/null +++ b/compiler-docs/fe_analyzer/errors/struct.TypeError.html @@ -0,0 +1,36 @@ +TypeError in fe_analyzer::errors - Rust

Struct TypeError

Source
pub struct TypeError(/* private fields */);
Expand description

Error indicating that a type is invalid.

+

Note that the “type” of a thing (eg the type of a FunctionParam) +in crate::namespace::types is sometimes represented as a +Result<Type, TypeError>.

+

If, for example, a function parameter has an undefined type, we emit a Diagnostic message, +give that parameter a “type” of Err(TypeError), and carry on. If/when that parameter is +used in the function body, we assume that a diagnostic message about the undefined type +has already been emitted, and halt the analysis of the function body.

+

To ensure that that assumption is sound, a diagnostic must be emitted before creating +a TypeError. So that the rust compiler can help us enforce this rule, a TypeError +cannot be constructed without providing a DiagnosticVoucher. A voucher can be obtained +by calling an error function on an AnalyzerContext. +Please don’t try to work around this restriction.

+

Example: TypeError::new(context.error("something is wrong", some_span, "this thing"))

+

Implementations§

Source§

impl TypeError

Source

pub fn new(voucher: DiagnosticVoucher) -> Self

Trait Implementations§

Source§

impl Clone for TypeError

Source§

fn clone(&self) -> TypeError

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<ConstEvalError> for TypeError

Source§

fn from(err: ConstEvalError) -> Self

Converts to this type from the input type.
Source§

impl From<FatalError> for TypeError

Source§

fn from(err: FatalError) -> Self

Converts to this type from the input type.
Source§

impl From<IncompleteItem> for TypeError

Source§

fn from(err: IncompleteItem) -> Self

Converts to this type from the input type.
Source§

impl From<TypeError> for ConstEvalError

Source§

fn from(err: TypeError) -> Self

Converts to this type from the input type.
Source§

impl From<TypeError> for FatalError

Source§

fn from(err: TypeError) -> Self

Converts to this type from the input type.
Source§

impl Hash for TypeError

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeError

Source§

fn eq(&self, other: &TypeError) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TypeError

Source§

impl StructuralPartialEq for TypeError

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/fn.analyze_ingot.html b/compiler-docs/fe_analyzer/fn.analyze_ingot.html new file mode 100644 index 0000000000..86f2e5e22a --- /dev/null +++ b/compiler-docs/fe_analyzer/fn.analyze_ingot.html @@ -0,0 +1,4 @@ +analyze_ingot in fe_analyzer - Rust

Function analyze_ingot

Source
pub fn analyze_ingot(
+    db: &dyn AnalyzerDb,
+    ingot_id: IngotId,
+) -> Result<(), Vec<Diagnostic>>
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/fn.analyze_module.html b/compiler-docs/fe_analyzer/fn.analyze_module.html new file mode 100644 index 0000000000..9c41af7d1c --- /dev/null +++ b/compiler-docs/fe_analyzer/fn.analyze_module.html @@ -0,0 +1,4 @@ +analyze_module in fe_analyzer - Rust

Function analyze_module

Source
pub fn analyze_module(
+    db: &dyn AnalyzerDb,
+    module_id: ModuleId,
+) -> Result<(), Vec<Diagnostic>>
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/index.html b/compiler-docs/fe_analyzer/index.html new file mode 100644 index 0000000000..f2e27b9f9c --- /dev/null +++ b/compiler-docs/fe_analyzer/index.html @@ -0,0 +1,6 @@ +fe_analyzer - Rust

Crate fe_analyzer

Source
Expand description

Fe semantic analysis.

+

This library is used to analyze the semantics of a given Fe AST. It detects +any semantic errors within a given AST and produces a Context instance +that can be used to query contextual information attributed to AST nodes.

+

Re-exports§

pub use db::AnalyzerDb;
pub use db::TestDb;

Modules§

builtins
constants
context
db
display
errors
Semantic errors.
namespace
pattern_analysis
This module includes utility structs and its functions for pattern matching +analysis. The algorithm here is based on Warnings for pattern matching

Functions§

analyze_ingot
analyze_module
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/index.html b/compiler-docs/fe_analyzer/namespace/index.html new file mode 100644 index 0000000000..3720a3591b --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/index.html @@ -0,0 +1 @@ +fe_analyzer::namespace - Rust

Module namespace

Source

Modules§

items
scopes
types
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.DepLocality.html b/compiler-docs/fe_analyzer/namespace/items/enum.DepLocality.html new file mode 100644 index 0000000000..5def51b881 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.DepLocality.html @@ -0,0 +1,26 @@ +DepLocality in fe_analyzer::namespace::items - Rust

Enum DepLocality

Source
pub enum DepLocality {
+    Local,
+    External,
+}
Expand description

DepGraph edge label. “Locality” refers to the deployed state; +Local dependencies are those that will be compiled together, while +External dependencies will only be reachable via an evm CALL* op.

+

Variants§

§

Local

§

External

Trait Implementations§

Source§

impl Clone for DepLocality

Source§

fn clone(&self) -> DepLocality

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DepLocality

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for DepLocality

Source§

fn eq(&self, other: &DepLocality) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for DepLocality

Source§

impl Eq for DepLocality

Source§

impl StructuralPartialEq for DepLocality

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.EnumVariantKind.html b/compiler-docs/fe_analyzer/namespace/items/enum.EnumVariantKind.html new file mode 100644 index 0000000000..a5162b086c --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.EnumVariantKind.html @@ -0,0 +1,29 @@ +EnumVariantKind in fe_analyzer::namespace::items - Rust

Enum EnumVariantKind

Source
pub enum EnumVariantKind {
+    Unit,
+    Tuple(SmallVec<[TypeId; 4]>),
+}

Variants§

§

Unit

§

Tuple(SmallVec<[TypeId; 4]>)

Implementations§

Source§

impl EnumVariantKind

Source

pub fn display_name(&self) -> &'static str

Source

pub fn field_len(&self) -> usize

Source

pub fn is_unit(&self) -> bool

Trait Implementations§

Source§

impl Clone for EnumVariantKind

Source§

fn clone(&self) -> EnumVariantKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumVariantKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for EnumVariantKind

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl Hash for EnumVariantKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EnumVariantKind

Source§

fn eq(&self, other: &EnumVariantKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EnumVariantKind

Source§

impl StructuralPartialEq for EnumVariantKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.IngotMode.html b/compiler-docs/fe_analyzer/namespace/items/enum.IngotMode.html new file mode 100644 index 0000000000..b681730d6b --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.IngotMode.html @@ -0,0 +1,29 @@ +IngotMode in fe_analyzer::namespace::items - Rust

Enum IngotMode

Source
pub enum IngotMode {
+    Main,
+    Lib,
+    StandaloneModule,
+}

Variants§

§

Main

The target of compilation. Expected to have a main.fe file.

+
§

Lib

A library; expected to have a lib.fe file.

+
§

StandaloneModule

A fake ingot, created to hold a single module with any filename.

+

Trait Implementations§

Source§

impl Clone for IngotMode

Source§

fn clone(&self) -> IngotMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for IngotMode

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for IngotMode

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for IngotMode

Source§

fn eq(&self, other: &IngotMode) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for IngotMode

Source§

impl Eq for IngotMode

Source§

impl StructuralPartialEq for IngotMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.Item.html b/compiler-docs/fe_analyzer/namespace/items/enum.Item.html new file mode 100644 index 0000000000..c1b716737b --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.Item.html @@ -0,0 +1,57 @@ +Item in fe_analyzer::namespace::items - Rust

Enum Item

Source
pub enum Item {
+    Ingot(IngotId),
+    Module(ModuleId),
+    Type(TypeDef),
+    GenericType(GenericType),
+    Trait(TraitId),
+    Impl(ImplId),
+    Function(FunctionId),
+    Constant(ModuleConstantId),
+    BuiltinFunction(GlobalFunction),
+    Intrinsic(Intrinsic),
+    Attribute(AttributeId),
+}
Expand description

A named item. This does not include things inside of +a function body.

+

Variants§

§

Ingot(IngotId)

§

Module(ModuleId)

§

Type(TypeDef)

§

GenericType(GenericType)

§

Trait(TraitId)

§

Impl(ImplId)

§

Function(FunctionId)

§

Constant(ModuleConstantId)

§

BuiltinFunction(GlobalFunction)

§

Intrinsic(Intrinsic)

§

Attribute(AttributeId)

Implementations§

Source§

impl Item

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_builtin(&self) -> bool

Source

pub fn is_struct(&self, val: &StructId) -> bool

Source

pub fn is_contract(&self) -> bool

Source

pub fn item_kind_display_name(&self) -> &'static str

Source

pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Option<Item>

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId>

Source

pub fn path(&self, db: &dyn AnalyzerDb) -> Rc<[SmolStr]>

Source

pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Option<Rc<DepGraph>>

Source

pub fn resolve_path_segments( + &self, + db: &dyn AnalyzerDb, + segments: &[Node<SmolStr>], +) -> Analysis<Option<NamedThing>>

Source

pub fn function_sig( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Option<FunctionSigId>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Source

pub fn attributes(&self, db: &dyn AnalyzerDb) -> Vec<AttributeId>

Trait Implementations§

Source§

impl Clone for Item

Source§

fn clone(&self) -> Item

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Item

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Item

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for Item

Source§

fn cmp(&self, other: &Item) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Item

Source§

fn eq(&self, other: &Item) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Item

Source§

fn partial_cmp(&self, other: &Item) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for Item

Source§

impl Eq for Item

Source§

impl StructuralPartialEq for Item

Auto Trait Implementations§

§

impl Freeze for Item

§

impl RefUnwindSafe for Item

§

impl Send for Item

§

impl Sync for Item

§

impl Unpin for Item

§

impl UnwindSafe for Item

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.ModuleSource.html b/compiler-docs/fe_analyzer/namespace/items/enum.ModuleSource.html new file mode 100644 index 0000000000..c11040f90e --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.ModuleSource.html @@ -0,0 +1,27 @@ +ModuleSource in fe_analyzer::namespace::items - Rust

Enum ModuleSource

Source
pub enum ModuleSource {
+    File(SourceFileId),
+    Dir(SmolStr),
+}

Variants§

§

File(SourceFileId)

§

Dir(SmolStr)

For directory modules without a corresponding source file +(which will soon not be allowed, and this variant can go away).

+

Trait Implementations§

Source§

impl Clone for ModuleSource

Source§

fn clone(&self) -> ModuleSource

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleSource

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleSource

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ModuleSource

Source§

fn eq(&self, other: &ModuleSource) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ModuleSource

Source§

impl StructuralPartialEq for ModuleSource

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/enum.TypeDef.html b/compiler-docs/fe_analyzer/namespace/items/enum.TypeDef.html new file mode 100644 index 0000000000..ce6f9cb4c5 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/enum.TypeDef.html @@ -0,0 +1,41 @@ +TypeDef in fe_analyzer::namespace::items - Rust

Enum TypeDef

Source
pub enum TypeDef {
+    Alias(TypeAliasId),
+    Struct(StructId),
+    Enum(EnumId),
+    Contract(ContractId),
+    Primitive(Base),
+}

Variants§

§

Alias(TypeAliasId)

§

Struct(StructId)

§

Enum(EnumId)

§

Contract(ContractId)

§

Primitive(Base)

Implementations§

Source§

impl TypeDef

Source

pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>>

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<Type, TypeError>

Source

pub fn type_id(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Option<Item>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for TypeDef

Source§

fn clone(&self) -> TypeDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for TypeDef

Source§

fn cmp(&self, other: &TypeDef) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for TypeDef

Source§

fn eq(&self, other: &TypeDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for TypeDef

Source§

fn partial_cmp(&self, other: &TypeDef) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for TypeDef

Source§

impl Eq for TypeDef

Source§

impl StructuralPartialEq for TypeDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/fn.builtin_items.html b/compiler-docs/fe_analyzer/namespace/items/fn.builtin_items.html new file mode 100644 index 0000000000..31b4c0fec9 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/fn.builtin_items.html @@ -0,0 +1 @@ +builtin_items in fe_analyzer::namespace::items - Rust

Function builtin_items

Source
pub fn builtin_items() -> IndexMap<SmolStr, Item>
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/fn.walk_local_dependencies.html b/compiler-docs/fe_analyzer/namespace/items/fn.walk_local_dependencies.html new file mode 100644 index 0000000000..948559add9 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/fn.walk_local_dependencies.html @@ -0,0 +1,2 @@ +walk_local_dependencies in fe_analyzer::namespace::items - Rust

Function walk_local_dependencies

Source
pub fn walk_local_dependencies<F>(graph: &DepGraph, root: Item, fun: F)
where + F: FnMut(Item),
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/index.html b/compiler-docs/fe_analyzer/namespace/items/index.html new file mode 100644 index 0000000000..8f2b9f2d3d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/index.html @@ -0,0 +1,6 @@ +fe_analyzer::namespace::items - Rust

Module items

Source

Structs§

Attribute
AttributeId
Contract
ContractField
ContractFieldId
ContractId
DepGraphWrapper
Enum
EnumId
EnumVariant
EnumVariantId
Function
FunctionId
FunctionSig
FunctionSigId
Impl
ImplId
Ingot
An Ingot is composed of a tree of Modules (set via +[AnalyzerDb::set_ingot_module_tree]), and doesn’t have direct knowledge of +files.
IngotId
Module
ModuleConstant
ModuleConstantId
ModuleId
Id of a Module, which corresponds to a single Fe source file.
Struct
StructField
StructFieldId
StructId
Trait
TraitId
TypeAlias
TypeAliasId

Enums§

DepLocality
DepGraph edge label. “Locality” refers to the deployed state; +Local dependencies are those that will be compiled together, while +External dependencies will only be reachable via an evm CALL* op.
EnumVariantKind
IngotMode
Item
A named item. This does not include things inside of +a function body.
ModuleSource
TypeDef

Traits§

DiagnosticSink

Functions§

builtin_items
walk_local_dependencies

Type Aliases§

DepGraph
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/sidebar-items.js b/compiler-docs/fe_analyzer/namespace/items/sidebar-items.js new file mode 100644 index 0000000000..97139cad16 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["DepLocality","EnumVariantKind","IngotMode","Item","ModuleSource","TypeDef"],"fn":["builtin_items","walk_local_dependencies"],"struct":["Attribute","AttributeId","Contract","ContractField","ContractFieldId","ContractId","DepGraphWrapper","Enum","EnumId","EnumVariant","EnumVariantId","Function","FunctionId","FunctionSig","FunctionSigId","Impl","ImplId","Ingot","IngotId","Module","ModuleConstant","ModuleConstantId","ModuleId","Struct","StructField","StructFieldId","StructId","Trait","TraitId","TypeAlias","TypeAliasId"],"trait":["DiagnosticSink"],"type":["DepGraph"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Attribute.html b/compiler-docs/fe_analyzer/namespace/items/struct.Attribute.html new file mode 100644 index 0000000000..89d9ef4004 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Attribute.html @@ -0,0 +1,25 @@ +Attribute in fe_analyzer::namespace::items - Rust

Struct Attribute

Source
pub struct Attribute {
+    pub ast: Node<SmolStr>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<SmolStr>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Attribute

Source§

fn clone(&self) -> Attribute

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Attribute

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Attribute

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Attribute

Source§

fn eq(&self, other: &Attribute) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Attribute

Source§

impl StructuralPartialEq for Attribute

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.AttributeId.html b/compiler-docs/fe_analyzer/namespace/items/struct.AttributeId.html new file mode 100644 index 0000000000..c6489f4fc8 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.AttributeId.html @@ -0,0 +1,31 @@ +AttributeId in fe_analyzer::namespace::items - Rust

Struct AttributeId

Source
pub struct AttributeId(/* private fields */);

Implementations§

Source§

impl AttributeId

Source

pub fn data(self, db: &dyn AnalyzerDb) -> Rc<Attribute>

Source

pub fn span(self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn module(self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn parent(self, db: &dyn AnalyzerDb) -> Item

Trait Implementations§

Source§

impl Clone for AttributeId

Source§

fn clone(&self) -> AttributeId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AttributeId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for AttributeId

Source§

fn default() -> AttributeId

Returns the “default value” for a type. Read more
Source§

impl Hash for AttributeId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for AttributeId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for AttributeId

Source§

fn cmp(&self, other: &AttributeId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for AttributeId

Source§

fn eq(&self, other: &AttributeId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for AttributeId

Source§

fn partial_cmp(&self, other: &AttributeId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for AttributeId

Source§

impl Eq for AttributeId

Source§

impl StructuralPartialEq for AttributeId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Contract.html b/compiler-docs/fe_analyzer/namespace/items/struct.Contract.html new file mode 100644 index 0000000000..d219bca379 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Contract.html @@ -0,0 +1,26 @@ +Contract in fe_analyzer::namespace::items - Rust

Struct Contract

Source
pub struct Contract {
+    pub name: SmolStr,
+    pub ast: Node<Contract>,
+    pub module: ModuleId,
+}

Fields§

§name: SmolStr§ast: Node<Contract>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Contract

Source§

fn clone(&self) -> Contract

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Contract

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Contract

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Contract

Source§

fn eq(&self, other: &Contract) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Contract

Source§

impl StructuralPartialEq for Contract

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ContractField.html b/compiler-docs/fe_analyzer/namespace/items/struct.ContractField.html new file mode 100644 index 0000000000..3324f30471 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ContractField.html @@ -0,0 +1,25 @@ +ContractField in fe_analyzer::namespace::items - Rust

Struct ContractField

Source
pub struct ContractField {
+    pub ast: Node<Field>,
+    pub parent: ContractId,
+}

Fields§

§ast: Node<Field>§parent: ContractId

Trait Implementations§

Source§

impl Clone for ContractField

Source§

fn clone(&self) -> ContractField

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractField

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ContractField

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ContractField

Source§

fn eq(&self, other: &ContractField) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ContractField

Source§

impl StructuralPartialEq for ContractField

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ContractFieldId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ContractFieldId.html new file mode 100644 index 0000000000..7c9a6ecd43 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ContractFieldId.html @@ -0,0 +1,35 @@ +ContractFieldId in fe_analyzer::namespace::items - Rust

Struct ContractFieldId

Source
pub struct ContractFieldId(/* private fields */);

Implementations§

Source§

impl ContractFieldId

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<ContractField>

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ContractFieldId

Source§

fn clone(&self) -> ContractFieldId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractFieldId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ContractFieldId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ContractFieldId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ContractFieldId

Source§

fn cmp(&self, other: &ContractFieldId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ContractFieldId

Source§

fn eq(&self, other: &ContractFieldId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ContractFieldId

Source§

fn partial_cmp(&self, other: &ContractFieldId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ContractFieldId

Source§

impl Eq for ContractFieldId

Source§

impl StructuralPartialEq for ContractFieldId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ContractId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ContractId.html new file mode 100644 index 0000000000..dd41bdb5c2 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ContractId.html @@ -0,0 +1,61 @@ +ContractId in fe_analyzer::namespace::items - Rust

Struct ContractId

Source
pub struct ContractId(/* private fields */);

Implementations§

Source§

impl ContractId

Source

pub fn as_type(&self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Contract>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn fields( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, ContractFieldId>>

Source

pub fn field_type( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Option<Result<TypeId, TypeError>>

Source

pub fn resolve_name( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Result<Option<NamedThing>, IncompleteItem>

Source

pub fn init_function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId>

Source

pub fn call_function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId>

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

User functions, public and not. Excludes __init__ and __call__.

+
Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId>

Lookup a function by name. Searches all user functions, private or not. +Excludes __init__ and __call__.

+
Source

pub fn public_functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Excludes __init__ and __call__.

+
Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Dependency graph of the contract type, which consists of the field types +and the dependencies of those types.

+

NOTE: Contract items should only

+
Source

pub fn runtime_dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Dependency graph of the (imaginary) __call__ function, which +dispatches to the contract’s public functions.

+
Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ContractId

Source§

fn clone(&self) -> ContractId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ContractId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ContractId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ContractId

Source§

fn cmp(&self, other: &ContractId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ContractId

Source§

fn eq(&self, other: &ContractId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ContractId

Source§

fn partial_cmp(&self, other: &ContractId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ContractId

Source§

impl Eq for ContractId

Source§

impl StructuralPartialEq for ContractId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.DepGraphWrapper.html b/compiler-docs/fe_analyzer/namespace/items/struct.DepGraphWrapper.html new file mode 100644 index 0000000000..b3497021a7 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.DepGraphWrapper.html @@ -0,0 +1,20 @@ +DepGraphWrapper in fe_analyzer::namespace::items - Rust

Struct DepGraphWrapper

Source
pub struct DepGraphWrapper(pub Rc<DepGraph>);

Tuple Fields§

§0: Rc<DepGraph>

Trait Implementations§

Source§

impl Clone for DepGraphWrapper

Source§

fn clone(&self) -> DepGraphWrapper

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DepGraphWrapper

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for DepGraphWrapper

Source§

fn eq(&self, other: &DepGraphWrapper) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for DepGraphWrapper

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Enum.html b/compiler-docs/fe_analyzer/namespace/items/struct.Enum.html new file mode 100644 index 0000000000..79a4e3b9ff --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Enum.html @@ -0,0 +1,25 @@ +Enum in fe_analyzer::namespace::items - Rust

Struct Enum

Source
pub struct Enum {
+    pub ast: Node<Enum>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<Enum>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Enum

Source§

fn clone(&self) -> Enum

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Enum

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Enum

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Enum

Source§

fn eq(&self, other: &Enum) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Enum

Source§

impl StructuralPartialEq for Enum

Auto Trait Implementations§

§

impl Freeze for Enum

§

impl RefUnwindSafe for Enum

§

impl Send for Enum

§

impl Sync for Enum

§

impl Unpin for Enum

§

impl UnwindSafe for Enum

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.EnumId.html b/compiler-docs/fe_analyzer/namespace/items/struct.EnumId.html new file mode 100644 index 0000000000..ae77c7b576 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.EnumId.html @@ -0,0 +1,41 @@ +EnumId in fe_analyzer::namespace::items - Rust

Struct EnumId

Source
pub struct EnumId(/* private fields */);

Implementations§

Source§

impl EnumId

Source

pub fn data(self, db: &dyn AnalyzerDb) -> Rc<Enum>

Source

pub fn span(self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(self, db: &dyn AnalyzerDb) -> Span

Source

pub fn as_type(self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn is_public(self, db: &dyn AnalyzerDb) -> bool

Source

pub fn variant(self, db: &dyn AnalyzerDb, name: &str) -> Option<EnumVariantId>

Source

pub fn variants( + self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, EnumVariantId>>

Source

pub fn module(self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn parent(self, db: &dyn AnalyzerDb) -> Item

Source

pub fn dependency_graph(self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId>

Source

pub fn sink_diagnostics( + self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for EnumId

Source§

fn clone(&self) -> EnumId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for EnumId

Source§

fn default() -> EnumId

Returns the “default value” for a type. Read more
Source§

impl Hash for EnumId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for EnumId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for EnumId

Source§

fn cmp(&self, other: &EnumId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for EnumId

Source§

fn eq(&self, other: &EnumId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for EnumId

Source§

fn partial_cmp(&self, other: &EnumId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for EnumId

Source§

impl Eq for EnumId

Source§

impl StructuralPartialEq for EnumId

Auto Trait Implementations§

§

impl Freeze for EnumId

§

impl RefUnwindSafe for EnumId

§

impl Send for EnumId

§

impl Sync for EnumId

§

impl Unpin for EnumId

§

impl UnwindSafe for EnumId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariant.html b/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariant.html new file mode 100644 index 0000000000..081086ef57 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariant.html @@ -0,0 +1,26 @@ +EnumVariant in fe_analyzer::namespace::items - Rust

Struct EnumVariant

Source
pub struct EnumVariant {
+    pub ast: Node<Variant>,
+    pub tag: usize,
+    pub parent: EnumId,
+}

Fields§

§ast: Node<Variant>§tag: usize§parent: EnumId

Trait Implementations§

Source§

impl Clone for EnumVariant

Source§

fn clone(&self) -> EnumVariant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumVariant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EnumVariant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EnumVariant

Source§

fn eq(&self, other: &EnumVariant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EnumVariant

Source§

impl StructuralPartialEq for EnumVariant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariantId.html b/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariantId.html new file mode 100644 index 0000000000..7fd4822972 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.EnumVariantId.html @@ -0,0 +1,35 @@ +EnumVariantId in fe_analyzer::namespace::items - Rust

Struct EnumVariantId

Source
pub struct EnumVariantId(/* private fields */);

Implementations§

Source§

impl EnumVariantId

Source

pub fn data(self, db: &dyn AnalyzerDb) -> Rc<EnumVariant>

Source

pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn span(self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name_with_parent(self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn kind(self, db: &dyn AnalyzerDb) -> Result<EnumVariantKind, TypeError>

Source

pub fn disc(self, db: &dyn AnalyzerDb) -> usize

Source

pub fn sink_diagnostics( + self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Source

pub fn parent(self, db: &dyn AnalyzerDb) -> EnumId

Trait Implementations§

Source§

impl Clone for EnumVariantId

Source§

fn clone(&self) -> EnumVariantId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumVariantId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EnumVariantId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for EnumVariantId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for EnumVariantId

Source§

fn cmp(&self, other: &EnumVariantId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for EnumVariantId

Source§

fn eq(&self, other: &EnumVariantId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for EnumVariantId

Source§

fn partial_cmp(&self, other: &EnumVariantId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for EnumVariantId

Source§

impl Eq for EnumVariantId

Source§

impl StructuralPartialEq for EnumVariantId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Function.html b/compiler-docs/fe_analyzer/namespace/items/struct.Function.html new file mode 100644 index 0000000000..79f20cfa93 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Function.html @@ -0,0 +1,30 @@ +Function in fe_analyzer::namespace::items - Rust

Struct Function

Source
pub struct Function {
+    pub ast: Node<Function>,
+    pub sig: FunctionSigId,
+}

Fields§

§ast: Node<Function>§sig: FunctionSigId

Implementations§

Source§

impl Function

Source

pub fn new( + db: &dyn AnalyzerDb, + ast: &Node<Function>, + parent: Option<Item>, + module: ModuleId, +) -> Self

Trait Implementations§

Source§

impl Clone for Function

Source§

fn clone(&self) -> Function

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Function

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Function

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Function

Source§

fn eq(&self, other: &Function) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Function

Source§

impl StructuralPartialEq for Function

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.FunctionId.html b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionId.html new file mode 100644 index 0000000000..6dc9132790 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionId.html @@ -0,0 +1,35 @@ +FunctionId in fe_analyzer::namespace::items - Rust

Struct FunctionId

Source
pub struct FunctionId(/* private fields */);

Implementations§

Source§

impl FunctionId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Function>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn self_type(&self, db: &dyn AnalyzerDb) -> Option<TypeId>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn takes_self(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn self_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_constructor(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_unsafe(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn unsafe_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn signature(&self, db: &dyn AnalyzerDb) -> Rc<FunctionSignature>

Source

pub fn sig(&self, db: &dyn AnalyzerDb) -> FunctionSigId

Source

pub fn body(&self, db: &dyn AnalyzerDb) -> Rc<FunctionBody>

Source

pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Source

pub fn is_contract_func(self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_test(&self, db: &dyn AnalyzerDb) -> bool

Trait Implementations§

Source§

impl Clone for FunctionId

Source§

fn clone(&self) -> FunctionId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for FunctionId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for FunctionId

Source§

fn cmp(&self, other: &FunctionId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for FunctionId

Source§

fn eq(&self, other: &FunctionId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for FunctionId

Source§

fn partial_cmp(&self, other: &FunctionId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for FunctionId

Source§

impl Eq for FunctionId

Source§

impl StructuralPartialEq for FunctionId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSig.html b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSig.html new file mode 100644 index 0000000000..c64555df44 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSig.html @@ -0,0 +1,26 @@ +FunctionSig in fe_analyzer::namespace::items - Rust

Struct FunctionSig

Source
pub struct FunctionSig {
+    pub ast: Node<FunctionSignature>,
+    pub parent: Option<Item>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<FunctionSignature>§parent: Option<Item>§module: ModuleId

Trait Implementations§

Source§

impl Clone for FunctionSig

Source§

fn clone(&self) -> FunctionSig

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSig

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionSig

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionSig

Source§

fn eq(&self, other: &FunctionSig) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionSig

Source§

impl StructuralPartialEq for FunctionSig

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSigId.html b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSigId.html new file mode 100644 index 0000000000..f62e24b02d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.FunctionSigId.html @@ -0,0 +1,40 @@ +FunctionSigId in fe_analyzer::namespace::items - Rust

Struct FunctionSigId

Source
pub struct FunctionSigId(/* private fields */);

Implementations§

Source§

impl FunctionSigId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<FunctionSig>

Source

pub fn takes_self(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn self_type(&self, db: &dyn AnalyzerDb) -> Option<TypeId>

Source

pub fn self_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn signature(&self, db: &dyn AnalyzerDb) -> Rc<FunctionSignature>

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn unsafe_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn is_constructor(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn pub_span(&self, db: &dyn AnalyzerDb) -> Option<Span>

Source

pub fn self_item(&self, db: &dyn AnalyzerDb) -> Option<Item>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId>

Looks up the FunctionId based on the parent of the function signature

+
Source

pub fn is_trait_fn(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_module_fn(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_impl_fn(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn generic_params(&self, db: &dyn AnalyzerDb) -> Vec<GenericParameter>

Source

pub fn generic_param( + &self, + db: &dyn AnalyzerDb, + param_name: &str, +) -> Option<GenericParameter>

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn is_contract_func(self, db: &dyn AnalyzerDb) -> bool

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for FunctionSigId

Source§

fn clone(&self) -> FunctionSigId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSigId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionSigId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for FunctionSigId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for FunctionSigId

Source§

fn cmp(&self, other: &FunctionSigId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for FunctionSigId

Source§

fn eq(&self, other: &FunctionSigId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for FunctionSigId

Source§

fn partial_cmp(&self, other: &FunctionSigId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for FunctionSigId

Source§

impl Eq for FunctionSigId

Source§

impl StructuralPartialEq for FunctionSigId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Impl.html b/compiler-docs/fe_analyzer/namespace/items/struct.Impl.html new file mode 100644 index 0000000000..ee3a86ef9a --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Impl.html @@ -0,0 +1,27 @@ +Impl in fe_analyzer::namespace::items - Rust

Struct Impl

Source
pub struct Impl {
+    pub trait_id: TraitId,
+    pub receiver: TypeId,
+    pub module: ModuleId,
+    pub ast: Node<Impl>,
+}

Fields§

§trait_id: TraitId§receiver: TypeId§module: ModuleId§ast: Node<Impl>

Trait Implementations§

Source§

impl Clone for Impl

Source§

fn clone(&self) -> Impl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Impl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Impl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Impl

Source§

fn eq(&self, other: &Impl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Impl

Source§

impl StructuralPartialEq for Impl

Auto Trait Implementations§

§

impl Freeze for Impl

§

impl RefUnwindSafe for Impl

§

impl Send for Impl

§

impl Sync for Impl

§

impl Unpin for Impl

§

impl UnwindSafe for Impl

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ImplId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ImplId.html new file mode 100644 index 0000000000..48a89f95b5 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ImplId.html @@ -0,0 +1,46 @@ +ImplId in fe_analyzer::namespace::items - Rust

Struct ImplId

Source
pub struct ImplId(/* private fields */);

Implementations§

Source§

impl ImplId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Impl>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]>

Source

pub fn trait_id(&self, db: &dyn AnalyzerDb) -> TraitId

Source

pub fn receiver(&self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn is_receiver_type(&self, other: TypeId, db: &dyn AnalyzerDb) -> bool

Returns true if other either is Self or the type of the receiver

+
Source

pub fn can_stand_in_for( + &self, + db: &dyn AnalyzerDb, + type_in_impl: TypeId, + type_in_trait: TypeId, +) -> bool

Returns true if the type_in_impl can stand in for the type_in_trait as a type used +for a parameter or as a return type

+
Source

pub fn ast(&self, db: &dyn AnalyzerDb) -> Node<Impl>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ImplId

Source§

fn clone(&self) -> ImplId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ImplId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for ImplId

Source§

fn default() -> ImplId

Returns the “default value” for a type. Read more
Source§

impl Hash for ImplId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ImplId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ImplId

Source§

fn cmp(&self, other: &ImplId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ImplId

Source§

fn eq(&self, other: &ImplId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ImplId

Source§

fn partial_cmp(&self, other: &ImplId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ImplId

Source§

impl Eq for ImplId

Source§

impl StructuralPartialEq for ImplId

Auto Trait Implementations§

§

impl Freeze for ImplId

§

impl RefUnwindSafe for ImplId

§

impl Send for ImplId

§

impl Sync for ImplId

§

impl Unpin for ImplId

§

impl UnwindSafe for ImplId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Ingot.html b/compiler-docs/fe_analyzer/namespace/items/struct.Ingot.html new file mode 100644 index 0000000000..058e5650ed --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Ingot.html @@ -0,0 +1,29 @@ +Ingot in fe_analyzer::namespace::items - Rust

Struct Ingot

Source
pub struct Ingot {
+    pub name: SmolStr,
+    pub mode: IngotMode,
+    pub src_dir: SmolStr,
+}
Expand description

An Ingot is composed of a tree of Modules (set via +[AnalyzerDb::set_ingot_module_tree]), and doesn’t have direct knowledge of +files.

+

Fields§

§name: SmolStr§mode: IngotMode§src_dir: SmolStr

Trait Implementations§

Source§

impl Clone for Ingot

Source§

fn clone(&self) -> Ingot

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Ingot

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Ingot

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Ingot

Source§

fn eq(&self, other: &Ingot) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Ingot

Source§

impl StructuralPartialEq for Ingot

Auto Trait Implementations§

§

impl Freeze for Ingot

§

impl RefUnwindSafe for Ingot

§

impl Send for Ingot

§

impl Sync for Ingot

§

impl Unpin for Ingot

§

impl UnwindSafe for Ingot

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.IngotId.html b/compiler-docs/fe_analyzer/namespace/items/struct.IngotId.html new file mode 100644 index 0000000000..4a789eba51 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.IngotId.html @@ -0,0 +1,53 @@ +IngotId in fe_analyzer::namespace::items - Rust

Struct IngotId

Source
pub struct IngotId(/* private fields */);

Implementations§

Source§

impl IngotId

Source

pub fn std_lib(db: &mut dyn AnalyzerDb) -> Self

Source

pub fn from_build_files( + db: &mut dyn AnalyzerDb, + build_files: &BuildFiles, +) -> Self

Source

pub fn from_files( + db: &mut dyn AnalyzerDb, + name: &str, + mode: IngotMode, + file_kind: FileKind, + files: &[(impl AsRef<str>, impl AsRef<str>)], +) -> Self

Source

pub fn external_ingots( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, IngotId>>

Source

pub fn all_modules(&self, db: &dyn AnalyzerDb) -> Rc<[ModuleId]>

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Ingot>

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn root_module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId>

Returns the main.fe, or lib.fe module, depending on the ingot “mode” +(IngotMode).

+
Source

pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>>

Source

pub fn diagnostics(&self, db: &dyn AnalyzerDb) -> Vec<Diagnostic>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Source

pub fn sink_external_ingot_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for IngotId

Source§

fn clone(&self) -> IngotId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for IngotId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for IngotId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for IngotId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for IngotId

Source§

fn cmp(&self, other: &IngotId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for IngotId

Source§

fn eq(&self, other: &IngotId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for IngotId

Source§

fn partial_cmp(&self, other: &IngotId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for IngotId

Source§

impl Eq for IngotId

Source§

impl StructuralPartialEq for IngotId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Module.html b/compiler-docs/fe_analyzer/namespace/items/struct.Module.html new file mode 100644 index 0000000000..72a0d33237 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Module.html @@ -0,0 +1,26 @@ +Module in fe_analyzer::namespace::items - Rust

Struct Module

Source
pub struct Module {
+    pub name: SmolStr,
+    pub ingot: IngotId,
+    pub source: ModuleSource,
+}

Fields§

§name: SmolStr§ingot: IngotId§source: ModuleSource

Trait Implementations§

Source§

impl Clone for Module

Source§

fn clone(&self) -> Module

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Module

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Module

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Module

Source§

fn eq(&self, other: &Module) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Module

Source§

impl StructuralPartialEq for Module

Auto Trait Implementations§

§

impl Freeze for Module

§

impl RefUnwindSafe for Module

§

impl Send for Module

§

impl Sync for Module

§

impl Unpin for Module

§

impl UnwindSafe for Module

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstant.html b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstant.html new file mode 100644 index 0000000000..8621ae699e --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstant.html @@ -0,0 +1,25 @@ +ModuleConstant in fe_analyzer::namespace::items - Rust

Struct ModuleConstant

Source
pub struct ModuleConstant {
+    pub ast: Node<ConstantDecl>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<ConstantDecl>§module: ModuleId

Trait Implementations§

Source§

impl Clone for ModuleConstant

Source§

fn clone(&self) -> ModuleConstant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleConstant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleConstant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ModuleConstant

Source§

fn eq(&self, other: &ModuleConstant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ModuleConstant

Source§

impl StructuralPartialEq for ModuleConstant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstantId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstantId.html new file mode 100644 index 0000000000..4599d025b6 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleConstantId.html @@ -0,0 +1,38 @@ +ModuleConstantId in fe_analyzer::namespace::items - Rust

Struct ModuleConstantId

Source
pub struct ModuleConstantId(/* private fields */);

Implementations§

Source§

impl ModuleConstantId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<ModuleConstant>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn constant_value( + &self, + db: &dyn AnalyzerDb, +) -> Result<Constant, ConstEvalError>

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn value(&self, db: &dyn AnalyzerDb) -> Expr

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn node_id(&self, db: &dyn AnalyzerDb) -> NodeId

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ModuleConstantId

Source§

fn clone(&self) -> ModuleConstantId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleConstantId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleConstantId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ModuleConstantId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ModuleConstantId

Source§

fn cmp(&self, other: &ModuleConstantId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ModuleConstantId

Source§

fn eq(&self, other: &ModuleConstantId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ModuleConstantId

Source§

fn partial_cmp(&self, other: &ModuleConstantId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ModuleConstantId

Source§

impl Eq for ModuleConstantId

Source§

impl StructuralPartialEq for ModuleConstantId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.ModuleId.html b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleId.html new file mode 100644 index 0000000000..8c57f250c4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.ModuleId.html @@ -0,0 +1,96 @@ +ModuleId in fe_analyzer::namespace::items - Rust

Struct ModuleId

Source
pub struct ModuleId(/* private fields */);
Expand description

Id of a Module, which corresponds to a single Fe source file.

+

Implementations§

Source§

impl ModuleId

Source

pub fn new_standalone( + db: &mut dyn AnalyzerDb, + path: &str, + content: &str, +) -> Self

Source

pub fn new( + db: &dyn AnalyzerDb, + name: &str, + source: ModuleSource, + ingot: IngotId, +) -> Self

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Module>

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn file_path_relative_to_src_dir(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn ast(&self, db: &dyn AnalyzerDb) -> Rc<Module>

Source

pub fn ingot(&self, db: &dyn AnalyzerDb) -> IngotId

Source

pub fn is_incomplete(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_in_std(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn all_items(&self, db: &dyn AnalyzerDb) -> Rc<[Item]>

Includes duplicate names

+
Source

pub fn all_impls(&self, db: &dyn AnalyzerDb) -> Rc<[ImplId]>

Includes duplicate names

+
Source

pub fn impls( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<(TraitId, TypeId), ImplId>>

Source

pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>>

Returns a map of the named items in the module

+
Source

pub fn used_items( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, (Span, Item)>>

Returns a name -> (name_span, external_item) map for all use +statements in a module.

+
Source

pub fn tests(&self, db: &dyn AnalyzerDb) -> Vec<FunctionId>

Source

pub fn is_in_scope(&self, db: &dyn AnalyzerDb, item: Item) -> bool

Returns true if the item is in scope of the module.

+
Source

pub fn non_used_internal_items( + &self, + db: &dyn AnalyzerDb, +) -> IndexMap<SmolStr, Item>

Returns all of the internal items, except for used items. This is used +when resolving use statements, as it does not create a query +cycle.

+
Source

pub fn internal_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item>

Returns all of the internal items. Internal items refers to the set of +items visible when inside of a module.

+
Source

pub fn resolve_path( + &self, + db: &dyn AnalyzerDb, + path: &Path, +) -> Analysis<Option<NamedThing>>

Resolve a path that starts with an item defined in the module.

+
Source

pub fn resolve_path_non_used_internal( + &self, + db: &dyn AnalyzerDb, + path: &Path, +) -> Analysis<Option<NamedThing>>

Resolve a path that starts with an internal item. We omit used items to +avoid a query cycle.

+
Source

pub fn resolve_path_internal( + &self, + db: &dyn AnalyzerDb, + path: &Path, +) -> Analysis<Option<NamedThing>>

Resolve a path that starts with an internal item.

+
Source

pub fn resolve_name( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Result<Option<NamedThing>, IncompleteItem>

Returns Err(IncompleteItem) if the name could not be resolved, and the +module was not completely parsed (due to a syntax error).

+
Source

pub fn resolve_constant( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Result<Option<ModuleConstantId>, IncompleteItem>

Source

pub fn submodules(&self, db: &dyn AnalyzerDb) -> Rc<[ModuleId]>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn parent_module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId>

Source

pub fn all_contracts(&self, db: &dyn AnalyzerDb) -> Vec<ContractId>

All contracts, including from submodules and including duplicates

+
Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Vec<FunctionId>

All functions, including from submodules and including duplicates

+
Source

pub fn global_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item>

Returns the map of ingot deps, built-ins, and the ingot itself as +“ingot”.

+
Source

pub fn all_constants(&self, db: &dyn AnalyzerDb) -> Rc<Vec<ModuleConstantId>>

All module constants.

+
Source

pub fn diagnostics(&self, db: &dyn AnalyzerDb) -> Vec<Diagnostic>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for ModuleId

Source§

fn clone(&self) -> ModuleId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ModuleId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for ModuleId

Source§

fn cmp(&self, other: &ModuleId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for ModuleId

Source§

fn eq(&self, other: &ModuleId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for ModuleId

Source§

fn partial_cmp(&self, other: &ModuleId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for ModuleId

Source§

impl Eq for ModuleId

Source§

impl StructuralPartialEq for ModuleId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Struct.html b/compiler-docs/fe_analyzer/namespace/items/struct.Struct.html new file mode 100644 index 0000000000..00de9326eb --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Struct.html @@ -0,0 +1,25 @@ +Struct in fe_analyzer::namespace::items - Rust

Struct Struct

Source
pub struct Struct {
+    pub ast: Node<Struct>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<Struct>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Struct

Source§

fn clone(&self) -> Struct

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Struct

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Struct

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Struct

Source§

fn eq(&self, other: &Struct) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Struct

Source§

impl StructuralPartialEq for Struct

Auto Trait Implementations§

§

impl Freeze for Struct

§

impl RefUnwindSafe for Struct

§

impl Send for Struct

§

impl Sync for Struct

§

impl Unpin for Struct

§

impl UnwindSafe for Struct

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.StructField.html b/compiler-docs/fe_analyzer/namespace/items/struct.StructField.html new file mode 100644 index 0000000000..f279d43f4c --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.StructField.html @@ -0,0 +1,25 @@ +StructField in fe_analyzer::namespace::items - Rust

Struct StructField

Source
pub struct StructField {
+    pub ast: Node<Field>,
+    pub parent: StructId,
+}

Fields§

§ast: Node<Field>§parent: StructId

Trait Implementations§

Source§

impl Clone for StructField

Source§

fn clone(&self) -> StructField

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StructField

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for StructField

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for StructField

Source§

fn eq(&self, other: &StructField) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for StructField

Source§

impl StructuralPartialEq for StructField

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.StructFieldId.html b/compiler-docs/fe_analyzer/namespace/items/struct.StructFieldId.html new file mode 100644 index 0000000000..0fa6345312 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.StructFieldId.html @@ -0,0 +1,35 @@ +StructFieldId in fe_analyzer::namespace::items - Rust

Struct StructFieldId

Source
pub struct StructFieldId(/* private fields */);

Implementations§

Source§

impl StructFieldId

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<StructField>

Source

pub fn attributes(&self, db: &dyn AnalyzerDb) -> Vec<SmolStr>

Source

pub fn is_indexed(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for StructFieldId

Source§

fn clone(&self) -> StructFieldId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StructFieldId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for StructFieldId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for StructFieldId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for StructFieldId

Source§

fn cmp(&self, other: &StructFieldId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for StructFieldId

Source§

fn eq(&self, other: &StructFieldId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for StructFieldId

Source§

fn partial_cmp(&self, other: &StructFieldId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for StructFieldId

Source§

impl Eq for StructFieldId

Source§

impl StructuralPartialEq for StructFieldId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.StructId.html b/compiler-docs/fe_analyzer/namespace/items/struct.StructId.html new file mode 100644 index 0000000000..ba8552b687 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.StructId.html @@ -0,0 +1,41 @@ +StructId in fe_analyzer::namespace::items - Rust

Struct StructId

Source
pub struct StructId(/* private fields */);

Implementations§

Source§

impl StructId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Struct>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn as_type(&self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn has_private_field(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn field(&self, db: &dyn AnalyzerDb, name: &str) -> Option<StructFieldId>

Source

pub fn fields( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, StructFieldId>>

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionId>>

Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for StructId

Source§

fn clone(&self) -> StructId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StructId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for StructId

Source§

fn default() -> StructId

Returns the “default value” for a type. Read more
Source§

impl Hash for StructId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for StructId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for StructId

Source§

fn cmp(&self, other: &StructId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for StructId

Source§

fn eq(&self, other: &StructId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for StructId

Source§

fn partial_cmp(&self, other: &StructId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for StructId

Source§

impl Eq for StructId

Source§

impl StructuralPartialEq for StructId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.Trait.html b/compiler-docs/fe_analyzer/namespace/items/struct.Trait.html new file mode 100644 index 0000000000..3f36ddf307 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.Trait.html @@ -0,0 +1,25 @@ +Trait in fe_analyzer::namespace::items - Rust

Struct Trait

Source
pub struct Trait {
+    pub ast: Node<Trait>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<Trait>§module: ModuleId

Trait Implementations§

Source§

impl Clone for Trait

Source§

fn clone(&self) -> Trait

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Trait

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Trait

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Trait

Source§

fn eq(&self, other: &Trait) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Trait

Source§

impl StructuralPartialEq for Trait

Auto Trait Implementations§

§

impl Freeze for Trait

§

impl RefUnwindSafe for Trait

§

impl Send for Trait

§

impl Sync for Trait

§

impl Unpin for Trait

§

impl UnwindSafe for Trait

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.TraitId.html b/compiler-docs/fe_analyzer/namespace/items/struct.TraitId.html new file mode 100644 index 0000000000..cb4d3d3b10 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.TraitId.html @@ -0,0 +1,38 @@ +TraitId in fe_analyzer::namespace::items - Rust

Struct TraitId

Source
pub struct TraitId(/* private fields */);

Implementations§

Source§

impl TraitId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Trait>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId

Source

pub fn as_trait_or_type(&self) -> TraitOrType

Source

pub fn is_implemented_for(&self, db: &dyn AnalyzerDb, ty: TypeId) -> bool

Source

pub fn is_in_std(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_std_trait(&self, db: &dyn AnalyzerDb, name: &str) -> bool

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionSigId]>

Source

pub fn functions( + &self, + db: &dyn AnalyzerDb, +) -> Rc<IndexMap<SmolStr, FunctionSigId>>

Source

pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId>

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for TraitId

Source§

fn clone(&self) -> TraitId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TraitId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TraitId

Source§

fn default() -> TraitId

Returns the “default value” for a type. Read more
Source§

impl Hash for TraitId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for TraitId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for TraitId

Source§

fn cmp(&self, other: &TraitId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for TraitId

Source§

fn eq(&self, other: &TraitId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for TraitId

Source§

fn partial_cmp(&self, other: &TraitId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for TraitId

Source§

impl Eq for TraitId

Source§

impl StructuralPartialEq for TraitId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.TypeAlias.html b/compiler-docs/fe_analyzer/namespace/items/struct.TypeAlias.html new file mode 100644 index 0000000000..4c4dd7b7cd --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.TypeAlias.html @@ -0,0 +1,25 @@ +TypeAlias in fe_analyzer::namespace::items - Rust

Struct TypeAlias

Source
pub struct TypeAlias {
+    pub ast: Node<TypeAlias>,
+    pub module: ModuleId,
+}

Fields§

§ast: Node<TypeAlias>§module: ModuleId

Trait Implementations§

Source§

impl Clone for TypeAlias

Source§

fn clone(&self) -> TypeAlias

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeAlias

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeAlias

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeAlias

Source§

fn eq(&self, other: &TypeAlias) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TypeAlias

Source§

impl StructuralPartialEq for TypeAlias

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/struct.TypeAliasId.html b/compiler-docs/fe_analyzer/namespace/items/struct.TypeAliasId.html new file mode 100644 index 0000000000..5b8eb39f5f --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/struct.TypeAliasId.html @@ -0,0 +1,35 @@ +TypeAliasId in fe_analyzer::namespace::items - Rust

Struct TypeAliasId

Source
pub struct TypeAliasId(/* private fields */);

Implementations§

Source§

impl TypeAliasId

Source

pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<TypeAlias>

Source

pub fn span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span

Source

pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn type_id(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError>

Source

pub fn parent(&self, db: &dyn AnalyzerDb) -> Item

Source

pub fn sink_diagnostics( + &self, + db: &dyn AnalyzerDb, + sink: &mut impl DiagnosticSink, +)

Trait Implementations§

Source§

impl Clone for TypeAliasId

Source§

fn clone(&self) -> TypeAliasId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeAliasId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeAliasId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for TypeAliasId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for TypeAliasId

Source§

fn cmp(&self, other: &TypeAliasId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for TypeAliasId

Source§

fn eq(&self, other: &TypeAliasId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for TypeAliasId

Source§

fn partial_cmp(&self, other: &TypeAliasId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for TypeAliasId

Source§

impl Eq for TypeAliasId

Source§

impl StructuralPartialEq for TypeAliasId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/trait.DiagnosticSink.html b/compiler-docs/fe_analyzer/namespace/items/trait.DiagnosticSink.html new file mode 100644 index 0000000000..5bfa72e0b7 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/trait.DiagnosticSink.html @@ -0,0 +1,7 @@ +DiagnosticSink in fe_analyzer::namespace::items - Rust

Trait DiagnosticSink

Source
pub trait DiagnosticSink {
+    // Required method
+    fn push(&mut self, diag: &Diagnostic);
+
+    // Provided method
+    fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>) { ... }
+}

Required Methods§

Source

fn push(&mut self, diag: &Diagnostic)

Provided Methods§

Source

fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>)

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl DiagnosticSink for Vec<Diagnostic>

Source§

fn push(&mut self, diag: &Diagnostic)

Source§

fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>)

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/items/type.DepGraph.html b/compiler-docs/fe_analyzer/namespace/items/type.DepGraph.html new file mode 100644 index 0000000000..369457b2ca --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/items/type.DepGraph.html @@ -0,0 +1 @@ +DepGraph in fe_analyzer::namespace::items - Rust

Type Alias DepGraph

Source
pub type DepGraph = DiGraphMap<Item, DepLocality>;

Aliased Type§

pub struct DepGraph { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/enum.BlockScopeType.html b/compiler-docs/fe_analyzer/namespace/scopes/enum.BlockScopeType.html new file mode 100644 index 0000000000..e4c1799955 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/enum.BlockScopeType.html @@ -0,0 +1,27 @@ +BlockScopeType in fe_analyzer::namespace::scopes - Rust

Enum BlockScopeType

Source
pub enum BlockScopeType {
+    Function,
+    IfElse,
+    Match,
+    MatchArm,
+    Loop,
+    Unsafe,
+}

Variants§

§

Function

§

IfElse

§

Match

§

MatchArm

§

Loop

§

Unsafe

Trait Implementations§

Source§

impl Clone for BlockScopeType

Source§

fn clone(&self) -> BlockScopeType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BlockScopeType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for BlockScopeType

Source§

fn eq(&self, other: &BlockScopeType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for BlockScopeType

Source§

impl StructuralPartialEq for BlockScopeType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/fn.check_visibility.html b/compiler-docs/fe_analyzer/namespace/scopes/fn.check_visibility.html new file mode 100644 index 0000000000..15a54890eb --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/fn.check_visibility.html @@ -0,0 +1,7 @@ +check_visibility in fe_analyzer::namespace::scopes - Rust

Function check_visibility

Source
pub fn check_visibility(
+    context: &dyn AnalyzerContext,
+    named_thing: &NamedThing,
+    span: Span,
+)
Expand description

Check an item visibility and sink diagnostics if an item is invisible from +the scope.

+
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/index.html b/compiler-docs/fe_analyzer/namespace/scopes/index.html new file mode 100644 index 0000000000..0da622256d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/index.html @@ -0,0 +1,2 @@ +fe_analyzer::namespace::scopes - Rust

Module scopes

Source

Structs§

BlockScope
FunctionScope
ItemScope

Enums§

BlockScopeType

Functions§

check_visibility
Check an item visibility and sink diagnostics if an item is invisible from +the scope.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/sidebar-items.js b/compiler-docs/fe_analyzer/namespace/scopes/sidebar-items.js new file mode 100644 index 0000000000..836a614aa1 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["BlockScopeType"],"fn":["check_visibility"],"struct":["BlockScope","FunctionScope","ItemScope"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/struct.BlockScope.html b/compiler-docs/fe_analyzer/namespace/scopes/struct.BlockScope.html new file mode 100644 index 0000000000..b31e65768f --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/struct.BlockScope.html @@ -0,0 +1,70 @@ +BlockScope in fe_analyzer::namespace::scopes - Rust

Struct BlockScope

Source
pub struct BlockScope<'a, 'b> {
+    pub root: &'a FunctionScope<'b>,
+    pub parent: Option<&'a BlockScope<'a, 'b>>,
+    pub variable_defs: BTreeMap<String, (TypeId, bool, Span)>,
+    pub constant_defs: RefCell<BTreeMap<String, Constant>>,
+    pub typ: BlockScopeType,
+}

Fields§

§root: &'a FunctionScope<'b>§parent: Option<&'a BlockScope<'a, 'b>>§variable_defs: BTreeMap<String, (TypeId, bool, Span)>

Maps Name -> (Type, is_const, span)

+
§constant_defs: RefCell<BTreeMap<String, Constant>>§typ: BlockScopeType

Implementations§

Source§

impl<'a, 'b> BlockScope<'a, 'b>

Source

pub fn new(root: &'a FunctionScope<'b>, typ: BlockScopeType) -> Self

Source

pub fn new_child(&'a self, typ: BlockScopeType) -> Self

Source

pub fn add_var( + &mut self, + name: &str, + typ: TypeId, + is_const: bool, + span: Span, +) -> Result<(), AlreadyDefined>

Add a variable to the block scope.

+

Trait Implementations§

Source§

impl AnalyzerContext for BlockScope<'_, '_>

Source§

fn db(&self) -> &dyn AnalyzerDb

Source§

fn resolve_name( + &self, + name: &str, + span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source§

fn add_expression(&self, node: &Node<Expr>, attributes: ExpressionAttributes)

Attribute contextual information to an expression node. Read more
Source§

fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes. Read more
Source§

fn expr_typ(&self, expr: &Node<Expr>) -> Type

Returns a type of an expression. Read more
Source§

fn add_constant(&self, name: &Node<SmolStr>, expr: &Node<Expr>, value: Constant)

Add evaluated constant value in a constant declaration to the context.
Source§

fn constant_value_by_name( + &self, + name: &SmolStr, + span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.
Source§

fn parent(&self) -> Item

Returns an item enclosing current context. Read more
Source§

fn module(&self) -> ModuleId

Returns the module enclosing current context.
Source§

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context. Read more
Source§

fn add_call(&self, node: &Node<Expr>, call_type: CallType)

Panics Read more
Source§

fn get_call(&self, node: &Node<Expr>) -> Option<CallType>

Source§

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.
Source§

fn inherits_type(&self, typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.
Source§

fn resolve_path( + &self, + path: &Path, + span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors
Source§

fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors
Source§

fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors
Source§

fn add_diagnostic(&self, diag: Diagnostic)

Source§

fn get_context_type(&self) -> Option<TypeId>

Returns the Context type, if it is defined.
Source§

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source§

fn root_item(&self) -> Item

Returns a non-function item that encloses a context. Read more
Source§

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source§

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source§

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source§

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source§

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source§

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Auto Trait Implementations§

§

impl<'a, 'b> !Freeze for BlockScope<'a, 'b>

§

impl<'a, 'b> !RefUnwindSafe for BlockScope<'a, 'b>

§

impl<'a, 'b> !Send for BlockScope<'a, 'b>

§

impl<'a, 'b> !Sync for BlockScope<'a, 'b>

§

impl<'a, 'b> Unpin for BlockScope<'a, 'b>

§

impl<'a, 'b> !UnwindSafe for BlockScope<'a, 'b>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/struct.FunctionScope.html b/compiler-docs/fe_analyzer/namespace/scopes/struct.FunctionScope.html new file mode 100644 index 0000000000..2e30c071c4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/struct.FunctionScope.html @@ -0,0 +1,66 @@ +FunctionScope in fe_analyzer::namespace::scopes - Rust

Struct FunctionScope

Source
pub struct FunctionScope<'a> {
+    pub db: &'a dyn AnalyzerDb,
+    pub function: FunctionId,
+    pub body: RefCell<FunctionBody>,
+    pub diagnostics: RefCell<Vec<Diagnostic>>,
+}

Fields§

§db: &'a dyn AnalyzerDb§function: FunctionId§body: RefCell<FunctionBody>§diagnostics: RefCell<Vec<Diagnostic>>

Implementations§

Source§

impl<'a> FunctionScope<'a>

Source

pub fn new(db: &'a dyn AnalyzerDb, function: FunctionId) -> Self

Source

pub fn function_return_type(&self) -> Result<TypeId, TypeError>

Source

pub fn map_variable_type<T>(&self, node: &Node<T>, typ: TypeId)

Source

pub fn map_pattern_matrix(&self, node: &Node<FuncStmt>, matrix: PatternMatrix)

Trait Implementations§

Source§

impl<'a> AnalyzerContext for FunctionScope<'a>

Source§

fn db(&self) -> &dyn AnalyzerDb

Source§

fn add_diagnostic(&self, diag: Diagnostic)

Source§

fn add_expression(&self, node: &Node<Expr>, attributes: ExpressionAttributes)

Attribute contextual information to an expression node. Read more
Source§

fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes. Read more
Source§

fn expr_typ(&self, expr: &Node<Expr>) -> Type

Returns a type of an expression. Read more
Source§

fn add_constant( + &self, + _name: &Node<SmolStr>, + expr: &Node<Expr>, + value: Constant, +)

Add evaluated constant value in a constant declaration to the context.
Source§

fn constant_value_by_name( + &self, + _name: &SmolStr, + _span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.
Source§

fn parent(&self) -> Item

Returns an item enclosing current context. Read more
Source§

fn module(&self) -> ModuleId

Returns the module enclosing current context.
Source§

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context. Read more
Source§

fn add_call(&self, node: &Node<Expr>, call_type: CallType)

Panics Read more
Source§

fn get_call(&self, node: &Node<Expr>) -> Option<CallType>

Source§

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.
Source§

fn inherits_type(&self, _typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.
Source§

fn resolve_name( + &self, + name: &str, + span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source§

fn resolve_path( + &self, + path: &Path, + span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors
Source§

fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors
Source§

fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors
Source§

fn get_context_type(&self) -> Option<TypeId>

Returns the Context type, if it is defined.
Source§

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source§

fn root_item(&self) -> Item

Returns a non-function item that encloses a context. Read more
Source§

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source§

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source§

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source§

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source§

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source§

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Auto Trait Implementations§

§

impl<'a> !Freeze for FunctionScope<'a>

§

impl<'a> !RefUnwindSafe for FunctionScope<'a>

§

impl<'a> !Send for FunctionScope<'a>

§

impl<'a> !Sync for FunctionScope<'a>

§

impl<'a> Unpin for FunctionScope<'a>

§

impl<'a> !UnwindSafe for FunctionScope<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/scopes/struct.ItemScope.html b/compiler-docs/fe_analyzer/namespace/scopes/struct.ItemScope.html new file mode 100644 index 0000000000..f84042777a --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/scopes/struct.ItemScope.html @@ -0,0 +1,65 @@ +ItemScope in fe_analyzer::namespace::scopes - Rust

Struct ItemScope

Source
pub struct ItemScope<'a> {
+    pub diagnostics: RefCell<Vec<Diagnostic>>,
+    /* private fields */
+}

Fields§

§diagnostics: RefCell<Vec<Diagnostic>>

Implementations§

Source§

impl<'a> ItemScope<'a>

Source

pub fn new(db: &'a dyn AnalyzerDb, module: ModuleId) -> Self

Trait Implementations§

Source§

impl<'a> AnalyzerContext for ItemScope<'a>

Source§

fn get_context_type(&self) -> Option<TypeId>

Gets std::context::Context if it exists

+
Source§

fn db(&self) -> &dyn AnalyzerDb

Source§

fn add_expression(&self, node: &Node<Expr>, attributes: ExpressionAttributes)

Attribute contextual information to an expression node. Read more
Source§

fn update_expression( + &self, + node: &Node<Expr>, + f: &dyn Fn(&mut ExpressionAttributes), +)

Update the expression attributes. Read more
Source§

fn expr_typ(&self, expr: &Node<Expr>) -> Type

Returns a type of an expression. Read more
Source§

fn add_constant( + &self, + _name: &Node<SmolStr>, + _expr: &Node<Expr>, + _value: Constant, +)

Add evaluated constant value in a constant declaration to the context.
Source§

fn constant_value_by_name( + &self, + name: &SmolStr, + _span: Span, +) -> Result<Option<Constant>, IncompleteItem>

Returns constant value from variable name.
Source§

fn parent(&self) -> Item

Returns an item enclosing current context. Read more
Source§

fn module(&self) -> ModuleId

Returns the module enclosing current context.
Source§

fn parent_function(&self) -> FunctionId

Returns a function id that encloses a context. Read more
Source§

fn add_call(&self, _node: &Node<Expr>, _call_type: CallType)

Panics Read more
Source§

fn get_call(&self, _node: &Node<Expr>) -> Option<CallType>

Source§

fn is_in_function(&self) -> bool

Returns true if the context is in function scope.
Source§

fn inherits_type(&self, _typ: BlockScopeType) -> bool

Returns true if the scope or any of its parents is of the given type.
Source§

fn resolve_name( + &self, + name: &str, + span: Span, +) -> Result<Option<NamedThing>, IncompleteItem>

Source§

fn resolve_path( + &self, + path: &Path, + span: Span, +) -> Result<NamedThing, FatalError>

Resolves the given path and registers all errors
Source§

fn resolve_visible_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path only if it is visible. Does not register any errors
Source§

fn resolve_any_path(&self, path: &Path) -> Option<NamedThing>

Resolves the given path. Does not register any errors
Source§

fn add_diagnostic(&self, diag: Diagnostic)

Source§

fn error( + &self, + message: &str, + label_span: Span, + label: &str, +) -> DiagnosticVoucher

Source§

fn root_item(&self) -> Item

Returns a non-function item that encloses a context. Read more
Source§

fn type_error( + &self, + message: &str, + span: Span, + expected: TypeId, + actual: TypeId, +) -> DiagnosticVoucher

Source§

fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher

Source§

fn fancy_error( + &self, + message: &str, + labels: Vec<Label>, + notes: Vec<String>, +) -> DiagnosticVoucher

Source§

fn duplicate_name_error( + &self, + message: &str, + name: &str, + original: Span, + duplicate: Span, +) -> DiagnosticVoucher

Source§

fn name_conflict_error( + &self, + name_kind: &str, + name: &str, + original: &NamedThing, + original_span: Option<Span>, + duplicate_span: Span, +) -> DiagnosticVoucher

Source§

fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher

Auto Trait Implementations§

§

impl<'a> !Freeze for ItemScope<'a>

§

impl<'a> !RefUnwindSafe for ItemScope<'a>

§

impl<'a> !Send for ItemScope<'a>

§

impl<'a> !Sync for ItemScope<'a>

§

impl<'a> Unpin for ItemScope<'a>

§

impl<'a> !UnwindSafe for ItemScope<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/sidebar-items.js b/compiler-docs/fe_analyzer/namespace/sidebar-items.js new file mode 100644 index 0000000000..46a2407c74 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["items","scopes","types"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/constant.U256.html b/compiler-docs/fe_analyzer/namespace/types/constant.U256.html new file mode 100644 index 0000000000..1e86bcce3f --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/constant.U256.html @@ -0,0 +1 @@ +U256 in fe_analyzer::namespace::types - Rust

Constant U256

Source
pub const U256: Base;
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.Base.html b/compiler-docs/fe_analyzer/namespace/types/enum.Base.html new file mode 100644 index 0000000000..b31c825294 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.Base.html @@ -0,0 +1,37 @@ +Base in fe_analyzer::namespace::types - Rust

Enum Base

Source
pub enum Base {
+    Numeric(Integer),
+    Bool,
+    Address,
+    Unit,
+}

Variants§

§

Numeric(Integer)

§

Bool

§

Address

§

Unit

Implementations§

Source§

impl Base

Source

pub fn name(&self) -> SmolStr

Source

pub fn u256() -> Base

Trait Implementations§

Source§

impl Clone for Base

Source§

fn clone(&self) -> Base

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Base

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Base

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Base> for Type

Source§

fn from(value: Base) -> Self

Converts to this type from the input type.
Source§

impl FromStr for Base

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Self, Self::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for Base

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for Base

Source§

fn cmp(&self, other: &Base) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Base

Source§

fn eq(&self, other: &Base) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Base

Source§

fn partial_cmp(&self, other: &Base) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for Base

Source§

impl Eq for Base

Source§

impl StructuralPartialEq for Base

Auto Trait Implementations§

§

impl Freeze for Base

§

impl RefUnwindSafe for Base

§

impl Send for Base

§

impl Sync for Base

§

impl Unpin for Base

§

impl UnwindSafe for Base

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.GenericArg.html b/compiler-docs/fe_analyzer/namespace/types/enum.GenericArg.html new file mode 100644 index 0000000000..9abc7cb984 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.GenericArg.html @@ -0,0 +1,25 @@ +GenericArg in fe_analyzer::namespace::types - Rust

Enum GenericArg

Source
pub enum GenericArg {
+    Int(usize),
+    Type(TypeId),
+}

Variants§

§

Int(usize)

§

Type(TypeId)

Trait Implementations§

Source§

impl Clone for GenericArg

Source§

fn clone(&self) -> GenericArg

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for GenericArg

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for GenericArg

Source§

fn eq(&self, other: &GenericArg) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for GenericArg

Source§

impl StructuralPartialEq for GenericArg

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.GenericParamKind.html b/compiler-docs/fe_analyzer/namespace/types/enum.GenericParamKind.html new file mode 100644 index 0000000000..30abd145a4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.GenericParamKind.html @@ -0,0 +1,26 @@ +GenericParamKind in fe_analyzer::namespace::types - Rust

Enum GenericParamKind

Source
pub enum GenericParamKind {
+    Int,
+    PrimitiveType,
+    AnyType,
+}

Variants§

§

Int

§

PrimitiveType

§

AnyType

Trait Implementations§

Source§

impl Clone for GenericParamKind

Source§

fn clone(&self) -> GenericParamKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericParamKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for GenericParamKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for GenericParamKind

Source§

fn eq(&self, other: &GenericParamKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for GenericParamKind

Source§

impl Eq for GenericParamKind

Source§

impl StructuralPartialEq for GenericParamKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.GenericType.html b/compiler-docs/fe_analyzer/namespace/types/enum.GenericType.html new file mode 100644 index 0000000000..c6669994e6 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.GenericType.html @@ -0,0 +1,35 @@ +GenericType in fe_analyzer::namespace::types - Rust

Enum GenericType

Source
pub enum GenericType {
+    Array,
+    String,
+    Map,
+}

Variants§

§

Array

§

String

§

Map

Implementations§

Source§

impl GenericType

Source

pub fn name(&self) -> SmolStr

Source

pub fn params(&self) -> Vec<GenericParam>

Source

pub fn apply(&self, db: &dyn AnalyzerDb, args: &[GenericArg]) -> Option<TypeId>

Trait Implementations§

Source§

impl AsRef<str> for GenericType

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for GenericType

Source§

fn clone(&self) -> GenericType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for GenericType

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<GenericType, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for GenericType

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl IntoEnumIterator for GenericType

Source§

impl Ord for GenericType

Source§

fn cmp(&self, other: &GenericType) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for GenericType

Source§

fn eq(&self, other: &GenericType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for GenericType

Source§

fn partial_cmp(&self, other: &GenericType) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TryFrom<&str> for GenericType

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<GenericType, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for GenericType

Source§

impl Eq for GenericType

Source§

impl StructuralPartialEq for GenericType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.Integer.html b/compiler-docs/fe_analyzer/namespace/types/enum.Integer.html new file mode 100644 index 0000000000..22ea8ae69c --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.Integer.html @@ -0,0 +1,52 @@ +Integer in fe_analyzer::namespace::types - Rust

Enum Integer

Source
pub enum Integer {
+    U256,
+    U128,
+    U64,
+    U32,
+    U16,
+    U8,
+    I256,
+    I128,
+    I64,
+    I32,
+    I16,
+    I8,
+}

Variants§

§

U256

§

U128

§

U64

§

U32

§

U16

§

U8

§

I256

§

I128

§

I64

§

I32

§

I16

§

I8

Implementations§

Source§

impl Integer

Source

pub fn is_signed(&self) -> bool

Returns true if the integer is signed, otherwise false

+
Source

pub fn size(&self) -> usize

Source

pub fn bits(&self) -> usize

Returns size of integer type in bits.

+
Source

pub fn can_hold(&self, other: Integer) -> bool

Returns true if the integer is at least the same size (or larger) than +other

+
Source

pub fn fits(&self, num: BigInt) -> bool

Returns true if num represents a number that fits the type

+
Source

pub fn max_value(&self) -> BigInt

Returns max value of the integer type.

+
Source

pub fn min_value(&self) -> BigInt

Returns min value of the integer type.

+

Trait Implementations§

Source§

impl AsRef<str> for Integer

Source§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for Integer

Source§

fn clone(&self) -> Integer

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Integer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Integer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl FromStr for Integer

Source§

type Err = ParseError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Integer, <Self as FromStr>::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for Integer

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl IntoEnumIterator for Integer

Source§

impl Ord for Integer

Source§

fn cmp(&self, other: &Integer) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Integer

Source§

fn eq(&self, other: &Integer) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Integer

Source§

fn partial_cmp(&self, other: &Integer) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TryFrom<&str> for Integer

Source§

type Error = ParseError

The type returned in the event of a conversion error.
Source§

fn try_from(s: &str) -> Result<Integer, <Self as TryFrom<&str>>::Error>

Performs the conversion.
Source§

impl Copy for Integer

Source§

impl Eq for Integer

Source§

impl StructuralPartialEq for Integer

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.TraitOrType.html b/compiler-docs/fe_analyzer/namespace/types/enum.TraitOrType.html new file mode 100644 index 0000000000..36d1fb162e --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.TraitOrType.html @@ -0,0 +1,25 @@ +TraitOrType in fe_analyzer::namespace::types - Rust

Enum TraitOrType

Source
pub enum TraitOrType {
+    TraitId(TraitId),
+    TypeId(TypeId),
+}

Variants§

§

TraitId(TraitId)

§

TypeId(TypeId)

Trait Implementations§

Source§

impl Clone for TraitOrType

Source§

fn clone(&self) -> TraitOrType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TraitOrType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TraitOrType

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TraitOrType

Source§

fn eq(&self, other: &TraitOrType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TraitOrType

Source§

impl StructuralPartialEq for TraitOrType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/enum.Type.html b/compiler-docs/fe_analyzer/namespace/types/enum.Type.html new file mode 100644 index 0000000000..b7db921754 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/enum.Type.html @@ -0,0 +1,48 @@ +Type in fe_analyzer::namespace::types - Rust

Enum Type

Source
pub enum Type {
+
Show 13 variants Base(Base), + Array(Array), + Map(Map), + Tuple(Tuple), + String(FeString), + Contract(ContractId), + SelfContract(ContractId), + SelfType(TraitOrType), + Struct(StructId), + Enum(EnumId), + Generic(Generic), + SPtr(TypeId), + Mut(TypeId), +
}

Variants§

§

Base(Base)

§

Array(Array)

§

Map(Map)

§

Tuple(Tuple)

§

String(FeString)

§

Contract(ContractId)

An “external” contract. Effectively just a newtyped address.

+
§

SelfContract(ContractId)

The type of a contract while it’s being executed. Ie. the type +of self within a contract function.

+
§

SelfType(TraitOrType)

§

Struct(StructId)

§

Enum(EnumId)

§

Generic(Generic)

§

SPtr(TypeId)

§

Mut(TypeId)

Implementations§

Source§

impl Type

Source

pub fn id(&self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn def_span(&self, context: &dyn AnalyzerContext) -> Option<Span>

Source

pub fn bool() -> Self

Creates an instance of bool.

+
Source

pub fn address() -> Self

Creates an instance of address.

+
Source

pub fn u256() -> Self

Creates an instance of u256.

+
Source

pub fn u8() -> Self

Creates an instance of u8.

+
Source

pub fn unit() -> Self

Creates an instance of ().

+
Source

pub fn is_unit(&self) -> bool

Source

pub fn int(int_type: Integer) -> Self

Source

pub fn has_fixed_size(&self, db: &dyn AnalyzerDb) -> bool

Trait Implementations§

Source§

impl Clone for Type

Source§

fn clone(&self) -> Type

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Type

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for Type

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl From<Base> for Type

Source§

fn from(value: Base) -> Self

Converts to this type from the input type.
Source§

impl Hash for Type

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Type

Source§

fn eq(&self, other: &Type) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Type

Source§

impl StructuralPartialEq for Type

Auto Trait Implementations§

§

impl Freeze for Type

§

impl RefUnwindSafe for Type

§

impl !Send for Type

§

impl !Sync for Type

§

impl Unpin for Type

§

impl UnwindSafe for Type

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.address_max.html b/compiler-docs/fe_analyzer/namespace/types/fn.address_max.html new file mode 100644 index 0000000000..a2a6d2e9b4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.address_max.html @@ -0,0 +1 @@ +address_max in fe_analyzer::namespace::types - Rust

Function address_max

Source
pub fn address_max() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.i256_max.html b/compiler-docs/fe_analyzer/namespace/types/fn.i256_max.html new file mode 100644 index 0000000000..ebbfaad3c4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.i256_max.html @@ -0,0 +1 @@ +i256_max in fe_analyzer::namespace::types - Rust

Function i256_max

Source
pub fn i256_max() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.i256_min.html b/compiler-docs/fe_analyzer/namespace/types/fn.i256_min.html new file mode 100644 index 0000000000..f479aa572f --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.i256_min.html @@ -0,0 +1 @@ +i256_min in fe_analyzer::namespace::types - Rust

Function i256_min

Source
pub fn i256_min() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.u256_max.html b/compiler-docs/fe_analyzer/namespace/types/fn.u256_max.html new file mode 100644 index 0000000000..cbc9d6ab9d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.u256_max.html @@ -0,0 +1 @@ +u256_max in fe_analyzer::namespace::types - Rust

Function u256_max

Source
pub fn u256_max() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/fn.u256_min.html b/compiler-docs/fe_analyzer/namespace/types/fn.u256_min.html new file mode 100644 index 0000000000..37ac9f16f0 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/fn.u256_min.html @@ -0,0 +1 @@ +u256_min in fe_analyzer::namespace::types - Rust

Function u256_min

Source
pub fn u256_min() -> BigInt
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/index.html b/compiler-docs/fe_analyzer/namespace/types/index.html new file mode 100644 index 0000000000..ae89345bdc --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/index.html @@ -0,0 +1 @@ +fe_analyzer::namespace::types - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/sidebar-items.js b/compiler-docs/fe_analyzer/namespace/types/sidebar-items.js new file mode 100644 index 0000000000..97668c6126 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["U256"],"enum":["Base","GenericArg","GenericParamKind","GenericType","Integer","TraitOrType","Type"],"fn":["address_max","i256_max","i256_min","u256_max","u256_min"],"struct":["Array","CtxDecl","FeString","FunctionParam","FunctionSignature","Generic","GenericParam","GenericTypeIter","IntegerIter","Map","SelfDecl","Tuple","TypeId"],"trait":["SafeNames","TypeDowncast"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.Array.html b/compiler-docs/fe_analyzer/namespace/types/struct.Array.html new file mode 100644 index 0000000000..cc840a3d31 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.Array.html @@ -0,0 +1,25 @@ +Array in fe_analyzer::namespace::types - Rust

Struct Array

Source
pub struct Array {
+    pub size: usize,
+    pub inner: TypeId,
+}

Fields§

§size: usize§inner: TypeId

Trait Implementations§

Source§

impl Clone for Array

Source§

fn clone(&self) -> Array

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Array

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Array

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Array

Source§

fn eq(&self, other: &Array) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Array

Source§

impl Eq for Array

Source§

impl StructuralPartialEq for Array

Auto Trait Implementations§

§

impl Freeze for Array

§

impl RefUnwindSafe for Array

§

impl Send for Array

§

impl Sync for Array

§

impl Unpin for Array

§

impl UnwindSafe for Array

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.CtxDecl.html b/compiler-docs/fe_analyzer/namespace/types/struct.CtxDecl.html new file mode 100644 index 0000000000..faac5c0a70 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.CtxDecl.html @@ -0,0 +1,25 @@ +CtxDecl in fe_analyzer::namespace::types - Rust

Struct CtxDecl

Source
pub struct CtxDecl {
+    pub span: Span,
+    pub mut_: Option<Span>,
+}

Fields§

§span: Span§mut_: Option<Span>

Trait Implementations§

Source§

impl Clone for CtxDecl

Source§

fn clone(&self) -> CtxDecl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CtxDecl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CtxDecl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CtxDecl

Source§

fn eq(&self, other: &CtxDecl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for CtxDecl

Source§

impl Eq for CtxDecl

Source§

impl StructuralPartialEq for CtxDecl

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.FeString.html b/compiler-docs/fe_analyzer/namespace/types/struct.FeString.html new file mode 100644 index 0000000000..912e569017 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.FeString.html @@ -0,0 +1,34 @@ +FeString in fe_analyzer::namespace::types - Rust

Struct FeString

Source
pub struct FeString {
+    pub max_size: usize,
+}

Fields§

§max_size: usize

Trait Implementations§

Source§

impl Clone for FeString

Source§

fn clone(&self) -> FeString

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FeString

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for FeString

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FeString

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for FeString

Source§

fn cmp(&self, other: &FeString) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for FeString

Source§

fn eq(&self, other: &FeString) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for FeString

Source§

fn partial_cmp(&self, other: &FeString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for FeString

Source§

impl Eq for FeString

Source§

impl StructuralPartialEq for FeString

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.FunctionParam.html b/compiler-docs/fe_analyzer/namespace/types/struct.FunctionParam.html new file mode 100644 index 0000000000..617cdc27c9 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.FunctionParam.html @@ -0,0 +1,30 @@ +FunctionParam in fe_analyzer::namespace::types - Rust

Struct FunctionParam

Source
pub struct FunctionParam {
+    pub name: SmolStr,
+    pub typ: Result<TypeId, TypeError>,
+    /* private fields */
+}

Fields§

§name: SmolStr§typ: Result<TypeId, TypeError>

Implementations§

Source§

impl FunctionParam

Source

pub fn new( + label: Option<&str>, + name: &str, + typ: Result<TypeId, TypeError>, +) -> Self

Source

pub fn label(&self) -> Option<&str>

Trait Implementations§

Source§

impl Clone for FunctionParam

Source§

fn clone(&self) -> FunctionParam

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionParam

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionParam

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionParam

Source§

fn eq(&self, other: &FunctionParam) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionParam

Source§

impl StructuralPartialEq for FunctionParam

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.FunctionSignature.html b/compiler-docs/fe_analyzer/namespace/types/struct.FunctionSignature.html new file mode 100644 index 0000000000..9ec40de98c --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.FunctionSignature.html @@ -0,0 +1,31 @@ +FunctionSignature in fe_analyzer::namespace::types - Rust

Struct FunctionSignature

Source
pub struct FunctionSignature {
+    pub self_decl: Option<SelfDecl>,
+    pub ctx_decl: Option<CtxDecl>,
+    pub params: Vec<FunctionParam>,
+    pub return_type: Result<TypeId, TypeError>,
+}

Fields§

§self_decl: Option<SelfDecl>§ctx_decl: Option<CtxDecl>§params: Vec<FunctionParam>§return_type: Result<TypeId, TypeError>

Trait Implementations§

Source§

impl Clone for FunctionSignature

Source§

fn clone(&self) -> FunctionSignature

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSignature

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for FunctionSignature

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl Hash for FunctionSignature

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionSignature

Source§

fn eq(&self, other: &FunctionSignature) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionSignature

Source§

impl StructuralPartialEq for FunctionSignature

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.Generic.html b/compiler-docs/fe_analyzer/namespace/types/struct.Generic.html new file mode 100644 index 0000000000..056ae4c8ed --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.Generic.html @@ -0,0 +1,34 @@ +Generic in fe_analyzer::namespace::types - Rust

Struct Generic

Source
pub struct Generic {
+    pub name: SmolStr,
+    pub bounds: Rc<[TraitId]>,
+}

Fields§

§name: SmolStr§bounds: Rc<[TraitId]>

Trait Implementations§

Source§

impl Clone for Generic

Source§

fn clone(&self) -> Generic

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Generic

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for Generic

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Generic

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for Generic

Source§

fn cmp(&self, other: &Generic) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for Generic

Source§

fn eq(&self, other: &Generic) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for Generic

Source§

fn partial_cmp(&self, other: &Generic) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Eq for Generic

Source§

impl StructuralPartialEq for Generic

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.GenericParam.html b/compiler-docs/fe_analyzer/namespace/types/struct.GenericParam.html new file mode 100644 index 0000000000..9479bf5d02 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.GenericParam.html @@ -0,0 +1,14 @@ +GenericParam in fe_analyzer::namespace::types - Rust

Struct GenericParam

Source
pub struct GenericParam {
+    pub name: SmolStr,
+    pub kind: GenericParamKind,
+}

Fields§

§name: SmolStr§kind: GenericParamKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.GenericTypeIter.html b/compiler-docs/fe_analyzer/namespace/types/struct.GenericTypeIter.html new file mode 100644 index 0000000000..2892d21faa --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.GenericTypeIter.html @@ -0,0 +1,221 @@ +GenericTypeIter in fe_analyzer::namespace::types - Rust

Struct GenericTypeIter

Source
pub struct GenericTypeIter { /* private fields */ }

Trait Implementations§

Source§

impl Clone for GenericTypeIter

Source§

fn clone(&self) -> GenericTypeIter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DoubleEndedIterator for GenericTypeIter

Source§

fn next_back(&mut self) -> Option<<Self as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
Source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.37.0 · Source§

fn nth_back(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element from the end of the iterator. Read more
1.27.0 · Source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes +elements starting from the back of the iterator. Read more
1.27.0 · Source§

fn rfold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single, +final value, starting from the back. Read more
1.27.0 · Source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
Source§

impl ExactSizeIterator for GenericTypeIter

Source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
Source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
Source§

impl Iterator for GenericTypeIter

Source§

type Item = GenericType

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<<Self as Iterator>::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn nth(&mut self, n: usize) -> Option<<Self as Iterator>::Item>

Returns the nth element of the iterator. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
where + T: 'a, + Self: Sized + DoubleEndedIterator<Item = &'a mut T>, + P: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate, +such that all those that return true precede all those that return false. +Returns the number of true elements found. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn rposition<P>(&mut self, predicate: P) -> Option<usize>
where + P: FnMut(Self::Item) -> bool, + Self: Sized + ExactSizeIterator + DoubleEndedIterator,

Searches for an element in an iterator from the right, returning its +index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn rev(self) -> Rev<Self>
where + Self: Sized + DoubleEndedIterator,

Reverses an iterator’s direction. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.IntegerIter.html b/compiler-docs/fe_analyzer/namespace/types/struct.IntegerIter.html new file mode 100644 index 0000000000..1735a9edab --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.IntegerIter.html @@ -0,0 +1,221 @@ +IntegerIter in fe_analyzer::namespace::types - Rust

Struct IntegerIter

Source
pub struct IntegerIter { /* private fields */ }

Trait Implementations§

Source§

impl Clone for IntegerIter

Source§

fn clone(&self) -> IntegerIter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DoubleEndedIterator for IntegerIter

Source§

fn next_back(&mut self) -> Option<<Self as Iterator>::Item>

Removes and returns an element from the end of the iterator. Read more
Source§

fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator from the back by n elements. Read more
1.37.0 · Source§

fn nth_back(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element from the end of the iterator. Read more
1.27.0 · Source§

fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

This is the reverse version of Iterator::try_fold(): it takes +elements starting from the back of the iterator. Read more
1.27.0 · Source§

fn rfold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

An iterator method that reduces the iterator’s elements to a single, +final value, starting from the back. Read more
1.27.0 · Source§

fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator from the back that satisfies a predicate. Read more
Source§

impl ExactSizeIterator for IntegerIter

Source§

fn len(&self) -> usize

Returns the exact remaining length of the iterator. Read more
Source§

fn is_empty(&self) -> bool

🔬This is a nightly-only experimental API. (exact_size_is_empty)
Returns true if the iterator is empty. Read more
Source§

impl Iterator for IntegerIter

Source§

type Item = Integer

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<<Self as Iterator>::Item>

Advances the iterator and returns the next value. Read more
Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
Source§

fn nth(&mut self, n: usize) -> Option<<Self as Iterator>::Item>

Returns the nth element of the iterator. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn partition_in_place<'a, T, P>(self, predicate: P) -> usize
where + T: 'a, + Self: Sized + DoubleEndedIterator<Item = &'a mut T>, + P: FnMut(&T) -> bool,

🔬This is a nightly-only experimental API. (iter_partition_in_place)
Reorders the elements of this iterator in-place according to the given predicate, +such that all those that return true precede all those that return false. +Returns the number of true elements found. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn rposition<P>(&mut self, predicate: P) -> Option<usize>
where + P: FnMut(Self::Item) -> bool, + Self: Sized + ExactSizeIterator + DoubleEndedIterator,

Searches for an element in an iterator from the right, returning its +index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn rev(self) -> Rev<Self>
where + Self: Sized + DoubleEndedIterator,

Reverses an iterator’s direction. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.Map.html b/compiler-docs/fe_analyzer/namespace/types/struct.Map.html new file mode 100644 index 0000000000..310013f626 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.Map.html @@ -0,0 +1,25 @@ +Map in fe_analyzer::namespace::types - Rust

Struct Map

Source
pub struct Map {
+    pub key: TypeId,
+    pub value: TypeId,
+}

Fields§

§key: TypeId§value: TypeId

Trait Implementations§

Source§

impl Clone for Map

Source§

fn clone(&self) -> Map

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Map

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Map

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Map

Source§

fn eq(&self, other: &Map) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Map

Source§

impl StructuralPartialEq for Map

Auto Trait Implementations§

§

impl Freeze for Map

§

impl RefUnwindSafe for Map

§

impl Send for Map

§

impl Sync for Map

§

impl Unpin for Map

§

impl UnwindSafe for Map

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.SelfDecl.html b/compiler-docs/fe_analyzer/namespace/types/struct.SelfDecl.html new file mode 100644 index 0000000000..5b79ee103d --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.SelfDecl.html @@ -0,0 +1,25 @@ +SelfDecl in fe_analyzer::namespace::types - Rust

Struct SelfDecl

Source
pub struct SelfDecl {
+    pub span: Span,
+    pub mut_: Option<Span>,
+}

Fields§

§span: Span§mut_: Option<Span>

Implementations§

Source§

impl SelfDecl

Source

pub fn is_mut(&self) -> bool

Trait Implementations§

Source§

impl Clone for SelfDecl

Source§

fn clone(&self) -> SelfDecl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SelfDecl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for SelfDecl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SelfDecl

Source§

fn eq(&self, other: &SelfDecl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for SelfDecl

Source§

impl Eq for SelfDecl

Source§

impl StructuralPartialEq for SelfDecl

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.Tuple.html b/compiler-docs/fe_analyzer/namespace/types/struct.Tuple.html new file mode 100644 index 0000000000..8d2de2acc4 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.Tuple.html @@ -0,0 +1,24 @@ +Tuple in fe_analyzer::namespace::types - Rust

Struct Tuple

Source
pub struct Tuple {
+    pub items: Rc<[TypeId]>,
+}

Fields§

§items: Rc<[TypeId]>

Trait Implementations§

Source§

impl Clone for Tuple

Source§

fn clone(&self) -> Tuple

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Tuple

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Tuple

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Tuple

Source§

fn eq(&self, other: &Tuple) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Tuple

Source§

impl StructuralPartialEq for Tuple

Auto Trait Implementations§

§

impl Freeze for Tuple

§

impl RefUnwindSafe for Tuple

§

impl !Send for Tuple

§

impl !Sync for Tuple

§

impl Unpin for Tuple

§

impl UnwindSafe for Tuple

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/struct.TypeId.html b/compiler-docs/fe_analyzer/namespace/types/struct.TypeId.html new file mode 100644 index 0000000000..de3fc5dce5 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/struct.TypeId.html @@ -0,0 +1,71 @@ +TypeId in fe_analyzer::namespace::types - Rust

Struct TypeId

Source
pub struct TypeId(/* private fields */);

Implementations§

Source§

impl TypeId

Source

pub fn unit(db: &dyn AnalyzerDb) -> Self

Source

pub fn bool(db: &dyn AnalyzerDb) -> Self

Source

pub fn int(db: &dyn AnalyzerDb, int: Integer) -> Self

Source

pub fn address(db: &dyn AnalyzerDb) -> Self

Source

pub fn base(db: &dyn AnalyzerDb, t: Base) -> Self

Source

pub fn tuple(db: &dyn AnalyzerDb, items: &[TypeId]) -> Self

Source

pub fn typ(&self, db: &dyn AnalyzerDb) -> Type

Source

pub fn deref_typ(&self, db: &dyn AnalyzerDb) -> Type

Source

pub fn deref(self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn make_sptr(self, db: &dyn AnalyzerDb) -> TypeId

Source

pub fn has_fixed_size(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_primitive(&self, db: &dyn AnalyzerDb) -> bool

true if Type::Base or Type::Contract (which is just an Address)

+
Source

pub fn is_bool(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_contract(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_integer(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_map(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_string(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_self_ty(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn as_struct(&self, db: &dyn AnalyzerDb) -> Option<StructId>

Source

pub fn as_trait_or_type(&self) -> TraitOrType

Source

pub fn is_struct(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_sptr(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn is_mut(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr

Source

pub fn kind_display_name(&self, db: &dyn AnalyzerDb) -> &str

Source

pub fn get_impl_for( + &self, + db: &dyn AnalyzerDb, + trait_: TraitId, +) -> Option<ImplId>

Return the impl for the given trait. There can only ever be a single +implementation per concrete type and trait.

+
Source

pub fn trait_function_candidates( + &self, + context: &mut dyn AnalyzerContext, + fn_name: &str, +) -> (Vec<(FunctionId, ImplId)>, Vec<(FunctionId, ImplId)>)

Looks up all possible candidates of the given function name that are implemented via traits. +Groups results in two lists, the first contains all theoretical possible candidates and +the second contains only those that are actually callable because the trait is in scope.

+
Source

pub fn function_sig( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Option<FunctionSigId>

Signature for the function with the given name defined directly on the type. +Does not consider trait impls.

+
Source

pub fn function_sigs( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Rc<[FunctionSigId]>

Like function_sig but returns a Vec<FunctionSigId> which not only +considers functions natively implemented on the type but also those +that are provided by implemented traits on the type.

+
Source

pub fn self_function( + &self, + db: &dyn AnalyzerDb, + name: &str, +) -> Option<FunctionSigId>

Source

pub fn is_emittable(self, db: &dyn AnalyzerDb) -> bool

Returns true if the type qualifies to implement the Emittable trait +TODO: This function should be removed when we add Encode / Decode +trait

+
Source

pub fn is_encodable(self, db: &dyn AnalyzerDb) -> Result<bool, TypeError>

Returns true if the type is encodable in Solidity ABI. +TODO: This function must be removed when we add Encode/Decode trait.

+

Trait Implementations§

Source§

impl Clone for TypeId

Source§

fn clone(&self) -> TypeId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for TypeId

Source§

fn default() -> TypeId

Returns the “default value” for a type. Read more
Source§

impl DisplayWithDb for TypeId

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl Hash for TypeId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for TypeId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for TypeId

Source§

fn cmp(&self, other: &TypeId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for TypeId

Source§

fn eq(&self, other: &TypeId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for TypeId

Source§

fn partial_cmp(&self, other: &TypeId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl TypeDowncast for TypeId

Source§

fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array>

Source§

fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple>

Source§

fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString>

Source§

fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map>

Source§

fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer>

Source§

impl Copy for TypeId

Source§

impl Eq for TypeId

Source§

impl StructuralPartialEq for TypeId

Auto Trait Implementations§

§

impl Freeze for TypeId

§

impl RefUnwindSafe for TypeId

§

impl Send for TypeId

§

impl Sync for TypeId

§

impl Unpin for TypeId

§

impl UnwindSafe for TypeId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/trait.SafeNames.html b/compiler-docs/fe_analyzer/namespace/types/trait.SafeNames.html new file mode 100644 index 0000000000..e96d02553a --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/trait.SafeNames.html @@ -0,0 +1,6 @@ +SafeNames in fe_analyzer::namespace::types - Rust

Trait SafeNames

Source
pub trait SafeNames {
+    // Required method
+    fn lower_snake(&self) -> String;
+}
Expand description

Names that can be used to build identifiers without collision.

+

Required Methods§

Source

fn lower_snake(&self) -> String

Name in the lower snake format (e.g. lower_snake_case).

+

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/namespace/types/trait.TypeDowncast.html b/compiler-docs/fe_analyzer/namespace/types/trait.TypeDowncast.html new file mode 100644 index 0000000000..0c94bc4eb2 --- /dev/null +++ b/compiler-docs/fe_analyzer/namespace/types/trait.TypeDowncast.html @@ -0,0 +1,8 @@ +TypeDowncast in fe_analyzer::namespace::types - Rust

Trait TypeDowncast

Source
pub trait TypeDowncast {
+    // Required methods
+    fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array>;
+    fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple>;
+    fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString>;
+    fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map>;
+    fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer>;
+}

Required Methods§

Source

fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array>

Source

fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple>

Source

fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString>

Source

fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map>

Source

fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer>

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/enum.ConstructorKind.html b/compiler-docs/fe_analyzer/pattern_analysis/enum.ConstructorKind.html new file mode 100644 index 0000000000..2dbcba7363 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/enum.ConstructorKind.html @@ -0,0 +1,27 @@ +ConstructorKind in fe_analyzer::pattern_analysis - Rust

Enum ConstructorKind

Source
pub enum ConstructorKind {
+    Enum(EnumVariantId),
+    Tuple(TypeId),
+    Struct(StructId),
+    Literal((LiteralPattern, TypeId)),
+}

Variants§

Implementations§

Source§

impl ConstructorKind

Source

pub fn field_types(&self, db: &dyn AnalyzerDb) -> Vec<TypeId>

Source

pub fn arity(&self, db: &dyn AnalyzerDb) -> usize

Source

pub fn ty(&self, db: &dyn AnalyzerDb) -> TypeId

Trait Implementations§

Source§

impl Clone for ConstructorKind

Source§

fn clone(&self) -> ConstructorKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstructorKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ConstructorKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ConstructorKind

Source§

fn eq(&self, other: &ConstructorKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ConstructorKind

Source§

impl Eq for ConstructorKind

Source§

impl StructuralPartialEq for ConstructorKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/enum.LiteralConstructor.html b/compiler-docs/fe_analyzer/pattern_analysis/enum.LiteralConstructor.html new file mode 100644 index 0000000000..951e0f884d --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/enum.LiteralConstructor.html @@ -0,0 +1,24 @@ +LiteralConstructor in fe_analyzer::pattern_analysis - Rust

Enum LiteralConstructor

Source
pub enum LiteralConstructor {
+    Bool(bool),
+}

Variants§

§

Bool(bool)

Trait Implementations§

Source§

impl Clone for LiteralConstructor

Source§

fn clone(&self) -> LiteralConstructor

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LiteralConstructor

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for LiteralConstructor

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for LiteralConstructor

Source§

fn eq(&self, other: &LiteralConstructor) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for LiteralConstructor

Source§

impl Eq for LiteralConstructor

Source§

impl StructuralPartialEq for LiteralConstructor

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/enum.SimplifiedPatternKind.html b/compiler-docs/fe_analyzer/pattern_analysis/enum.SimplifiedPatternKind.html new file mode 100644 index 0000000000..377e1569b1 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/enum.SimplifiedPatternKind.html @@ -0,0 +1,30 @@ +SimplifiedPatternKind in fe_analyzer::pattern_analysis - Rust

Enum SimplifiedPatternKind

Source
pub enum SimplifiedPatternKind {
+    WildCard(Option<(SmolStr, usize)>),
+    Constructor {
+        kind: ConstructorKind,
+        fields: Vec<SimplifiedPattern>,
+    },
+    Or(Vec<SimplifiedPattern>),
+}

Variants§

§

WildCard(Option<(SmolStr, usize)>)

§

Constructor

§

Or(Vec<SimplifiedPattern>)

Implementations§

Trait Implementations§

Source§

impl Clone for SimplifiedPatternKind

Source§

fn clone(&self) -> SimplifiedPatternKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SimplifiedPatternKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for SimplifiedPatternKind

Source§

fn eq(&self, other: &SimplifiedPatternKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SimplifiedPatternKind

Source§

impl StructuralPartialEq for SimplifiedPatternKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/index.html b/compiler-docs/fe_analyzer/pattern_analysis/index.html new file mode 100644 index 0000000000..a40df913fa --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/index.html @@ -0,0 +1,5 @@ +fe_analyzer::pattern_analysis - Rust

Module pattern_analysis

Source
Expand description

This module includes utility structs and its functions for pattern matching +analysis. The algorithm here is based on Warnings for pattern matching

+

In this module, we assume all types are well-typed, so we can rely on the +type information without checking it.

+

Structs§

PatternMatrix
PatternRowVec
SigmaSet
SimplifiedPattern

Enums§

ConstructorKind
LiteralConstructor
SimplifiedPatternKind
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/sidebar-items.js b/compiler-docs/fe_analyzer/pattern_analysis/sidebar-items.js new file mode 100644 index 0000000000..e090f1131b --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ConstructorKind","LiteralConstructor","SimplifiedPatternKind"],"struct":["PatternMatrix","PatternRowVec","SigmaSet","SimplifiedPattern"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternMatrix.html b/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternMatrix.html new file mode 100644 index 0000000000..ab6ef4ef97 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternMatrix.html @@ -0,0 +1,27 @@ +PatternMatrix in fe_analyzer::pattern_analysis - Rust

Struct PatternMatrix

Source
pub struct PatternMatrix { /* private fields */ }

Implementations§

Source§

impl PatternMatrix

Source

pub fn new(rows: Vec<PatternRowVec>) -> Self

Source

pub fn from_arms<'db>( + scope: &'db BlockScope<'db, 'db>, + arms: &[Node<MatchArm>], + ty: TypeId, +) -> Self

Source

pub fn rows(&self) -> &[PatternRowVec]

Source

pub fn into_rows(self) -> Vec<PatternRowVec>

Source

pub fn find_non_exhaustiveness( + &self, + db: &dyn AnalyzerDb, +) -> Option<Vec<SimplifiedPattern>>

Source

pub fn is_row_useful(&self, db: &dyn AnalyzerDb, row: usize) -> bool

Source

pub fn nrows(&self) -> usize

Source

pub fn ncols(&self) -> usize

Source

pub fn swap_col(&mut self, col1: usize, col2: usize)

Source

pub fn sigma_set(&self) -> SigmaSet

Source

pub fn phi_specialize(&self, db: &dyn AnalyzerDb, ctor: ConstructorKind) -> Self

Source

pub fn d_specialize(&self, db: &dyn AnalyzerDb) -> Self

Trait Implementations§

Source§

impl Clone for PatternMatrix

Source§

fn clone(&self) -> PatternMatrix

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PatternMatrix

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for PatternMatrix

Source§

fn eq(&self, other: &PatternMatrix) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for PatternMatrix

Source§

impl StructuralPartialEq for PatternMatrix

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternRowVec.html b/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternRowVec.html new file mode 100644 index 0000000000..78639564b7 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/struct.PatternRowVec.html @@ -0,0 +1,26 @@ +PatternRowVec in fe_analyzer::pattern_analysis - Rust

Struct PatternRowVec

Source
pub struct PatternRowVec {
+    pub inner: Vec<SimplifiedPattern>,
+}

Fields§

§inner: Vec<SimplifiedPattern>

Implementations§

Source§

impl PatternRowVec

Source

pub fn new(inner: Vec<SimplifiedPattern>) -> Self

Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn pats(&self) -> &[SimplifiedPattern]

Source

pub fn head(&self) -> Option<&SimplifiedPattern>

Source

pub fn phi_specialize( + &self, + db: &dyn AnalyzerDb, + ctor: ConstructorKind, +) -> Vec<Self>

Source

pub fn swap(&mut self, a: usize, b: usize)

Source

pub fn d_specialize(&self, _db: &dyn AnalyzerDb) -> Vec<Self>

Source

pub fn collect_column_ctors(&self, column: usize) -> Vec<ConstructorKind>

Trait Implementations§

Source§

impl Clone for PatternRowVec

Source§

fn clone(&self) -> PatternRowVec

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PatternRowVec

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for PatternRowVec

Source§

fn eq(&self, other: &PatternRowVec) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for PatternRowVec

Source§

impl StructuralPartialEq for PatternRowVec

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/struct.SigmaSet.html b/compiler-docs/fe_analyzer/pattern_analysis/struct.SigmaSet.html new file mode 100644 index 0000000000..6c24079e20 --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/struct.SigmaSet.html @@ -0,0 +1,23 @@ +SigmaSet in fe_analyzer::pattern_analysis - Rust

Struct SigmaSet

Source
pub struct SigmaSet(/* private fields */);

Implementations§

Source§

impl SigmaSet

Source

pub fn from_rows<'a>( + rows: impl Iterator<Item = &'a PatternRowVec>, + column: usize, +) -> Self

Source

pub fn complete_sigma(db: &dyn AnalyzerDb, ty: TypeId) -> Self

Source

pub fn is_complete(&self, db: &dyn AnalyzerDb) -> bool

Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn iter(&self) -> impl Iterator<Item = &ConstructorKind>

Source

pub fn difference(&self, other: &Self) -> Self

Trait Implementations§

Source§

impl Clone for SigmaSet

Source§

fn clone(&self) -> SigmaSet

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SigmaSet

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl IntoIterator for SigmaSet

Source§

type Item = ConstructorKind

The type of the elements being iterated over.
Source§

type IntoIter = <IndexSet<ConstructorKind> as IntoIterator>::IntoIter

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> Self::IntoIter

Creates an iterator from a value. Read more
Source§

impl PartialEq for SigmaSet

Source§

fn eq(&self, other: &SigmaSet) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SigmaSet

Source§

impl StructuralPartialEq for SigmaSet

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/pattern_analysis/struct.SimplifiedPattern.html b/compiler-docs/fe_analyzer/pattern_analysis/struct.SimplifiedPattern.html new file mode 100644 index 0000000000..27a804350c --- /dev/null +++ b/compiler-docs/fe_analyzer/pattern_analysis/struct.SimplifiedPattern.html @@ -0,0 +1,27 @@ +SimplifiedPattern in fe_analyzer::pattern_analysis - Rust

Struct SimplifiedPattern

Source
pub struct SimplifiedPattern {
+    pub kind: SimplifiedPatternKind,
+    pub ty: TypeId,
+}

Fields§

§kind: SimplifiedPatternKind§ty: TypeId

Implementations§

Source§

impl SimplifiedPattern

Source

pub fn new(kind: SimplifiedPatternKind, ty: TypeId) -> Self

Source

pub fn wildcard(bind: Option<(SmolStr, usize)>, ty: TypeId) -> Self

Source

pub fn is_wildcard(&self) -> bool

Trait Implementations§

Source§

impl Clone for SimplifiedPattern

Source§

fn clone(&self) -> SimplifiedPattern

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SimplifiedPattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl DisplayWithDb for SimplifiedPattern

Source§

fn format(&self, db: &dyn AnalyzerDb, f: &mut Formatter<'_>) -> Result

Source§

impl PartialEq for SimplifiedPattern

Source§

fn eq(&self, other: &SimplifiedPattern) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SimplifiedPattern

Source§

impl StructuralPartialEq for SimplifiedPattern

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Displayable for T
where + T: DisplayWithDb,

Source§

fn display<'a, 'b>( + &'a self, + db: &'b dyn AnalyzerDb, +) -> DisplayableWrapper<'b, &'a Self>

Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_analyzer/sidebar-items.js b/compiler-docs/fe_analyzer/sidebar-items.js new file mode 100644 index 0000000000..5ac4d35640 --- /dev/null +++ b/compiler-docs/fe_analyzer/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["analyze_ingot","analyze_module"],"mod":["builtins","constants","context","db","display","errors","namespace","pattern_analysis"]}; \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.ConstructorKind.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.ConstructorKind.html new file mode 100644 index 0000000000..5bba4a1f83 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.ConstructorKind.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/enum.ConstructorKind.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.LiteralConstructor.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.LiteralConstructor.html new file mode 100644 index 0000000000..385ee87317 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.LiteralConstructor.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/enum.LiteralConstructor.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.SimplifiedPatternKind.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.SimplifiedPatternKind.html new file mode 100644 index 0000000000..714b8ce7bb --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/enum.SimplifiedPatternKind.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/enum.SimplifiedPatternKind.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/index.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/index.html new file mode 100644 index 0000000000..f48ee721f9 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/index.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/index.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternMatrix.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternMatrix.html new file mode 100644 index 0000000000..dc8b80e32b --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternMatrix.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/struct.PatternMatrix.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternRowVec.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternRowVec.html new file mode 100644 index 0000000000..e5a150afdc --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.PatternRowVec.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/struct.PatternRowVec.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SigmaSet.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SigmaSet.html new file mode 100644 index 0000000000..4213287d15 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SigmaSet.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/struct.SigmaSet.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SimplifiedPattern.html b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SimplifiedPattern.html new file mode 100644 index 0000000000..6fa68ba8e1 --- /dev/null +++ b/compiler-docs/fe_analyzer/traversal/pattern_analysis/struct.SimplifiedPattern.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_analyzer/pattern_analysis/struct.SimplifiedPattern.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/all.html b/compiler-docs/fe_codegen/all.html new file mode 100644 index 0000000000..c0e87cc195 --- /dev/null +++ b/compiler-docs/fe_codegen/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/index.html b/compiler-docs/fe_codegen/db/index.html new file mode 100644 index 0000000000..1a38066f00 --- /dev/null +++ b/compiler-docs/fe_codegen/db/index.html @@ -0,0 +1 @@ +fe_codegen::db - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/sidebar-items.js b/compiler-docs/fe_codegen/db/sidebar-items.js new file mode 100644 index 0000000000..4c04492145 --- /dev/null +++ b/compiler-docs/fe_codegen/db/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["CodegenAbiContractQuery","CodegenAbiEventQuery","CodegenAbiFunctionArgumentMaximumSizeQuery","CodegenAbiFunctionQuery","CodegenAbiFunctionReturnMaximumSizeQuery","CodegenAbiModuleEventsQuery","CodegenAbiTypeMaximumSizeQuery","CodegenAbiTypeMinimumSizeQuery","CodegenAbiTypeQuery","CodegenConstantStringSymbolNameQuery","CodegenContractDeployerSymbolNameQuery","CodegenContractSymbolNameQuery","CodegenDbGroupStorage__","CodegenDbStorage","CodegenFunctionSymbolNameQuery","CodegenLegalizedBodyQuery","CodegenLegalizedSignatureQuery","CodegenLegalizedTypeQuery","Db"],"trait":["CodegenDb"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiContractQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiContractQuery.html new file mode 100644 index 0000000000..f65d3458bf --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiContractQuery.html @@ -0,0 +1,46 @@ +CodegenAbiContractQuery in fe_codegen::db - Rust

Struct CodegenAbiContractQuery

Source
pub struct CodegenAbiContractQuery;

Implementations§

Source§

impl CodegenAbiContractQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiContractQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiContractQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiContractQuery

Source§

fn default() -> CodegenAbiContractQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiContractQuery

Source§

const QUERY_INDEX: u16 = 7u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_contract"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AbiContract

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiContractQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiContractQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiContractQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiEventQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiEventQuery.html new file mode 100644 index 0000000000..914576551a --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiEventQuery.html @@ -0,0 +1,46 @@ +CodegenAbiEventQuery in fe_codegen::db - Rust

Struct CodegenAbiEventQuery

Source
pub struct CodegenAbiEventQuery;

Implementations§

Source§

impl CodegenAbiEventQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiEventQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiEventQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiEventQuery

Source§

fn default() -> CodegenAbiEventQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiEventQuery

Source§

const QUERY_INDEX: u16 = 6u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_event"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AbiEvent

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiEventQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiEventQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiEventQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionArgumentMaximumSizeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionArgumentMaximumSizeQuery.html new file mode 100644 index 0000000000..736705410d --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionArgumentMaximumSizeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiFunctionArgumentMaximumSizeQuery in fe_codegen::db - Rust

Struct CodegenAbiFunctionArgumentMaximumSizeQuery

Source
pub struct CodegenAbiFunctionArgumentMaximumSizeQuery;

Implementations§

Source§

impl CodegenAbiFunctionArgumentMaximumSizeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiFunctionArgumentMaximumSizeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

fn default() -> CodegenAbiFunctionArgumentMaximumSizeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

const QUERY_INDEX: u16 = 11u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_function_argument_maximum_size"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = usize

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiFunctionArgumentMaximumSizeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiFunctionArgumentMaximumSizeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionQuery.html new file mode 100644 index 0000000000..18c939d5ec --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionQuery.html @@ -0,0 +1,46 @@ +CodegenAbiFunctionQuery in fe_codegen::db - Rust

Struct CodegenAbiFunctionQuery

Source
pub struct CodegenAbiFunctionQuery;

Implementations§

Source§

impl CodegenAbiFunctionQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiFunctionQuery

Source§

fn default() -> CodegenAbiFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiFunctionQuery

Source§

const QUERY_INDEX: u16 = 5u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_function"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AbiFunction

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiFunctionQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiFunctionQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiFunctionQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionReturnMaximumSizeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionReturnMaximumSizeQuery.html new file mode 100644 index 0000000000..99ffda96f1 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiFunctionReturnMaximumSizeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiFunctionReturnMaximumSizeQuery in fe_codegen::db - Rust

Struct CodegenAbiFunctionReturnMaximumSizeQuery

Source
pub struct CodegenAbiFunctionReturnMaximumSizeQuery;

Implementations§

Source§

impl CodegenAbiFunctionReturnMaximumSizeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiFunctionReturnMaximumSizeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

fn default() -> CodegenAbiFunctionReturnMaximumSizeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

const QUERY_INDEX: u16 = 12u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_function_return_maximum_size"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = usize

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiFunctionReturnMaximumSizeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiFunctionReturnMaximumSizeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiModuleEventsQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiModuleEventsQuery.html new file mode 100644 index 0000000000..2926ea1d2d --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiModuleEventsQuery.html @@ -0,0 +1,46 @@ +CodegenAbiModuleEventsQuery in fe_codegen::db - Rust

Struct CodegenAbiModuleEventsQuery

Source
pub struct CodegenAbiModuleEventsQuery;

Implementations§

Source§

impl CodegenAbiModuleEventsQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiModuleEventsQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiModuleEventsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiModuleEventsQuery

Source§

fn default() -> CodegenAbiModuleEventsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiModuleEventsQuery

Source§

const QUERY_INDEX: u16 = 8u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_module_events"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Vec<AbiEvent>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiModuleEventsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiModuleEventsQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiModuleEventsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMaximumSizeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMaximumSizeQuery.html new file mode 100644 index 0000000000..d858f44113 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMaximumSizeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiTypeMaximumSizeQuery in fe_codegen::db - Rust

Struct CodegenAbiTypeMaximumSizeQuery

Source
pub struct CodegenAbiTypeMaximumSizeQuery;

Implementations§

Source§

impl CodegenAbiTypeMaximumSizeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiTypeMaximumSizeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiTypeMaximumSizeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiTypeMaximumSizeQuery

Source§

fn default() -> CodegenAbiTypeMaximumSizeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiTypeMaximumSizeQuery

Source§

const QUERY_INDEX: u16 = 9u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_type_maximum_size"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = usize

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiTypeMaximumSizeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiTypeMaximumSizeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiTypeMaximumSizeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMinimumSizeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMinimumSizeQuery.html new file mode 100644 index 0000000000..81a39c9dce --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeMinimumSizeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiTypeMinimumSizeQuery in fe_codegen::db - Rust

Struct CodegenAbiTypeMinimumSizeQuery

Source
pub struct CodegenAbiTypeMinimumSizeQuery;

Implementations§

Source§

impl CodegenAbiTypeMinimumSizeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiTypeMinimumSizeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiTypeMinimumSizeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiTypeMinimumSizeQuery

Source§

fn default() -> CodegenAbiTypeMinimumSizeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiTypeMinimumSizeQuery

Source§

const QUERY_INDEX: u16 = 10u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_type_minimum_size"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = usize

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiTypeMinimumSizeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiTypeMinimumSizeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiTypeMinimumSizeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeQuery.html new file mode 100644 index 0000000000..c1b20815b9 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenAbiTypeQuery.html @@ -0,0 +1,46 @@ +CodegenAbiTypeQuery in fe_codegen::db - Rust

Struct CodegenAbiTypeQuery

Source
pub struct CodegenAbiTypeQuery;

Implementations§

Source§

impl CodegenAbiTypeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenAbiTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenAbiTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenAbiTypeQuery

Source§

fn default() -> CodegenAbiTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenAbiTypeQuery

Source§

const QUERY_INDEX: u16 = 4u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_abi_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = AbiType

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenAbiTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenAbiTypeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenAbiTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenConstantStringSymbolNameQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenConstantStringSymbolNameQuery.html new file mode 100644 index 0000000000..485e419336 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenConstantStringSymbolNameQuery.html @@ -0,0 +1,46 @@ +CodegenConstantStringSymbolNameQuery in fe_codegen::db - Rust

Struct CodegenConstantStringSymbolNameQuery

Source
pub struct CodegenConstantStringSymbolNameQuery;

Implementations§

Source§

impl CodegenConstantStringSymbolNameQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenConstantStringSymbolNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenConstantStringSymbolNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenConstantStringSymbolNameQuery

Source§

fn default() -> CodegenConstantStringSymbolNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenConstantStringSymbolNameQuery

Source§

const QUERY_INDEX: u16 = 15u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_constant_string_symbol_name"

Name of the query method (e.g., foo)
Source§

type Key = String

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<String>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenConstantStringSymbolNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenConstantStringSymbolNameQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenConstantStringSymbolNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenContractDeployerSymbolNameQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenContractDeployerSymbolNameQuery.html new file mode 100644 index 0000000000..3a951dd841 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenContractDeployerSymbolNameQuery.html @@ -0,0 +1,46 @@ +CodegenContractDeployerSymbolNameQuery in fe_codegen::db - Rust

Struct CodegenContractDeployerSymbolNameQuery

Source
pub struct CodegenContractDeployerSymbolNameQuery;

Implementations§

Source§

impl CodegenContractDeployerSymbolNameQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenContractDeployerSymbolNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenContractDeployerSymbolNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenContractDeployerSymbolNameQuery

Source§

fn default() -> CodegenContractDeployerSymbolNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenContractDeployerSymbolNameQuery

Source§

const QUERY_INDEX: u16 = 14u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_contract_deployer_symbol_name"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<String>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenContractDeployerSymbolNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenContractDeployerSymbolNameQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenContractDeployerSymbolNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenContractSymbolNameQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenContractSymbolNameQuery.html new file mode 100644 index 0000000000..3f0445c149 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenContractSymbolNameQuery.html @@ -0,0 +1,46 @@ +CodegenContractSymbolNameQuery in fe_codegen::db - Rust

Struct CodegenContractSymbolNameQuery

Source
pub struct CodegenContractSymbolNameQuery;

Implementations§

Source§

impl CodegenContractSymbolNameQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenContractSymbolNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenContractSymbolNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenContractSymbolNameQuery

Source§

fn default() -> CodegenContractSymbolNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenContractSymbolNameQuery

Source§

const QUERY_INDEX: u16 = 13u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_contract_symbol_name"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<String>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenContractSymbolNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenContractSymbolNameQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenContractSymbolNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenDbGroupStorage__.html b/compiler-docs/fe_codegen/db/struct.CodegenDbGroupStorage__.html new file mode 100644 index 0000000000..229da9fd11 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenDbGroupStorage__.html @@ -0,0 +1,42 @@ +CodegenDbGroupStorage__ in fe_codegen::db - Rust

Struct CodegenDbGroupStorage__

Source
pub struct CodegenDbGroupStorage__ {
Show 16 fields + pub codegen_legalized_signature: Arc<<CodegenLegalizedSignatureQuery as Query>::Storage>, + pub codegen_legalized_body: Arc<<CodegenLegalizedBodyQuery as Query>::Storage>, + pub codegen_function_symbol_name: Arc<<CodegenFunctionSymbolNameQuery as Query>::Storage>, + pub codegen_legalized_type: Arc<<CodegenLegalizedTypeQuery as Query>::Storage>, + pub codegen_abi_type: Arc<<CodegenAbiTypeQuery as Query>::Storage>, + pub codegen_abi_function: Arc<<CodegenAbiFunctionQuery as Query>::Storage>, + pub codegen_abi_event: Arc<<CodegenAbiEventQuery as Query>::Storage>, + pub codegen_abi_contract: Arc<<CodegenAbiContractQuery as Query>::Storage>, + pub codegen_abi_module_events: Arc<<CodegenAbiModuleEventsQuery as Query>::Storage>, + pub codegen_abi_type_maximum_size: Arc<<CodegenAbiTypeMaximumSizeQuery as Query>::Storage>, + pub codegen_abi_type_minimum_size: Arc<<CodegenAbiTypeMinimumSizeQuery as Query>::Storage>, + pub codegen_abi_function_argument_maximum_size: Arc<<CodegenAbiFunctionArgumentMaximumSizeQuery as Query>::Storage>, + pub codegen_abi_function_return_maximum_size: Arc<<CodegenAbiFunctionReturnMaximumSizeQuery as Query>::Storage>, + pub codegen_contract_symbol_name: Arc<<CodegenContractSymbolNameQuery as Query>::Storage>, + pub codegen_contract_deployer_symbol_name: Arc<<CodegenContractDeployerSymbolNameQuery as Query>::Storage>, + pub codegen_constant_string_symbol_name: Arc<<CodegenConstantStringSymbolNameQuery as Query>::Storage>, +
}

Fields§

§codegen_legalized_signature: Arc<<CodegenLegalizedSignatureQuery as Query>::Storage>§codegen_legalized_body: Arc<<CodegenLegalizedBodyQuery as Query>::Storage>§codegen_function_symbol_name: Arc<<CodegenFunctionSymbolNameQuery as Query>::Storage>§codegen_legalized_type: Arc<<CodegenLegalizedTypeQuery as Query>::Storage>§codegen_abi_type: Arc<<CodegenAbiTypeQuery as Query>::Storage>§codegen_abi_function: Arc<<CodegenAbiFunctionQuery as Query>::Storage>§codegen_abi_event: Arc<<CodegenAbiEventQuery as Query>::Storage>§codegen_abi_contract: Arc<<CodegenAbiContractQuery as Query>::Storage>§codegen_abi_module_events: Arc<<CodegenAbiModuleEventsQuery as Query>::Storage>§codegen_abi_type_maximum_size: Arc<<CodegenAbiTypeMaximumSizeQuery as Query>::Storage>§codegen_abi_type_minimum_size: Arc<<CodegenAbiTypeMinimumSizeQuery as Query>::Storage>§codegen_abi_function_argument_maximum_size: Arc<<CodegenAbiFunctionArgumentMaximumSizeQuery as Query>::Storage>§codegen_abi_function_return_maximum_size: Arc<<CodegenAbiFunctionReturnMaximumSizeQuery as Query>::Storage>§codegen_contract_symbol_name: Arc<<CodegenContractSymbolNameQuery as Query>::Storage>§codegen_contract_deployer_symbol_name: Arc<<CodegenContractDeployerSymbolNameQuery as Query>::Storage>§codegen_constant_string_symbol_name: Arc<<CodegenConstantStringSymbolNameQuery as Query>::Storage>

Implementations§

Source§

impl CodegenDbGroupStorage__

Source

pub fn new(group_index: u16) -> Self

Source§

impl CodegenDbGroupStorage__

Source

pub fn fmt_index( + &self, + db: &(dyn CodegenDb + '_), + input: DatabaseKeyIndex, + fmt: &mut Formatter<'_>, +) -> Result

Source

pub fn maybe_changed_since( + &self, + db: &(dyn CodegenDb + '_), + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

Source

pub fn for_each_query( + &self, + _runtime: &Runtime, + op: &mut dyn FnMut(&dyn QueryStorageMassOps), +)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenDbStorage.html b/compiler-docs/fe_codegen/db/struct.CodegenDbStorage.html new file mode 100644 index 0000000000..ffa48cc24e --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenDbStorage.html @@ -0,0 +1,12 @@ +CodegenDbStorage in fe_codegen::db - Rust

Struct CodegenDbStorage

Source
pub struct CodegenDbStorage {}
Expand description

Representative struct for the query group.

+

Trait Implementations§

Source§

impl HasQueryGroup<CodegenDbStorage> for Db

Source§

fn group_storage(&self) -> &<CodegenDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl QueryGroup for CodegenDbStorage

Source§

type DynDb = dyn CodegenDb

Dyn version of the associated database trait.
Source§

type GroupStorage = CodegenDbGroupStorage__

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenFunctionSymbolNameQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenFunctionSymbolNameQuery.html new file mode 100644 index 0000000000..e42d4d3146 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenFunctionSymbolNameQuery.html @@ -0,0 +1,46 @@ +CodegenFunctionSymbolNameQuery in fe_codegen::db - Rust

Struct CodegenFunctionSymbolNameQuery

Source
pub struct CodegenFunctionSymbolNameQuery;

Implementations§

Source§

impl CodegenFunctionSymbolNameQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenFunctionSymbolNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenFunctionSymbolNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenFunctionSymbolNameQuery

Source§

fn default() -> CodegenFunctionSymbolNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenFunctionSymbolNameQuery

Source§

const QUERY_INDEX: u16 = 2u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_function_symbol_name"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<String>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenFunctionSymbolNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenFunctionSymbolNameQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenFunctionSymbolNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenLegalizedBodyQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedBodyQuery.html new file mode 100644 index 0000000000..e84e357011 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedBodyQuery.html @@ -0,0 +1,46 @@ +CodegenLegalizedBodyQuery in fe_codegen::db - Rust

Struct CodegenLegalizedBodyQuery

Source
pub struct CodegenLegalizedBodyQuery;

Implementations§

Source§

impl CodegenLegalizedBodyQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenLegalizedBodyQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenLegalizedBodyQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenLegalizedBodyQuery

Source§

fn default() -> CodegenLegalizedBodyQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenLegalizedBodyQuery

Source§

const QUERY_INDEX: u16 = 1u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_legalized_body"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionBody>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenLegalizedBodyQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenLegalizedBodyQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenLegalizedBodyQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenLegalizedSignatureQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedSignatureQuery.html new file mode 100644 index 0000000000..091dc17269 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedSignatureQuery.html @@ -0,0 +1,46 @@ +CodegenLegalizedSignatureQuery in fe_codegen::db - Rust

Struct CodegenLegalizedSignatureQuery

Source
pub struct CodegenLegalizedSignatureQuery;

Implementations§

Source§

impl CodegenLegalizedSignatureQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenLegalizedSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenLegalizedSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenLegalizedSignatureQuery

Source§

fn default() -> CodegenLegalizedSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenLegalizedSignatureQuery

Source§

const QUERY_INDEX: u16 = 0u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_legalized_signature"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionSignature>

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenLegalizedSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenLegalizedSignatureQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenLegalizedSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.CodegenLegalizedTypeQuery.html b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedTypeQuery.html new file mode 100644 index 0000000000..ab681f0db4 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.CodegenLegalizedTypeQuery.html @@ -0,0 +1,46 @@ +CodegenLegalizedTypeQuery in fe_codegen::db - Rust

Struct CodegenLegalizedTypeQuery

Source
pub struct CodegenLegalizedTypeQuery;

Implementations§

Source§

impl CodegenLegalizedTypeQuery

Source

pub fn in_db(self, db: &dyn CodegenDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl CodegenLegalizedTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn CodegenDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for CodegenLegalizedTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for CodegenLegalizedTypeQuery

Source§

fn default() -> CodegenLegalizedTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for CodegenLegalizedTypeQuery

Source§

const QUERY_INDEX: u16 = 3u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "codegen_legalized_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeId

What value does the query return?
Source§

type Storage = DerivedStorage<CodegenLegalizedTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for CodegenLegalizedTypeQuery

Source§

type DynDb = dyn CodegenDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = CodegenDbStorage

Associate query group struct.
Source§

type GroupStorage = CodegenDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for CodegenLegalizedTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/struct.Db.html b/compiler-docs/fe_codegen/db/struct.Db.html new file mode 100644 index 0000000000..27f0bcde77 --- /dev/null +++ b/compiler-docs/fe_codegen/db/struct.Db.html @@ -0,0 +1,135 @@ +Db in fe_codegen::db - Rust

Struct Db

Source
pub struct Db { /* private fields */ }

Trait Implementations§

Source§

impl Database for Db

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

impl DatabaseOps for Db

Source§

fn ops_database(&self) -> &dyn Database

Upcast this type to a dyn Database.
Source§

fn ops_salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
Source§

fn ops_salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

fn fmt_index(&self, input: DatabaseKeyIndex, fmt: &mut Formatter<'_>) -> Result

Formats a database key index in a human readable fashion.
Source§

fn maybe_changed_since( + &self, + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

True if the computed value for input may have changed since revision.
Source§

fn for_each_query(&self, op: &mut dyn FnMut(&dyn QueryStorageMassOps))

Executes the callback for each kind of query.
Source§

impl DatabaseStorageTypes for Db

Source§

type DatabaseStorage = __SalsaDatabaseStorage

Defines the “storage type”, where all the query data is kept. +This type is defined by the database_storage macro.
Source§

impl Default for Db

Source§

fn default() -> Db

Returns the “default value” for a type. Read more
Source§

impl HasQueryGroup<AnalyzerDbStorage> for Db

Source§

fn group_storage(&self) -> &<AnalyzerDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<CodegenDbStorage> for Db

Source§

fn group_storage(&self) -> &<CodegenDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<MirDbStorage> for Db

Source§

fn group_storage(&self) -> &<MirDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<SourceDbStorage> for Db

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl Upcast<dyn AnalyzerDb> for Db

Source§

fn upcast(&self) -> &(dyn AnalyzerDb + 'static)

Source§

impl Upcast<dyn MirDb> for Db

Source§

fn upcast(&self) -> &(dyn MirDb + 'static)

Source§

impl Upcast<dyn SourceDb> for Db

Source§

fn upcast(&self) -> &(dyn SourceDb + 'static)

Source§

impl UpcastMut<dyn AnalyzerDb> for Db

Source§

fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static)

Source§

impl UpcastMut<dyn MirDb> for Db

Source§

fn upcast_mut(&mut self) -> &mut (dyn MirDb + 'static)

Source§

impl UpcastMut<dyn SourceDb> for Db

Source§

fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static)

Auto Trait Implementations§

§

impl !Freeze for Db

§

impl RefUnwindSafe for Db

§

impl !Send for Db

§

impl !Sync for Db

§

impl Unpin for Db

§

impl UnwindSafe for Db

Blanket Implementations§

§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

§

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

§

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

§

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

§

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

§

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

§

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

§

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

§

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

§

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

§

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

§

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

§

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

§

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

§

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

§

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

§

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

§

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

§

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

§

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

§

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

§

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

§

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

§

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

§

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

§

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

§

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

§

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

§

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

§

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

§

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

§

fn intern_type(&self, key0: Type) -> TypeId

§

fn lookup_intern_type(&self, key0: TypeId) -> Type

§

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

§

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input. Read more
§

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again. Read more
§

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

§

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input. Read more
§

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again. Read more
§

fn root_ingot(&self) -> IngotId

§

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input. Read more
§

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again. Read more
§

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

§

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

§

fn module_file_path(&self, key0: ModuleId) -> SmolStr

§

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

§

fn module_is_incomplete(&self, key0: ModuleId) -> bool

§

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

§

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

§

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

§

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

§

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

§

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

§

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

§

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

§

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

§

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

§

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

§

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

§

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

§

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

§

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

§

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

§

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

§

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

§

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

§

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

§

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

§

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

§

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

§

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

§

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

§

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

§

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

§

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

§

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

§

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

§

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

§

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

§

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

§

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

§

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

§

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<DB> CodegenDb for DB
where + DB: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> + Database + HasQueryGroup<CodegenDbStorage>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> MirDb for DB
where + DB: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> + Database + HasQueryGroup<MirDbStorage>,

Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

Source§

fn intern_file(&self, key0: File) -> SourceFileId

Source§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
Source§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
Source§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
Source§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source§

fn file_name(&self, key0: SourceFileId) -> SmolStr

Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/db/trait.CodegenDb.html b/compiler-docs/fe_codegen/db/trait.CodegenDb.html new file mode 100644 index 0000000000..4b5ef2cd51 --- /dev/null +++ b/compiler-docs/fe_codegen/db/trait.CodegenDb.html @@ -0,0 +1,37 @@ +CodegenDb in fe_codegen::db - Rust

Trait CodegenDb

Source
pub trait CodegenDb:
+    Database
+    + HasQueryGroup<CodegenDbStorage>
+    + MirDb
+    + Upcast<dyn MirDb>
+    + UpcastMut<dyn MirDb> {
+
Show 16 methods // Required methods + fn codegen_legalized_signature( + &self, + key0: FunctionId, + ) -> Rc<FunctionSignature>; + fn codegen_legalized_body(&self, key0: FunctionId) -> Rc<FunctionBody>; + fn codegen_function_symbol_name(&self, key0: FunctionId) -> Rc<String>; + fn codegen_legalized_type(&self, key0: TypeId) -> TypeId; + fn codegen_abi_type(&self, key0: TypeId) -> AbiType; + fn codegen_abi_function(&self, key0: FunctionId) -> AbiFunction; + fn codegen_abi_event(&self, key0: TypeId) -> AbiEvent; + fn codegen_abi_contract(&self, key0: ContractId) -> AbiContract; + fn codegen_abi_module_events(&self, key0: ModuleId) -> Vec<AbiEvent>; + fn codegen_abi_type_maximum_size(&self, key0: TypeId) -> usize; + fn codegen_abi_type_minimum_size(&self, key0: TypeId) -> usize; + fn codegen_abi_function_argument_maximum_size( + &self, + key0: FunctionId, + ) -> usize; + fn codegen_abi_function_return_maximum_size( + &self, + key0: FunctionId, + ) -> usize; + fn codegen_contract_symbol_name(&self, key0: ContractId) -> Rc<String>; + fn codegen_contract_deployer_symbol_name( + &self, + key0: ContractId, + ) -> Rc<String>; + fn codegen_constant_string_symbol_name(&self, key0: String) -> Rc<String>; +
}

Required Methods§

Implementors§

Source§

impl<DB> CodegenDb for DB
where + DB: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> + Database + HasQueryGroup<CodegenDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_codegen/index.html b/compiler-docs/fe_codegen/index.html new file mode 100644 index 0000000000..2c62a0f12a --- /dev/null +++ b/compiler-docs/fe_codegen/index.html @@ -0,0 +1 @@ +fe_codegen - Rust

Crate fe_codegen

Source

Modules§

db
yul
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/sidebar-items.js b/compiler-docs/fe_codegen/sidebar-items.js new file mode 100644 index 0000000000..e5f397f699 --- /dev/null +++ b/compiler-docs/fe_codegen/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["db","yul"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/index.html b/compiler-docs/fe_codegen/yul/index.html new file mode 100644 index 0000000000..9147263c7a --- /dev/null +++ b/compiler-docs/fe_codegen/yul/index.html @@ -0,0 +1 @@ +fe_codegen::yul - Rust

Module yul

Source

Modules§

isel
legalize
runtime
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/context/index.html b/compiler-docs/fe_codegen/yul/isel/context/index.html new file mode 100644 index 0000000000..3e10543d4b --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/context/index.html @@ -0,0 +1 @@ +fe_codegen::yul::isel::context - Rust

Module context

Source

Structs§

Context
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/context/sidebar-items.js b/compiler-docs/fe_codegen/yul/isel/context/sidebar-items.js new file mode 100644 index 0000000000..d31239d146 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/context/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["Context"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/context/struct.Context.html b/compiler-docs/fe_codegen/yul/isel/context/struct.Context.html new file mode 100644 index 0000000000..84b48c7c67 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/context/struct.Context.html @@ -0,0 +1,14 @@ +Context in fe_codegen::yul::isel::context - Rust

Struct Context

Source
pub struct Context {
+    pub runtime: Box<dyn RuntimeProvider>,
+    /* private fields */
+}

Fields§

§runtime: Box<dyn RuntimeProvider>

Trait Implementations§

Source§

impl Default for Context

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for Context

§

impl !RefUnwindSafe for Context

§

impl !Send for Context

§

impl !Sync for Context

§

impl Unpin for Context

§

impl !UnwindSafe for Context

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract.html b/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract.html new file mode 100644 index 0000000000..039910e363 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/isel/fn.lower_contract.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract_deployable.html b/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract_deployable.html new file mode 100644 index 0000000000..3fbfe01517 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/contract/fn.lower_contract_deployable.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/isel/fn.lower_contract_deployable.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/fn.lower_contract.html b/compiler-docs/fe_codegen/yul/isel/fn.lower_contract.html new file mode 100644 index 0000000000..828d17fd1e --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/fn.lower_contract.html @@ -0,0 +1 @@ +lower_contract in fe_codegen::yul::isel - Rust

Function lower_contract

Source
pub fn lower_contract(db: &dyn CodegenDb, contract: ContractId) -> Object
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/fn.lower_contract_deployable.html b/compiler-docs/fe_codegen/yul/isel/fn.lower_contract_deployable.html new file mode 100644 index 0000000000..12673712db --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/fn.lower_contract_deployable.html @@ -0,0 +1,4 @@ +lower_contract_deployable in fe_codegen::yul::isel - Rust

Function lower_contract_deployable

Source
pub fn lower_contract_deployable(
+    db: &dyn CodegenDb,
+    contract: ContractId,
+) -> Object
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/fn.lower_function.html b/compiler-docs/fe_codegen/yul/isel/fn.lower_function.html new file mode 100644 index 0000000000..184aafb3ae --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/fn.lower_function.html @@ -0,0 +1,5 @@ +lower_function in fe_codegen::yul::isel - Rust

Function lower_function

Source
pub fn lower_function(
+    db: &dyn CodegenDb,
+    ctx: &mut Context,
+    function: FunctionId,
+) -> FunctionDefinition
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/fn.lower_test.html b/compiler-docs/fe_codegen/yul/isel/fn.lower_test.html new file mode 100644 index 0000000000..553d1ae480 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/fn.lower_test.html @@ -0,0 +1 @@ +lower_test in fe_codegen::yul::isel - Rust

Function lower_test

Source
pub fn lower_test(db: &dyn CodegenDb, test: FunctionId) -> Object
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/function/fn.lower_function.html b/compiler-docs/fe_codegen/yul/isel/function/fn.lower_function.html new file mode 100644 index 0000000000..52af4a8690 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/function/fn.lower_function.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/isel/fn.lower_function.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/index.html b/compiler-docs/fe_codegen/yul/isel/index.html new file mode 100644 index 0000000000..b8d0126676 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/index.html @@ -0,0 +1 @@ +fe_codegen::yul::isel - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/sidebar-items.js b/compiler-docs/fe_codegen/yul/isel/sidebar-items.js new file mode 100644 index 0000000000..3bec7b23bc --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["lower_contract","lower_contract_deployable","lower_function","lower_test"],"mod":["context"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/isel/test/fn.lower_test.html b/compiler-docs/fe_codegen/yul/isel/test/fn.lower_test.html new file mode 100644 index 0000000000..233f0432fe --- /dev/null +++ b/compiler-docs/fe_codegen/yul/isel/test/fn.lower_test.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/isel/fn.lower_test.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/body/fn.legalize_func_body.html b/compiler-docs/fe_codegen/yul/legalize/body/fn.legalize_func_body.html new file mode 100644 index 0000000000..1834c6bb95 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/body/fn.legalize_func_body.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/legalize/fn.legalize_func_body.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_body.html b/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_body.html new file mode 100644 index 0000000000..df95f2f15d --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_body.html @@ -0,0 +1 @@ +legalize_func_body in fe_codegen::yul::legalize - Rust

Function legalize_func_body

Source
pub fn legalize_func_body(db: &dyn CodegenDb, body: &mut FunctionBody)
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_signature.html b/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_signature.html new file mode 100644 index 0000000000..0a0875876d --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/fn.legalize_func_signature.html @@ -0,0 +1 @@ +legalize_func_signature in fe_codegen::yul::legalize - Rust

Function legalize_func_signature

Source
pub fn legalize_func_signature(db: &dyn CodegenDb, sig: &mut FunctionSignature)
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/index.html b/compiler-docs/fe_codegen/yul/legalize/index.html new file mode 100644 index 0000000000..e41c80d5c4 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/index.html @@ -0,0 +1 @@ +fe_codegen::yul::legalize - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/sidebar-items.js b/compiler-docs/fe_codegen/yul/legalize/sidebar-items.js new file mode 100644 index 0000000000..c4c368b332 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["legalize_func_body","legalize_func_signature"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/legalize/signature/fn.legalize_func_signature.html b/compiler-docs/fe_codegen/yul/legalize/signature/fn.legalize_func_signature.html new file mode 100644 index 0000000000..7d82aef80b --- /dev/null +++ b/compiler-docs/fe_codegen/yul/legalize/signature/fn.legalize_func_signature.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../fe_codegen/yul/legalize/fn.legalize_func_signature.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/enum.AbiSrcLocation.html b/compiler-docs/fe_codegen/yul/runtime/enum.AbiSrcLocation.html new file mode 100644 index 0000000000..ccb48d326d --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/enum.AbiSrcLocation.html @@ -0,0 +1,16 @@ +AbiSrcLocation in fe_codegen::yul::runtime - Rust

Enum AbiSrcLocation

Source
pub enum AbiSrcLocation {
+    CallData,
+    Memory,
+}

Variants§

§

CallData

§

Memory

Trait Implementations§

Source§

impl Clone for AbiSrcLocation

Source§

fn clone(&self) -> AbiSrcLocation

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AbiSrcLocation

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Copy for AbiSrcLocation

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/index.html b/compiler-docs/fe_codegen/yul/runtime/index.html new file mode 100644 index 0000000000..10f2234db9 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/index.html @@ -0,0 +1 @@ +fe_codegen::yul::runtime - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/sidebar-items.js b/compiler-docs/fe_codegen/yul/runtime/sidebar-items.js new file mode 100644 index 0000000000..f8894c45b7 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AbiSrcLocation"],"struct":["DefaultRuntimeProvider"],"trait":["RuntimeProvider"]}; \ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/struct.DefaultRuntimeProvider.html b/compiler-docs/fe_codegen/yul/runtime/struct.DefaultRuntimeProvider.html new file mode 100644 index 0000000000..6d6c03d372 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/struct.DefaultRuntimeProvider.html @@ -0,0 +1,144 @@ +DefaultRuntimeProvider in fe_codegen::yul::runtime - Rust

Struct DefaultRuntimeProvider

Source
pub struct DefaultRuntimeProvider { /* private fields */ }

Trait Implementations§

Source§

impl Debug for DefaultRuntimeProvider

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for DefaultRuntimeProvider

Source§

fn default() -> DefaultRuntimeProvider

Returns the “default value” for a type. Read more
Source§

impl RuntimeProvider for DefaultRuntimeProvider

Source§

fn collect_definitions(&self) -> Vec<FunctionDefinition>

Source§

fn alloc(&mut self, _db: &dyn CodegenDb, bytes: Expression) -> Expression

Source§

fn avail(&mut self, _db: &dyn CodegenDb) -> Expression

Source§

fn create( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, +) -> Expression

Source§

fn create2( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, + salt: Expression, +) -> Expression

Source§

fn emit( + &mut self, + db: &dyn CodegenDb, + event: Expression, + event_ty: TypeId, +) -> Expression

Source§

fn revert( + &mut self, + db: &dyn CodegenDb, + arg: Option<Expression>, + arg_name: &str, + arg_ty: TypeId, +) -> Expression

Source§

fn external_call( + &mut self, + db: &dyn CodegenDb, + function: FunctionId, + args: Vec<Expression>, +) -> Expression

Source§

fn map_value_ptr( + &mut self, + db: &dyn CodegenDb, + map_ptr: Expression, + key: Expression, + key_ty: TypeId, +) -> Expression

Source§

fn aggregate_init( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + args: Vec<Expression>, + ptr_ty: TypeId, + arg_tys: Vec<TypeId>, +) -> Expression

Source§

fn string_copy( + &mut self, + db: &dyn CodegenDb, + dst: Expression, + data: &str, + is_dst_storage: bool, +) -> Expression

Source§

fn string_construct( + &mut self, + db: &dyn CodegenDb, + data: &str, + string_len: usize, +) -> Expression

Source§

fn ptr_copy( + &mut self, + _db: &dyn CodegenDb, + src: Expression, + dst: Expression, + size: Expression, + is_src_storage: bool, + is_dst_storage: bool, +) -> Expression

Copy data from src to dst. +NOTE: src and dst must be aligned by 32 when a ptr is storage ptr.
Source§

fn ptr_store( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + imm: Expression, + ptr_ty: TypeId, +) -> Expression

Source§

fn ptr_load( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + ptr_ty: TypeId, +) -> Expression

Source§

fn abi_encode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + src_ty: TypeId, + is_dst_storage: bool, +) -> Expression

Source§

fn abi_encode_seq( + &mut self, + db: &dyn CodegenDb, + src: &[Expression], + dst: Expression, + src_tys: &[TypeId], + is_dst_storage: bool, +) -> Expression

Source§

fn abi_decode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + size: Expression, + types: &[TypeId], + abi_loc: AbiSrcLocation, +) -> Expression

Source§

fn safe_add( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_sub( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_mul( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_div( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_mod( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn safe_pow( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source§

fn primitive_cast( + &mut self, + db: &dyn CodegenDb, + value: Expression, + from_ty: TypeId, +) -> Expression

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/runtime/trait.RuntimeProvider.html b/compiler-docs/fe_codegen/yul/runtime/trait.RuntimeProvider.html new file mode 100644 index 0000000000..9ce48d6a26 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/runtime/trait.RuntimeProvider.html @@ -0,0 +1,296 @@ +RuntimeProvider in fe_codegen::yul::runtime - Rust

Trait RuntimeProvider

Source
pub trait RuntimeProvider {
+
Show 25 methods // Required methods + fn collect_definitions(&self) -> Vec<FunctionDefinition>; + fn alloc(&mut self, db: &dyn CodegenDb, size: Expression) -> Expression; + fn avail(&mut self, db: &dyn CodegenDb) -> Expression; + fn create( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, + ) -> Expression; + fn create2( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, + salt: Expression, + ) -> Expression; + fn emit( + &mut self, + db: &dyn CodegenDb, + event: Expression, + event_ty: TypeId, + ) -> Expression; + fn revert( + &mut self, + db: &dyn CodegenDb, + arg: Option<Expression>, + arg_name: &str, + arg_ty: TypeId, + ) -> Expression; + fn external_call( + &mut self, + db: &dyn CodegenDb, + function: FunctionId, + args: Vec<Expression>, + ) -> Expression; + fn map_value_ptr( + &mut self, + db: &dyn CodegenDb, + map_ptr: Expression, + key: Expression, + key_ty: TypeId, + ) -> Expression; + fn aggregate_init( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + args: Vec<Expression>, + ptr_ty: TypeId, + arg_tys: Vec<TypeId>, + ) -> Expression; + fn string_copy( + &mut self, + db: &dyn CodegenDb, + dst: Expression, + data: &str, + is_dst_storage: bool, + ) -> Expression; + fn string_construct( + &mut self, + db: &dyn CodegenDb, + data: &str, + string_len: usize, + ) -> Expression; + fn ptr_copy( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + size: Expression, + is_src_storage: bool, + is_dst_storage: bool, + ) -> Expression; + fn ptr_store( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + imm: Expression, + ptr_ty: TypeId, + ) -> Expression; + fn ptr_load( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + ptr_ty: TypeId, + ) -> Expression; + fn abi_encode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + src_ty: TypeId, + is_dst_storage: bool, + ) -> Expression; + fn abi_encode_seq( + &mut self, + db: &dyn CodegenDb, + src: &[Expression], + dst: Expression, + src_tys: &[TypeId], + is_dst_storage: bool, + ) -> Expression; + fn abi_decode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + size: Expression, + types: &[TypeId], + abi_loc: AbiSrcLocation, + ) -> Expression; + fn safe_add( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_sub( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_mul( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_div( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_mod( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + fn safe_pow( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, + ) -> Expression; + + // Provided method + fn primitive_cast( + &mut self, + db: &dyn CodegenDb, + value: Expression, + from_ty: TypeId, + ) -> Expression { ... } +
}

Required Methods§

Source

fn collect_definitions(&self) -> Vec<FunctionDefinition>

Source

fn alloc(&mut self, db: &dyn CodegenDb, size: Expression) -> Expression

Source

fn avail(&mut self, db: &dyn CodegenDb) -> Expression

Source

fn create( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, +) -> Expression

Source

fn create2( + &mut self, + db: &dyn CodegenDb, + contract: ContractId, + value: Expression, + salt: Expression, +) -> Expression

Source

fn emit( + &mut self, + db: &dyn CodegenDb, + event: Expression, + event_ty: TypeId, +) -> Expression

Source

fn revert( + &mut self, + db: &dyn CodegenDb, + arg: Option<Expression>, + arg_name: &str, + arg_ty: TypeId, +) -> Expression

Source

fn external_call( + &mut self, + db: &dyn CodegenDb, + function: FunctionId, + args: Vec<Expression>, +) -> Expression

Source

fn map_value_ptr( + &mut self, + db: &dyn CodegenDb, + map_ptr: Expression, + key: Expression, + key_ty: TypeId, +) -> Expression

Source

fn aggregate_init( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + args: Vec<Expression>, + ptr_ty: TypeId, + arg_tys: Vec<TypeId>, +) -> Expression

Source

fn string_copy( + &mut self, + db: &dyn CodegenDb, + dst: Expression, + data: &str, + is_dst_storage: bool, +) -> Expression

Source

fn string_construct( + &mut self, + db: &dyn CodegenDb, + data: &str, + string_len: usize, +) -> Expression

Source

fn ptr_copy( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + size: Expression, + is_src_storage: bool, + is_dst_storage: bool, +) -> Expression

Copy data from src to dst. +NOTE: src and dst must be aligned by 32 when a ptr is storage ptr.

+
Source

fn ptr_store( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + imm: Expression, + ptr_ty: TypeId, +) -> Expression

Source

fn ptr_load( + &mut self, + db: &dyn CodegenDb, + ptr: Expression, + ptr_ty: TypeId, +) -> Expression

Source

fn abi_encode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + dst: Expression, + src_ty: TypeId, + is_dst_storage: bool, +) -> Expression

Source

fn abi_encode_seq( + &mut self, + db: &dyn CodegenDb, + src: &[Expression], + dst: Expression, + src_tys: &[TypeId], + is_dst_storage: bool, +) -> Expression

Source

fn abi_decode( + &mut self, + db: &dyn CodegenDb, + src: Expression, + size: Expression, + types: &[TypeId], + abi_loc: AbiSrcLocation, +) -> Expression

Source

fn safe_add( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_sub( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_mul( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_div( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_mod( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Source

fn safe_pow( + &mut self, + db: &dyn CodegenDb, + lhs: Expression, + rhs: Expression, + ty: TypeId, +) -> Expression

Provided Methods§

Source

fn primitive_cast( + &mut self, + db: &dyn CodegenDb, + value: Expression, + from_ty: TypeId, +) -> Expression

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_codegen/yul/sidebar-items.js b/compiler-docs/fe_codegen/yul/sidebar-items.js new file mode 100644 index 0000000000..6684c69798 --- /dev/null +++ b/compiler-docs/fe_codegen/yul/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["isel","legalize","runtime"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/all.html b/compiler-docs/fe_common/all.html new file mode 100644 index 0000000000..dd834c8a65 --- /dev/null +++ b/compiler-docs/fe_common/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/index.html b/compiler-docs/fe_common/db/index.html new file mode 100644 index 0000000000..4d8a2d8d44 --- /dev/null +++ b/compiler-docs/fe_common/db/index.html @@ -0,0 +1 @@ +fe_common::db - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/sidebar-items.js b/compiler-docs/fe_common/db/sidebar-items.js new file mode 100644 index 0000000000..0dbd491578 --- /dev/null +++ b/compiler-docs/fe_common/db/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["FileContentQuery","FileLineStartsQuery","FileNameQuery","InternFileLookupQuery","InternFileQuery","SourceDbGroupStorage__","SourceDbStorage","TestDb"],"trait":["SourceDb","Upcast","UpcastMut"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.FileContentQuery.html b/compiler-docs/fe_common/db/struct.FileContentQuery.html new file mode 100644 index 0000000000..f3088329e5 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.FileContentQuery.html @@ -0,0 +1,39 @@ +FileContentQuery in fe_common::db - Rust

Struct FileContentQuery

Source
pub struct FileContentQuery;

Implementations§

Source§

impl FileContentQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FileContentQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FileContentQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FileContentQuery

Source§

fn default() -> FileContentQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FileContentQuery

Source§

const QUERY_INDEX: u16 = 2u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "file_content"

Name of the query method (e.g., foo)
Source§

type Key = SourceFileId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<str>

What value does the query return?
Source§

type Storage = InputStorage<FileContentQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FileContentQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.FileLineStartsQuery.html b/compiler-docs/fe_common/db/struct.FileLineStartsQuery.html new file mode 100644 index 0000000000..3cda608ce0 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.FileLineStartsQuery.html @@ -0,0 +1,46 @@ +FileLineStartsQuery in fe_common::db - Rust

Struct FileLineStartsQuery

Source
pub struct FileLineStartsQuery;

Implementations§

Source§

impl FileLineStartsQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FileLineStartsQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FileLineStartsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FileLineStartsQuery

Source§

fn default() -> FileLineStartsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FileLineStartsQuery

Source§

const QUERY_INDEX: u16 = 3u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "file_line_starts"

Name of the query method (e.g., foo)
Source§

type Key = SourceFileId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<[usize]>

What value does the query return?
Source§

type Storage = DerivedStorage<FileLineStartsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FileLineStartsQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FileLineStartsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.FileNameQuery.html b/compiler-docs/fe_common/db/struct.FileNameQuery.html new file mode 100644 index 0000000000..b10fedaa97 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.FileNameQuery.html @@ -0,0 +1,46 @@ +FileNameQuery in fe_common::db - Rust

Struct FileNameQuery

Source
pub struct FileNameQuery;

Implementations§

Source§

impl FileNameQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl FileNameQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for FileNameQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FileNameQuery

Source§

fn default() -> FileNameQuery

Returns the “default value” for a type. Read more
Source§

impl Query for FileNameQuery

Source§

const QUERY_INDEX: u16 = 4u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "file_name"

Name of the query method (e.g., foo)
Source§

type Key = SourceFileId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = SmolStr

What value does the query return?
Source§

type Storage = DerivedStorage<FileNameQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for FileNameQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for FileNameQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.InternFileLookupQuery.html b/compiler-docs/fe_common/db/struct.InternFileLookupQuery.html new file mode 100644 index 0000000000..88c73e05e7 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.InternFileLookupQuery.html @@ -0,0 +1,39 @@ +InternFileLookupQuery in fe_common::db - Rust

Struct InternFileLookupQuery

Source
pub struct InternFileLookupQuery;

Implementations§

Source§

impl InternFileLookupQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFileLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFileLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFileLookupQuery

Source§

fn default() -> InternFileLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFileLookupQuery

Source§

const QUERY_INDEX: u16 = 1u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_intern_file"

Name of the query method (e.g., foo)
Source§

type Key = SourceFileId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = File

What value does the query return?
Source§

type Storage = LookupInternedStorage<InternFileLookupQuery, InternFileQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFileLookupQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.InternFileQuery.html b/compiler-docs/fe_common/db/struct.InternFileQuery.html new file mode 100644 index 0000000000..e38ab8918d --- /dev/null +++ b/compiler-docs/fe_common/db/struct.InternFileQuery.html @@ -0,0 +1,39 @@ +InternFileQuery in fe_common::db - Rust

Struct InternFileQuery

Source
pub struct InternFileQuery;

Implementations§

Source§

impl InternFileQuery

Source

pub fn in_db(self, db: &dyn SourceDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl InternFileQuery

Source

pub fn in_db_mut(self, db: &mut dyn SourceDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for InternFileQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InternFileQuery

Source§

fn default() -> InternFileQuery

Returns the “default value” for a type. Read more
Source§

impl Query for InternFileQuery

Source§

const QUERY_INDEX: u16 = 0u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "intern_file"

Name of the query method (e.g., foo)
Source§

type Key = File

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = SourceFileId

What value does the query return?
Source§

type Storage = InternedStorage<InternFileQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for InternFileQuery

Source§

type DynDb = dyn SourceDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = SourceDbStorage

Associate query group struct.
Source§

type GroupStorage = SourceDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.SourceDbGroupStorage__.html b/compiler-docs/fe_common/db/struct.SourceDbGroupStorage__.html new file mode 100644 index 0000000000..b25fcc2497 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.SourceDbGroupStorage__.html @@ -0,0 +1,31 @@ +SourceDbGroupStorage__ in fe_common::db - Rust

Struct SourceDbGroupStorage__

Source
pub struct SourceDbGroupStorage__ {
+    pub intern_file: Arc<<InternFileQuery as Query>::Storage>,
+    pub lookup_intern_file: Arc<<InternFileLookupQuery as Query>::Storage>,
+    pub file_content: Arc<<FileContentQuery as Query>::Storage>,
+    pub file_line_starts: Arc<<FileLineStartsQuery as Query>::Storage>,
+    pub file_name: Arc<<FileNameQuery as Query>::Storage>,
+}

Fields§

§intern_file: Arc<<InternFileQuery as Query>::Storage>§lookup_intern_file: Arc<<InternFileLookupQuery as Query>::Storage>§file_content: Arc<<FileContentQuery as Query>::Storage>§file_line_starts: Arc<<FileLineStartsQuery as Query>::Storage>§file_name: Arc<<FileNameQuery as Query>::Storage>

Implementations§

Source§

impl SourceDbGroupStorage__

Source

pub fn new(group_index: u16) -> Self

Source§

impl SourceDbGroupStorage__

Source

pub fn fmt_index( + &self, + db: &(dyn SourceDb + '_), + input: DatabaseKeyIndex, + fmt: &mut Formatter<'_>, +) -> Result

Source

pub fn maybe_changed_since( + &self, + db: &(dyn SourceDb + '_), + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

Source

pub fn for_each_query( + &self, + _runtime: &Runtime, + op: &mut dyn FnMut(&dyn QueryStorageMassOps), +)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.SourceDbStorage.html b/compiler-docs/fe_common/db/struct.SourceDbStorage.html new file mode 100644 index 0000000000..20326d65d1 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.SourceDbStorage.html @@ -0,0 +1,12 @@ +SourceDbStorage in fe_common::db - Rust

Struct SourceDbStorage

Source
pub struct SourceDbStorage {}
Expand description

Representative struct for the query group.

+

Trait Implementations§

Source§

impl HasQueryGroup<SourceDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl QueryGroup for SourceDbStorage

Source§

type DynDb = dyn SourceDb

Dyn version of the associated database trait.
Source§

type GroupStorage = SourceDbGroupStorage__

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/struct.TestDb.html b/compiler-docs/fe_common/db/struct.TestDb.html new file mode 100644 index 0000000000..a5f44d6a28 --- /dev/null +++ b/compiler-docs/fe_common/db/struct.TestDb.html @@ -0,0 +1,32 @@ +TestDb in fe_common::db - Rust

Struct TestDb

Source
pub struct TestDb { /* private fields */ }

Trait Implementations§

Source§

impl Database for TestDb

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

impl DatabaseOps for TestDb

Source§

fn ops_database(&self) -> &dyn Database

Upcast this type to a dyn Database.
Source§

fn ops_salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
Source§

fn ops_salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

fn fmt_index(&self, input: DatabaseKeyIndex, fmt: &mut Formatter<'_>) -> Result

Formats a database key index in a human readable fashion.
Source§

fn maybe_changed_since( + &self, + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

True if the computed value for input may have changed since revision.
Source§

fn for_each_query(&self, op: &mut dyn FnMut(&dyn QueryStorageMassOps))

Executes the callback for each kind of query.
Source§

impl DatabaseStorageTypes for TestDb

Source§

type DatabaseStorage = __SalsaDatabaseStorage

Defines the “storage type”, where all the query data is kept. +This type is defined by the database_storage macro.
Source§

impl Default for TestDb

Source§

fn default() -> TestDb

Returns the “default value” for a type. Read more
Source§

impl HasQueryGroup<SourceDbStorage> for TestDb

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.

Auto Trait Implementations§

§

impl !Freeze for TestDb

§

impl RefUnwindSafe for TestDb

§

impl !Send for TestDb

§

impl !Sync for TestDb

§

impl Unpin for TestDb

§

impl UnwindSafe for TestDb

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

Source§

fn intern_file(&self, key0: File) -> SourceFileId

Source§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
Source§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
Source§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
Source§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source§

fn file_name(&self, key0: SourceFileId) -> SmolStr

Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/db/trait.SourceDb.html b/compiler-docs/fe_common/db/trait.SourceDb.html new file mode 100644 index 0000000000..8dff6797f7 --- /dev/null +++ b/compiler-docs/fe_common/db/trait.SourceDb.html @@ -0,0 +1,33 @@ +SourceDb in fe_common::db - Rust

Trait SourceDb

Source
pub trait SourceDb: Database + HasQueryGroup<SourceDbStorage> {
+    // Required methods
+    fn intern_file(&self, key0: File) -> SourceFileId;
+    fn lookup_intern_file(&self, key0: SourceFileId) -> File;
+    fn file_content(&self, key0: SourceFileId) -> Rc<str>;
+    fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>);
+    fn set_file_content_with_durability(
+        &mut self,
+        key0: SourceFileId,
+        value__: Rc<str>,
+        durability__: Durability,
+    );
+    fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>;
+    fn file_name(&self, key0: SourceFileId) -> SmolStr;
+}

Required Methods§

Source

fn intern_file(&self, key0: File) -> SourceFileId

Source

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)

+
Source

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input.

+

See file_content for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again.

+

See file_content for details.

+

Note: Setting values will trigger cancellation +of any ongoing queries; this method blocks until +those queries have been cancelled.

+
Source

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source

fn file_name(&self, key0: SourceFileId) -> SmolStr

Implementors§

Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_common/db/trait.Upcast.html b/compiler-docs/fe_common/db/trait.Upcast.html new file mode 100644 index 0000000000..27ebc91e53 --- /dev/null +++ b/compiler-docs/fe_common/db/trait.Upcast.html @@ -0,0 +1,4 @@ +Upcast in fe_common::db - Rust

Trait Upcast

Source
pub trait Upcast<T: ?Sized> {
+    // Required method
+    fn upcast(&self) -> &T;
+}

Required Methods§

Source

fn upcast(&self) -> &T

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/db/trait.UpcastMut.html b/compiler-docs/fe_common/db/trait.UpcastMut.html new file mode 100644 index 0000000000..a95b363fee --- /dev/null +++ b/compiler-docs/fe_common/db/trait.UpcastMut.html @@ -0,0 +1,4 @@ +UpcastMut in fe_common::db - Rust

Trait UpcastMut

Source
pub trait UpcastMut<T: ?Sized> {
+    // Required method
+    fn upcast_mut(&mut self) -> &mut T;
+}

Required Methods§

Source

fn upcast_mut(&mut self) -> &mut T

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/enum.LabelStyle.html b/compiler-docs/fe_common/diagnostics/cs/enum.LabelStyle.html new file mode 100644 index 0000000000..0477a90a0c --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/enum.LabelStyle.html @@ -0,0 +1,28 @@ +LabelStyle in fe_common::diagnostics::cs - Rust

Enum LabelStyle

pub enum LabelStyle {
+    Primary,
+    Secondary,
+}

Variants§

§

Primary

Labels that describe the primary cause of a diagnostic.

+
§

Secondary

Labels that provide additional context for a diagnostic.

+

Trait Implementations§

§

impl Clone for LabelStyle

§

fn clone(&self) -> LabelStyle

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for LabelStyle

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl From<LabelStyle> for LabelStyle

Source§

fn from(other: LabelStyle) -> LabelStyle

Converts to this type from the input type.
§

impl PartialEq for LabelStyle

§

fn eq(&self, other: &LabelStyle) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialOrd for LabelStyle

§

fn partial_cmp(&self, other: &LabelStyle) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl Copy for LabelStyle

§

impl Eq for LabelStyle

§

impl StructuralPartialEq for LabelStyle

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/enum.Severity.html b/compiler-docs/fe_common/diagnostics/cs/enum.Severity.html new file mode 100644 index 0000000000..684fcb944e --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/enum.Severity.html @@ -0,0 +1,46 @@ +Severity in fe_common::diagnostics::cs - Rust

Enum Severity

pub enum Severity {
+    Bug,
+    Error,
+    Warning,
+    Note,
+    Help,
+}
Expand description

A severity level for diagnostic messages.

+

These are ordered in the following way:

+ +
use codespan_reporting::diagnostic::Severity;
+
+assert!(Severity::Bug > Severity::Error);
+assert!(Severity::Error > Severity::Warning);
+assert!(Severity::Warning > Severity::Note);
+assert!(Severity::Note > Severity::Help);
+

Variants§

§

Bug

An unexpected bug.

+
§

Error

An error.

+
§

Warning

A warning.

+
§

Note

A note.

+
§

Help

A help message.

+

Trait Implementations§

§

impl Clone for Severity

§

fn clone(&self) -> Severity

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Severity

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Hash for Severity

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl PartialEq for Severity

§

fn eq(&self, other: &Severity) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialOrd for Severity

§

fn partial_cmp(&self, other: &Severity) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl Copy for Severity

§

impl Eq for Severity

§

impl StructuralPartialEq for Severity

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/index.html b/compiler-docs/fe_common/diagnostics/cs/index.html new file mode 100644 index 0000000000..f6aff2a335 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/index.html @@ -0,0 +1,3 @@ +fe_common::diagnostics::cs - Rust

Module cs

Expand description

Diagnostic data structures.

+

Structs§

Diagnostic
Represents a diagnostic message that can provide information like errors and +warnings to the user.
Label
A label describing an underlined region of code associated with a diagnostic.

Enums§

LabelStyle
Severity
A severity level for diagnostic messages.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/sidebar-items.js b/compiler-docs/fe_common/diagnostics/cs/sidebar-items.js new file mode 100644 index 0000000000..7d8844f436 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["LabelStyle","Severity"],"struct":["Diagnostic","Label"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/struct.Diagnostic.html b/compiler-docs/fe_common/diagnostics/cs/struct.Diagnostic.html new file mode 100644 index 0000000000..0f20f85412 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/struct.Diagnostic.html @@ -0,0 +1,59 @@ +Diagnostic in fe_common::diagnostics::cs - Rust

Struct Diagnostic

pub struct Diagnostic<FileId> {
+    pub severity: Severity,
+    pub code: Option<String>,
+    pub message: String,
+    pub labels: Vec<Label<FileId>>,
+    pub notes: Vec<String>,
+}
Expand description

Represents a diagnostic message that can provide information like errors and +warnings to the user.

+

The position of a Diagnostic is considered to be the position of the Label that has the earliest starting position and has the highest style which appears in all the labels of the diagnostic.

+

Fields§

§severity: Severity

The overall severity of the diagnostic

+
§code: Option<String>

An optional code that identifies this diagnostic.

+
§message: String

The main message associated with this diagnostic.

+

These should not include line breaks, and in order support the ‘short’ +diagnostic display mod, the message should be specific enough to make +sense on its own, without additional context provided by labels and notes.

+
§labels: Vec<Label<FileId>>

Source labels that describe the cause of the diagnostic. +The order of the labels inside the vector does not have any meaning. +The labels are always arranged in the order they appear in the source code.

+
§notes: Vec<String>

Notes that are associated with the primary cause of the diagnostic. +These can include line breaks for improved formatting.

+

Implementations§

§

impl<FileId> Diagnostic<FileId>

pub fn new(severity: Severity) -> Diagnostic<FileId>

Create a new diagnostic.

+

pub fn bug() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Bug.

+

pub fn error() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Error.

+

pub fn warning() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Warning.

+

pub fn note() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Note.

+

pub fn help() -> Diagnostic<FileId>

Create a new diagnostic with a severity of Severity::Help.

+

pub fn with_code(self, code: impl Into<String>) -> Diagnostic<FileId>

Set the error code of the diagnostic.

+

pub fn with_message(self, message: impl Into<String>) -> Diagnostic<FileId>

Set the message of the diagnostic.

+

pub fn with_labels(self, labels: Vec<Label<FileId>>) -> Diagnostic<FileId>

Add some labels to the diagnostic.

+

pub fn with_notes(self, notes: Vec<String>) -> Diagnostic<FileId>

Add some notes to the diagnostic.

+

Trait Implementations§

§

impl<FileId> Clone for Diagnostic<FileId>
where + FileId: Clone,

§

fn clone(&self) -> Diagnostic<FileId>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<FileId> Debug for Diagnostic<FileId>
where + FileId: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<FileId> PartialEq for Diagnostic<FileId>
where + FileId: PartialEq,

§

fn eq(&self, other: &Diagnostic<FileId>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<FileId> Eq for Diagnostic<FileId>
where + FileId: Eq,

§

impl<FileId> StructuralPartialEq for Diagnostic<FileId>

Auto Trait Implementations§

§

impl<FileId> Freeze for Diagnostic<FileId>

§

impl<FileId> RefUnwindSafe for Diagnostic<FileId>
where + FileId: RefUnwindSafe,

§

impl<FileId> Send for Diagnostic<FileId>
where + FileId: Send,

§

impl<FileId> Sync for Diagnostic<FileId>
where + FileId: Sync,

§

impl<FileId> Unpin for Diagnostic<FileId>
where + FileId: Unpin,

§

impl<FileId> UnwindSafe for Diagnostic<FileId>
where + FileId: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/cs/struct.Label.html b/compiler-docs/fe_common/diagnostics/cs/struct.Label.html new file mode 100644 index 0000000000..5bdd0ba665 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/cs/struct.Label.html @@ -0,0 +1,52 @@ +Label in fe_common::diagnostics::cs - Rust

Struct Label

pub struct Label<FileId> {
+    pub style: LabelStyle,
+    pub file_id: FileId,
+    pub range: Range<usize>,
+    pub message: String,
+}
Expand description

A label describing an underlined region of code associated with a diagnostic.

+

Fields§

§style: LabelStyle

The style of the label.

+
§file_id: FileId

The file that we are labelling.

+
§range: Range<usize>

The range in bytes we are going to include in the final snippet.

+
§message: String

An optional message to provide some additional information for the +underlined code. These should not include line breaks.

+

Implementations§

§

impl<FileId> Label<FileId>

pub fn new( + style: LabelStyle, + file_id: FileId, + range: impl Into<Range<usize>>, +) -> Label<FileId>

Create a new label.

+

pub fn primary(file_id: FileId, range: impl Into<Range<usize>>) -> Label<FileId>

Create a new label with a style of LabelStyle::Primary.

+

pub fn secondary( + file_id: FileId, + range: impl Into<Range<usize>>, +) -> Label<FileId>

Create a new label with a style of LabelStyle::Secondary.

+

pub fn with_message(self, message: impl Into<String>) -> Label<FileId>

Add a message to the diagnostic.

+

Trait Implementations§

§

impl<FileId> Clone for Label<FileId>
where + FileId: Clone,

§

fn clone(&self) -> Label<FileId>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<FileId> Debug for Label<FileId>
where + FileId: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<FileId> PartialEq for Label<FileId>
where + FileId: PartialEq,

§

fn eq(&self, other: &Label<FileId>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<FileId> Eq for Label<FileId>
where + FileId: Eq,

§

impl<FileId> StructuralPartialEq for Label<FileId>

Auto Trait Implementations§

§

impl<FileId> Freeze for Label<FileId>
where + FileId: Freeze,

§

impl<FileId> RefUnwindSafe for Label<FileId>
where + FileId: RefUnwindSafe,

§

impl<FileId> Send for Label<FileId>
where + FileId: Send,

§

impl<FileId> Sync for Label<FileId>
where + FileId: Sync,

§

impl<FileId> Unpin for Label<FileId>
where + FileId: Unpin,

§

impl<FileId> UnwindSafe for Label<FileId>
where + FileId: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/enum.LabelStyle.html b/compiler-docs/fe_common/diagnostics/enum.LabelStyle.html new file mode 100644 index 0000000000..0038871f01 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/enum.LabelStyle.html @@ -0,0 +1,25 @@ +LabelStyle in fe_common::diagnostics - Rust

Enum LabelStyle

Source
pub enum LabelStyle {
+    Primary,
+    Secondary,
+}

Variants§

§

Primary

§

Secondary

Trait Implementations§

Source§

impl Clone for LabelStyle

Source§

fn clone(&self) -> LabelStyle

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LabelStyle

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<LabelStyle> for LabelStyle

Source§

fn from(other: LabelStyle) -> LabelStyle

Converts to this type from the input type.
Source§

impl Hash for LabelStyle

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for LabelStyle

Source§

fn eq(&self, other: &LabelStyle) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for LabelStyle

Source§

impl Eq for LabelStyle

Source§

impl StructuralPartialEq for LabelStyle

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/enum.Severity.html b/compiler-docs/fe_common/diagnostics/enum.Severity.html new file mode 100644 index 0000000000..7d2acc1776 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/enum.Severity.html @@ -0,0 +1,46 @@ +Severity in fe_common::diagnostics - Rust

Enum Severity

pub enum Severity {
+    Bug,
+    Error,
+    Warning,
+    Note,
+    Help,
+}
Expand description

A severity level for diagnostic messages.

+

These are ordered in the following way:

+ +
use codespan_reporting::diagnostic::Severity;
+
+assert!(Severity::Bug > Severity::Error);
+assert!(Severity::Error > Severity::Warning);
+assert!(Severity::Warning > Severity::Note);
+assert!(Severity::Note > Severity::Help);
+

Variants§

§

Bug

An unexpected bug.

+
§

Error

An error.

+
§

Warning

A warning.

+
§

Note

A note.

+
§

Help

A help message.

+

Trait Implementations§

§

impl Clone for Severity

§

fn clone(&self) -> Severity

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Severity

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Hash for Severity

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl PartialEq for Severity

§

fn eq(&self, other: &Severity) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialOrd for Severity

§

fn partial_cmp(&self, other: &Severity) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl Copy for Severity

§

impl Eq for Severity

§

impl StructuralPartialEq for Severity

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/fn.diagnostics_string.html b/compiler-docs/fe_common/diagnostics/fn.diagnostics_string.html new file mode 100644 index 0000000000..9b8f102f54 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/fn.diagnostics_string.html @@ -0,0 +1,5 @@ +diagnostics_string in fe_common::diagnostics - Rust

Function diagnostics_string

Source
pub fn diagnostics_string(
+    db: &dyn SourceDb,
+    diagnostics: &[Diagnostic],
+) -> String
Expand description

Format the given diagnostics as a string.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/fn.print_diagnostics.html b/compiler-docs/fe_common/diagnostics/fn.print_diagnostics.html new file mode 100644 index 0000000000..3f075ba6d4 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/fn.print_diagnostics.html @@ -0,0 +1,2 @@ +print_diagnostics in fe_common::diagnostics - Rust

Function print_diagnostics

Source
pub fn print_diagnostics(db: &dyn SourceDb, diagnostics: &[Diagnostic])
Expand description

Print the given diagnostics to stderr.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/index.html b/compiler-docs/fe_common/diagnostics/index.html new file mode 100644 index 0000000000..92681af402 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/index.html @@ -0,0 +1 @@ +fe_common::diagnostics - Rust

Module diagnostics

Source

Modules§

cs
Diagnostic data structures.

Structs§

Diagnostic
Label

Enums§

LabelStyle
Severity
A severity level for diagnostic messages.

Functions§

diagnostics_string
Format the given diagnostics as a string.
print_diagnostics
Print the given diagnostics to stderr.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/sidebar-items.js b/compiler-docs/fe_common/diagnostics/sidebar-items.js new file mode 100644 index 0000000000..5e0b6da6a8 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["LabelStyle","Severity"],"fn":["diagnostics_string","print_diagnostics"],"mod":["cs"],"struct":["Diagnostic","Label"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/struct.Diagnostic.html b/compiler-docs/fe_common/diagnostics/struct.Diagnostic.html new file mode 100644 index 0000000000..f86c13f20f --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/struct.Diagnostic.html @@ -0,0 +1,27 @@ +Diagnostic in fe_common::diagnostics - Rust

Struct Diagnostic

Source
pub struct Diagnostic {
+    pub severity: Severity,
+    pub message: String,
+    pub labels: Vec<Label>,
+    pub notes: Vec<String>,
+}

Fields§

§severity: Severity§message: String§labels: Vec<Label>§notes: Vec<String>

Implementations§

Source§

impl Diagnostic

Source

pub fn into_cs(self) -> Diagnostic<SourceFileId>

Source

pub fn error(message: String) -> Self

Trait Implementations§

Source§

impl Clone for Diagnostic

Source§

fn clone(&self) -> Diagnostic

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Diagnostic

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Diagnostic

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Diagnostic

Source§

fn eq(&self, other: &Diagnostic) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Diagnostic

Source§

impl StructuralPartialEq for Diagnostic

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/diagnostics/struct.Label.html b/compiler-docs/fe_common/diagnostics/struct.Label.html new file mode 100644 index 0000000000..0b234605b0 --- /dev/null +++ b/compiler-docs/fe_common/diagnostics/struct.Label.html @@ -0,0 +1,31 @@ +Label in fe_common::diagnostics - Rust

Struct Label

Source
pub struct Label {
+    pub style: LabelStyle,
+    pub span: Span,
+    pub message: String,
+}

Fields§

§style: LabelStyle§span: Span§message: String

Implementations§

Source§

impl Label

Source

pub fn primary<S: Into<String>>(span: Span, message: S) -> Self

Create a primary label with the given message. This will underline the +given span with carets (^^^^).

+
Source

pub fn secondary<S: Into<String>>(span: Span, message: S) -> Self

Create a secondary label with the given message. This will underline the +given span with hyphens (----).

+
Source

pub fn into_cs_label(self) -> Label<SourceFileId>

Convert into a [codespan_reporting::Diagnostic::Label]

+

Trait Implementations§

Source§

impl Clone for Label

Source§

fn clone(&self) -> Label

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Label

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Label

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Label

Source§

fn eq(&self, other: &Label) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Label

Source§

impl StructuralPartialEq for Label

Auto Trait Implementations§

§

impl Freeze for Label

§

impl RefUnwindSafe for Label

§

impl Send for Label

§

impl Sync for Label

§

impl Unpin for Label

§

impl UnwindSafe for Label

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/enum.FileKind.html b/compiler-docs/fe_common/files/enum.FileKind.html new file mode 100644 index 0000000000..31a9ce3600 --- /dev/null +++ b/compiler-docs/fe_common/files/enum.FileKind.html @@ -0,0 +1,27 @@ +FileKind in fe_common::files - Rust

Enum FileKind

Source
pub enum FileKind {
+    Local,
+    Std,
+}

Variants§

§

Local

User file; either part of the target project or an imported ingot

+
§

Std

File is part of the fe standard library

+

Trait Implementations§

Source§

impl Clone for FileKind

Source§

fn clone(&self) -> FileKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FileKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FileKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FileKind

Source§

fn eq(&self, other: &FileKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for FileKind

Source§

impl Eq for FileKind

Source§

impl StructuralPartialEq for FileKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/enum.Utf8Component.html b/compiler-docs/fe_common/files/enum.Utf8Component.html new file mode 100644 index 0000000000..7340642b8f --- /dev/null +++ b/compiler-docs/fe_common/files/enum.Utf8Component.html @@ -0,0 +1,79 @@ +Utf8Component in fe_common::files - Rust

Enum Utf8Component

pub enum Utf8Component<'a> {
+    Prefix(Utf8PrefixComponent<'a>),
+    RootDir,
+    CurDir,
+    ParentDir,
+    Normal(&'a str),
+}
Expand description

A single component of a path.

+

A Utf8Component roughly corresponds to a substring between path separators +(/ or \).

+

This enum is created by iterating over [Utf8Components], which in turn is +created by the components method on Utf8Path.

+

§Examples

+
use camino::{Utf8Component, Utf8Path};
+
+let path = Utf8Path::new("/tmp/foo/bar.txt");
+let components = path.components().collect::<Vec<_>>();
+assert_eq!(&components, &[
+    Utf8Component::RootDir,
+    Utf8Component::Normal("tmp"),
+    Utf8Component::Normal("foo"),
+    Utf8Component::Normal("bar.txt"),
+]);
+

Variants§

§

Prefix(Utf8PrefixComponent<'a>)

A Windows path prefix, e.g., C: or \\server\share.

+

There is a large variety of prefix types, see [Utf8Prefix]’s documentation +for more.

+

Does not occur on Unix.

+
§

RootDir

The root directory component, appears after any prefix and before anything else.

+

It represents a separator that designates that a path starts from root.

+
§

CurDir

A reference to the current directory, i.e., ..

+
§

ParentDir

A reference to the parent directory, i.e., ...

+
§

Normal(&'a str)

A normal component, e.g., a and b in a/b.

+

This variant is the most common one, it represents references to files +or directories.

+

Implementations§

§

impl<'a> Utf8Component<'a>

pub fn as_str(&self) -> &'a str

Extracts the underlying str slice.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("./tmp/foo/bar.txt");
+let components: Vec<_> = path.components().map(|comp| comp.as_str()).collect();
+assert_eq!(&components, &[".", "tmp", "foo", "bar.txt"]);
+

pub fn as_os_str(&self) -> &'a OsStr

Extracts the underlying OsStr slice.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("./tmp/foo/bar.txt");
+let components: Vec<_> = path.components().map(|comp| comp.as_os_str()).collect();
+assert_eq!(&components, &[".", "tmp", "foo", "bar.txt"]);
+

Trait Implementations§

§

impl AsRef<OsStr> for Utf8Component<'_>

§

fn as_ref(&self) -> &OsStr

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Path> for Utf8Component<'_>

§

fn as_ref(&self) -> &Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8Component<'_>

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<str> for Utf8Component<'_>

§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
§

impl<'a> Clone for Utf8Component<'a>

§

fn clone(&self) -> Utf8Component<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl<'a> Debug for Utf8Component<'a>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'a> Display for Utf8Component<'a>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'a> Hash for Utf8Component<'a>

§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl<'a> Ord for Utf8Component<'a>

§

fn cmp(&self, other: &Utf8Component<'a>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
§

impl<'a> PartialEq for Utf8Component<'a>

§

fn eq(&self, other: &Utf8Component<'a>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a> PartialOrd for Utf8Component<'a>

§

fn partial_cmp(&self, other: &Utf8Component<'a>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a> Copy for Utf8Component<'a>

§

impl<'a> Eq for Utf8Component<'a>

§

impl<'a> StructuralPartialEq for Utf8Component<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for Utf8Component<'a>

§

impl<'a> RefUnwindSafe for Utf8Component<'a>

§

impl<'a> Send for Utf8Component<'a>

§

impl<'a> Sync for Utf8Component<'a>

§

impl<'a> Unpin for Utf8Component<'a>

§

impl<'a> UnwindSafe for Utf8Component<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/fn.common_prefix.html b/compiler-docs/fe_common/files/fn.common_prefix.html new file mode 100644 index 0000000000..e561b808cf --- /dev/null +++ b/compiler-docs/fe_common/files/fn.common_prefix.html @@ -0,0 +1,3 @@ +common_prefix in fe_common::files - Rust

Function common_prefix

Source
pub fn common_prefix(left: &Utf8Path, right: &Utf8Path) -> Utf8PathBuf
Expand description

Returns the common prefix of two paths. If the paths are identical, +returns the path parent.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/index.html b/compiler-docs/fe_common/files/index.html new file mode 100644 index 0000000000..1de297a896 --- /dev/null +++ b/compiler-docs/fe_common/files/index.html @@ -0,0 +1,2 @@ +fe_common::files - Rust

Module files

Source

Re-exports§

pub use fe_library::include_dir;

Structs§

File
SourceFileId
Utf8Path
A slice of a UTF-8 path (akin to str).
Utf8PathBuf
An owned, mutable UTF-8 path (akin to String).

Enums§

FileKind
Utf8Component
A single component of a path.

Functions§

common_prefix
Returns the common prefix of two paths. If the paths are identical, +returns the path parent.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/sidebar-items.js b/compiler-docs/fe_common/files/sidebar-items.js new file mode 100644 index 0000000000..2d536dd89a --- /dev/null +++ b/compiler-docs/fe_common/files/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["FileKind","Utf8Component"],"fn":["common_prefix"],"struct":["File","SourceFileId","Utf8Path","Utf8PathBuf"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/files/struct.File.html b/compiler-docs/fe_common/files/struct.File.html new file mode 100644 index 0000000000..1010a0e9cb --- /dev/null +++ b/compiler-docs/fe_common/files/struct.File.html @@ -0,0 +1,30 @@ +File in fe_common::files - Rust

Struct File

Source
pub struct File {
+    pub kind: FileKind,
+    pub path: Rc<Utf8PathBuf>,
+}

Fields§

§kind: FileKind

Differentiates between local source files and fe std lib +files, which may have the same path (for salsa’s sake).

+
§path: Rc<Utf8PathBuf>

Path of the file. May include src/ dir or longer prefix; +this prefix will be stored in the Ingot::src_path, and stripped +off as needed.

+

Trait Implementations§

Source§

impl Clone for File

Source§

fn clone(&self) -> File

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for File

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for File

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for File

Source§

fn eq(&self, other: &File) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for File

Source§

impl StructuralPartialEq for File

Auto Trait Implementations§

§

impl Freeze for File

§

impl RefUnwindSafe for File

§

impl !Send for File

§

impl !Sync for File

§

impl Unpin for File

§

impl UnwindSafe for File

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/struct.SourceFileId.html b/compiler-docs/fe_common/files/struct.SourceFileId.html new file mode 100644 index 0000000000..1d866de848 --- /dev/null +++ b/compiler-docs/fe_common/files/struct.SourceFileId.html @@ -0,0 +1,33 @@ +SourceFileId in fe_common::files - Rust

Struct SourceFileId

Source
pub struct SourceFileId(/* private fields */);

Implementations§

Source§

impl SourceFileId

Source

pub fn new_local(db: &mut dyn SourceDb, path: &str, content: Rc<str>) -> Self

Source

pub fn new_std(db: &mut dyn SourceDb, path: &str, content: Rc<str>) -> Self

Source

pub fn new( + db: &mut dyn SourceDb, + kind: FileKind, + path: &str, + content: Rc<str>, +) -> Self

Source

pub fn path(&self, db: &dyn SourceDb) -> Rc<Utf8PathBuf>

Source

pub fn content(&self, db: &dyn SourceDb) -> Rc<str>

Source

pub fn line_index(&self, db: &dyn SourceDb, byte_index: usize) -> usize

Source

pub fn line_range( + &self, + db: &dyn SourceDb, + line_index: usize, +) -> Option<Range<usize>>

Source

pub fn dummy_file() -> Self

Source

pub fn is_dummy(self) -> bool

Trait Implementations§

Source§

impl Clone for SourceFileId

Source§

fn clone(&self) -> SourceFileId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SourceFileId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for SourceFileId

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Hash for SourceFileId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for SourceFileId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl PartialEq for SourceFileId

Source§

fn eq(&self, other: &SourceFileId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for SourceFileId

Source§

impl Eq for SourceFileId

Source§

impl StructuralPartialEq for SourceFileId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_common/files/struct.Utf8Path.html b/compiler-docs/fe_common/files/struct.Utf8Path.html new file mode 100644 index 0000000000..eef3a2983b --- /dev/null +++ b/compiler-docs/fe_common/files/struct.Utf8Path.html @@ -0,0 +1,667 @@ +Utf8Path in fe_common::files - Rust

Struct Utf8Path

pub struct Utf8Path(/* private fields */);
Expand description

A slice of a UTF-8 path (akin to str).

+

This type supports a number of operations for inspecting a path, including +breaking the path into its components (separated by / on Unix and by either +/ or \ on Windows), extracting the file name, determining whether the path +is absolute, and so on.

+

This is an unsized type, meaning that it must always be used behind a +pointer like & or Box. For an owned version of this type, +see Utf8PathBuf.

+

§Examples

+
use camino::Utf8Path;
+
+// Note: this example does work on Windows
+let path = Utf8Path::new("./foo/bar.txt");
+
+let parent = path.parent();
+assert_eq!(parent, Some(Utf8Path::new("./foo")));
+
+let file_stem = path.file_stem();
+assert_eq!(file_stem, Some("bar"));
+
+let extension = path.extension();
+assert_eq!(extension, Some("txt"));
+

Implementations§

§

impl Utf8Path

pub fn new(s: &(impl AsRef<str> + ?Sized)) -> &Utf8Path

Directly wraps a string slice as a Utf8Path slice.

+

This is a cost-free conversion.

+
§Examples
+
use camino::Utf8Path;
+
+Utf8Path::new("foo.txt");
+

You can create Utf8Paths from Strings, or even other Utf8Paths:

+ +
use camino::Utf8Path;
+
+let string = String::from("foo.txt");
+let from_string = Utf8Path::new(&string);
+let from_path = Utf8Path::new(&from_string);
+assert_eq!(from_string, from_path);
+

pub fn from_path(path: &Path) -> Option<&Utf8Path>

Converts a Path to a Utf8Path.

+

Returns None if the path is not valid UTF-8.

+

For a version that returns a type that implements std::error::Error, use the +TryFrom<&Path> impl.

+
§Examples
+
use camino::Utf8Path;
+use std::ffi::OsStr;
+use std::os::unix::ffi::OsStrExt;
+use std::path::Path;
+
+let unicode_path = Path::new("/valid/unicode");
+Utf8Path::from_path(unicode_path).expect("valid Unicode path succeeded");
+
+// Paths on Unix can be non-UTF-8.
+let non_unicode_str = OsStr::from_bytes(b"\xFF\xFF\xFF");
+let non_unicode_path = Path::new(non_unicode_str);
+assert!(Utf8Path::from_path(non_unicode_path).is_none(), "non-Unicode path failed");
+

pub fn as_std_path(&self) -> &Path

Converts a Utf8Path to a Path.

+

This is equivalent to the AsRef<&Path> for &Utf8Path impl, but may aid in type inference.

+
§Examples
+
use camino::Utf8Path;
+use std::path::Path;
+
+let utf8_path = Utf8Path::new("foo.txt");
+let std_path: &Path = utf8_path.as_std_path();
+assert_eq!(std_path.to_str(), Some("foo.txt"));
+
+// Convert back to a Utf8Path.
+let new_utf8_path = Utf8Path::from_path(std_path).unwrap();
+assert_eq!(new_utf8_path, "foo.txt");
+

pub fn as_str(&self) -> &str

Yields the underlying str slice.

+

Unlike Path::to_str, this always returns a slice because the contents of a Utf8Path +are guaranteed to be valid UTF-8.

+
§Examples
+
use camino::Utf8Path;
+
+let s = Utf8Path::new("foo.txt").as_str();
+assert_eq!(s, "foo.txt");
+

pub fn as_os_str(&self) -> &OsStr

Yields the underlying OsStr slice.

+
§Examples
+
use camino::Utf8Path;
+
+let os_str = Utf8Path::new("foo.txt").as_os_str();
+assert_eq!(os_str, std::ffi::OsStr::new("foo.txt"));
+

pub fn to_path_buf(&self) -> Utf8PathBuf

Converts a Utf8Path to an owned Utf8PathBuf.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path_buf = Utf8Path::new("foo.txt").to_path_buf();
+assert_eq!(path_buf, Utf8PathBuf::from("foo.txt"));
+

pub fn is_absolute(&self) -> bool

Returns true if the Utf8Path is absolute, i.e., if it is independent of +the current directory.

+
    +
  • +

    On Unix, a path is absolute if it starts with the root, so +is_absolute and has_root are equivalent.

    +
  • +
  • +

    On Windows, a path is absolute if it has a prefix and starts with the +root: c:\windows is absolute, while c:temp and \temp are not.

    +
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert!(!Utf8Path::new("foo.txt").is_absolute());
+

pub fn is_relative(&self) -> bool

Returns true if the Utf8Path is relative, i.e., not absolute.

+

See is_absolute’s documentation for more details.

+
§Examples
+
use camino::Utf8Path;
+
+assert!(Utf8Path::new("foo.txt").is_relative());
+

pub fn has_root(&self) -> bool

Returns true if the Utf8Path has a root.

+
    +
  • +

    On Unix, a path has a root if it begins with /.

    +
  • +
  • +

    On Windows, a path has a root if it:

    +
      +
    • has no prefix and begins with a separator, e.g., \windows
    • +
    • has a prefix followed by a separator, e.g., c:\windows but not c:windows
    • +
    • has any non-disk prefix, e.g., \\server\share
    • +
    +
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert!(Utf8Path::new("/etc/passwd").has_root());
+

pub fn parent(&self) -> Option<&Utf8Path>

Returns the Path without its final component, if there is one.

+

Returns None if the path terminates in a root or prefix.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/foo/bar");
+let parent = path.parent().unwrap();
+assert_eq!(parent, Utf8Path::new("/foo"));
+
+let grand_parent = parent.parent().unwrap();
+assert_eq!(grand_parent, Utf8Path::new("/"));
+assert_eq!(grand_parent.parent(), None);
+

pub fn ancestors(&self) -> Utf8Ancestors<'_>

Produces an iterator over Utf8Path and its ancestors.

+

The iterator will yield the Utf8Path that is returned if the parent method is used zero +or more times. That means, the iterator will yield &self, &self.parent().unwrap(), +&self.parent().unwrap().parent().unwrap() and so on. If the parent method returns +None, the iterator will do likewise. The iterator will always yield at least one value, +namely &self.

+
§Examples
+
use camino::Utf8Path;
+
+let mut ancestors = Utf8Path::new("/foo/bar").ancestors();
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/foo/bar")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/foo")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/")));
+assert_eq!(ancestors.next(), None);
+
+let mut ancestors = Utf8Path::new("../foo/bar").ancestors();
+assert_eq!(ancestors.next(), Some(Utf8Path::new("../foo/bar")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("../foo")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("..")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("")));
+assert_eq!(ancestors.next(), None);
+

pub fn file_name(&self) -> Option<&str>

Returns the final component of the Utf8Path, if there is one.

+

If the path is a normal file, this is the file name. If it’s the path of a directory, this +is the directory name.

+

Returns None if the path terminates in ...

+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!(Some("bin"), Utf8Path::new("/usr/bin/").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("tmp/foo.txt").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("foo.txt/.").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("foo.txt/.//").file_name());
+assert_eq!(None, Utf8Path::new("foo.txt/..").file_name());
+assert_eq!(None, Utf8Path::new("/").file_name());
+

pub fn strip_prefix( + &self, + base: impl AsRef<Path>, +) -> Result<&Utf8Path, StripPrefixError>

Returns a path that, when joined onto base, yields self.

+
§Errors
+

If base is not a prefix of self (i.e., starts_with +returns false), returns Err.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/test/haha/foo.txt");
+
+assert_eq!(path.strip_prefix("/"), Ok(Utf8Path::new("test/haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test"), Ok(Utf8Path::new("haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test/"), Ok(Utf8Path::new("haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test/haha/foo.txt"), Ok(Utf8Path::new("")));
+assert_eq!(path.strip_prefix("/test/haha/foo.txt/"), Ok(Utf8Path::new("")));
+
+assert!(path.strip_prefix("test").is_err());
+assert!(path.strip_prefix("/haha").is_err());
+
+let prefix = Utf8PathBuf::from("/test/");
+assert_eq!(path.strip_prefix(prefix), Ok(Utf8Path::new("haha/foo.txt")));
+

pub fn starts_with(&self, base: impl AsRef<Path>) -> bool

Determines whether base is a prefix of self.

+

Only considers whole path components to match.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/etc/passwd");
+
+assert!(path.starts_with("/etc"));
+assert!(path.starts_with("/etc/"));
+assert!(path.starts_with("/etc/passwd"));
+assert!(path.starts_with("/etc/passwd/")); // extra slash is okay
+assert!(path.starts_with("/etc/passwd///")); // multiple extra slashes are okay
+
+assert!(!path.starts_with("/e"));
+assert!(!path.starts_with("/etc/passwd.txt"));
+
+assert!(!Utf8Path::new("/etc/foo.rs").starts_with("/etc/foo"));
+

pub fn ends_with(&self, base: impl AsRef<Path>) -> bool

Determines whether child is a suffix of self.

+

Only considers whole path components to match.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/etc/resolv.conf");
+
+assert!(path.ends_with("resolv.conf"));
+assert!(path.ends_with("etc/resolv.conf"));
+assert!(path.ends_with("/etc/resolv.conf"));
+
+assert!(!path.ends_with("/resolv.conf"));
+assert!(!path.ends_with("conf")); // use .extension() instead
+

pub fn file_stem(&self) -> Option<&str>

Extracts the stem (non-extension) portion of self.file_name.

+

The stem is:

+
    +
  • None, if there is no file name;
  • +
  • The entire file name if there is no embedded .;
  • +
  • The entire file name if the file name begins with . and has no other .s within;
  • +
  • Otherwise, the portion of the file name before the final .
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!("foo", Utf8Path::new("foo.rs").file_stem().unwrap());
+assert_eq!("foo.tar", Utf8Path::new("foo.tar.gz").file_stem().unwrap());
+

pub fn extension(&self) -> Option<&str>

Extracts the extension of self.file_name, if possible.

+

The extension is:

+
    +
  • None, if there is no file name;
  • +
  • None, if there is no embedded .;
  • +
  • None, if the file name begins with . and has no other .s within;
  • +
  • Otherwise, the portion of the file name after the final .
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!("rs", Utf8Path::new("foo.rs").extension().unwrap());
+assert_eq!("gz", Utf8Path::new("foo.tar.gz").extension().unwrap());
+

pub fn join(&self, path: impl AsRef<Utf8Path>) -> Utf8PathBuf

Creates an owned Utf8PathBuf with path adjoined to self.

+

See Utf8PathBuf::push for more details on what it means to adjoin a path.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+assert_eq!(Utf8Path::new("/etc").join("passwd"), Utf8PathBuf::from("/etc/passwd"));
+

pub fn join_os(&self, path: impl AsRef<Path>) -> PathBuf

Creates an owned PathBuf with path adjoined to self.

+

See PathBuf::push for more details on what it means to adjoin a path.

+
§Examples
+
use camino::Utf8Path;
+use std::path::PathBuf;
+
+assert_eq!(Utf8Path::new("/etc").join_os("passwd"), PathBuf::from("/etc/passwd"));
+

pub fn with_file_name(&self, file_name: impl AsRef<str>) -> Utf8PathBuf

Creates an owned Utf8PathBuf like self but with the given file name.

+

See Utf8PathBuf::set_file_name for more details.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/tmp/foo.txt");
+assert_eq!(path.with_file_name("bar.txt"), Utf8PathBuf::from("/tmp/bar.txt"));
+
+let path = Utf8Path::new("/tmp");
+assert_eq!(path.with_file_name("var"), Utf8PathBuf::from("/var"));
+

pub fn with_extension(&self, extension: impl AsRef<str>) -> Utf8PathBuf

Creates an owned Utf8PathBuf like self but with the given extension.

+

See Utf8PathBuf::set_extension for more details.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("foo.rs");
+assert_eq!(path.with_extension("txt"), Utf8PathBuf::from("foo.txt"));
+
+let path = Utf8Path::new("foo.tar.gz");
+assert_eq!(path.with_extension(""), Utf8PathBuf::from("foo.tar"));
+assert_eq!(path.with_extension("xz"), Utf8PathBuf::from("foo.tar.xz"));
+assert_eq!(path.with_extension("").with_extension("txt"), Utf8PathBuf::from("foo.txt"));
+

pub fn components(&self) -> Utf8Components<'_>

Produces an iterator over the Utf8Components of the path.

+

When parsing the path, there is a small amount of normalization:

+
    +
  • +

    Repeated separators are ignored, so a/b and a//b both have +a and b as components.

    +
  • +
  • +

    Occurrences of . are normalized away, except if they are at the +beginning of the path. For example, a/./b, a/b/, a/b/. and +a/b all have a and b as components, but ./a/b starts with +an additional CurDir component.

    +
  • +
  • +

    A trailing slash is normalized away, /a/b and /a/b/ are equivalent.

    +
  • +
+

Note that no other normalization takes place; in particular, a/c +and a/b/../c are distinct, to account for the possibility that b +is a symbolic link (so its parent isn’t a).

+
§Examples
+
use camino::{Utf8Component, Utf8Path};
+
+let mut components = Utf8Path::new("/tmp/foo.txt").components();
+
+assert_eq!(components.next(), Some(Utf8Component::RootDir));
+assert_eq!(components.next(), Some(Utf8Component::Normal("tmp")));
+assert_eq!(components.next(), Some(Utf8Component::Normal("foo.txt")));
+assert_eq!(components.next(), None)
+

pub fn iter(&self) -> Iter<'_>

Produces an iterator over the path’s components viewed as str +slices.

+

For more information about the particulars of how the path is separated +into components, see components.

+
§Examples
+
use camino::Utf8Path;
+
+let mut it = Utf8Path::new("/tmp/foo.txt").iter();
+assert_eq!(it.next(), Some(std::path::MAIN_SEPARATOR.to_string().as_str()));
+assert_eq!(it.next(), Some("tmp"));
+assert_eq!(it.next(), Some("foo.txt"));
+assert_eq!(it.next(), None)
+

pub fn metadata(&self) -> Result<Metadata, Error>

Queries the file system to get information about a file, directory, etc.

+

This function will traverse symbolic links to query information about the +destination file.

+

This is an alias to fs::metadata.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/Minas/tirith");
+let metadata = path.metadata().expect("metadata call failed");
+println!("{:?}", metadata.file_type());
+

Queries the metadata about a file without following symlinks.

+

This is an alias to fs::symlink_metadata.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/Minas/tirith");
+let metadata = path.symlink_metadata().expect("symlink_metadata call failed");
+println!("{:?}", metadata.file_type());
+

pub fn canonicalize(&self) -> Result<PathBuf, Error>

Returns the canonical, absolute form of the path with all intermediate +components normalized and symbolic links resolved.

+

This returns a PathBuf because even if a symlink is valid Unicode, its target may not +be. For a version that returns a Utf8PathBuf, see +canonicalize_utf8.

+

This is an alias to fs::canonicalize.

+
§Examples
+
use camino::Utf8Path;
+use std::path::PathBuf;
+
+let path = Utf8Path::new("/foo/test/../test/bar.rs");
+assert_eq!(path.canonicalize().unwrap(), PathBuf::from("/foo/test/bar.rs"));
+

pub fn canonicalize_utf8(&self) -> Result<Utf8PathBuf, Error>

Returns the canonical, absolute form of the path with all intermediate +components normalized and symbolic links resolved.

+

This method attempts to convert the resulting PathBuf into a Utf8PathBuf. For a +version that does not attempt to do this conversion, see +canonicalize.

+
§Errors
+

The I/O operation may return an error: see the fs::canonicalize +documentation for more.

+

If the resulting path is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/foo/test/../test/bar.rs");
+assert_eq!(path.canonicalize_utf8().unwrap(), Utf8PathBuf::from("/foo/test/bar.rs"));
+

Reads a symbolic link, returning the file that the link points to.

+

This returns a PathBuf because even if a symlink is valid Unicode, its target may not +be. For a version that returns a Utf8PathBuf, see +read_link_utf8.

+

This is an alias to fs::read_link.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa/sky_castle.rs");
+let path_link = path.read_link().expect("read_link call failed");
+

Reads a symbolic link, returning the file that the link points to.

+

This method attempts to convert the resulting PathBuf into a Utf8PathBuf. For a +version that does not attempt to do this conversion, see read_link.

+
§Errors
+

The I/O operation may return an error: see the fs::read_link +documentation for more.

+

If the resulting path is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa/sky_castle.rs");
+let path_link = path.read_link_utf8().expect("read_link call failed");
+

pub fn read_dir(&self) -> Result<ReadDir, Error>

Returns an iterator over the entries within a directory.

+

The iterator will yield instances of io::Result<fs::DirEntry>. New +errors may be encountered after an iterator is initially constructed.

+

This is an alias to fs::read_dir.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa");
+for entry in path.read_dir().expect("read_dir call failed") {
+    if let Ok(entry) = entry {
+        println!("{:?}", entry.path());
+    }
+}
+

pub fn read_dir_utf8(&self) -> Result<ReadDirUtf8, Error>

Returns an iterator over the entries within a directory.

+

The iterator will yield instances of io::Result<[Utf8DirEntry]>. New +errors may be encountered after an iterator is initially constructed.

+
§Errors
+

The I/O operation may return an error: see the fs::read_dir +documentation for more.

+

If a directory entry is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa");
+for entry in path.read_dir_utf8().expect("read_dir call failed") {
+    if let Ok(entry) = entry {
+        println!("{}", entry.path());
+    }
+}
+

pub fn exists(&self) -> bool

Returns true if the path points at an existing entity.

+

Warning: this method may be error-prone, consider using try_exists() instead! +It also has a risk of introducing time-of-check to time-of-use (TOCTOU) bugs.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert!(!Utf8Path::new("does_not_exist.txt").exists());
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata.

+

pub fn try_exists(&self) -> Result<bool, Error>

Returns Ok(true) if the path points at an existing entity.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return Ok(false).

+

As opposed to the exists() method, this one doesn’t silently ignore errors +unrelated to the path not existing. (E.g. it will return Err(_) in case of permission +denied on some of the parent directories.)

+

Note that while this avoids some pitfalls of the exists() method, it still can not +prevent time-of-check to time-of-use (TOCTOU) bugs. You should only use it in scenarios +where those bugs are not an issue.

+
§Examples
+
use camino::Utf8Path;
+assert!(!Utf8Path::new("does_not_exist.txt").try_exists().expect("Can't check existence of file does_not_exist.txt"));
+assert!(Utf8Path::new("/root/secret_file.txt").try_exists().is_err());
+

pub fn is_file(&self) -> bool

Returns true if the path exists on disk and is pointing at a regular file.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert_eq!(Utf8Path::new("./is_a_directory/").is_file(), false);
+assert_eq!(Utf8Path::new("a_file.txt").is_file(), true);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata and handle its Result. Then call +fs::Metadata::is_file if it was Ok.

+

When the goal is simply to read from (or write to) the source, the most +reliable way to test the source can be read (or written to) is to open +it. Only using is_file can break workflows like diff <( prog_a ) on +a Unix-like system for example. See fs::File::open or +fs::OpenOptions::open for more information.

+

pub fn is_dir(&self) -> bool

Returns true if the path exists on disk and is pointing at a directory.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert_eq!(Utf8Path::new("./is_a_directory/").is_dir(), true);
+assert_eq!(Utf8Path::new("a_file.txt").is_dir(), false);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata and handle its Result. Then call +fs::Metadata::is_dir if it was Ok.

+

Returns true if the path exists on disk and is pointing at a symbolic link.

+

This function will not traverse symbolic links. +In case of a broken symbolic link this will also return true.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+use std::os::unix::fs::symlink;
+
+let link_path = Utf8Path::new("link");
+symlink("/origin_does_not_exist/", link_path).unwrap();
+assert_eq!(link_path.is_symlink(), true);
+assert_eq!(link_path.exists(), false);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call Utf8Path::symlink_metadata and handle its Result. Then call +fs::Metadata::is_symlink if it was Ok.

+

pub fn into_path_buf(self: Box<Utf8Path>) -> Utf8PathBuf

Converts a Box<Utf8Path> into a Utf8PathBuf without copying or allocating.

+

Trait Implementations§

§

impl AsRef<OsStr> for Utf8Path

§

fn as_ref(&self) -> &OsStr

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Path> for Utf8Path

§

fn as_ref(&self) -> &Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8Component<'_>

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8Path

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8PathBuf

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for str

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<str> for Utf8Path

§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
§

impl Borrow<Utf8Path> for Utf8PathBuf

§

fn borrow(&self) -> &Utf8Path

Immutably borrows from an owned value. Read more
§

impl Debug for Utf8Path

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Display for Utf8Path

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<'a> From<&'a str> for &'a Utf8Path

§

fn from(s: &'a str) -> &'a Utf8Path

Converts to this type from the input type.
§

impl Hash for Utf8Path

§

fn hash<H>(&self, state: &mut H)
where + H: Hasher,

Feeds this value into the given Hasher. Read more
§

impl<'a> IntoIterator for &'a Utf8Path

§

type Item = &'a str

The type of the elements being iterated over.
§

type IntoIter = Iter<'a>

Which kind of iterator are we turning this into?
§

fn into_iter(self) -> Iter<'a>

Creates an iterator from a value. Read more
§

impl Ord for Utf8Path

§

fn cmp(&self, other: &Utf8Path) -> Ordering

This method returns an Ordering between self and other. Read more
§

impl<'a, 'b> PartialEq<&'a OsStr> for Utf8Path

§

fn eq(&self, other: &&'a OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Path> for Utf8Path

§

fn eq(&self, other: &&'a Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for OsStr

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for Path

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for Utf8PathBuf

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for str

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a str> for Utf8Path

§

fn eq(&self, other: &&'a str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, OsStr>> for Utf8Path

§

fn eq(&self, other: &Cow<'a, OsStr>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Path>> for Utf8Path

§

fn eq(&self, other: &Cow<'a, Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Utf8Path>> for &'b Utf8Path

§

fn eq(&self, other: &Cow<'a, Utf8Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Utf8Path>> for Utf8Path

§

fn eq(&self, other: &Cow<'a, Utf8Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, str>> for Utf8Path

§

fn eq(&self, other: &Cow<'a, str>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'b, OsStr>> for &'a Utf8Path

§

fn eq(&self, other: &Cow<'b, OsStr>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'b, Path>> for &'a Utf8Path

§

fn eq(&self, other: &Cow<'b, Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'b, str>> for &'a Utf8Path

§

fn eq(&self, other: &Cow<'b, str>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsStr> for &'a Utf8Path

§

fn eq(&self, other: &OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsStr> for Utf8Path

§

fn eq(&self, other: &OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsString> for &'a Utf8Path

§

fn eq(&self, other: &OsString) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsString> for Utf8Path

§

fn eq(&self, other: &OsString) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Path> for &'a Utf8Path

§

fn eq(&self, other: &Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Path> for Utf8Path

§

fn eq(&self, other: &Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<PathBuf> for &'a Utf8Path

§

fn eq(&self, other: &PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<PathBuf> for Utf8Path

§

fn eq(&self, other: &PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<String> for &'a Utf8Path

§

fn eq(&self, other: &String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<String> for Utf8Path

§

fn eq(&self, other: &String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for &'a OsStr

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for &'a Path

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for &'a str

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for OsStr

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for Path

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for Utf8PathBuf

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for str

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a Utf8Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for Utf8Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<str> for &'a Utf8Path

§

fn eq(&self, other: &str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<str> for Utf8Path

§

fn eq(&self, other: &str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq for Utf8Path

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialOrd<&'a OsStr> for Utf8Path

§

fn partial_cmp(&self, other: &&'a OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Path> for Utf8Path

§

fn partial_cmp(&self, other: &&'a Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for OsStr

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for Path

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for str

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a str> for Utf8Path

§

fn partial_cmp(&self, other: &&'a str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, OsStr>> for Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, OsStr>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Path>> for Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Utf8Path>> for &'b Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, Utf8Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Utf8Path>> for Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, Utf8Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, str>> for Utf8Path

§

fn partial_cmp(&self, other: &Cow<'a, str>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'b, OsStr>> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Cow<'b, OsStr>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'b, Path>> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Cow<'b, Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'b, str>> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Cow<'b, str>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsStr> for &'a Utf8Path

§

fn partial_cmp(&self, other: &OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsStr> for Utf8Path

§

fn partial_cmp(&self, other: &OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsString> for &'a Utf8Path

§

fn partial_cmp(&self, other: &OsString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsString> for Utf8Path

§

fn partial_cmp(&self, other: &OsString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Path> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Path> for Utf8Path

§

fn partial_cmp(&self, other: &Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<PathBuf> for &'a Utf8Path

§

fn partial_cmp(&self, other: &PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<PathBuf> for Utf8Path

§

fn partial_cmp(&self, other: &PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<String> for &'a Utf8Path

§

fn partial_cmp(&self, other: &String) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<String> for Utf8Path

§

fn partial_cmp(&self, other: &String) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for &'a OsStr

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for &'a Path

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for &'a str

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for OsStr

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for Path

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for str

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for Utf8Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<str> for &'a Utf8Path

§

fn partial_cmp(&self, other: &str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<str> for Utf8Path

§

fn partial_cmp(&self, other: &str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl PartialOrd for Utf8Path

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl ToOwned for Utf8Path

§

type Owned = Utf8PathBuf

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> Utf8PathBuf

Creates owned data from borrowed data, usually by cloning. Read more
1.63.0 · Source§

fn clone_into(&self, target: &mut Self::Owned)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<'a> TryFrom<&'a Path> for &'a Utf8Path

§

type Error = FromPathError

The type returned in the event of a conversion error.
§

fn try_from( + path: &'a Path, +) -> Result<&'a Utf8Path, <&'a Utf8Path as TryFrom<&'a Path>>::Error>

Performs the conversion.
§

impl Eq for Utf8Path

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
\ No newline at end of file diff --git a/compiler-docs/fe_common/files/struct.Utf8PathBuf.html b/compiler-docs/fe_common/files/struct.Utf8PathBuf.html new file mode 100644 index 0000000000..32735f1084 --- /dev/null +++ b/compiler-docs/fe_common/files/struct.Utf8PathBuf.html @@ -0,0 +1,768 @@ +Utf8PathBuf in fe_common::files - Rust

Struct Utf8PathBuf

pub struct Utf8PathBuf(/* private fields */);
Expand description

An owned, mutable UTF-8 path (akin to String).

+

This type provides methods like push and set_extension that mutate +the path in place. It also implements Deref to Utf8Path, meaning that +all methods on Utf8Path slices are available on Utf8PathBuf values as well.

+

§Examples

+

You can use push to build up a Utf8PathBuf from +components:

+ +
use camino::Utf8PathBuf;
+
+let mut path = Utf8PathBuf::new();
+
+path.push(r"C:\");
+path.push("windows");
+path.push("system32");
+
+path.set_extension("dll");
+

However, push is best used for dynamic situations. This is a better way +to do this when you know all of the components ahead of time:

+ +
use camino::Utf8PathBuf;
+
+let path: Utf8PathBuf = [r"C:\", "windows", "system32.dll"].iter().collect();
+

We can still do better than this! Since these are all strings, we can use +From::from:

+ +
use camino::Utf8PathBuf;
+
+let path = Utf8PathBuf::from(r"C:\windows\system32.dll");
+

Which method works best depends on what kind of situation you’re in.

+

Implementations§

§

impl Utf8PathBuf

pub fn new() -> Utf8PathBuf

Allocates an empty Utf8PathBuf.

+
§Examples
+
use camino::Utf8PathBuf;
+
+let path = Utf8PathBuf::new();
+

pub fn from_path_buf(path: PathBuf) -> Result<Utf8PathBuf, PathBuf>

Creates a new Utf8PathBuf from a PathBuf containing valid UTF-8 characters.

+

Errors with the original PathBuf if it is not valid UTF-8.

+

For a version that returns a type that implements std::error::Error, use the +TryFrom<PathBuf> impl.

+
§Examples
+
use camino::Utf8PathBuf;
+use std::ffi::OsStr;
+use std::os::unix::ffi::OsStrExt;
+use std::path::PathBuf;
+
+let unicode_path = PathBuf::from("/valid/unicode");
+Utf8PathBuf::from_path_buf(unicode_path).expect("valid Unicode path succeeded");
+
+// Paths on Unix can be non-UTF-8.
+let non_unicode_str = OsStr::from_bytes(b"\xFF\xFF\xFF");
+let non_unicode_path = PathBuf::from(non_unicode_str);
+Utf8PathBuf::from_path_buf(non_unicode_path).expect_err("non-Unicode path failed");
+

pub fn into_std_path_buf(self) -> PathBuf

Converts a Utf8PathBuf to a PathBuf.

+

This is equivalent to the From<Utf8PathBuf> for PathBuf impl, but may aid in type +inference.

+
§Examples
+
use camino::Utf8PathBuf;
+use std::path::PathBuf;
+
+let utf8_path_buf = Utf8PathBuf::from("foo.txt");
+let std_path_buf = utf8_path_buf.into_std_path_buf();
+assert_eq!(std_path_buf.to_str(), Some("foo.txt"));
+
+// Convert back to a Utf8PathBuf.
+let new_utf8_path_buf = Utf8PathBuf::from_path_buf(std_path_buf).unwrap();
+assert_eq!(new_utf8_path_buf, "foo.txt");
+

pub fn with_capacity(capacity: usize) -> Utf8PathBuf

Creates a new Utf8PathBuf with a given capacity used to create the internal PathBuf. +See with_capacity defined on PathBuf.

+

Requires Rust 1.44 or newer.

+
§Examples
+
use camino::Utf8PathBuf;
+
+let mut path = Utf8PathBuf::with_capacity(10);
+let capacity = path.capacity();
+
+// This push is done without reallocating
+path.push(r"C:\");
+
+assert_eq!(capacity, path.capacity());
+

pub fn as_path(&self) -> &Utf8Path

Coerces to a Utf8Path slice.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let p = Utf8PathBuf::from("/test");
+assert_eq!(Utf8Path::new("/test"), p.as_path());
+

pub fn push(&mut self, path: impl AsRef<Utf8Path>)

Extends self with path.

+

If path is absolute, it replaces the current path.

+

On Windows:

+
    +
  • if path has a root but no prefix (e.g., \windows), it +replaces everything except for the prefix (if any) of self.
  • +
  • if path has a prefix but no root, it replaces self.
  • +
+
§Examples
+

Pushing a relative path extends the existing path:

+ +
use camino::Utf8PathBuf;
+
+let mut path = Utf8PathBuf::from("/tmp");
+path.push("file.bk");
+assert_eq!(path, Utf8PathBuf::from("/tmp/file.bk"));
+

Pushing an absolute path replaces the existing path:

+ +
use camino::Utf8PathBuf;
+
+let mut path = Utf8PathBuf::from("/tmp");
+path.push("/etc");
+assert_eq!(path, Utf8PathBuf::from("/etc"));
+

pub fn pop(&mut self) -> bool

Truncates self to self.parent.

+

Returns false and does nothing if self.parent is None. +Otherwise, returns true.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let mut p = Utf8PathBuf::from("/spirited/away.rs");
+
+p.pop();
+assert_eq!(Utf8Path::new("/spirited"), p);
+p.pop();
+assert_eq!(Utf8Path::new("/"), p);
+

pub fn set_file_name(&mut self, file_name: impl AsRef<str>)

Updates self.file_name to file_name.

+

If self.file_name was None, this is equivalent to pushing +file_name.

+

Otherwise it is equivalent to calling pop and then pushing +file_name. The new path will be a sibling of the original path. +(That is, it will have the same parent.)

+
§Examples
+
use camino::Utf8PathBuf;
+
+let mut buf = Utf8PathBuf::from("/");
+assert_eq!(buf.file_name(), None);
+buf.set_file_name("bar");
+assert_eq!(buf, Utf8PathBuf::from("/bar"));
+assert!(buf.file_name().is_some());
+buf.set_file_name("baz.txt");
+assert_eq!(buf, Utf8PathBuf::from("/baz.txt"));
+

pub fn set_extension(&mut self, extension: impl AsRef<str>) -> bool

Updates self.extension to extension.

+

Returns false and does nothing if self.file_name is None, +returns true and updates the extension otherwise.

+

If self.extension is None, the extension is added; otherwise +it is replaced.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let mut p = Utf8PathBuf::from("/feel/the");
+
+p.set_extension("force");
+assert_eq!(Utf8Path::new("/feel/the.force"), p.as_path());
+
+p.set_extension("dark_side");
+assert_eq!(Utf8Path::new("/feel/the.dark_side"), p.as_path());
+

pub fn into_string(self) -> String

Consumes the Utf8PathBuf, yielding its internal String storage.

+
§Examples
+
use camino::Utf8PathBuf;
+
+let p = Utf8PathBuf::from("/the/head");
+let s = p.into_string();
+assert_eq!(s, "/the/head");
+

pub fn into_os_string(self) -> OsString

Consumes the Utf8PathBuf, yielding its internal OsString storage.

+
§Examples
+
use camino::Utf8PathBuf;
+use std::ffi::OsStr;
+
+let p = Utf8PathBuf::from("/the/head");
+let s = p.into_os_string();
+assert_eq!(s, OsStr::new("/the/head"));
+

pub fn into_boxed_path(self) -> Box<Utf8Path>

Converts this Utf8PathBuf into a boxed Utf8Path.

+

pub fn capacity(&self) -> usize

Invokes capacity on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn clear(&mut self)

Invokes clear on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn reserve(&mut self, additional: usize)

Invokes reserve on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError>

Invokes try_reserve on the underlying instance of PathBuf.

+

Requires Rust 1.63 or newer.

+

pub fn reserve_exact(&mut self, additional: usize)

Invokes reserve_exact on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn try_reserve_exact( + &mut self, + additional: usize, +) -> Result<(), TryReserveError>

Invokes try_reserve_exact on the underlying instance of PathBuf.

+

Requires Rust 1.63 or newer.

+

pub fn shrink_to_fit(&mut self)

Invokes shrink_to_fit on the underlying instance of PathBuf.

+

Requires Rust 1.44 or newer.

+

pub fn shrink_to(&mut self, min_capacity: usize)

Invokes shrink_to on the underlying instance of PathBuf.

+

Requires Rust 1.56 or newer.

+

Methods from Deref<Target = Utf8Path>§

pub fn as_std_path(&self) -> &Path

Converts a Utf8Path to a Path.

+

This is equivalent to the AsRef<&Path> for &Utf8Path impl, but may aid in type inference.

+
§Examples
+
use camino::Utf8Path;
+use std::path::Path;
+
+let utf8_path = Utf8Path::new("foo.txt");
+let std_path: &Path = utf8_path.as_std_path();
+assert_eq!(std_path.to_str(), Some("foo.txt"));
+
+// Convert back to a Utf8Path.
+let new_utf8_path = Utf8Path::from_path(std_path).unwrap();
+assert_eq!(new_utf8_path, "foo.txt");
+

pub fn as_str(&self) -> &str

Yields the underlying str slice.

+

Unlike Path::to_str, this always returns a slice because the contents of a Utf8Path +are guaranteed to be valid UTF-8.

+
§Examples
+
use camino::Utf8Path;
+
+let s = Utf8Path::new("foo.txt").as_str();
+assert_eq!(s, "foo.txt");
+

pub fn as_os_str(&self) -> &OsStr

Yields the underlying OsStr slice.

+
§Examples
+
use camino::Utf8Path;
+
+let os_str = Utf8Path::new("foo.txt").as_os_str();
+assert_eq!(os_str, std::ffi::OsStr::new("foo.txt"));
+

pub fn to_path_buf(&self) -> Utf8PathBuf

Converts a Utf8Path to an owned Utf8PathBuf.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path_buf = Utf8Path::new("foo.txt").to_path_buf();
+assert_eq!(path_buf, Utf8PathBuf::from("foo.txt"));
+

pub fn is_absolute(&self) -> bool

Returns true if the Utf8Path is absolute, i.e., if it is independent of +the current directory.

+
    +
  • +

    On Unix, a path is absolute if it starts with the root, so +is_absolute and has_root are equivalent.

    +
  • +
  • +

    On Windows, a path is absolute if it has a prefix and starts with the +root: c:\windows is absolute, while c:temp and \temp are not.

    +
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert!(!Utf8Path::new("foo.txt").is_absolute());
+

pub fn is_relative(&self) -> bool

Returns true if the Utf8Path is relative, i.e., not absolute.

+

See is_absolute’s documentation for more details.

+
§Examples
+
use camino::Utf8Path;
+
+assert!(Utf8Path::new("foo.txt").is_relative());
+

pub fn has_root(&self) -> bool

Returns true if the Utf8Path has a root.

+
    +
  • +

    On Unix, a path has a root if it begins with /.

    +
  • +
  • +

    On Windows, a path has a root if it:

    +
      +
    • has no prefix and begins with a separator, e.g., \windows
    • +
    • has a prefix followed by a separator, e.g., c:\windows but not c:windows
    • +
    • has any non-disk prefix, e.g., \\server\share
    • +
    +
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert!(Utf8Path::new("/etc/passwd").has_root());
+

pub fn parent(&self) -> Option<&Utf8Path>

Returns the Path without its final component, if there is one.

+

Returns None if the path terminates in a root or prefix.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/foo/bar");
+let parent = path.parent().unwrap();
+assert_eq!(parent, Utf8Path::new("/foo"));
+
+let grand_parent = parent.parent().unwrap();
+assert_eq!(grand_parent, Utf8Path::new("/"));
+assert_eq!(grand_parent.parent(), None);
+

pub fn ancestors(&self) -> Utf8Ancestors<'_>

Produces an iterator over Utf8Path and its ancestors.

+

The iterator will yield the Utf8Path that is returned if the parent method is used zero +or more times. That means, the iterator will yield &self, &self.parent().unwrap(), +&self.parent().unwrap().parent().unwrap() and so on. If the parent method returns +None, the iterator will do likewise. The iterator will always yield at least one value, +namely &self.

+
§Examples
+
use camino::Utf8Path;
+
+let mut ancestors = Utf8Path::new("/foo/bar").ancestors();
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/foo/bar")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/foo")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("/")));
+assert_eq!(ancestors.next(), None);
+
+let mut ancestors = Utf8Path::new("../foo/bar").ancestors();
+assert_eq!(ancestors.next(), Some(Utf8Path::new("../foo/bar")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("../foo")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("..")));
+assert_eq!(ancestors.next(), Some(Utf8Path::new("")));
+assert_eq!(ancestors.next(), None);
+

pub fn file_name(&self) -> Option<&str>

Returns the final component of the Utf8Path, if there is one.

+

If the path is a normal file, this is the file name. If it’s the path of a directory, this +is the directory name.

+

Returns None if the path terminates in ...

+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!(Some("bin"), Utf8Path::new("/usr/bin/").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("tmp/foo.txt").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("foo.txt/.").file_name());
+assert_eq!(Some("foo.txt"), Utf8Path::new("foo.txt/.//").file_name());
+assert_eq!(None, Utf8Path::new("foo.txt/..").file_name());
+assert_eq!(None, Utf8Path::new("/").file_name());
+

pub fn strip_prefix( + &self, + base: impl AsRef<Path>, +) -> Result<&Utf8Path, StripPrefixError>

Returns a path that, when joined onto base, yields self.

+
§Errors
+

If base is not a prefix of self (i.e., starts_with +returns false), returns Err.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/test/haha/foo.txt");
+
+assert_eq!(path.strip_prefix("/"), Ok(Utf8Path::new("test/haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test"), Ok(Utf8Path::new("haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test/"), Ok(Utf8Path::new("haha/foo.txt")));
+assert_eq!(path.strip_prefix("/test/haha/foo.txt"), Ok(Utf8Path::new("")));
+assert_eq!(path.strip_prefix("/test/haha/foo.txt/"), Ok(Utf8Path::new("")));
+
+assert!(path.strip_prefix("test").is_err());
+assert!(path.strip_prefix("/haha").is_err());
+
+let prefix = Utf8PathBuf::from("/test/");
+assert_eq!(path.strip_prefix(prefix), Ok(Utf8Path::new("haha/foo.txt")));
+

pub fn starts_with(&self, base: impl AsRef<Path>) -> bool

Determines whether base is a prefix of self.

+

Only considers whole path components to match.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/etc/passwd");
+
+assert!(path.starts_with("/etc"));
+assert!(path.starts_with("/etc/"));
+assert!(path.starts_with("/etc/passwd"));
+assert!(path.starts_with("/etc/passwd/")); // extra slash is okay
+assert!(path.starts_with("/etc/passwd///")); // multiple extra slashes are okay
+
+assert!(!path.starts_with("/e"));
+assert!(!path.starts_with("/etc/passwd.txt"));
+
+assert!(!Utf8Path::new("/etc/foo.rs").starts_with("/etc/foo"));
+

pub fn ends_with(&self, base: impl AsRef<Path>) -> bool

Determines whether child is a suffix of self.

+

Only considers whole path components to match.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/etc/resolv.conf");
+
+assert!(path.ends_with("resolv.conf"));
+assert!(path.ends_with("etc/resolv.conf"));
+assert!(path.ends_with("/etc/resolv.conf"));
+
+assert!(!path.ends_with("/resolv.conf"));
+assert!(!path.ends_with("conf")); // use .extension() instead
+

pub fn file_stem(&self) -> Option<&str>

Extracts the stem (non-extension) portion of self.file_name.

+

The stem is:

+
    +
  • None, if there is no file name;
  • +
  • The entire file name if there is no embedded .;
  • +
  • The entire file name if the file name begins with . and has no other .s within;
  • +
  • Otherwise, the portion of the file name before the final .
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!("foo", Utf8Path::new("foo.rs").file_stem().unwrap());
+assert_eq!("foo.tar", Utf8Path::new("foo.tar.gz").file_stem().unwrap());
+

pub fn extension(&self) -> Option<&str>

Extracts the extension of self.file_name, if possible.

+

The extension is:

+
    +
  • None, if there is no file name;
  • +
  • None, if there is no embedded .;
  • +
  • None, if the file name begins with . and has no other .s within;
  • +
  • Otherwise, the portion of the file name after the final .
  • +
+
§Examples
+
use camino::Utf8Path;
+
+assert_eq!("rs", Utf8Path::new("foo.rs").extension().unwrap());
+assert_eq!("gz", Utf8Path::new("foo.tar.gz").extension().unwrap());
+

pub fn join(&self, path: impl AsRef<Utf8Path>) -> Utf8PathBuf

Creates an owned Utf8PathBuf with path adjoined to self.

+

See Utf8PathBuf::push for more details on what it means to adjoin a path.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+assert_eq!(Utf8Path::new("/etc").join("passwd"), Utf8PathBuf::from("/etc/passwd"));
+

pub fn join_os(&self, path: impl AsRef<Path>) -> PathBuf

Creates an owned PathBuf with path adjoined to self.

+

See PathBuf::push for more details on what it means to adjoin a path.

+
§Examples
+
use camino::Utf8Path;
+use std::path::PathBuf;
+
+assert_eq!(Utf8Path::new("/etc").join_os("passwd"), PathBuf::from("/etc/passwd"));
+

pub fn with_file_name(&self, file_name: impl AsRef<str>) -> Utf8PathBuf

Creates an owned Utf8PathBuf like self but with the given file name.

+

See Utf8PathBuf::set_file_name for more details.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/tmp/foo.txt");
+assert_eq!(path.with_file_name("bar.txt"), Utf8PathBuf::from("/tmp/bar.txt"));
+
+let path = Utf8Path::new("/tmp");
+assert_eq!(path.with_file_name("var"), Utf8PathBuf::from("/var"));
+

pub fn with_extension(&self, extension: impl AsRef<str>) -> Utf8PathBuf

Creates an owned Utf8PathBuf like self but with the given extension.

+

See Utf8PathBuf::set_extension for more details.

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("foo.rs");
+assert_eq!(path.with_extension("txt"), Utf8PathBuf::from("foo.txt"));
+
+let path = Utf8Path::new("foo.tar.gz");
+assert_eq!(path.with_extension(""), Utf8PathBuf::from("foo.tar"));
+assert_eq!(path.with_extension("xz"), Utf8PathBuf::from("foo.tar.xz"));
+assert_eq!(path.with_extension("").with_extension("txt"), Utf8PathBuf::from("foo.txt"));
+

pub fn components(&self) -> Utf8Components<'_>

Produces an iterator over the Utf8Components of the path.

+

When parsing the path, there is a small amount of normalization:

+
    +
  • +

    Repeated separators are ignored, so a/b and a//b both have +a and b as components.

    +
  • +
  • +

    Occurrences of . are normalized away, except if they are at the +beginning of the path. For example, a/./b, a/b/, a/b/. and +a/b all have a and b as components, but ./a/b starts with +an additional CurDir component.

    +
  • +
  • +

    A trailing slash is normalized away, /a/b and /a/b/ are equivalent.

    +
  • +
+

Note that no other normalization takes place; in particular, a/c +and a/b/../c are distinct, to account for the possibility that b +is a symbolic link (so its parent isn’t a).

+
§Examples
+
use camino::{Utf8Component, Utf8Path};
+
+let mut components = Utf8Path::new("/tmp/foo.txt").components();
+
+assert_eq!(components.next(), Some(Utf8Component::RootDir));
+assert_eq!(components.next(), Some(Utf8Component::Normal("tmp")));
+assert_eq!(components.next(), Some(Utf8Component::Normal("foo.txt")));
+assert_eq!(components.next(), None)
+

pub fn iter(&self) -> Iter<'_>

Produces an iterator over the path’s components viewed as str +slices.

+

For more information about the particulars of how the path is separated +into components, see components.

+
§Examples
+
use camino::Utf8Path;
+
+let mut it = Utf8Path::new("/tmp/foo.txt").iter();
+assert_eq!(it.next(), Some(std::path::MAIN_SEPARATOR.to_string().as_str()));
+assert_eq!(it.next(), Some("tmp"));
+assert_eq!(it.next(), Some("foo.txt"));
+assert_eq!(it.next(), None)
+

pub fn metadata(&self) -> Result<Metadata, Error>

Queries the file system to get information about a file, directory, etc.

+

This function will traverse symbolic links to query information about the +destination file.

+

This is an alias to fs::metadata.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/Minas/tirith");
+let metadata = path.metadata().expect("metadata call failed");
+println!("{:?}", metadata.file_type());
+

Queries the metadata about a file without following symlinks.

+

This is an alias to fs::symlink_metadata.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/Minas/tirith");
+let metadata = path.symlink_metadata().expect("symlink_metadata call failed");
+println!("{:?}", metadata.file_type());
+

pub fn canonicalize(&self) -> Result<PathBuf, Error>

Returns the canonical, absolute form of the path with all intermediate +components normalized and symbolic links resolved.

+

This returns a PathBuf because even if a symlink is valid Unicode, its target may not +be. For a version that returns a Utf8PathBuf, see +canonicalize_utf8.

+

This is an alias to fs::canonicalize.

+
§Examples
+
use camino::Utf8Path;
+use std::path::PathBuf;
+
+let path = Utf8Path::new("/foo/test/../test/bar.rs");
+assert_eq!(path.canonicalize().unwrap(), PathBuf::from("/foo/test/bar.rs"));
+

pub fn canonicalize_utf8(&self) -> Result<Utf8PathBuf, Error>

Returns the canonical, absolute form of the path with all intermediate +components normalized and symbolic links resolved.

+

This method attempts to convert the resulting PathBuf into a Utf8PathBuf. For a +version that does not attempt to do this conversion, see +canonicalize.

+
§Errors
+

The I/O operation may return an error: see the fs::canonicalize +documentation for more.

+

If the resulting path is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::{Utf8Path, Utf8PathBuf};
+
+let path = Utf8Path::new("/foo/test/../test/bar.rs");
+assert_eq!(path.canonicalize_utf8().unwrap(), Utf8PathBuf::from("/foo/test/bar.rs"));
+

Reads a symbolic link, returning the file that the link points to.

+

This returns a PathBuf because even if a symlink is valid Unicode, its target may not +be. For a version that returns a Utf8PathBuf, see +read_link_utf8.

+

This is an alias to fs::read_link.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa/sky_castle.rs");
+let path_link = path.read_link().expect("read_link call failed");
+

Reads a symbolic link, returning the file that the link points to.

+

This method attempts to convert the resulting PathBuf into a Utf8PathBuf. For a +version that does not attempt to do this conversion, see read_link.

+
§Errors
+

The I/O operation may return an error: see the fs::read_link +documentation for more.

+

If the resulting path is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa/sky_castle.rs");
+let path_link = path.read_link_utf8().expect("read_link call failed");
+

pub fn read_dir(&self) -> Result<ReadDir, Error>

Returns an iterator over the entries within a directory.

+

The iterator will yield instances of io::Result<fs::DirEntry>. New +errors may be encountered after an iterator is initially constructed.

+

This is an alias to fs::read_dir.

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa");
+for entry in path.read_dir().expect("read_dir call failed") {
+    if let Ok(entry) = entry {
+        println!("{:?}", entry.path());
+    }
+}
+

pub fn read_dir_utf8(&self) -> Result<ReadDirUtf8, Error>

Returns an iterator over the entries within a directory.

+

The iterator will yield instances of io::Result<[Utf8DirEntry]>. New +errors may be encountered after an iterator is initially constructed.

+
§Errors
+

The I/O operation may return an error: see the fs::read_dir +documentation for more.

+

If a directory entry is not UTF-8, an io::Error is returned with the +ErrorKind set to InvalidData and the payload set to a +[FromPathBufError].

+
§Examples
+
use camino::Utf8Path;
+
+let path = Utf8Path::new("/laputa");
+for entry in path.read_dir_utf8().expect("read_dir call failed") {
+    if let Ok(entry) = entry {
+        println!("{}", entry.path());
+    }
+}
+

pub fn exists(&self) -> bool

Returns true if the path points at an existing entity.

+

Warning: this method may be error-prone, consider using try_exists() instead! +It also has a risk of introducing time-of-check to time-of-use (TOCTOU) bugs.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert!(!Utf8Path::new("does_not_exist.txt").exists());
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata.

+

pub fn try_exists(&self) -> Result<bool, Error>

Returns Ok(true) if the path points at an existing entity.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return Ok(false).

+

As opposed to the exists() method, this one doesn’t silently ignore errors +unrelated to the path not existing. (E.g. it will return Err(_) in case of permission +denied on some of the parent directories.)

+

Note that while this avoids some pitfalls of the exists() method, it still can not +prevent time-of-check to time-of-use (TOCTOU) bugs. You should only use it in scenarios +where those bugs are not an issue.

+
§Examples
+
use camino::Utf8Path;
+assert!(!Utf8Path::new("does_not_exist.txt").try_exists().expect("Can't check existence of file does_not_exist.txt"));
+assert!(Utf8Path::new("/root/secret_file.txt").try_exists().is_err());
+

pub fn is_file(&self) -> bool

Returns true if the path exists on disk and is pointing at a regular file.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert_eq!(Utf8Path::new("./is_a_directory/").is_file(), false);
+assert_eq!(Utf8Path::new("a_file.txt").is_file(), true);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata and handle its Result. Then call +fs::Metadata::is_file if it was Ok.

+

When the goal is simply to read from (or write to) the source, the most +reliable way to test the source can be read (or written to) is to open +it. Only using is_file can break workflows like diff <( prog_a ) on +a Unix-like system for example. See fs::File::open or +fs::OpenOptions::open for more information.

+

pub fn is_dir(&self) -> bool

Returns true if the path exists on disk and is pointing at a directory.

+

This function will traverse symbolic links to query information about the +destination file. In case of broken symbolic links this will return false.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+assert_eq!(Utf8Path::new("./is_a_directory/").is_dir(), true);
+assert_eq!(Utf8Path::new("a_file.txt").is_dir(), false);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call fs::metadata and handle its Result. Then call +fs::Metadata::is_dir if it was Ok.

+

Returns true if the path exists on disk and is pointing at a symbolic link.

+

This function will not traverse symbolic links. +In case of a broken symbolic link this will also return true.

+

If you cannot access the directory containing the file, e.g., because of a +permission error, this will return false.

+
§Examples
+
use camino::Utf8Path;
+use std::os::unix::fs::symlink;
+
+let link_path = Utf8Path::new("link");
+symlink("/origin_does_not_exist/", link_path).unwrap();
+assert_eq!(link_path.is_symlink(), true);
+assert_eq!(link_path.exists(), false);
+
§See Also
+

This is a convenience function that coerces errors to false. If you want to +check errors, call Utf8Path::symlink_metadata and handle its Result. Then call +fs::Metadata::is_symlink if it was Ok.

+

Trait Implementations§

§

impl AsRef<OsStr> for Utf8PathBuf

§

fn as_ref(&self) -> &OsStr

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Path> for Utf8PathBuf

§

fn as_ref(&self) -> &Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<Utf8Path> for Utf8PathBuf

§

fn as_ref(&self) -> &Utf8Path

Converts this type into a shared reference of the (usually inferred) input type.
§

impl AsRef<str> for Utf8PathBuf

§

fn as_ref(&self) -> &str

Converts this type into a shared reference of the (usually inferred) input type.
§

impl Borrow<Utf8Path> for Utf8PathBuf

§

fn borrow(&self) -> &Utf8Path

Immutably borrows from an owned value. Read more
§

impl Clone for Utf8PathBuf

§

fn clone(&self) -> Utf8PathBuf

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for Utf8PathBuf

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for Utf8PathBuf

§

fn default() -> Utf8PathBuf

Returns the “default value” for a type. Read more
§

impl Deref for Utf8PathBuf

§

type Target = Utf8Path

The resulting type after dereferencing.
§

fn deref(&self) -> &Utf8Path

Dereferences the value.
§

impl Display for Utf8PathBuf

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<P> Extend<P> for Utf8PathBuf
where + P: AsRef<Utf8Path>,

§

fn extend<I>(&mut self, iter: I)
where + I: IntoIterator<Item = P>,

Extends a collection with the contents of an iterator. Read more
Source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
§

impl<T> From<&T> for Utf8PathBuf
where + T: AsRef<str> + ?Sized,

§

fn from(s: &T) -> Utf8PathBuf

Converts to this type from the input type.
§

impl From<Box<Utf8Path>> for Utf8PathBuf

§

fn from(path: Box<Utf8Path>) -> Utf8PathBuf

Converts to this type from the input type.
§

impl<'a> From<Cow<'a, Utf8Path>> for Utf8PathBuf

§

fn from(path: Cow<'a, Utf8Path>) -> Utf8PathBuf

Converts to this type from the input type.
§

impl From<String> for Utf8PathBuf

§

fn from(string: String) -> Utf8PathBuf

Converts to this type from the input type.
§

impl<P> FromIterator<P> for Utf8PathBuf
where + P: AsRef<Utf8Path>,

§

fn from_iter<I>(iter: I) -> Utf8PathBuf
where + I: IntoIterator<Item = P>,

Creates a value from an iterator. Read more
§

impl FromStr for Utf8PathBuf

§

type Err = Infallible

The associated error which can be returned from parsing.
§

fn from_str(s: &str) -> Result<Utf8PathBuf, <Utf8PathBuf as FromStr>::Err>

Parses a string s to return a value of this type. Read more
§

impl Hash for Utf8PathBuf

§

fn hash<H>(&self, state: &mut H)
where + H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl<'a> IntoIterator for &'a Utf8PathBuf

§

type Item = &'a str

The type of the elements being iterated over.
§

type IntoIter = Iter<'a>

Which kind of iterator are we turning this into?
§

fn into_iter(self) -> Iter<'a>

Creates an iterator from a value. Read more
§

impl Ord for Utf8PathBuf

§

fn cmp(&self, other: &Utf8PathBuf) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
§

impl<'a, 'b> PartialEq<&'a OsStr> for Utf8PathBuf

§

fn eq(&self, other: &&'a OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Path> for Utf8PathBuf

§

fn eq(&self, other: &&'a Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a Utf8Path> for Utf8PathBuf

§

fn eq(&self, other: &&'a Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<&'a str> for Utf8PathBuf

§

fn eq(&self, other: &&'a str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, OsStr>> for Utf8PathBuf

§

fn eq(&self, other: &Cow<'a, OsStr>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Path>> for Utf8PathBuf

§

fn eq(&self, other: &Cow<'a, Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, Utf8Path>> for Utf8PathBuf

§

fn eq(&self, other: &Cow<'a, Utf8Path>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Cow<'a, str>> for Utf8PathBuf

§

fn eq(&self, other: &Cow<'a, str>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsStr> for Utf8PathBuf

§

fn eq(&self, other: &OsStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<OsString> for Utf8PathBuf

§

fn eq(&self, other: &OsString) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Path> for Utf8PathBuf

§

fn eq(&self, other: &Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<PathBuf> for Utf8PathBuf

§

fn eq(&self, other: &PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<String> for Utf8PathBuf

§

fn eq(&self, other: &String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8Path> for Utf8PathBuf

§

fn eq(&self, other: &Utf8Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a OsStr

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a Utf8Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for &'a str

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for OsStr

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for Utf8Path

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<Utf8PathBuf> for str

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialEq<str> for Utf8PathBuf

§

fn eq(&self, other: &str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq for Utf8PathBuf

§

fn eq(&self, other: &Utf8PathBuf) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a, 'b> PartialOrd<&'a OsStr> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a Utf8Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<&'a str> for Utf8PathBuf

§

fn partial_cmp(&self, other: &&'a str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, OsStr>> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Cow<'a, OsStr>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Path>> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Cow<'a, Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, Utf8Path>> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Cow<'a, Utf8Path>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Cow<'a, str>> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Cow<'a, str>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsStr> for Utf8PathBuf

§

fn partial_cmp(&self, other: &OsStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<OsString> for Utf8PathBuf

§

fn partial_cmp(&self, other: &OsString) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<PathBuf> for Utf8PathBuf

§

fn partial_cmp(&self, other: &PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<String> for Utf8PathBuf

§

fn partial_cmp(&self, other: &String) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8Path> for Utf8PathBuf

§

fn partial_cmp(&self, other: &Utf8Path) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a OsStr

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a Utf8Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for &'a str

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for OsStr

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for Utf8Path

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<Utf8PathBuf> for str

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl<'a, 'b> PartialOrd<str> for Utf8PathBuf

§

fn partial_cmp(&self, other: &str) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl PartialOrd for Utf8PathBuf

§

fn partial_cmp(&self, other: &Utf8PathBuf) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl TryFrom<PathBuf> for Utf8PathBuf

§

type Error = FromPathBufError

The type returned in the event of a conversion error.
§

fn try_from( + path: PathBuf, +) -> Result<Utf8PathBuf, <Utf8PathBuf as TryFrom<PathBuf>>::Error>

Performs the conversion.
§

impl Eq for Utf8PathBuf

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<P, T> Receiver for P
where + P: Deref<Target = T> + ?Sized, + T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/index.html b/compiler-docs/fe_common/index.html new file mode 100644 index 0000000000..1ebb99b7d7 --- /dev/null +++ b/compiler-docs/fe_common/index.html @@ -0,0 +1,2 @@ +fe_common - Rust

Crate fe_common

Source

Re-exports§

pub use files::File;
pub use files::FileKind;
pub use files::SourceFileId;

Modules§

db
diagnostics
files
numeric
panic
utils

Macros§

assert_snapshot_wasm
assert_strings_eq
Compare the given strings and panic when not equal with a colorized line +diff.
impl_intern_key

Structs§

Span
An exclusive span of byte offsets in a source file.

Traits§

Spanned
\ No newline at end of file diff --git a/compiler-docs/fe_common/macro.assert_snapshot_wasm!.html b/compiler-docs/fe_common/macro.assert_snapshot_wasm!.html new file mode 100644 index 0000000000..bbfb81b29d --- /dev/null +++ b/compiler-docs/fe_common/macro.assert_snapshot_wasm!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.assert_snapshot_wasm.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/macro.assert_snapshot_wasm.html b/compiler-docs/fe_common/macro.assert_snapshot_wasm.html new file mode 100644 index 0000000000..4a38efda6f --- /dev/null +++ b/compiler-docs/fe_common/macro.assert_snapshot_wasm.html @@ -0,0 +1,3 @@ +assert_snapshot_wasm in fe_common - Rust

Macro assert_snapshot_wasm

Source
macro_rules! assert_snapshot_wasm {
+    ($path:expr, $actual:expr) => { ... };
+}
\ No newline at end of file diff --git a/compiler-docs/fe_common/macro.assert_strings_eq!.html b/compiler-docs/fe_common/macro.assert_strings_eq!.html new file mode 100644 index 0000000000..65aac92273 --- /dev/null +++ b/compiler-docs/fe_common/macro.assert_strings_eq!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.assert_strings_eq.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/macro.assert_strings_eq.html b/compiler-docs/fe_common/macro.assert_strings_eq.html new file mode 100644 index 0000000000..cbeb698ad1 --- /dev/null +++ b/compiler-docs/fe_common/macro.assert_strings_eq.html @@ -0,0 +1,7 @@ +assert_strings_eq in fe_common - Rust

Macro assert_strings_eq

Source
macro_rules! assert_strings_eq {
+    ($left:expr, $right:expr,) => { ... };
+    ($left:expr, $right:expr) => { ... };
+    ($left:expr, $right:expr, $($args:tt)*) => { ... };
+}
Expand description

Compare the given strings and panic when not equal with a colorized line +diff.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/macro.impl_intern_key!.html b/compiler-docs/fe_common/macro.impl_intern_key!.html new file mode 100644 index 0000000000..76c12bee1d --- /dev/null +++ b/compiler-docs/fe_common/macro.impl_intern_key!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.impl_intern_key.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/macro.impl_intern_key.html b/compiler-docs/fe_common/macro.impl_intern_key.html new file mode 100644 index 0000000000..de6ddd06cf --- /dev/null +++ b/compiler-docs/fe_common/macro.impl_intern_key.html @@ -0,0 +1,3 @@ +impl_intern_key in fe_common - Rust

Macro impl_intern_key

Source
macro_rules! impl_intern_key {
+    ($name:ident) => { ... };
+}
\ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/enum.Radix.html b/compiler-docs/fe_common/numeric/enum.Radix.html new file mode 100644 index 0000000000..93f441cea5 --- /dev/null +++ b/compiler-docs/fe_common/numeric/enum.Radix.html @@ -0,0 +1,27 @@ +Radix in fe_common::numeric - Rust

Enum Radix

Source
pub enum Radix {
+    Hexadecimal,
+    Decimal,
+    Octal,
+    Binary,
+}
Expand description

A type that represents the radix of a numeric literal.

+

Variants§

§

Hexadecimal

§

Decimal

§

Octal

§

Binary

Implementations§

Source§

impl Radix

Source

pub fn as_num(self) -> u32

Returns number representation of the radix.

+

Trait Implementations§

Source§

impl Clone for Radix

Source§

fn clone(&self) -> Radix

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Radix

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Radix

Source§

fn eq(&self, other: &Radix) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Radix

Source§

impl Eq for Radix

Source§

impl StructuralPartialEq for Radix

Auto Trait Implementations§

§

impl Freeze for Radix

§

impl RefUnwindSafe for Radix

§

impl Send for Radix

§

impl Sync for Radix

§

impl Unpin for Radix

§

impl UnwindSafe for Radix

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/fn.to_hex_str.html b/compiler-docs/fe_common/numeric/fn.to_hex_str.html new file mode 100644 index 0000000000..8f80143a9e --- /dev/null +++ b/compiler-docs/fe_common/numeric/fn.to_hex_str.html @@ -0,0 +1 @@ +to_hex_str in fe_common::numeric - Rust

Function to_hex_str

Source
pub fn to_hex_str(val: &BigInt) -> String
\ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/index.html b/compiler-docs/fe_common/numeric/index.html new file mode 100644 index 0000000000..26ea7e7c18 --- /dev/null +++ b/compiler-docs/fe_common/numeric/index.html @@ -0,0 +1 @@ +fe_common::numeric - Rust

Module numeric

Source

Structs§

Literal
A helper type to interpret a numeric literal represented by string.

Enums§

Radix
A type that represents the radix of a numeric literal.

Functions§

to_hex_str
\ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/sidebar-items.js b/compiler-docs/fe_common/numeric/sidebar-items.js new file mode 100644 index 0000000000..df6d260a4b --- /dev/null +++ b/compiler-docs/fe_common/numeric/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Radix"],"fn":["to_hex_str"],"struct":["Literal"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/numeric/struct.Literal.html b/compiler-docs/fe_common/numeric/struct.Literal.html new file mode 100644 index 0000000000..091e1054b6 --- /dev/null +++ b/compiler-docs/fe_common/numeric/struct.Literal.html @@ -0,0 +1,16 @@ +Literal in fe_common::numeric - Rust

Struct Literal

Source
pub struct Literal<'a> { /* private fields */ }
Expand description

A helper type to interpret a numeric literal represented by string.

+

Implementations§

Source§

impl<'a> Literal<'a>

Source

pub fn new(src: &'a str) -> Self

Source

pub fn parse<T: Num>(&self) -> Result<T, T::FromStrRadixErr>

Parse the numeric literal to T.

+
Source

pub fn radix(&self) -> Radix

Returns radix of the numeric literal.

+

Trait Implementations§

Source§

impl<'a> Clone for Literal<'a>

Source§

fn clone(&self) -> Literal<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for Literal<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for Literal<'a>

§

impl<'a> RefUnwindSafe for Literal<'a>

§

impl<'a> Send for Literal<'a>

§

impl<'a> Sync for Literal<'a>

§

impl<'a> Unpin for Literal<'a>

§

impl<'a> UnwindSafe for Literal<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/panic/fn.install_panic_hook.html b/compiler-docs/fe_common/panic/fn.install_panic_hook.html new file mode 100644 index 0000000000..f689368c1f --- /dev/null +++ b/compiler-docs/fe_common/panic/fn.install_panic_hook.html @@ -0,0 +1 @@ +install_panic_hook in fe_common::panic - Rust

Function install_panic_hook

Source
pub fn install_panic_hook()
\ No newline at end of file diff --git a/compiler-docs/fe_common/panic/index.html b/compiler-docs/fe_common/panic/index.html new file mode 100644 index 0000000000..363a29d643 --- /dev/null +++ b/compiler-docs/fe_common/panic/index.html @@ -0,0 +1 @@ +fe_common::panic - Rust

Module panic

Source

Functions§

install_panic_hook
\ No newline at end of file diff --git a/compiler-docs/fe_common/panic/sidebar-items.js b/compiler-docs/fe_common/panic/sidebar-items.js new file mode 100644 index 0000000000..0ddac1d609 --- /dev/null +++ b/compiler-docs/fe_common/panic/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["install_panic_hook"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/sidebar-items.js b/compiler-docs/fe_common/sidebar-items.js new file mode 100644 index 0000000000..61d4b4f207 --- /dev/null +++ b/compiler-docs/fe_common/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"macro":["assert_snapshot_wasm","assert_strings_eq","impl_intern_key"],"mod":["db","diagnostics","files","numeric","panic","utils"],"struct":["Span"],"trait":["Spanned"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/span/struct.Span.html b/compiler-docs/fe_common/span/struct.Span.html new file mode 100644 index 0000000000..bed03a2164 --- /dev/null +++ b/compiler-docs/fe_common/span/struct.Span.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_common/struct.Span.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/span/trait.Spanned.html b/compiler-docs/fe_common/span/trait.Spanned.html new file mode 100644 index 0000000000..879084c593 --- /dev/null +++ b/compiler-docs/fe_common/span/trait.Spanned.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_common/trait.Spanned.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_common/struct.Span.html b/compiler-docs/fe_common/struct.Span.html new file mode 100644 index 0000000000..c10dd82ed6 --- /dev/null +++ b/compiler-docs/fe_common/struct.Span.html @@ -0,0 +1,37 @@ +Span in fe_common - Rust

Struct Span

Source
pub struct Span {
+    pub file_id: SourceFileId,
+    pub start: usize,
+    pub end: usize,
+}
Expand description

An exclusive span of byte offsets in a source file.

+

Fields§

§file_id: SourceFileId§start: usize

A byte offset specifying the inclusive start of a span.

+
§end: usize

A byte offset specifying the exclusive end of a span.

+

Implementations§

Source§

impl Span

Source

pub fn new(file_id: SourceFileId, start: usize, end: usize) -> Self

Source

pub fn zero(file_id: SourceFileId) -> Self

Source

pub fn dummy() -> Self

Source

pub fn is_dummy(&self) -> bool

Source

pub fn from_pair<S, E>(start_elem: S, end_elem: E) -> Self
where + S: Into<Span>, + E: Into<Span>,

Trait Implementations§

Source§

impl<'a, T> Add<&'a T> for Span
where + T: Spanned,

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: &'a T) -> Self

Performs the + operation. Read more
Source§

impl<'a, T> Add<Option<&'a T>> for Span
where + Span: Add<&'a T, Output = Self>,

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Option<&'a T>) -> Self

Performs the + operation. Read more
Source§

impl Add<Option<Span>> for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Option<Span>) -> Self

Performs the + operation. Read more
Source§

impl Add for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Self) -> Self

Performs the + operation. Read more
Source§

impl<T> AddAssign<T> for Span
where + Span: Add<T, Output = Self>,

Source§

fn add_assign(&mut self, other: T)

Performs the += operation. Read more
Source§

impl Clone for Span

Source§

fn clone(&self) -> Span

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Span

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Span

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl From<Span> for Range<usize>

Source§

fn from(span: Span) -> Self

Converts to this type from the input type.
Source§

impl Hash for Span

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Span

Source§

fn eq(&self, other: &Span) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Span

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for Span

Source§

impl Eq for Span

Source§

impl StructuralPartialEq for Span

Auto Trait Implementations§

§

impl Freeze for Span

§

impl RefUnwindSafe for Span

§

impl Send for Span

§

impl Sync for Span

§

impl Unpin for Span

§

impl UnwindSafe for Span

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_common/trait.Spanned.html b/compiler-docs/fe_common/trait.Spanned.html new file mode 100644 index 0000000000..c60650fd47 --- /dev/null +++ b/compiler-docs/fe_common/trait.Spanned.html @@ -0,0 +1,4 @@ +Spanned in fe_common - Rust

Trait Spanned

Source
pub trait Spanned {
+    // Required method
+    fn span(&self) -> Span;
+}

Required Methods§

Source

fn span(&self) -> Span

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/dirs/fn.get_fe_deps.html b/compiler-docs/fe_common/utils/dirs/fn.get_fe_deps.html new file mode 100644 index 0000000000..59ba5c4eb1 --- /dev/null +++ b/compiler-docs/fe_common/utils/dirs/fn.get_fe_deps.html @@ -0,0 +1 @@ +get_fe_deps in fe_common::utils::dirs - Rust

Function get_fe_deps

Source
pub fn get_fe_deps() -> PathBuf
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/dirs/fn.get_fe_home.html b/compiler-docs/fe_common/utils/dirs/fn.get_fe_home.html new file mode 100644 index 0000000000..226f38fb74 --- /dev/null +++ b/compiler-docs/fe_common/utils/dirs/fn.get_fe_home.html @@ -0,0 +1 @@ +get_fe_home in fe_common::utils::dirs - Rust

Function get_fe_home

Source
pub fn get_fe_home() -> PathBuf
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/dirs/index.html b/compiler-docs/fe_common/utils/dirs/index.html new file mode 100644 index 0000000000..f0b817ca1f --- /dev/null +++ b/compiler-docs/fe_common/utils/dirs/index.html @@ -0,0 +1 @@ +fe_common::utils::dirs - Rust

Module dirs

Source

Functions§

get_fe_deps
get_fe_home
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/dirs/sidebar-items.js b/compiler-docs/fe_common/utils/dirs/sidebar-items.js new file mode 100644 index 0000000000..bc67f01f09 --- /dev/null +++ b/compiler-docs/fe_common/utils/dirs/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["get_fe_deps","get_fe_home"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/enum.DependencyKind.html b/compiler-docs/fe_common/utils/files/enum.DependencyKind.html new file mode 100644 index 0000000000..f2c5951cfa --- /dev/null +++ b/compiler-docs/fe_common/utils/files/enum.DependencyKind.html @@ -0,0 +1,16 @@ +DependencyKind in fe_common::utils::files - Rust

Enum DependencyKind

Source
pub enum DependencyKind {
+    Local(LocalDependency),
+    Git(GitDependency),
+}

Variants§

Trait Implementations§

Source§

impl Clone for DependencyKind

Source§

fn clone(&self) -> DependencyKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/enum.FileLoader.html b/compiler-docs/fe_common/utils/files/enum.FileLoader.html new file mode 100644 index 0000000000..d39651a4d0 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/enum.FileLoader.html @@ -0,0 +1,14 @@ +FileLoader in fe_common::utils::files - Rust

Enum FileLoader

Source
pub enum FileLoader {
+    Static(Vec<(&'static str, &'static str)>),
+    Fs,
+}

Variants§

§

Static(Vec<(&'static str, &'static str)>)

§

Fs

Implementations§

Source§

impl FileLoader

Source

pub fn canonicalize_path(&self, path: &str) -> Result<SmolStr, String>

Source

pub fn fe_files(&self, path: &str) -> Result<Vec<(String, String)>, String>

Source

pub fn file_content(&self, path: &str) -> Result<String, String>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/enum.ProjectMode.html b/compiler-docs/fe_common/utils/files/enum.ProjectMode.html new file mode 100644 index 0000000000..d48bec817d --- /dev/null +++ b/compiler-docs/fe_common/utils/files/enum.ProjectMode.html @@ -0,0 +1,23 @@ +ProjectMode in fe_common::utils::files - Rust

Enum ProjectMode

Source
pub enum ProjectMode {
+    Main,
+    Lib,
+}

Variants§

§

Main

§

Lib

Trait Implementations§

Source§

impl Clone for ProjectMode

Source§

fn clone(&self) -> ProjectMode

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl PartialEq for ProjectMode

Source§

fn eq(&self, other: &ProjectMode) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ProjectMode

Source§

impl Eq for ProjectMode

Source§

impl StructuralPartialEq for ProjectMode

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/fn.get_project_root.html b/compiler-docs/fe_common/utils/files/fn.get_project_root.html new file mode 100644 index 0000000000..c5ae00e171 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/fn.get_project_root.html @@ -0,0 +1,2 @@ +get_project_root in fe_common::utils::files - Rust

Function get_project_root

Source
pub fn get_project_root() -> Option<String>
Expand description

Returns the root path of the current Fe project

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/index.html b/compiler-docs/fe_common/utils/files/index.html new file mode 100644 index 0000000000..9ee0b8570c --- /dev/null +++ b/compiler-docs/fe_common/utils/files/index.html @@ -0,0 +1 @@ +fe_common::utils::files - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/sidebar-items.js b/compiler-docs/fe_common/utils/files/sidebar-items.js new file mode 100644 index 0000000000..aceea560a2 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["DependencyKind","FileLoader","ProjectMode"],"fn":["get_project_root"],"struct":["BuildFiles","Dependency","GitDependency","LocalDependency","ProjectFiles"],"trait":["DependencyResolver"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.BuildFiles.html b/compiler-docs/fe_common/utils/files/struct.BuildFiles.html new file mode 100644 index 0000000000..42ab88cbc3 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.BuildFiles.html @@ -0,0 +1,19 @@ +BuildFiles in fe_common::utils::files - Rust

Struct BuildFiles

Source
pub struct BuildFiles {
+    pub root_project_path: SmolStr,
+    pub project_files: IndexMap<SmolStr, ProjectFiles>,
+}

Fields§

§root_project_path: SmolStr§project_files: IndexMap<SmolStr, ProjectFiles>

Implementations§

Source§

impl BuildFiles

Source

pub fn root_project_mode(&self) -> ProjectMode

Source

pub fn load_fs(root_path: &str) -> Result<Self, String>

Build files are loaded from the file system.

+
Source

pub fn load_static( + files: Vec<(&'static str, &'static str)>, + root_path: &str, +) -> Result<Self, String>

Build files are loaded from static file vector.

+

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.Dependency.html b/compiler-docs/fe_common/utils/files/struct.Dependency.html new file mode 100644 index 0000000000..76f735a660 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.Dependency.html @@ -0,0 +1,18 @@ +Dependency in fe_common::utils::files - Rust

Struct Dependency

Source
pub struct Dependency {
+    pub name: SmolStr,
+    pub version: Option<SmolStr>,
+    pub canonicalized_path: SmolStr,
+    pub kind: DependencyKind,
+}

Fields§

§name: SmolStr§version: Option<SmolStr>§canonicalized_path: SmolStr§kind: DependencyKind

Trait Implementations§

Source§

impl Clone for Dependency

Source§

fn clone(&self) -> Dependency

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.GitDependency.html b/compiler-docs/fe_common/utils/files/struct.GitDependency.html new file mode 100644 index 0000000000..f00df75ff5 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.GitDependency.html @@ -0,0 +1,16 @@ +GitDependency in fe_common::utils::files - Rust

Struct GitDependency

Source
pub struct GitDependency { /* private fields */ }

Trait Implementations§

Source§

impl Clone for GitDependency

Source§

fn clone(&self) -> GitDependency

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DependencyResolver for GitDependency

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.LocalDependency.html b/compiler-docs/fe_common/utils/files/struct.LocalDependency.html new file mode 100644 index 0000000000..c11c14eb93 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.LocalDependency.html @@ -0,0 +1,16 @@ +LocalDependency in fe_common::utils::files - Rust

Struct LocalDependency

Source
pub struct LocalDependency;

Trait Implementations§

Source§

impl Clone for LocalDependency

Source§

fn clone(&self) -> LocalDependency

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl DependencyResolver for LocalDependency

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/struct.ProjectFiles.html b/compiler-docs/fe_common/utils/files/struct.ProjectFiles.html new file mode 100644 index 0000000000..384bca33d5 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/struct.ProjectFiles.html @@ -0,0 +1,17 @@ +ProjectFiles in fe_common::utils::files - Rust

Struct ProjectFiles

Source
pub struct ProjectFiles {
+    pub name: SmolStr,
+    pub version: SmolStr,
+    pub mode: ProjectMode,
+    pub dependencies: Vec<Dependency>,
+    pub src: Vec<(String, String)>,
+}

Fields§

§name: SmolStr§version: SmolStr§mode: ProjectMode§dependencies: Vec<Dependency>§src: Vec<(String, String)>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/files/trait.DependencyResolver.html b/compiler-docs/fe_common/utils/files/trait.DependencyResolver.html new file mode 100644 index 0000000000..76f6fe6752 --- /dev/null +++ b/compiler-docs/fe_common/utils/files/trait.DependencyResolver.html @@ -0,0 +1,10 @@ +DependencyResolver in fe_common::utils::files - Rust

Trait DependencyResolver

Source
pub trait DependencyResolver {
+    // Required method
+    fn resolve(
+        dep: &Dependency,
+        loader: &FileLoader,
+    ) -> Result<ProjectFiles, String>;
+}

Required Methods§

Source

fn resolve( + dep: &Dependency, + loader: &FileLoader, +) -> Result<ProjectFiles, String>

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/git/fn.fetch_and_checkout.html b/compiler-docs/fe_common/utils/git/fn.fetch_and_checkout.html new file mode 100644 index 0000000000..ce992939e4 --- /dev/null +++ b/compiler-docs/fe_common/utils/git/fn.fetch_and_checkout.html @@ -0,0 +1,7 @@ +fetch_and_checkout in fe_common::utils::git - Rust

Function fetch_and_checkout

Source
pub fn fetch_and_checkout<P: AsRef<Path>>(
+    remote: &str,
+    target_directory: P,
+    refspec: &str,
+) -> Result<(), Box<dyn Error>>
Expand description

Fetch and checkout the specified refspec from the remote repository without +fetching any additional history.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/git/index.html b/compiler-docs/fe_common/utils/git/index.html new file mode 100644 index 0000000000..8d00af3236 --- /dev/null +++ b/compiler-docs/fe_common/utils/git/index.html @@ -0,0 +1,2 @@ +fe_common::utils::git - Rust

Module git

Source

Functions§

fetch_and_checkout
Fetch and checkout the specified refspec from the remote repository without +fetching any additional history.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/git/sidebar-items.js b/compiler-docs/fe_common/utils/git/sidebar-items.js new file mode 100644 index 0000000000..8528f078b2 --- /dev/null +++ b/compiler-docs/fe_common/utils/git/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["fetch_and_checkout"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/humanize/fn.pluralize_conditionally.html b/compiler-docs/fe_common/utils/humanize/fn.pluralize_conditionally.html new file mode 100644 index 0000000000..dc346697ce --- /dev/null +++ b/compiler-docs/fe_common/utils/humanize/fn.pluralize_conditionally.html @@ -0,0 +1,4 @@ +pluralize_conditionally in fe_common::utils::humanize - Rust

Function pluralize_conditionally

Source
pub fn pluralize_conditionally(
+    pluralizable: impl Pluralizable,
+    count: usize,
+) -> String
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/humanize/index.html b/compiler-docs/fe_common/utils/humanize/index.html new file mode 100644 index 0000000000..e714338f1f --- /dev/null +++ b/compiler-docs/fe_common/utils/humanize/index.html @@ -0,0 +1 @@ +fe_common::utils::humanize - Rust

Module humanize

Source

Traits§

Pluralizable
A trait to derive plural or singular representations from

Functions§

pluralize_conditionally
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/humanize/sidebar-items.js b/compiler-docs/fe_common/utils/humanize/sidebar-items.js new file mode 100644 index 0000000000..226b3cfd33 --- /dev/null +++ b/compiler-docs/fe_common/utils/humanize/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["pluralize_conditionally"],"trait":["Pluralizable"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/humanize/trait.Pluralizable.html b/compiler-docs/fe_common/utils/humanize/trait.Pluralizable.html new file mode 100644 index 0000000000..62b5047cdc --- /dev/null +++ b/compiler-docs/fe_common/utils/humanize/trait.Pluralizable.html @@ -0,0 +1,6 @@ +Pluralizable in fe_common::utils::humanize - Rust

Trait Pluralizable

Source
pub trait Pluralizable {
+    // Required methods
+    fn to_plural(&self) -> String;
+    fn to_singular(&self) -> String;
+}
Expand description

A trait to derive plural or singular representations from

+

Required Methods§

Implementations on Foreign Types§

Source§

impl Pluralizable for &str

Source§

impl Pluralizable for (&str, &str)

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/index.html b/compiler-docs/fe_common/utils/index.html new file mode 100644 index 0000000000..e29f9937cf --- /dev/null +++ b/compiler-docs/fe_common/utils/index.html @@ -0,0 +1 @@ +fe_common::utils - Rust

Module utils

Source

Modules§

dirs
files
git
humanize
keccak
ron
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/fn.full.html b/compiler-docs/fe_common/utils/keccak/fn.full.html new file mode 100644 index 0000000000..eae7751a1f --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/fn.full.html @@ -0,0 +1,2 @@ +full in fe_common::utils::keccak - Rust

Function full

Source
pub fn full(content: &[u8]) -> String
Expand description

Get the full 32 byte hash of the content.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/fn.full_as_bytes.html b/compiler-docs/fe_common/utils/keccak/fn.full_as_bytes.html new file mode 100644 index 0000000000..4875dd9f6d --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/fn.full_as_bytes.html @@ -0,0 +1,2 @@ +full_as_bytes in fe_common::utils::keccak - Rust

Function full_as_bytes

Source
pub fn full_as_bytes(content: &[u8]) -> [u8; 32]
Expand description

Get the full 32 byte hash of the content as a byte array.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/fn.partial.html b/compiler-docs/fe_common/utils/keccak/fn.partial.html new file mode 100644 index 0000000000..c8f99c577d --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/fn.partial.html @@ -0,0 +1,2 @@ +partial in fe_common::utils::keccak - Rust

Function partial

Source
pub fn partial(content: &[u8], size: usize) -> String
Expand description

Take the first size number of bytes of the hash with no padding.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/fn.partial_right_padded.html b/compiler-docs/fe_common/utils/keccak/fn.partial_right_padded.html new file mode 100644 index 0000000000..78ad17e1b4 --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/fn.partial_right_padded.html @@ -0,0 +1,3 @@ +partial_right_padded in fe_common::utils::keccak - Rust

Function partial_right_padded

Source
pub fn partial_right_padded(content: &[u8], size: usize) -> String
Expand description

Take the first size number of bytes of the hash and pad the right side +with zeros to 32 bytes.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/index.html b/compiler-docs/fe_common/utils/keccak/index.html new file mode 100644 index 0000000000..5f7bcd3adf --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/index.html @@ -0,0 +1,2 @@ +fe_common::utils::keccak - Rust

Module keccak

Source

Functions§

full
Get the full 32 byte hash of the content.
full_as_bytes
Get the full 32 byte hash of the content as a byte array.
partial
Take the first size number of bytes of the hash with no padding.
partial_right_padded
Take the first size number of bytes of the hash and pad the right side +with zeros to 32 bytes.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/keccak/sidebar-items.js b/compiler-docs/fe_common/utils/keccak/sidebar-items.js new file mode 100644 index 0000000000..13bdbf8279 --- /dev/null +++ b/compiler-docs/fe_common/utils/keccak/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["full","full_as_bytes","partial","partial_right_padded"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/ron/fn.to_ron_string_pretty.html b/compiler-docs/fe_common/utils/ron/fn.to_ron_string_pretty.html new file mode 100644 index 0000000000..d21af9c847 --- /dev/null +++ b/compiler-docs/fe_common/utils/ron/fn.to_ron_string_pretty.html @@ -0,0 +1,4 @@ +to_ron_string_pretty in fe_common::utils::ron - Rust

Function to_ron_string_pretty

Source
pub fn to_ron_string_pretty<T>(value: &T) -> Result<String>
where + T: Serialize,
Expand description

Convenience function to serialize objects in RON format with custom pretty +printing config and struct names.

+
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/ron/index.html b/compiler-docs/fe_common/utils/ron/index.html new file mode 100644 index 0000000000..e88903f7ce --- /dev/null +++ b/compiler-docs/fe_common/utils/ron/index.html @@ -0,0 +1,2 @@ +fe_common::utils::ron - Rust

Module ron

Source

Structs§

Diff
Wrapper struct for formatting changesets from the difference package.

Functions§

to_ron_string_pretty
Convenience function to serialize objects in RON format with custom pretty +printing config and struct names.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/ron/sidebar-items.js b/compiler-docs/fe_common/utils/ron/sidebar-items.js new file mode 100644 index 0000000000..dc250fef05 --- /dev/null +++ b/compiler-docs/fe_common/utils/ron/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["to_ron_string_pretty"],"struct":["Diff"]}; \ No newline at end of file diff --git a/compiler-docs/fe_common/utils/ron/struct.Diff.html b/compiler-docs/fe_common/utils/ron/struct.Diff.html new file mode 100644 index 0000000000..91680fb65c --- /dev/null +++ b/compiler-docs/fe_common/utils/ron/struct.Diff.html @@ -0,0 +1,13 @@ +Diff in fe_common::utils::ron - Rust

Struct Diff

Source
pub struct Diff(/* private fields */);
Expand description

Wrapper struct for formatting changesets from the difference package.

+

Implementations§

Source§

impl Diff

Source

pub fn new(left: &str, right: &str) -> Self

Trait Implementations§

Source§

impl Display for Diff

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl Freeze for Diff

§

impl RefUnwindSafe for Diff

§

impl Send for Diff

§

impl Sync for Diff

§

impl Unpin for Diff

§

impl UnwindSafe for Diff

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_common/utils/sidebar-items.js b/compiler-docs/fe_common/utils/sidebar-items.js new file mode 100644 index 0000000000..857e59addd --- /dev/null +++ b/compiler-docs/fe_common/utils/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["dirs","files","git","humanize","keccak","ron"]}; \ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/all.html b/compiler-docs/fe_compiler_test_utils/all.html new file mode 100644 index 0000000000..5ab06ebe07 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/constant.DEFAULT_CALLER.html b/compiler-docs/fe_compiler_test_utils/constant.DEFAULT_CALLER.html new file mode 100644 index 0000000000..5d87febe45 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/constant.DEFAULT_CALLER.html @@ -0,0 +1 @@ +DEFAULT_CALLER in fe_compiler_test_utils - Rust

Constant DEFAULT_CALLER

Source
pub const DEFAULT_CALLER: &str = "1000000000000000000000000000000000000001";
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.address.html b/compiler-docs/fe_compiler_test_utils/fn.address.html new file mode 100644 index 0000000000..d37d1ae5cd --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.address.html @@ -0,0 +1 @@ +address in fe_compiler_test_utils - Rust

Function address

Source
pub fn address(s: &str) -> H160
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.address_array_token.html b/compiler-docs/fe_compiler_test_utils/fn.address_array_token.html new file mode 100644 index 0000000000..b164cd0f51 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.address_array_token.html @@ -0,0 +1 @@ +address_array_token in fe_compiler_test_utils - Rust

Function address_array_token

Source
pub fn address_array_token(v: &[&str]) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.address_token.html b/compiler-docs/fe_compiler_test_utils/fn.address_token.html new file mode 100644 index 0000000000..08d52c02b6 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.address_token.html @@ -0,0 +1 @@ +address_token in fe_compiler_test_utils - Rust

Function address_token

Source
pub fn address_token(s: &str) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.bool_token.html b/compiler-docs/fe_compiler_test_utils/fn.bool_token.html new file mode 100644 index 0000000000..3f548b1659 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.bool_token.html @@ -0,0 +1 @@ +bool_token in fe_compiler_test_utils - Rust

Function bool_token

Source
pub fn bool_token(val: bool) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.bytes_token.html b/compiler-docs/fe_compiler_test_utils/fn.bytes_token.html new file mode 100644 index 0000000000..5c9b7aaa05 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.bytes_token.html @@ -0,0 +1 @@ +bytes_token in fe_compiler_test_utils - Rust

Function bytes_token

Source
pub fn bytes_token(s: &str) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encode_error_reason.html b/compiler-docs/fe_compiler_test_utils/fn.encode_error_reason.html new file mode 100644 index 0000000000..b09ca4ab4b --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encode_error_reason.html @@ -0,0 +1 @@ +encode_error_reason in fe_compiler_test_utils - Rust

Function encode_error_reason

Source
pub fn encode_error_reason(reason: &str) -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encode_revert.html b/compiler-docs/fe_compiler_test_utils/fn.encode_revert.html new file mode 100644 index 0000000000..c08fcff184 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encode_revert.html @@ -0,0 +1 @@ +encode_revert in fe_compiler_test_utils - Rust

Function encode_revert

Source
pub fn encode_revert(selector: &str, input: &[Token]) -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_div_or_mod_by_zero.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_div_or_mod_by_zero.html new file mode 100644 index 0000000000..330cc65a80 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_div_or_mod_by_zero.html @@ -0,0 +1 @@ +encoded_div_or_mod_by_zero in fe_compiler_test_utils - Rust

Function encoded_div_or_mod_by_zero

Source
pub fn encoded_div_or_mod_by_zero() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_invalid_abi_data.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_invalid_abi_data.html new file mode 100644 index 0000000000..b68cde4706 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_invalid_abi_data.html @@ -0,0 +1 @@ +encoded_invalid_abi_data in fe_compiler_test_utils - Rust

Function encoded_invalid_abi_data

Source
pub fn encoded_invalid_abi_data() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_over_or_underflow.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_over_or_underflow.html new file mode 100644 index 0000000000..6ee4d1f621 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_over_or_underflow.html @@ -0,0 +1 @@ +encoded_over_or_underflow in fe_compiler_test_utils - Rust

Function encoded_over_or_underflow

Source
pub fn encoded_over_or_underflow() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_assert.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_assert.html new file mode 100644 index 0000000000..d7889832a7 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_assert.html @@ -0,0 +1 @@ +encoded_panic_assert in fe_compiler_test_utils - Rust

Function encoded_panic_assert

Source
pub fn encoded_panic_assert() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_out_of_bounds.html b/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_out_of_bounds.html new file mode 100644 index 0000000000..1f39c449b8 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.encoded_panic_out_of_bounds.html @@ -0,0 +1 @@ +encoded_panic_out_of_bounds in fe_compiler_test_utils - Rust

Function encoded_panic_out_of_bounds

Source
pub fn encoded_panic_out_of_bounds() -> Vec<u8> 
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.get_2s_complement_for_negative.html b/compiler-docs/fe_compiler_test_utils/fn.get_2s_complement_for_negative.html new file mode 100644 index 0000000000..db030cee6b --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.get_2s_complement_for_negative.html @@ -0,0 +1,3 @@ +get_2s_complement_for_negative in fe_compiler_test_utils - Rust

Function get_2s_complement_for_negative

Source
pub fn get_2s_complement_for_negative(assume_negative: U256) -> U256
Expand description

To get the 2s complement value for e.g. -128 call +get_2s_complement_for_negative(128)

+
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.int_array_token.html b/compiler-docs/fe_compiler_test_utils/fn.int_array_token.html new file mode 100644 index 0000000000..c59daa8d78 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.int_array_token.html @@ -0,0 +1 @@ +int_array_token in fe_compiler_test_utils - Rust

Function int_array_token

Source
pub fn int_array_token(v: &[i64]) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.int_token.html b/compiler-docs/fe_compiler_test_utils/fn.int_token.html new file mode 100644 index 0000000000..7347357ed3 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.int_token.html @@ -0,0 +1 @@ +int_token in fe_compiler_test_utils - Rust

Function int_token

Source
pub fn int_token(val: i64) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.load_contract.html b/compiler-docs/fe_compiler_test_utils/fn.load_contract.html new file mode 100644 index 0000000000..5c9017eeb5 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.load_contract.html @@ -0,0 +1,5 @@ +load_contract in fe_compiler_test_utils - Rust

Function load_contract

Source
pub fn load_contract(
+    address: H160,
+    fixture: &str,
+    contract_name: &str,
+) -> ContractHarness
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.string_token.html b/compiler-docs/fe_compiler_test_utils/fn.string_token.html new file mode 100644 index 0000000000..5223361e2e --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.string_token.html @@ -0,0 +1 @@ +string_token in fe_compiler_test_utils - Rust

Function string_token

Source
pub fn string_token(s: &str) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.to_2s_complement.html b/compiler-docs/fe_compiler_test_utils/fn.to_2s_complement.html new file mode 100644 index 0000000000..5d64a3cddb --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.to_2s_complement.html @@ -0,0 +1 @@ +to_2s_complement in fe_compiler_test_utils - Rust

Function to_2s_complement

Source
pub fn to_2s_complement(val: i64) -> U256
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.tuple_token.html b/compiler-docs/fe_compiler_test_utils/fn.tuple_token.html new file mode 100644 index 0000000000..bd2aab6260 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.tuple_token.html @@ -0,0 +1 @@ +tuple_token in fe_compiler_test_utils - Rust

Function tuple_token

Source
pub fn tuple_token(tokens: &[Token]) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.uint_array_token.html b/compiler-docs/fe_compiler_test_utils/fn.uint_array_token.html new file mode 100644 index 0000000000..74d2777805 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.uint_array_token.html @@ -0,0 +1 @@ +uint_array_token in fe_compiler_test_utils - Rust

Function uint_array_token

Source
pub fn uint_array_token(v: &[u64]) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.uint_token.html b/compiler-docs/fe_compiler_test_utils/fn.uint_token.html new file mode 100644 index 0000000000..0710810dc3 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.uint_token.html @@ -0,0 +1 @@ +uint_token in fe_compiler_test_utils - Rust

Function uint_token

Source
pub fn uint_token(n: u64) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.uint_token_from_dec_str.html b/compiler-docs/fe_compiler_test_utils/fn.uint_token_from_dec_str.html new file mode 100644 index 0000000000..5770769964 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.uint_token_from_dec_str.html @@ -0,0 +1 @@ +uint_token_from_dec_str in fe_compiler_test_utils - Rust

Function uint_token_from_dec_str

Source
pub fn uint_token_from_dec_str(val: &str) -> Token
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.validate_return.html b/compiler-docs/fe_compiler_test_utils/fn.validate_return.html new file mode 100644 index 0000000000..e7033057ef --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.validate_return.html @@ -0,0 +1,4 @@ +validate_return in fe_compiler_test_utils - Rust

Function validate_return

Source
pub fn validate_return(
+    capture: Capture<(ExitReason, Vec<u8>), Infallible>,
+    expected_data: &[u8],
+)
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.validate_revert.html b/compiler-docs/fe_compiler_test_utils/fn.validate_revert.html new file mode 100644 index 0000000000..c6af880f0e --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.validate_revert.html @@ -0,0 +1,4 @@ +validate_revert in fe_compiler_test_utils - Rust

Function validate_revert

Source
pub fn validate_revert(
+    capture: Capture<(ExitReason, Vec<u8>), Infallible>,
+    expected_data: &[u8],
+)
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.with_executor.html b/compiler-docs/fe_compiler_test_utils/fn.with_executor.html new file mode 100644 index 0000000000..8f325c58d7 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.with_executor.html @@ -0,0 +1 @@ +with_executor in fe_compiler_test_utils - Rust

Function with_executor

Source
pub fn with_executor(test: &dyn Fn(Executor<'_, '_>))
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/fn.with_executor_backend.html b/compiler-docs/fe_compiler_test_utils/fn.with_executor_backend.html new file mode 100644 index 0000000000..c05ff70c57 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/fn.with_executor_backend.html @@ -0,0 +1,4 @@ +with_executor_backend in fe_compiler_test_utils - Rust

Function with_executor_backend

Source
pub fn with_executor_backend(
+    backend: Backend<'_>,
+    test: &dyn Fn(Executor<'_, '_>),
+)
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/index.html b/compiler-docs/fe_compiler_test_utils/index.html new file mode 100644 index 0000000000..c1df8d89b7 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/index.html @@ -0,0 +1,2 @@ +fe_compiler_test_utils - Rust

Crate fe_compiler_test_utils

Source

Macros§

assert_harness_gas_report

Structs§

ContractHarness
ExecutionOutput
GasRecord
GasReporter
NumericAbiTokenBounds
Runtime
SolidityCompileError

Constants§

DEFAULT_CALLER

Traits§

ToBeBytes

Functions§

address
address_array_token
address_token
bool_token
bytes_token
encode_error_reason
encode_revert
encoded_div_or_mod_by_zero
encoded_invalid_abi_data
encoded_over_or_underflow
encoded_panic_assert
encoded_panic_out_of_bounds
get_2s_complement_for_negative
To get the 2s complement value for e.g. -128 call +get_2s_complement_for_negative(128)
int_array_token
int_token
load_contract
string_token
to_2s_complement
tuple_token
uint_array_token
uint_token
uint_token_from_dec_str
validate_return
validate_revert
with_executor
with_executor_backend

Type Aliases§

Backend
Executor
StackState
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report!.html b/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report!.html new file mode 100644 index 0000000000..97bc8a73cd --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.assert_harness_gas_report.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report.html b/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report.html new file mode 100644 index 0000000000..bb3416948b --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/macro.assert_harness_gas_report.html @@ -0,0 +1,4 @@ +assert_harness_gas_report in fe_compiler_test_utils - Rust

Macro assert_harness_gas_report

Source
macro_rules! assert_harness_gas_report {
+    ($harness: expr) => { ... };
+    ($harness: expr, $($expr:expr),*) => { ... };
+}
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/sidebar-items.js b/compiler-docs/fe_compiler_test_utils/sidebar-items.js new file mode 100644 index 0000000000..5f4f697188 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["DEFAULT_CALLER"],"fn":["address","address_array_token","address_token","bool_token","bytes_token","encode_error_reason","encode_revert","encoded_div_or_mod_by_zero","encoded_invalid_abi_data","encoded_over_or_underflow","encoded_panic_assert","encoded_panic_out_of_bounds","get_2s_complement_for_negative","int_array_token","int_token","load_contract","string_token","to_2s_complement","tuple_token","uint_array_token","uint_token","uint_token_from_dec_str","validate_return","validate_revert","with_executor","with_executor_backend"],"macro":["assert_harness_gas_report"],"struct":["ContractHarness","ExecutionOutput","GasRecord","GasReporter","NumericAbiTokenBounds","Runtime","SolidityCompileError"],"trait":["ToBeBytes"],"type":["Backend","Executor","StackState"]}; \ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.ContractHarness.html b/compiler-docs/fe_compiler_test_utils/struct.ContractHarness.html new file mode 100644 index 0000000000..8fd4a022b8 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.ContractHarness.html @@ -0,0 +1,143 @@ +ContractHarness in fe_compiler_test_utils - Rust

Struct ContractHarness

Source
pub struct ContractHarness {
+    pub gas_reporter: GasReporter,
+    pub address: H160,
+    pub abi: Contract,
+    pub caller: H160,
+    pub value: U256,
+}

Fields§

§gas_reporter: GasReporter§address: H160§abi: Contract§caller: H160§value: U256

Implementations§

Source§

impl ContractHarness

Source

pub fn capture_call( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], +) -> Capture<(ExitReason, Vec<u8>), Infallible>

Source

pub fn build_calldata(&self, name: &str, input: &[Token]) -> Vec<u8>

Source

pub fn capture_call_raw_bytes( + &self, + executor: &mut Executor<'_, '_>, + input: Vec<u8>, +) -> Capture<(ExitReason, Vec<u8>), Infallible>

Source

pub fn test_function( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], + output: Option<&Token>, +)

Source

pub fn call_function( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], +) -> Option<Token>

Source

pub fn test_function_reverts( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], + revert_data: &[u8], +)

Source

pub fn test_call_reverts( + &self, + executor: &mut Executor<'_, '_>, + input: Vec<u8>, + revert_data: &[u8], +)

Source

pub fn test_function_returns( + &self, + executor: &mut Executor<'_, '_>, + name: &str, + input: &[Token], + return_data: &[u8], +)

Source

pub fn test_call_returns( + &self, + executor: &mut Executor<'_, '_>, + input: Vec<u8>, + return_data: &[u8], +)

Source

pub fn events_emitted( + &self, + executor: Executor<'_, '_>, + events: &[(&str, &[Token])], +)

Source

pub fn set_caller(&mut self, caller: H160)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.ExecutionOutput.html b/compiler-docs/fe_compiler_test_utils/struct.ExecutionOutput.html new file mode 100644 index 0000000000..b998e92e46 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.ExecutionOutput.html @@ -0,0 +1,95 @@ +ExecutionOutput in fe_compiler_test_utils - Rust

Struct ExecutionOutput

Source
pub struct ExecutionOutput { /* private fields */ }

Implementations§

Source§

impl ExecutionOutput

Source

pub fn new(exit_reason: ExitReason, data: Vec<u8>) -> ExecutionOutput

Create an ExecutionOutput instance

+
Source

pub fn expect_success(self) -> ExecutionOutput

Panic if the execution did not succeed.

+
Source

pub fn expect_revert(self) -> ExecutionOutput

Panic if the execution did not revert.

+
Source

pub fn expect_revert_reason(self, reason: &str) -> ExecutionOutput

Panic if the output is not an encoded error reason of the given string.

+

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.GasRecord.html b/compiler-docs/fe_compiler_test_utils/struct.GasRecord.html new file mode 100644 index 0000000000..1aaebd0efb --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.GasRecord.html @@ -0,0 +1,94 @@ +GasRecord in fe_compiler_test_utils - Rust

Struct GasRecord

Source
pub struct GasRecord {
+    pub description: String,
+    pub gas_used: u64,
+}

Fields§

§description: String§gas_used: u64

Trait Implementations§

Source§

impl Debug for GasRecord

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.GasReporter.html b/compiler-docs/fe_compiler_test_utils/struct.GasReporter.html new file mode 100644 index 0000000000..6223d4a672 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.GasReporter.html @@ -0,0 +1,97 @@ +GasReporter in fe_compiler_test_utils - Rust

Struct GasReporter

Source
pub struct GasReporter { /* private fields */ }

Implementations§

Source§

impl GasReporter

Source

pub fn add_record(&self, description: &str, gas_used: u64)

Source

pub fn add_func_call_record( + &self, + function: &str, + input: &[Token], + gas_used: u64, +)

Trait Implementations§

Source§

impl Debug for GasReporter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for GasReporter

Source§

fn default() -> GasReporter

Returns the “default value” for a type. Read more
Source§

impl Display for GasReporter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.NumericAbiTokenBounds.html b/compiler-docs/fe_compiler_test_utils/struct.NumericAbiTokenBounds.html new file mode 100644 index 0000000000..2d97a55d89 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.NumericAbiTokenBounds.html @@ -0,0 +1,97 @@ +NumericAbiTokenBounds in fe_compiler_test_utils - Rust

Struct NumericAbiTokenBounds

Source
pub struct NumericAbiTokenBounds {
+    pub size: u64,
+    pub u_min: Token,
+    pub i_min: Token,
+    pub u_max: Token,
+    pub i_max: Token,
+}

Fields§

§size: u64§u_min: Token§i_min: Token§u_max: Token§i_max: Token

Implementations§

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.Runtime.html b/compiler-docs/fe_compiler_test_utils/struct.Runtime.html new file mode 100644 index 0000000000..4506f479a7 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.Runtime.html @@ -0,0 +1,95 @@ +Runtime in fe_compiler_test_utils - Rust

Struct Runtime

Source
pub struct Runtime { /* private fields */ }

Implementations§

Source§

impl Runtime

Source

pub fn new() -> Runtime

Create a new Runtime instance.

+
Source

pub fn with_functions(self, fns: Vec<Statement>) -> Runtime

Add the given set of functions

+
Source

pub fn with_test_statements(self, statements: Vec<Statement>) -> Runtime

Add the given set of test statements

+
Source

pub fn with_data(self, data: Vec<Data>) -> Runtime

Source

pub fn to_yul(&self) -> Object

Generate the top level YUL object

+

Trait Implementations§

Source§

impl Default for Runtime

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/struct.SolidityCompileError.html b/compiler-docs/fe_compiler_test_utils/struct.SolidityCompileError.html new file mode 100644 index 0000000000..82bec50605 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/struct.SolidityCompileError.html @@ -0,0 +1,92 @@ +SolidityCompileError in fe_compiler_test_utils - Rust

Struct SolidityCompileError

Source
pub struct SolidityCompileError(/* private fields */);

Trait Implementations§

Source§

impl Debug for SolidityCompileError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for SolidityCompileError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for SolidityCompileError

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> MaybeDebug for T

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/trait.ToBeBytes.html b/compiler-docs/fe_compiler_test_utils/trait.ToBeBytes.html new file mode 100644 index 0000000000..6809b229e9 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/trait.ToBeBytes.html @@ -0,0 +1,4 @@ +ToBeBytes in fe_compiler_test_utils - Rust

Trait ToBeBytes

Source
pub trait ToBeBytes {
+    // Required method
+    fn to_be_bytes(&self) -> [u8; 32];
+}

Required Methods§

Source

fn to_be_bytes(&self) -> [u8; 32]

Implementations on Foreign Types§

Source§

impl ToBeBytes for U256

Source§

fn to_be_bytes(&self) -> [u8; 32]

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/type.Backend.html b/compiler-docs/fe_compiler_test_utils/type.Backend.html new file mode 100644 index 0000000000..6340948d78 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/type.Backend.html @@ -0,0 +1 @@ +Backend in fe_compiler_test_utils - Rust

Type Alias Backend

Source
pub type Backend<'a> = MemoryBackend<'a>;

Aliased Type§

pub struct Backend<'a> { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/type.Executor.html b/compiler-docs/fe_compiler_test_utils/type.Executor.html new file mode 100644 index 0000000000..26753627d5 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/type.Executor.html @@ -0,0 +1 @@ +Executor in fe_compiler_test_utils - Rust

Type Alias Executor

Source
pub type Executor<'a, 'b> = StackExecutor<'a, 'b, StackState<'a>, ()>;

Aliased Type§

pub struct Executor<'a, 'b> { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_test_utils/type.StackState.html b/compiler-docs/fe_compiler_test_utils/type.StackState.html new file mode 100644 index 0000000000..1a6adc0de3 --- /dev/null +++ b/compiler-docs/fe_compiler_test_utils/type.StackState.html @@ -0,0 +1 @@ +StackState in fe_compiler_test_utils - Rust

Type Alias StackState

Source
pub type StackState<'a> = MemoryStackState<'a, 'a, Backend<'a>>;

Aliased Type§

pub struct StackState<'a> { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests/all.html b/compiler-docs/fe_compiler_tests/all.html new file mode 100644 index 0000000000..16f71b01c1 --- /dev/null +++ b/compiler-docs/fe_compiler_tests/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests/index.html b/compiler-docs/fe_compiler_tests/index.html new file mode 100644 index 0000000000..4ba358bfb4 --- /dev/null +++ b/compiler-docs/fe_compiler_tests/index.html @@ -0,0 +1 @@ +fe_compiler_tests - Rust

Crate fe_compiler_tests

Source
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests/sidebar-items.js b/compiler-docs/fe_compiler_tests/sidebar-items.js new file mode 100644 index 0000000000..5244ce01cc --- /dev/null +++ b/compiler-docs/fe_compiler_tests/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {}; \ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests_legacy/all.html b/compiler-docs/fe_compiler_tests_legacy/all.html new file mode 100644 index 0000000000..7ecc0ba639 --- /dev/null +++ b/compiler-docs/fe_compiler_tests_legacy/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests_legacy/index.html b/compiler-docs/fe_compiler_tests_legacy/index.html new file mode 100644 index 0000000000..1e573826d2 --- /dev/null +++ b/compiler-docs/fe_compiler_tests_legacy/index.html @@ -0,0 +1 @@ +fe_compiler_tests_legacy - Rust

Crate fe_compiler_tests_legacy

Source
\ No newline at end of file diff --git a/compiler-docs/fe_compiler_tests_legacy/sidebar-items.js b/compiler-docs/fe_compiler_tests_legacy/sidebar-items.js new file mode 100644 index 0000000000..5244ce01cc --- /dev/null +++ b/compiler-docs/fe_compiler_tests_legacy/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {}; \ No newline at end of file diff --git a/compiler-docs/fe_driver/all.html b/compiler-docs/fe_driver/all.html new file mode 100644 index 0000000000..dfd00c6f60 --- /dev/null +++ b/compiler-docs/fe_driver/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.check_ingot.html b/compiler-docs/fe_driver/fn.check_ingot.html new file mode 100644 index 0000000000..9687a30bee --- /dev/null +++ b/compiler-docs/fe_driver/fn.check_ingot.html @@ -0,0 +1 @@ +check_ingot in fe_driver - Rust

Function check_ingot

Source
pub fn check_ingot(db: &mut Db, build_files: &BuildFiles) -> Vec<Diagnostic>
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.check_single_file.html b/compiler-docs/fe_driver/fn.check_single_file.html new file mode 100644 index 0000000000..378ac4d7fe --- /dev/null +++ b/compiler-docs/fe_driver/fn.check_single_file.html @@ -0,0 +1 @@ +check_single_file in fe_driver - Rust

Function check_single_file

Source
pub fn check_single_file(db: &mut Db, path: &str, src: &str) -> Vec<Diagnostic>
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.compile_ingot.html b/compiler-docs/fe_driver/fn.compile_ingot.html new file mode 100644 index 0000000000..d3e7ddfc29 --- /dev/null +++ b/compiler-docs/fe_driver/fn.compile_ingot.html @@ -0,0 +1,10 @@ +compile_ingot in fe_driver - Rust

Function compile_ingot

Source
pub fn compile_ingot(
+    db: &mut Db,
+    build_files: &BuildFiles,
+    with_bytecode: bool,
+    with_runtime_bytecode: bool,
+    optimize: bool,
+) -> Result<CompiledModule, CompileError>
Expand description

Compiles the main module of a project.

+

If with_bytecode is set to false, the compiler will skip the final Yul -> +Bytecode pass. This is useful when debugging invalid Yul code.

+
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.compile_single_file.html b/compiler-docs/fe_driver/fn.compile_single_file.html new file mode 100644 index 0000000000..7437677f56 --- /dev/null +++ b/compiler-docs/fe_driver/fn.compile_single_file.html @@ -0,0 +1,8 @@ +compile_single_file in fe_driver - Rust

Function compile_single_file

Source
pub fn compile_single_file(
+    db: &mut Db,
+    path: &str,
+    src: &str,
+    with_bytecode: bool,
+    with_runtime_bytecode: bool,
+    optimize: bool,
+) -> Result<CompiledModule, CompileError>
\ No newline at end of file diff --git a/compiler-docs/fe_driver/fn.dump_mir_single_file.html b/compiler-docs/fe_driver/fn.dump_mir_single_file.html new file mode 100644 index 0000000000..31c8f5e8a1 --- /dev/null +++ b/compiler-docs/fe_driver/fn.dump_mir_single_file.html @@ -0,0 +1,6 @@ +dump_mir_single_file in fe_driver - Rust

Function dump_mir_single_file

Source
pub fn dump_mir_single_file(
+    db: &mut Db,
+    path: &str,
+    src: &str,
+) -> Result<String, CompileError>
Expand description

Returns graphviz string.

+
\ No newline at end of file diff --git a/compiler-docs/fe_driver/index.html b/compiler-docs/fe_driver/index.html new file mode 100644 index 0000000000..c413065619 --- /dev/null +++ b/compiler-docs/fe_driver/index.html @@ -0,0 +1 @@ +fe_driver - Rust

Crate fe_driver

Source

Structs§

CompileError
CompiledContract
The artifacts of a compiled contract.
CompiledModule
The artifacts of a compiled module.
Db

Traits§

CodegenDb

Functions§

check_ingot
check_single_file
compile_ingot
Compiles the main module of a project.
compile_single_file
dump_mir_single_file
Returns graphviz string.
\ No newline at end of file diff --git a/compiler-docs/fe_driver/sidebar-items.js b/compiler-docs/fe_driver/sidebar-items.js new file mode 100644 index 0000000000..742ac793e3 --- /dev/null +++ b/compiler-docs/fe_driver/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["check_ingot","check_single_file","compile_ingot","compile_single_file","dump_mir_single_file"],"struct":["CompileError","CompiledContract","CompiledModule","Db"],"trait":["CodegenDb"]}; \ No newline at end of file diff --git a/compiler-docs/fe_driver/struct.CompileError.html b/compiler-docs/fe_driver/struct.CompileError.html new file mode 100644 index 0000000000..ecd3d9103e --- /dev/null +++ b/compiler-docs/fe_driver/struct.CompileError.html @@ -0,0 +1,91 @@ +CompileError in fe_driver - Rust

Struct CompileError

Source
pub struct CompileError(pub Vec<Diagnostic>);

Tuple Fields§

§0: Vec<Diagnostic>

Trait Implementations§

Source§

impl Debug for CompileError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_driver/struct.CompiledContract.html b/compiler-docs/fe_driver/struct.CompiledContract.html new file mode 100644 index 0000000000..30d2cfc3cf --- /dev/null +++ b/compiler-docs/fe_driver/struct.CompiledContract.html @@ -0,0 +1,96 @@ +CompiledContract in fe_driver - Rust

Struct CompiledContract

Source
pub struct CompiledContract {
+    pub json_abi: String,
+    pub yul: String,
+    pub origin: ContractId,
+}
Expand description

The artifacts of a compiled contract.

+

Fields§

§json_abi: String§yul: String§origin: ContractId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_driver/struct.CompiledModule.html b/compiler-docs/fe_driver/struct.CompiledModule.html new file mode 100644 index 0000000000..db442bc9c2 --- /dev/null +++ b/compiler-docs/fe_driver/struct.CompiledModule.html @@ -0,0 +1,96 @@ +CompiledModule in fe_driver - Rust

Struct CompiledModule

Source
pub struct CompiledModule {
+    pub src_ast: String,
+    pub lowered_ast: String,
+    pub contracts: IndexMap<String, CompiledContract>,
+}
Expand description

The artifacts of a compiled module.

+

Fields§

§src_ast: String§lowered_ast: String§contracts: IndexMap<String, CompiledContract>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_driver/struct.Db.html b/compiler-docs/fe_driver/struct.Db.html new file mode 100644 index 0000000000..a89b27e003 --- /dev/null +++ b/compiler-docs/fe_driver/struct.Db.html @@ -0,0 +1,210 @@ +Db in fe_driver - Rust

Struct Db

pub struct Db { /* private fields */ }

Trait Implementations§

§

impl Database for Db

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
§

impl Default for Db

§

fn default() -> Db

Returns the “default value” for a type. Read more
§

impl Upcast<dyn AnalyzerDb> for Db

§

fn upcast(&self) -> &(dyn AnalyzerDb + 'static)

§

impl Upcast<dyn MirDb> for Db

§

fn upcast(&self) -> &(dyn MirDb + 'static)

§

impl Upcast<dyn SourceDb> for Db

§

fn upcast(&self) -> &(dyn SourceDb + 'static)

§

impl UpcastMut<dyn AnalyzerDb> for Db

§

fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static)

§

impl UpcastMut<dyn MirDb> for Db

§

fn upcast_mut(&mut self) -> &mut (dyn MirDb + 'static)

§

impl UpcastMut<dyn SourceDb> for Db

§

fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static)

Auto Trait Implementations§

§

impl !Freeze for Db

§

impl RefUnwindSafe for Db

§

impl !Send for Db

§

impl !Sync for Db

§

impl Unpin for Db

§

impl UnwindSafe for Db

Blanket Implementations§

§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

§

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

§

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

§

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

§

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

§

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

§

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

§

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

§

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

§

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

§

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

§

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

§

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

§

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

§

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

§

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

§

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

§

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

§

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

§

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

§

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

§

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

§

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

§

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

§

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

§

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

§

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

§

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

§

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

§

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

§

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

§

fn intern_type(&self, key0: Type) -> TypeId

§

fn lookup_intern_type(&self, key0: TypeId) -> Type

§

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

§

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input. Read more
§

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again. Read more
§

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

§

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input. Read more
§

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again. Read more
§

fn root_ingot(&self) -> IngotId

§

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input. Read more
§

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again. Read more
§

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

§

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

§

fn module_file_path(&self, key0: ModuleId) -> SmolStr

§

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

§

fn module_is_incomplete(&self, key0: ModuleId) -> bool

§

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

§

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

§

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

§

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

§

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

§

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

§

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

§

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

§

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

§

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

§

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

§

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

§

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

§

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

§

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

§

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

§

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

§

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

§

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

§

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

§

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

§

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

§

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

§

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

§

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

§

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

§

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

§

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

§

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

§

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

§

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

§

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

§

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

§

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

§

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

§

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<DB> CodegenDb for DB
where + DB: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> + Database + HasQueryGroup<CodegenDbStorage>,

§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> MirDb for DB
where + DB: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> + Database + HasQueryGroup<MirDbStorage>,

§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

Source§

fn intern_file(&self, key0: File) -> SourceFileId

Source§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

Source§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
Source§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
Source§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
Source§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

Source§

fn file_name(&self, key0: SourceFileId) -> SmolStr

§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_driver/trait.CodegenDb.html b/compiler-docs/fe_driver/trait.CodegenDb.html new file mode 100644 index 0000000000..cd53280ad6 --- /dev/null +++ b/compiler-docs/fe_driver/trait.CodegenDb.html @@ -0,0 +1,37 @@ +CodegenDb in fe_driver - Rust

Trait CodegenDb

pub trait CodegenDb:
+    Database
+    + HasQueryGroup<CodegenDbStorage>
+    + MirDb
+    + Upcast<dyn MirDb>
+    + UpcastMut<dyn MirDb> {
+
Show 16 methods // Required methods + fn codegen_legalized_signature( + &self, + key0: FunctionId, + ) -> Rc<FunctionSignature>; + fn codegen_legalized_body(&self, key0: FunctionId) -> Rc<FunctionBody>; + fn codegen_function_symbol_name(&self, key0: FunctionId) -> Rc<String>; + fn codegen_legalized_type(&self, key0: TypeId) -> TypeId; + fn codegen_abi_type(&self, key0: TypeId) -> AbiType; + fn codegen_abi_function(&self, key0: FunctionId) -> AbiFunction; + fn codegen_abi_event(&self, key0: TypeId) -> AbiEvent; + fn codegen_abi_contract(&self, key0: ContractId) -> AbiContract; + fn codegen_abi_module_events(&self, key0: ModuleId) -> Vec<AbiEvent>; + fn codegen_abi_type_maximum_size(&self, key0: TypeId) -> usize; + fn codegen_abi_type_minimum_size(&self, key0: TypeId) -> usize; + fn codegen_abi_function_argument_maximum_size( + &self, + key0: FunctionId, + ) -> usize; + fn codegen_abi_function_return_maximum_size( + &self, + key0: FunctionId, + ) -> usize; + fn codegen_contract_symbol_name(&self, key0: ContractId) -> Rc<String>; + fn codegen_contract_deployer_symbol_name( + &self, + key0: ContractId, + ) -> Rc<String>; + fn codegen_constant_string_symbol_name(&self, key0: String) -> Rc<String>; +
}

Required Methods§

Implementors§

§

impl<DB> CodegenDb for DB
where + DB: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> + Database + HasQueryGroup<CodegenDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_library/all.html b/compiler-docs/fe_library/all.html new file mode 100644 index 0000000000..456cf3aa87 --- /dev/null +++ b/compiler-docs/fe_library/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Functions

Constants

\ No newline at end of file diff --git a/compiler-docs/fe_library/constant.STD.html b/compiler-docs/fe_library/constant.STD.html new file mode 100644 index 0000000000..bda11b4880 --- /dev/null +++ b/compiler-docs/fe_library/constant.STD.html @@ -0,0 +1 @@ +STD in fe_library - Rust

Constant STD

Source
pub const STD: Dir<'_>;
\ No newline at end of file diff --git a/compiler-docs/fe_library/fn.static_dir_files.html b/compiler-docs/fe_library/fn.static_dir_files.html new file mode 100644 index 0000000000..d14ac89816 --- /dev/null +++ b/compiler-docs/fe_library/fn.static_dir_files.html @@ -0,0 +1,3 @@ +static_dir_files in fe_library - Rust

Function static_dir_files

Source
pub fn static_dir_files(
+    dir: &'static Dir<'_>,
+) -> Vec<(&'static str, &'static str)>
\ No newline at end of file diff --git a/compiler-docs/fe_library/fn.std_src_files.html b/compiler-docs/fe_library/fn.std_src_files.html new file mode 100644 index 0000000000..e92c15d9ea --- /dev/null +++ b/compiler-docs/fe_library/fn.std_src_files.html @@ -0,0 +1 @@ +std_src_files in fe_library - Rust

Function std_src_files

Source
pub fn std_src_files() -> Vec<(&'static str, &'static str)>
\ No newline at end of file diff --git a/compiler-docs/fe_library/index.html b/compiler-docs/fe_library/index.html new file mode 100644 index 0000000000..b165d60e6a --- /dev/null +++ b/compiler-docs/fe_library/index.html @@ -0,0 +1 @@ +fe_library - Rust

Crate fe_library

Source

Re-exports§

pub use ::include_dir;

Constants§

STD

Functions§

static_dir_files
std_src_files
\ No newline at end of file diff --git a/compiler-docs/fe_library/sidebar-items.js b/compiler-docs/fe_library/sidebar-items.js new file mode 100644 index 0000000000..93c2f1794f --- /dev/null +++ b/compiler-docs/fe_library/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["STD"],"fn":["static_dir_files","std_src_files"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/all.html b/compiler-docs/fe_mir/all.html new file mode 100644 index 0000000000..9c8df6ec82 --- /dev/null +++ b/compiler-docs/fe_mir/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Enums

Traits

Functions

Type Aliases

\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/cfg/index.html b/compiler-docs/fe_mir/analysis/cfg/index.html new file mode 100644 index 0000000000..c0c908c146 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/cfg/index.html @@ -0,0 +1 @@ +fe_mir::analysis::cfg - Rust

Module cfg

Source

Structs§

CfgPostOrder
ControlFlowGraph
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/cfg/sidebar-items.js b/compiler-docs/fe_mir/analysis/cfg/sidebar-items.js new file mode 100644 index 0000000000..3b53904b73 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/cfg/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["CfgPostOrder","ControlFlowGraph"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/cfg/struct.CfgPostOrder.html b/compiler-docs/fe_mir/analysis/cfg/struct.CfgPostOrder.html new file mode 100644 index 0000000000..c36ddc1305 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/cfg/struct.CfgPostOrder.html @@ -0,0 +1,209 @@ +CfgPostOrder in fe_mir::analysis::cfg - Rust

Struct CfgPostOrder

Source
pub struct CfgPostOrder<'a> { /* private fields */ }

Trait Implementations§

Source§

impl<'a> Iterator for CfgPostOrder<'a>

Source§

type Item = Id<BasicBlock>

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<BasicBlockId>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where + Self: Sized, + Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( + &mut self, +) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where + Self: Sized, + Self::Item: Try, + <Self::Item as Try>::Residual: Residual<B>, + B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if +a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for CfgPostOrder<'a>

§

impl<'a> RefUnwindSafe for CfgPostOrder<'a>

§

impl<'a> Send for CfgPostOrder<'a>

§

impl<'a> Sync for CfgPostOrder<'a>

§

impl<'a> Unpin for CfgPostOrder<'a>

§

impl<'a> UnwindSafe for CfgPostOrder<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/cfg/struct.ControlFlowGraph.html b/compiler-docs/fe_mir/analysis/cfg/struct.ControlFlowGraph.html new file mode 100644 index 0000000000..8db3152ae7 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/cfg/struct.ControlFlowGraph.html @@ -0,0 +1,20 @@ +ControlFlowGraph in fe_mir::analysis::cfg - Rust

Struct ControlFlowGraph

Source
pub struct ControlFlowGraph { /* private fields */ }

Implementations§

Source§

impl ControlFlowGraph

Source

pub fn compute(func: &FunctionBody) -> Self

Source

pub fn entry(&self) -> BasicBlockId

Source

pub fn preds(&self, block: BasicBlockId) -> &[BasicBlockId]

Source

pub fn succs(&self, block: BasicBlockId) -> &[BasicBlockId]

Source

pub fn post_order(&self) -> CfgPostOrder<'_>

Trait Implementations§

Source§

impl Clone for ControlFlowGraph

Source§

fn clone(&self) -> ControlFlowGraph

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ControlFlowGraph

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for ControlFlowGraph

Source§

fn eq(&self, other: &ControlFlowGraph) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ControlFlowGraph

Source§

impl StructuralPartialEq for ControlFlowGraph

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/domtree/index.html b/compiler-docs/fe_mir/analysis/domtree/index.html new file mode 100644 index 0000000000..3e7b24321d --- /dev/null +++ b/compiler-docs/fe_mir/analysis/domtree/index.html @@ -0,0 +1,4 @@ +fe_mir::analysis::domtree - Rust

Module domtree

Source
Expand description

This module contains dominator tree related structs.

+

The algorithm is based on Keith D. Cooper., Timothy J. Harvey., and Ken +Kennedy.: A Simple, Fast Dominance Algorithm: https://www.cs.rice.edu/~keith/EMBED/dom.pdf

+

Structs§

DFSet
Dominance frontiers of each blocks.
DomTree
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/domtree/sidebar-items.js b/compiler-docs/fe_mir/analysis/domtree/sidebar-items.js new file mode 100644 index 0000000000..e91f8a7dfa --- /dev/null +++ b/compiler-docs/fe_mir/analysis/domtree/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["DFSet","DomTree"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/domtree/struct.DFSet.html b/compiler-docs/fe_mir/analysis/domtree/struct.DFSet.html new file mode 100644 index 0000000000..6056cee1b2 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/domtree/struct.DFSet.html @@ -0,0 +1,17 @@ +DFSet in fe_mir::analysis::domtree - Rust

Struct DFSet

Source
pub struct DFSet(/* private fields */);
Expand description

Dominance frontiers of each blocks.

+

Implementations§

Source§

impl DFSet

Source

pub fn frontiers( + &self, + block: BasicBlockId, +) -> Option<impl Iterator<Item = BasicBlockId> + '_>

Returns all dominance frontieres of a block.

+
Source

pub fn frontier_num(&self, block: BasicBlockId) -> usize

Returns number of frontier blocks of a block.

+

Trait Implementations§

Source§

impl Debug for DFSet

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for DFSet

Source§

fn default() -> DFSet

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl Freeze for DFSet

§

impl RefUnwindSafe for DFSet

§

impl Send for DFSet

§

impl Sync for DFSet

§

impl Unpin for DFSet

§

impl UnwindSafe for DFSet

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/domtree/struct.DomTree.html b/compiler-docs/fe_mir/analysis/domtree/struct.DomTree.html new file mode 100644 index 0000000000..f2dc405d4f --- /dev/null +++ b/compiler-docs/fe_mir/analysis/domtree/struct.DomTree.html @@ -0,0 +1,25 @@ +DomTree in fe_mir::analysis::domtree - Rust

Struct DomTree

Source
pub struct DomTree { /* private fields */ }

Implementations§

Source§

impl DomTree

Source

pub fn compute(cfg: &ControlFlowGraph) -> Self

Source

pub fn idom(&self, block: BasicBlockId) -> Option<BasicBlockId>

Returns the immediate dominator of the block. +Returns None if the block is unreachable from the entry block, or the +block is the entry block itself.

+
Source

pub fn strictly_dominates( + &self, + block1: BasicBlockId, + block2: BasicBlockId, +) -> bool

Returns true if block1 strictly dominates block2.

+
Source

pub fn dominates(&self, block1: BasicBlockId, block2: BasicBlockId) -> bool

Returns true if block1 dominates block2.

+
Source

pub fn is_reachable(&self, block: BasicBlockId) -> bool

Returns true if block is reachable from the entry block.

+
Source

pub fn rpo(&self) -> &[BasicBlockId]

Returns blocks in RPO.

+
Source

pub fn compute_df(&self, cfg: &ControlFlowGraph) -> DFSet

Compute dominance frontiers of each blocks.

+

Trait Implementations§

Source§

impl Clone for DomTree

Source§

fn clone(&self) -> DomTree

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DomTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/index.html b/compiler-docs/fe_mir/analysis/index.html new file mode 100644 index 0000000000..d69ba9b466 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/index.html @@ -0,0 +1 @@ +fe_mir::analysis - Rust

Module analysis

Source

Re-exports§

pub use cfg::ControlFlowGraph;
pub use domtree::DomTree;
pub use loop_tree::LoopTree;
pub use post_domtree::PostDomTree;

Modules§

cfg
domtree
This module contains dominator tree related structs.
loop_tree
post_domtree
This module contains implementation of Post Dominator Tree.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/index.html b/compiler-docs/fe_mir/analysis/loop_tree/index.html new file mode 100644 index 0000000000..5d694d77f0 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/index.html @@ -0,0 +1 @@ +fe_mir::analysis::loop_tree - Rust

Module loop_tree

Source

Structs§

BlocksInLoopPostOrder
Loop
LoopTree

Type Aliases§

LoopId
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/sidebar-items.js b/compiler-docs/fe_mir/analysis/loop_tree/sidebar-items.js new file mode 100644 index 0000000000..2c5cf81800 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["BlocksInLoopPostOrder","Loop","LoopTree"],"type":["LoopId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/struct.BlocksInLoopPostOrder.html b/compiler-docs/fe_mir/analysis/loop_tree/struct.BlocksInLoopPostOrder.html new file mode 100644 index 0000000000..0d8b9bb3f4 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/struct.BlocksInLoopPostOrder.html @@ -0,0 +1,209 @@ +BlocksInLoopPostOrder in fe_mir::analysis::loop_tree - Rust

Struct BlocksInLoopPostOrder

Source
pub struct BlocksInLoopPostOrder<'a, 'b> { /* private fields */ }

Trait Implementations§

Source§

impl<'a, 'b> Iterator for BlocksInLoopPostOrder<'a, 'b>

Source§

type Item = Id<BasicBlock>

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where + Self: Sized, + Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( + &mut self, +) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where + Self: Sized, + Self::Item: Try, + <Self::Item as Try>::Residual: Residual<B>, + B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if +a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a, 'b> Freeze for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> RefUnwindSafe for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> Send for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> Sync for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> Unpin for BlocksInLoopPostOrder<'a, 'b>

§

impl<'a, 'b> UnwindSafe for BlocksInLoopPostOrder<'a, 'b>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/struct.Loop.html b/compiler-docs/fe_mir/analysis/loop_tree/struct.Loop.html new file mode 100644 index 0000000000..45edf5afeb --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/struct.Loop.html @@ -0,0 +1,27 @@ +Loop in fe_mir::analysis::loop_tree - Rust

Struct Loop

Source
pub struct Loop {
+    pub header: BasicBlockId,
+    pub parent: Option<LoopId>,
+    pub children: Vec<LoopId>,
+}

Fields§

§header: BasicBlockId

A header of the loop.

+
§parent: Option<LoopId>

A parent loop that includes the loop.

+
§children: Vec<LoopId>

Child loops that the loop includes.

+

Trait Implementations§

Source§

impl Clone for Loop

Source§

fn clone(&self) -> Loop

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Loop

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for Loop

Source§

fn eq(&self, other: &Loop) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Loop

Source§

impl StructuralPartialEq for Loop

Auto Trait Implementations§

§

impl Freeze for Loop

§

impl RefUnwindSafe for Loop

§

impl Send for Loop

§

impl Sync for Loop

§

impl Unpin for Loop

§

impl UnwindSafe for Loop

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/struct.LoopTree.html b/compiler-docs/fe_mir/analysis/loop_tree/struct.LoopTree.html new file mode 100644 index 0000000000..64294d9bb8 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/struct.LoopTree.html @@ -0,0 +1,27 @@ +LoopTree in fe_mir::analysis::loop_tree - Rust

Struct LoopTree

Source
pub struct LoopTree { /* private fields */ }

Implementations§

Source§

impl LoopTree

Source

pub fn compute(cfg: &ControlFlowGraph, domtree: &DomTree) -> Self

Source

pub fn iter_blocks_post_order<'a, 'b>( + &'a self, + cfg: &'b ControlFlowGraph, + lp: LoopId, +) -> BlocksInLoopPostOrder<'a, 'b>

Returns all blocks in the loop.

+
Source

pub fn loops(&self) -> impl Iterator<Item = LoopId> + '_

Returns all loops in a function body. +An outer loop is guaranteed to be iterated before its inner loops.

+
Source

pub fn loop_num(&self) -> usize

Returns number of loops found.

+
Source

pub fn is_block_in_loop(&self, block: BasicBlockId, lp: LoopId) -> bool

Returns true if the block is in the lp.

+
Source

pub fn loop_header(&self, lp: LoopId) -> BasicBlockId

Returns header block of the lp.

+
Source

pub fn parent_loop(&self, lp: LoopId) -> Option<LoopId>

Get parent loop of the lp if exists.

+
Source

pub fn loop_of_block(&self, block: BasicBlockId) -> Option<LoopId>

Returns the loop that the block belongs to. +If the block belongs to multiple loops, then returns the innermost +loop.

+

Trait Implementations§

Source§

impl Clone for LoopTree

Source§

fn clone(&self) -> LoopTree

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LoopTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for LoopTree

Source§

fn default() -> LoopTree

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/loop_tree/type.LoopId.html b/compiler-docs/fe_mir/analysis/loop_tree/type.LoopId.html new file mode 100644 index 0000000000..7c55163770 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/loop_tree/type.LoopId.html @@ -0,0 +1 @@ +LoopId in fe_mir::analysis::loop_tree - Rust

Type Alias LoopId

Source
pub type LoopId = Id<Loop>;

Aliased Type§

pub struct LoopId { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/post_domtree/enum.PostIDom.html b/compiler-docs/fe_mir/analysis/post_domtree/enum.PostIDom.html new file mode 100644 index 0000000000..494070de3a --- /dev/null +++ b/compiler-docs/fe_mir/analysis/post_domtree/enum.PostIDom.html @@ -0,0 +1,24 @@ +PostIDom in fe_mir::analysis::post_domtree - Rust

Enum PostIDom

Source
pub enum PostIDom {
+    DummyEntry,
+    DummyExit,
+    Block(BasicBlockId),
+}

Variants§

§

DummyEntry

§

DummyExit

§

Block(BasicBlockId)

Trait Implementations§

Source§

impl Clone for PostIDom

Source§

fn clone(&self) -> PostIDom

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PostIDom

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for PostIDom

Source§

fn eq(&self, other: &PostIDom) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for PostIDom

Source§

impl Eq for PostIDom

Source§

impl StructuralPartialEq for PostIDom

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/post_domtree/index.html b/compiler-docs/fe_mir/analysis/post_domtree/index.html new file mode 100644 index 0000000000..3ed8fc4a2d --- /dev/null +++ b/compiler-docs/fe_mir/analysis/post_domtree/index.html @@ -0,0 +1,2 @@ +fe_mir::analysis::post_domtree - Rust

Module post_domtree

Source
Expand description

This module contains implementation of Post Dominator Tree.

+

Structs§

PostDomTree

Enums§

PostIDom
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/post_domtree/sidebar-items.js b/compiler-docs/fe_mir/analysis/post_domtree/sidebar-items.js new file mode 100644 index 0000000000..be2c288fe1 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/post_domtree/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["PostIDom"],"struct":["PostDomTree"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/post_domtree/struct.PostDomTree.html b/compiler-docs/fe_mir/analysis/post_domtree/struct.PostDomTree.html new file mode 100644 index 0000000000..5504c775ad --- /dev/null +++ b/compiler-docs/fe_mir/analysis/post_domtree/struct.PostDomTree.html @@ -0,0 +1,12 @@ +PostDomTree in fe_mir::analysis::post_domtree - Rust

Struct PostDomTree

Source
pub struct PostDomTree { /* private fields */ }

Implementations§

Source§

impl PostDomTree

Source

pub fn compute(func: &FunctionBody) -> Self

Source

pub fn post_idom(&self, block: BasicBlockId) -> PostIDom

Source

pub fn is_reachable(&self, block: BasicBlockId) -> bool

Returns true if block is reachable from the exit blocks.

+

Trait Implementations§

Source§

impl Debug for PostDomTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/analysis/sidebar-items.js b/compiler-docs/fe_mir/analysis/sidebar-items.js new file mode 100644 index 0000000000..9a48888d34 --- /dev/null +++ b/compiler-docs/fe_mir/analysis/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["cfg","domtree","loop_tree","post_domtree"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/db/index.html b/compiler-docs/fe_mir/db/index.html new file mode 100644 index 0000000000..48f3e99882 --- /dev/null +++ b/compiler-docs/fe_mir/db/index.html @@ -0,0 +1 @@ +fe_mir::db - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/sidebar-items.js b/compiler-docs/fe_mir/db/sidebar-items.js new file mode 100644 index 0000000000..7064af42a5 --- /dev/null +++ b/compiler-docs/fe_mir/db/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["MirDbGroupStorage__","MirDbStorage","MirInternConstLookupQuery","MirInternConstQuery","MirInternFunctionLookupQuery","MirInternFunctionQuery","MirInternTypeLookupQuery","MirInternTypeQuery","MirLowerContractAllFunctionsQuery","MirLowerEnumAllFunctionsQuery","MirLowerModuleAllFunctionsQuery","MirLowerStructAllFunctionsQuery","MirLoweredConstantQuery","MirLoweredFuncBodyQuery","MirLoweredFuncSignatureQuery","MirLoweredMonomorphizedFuncSignatureQuery","MirLoweredPseudoMonomorphizedFuncSignatureQuery","MirLoweredTypeQuery","NewDb"],"trait":["MirDb"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirDbGroupStorage__.html b/compiler-docs/fe_mir/db/struct.MirDbGroupStorage__.html new file mode 100644 index 0000000000..4249ad5526 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirDbGroupStorage__.html @@ -0,0 +1,42 @@ +MirDbGroupStorage__ in fe_mir::db - Rust

Struct MirDbGroupStorage__

Source
pub struct MirDbGroupStorage__ {
Show 16 fields + pub mir_intern_const: Arc<<MirInternConstQuery as Query>::Storage>, + pub lookup_mir_intern_const: Arc<<MirInternConstLookupQuery as Query>::Storage>, + pub mir_intern_type: Arc<<MirInternTypeQuery as Query>::Storage>, + pub lookup_mir_intern_type: Arc<<MirInternTypeLookupQuery as Query>::Storage>, + pub mir_intern_function: Arc<<MirInternFunctionQuery as Query>::Storage>, + pub lookup_mir_intern_function: Arc<<MirInternFunctionLookupQuery as Query>::Storage>, + pub mir_lower_module_all_functions: Arc<<MirLowerModuleAllFunctionsQuery as Query>::Storage>, + pub mir_lower_contract_all_functions: Arc<<MirLowerContractAllFunctionsQuery as Query>::Storage>, + pub mir_lower_struct_all_functions: Arc<<MirLowerStructAllFunctionsQuery as Query>::Storage>, + pub mir_lower_enum_all_functions: Arc<<MirLowerEnumAllFunctionsQuery as Query>::Storage>, + pub mir_lowered_type: Arc<<MirLoweredTypeQuery as Query>::Storage>, + pub mir_lowered_constant: Arc<<MirLoweredConstantQuery as Query>::Storage>, + pub mir_lowered_func_signature: Arc<<MirLoweredFuncSignatureQuery as Query>::Storage>, + pub mir_lowered_monomorphized_func_signature: Arc<<MirLoweredMonomorphizedFuncSignatureQuery as Query>::Storage>, + pub mir_lowered_pseudo_monomorphized_func_signature: Arc<<MirLoweredPseudoMonomorphizedFuncSignatureQuery as Query>::Storage>, + pub mir_lowered_func_body: Arc<<MirLoweredFuncBodyQuery as Query>::Storage>, +
}

Fields§

§mir_intern_const: Arc<<MirInternConstQuery as Query>::Storage>§lookup_mir_intern_const: Arc<<MirInternConstLookupQuery as Query>::Storage>§mir_intern_type: Arc<<MirInternTypeQuery as Query>::Storage>§lookup_mir_intern_type: Arc<<MirInternTypeLookupQuery as Query>::Storage>§mir_intern_function: Arc<<MirInternFunctionQuery as Query>::Storage>§lookup_mir_intern_function: Arc<<MirInternFunctionLookupQuery as Query>::Storage>§mir_lower_module_all_functions: Arc<<MirLowerModuleAllFunctionsQuery as Query>::Storage>§mir_lower_contract_all_functions: Arc<<MirLowerContractAllFunctionsQuery as Query>::Storage>§mir_lower_struct_all_functions: Arc<<MirLowerStructAllFunctionsQuery as Query>::Storage>§mir_lower_enum_all_functions: Arc<<MirLowerEnumAllFunctionsQuery as Query>::Storage>§mir_lowered_type: Arc<<MirLoweredTypeQuery as Query>::Storage>§mir_lowered_constant: Arc<<MirLoweredConstantQuery as Query>::Storage>§mir_lowered_func_signature: Arc<<MirLoweredFuncSignatureQuery as Query>::Storage>§mir_lowered_monomorphized_func_signature: Arc<<MirLoweredMonomorphizedFuncSignatureQuery as Query>::Storage>§mir_lowered_pseudo_monomorphized_func_signature: Arc<<MirLoweredPseudoMonomorphizedFuncSignatureQuery as Query>::Storage>§mir_lowered_func_body: Arc<<MirLoweredFuncBodyQuery as Query>::Storage>

Implementations§

Source§

impl MirDbGroupStorage__

Source

pub fn new(group_index: u16) -> Self

Source§

impl MirDbGroupStorage__

Source

pub fn fmt_index( + &self, + db: &(dyn MirDb + '_), + input: DatabaseKeyIndex, + fmt: &mut Formatter<'_>, +) -> Result

Source

pub fn maybe_changed_since( + &self, + db: &(dyn MirDb + '_), + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

Source

pub fn for_each_query( + &self, + _runtime: &Runtime, + op: &mut dyn FnMut(&dyn QueryStorageMassOps), +)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirDbStorage.html b/compiler-docs/fe_mir/db/struct.MirDbStorage.html new file mode 100644 index 0000000000..137d60a809 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirDbStorage.html @@ -0,0 +1,12 @@ +MirDbStorage in fe_mir::db - Rust

Struct MirDbStorage

Source
pub struct MirDbStorage {}
Expand description

Representative struct for the query group.

+

Trait Implementations§

Source§

impl HasQueryGroup<MirDbStorage> for NewDb

Source§

fn group_storage(&self) -> &<MirDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl QueryGroup for MirDbStorage

Source§

type DynDb = dyn MirDb

Dyn version of the associated database trait.
Source§

type GroupStorage = MirDbGroupStorage__

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternConstLookupQuery.html b/compiler-docs/fe_mir/db/struct.MirInternConstLookupQuery.html new file mode 100644 index 0000000000..040e130c70 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternConstLookupQuery.html @@ -0,0 +1,39 @@ +MirInternConstLookupQuery in fe_mir::db - Rust

Struct MirInternConstLookupQuery

Source
pub struct MirInternConstLookupQuery;

Implementations§

Source§

impl MirInternConstLookupQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternConstLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternConstLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternConstLookupQuery

Source§

fn default() -> MirInternConstLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternConstLookupQuery

Source§

const QUERY_INDEX: u16 = 1u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_mir_intern_const"

Name of the query method (e.g., foo)
Source§

type Key = ConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Constant>

What value does the query return?
Source§

type Storage = LookupInternedStorage<MirInternConstLookupQuery, MirInternConstQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternConstLookupQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternConstQuery.html b/compiler-docs/fe_mir/db/struct.MirInternConstQuery.html new file mode 100644 index 0000000000..c69327e0b8 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternConstQuery.html @@ -0,0 +1,39 @@ +MirInternConstQuery in fe_mir::db - Rust

Struct MirInternConstQuery

Source
pub struct MirInternConstQuery;

Implementations§

Source§

impl MirInternConstQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternConstQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternConstQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternConstQuery

Source§

fn default() -> MirInternConstQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternConstQuery

Source§

const QUERY_INDEX: u16 = 0u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_intern_const"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Constant>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ConstantId

What value does the query return?
Source§

type Storage = InternedStorage<MirInternConstQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternConstQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternFunctionLookupQuery.html b/compiler-docs/fe_mir/db/struct.MirInternFunctionLookupQuery.html new file mode 100644 index 0000000000..7ba92e6ec5 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternFunctionLookupQuery.html @@ -0,0 +1,39 @@ +MirInternFunctionLookupQuery in fe_mir::db - Rust

Struct MirInternFunctionLookupQuery

Source
pub struct MirInternFunctionLookupQuery;

Implementations§

Source§

impl MirInternFunctionLookupQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternFunctionLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternFunctionLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternFunctionLookupQuery

Source§

fn default() -> MirInternFunctionLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternFunctionLookupQuery

Source§

const QUERY_INDEX: u16 = 5u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_mir_intern_function"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionSignature>

What value does the query return?
Source§

type Storage = LookupInternedStorage<MirInternFunctionLookupQuery, MirInternFunctionQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternFunctionLookupQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternFunctionQuery.html b/compiler-docs/fe_mir/db/struct.MirInternFunctionQuery.html new file mode 100644 index 0000000000..814e451840 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternFunctionQuery.html @@ -0,0 +1,39 @@ +MirInternFunctionQuery in fe_mir::db - Rust

Struct MirInternFunctionQuery

Source
pub struct MirInternFunctionQuery;

Implementations§

Source§

impl MirInternFunctionQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternFunctionQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternFunctionQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternFunctionQuery

Source§

fn default() -> MirInternFunctionQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternFunctionQuery

Source§

const QUERY_INDEX: u16 = 4u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_intern_function"

Name of the query method (e.g., foo)
Source§

type Key = Rc<FunctionSignature>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = InternedStorage<MirInternFunctionQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternFunctionQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternTypeLookupQuery.html b/compiler-docs/fe_mir/db/struct.MirInternTypeLookupQuery.html new file mode 100644 index 0000000000..a717fa0b11 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternTypeLookupQuery.html @@ -0,0 +1,39 @@ +MirInternTypeLookupQuery in fe_mir::db - Rust

Struct MirInternTypeLookupQuery

Source
pub struct MirInternTypeLookupQuery;

Implementations§

Source§

impl MirInternTypeLookupQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternTypeLookupQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternTypeLookupQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternTypeLookupQuery

Source§

fn default() -> MirInternTypeLookupQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternTypeLookupQuery

Source§

const QUERY_INDEX: u16 = 3u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "lookup_mir_intern_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Type>

What value does the query return?
Source§

type Storage = LookupInternedStorage<MirInternTypeLookupQuery, MirInternTypeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternTypeLookupQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirInternTypeQuery.html b/compiler-docs/fe_mir/db/struct.MirInternTypeQuery.html new file mode 100644 index 0000000000..a94291a1ea --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirInternTypeQuery.html @@ -0,0 +1,39 @@ +MirInternTypeQuery in fe_mir::db - Rust

Struct MirInternTypeQuery

Source
pub struct MirInternTypeQuery;

Implementations§

Source§

impl MirInternTypeQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirInternTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirInternTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirInternTypeQuery

Source§

fn default() -> MirInternTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirInternTypeQuery

Source§

const QUERY_INDEX: u16 = 2u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_intern_type"

Name of the query method (e.g., foo)
Source§

type Key = Rc<Type>

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeId

What value does the query return?
Source§

type Storage = InternedStorage<MirInternTypeQuery>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirInternTypeQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLowerContractAllFunctionsQuery.html b/compiler-docs/fe_mir/db/struct.MirLowerContractAllFunctionsQuery.html new file mode 100644 index 0000000000..d343940f3b --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLowerContractAllFunctionsQuery.html @@ -0,0 +1,46 @@ +MirLowerContractAllFunctionsQuery in fe_mir::db - Rust

Struct MirLowerContractAllFunctionsQuery

Source
pub struct MirLowerContractAllFunctionsQuery;

Implementations§

Source§

impl MirLowerContractAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLowerContractAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLowerContractAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLowerContractAllFunctionsQuery

Source§

fn default() -> MirLowerContractAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLowerContractAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 7u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lower_contract_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = ContractId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLowerContractAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLowerContractAllFunctionsQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLowerContractAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLowerEnumAllFunctionsQuery.html b/compiler-docs/fe_mir/db/struct.MirLowerEnumAllFunctionsQuery.html new file mode 100644 index 0000000000..6b1cb45289 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLowerEnumAllFunctionsQuery.html @@ -0,0 +1,46 @@ +MirLowerEnumAllFunctionsQuery in fe_mir::db - Rust

Struct MirLowerEnumAllFunctionsQuery

Source
pub struct MirLowerEnumAllFunctionsQuery;

Implementations§

Source§

impl MirLowerEnumAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLowerEnumAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLowerEnumAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLowerEnumAllFunctionsQuery

Source§

fn default() -> MirLowerEnumAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLowerEnumAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 9u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lower_enum_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = EnumId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLowerEnumAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLowerEnumAllFunctionsQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLowerEnumAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLowerModuleAllFunctionsQuery.html b/compiler-docs/fe_mir/db/struct.MirLowerModuleAllFunctionsQuery.html new file mode 100644 index 0000000000..7e48b06e89 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLowerModuleAllFunctionsQuery.html @@ -0,0 +1,46 @@ +MirLowerModuleAllFunctionsQuery in fe_mir::db - Rust

Struct MirLowerModuleAllFunctionsQuery

Source
pub struct MirLowerModuleAllFunctionsQuery;

Implementations§

Source§

impl MirLowerModuleAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLowerModuleAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLowerModuleAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLowerModuleAllFunctionsQuery

Source§

fn default() -> MirLowerModuleAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLowerModuleAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 6u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lower_module_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = ModuleId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLowerModuleAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLowerModuleAllFunctionsQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLowerModuleAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLowerStructAllFunctionsQuery.html b/compiler-docs/fe_mir/db/struct.MirLowerStructAllFunctionsQuery.html new file mode 100644 index 0000000000..8a5c8dd113 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLowerStructAllFunctionsQuery.html @@ -0,0 +1,46 @@ +MirLowerStructAllFunctionsQuery in fe_mir::db - Rust

Struct MirLowerStructAllFunctionsQuery

Source
pub struct MirLowerStructAllFunctionsQuery;

Implementations§

Source§

impl MirLowerStructAllFunctionsQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLowerStructAllFunctionsQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLowerStructAllFunctionsQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLowerStructAllFunctionsQuery

Source§

fn default() -> MirLowerStructAllFunctionsQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLowerStructAllFunctionsQuery

Source§

const QUERY_INDEX: u16 = 8u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lower_struct_all_functions"

Name of the query method (e.g., foo)
Source§

type Key = StructId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<Vec<FunctionId>>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLowerStructAllFunctionsQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLowerStructAllFunctionsQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLowerStructAllFunctionsQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredConstantQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredConstantQuery.html new file mode 100644 index 0000000000..7c4bb4f825 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredConstantQuery.html @@ -0,0 +1,46 @@ +MirLoweredConstantQuery in fe_mir::db - Rust

Struct MirLoweredConstantQuery

Source
pub struct MirLoweredConstantQuery;

Implementations§

Source§

impl MirLoweredConstantQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredConstantQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredConstantQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredConstantQuery

Source§

fn default() -> MirLoweredConstantQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredConstantQuery

Source§

const QUERY_INDEX: u16 = 11u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_constant"

Name of the query method (e.g., foo)
Source§

type Key = ModuleConstantId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = ConstantId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredConstantQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredConstantQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredConstantQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredFuncBodyQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredFuncBodyQuery.html new file mode 100644 index 0000000000..fb2cc7a21a --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredFuncBodyQuery.html @@ -0,0 +1,46 @@ +MirLoweredFuncBodyQuery in fe_mir::db - Rust

Struct MirLoweredFuncBodyQuery

Source
pub struct MirLoweredFuncBodyQuery;

Implementations§

Source§

impl MirLoweredFuncBodyQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredFuncBodyQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredFuncBodyQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredFuncBodyQuery

Source§

fn default() -> MirLoweredFuncBodyQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredFuncBodyQuery

Source§

const QUERY_INDEX: u16 = 15u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_func_body"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = Rc<FunctionBody>

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredFuncBodyQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredFuncBodyQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredFuncBodyQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredFuncSignatureQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredFuncSignatureQuery.html new file mode 100644 index 0000000000..616c8fce5f --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredFuncSignatureQuery.html @@ -0,0 +1,46 @@ +MirLoweredFuncSignatureQuery in fe_mir::db - Rust

Struct MirLoweredFuncSignatureQuery

Source
pub struct MirLoweredFuncSignatureQuery;

Implementations§

Source§

impl MirLoweredFuncSignatureQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredFuncSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredFuncSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredFuncSignatureQuery

Source§

fn default() -> MirLoweredFuncSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredFuncSignatureQuery

Source§

const QUERY_INDEX: u16 = 12u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_func_signature"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredFuncSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredFuncSignatureQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredFuncSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredMonomorphizedFuncSignatureQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredMonomorphizedFuncSignatureQuery.html new file mode 100644 index 0000000000..30088a086a --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredMonomorphizedFuncSignatureQuery.html @@ -0,0 +1,46 @@ +MirLoweredMonomorphizedFuncSignatureQuery in fe_mir::db - Rust

Struct MirLoweredMonomorphizedFuncSignatureQuery

Source
pub struct MirLoweredMonomorphizedFuncSignatureQuery;

Implementations§

Source§

impl MirLoweredMonomorphizedFuncSignatureQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredMonomorphizedFuncSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredMonomorphizedFuncSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredMonomorphizedFuncSignatureQuery

Source§

fn default() -> MirLoweredMonomorphizedFuncSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredMonomorphizedFuncSignatureQuery

Source§

const QUERY_INDEX: u16 = 13u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_monomorphized_func_signature"

Name of the query method (e.g., foo)
Source§

type Key = (FunctionId, BTreeMap<SmolStr, TypeId>)

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredMonomorphizedFuncSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredMonomorphizedFuncSignatureQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredMonomorphizedFuncSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + (key0, key1): <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredPseudoMonomorphizedFuncSignatureQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredPseudoMonomorphizedFuncSignatureQuery.html new file mode 100644 index 0000000000..f5ce19797a --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredPseudoMonomorphizedFuncSignatureQuery.html @@ -0,0 +1,46 @@ +MirLoweredPseudoMonomorphizedFuncSignatureQuery in fe_mir::db - Rust

Struct MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source
pub struct MirLoweredPseudoMonomorphizedFuncSignatureQuery;

Implementations§

Source§

impl MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

fn default() -> MirLoweredPseudoMonomorphizedFuncSignatureQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

const QUERY_INDEX: u16 = 14u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_pseudo_monomorphized_func_signature"

Name of the query method (e.g., foo)
Source§

type Key = FunctionId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = FunctionId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredPseudoMonomorphizedFuncSignatureQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredPseudoMonomorphizedFuncSignatureQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.MirLoweredTypeQuery.html b/compiler-docs/fe_mir/db/struct.MirLoweredTypeQuery.html new file mode 100644 index 0000000000..7453f7999f --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.MirLoweredTypeQuery.html @@ -0,0 +1,46 @@ +MirLoweredTypeQuery in fe_mir::db - Rust

Struct MirLoweredTypeQuery

Source
pub struct MirLoweredTypeQuery;

Implementations§

Source§

impl MirLoweredTypeQuery

Source

pub fn in_db(self, db: &dyn MirDb) -> QueryTable<'_, Self>

Get access to extra methods pertaining to this query. For +example, you can use this to run the GC (sweep) across a +single input. You can also use it to invoke this query, though +it’s more common to use the trait method on the database +itself.

+
Source§

impl MirLoweredTypeQuery

Source

pub fn in_db_mut(self, db: &mut dyn MirDb) -> QueryTableMut<'_, Self>

Like in_db, but gives access to methods for setting the +value of an input. Not applicable to derived queries.

+
§Threads, cancellation, and blocking
+

Mutating the value of a query cannot be done while there are +still other queries executing. If you are using your database +within a single thread, this is not a problem: you only have +&self access to the database, but this method requires &mut self.

+

However, if you have used snapshot to create other threads, +then attempts to set will block the current thread until +those snapshots are dropped (usually when those threads +complete). This also implies that if you create a snapshot but +do not send it to another thread, then invoking set will +deadlock.

+

Before blocking, the thread that is attempting to set will +also set a cancellation flag. In the threads operating on +snapshots, you can use the is_current_revision_canceled +method to check for this flag and bring those operations to a +close, thus allowing the set to succeed. Ignoring this flag +may lead to “starvation”, meaning that the thread attempting +to set has to wait a long, long time. =)

+

Trait Implementations§

Source§

impl Debug for MirLoweredTypeQuery

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for MirLoweredTypeQuery

Source§

fn default() -> MirLoweredTypeQuery

Returns the “default value” for a type. Read more
Source§

impl Query for MirLoweredTypeQuery

Source§

const QUERY_INDEX: u16 = 10u16

A unique index identifying this query within the group.
Source§

const QUERY_NAME: &'static str = "mir_lowered_type"

Name of the query method (e.g., foo)
Source§

type Key = TypeId

Type that you you give as a parameter – for queries with zero +or more than one input, this will be a tuple.
Source§

type Value = TypeId

What value does the query return?
Source§

type Storage = DerivedStorage<MirLoweredTypeQuery, AlwaysMemoizeValue>

Internal struct storing the values for the query.
Source§

fn query_storage<'a>( + group_storage: &'a <Self as QueryDb<'_>>::GroupStorage, +) -> &'a Arc<Self::Storage>

Extact storage for this query from the storage for its group.
Source§

impl<'d> QueryDb<'d> for MirLoweredTypeQuery

Source§

type DynDb = dyn MirDb + 'd

Dyn version of the associated trait for this query group.
Source§

type Group = MirDbStorage

Associate query group struct.
Source§

type GroupStorage = MirDbGroupStorage__

Generated struct that contains storage for all queries in a group.
Source§

impl QueryFunction for MirLoweredTypeQuery

Source§

fn execute( + db: &<Self as QueryDb<'_>>::DynDb, + key0: <Self as Query>::Key, +) -> <Self as Query>::Value

§

fn recover( + db: &Self::DynDb, + cycle: &[DatabaseKeyIndex], + key: &Self::Key, +) -> Option<Self::Value>

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/struct.NewDb.html b/compiler-docs/fe_mir/db/struct.NewDb.html new file mode 100644 index 0000000000..d42c23bd83 --- /dev/null +++ b/compiler-docs/fe_mir/db/struct.NewDb.html @@ -0,0 +1,134 @@ +NewDb in fe_mir::db - Rust

Struct NewDb

Source
pub struct NewDb { /* private fields */ }

Trait Implementations§

Source§

impl Database for NewDb

§

fn sweep_all(&self, strategy: SweepStrategy)

Iterates through all query storage and removes any values that +have not been used since the last revision was created. The +intended use-cycle is that you first execute all of your +“main” queries; this will ensure that all query values they +consume are marked as used. You then invoke this method to +remove other values that were not needed for your main query +results.
§

fn salsa_event(&self, event_fn: Event)

This function is invoked at key points in the salsa +runtime. It permits the database to be customized and to +inject logging or other custom behavior.
§

fn on_propagated_panic(&self) -> !

This function is invoked when a dependent query is being computed by the +other thread, and that thread panics.
§

fn salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
§

fn salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

impl DatabaseOps for NewDb

Source§

fn ops_database(&self) -> &dyn Database

Upcast this type to a dyn Database.
Source§

fn ops_salsa_runtime(&self) -> &Runtime

Gives access to the underlying salsa runtime.
Source§

fn ops_salsa_runtime_mut(&mut self) -> &mut Runtime

Gives access to the underlying salsa runtime.
Source§

fn fmt_index(&self, input: DatabaseKeyIndex, fmt: &mut Formatter<'_>) -> Result

Formats a database key index in a human readable fashion.
Source§

fn maybe_changed_since( + &self, + input: DatabaseKeyIndex, + revision: Revision, +) -> bool

True if the computed value for input may have changed since revision.
Source§

fn for_each_query(&self, op: &mut dyn FnMut(&dyn QueryStorageMassOps))

Executes the callback for each kind of query.
Source§

impl DatabaseStorageTypes for NewDb

Source§

type DatabaseStorage = __SalsaDatabaseStorage

Defines the “storage type”, where all the query data is kept. +This type is defined by the database_storage macro.
Source§

impl Default for NewDb

Source§

fn default() -> NewDb

Returns the “default value” for a type. Read more
Source§

impl HasQueryGroup<AnalyzerDbStorage> for NewDb

Source§

fn group_storage(&self) -> &<AnalyzerDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<MirDbStorage> for NewDb

Source§

fn group_storage(&self) -> &<MirDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl HasQueryGroup<SourceDbStorage> for NewDb

Source§

fn group_storage(&self) -> &<SourceDbStorage as QueryGroup>::GroupStorage

Access the group storage struct from the database.
Source§

impl Upcast<dyn AnalyzerDb> for NewDb

Source§

fn upcast(&self) -> &(dyn AnalyzerDb + 'static)

Source§

impl Upcast<dyn SourceDb> for NewDb

Source§

fn upcast(&self) -> &(dyn SourceDb + 'static)

Source§

impl UpcastMut<dyn AnalyzerDb> for NewDb

Source§

fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static)

Source§

impl UpcastMut<dyn SourceDb> for NewDb

Source§

fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static)

Auto Trait Implementations§

§

impl !Freeze for NewDb

§

impl RefUnwindSafe for NewDb

§

impl !Send for NewDb

§

impl !Sync for NewDb

§

impl Unpin for NewDb

§

impl UnwindSafe for NewDb

Blanket Implementations§

§

impl<DB> AnalyzerDb for DB
where + DB: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> + Database + HasQueryGroup<AnalyzerDbStorage>,

§

fn intern_ingot(&self, key0: Rc<Ingot>) -> IngotId

§

fn lookup_intern_ingot(&self, key0: IngotId) -> Rc<Ingot>

§

fn intern_module(&self, key0: Rc<Module>) -> ModuleId

§

fn lookup_intern_module(&self, key0: ModuleId) -> Rc<Module>

§

fn intern_module_const(&self, key0: Rc<ModuleConstant>) -> ModuleConstantId

§

fn lookup_intern_module_const( + &self, + key0: ModuleConstantId, +) -> Rc<ModuleConstant>

§

fn intern_struct(&self, key0: Rc<Struct>) -> StructId

§

fn lookup_intern_struct(&self, key0: StructId) -> Rc<Struct>

§

fn intern_struct_field(&self, key0: Rc<StructField>) -> StructFieldId

§

fn lookup_intern_struct_field(&self, key0: StructFieldId) -> Rc<StructField>

§

fn intern_enum(&self, key0: Rc<Enum>) -> EnumId

§

fn lookup_intern_enum(&self, key0: EnumId) -> Rc<Enum>

§

fn intern_attribute(&self, key0: Rc<Attribute>) -> AttributeId

§

fn lookup_intern_attribute(&self, key0: AttributeId) -> Rc<Attribute>

§

fn intern_enum_variant(&self, key0: Rc<EnumVariant>) -> EnumVariantId

§

fn lookup_intern_enum_variant(&self, key0: EnumVariantId) -> Rc<EnumVariant>

§

fn intern_trait(&self, key0: Rc<Trait>) -> TraitId

§

fn lookup_intern_trait(&self, key0: TraitId) -> Rc<Trait>

§

fn intern_impl(&self, key0: Rc<Impl>) -> ImplId

§

fn lookup_intern_impl(&self, key0: ImplId) -> Rc<Impl>

§

fn intern_type_alias(&self, key0: Rc<TypeAlias>) -> TypeAliasId

§

fn lookup_intern_type_alias(&self, key0: TypeAliasId) -> Rc<TypeAlias>

§

fn intern_contract(&self, key0: Rc<Contract>) -> ContractId

§

fn lookup_intern_contract(&self, key0: ContractId) -> Rc<Contract>

§

fn intern_contract_field(&self, key0: Rc<ContractField>) -> ContractFieldId

§

fn lookup_intern_contract_field( + &self, + key0: ContractFieldId, +) -> Rc<ContractField>

§

fn intern_function_sig(&self, key0: Rc<FunctionSig>) -> FunctionSigId

§

fn lookup_intern_function_sig(&self, key0: FunctionSigId) -> Rc<FunctionSig>

§

fn intern_function(&self, key0: Rc<Function>) -> FunctionId

§

fn lookup_intern_function(&self, key0: FunctionId) -> Rc<Function>

§

fn intern_type(&self, key0: Type) -> TypeId

§

fn lookup_intern_type(&self, key0: TypeId) -> Type

§

fn ingot_files(&self, key0: IngotId) -> Rc<[SourceFileId]>

§

fn set_ingot_files(&mut self, key0: IngotId, value__: Rc<[SourceFileId]>)

Set the value of the ingot_files input. Read more
§

fn set_ingot_files_with_durability( + &mut self, + key0: IngotId, + value__: Rc<[SourceFileId]>, + durability__: Durability, +)

Set the value of the ingot_files input and promise +that its value will never change again. Read more
§

fn ingot_external_ingots(&self, key0: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>

§

fn set_ingot_external_ingots( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, +)

Set the value of the ingot_external_ingots input. Read more
§

fn set_ingot_external_ingots_with_durability( + &mut self, + key0: IngotId, + value__: Rc<IndexMap<SmolStr, IngotId>>, + durability__: Durability, +)

Set the value of the ingot_external_ingots input and promise +that its value will never change again. Read more
§

fn root_ingot(&self) -> IngotId

§

fn set_root_ingot(&mut self, value__: IngotId)

Set the value of the root_ingot input. Read more
§

fn set_root_ingot_with_durability( + &mut self, + value__: IngotId, + durability__: Durability, +)

Set the value of the root_ingot input and promise +that its value will never change again. Read more
§

fn ingot_modules(&self, key0: IngotId) -> Rc<[ModuleId]>

§

fn ingot_root_module(&self, key0: IngotId) -> Option<ModuleId>

§

fn module_file_path(&self, key0: ModuleId) -> SmolStr

§

fn module_parse(&self, key0: ModuleId) -> Analysis<Rc<Module>>

§

fn module_is_incomplete(&self, key0: ModuleId) -> bool

§

fn module_all_items(&self, key0: ModuleId) -> Rc<[Item]>

§

fn module_all_impls(&self, key0: ModuleId) -> Analysis<Rc<[ImplId]>>

§

fn module_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, Item>>>

§

fn module_impl_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>

§

fn module_contracts(&self, key0: ModuleId) -> Rc<[ContractId]>

§

fn module_structs(&self, key0: ModuleId) -> Rc<[StructId]>

§

fn module_constants(&self, key0: ModuleId) -> Rc<Vec<ModuleConstantId>>

§

fn module_used_item_map( + &self, + key0: ModuleId, +) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>

§

fn module_parent_module(&self, key0: ModuleId) -> Option<ModuleId>

§

fn module_submodules(&self, key0: ModuleId) -> Rc<[ModuleId]>

§

fn module_tests(&self, key0: ModuleId) -> Vec<FunctionId>

§

fn module_constant_type( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn module_constant_value( + &self, + key0: ModuleConstantId, +) -> Analysis<Result<Constant, ConstEvalError>>

§

fn contract_all_functions(&self, key0: ContractId) -> Rc<[FunctionId]>

§

fn contract_function_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn contract_public_function_map( + &self, + key0: ContractId, +) -> Rc<IndexMap<SmolStr, FunctionId>>

§

fn contract_init_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_call_function( + &self, + key0: ContractId, +) -> Analysis<Option<FunctionId>>

§

fn contract_all_fields(&self, key0: ContractId) -> Rc<[ContractFieldId]>

§

fn contract_field_map( + &self, + key0: ContractId, +) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>

§

fn contract_field_type( + &self, + key0: ContractFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn contract_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn contract_runtime_dependency_graph(&self, key0: ContractId) -> DepGraphWrapper

§

fn function_signature( + &self, + key0: FunctionSigId, +) -> Analysis<Rc<FunctionSignature>>

§

fn function_body(&self, key0: FunctionId) -> Analysis<Rc<FunctionBody>>

§

fn function_dependency_graph(&self, key0: FunctionId) -> DepGraphWrapper

§

fn struct_all_fields(&self, key0: StructId) -> Rc<[StructFieldId]>

§

fn struct_field_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>

§

fn struct_field_type( + &self, + key0: StructFieldId, +) -> Analysis<Result<TypeId, TypeError>>

§

fn struct_all_functions(&self, key0: StructId) -> Rc<[FunctionId]>

§

fn struct_function_map( + &self, + key0: StructId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn struct_dependency_graph(&self, key0: StructId) -> Analysis<DepGraphWrapper>

§

fn enum_all_variants(&self, key0: EnumId) -> Rc<[EnumVariantId]>

§

fn enum_variant_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>

§

fn enum_all_functions(&self, key0: EnumId) -> Rc<[FunctionId]>

§

fn enum_function_map( + &self, + key0: EnumId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn enum_dependency_graph(&self, key0: EnumId) -> Analysis<DepGraphWrapper>

§

fn enum_variant_kind( + &self, + key0: EnumVariantId, +) -> Analysis<Result<EnumVariantKind, TypeError>>

§

fn trait_all_functions(&self, key0: TraitId) -> Rc<[FunctionSigId]>

§

fn trait_function_map( + &self, + key0: TraitId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>

§

fn trait_is_implemented_for(&self, key0: TraitId, key1: TypeId) -> bool

§

fn impl_all_functions(&self, key0: ImplId) -> Rc<[FunctionId]>

§

fn impl_function_map( + &self, + key0: ImplId, +) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>

§

fn all_impls(&self, key0: TypeId) -> Rc<[ImplId]>

§

fn impl_for(&self, key0: TypeId, key1: TraitId) -> Option<ImplId>

§

fn function_sigs(&self, key0: TypeId, key1: SmolStr) -> Rc<[FunctionSigId]>

§

fn type_alias_type( + &self, + key0: TypeAliasId, +) -> Analysis<Result<TypeId, TypeError>>

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<DB> MirDb for DB
where + DB: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> + Database + HasQueryGroup<MirDbStorage>,

§

impl<DB> SourceDb for DB
where + DB: Database + HasQueryGroup<SourceDbStorage>,

§

fn intern_file(&self, key0: File) -> SourceFileId

§

fn lookup_intern_file(&self, key0: SourceFileId) -> File

§

fn file_content(&self, key0: SourceFileId) -> Rc<str>

Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc)
§

fn set_file_content(&mut self, key0: SourceFileId, value__: Rc<str>)

Set the value of the file_content input. Read more
§

fn set_file_content_with_durability( + &mut self, + key0: SourceFileId, + value__: Rc<str>, + durability__: Durability, +)

Set the value of the file_content input and promise +that its value will never change again. Read more
§

fn file_line_starts(&self, key0: SourceFileId) -> Rc<[usize]>

§

fn file_name(&self, key0: SourceFileId) -> SmolStr

Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/db/trait.MirDb.html b/compiler-docs/fe_mir/db/trait.MirDb.html new file mode 100644 index 0000000000..dfbad8a2b2 --- /dev/null +++ b/compiler-docs/fe_mir/db/trait.MirDb.html @@ -0,0 +1,54 @@ +MirDb in fe_mir::db - Rust

Trait MirDb

Source
pub trait MirDb:
+    Database
+    + HasQueryGroup<MirDbStorage>
+    + AnalyzerDb
+    + Upcast<dyn AnalyzerDb>
+    + UpcastMut<dyn AnalyzerDb> {
+
Show 16 methods // Required methods + fn mir_intern_const(&self, key0: Rc<Constant>) -> ConstantId; + fn lookup_mir_intern_const(&self, key0: ConstantId) -> Rc<Constant>; + fn mir_intern_type(&self, key0: Rc<Type>) -> TypeId; + fn lookup_mir_intern_type(&self, key0: TypeId) -> Rc<Type>; + fn mir_intern_function(&self, key0: Rc<FunctionSignature>) -> FunctionId; + fn lookup_mir_intern_function( + &self, + key0: FunctionId, + ) -> Rc<FunctionSignature>; + fn mir_lower_module_all_functions( + &self, + key0: ModuleId, + ) -> Rc<Vec<FunctionId>>; + fn mir_lower_contract_all_functions( + &self, + key0: ContractId, + ) -> Rc<Vec<FunctionId>>; + fn mir_lower_struct_all_functions( + &self, + key0: StructId, + ) -> Rc<Vec<FunctionId>>; + fn mir_lower_enum_all_functions(&self, key0: EnumId) -> Rc<Vec<FunctionId>>; + fn mir_lowered_type(&self, key0: TypeId) -> TypeId; + fn mir_lowered_constant(&self, key0: ModuleConstantId) -> ConstantId; + fn mir_lowered_func_signature(&self, key0: FunctionId) -> FunctionId; + fn mir_lowered_monomorphized_func_signature( + &self, + key0: FunctionId, + key1: BTreeMap<SmolStr, TypeId>, + ) -> FunctionId; + fn mir_lowered_pseudo_monomorphized_func_signature( + &self, + key0: FunctionId, + ) -> FunctionId; + fn mir_lowered_func_body(&self, key0: FunctionId) -> Rc<FunctionBody>; +
}

Required Methods§

Source

fn mir_intern_const(&self, key0: Rc<Constant>) -> ConstantId

Source

fn lookup_mir_intern_const(&self, key0: ConstantId) -> Rc<Constant>

Source

fn mir_intern_type(&self, key0: Rc<Type>) -> TypeId

Source

fn lookup_mir_intern_type(&self, key0: TypeId) -> Rc<Type>

Source

fn mir_intern_function(&self, key0: Rc<FunctionSignature>) -> FunctionId

Source

fn lookup_mir_intern_function(&self, key0: FunctionId) -> Rc<FunctionSignature>

Source

fn mir_lower_module_all_functions(&self, key0: ModuleId) -> Rc<Vec<FunctionId>>

Source

fn mir_lower_contract_all_functions( + &self, + key0: ContractId, +) -> Rc<Vec<FunctionId>>

Source

fn mir_lower_struct_all_functions(&self, key0: StructId) -> Rc<Vec<FunctionId>>

Source

fn mir_lower_enum_all_functions(&self, key0: EnumId) -> Rc<Vec<FunctionId>>

Source

fn mir_lowered_type(&self, key0: TypeId) -> TypeId

Source

fn mir_lowered_constant(&self, key0: ModuleConstantId) -> ConstantId

Source

fn mir_lowered_func_signature(&self, key0: FunctionId) -> FunctionId

Source

fn mir_lowered_monomorphized_func_signature( + &self, + key0: FunctionId, + key1: BTreeMap<SmolStr, TypeId>, +) -> FunctionId

Source

fn mir_lowered_pseudo_monomorphized_func_signature( + &self, + key0: FunctionId, +) -> FunctionId

Source

fn mir_lowered_func_body(&self, key0: FunctionId) -> Rc<FunctionBody>

Implementors§

Source§

impl<DB> MirDb for DB
where + DB: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> + Database + HasQueryGroup<MirDbStorage>,

\ No newline at end of file diff --git a/compiler-docs/fe_mir/graphviz/fn.write_mir_graphs.html b/compiler-docs/fe_mir/graphviz/fn.write_mir_graphs.html new file mode 100644 index 0000000000..73bab9b041 --- /dev/null +++ b/compiler-docs/fe_mir/graphviz/fn.write_mir_graphs.html @@ -0,0 +1,6 @@ +write_mir_graphs in fe_mir::graphviz - Rust

Function write_mir_graphs

Source
pub fn write_mir_graphs<W: Write>(
+    db: &dyn MirDb,
+    module: ModuleId,
+    w: &mut W,
+) -> Result<()>
Expand description

Writes mir graphs of functions in a module.

+
\ No newline at end of file diff --git a/compiler-docs/fe_mir/graphviz/index.html b/compiler-docs/fe_mir/graphviz/index.html new file mode 100644 index 0000000000..8d7ebfe042 --- /dev/null +++ b/compiler-docs/fe_mir/graphviz/index.html @@ -0,0 +1 @@ +fe_mir::graphviz - Rust

Module graphviz

Source

Functions§

write_mir_graphs
Writes mir graphs of functions in a module.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/graphviz/sidebar-items.js b/compiler-docs/fe_mir/graphviz/sidebar-items.js new file mode 100644 index 0000000000..cd5ad48797 --- /dev/null +++ b/compiler-docs/fe_mir/graphviz/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["write_mir_graphs"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/index.html b/compiler-docs/fe_mir/index.html new file mode 100644 index 0000000000..7437765bc5 --- /dev/null +++ b/compiler-docs/fe_mir/index.html @@ -0,0 +1 @@ +fe_mir - Rust

Crate fe_mir

Source

Modules§

analysis
db
graphviz
ir
pretty_print
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/basic_block/index.html b/compiler-docs/fe_mir/ir/basic_block/index.html new file mode 100644 index 0000000000..ba57a62618 --- /dev/null +++ b/compiler-docs/fe_mir/ir/basic_block/index.html @@ -0,0 +1 @@ +fe_mir::ir::basic_block - Rust

Module basic_block

Source

Structs§

BasicBlock

Type Aliases§

BasicBlockId
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/basic_block/sidebar-items.js b/compiler-docs/fe_mir/ir/basic_block/sidebar-items.js new file mode 100644 index 0000000000..50c3409a66 --- /dev/null +++ b/compiler-docs/fe_mir/ir/basic_block/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["BasicBlock"],"type":["BasicBlockId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/basic_block/struct.BasicBlock.html b/compiler-docs/fe_mir/ir/basic_block/struct.BasicBlock.html new file mode 100644 index 0000000000..0277f7719a --- /dev/null +++ b/compiler-docs/fe_mir/ir/basic_block/struct.BasicBlock.html @@ -0,0 +1,22 @@ +BasicBlock in fe_mir::ir::basic_block - Rust

Struct BasicBlock

Source
pub struct BasicBlock {}

Trait Implementations§

Source§

impl Clone for BasicBlock

Source§

fn clone(&self) -> BasicBlock

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BasicBlock

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for BasicBlock

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for BasicBlock

Source§

fn eq(&self, other: &BasicBlock) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for BasicBlock

Source§

impl Eq for BasicBlock

Source§

impl StructuralPartialEq for BasicBlock

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/basic_block/type.BasicBlockId.html b/compiler-docs/fe_mir/ir/basic_block/type.BasicBlockId.html new file mode 100644 index 0000000000..03c5664ec2 --- /dev/null +++ b/compiler-docs/fe_mir/ir/basic_block/type.BasicBlockId.html @@ -0,0 +1 @@ +BasicBlockId in fe_mir::ir::basic_block - Rust

Type Alias BasicBlockId

Source
pub type BasicBlockId = Id<BasicBlock>;

Aliased Type§

pub struct BasicBlockId { /* private fields */ }
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_builder/index.html b/compiler-docs/fe_mir/ir/body_builder/index.html new file mode 100644 index 0000000000..d22e13a9b9 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_builder/index.html @@ -0,0 +1 @@ +fe_mir::ir::body_builder - Rust

Module body_builder

Source

Structs§

BodyBuilder
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_builder/sidebar-items.js b/compiler-docs/fe_mir/ir/body_builder/sidebar-items.js new file mode 100644 index 0000000000..24f416595a --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_builder/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["BodyBuilder"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_builder/struct.BodyBuilder.html b/compiler-docs/fe_mir/ir/body_builder/struct.BodyBuilder.html new file mode 100644 index 0000000000..178a890525 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_builder/struct.BodyBuilder.html @@ -0,0 +1,104 @@ +BodyBuilder in fe_mir::ir::body_builder - Rust

Struct BodyBuilder

Source
pub struct BodyBuilder {
+    pub body: FunctionBody,
+    /* private fields */
+}

Fields§

§body: FunctionBody

Implementations§

Source§

impl BodyBuilder

Source

pub fn new(fid: FunctionId, source: SourceInfo) -> Self

Source

pub fn build(self) -> FunctionBody

Source

pub fn func_id(&self) -> FunctionId

Source

pub fn make_block(&mut self) -> BasicBlockId

Source

pub fn make_value(&mut self, value: impl Into<Value>) -> ValueId

Source

pub fn map_result(&mut self, inst: InstId, result: AssignableValue)

Source

pub fn inst_result(&mut self, inst: InstId) -> Option<&AssignableValue>

Source

pub fn move_to_block(&mut self, block: BasicBlockId)

Source

pub fn move_to_block_top(&mut self, block: BasicBlockId)

Source

pub fn make_unit(&mut self, unit_ty: TypeId) -> ValueId

Source

pub fn make_imm(&mut self, imm: BigInt, ty: TypeId) -> ValueId

Source

pub fn make_imm_from_bool(&mut self, imm: bool, ty: TypeId) -> ValueId

Source

pub fn make_constant(&mut self, constant: ConstantId, ty: TypeId) -> ValueId

Source

pub fn declare(&mut self, local: Local) -> ValueId

Source

pub fn store_func_arg(&mut self, local: Local) -> ValueId

Source

pub fn not(&mut self, value: ValueId, source: SourceInfo) -> InstId

Source

pub fn neg(&mut self, value: ValueId, source: SourceInfo) -> InstId

Source

pub fn inv(&mut self, value: ValueId, source: SourceInfo) -> InstId

Source

pub fn add(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn sub(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn mul(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn div(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn modulo( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn pow(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn shl(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn shr(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn bit_or( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn bit_xor( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn bit_and( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn logical_and( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn logical_or( + &mut self, + lhs: ValueId, + rhs: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn eq(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn ne(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn ge(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn gt(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn le(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn lt(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId

Source

pub fn primitive_cast( + &mut self, + value: ValueId, + result_ty: TypeId, + source: SourceInfo, +) -> InstId

Source

pub fn untag_cast( + &mut self, + value: ValueId, + result_ty: TypeId, + source: SourceInfo, +) -> InstId

Source

pub fn aggregate_construct( + &mut self, + ty: TypeId, + args: Vec<ValueId>, + source: SourceInfo, +) -> InstId

Source

pub fn bind(&mut self, src: ValueId, source: SourceInfo) -> InstId

Source

pub fn mem_copy(&mut self, src: ValueId, source: SourceInfo) -> InstId

Source

pub fn load(&mut self, src: ValueId, source: SourceInfo) -> InstId

Source

pub fn aggregate_access( + &mut self, + value: ValueId, + indices: Vec<ValueId>, + source: SourceInfo, +) -> InstId

Source

pub fn map_access( + &mut self, + value: ValueId, + key: ValueId, + source: SourceInfo, +) -> InstId

Source

pub fn call( + &mut self, + func: FunctionId, + args: Vec<ValueId>, + call_type: CallType, + source: SourceInfo, +) -> InstId

Source

pub fn keccak256(&mut self, arg: ValueId, source: SourceInfo) -> InstId

Source

pub fn abi_encode(&mut self, arg: ValueId, source: SourceInfo) -> InstId

Source

pub fn create( + &mut self, + value: ValueId, + contract: ContractId, + source: SourceInfo, +) -> InstId

Source

pub fn create2( + &mut self, + value: ValueId, + salt: ValueId, + contract: ContractId, + source: SourceInfo, +) -> InstId

Source

pub fn yul_intrinsic( + &mut self, + op: YulIntrinsicOp, + args: Vec<ValueId>, + source: SourceInfo, +) -> InstId

Source

pub fn jump(&mut self, dest: BasicBlockId, source: SourceInfo) -> InstId

Source

pub fn branch( + &mut self, + cond: ValueId, + then: BasicBlockId, + else_: BasicBlockId, + source: SourceInfo, +) -> InstId

Source

pub fn switch( + &mut self, + disc: ValueId, + table: SwitchTable, + default: Option<BasicBlockId>, + source: SourceInfo, +) -> InstId

Source

pub fn revert(&mut self, arg: Option<ValueId>, source: SourceInfo) -> InstId

Source

pub fn emit(&mut self, arg: ValueId, source: SourceInfo) -> InstId

Source

pub fn ret(&mut self, arg: ValueId, source: SourceInfo) -> InstId

Source

pub fn nop(&mut self, source: SourceInfo) -> InstId

Source

pub fn value_ty(&mut self, value: ValueId) -> TypeId

Source

pub fn value_data(&mut self, value: ValueId) -> &Value

Source

pub fn is_block_terminated(&mut self, block: BasicBlockId) -> bool

Returns true if current block is terminated.

+
Source

pub fn is_current_block_terminated(&mut self) -> bool

Source

pub fn current_block(&mut self) -> BasicBlockId

Source

pub fn remove_inst(&mut self, inst: InstId)

Source

pub fn inst_data(&self, inst: InstId) -> &Inst

Trait Implementations§

Source§

impl Debug for BodyBuilder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_cursor/enum.CursorLocation.html b/compiler-docs/fe_mir/ir/body_cursor/enum.CursorLocation.html new file mode 100644 index 0000000000..34c0fbb7a4 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_cursor/enum.CursorLocation.html @@ -0,0 +1,26 @@ +CursorLocation in fe_mir::ir::body_cursor - Rust

Enum CursorLocation

Source
pub enum CursorLocation {
+    Inst(InstId),
+    BlockTop(BasicBlockId),
+    BlockBottom(BasicBlockId),
+    NoWhere,
+}
Expand description

Specify a current location of BodyCursor

+

Variants§

§

Inst(InstId)

§

BlockTop(BasicBlockId)

§

BlockBottom(BasicBlockId)

§

NoWhere

Trait Implementations§

Source§

impl Clone for CursorLocation

Source§

fn clone(&self) -> CursorLocation

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CursorLocation

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for CursorLocation

Source§

fn eq(&self, other: &CursorLocation) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for CursorLocation

Source§

impl Eq for CursorLocation

Source§

impl StructuralPartialEq for CursorLocation

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_cursor/index.html b/compiler-docs/fe_mir/ir/body_cursor/index.html new file mode 100644 index 0000000000..ca1f9b4094 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_cursor/index.html @@ -0,0 +1,3 @@ +fe_mir::ir::body_cursor - Rust

Module body_cursor

Source
Expand description

This module provides a collection of structs to modify function body +in-place.

+

Structs§

BodyCursor

Enums§

CursorLocation
Specify a current location of BodyCursor
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_cursor/sidebar-items.js b/compiler-docs/fe_mir/ir/body_cursor/sidebar-items.js new file mode 100644 index 0000000000..bb2e01db68 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_cursor/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["CursorLocation"],"struct":["BodyCursor"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_cursor/struct.BodyCursor.html b/compiler-docs/fe_mir/ir/body_cursor/struct.BodyCursor.html new file mode 100644 index 0000000000..637200d350 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_cursor/struct.BodyCursor.html @@ -0,0 +1,35 @@ +BodyCursor in fe_mir::ir::body_cursor - Rust

Struct BodyCursor

Source
pub struct BodyCursor<'a> { /* private fields */ }

Implementations§

Source§

impl<'a> BodyCursor<'a>

Source

pub fn new(body: &'a mut FunctionBody, loc: CursorLocation) -> Self

Source

pub fn new_at_entry(body: &'a mut FunctionBody) -> Self

Source

pub fn set_loc(&mut self, loc: CursorLocation)

Source

pub fn loc(&self) -> CursorLocation

Source

pub fn next_loc(&self) -> CursorLocation

Source

pub fn prev_loc(&self) -> CursorLocation

Source

pub fn next_block(&self) -> Option<BasicBlockId>

Source

pub fn prev_block(&self) -> Option<BasicBlockId>

Source

pub fn proceed(&mut self)

Source

pub fn back(&mut self)

Source

pub fn body(&self) -> &FunctionBody

Source

pub fn body_mut(&mut self) -> &mut FunctionBody

Source

pub fn set_to_entry(&mut self)

Sets a cursor to an entry block.

+
Source

pub fn insert_inst(&mut self, inst: InstId)

Insert InstId to a location where a cursor points. +If you need to store and insert Inst, use [store_and_insert_inst].

+
§Panics
+

Panics if a cursor points CursorLocation::NoWhere.

+
Source

pub fn store_and_insert_inst(&mut self, data: Inst) -> InstId

Source

pub fn remove_inst(&mut self)

Remove a current pointed Inst from a function body. A cursor +proceeds to a next inst.

+
§Panics
+

Panics if a cursor doesn’t point CursorLocation::Inst.

+
Source

pub fn remove_block(&mut self)

Remove a current pointed block and contained insts from a function +body. A cursor proceeds to a next block.

+
§Panics
+

Panics if a cursor doesn’t point CursorLocation::Inst.

+
Source

pub fn insert_block(&mut self, block: BasicBlockId)

Insert BasicBlockId to a location where a cursor points. +If you need to store and insert BasicBlock, use +[store_and_insert_block].

+
§Panics
+

Panics if a cursor points CursorLocation::NoWhere.

+
Source

pub fn store_and_insert_block(&mut self, block: BasicBlock) -> BasicBlockId

Source

pub fn map_result(&mut self, result: AssignableValue) -> Option<ValueId>

Source

pub fn expect_inst(&self) -> InstId

Returns current inst that cursor points.

+
§Panics
+

Panics if a cursor doesn’t point CursorLocation::Inst.

+
Source

pub fn expect_block(&self) -> BasicBlockId

Returns current block that cursor points.

+
§Panics
+

Panics if a cursor points CursorLocation::NoWhere.

+

Auto Trait Implementations§

§

impl<'a> Freeze for BodyCursor<'a>

§

impl<'a> RefUnwindSafe for BodyCursor<'a>

§

impl<'a> Send for BodyCursor<'a>

§

impl<'a> Sync for BodyCursor<'a>

§

impl<'a> Unpin for BodyCursor<'a>

§

impl<'a> !UnwindSafe for BodyCursor<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_order/index.html b/compiler-docs/fe_mir/ir/body_order/index.html new file mode 100644 index 0000000000..b90dd98fe0 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_order/index.html @@ -0,0 +1 @@ +fe_mir::ir::body_order - Rust

Module body_order

Source

Structs§

BodyOrder
Represents basic block order and instruction order.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_order/sidebar-items.js b/compiler-docs/fe_mir/ir/body_order/sidebar-items.js new file mode 100644 index 0000000000..a8e1023e35 --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_order/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["BodyOrder"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/body_order/struct.BodyOrder.html b/compiler-docs/fe_mir/ir/body_order/struct.BodyOrder.html new file mode 100644 index 0000000000..fcf587721c --- /dev/null +++ b/compiler-docs/fe_mir/ir/body_order/struct.BodyOrder.html @@ -0,0 +1,132 @@ +BodyOrder in fe_mir::ir::body_order - Rust

Struct BodyOrder

Source
pub struct BodyOrder { /* private fields */ }
Expand description

Represents basic block order and instruction order.

+

Implementations§

Source§

impl BodyOrder

Source

pub fn new(entry_block: BasicBlockId) -> Self

Source

pub fn entry(&self) -> BasicBlockId

Returns an entry block of a function body.

+
Source

pub fn last_block(&self) -> BasicBlockId

Returns a last block of a function body.

+
Source

pub fn is_block_empty(&self, block: BasicBlockId) -> bool

Returns true if a block doesn’t contain any block.

+
Source

pub fn is_block_inserted(&self, block: BasicBlockId) -> bool

Returns true if a function body contains a given block.

+
Source

pub fn block_num(&self) -> usize

Returns a number of block in a function.

+
Source

pub fn prev_block(&self, block: BasicBlockId) -> Option<BasicBlockId>

Returns a previous block of a given block.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn next_block(&self, block: BasicBlockId) -> Option<BasicBlockId>

Returns a next block of a given block.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn is_inst_inserted(&self, inst: InstId) -> bool

Returns true is a given inst is inserted.

+
Source

pub fn first_inst(&self, block: BasicBlockId) -> Option<InstId>

Returns first instruction of a block if exists.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn terminator( + &self, + store: &BodyDataStore, + block: BasicBlockId, +) -> Option<InstId>

Returns a terminator instruction of a block.

+
§Panics
+

Panics if

+
    +
  1. block is not inserted yet.
  2. +
+
Source

pub fn is_terminated(&self, store: &BodyDataStore, block: BasicBlockId) -> bool

Returns true if a block is terminated.

+
Source

pub fn last_inst(&self, block: BasicBlockId) -> Option<InstId>

Returns a last instruction of a block.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn prev_inst(&self, inst: InstId) -> Option<InstId>

Returns a previous instruction of a given inst.

+
§Panics
+

Panics if inst is not inserted yet.

+
Source

pub fn next_inst(&self, inst: InstId) -> Option<InstId>

Returns a next instruction of a given inst.

+
§Panics
+

Panics if inst is not inserted yet.

+
Source

pub fn inst_block(&self, inst: InstId) -> BasicBlockId

Returns a block to which a given inst belongs.

+
§Panics
+

Panics if inst is not inserted yet.

+
Source

pub fn iter_block(&self) -> impl Iterator<Item = BasicBlockId> + '_

Returns an iterator which iterates all basic blocks in a function body +in pre-order.

+
Source

pub fn iter_inst( + &self, + block: BasicBlockId, +) -> impl Iterator<Item = InstId> + '_

Returns an iterator which iterates all instruction in a given block in +pre-order.

+
§Panics
+

Panics if block is not inserted yet.

+
Source

pub fn append_block(&mut self, block: BasicBlockId)

Appends a given block to a function body.

+
§Panics
+

Panics if a given block is already inserted to a function.

+
Source

pub fn insert_block_before_block( + &mut self, + block: BasicBlockId, + before: BasicBlockId, +)

Inserts a given block before a before block.

+
§Panics
+

Panics if

+
    +
  1. a given block is already inserted.
  2. +
  3. a given before block is NOTE inserted yet.
  4. +
+
Source

pub fn insert_block_after_block( + &mut self, + block: BasicBlockId, + after: BasicBlockId, +)

Inserts a given block after a after block.

+
§Panics
+

Panics if

+
    +
  1. a given block is already inserted.
  2. +
  3. a given after block is NOTE inserted yet.
  4. +
+
Source

pub fn remove_block(&mut self, block: BasicBlockId)

Remove a given block from a function. All instructions in a block are +also removed.

+
§Panics
+

Panics if

+
    +
  1. a given block is NOT inserted.
  2. +
  3. a block is the last one block in a function.
  4. +
+
Source

pub fn append_inst(&mut self, inst: InstId, block: BasicBlockId)

Appends inst to the end of a block

+
§Panics
+

Panics if

+
    +
  1. a given block is NOT inserted.
  2. +
  3. a given inst is already inserted.
  4. +
+
Source

pub fn prepend_inst(&mut self, inst: InstId, block: BasicBlockId)

Prepends inst to the beginning of a block

+
§Panics
+

Panics if

+
    +
  1. a given block is NOT inserted.
  2. +
  3. a given inst is already inserted.
  4. +
+
Source

pub fn insert_inst_before_inst(&mut self, inst: InstId, before: InstId)

Insert inst before before inst.

+
§Panics
+

Panics if

+
    +
  1. a given before is NOT inserted.
  2. +
  3. a given inst is already inserted.
  4. +
+
Source

pub fn insert_inst_after(&mut self, inst: InstId, after: InstId)

Insert inst after after inst.

+
§Panics
+

Panics if

+
    +
  1. a given after is NOT inserted.
  2. +
  3. a given inst is already inserted.
  4. +
+
Source

pub fn remove_inst(&mut self, inst: InstId)

Remove instruction from the function body.

+
§Panics
+

Panics if a given inst is not inserted.

+

Trait Implementations§

Source§

impl Clone for BodyOrder

Source§

fn clone(&self) -> BodyOrder

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BodyOrder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for BodyOrder

Source§

fn eq(&self, other: &BodyOrder) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for BodyOrder

Source§

impl StructuralPartialEq for BodyOrder

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/enum.ConstantValue.html b/compiler-docs/fe_mir/ir/constant/enum.ConstantValue.html new file mode 100644 index 0000000000..bc237784ce --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/enum.ConstantValue.html @@ -0,0 +1,26 @@ +ConstantValue in fe_mir::ir::constant - Rust

Enum ConstantValue

Source
pub enum ConstantValue {
+    Immediate(BigInt),
+    Str(SmolStr),
+    Bool(bool),
+}

Variants§

§

Immediate(BigInt)

§

Str(SmolStr)

§

Bool(bool)

Trait Implementations§

Source§

impl Clone for ConstantValue

Source§

fn clone(&self) -> ConstantValue

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstantValue

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Constant> for ConstantValue

Source§

fn from(value: Constant) -> Self

Converts to this type from the input type.
Source§

impl Hash for ConstantValue

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ConstantValue

Source§

fn eq(&self, other: &ConstantValue) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ConstantValue

Source§

impl StructuralPartialEq for ConstantValue

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/index.html b/compiler-docs/fe_mir/ir/constant/index.html new file mode 100644 index 0000000000..e2ca2ff9cf --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/index.html @@ -0,0 +1 @@ +fe_mir::ir::constant - Rust

Module constant

Source

Structs§

Constant
ConstantId
An interned Id for Constant.

Enums§

ConstantValue
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/sidebar-items.js b/compiler-docs/fe_mir/ir/constant/sidebar-items.js new file mode 100644 index 0000000000..7ae3b94cad --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["ConstantValue"],"struct":["Constant","ConstantId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/struct.Constant.html b/compiler-docs/fe_mir/ir/constant/struct.Constant.html new file mode 100644 index 0000000000..45b90e1b45 --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/struct.Constant.html @@ -0,0 +1,33 @@ +Constant in fe_mir::ir::constant - Rust

Struct Constant

Source
pub struct Constant {
+    pub name: SmolStr,
+    pub value: ConstantValue,
+    pub ty: TypeId,
+    pub module_id: ModuleId,
+    pub source: SourceInfo,
+}

Fields§

§name: SmolStr

A name of a constant.

+
§value: ConstantValue

A value of a constant.

+
§ty: TypeId

A type of a constant.

+
§module_id: ModuleId

A module where a constant is declared.

+
§source: SourceInfo

A span where a constant is declared.

+

Trait Implementations§

Source§

impl Clone for Constant

Source§

fn clone(&self) -> Constant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Constant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Constant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Constant

Source§

fn eq(&self, other: &Constant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Constant

Source§

impl StructuralPartialEq for Constant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/constant/struct.ConstantId.html b/compiler-docs/fe_mir/ir/constant/struct.ConstantId.html new file mode 100644 index 0000000000..de18db7ec9 --- /dev/null +++ b/compiler-docs/fe_mir/ir/constant/struct.ConstantId.html @@ -0,0 +1,23 @@ +ConstantId in fe_mir::ir::constant - Rust

Struct ConstantId

Source
pub struct ConstantId(/* private fields */);
Expand description

An interned Id for Constant.

+

Implementations§

Source§

impl ConstantId

Source

pub fn data(self, db: &dyn MirDb) -> Rc<Constant>

Source

pub fn ty(self, db: &dyn MirDb) -> TypeId

Trait Implementations§

Source§

impl Clone for ConstantId

Source§

fn clone(&self) -> ConstantId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstantId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ConstantId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for ConstantId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl PartialEq for ConstantId

Source§

fn eq(&self, other: &ConstantId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ConstantId

Source§

impl Eq for ConstantId

Source§

impl StructuralPartialEq for ConstantId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/enum.Linkage.html b/compiler-docs/fe_mir/ir/function/enum.Linkage.html new file mode 100644 index 0000000000..553c2b9735 --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/enum.Linkage.html @@ -0,0 +1,31 @@ +Linkage in fe_mir::ir::function - Rust

Enum Linkage

Source
pub enum Linkage {
+    Private,
+    Public,
+    Export,
+}

Variants§

§

Private

A function can only be called within the same module.

+
§

Public

A function can be called from other modules, but can NOT be called from +other accounts and transactions.

+
§

Export

A function can be called from other modules, and also can be called from +other accounts and transactions.

+

Implementations§

Trait Implementations§

Source§

impl Clone for Linkage

Source§

fn clone(&self) -> Linkage

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Linkage

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Linkage

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Linkage

Source§

fn eq(&self, other: &Linkage) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for Linkage

Source§

impl Eq for Linkage

Source§

impl StructuralPartialEq for Linkage

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/index.html b/compiler-docs/fe_mir/ir/function/index.html new file mode 100644 index 0000000000..2a9fdf35ac --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/index.html @@ -0,0 +1,3 @@ +fe_mir::ir::function - Rust

Module function

Source

Structs§

BodyDataStore
A collection of basic block, instructions and values appear in a function +body.
FunctionBody
A function body, which is not stored in salsa db to enable in-place +transformation.
FunctionId
FunctionParam
FunctionSignature
Represents function signature.

Enums§

Linkage
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/sidebar-items.js b/compiler-docs/fe_mir/ir/function/sidebar-items.js new file mode 100644 index 0000000000..e32c20ed9a --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Linkage"],"struct":["BodyDataStore","FunctionBody","FunctionId","FunctionParam","FunctionSignature"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.BodyDataStore.html b/compiler-docs/fe_mir/ir/function/struct.BodyDataStore.html new file mode 100644 index 0000000000..e836f8eba5 --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.BodyDataStore.html @@ -0,0 +1,29 @@ +BodyDataStore in fe_mir::ir::function - Rust

Struct BodyDataStore

Source
pub struct BodyDataStore { /* private fields */ }
Expand description

A collection of basic block, instructions and values appear in a function +body.

+

Implementations§

Source§

impl BodyDataStore

Source

pub fn store_inst(&mut self, inst: Inst) -> InstId

Source

pub fn inst_data(&self, inst: InstId) -> &Inst

Source

pub fn inst_data_mut(&mut self, inst: InstId) -> &mut Inst

Source

pub fn replace_inst(&mut self, inst: InstId, new: Inst) -> Inst

Source

pub fn store_value(&mut self, value: Value) -> ValueId

Source

pub fn is_nop(&self, inst: InstId) -> bool

Source

pub fn is_terminator(&self, inst: InstId) -> bool

Source

pub fn branch_info(&self, inst: InstId) -> BranchInfo<'_>

Source

pub fn value_data(&self, value: ValueId) -> &Value

Source

pub fn value_data_mut(&mut self, value: ValueId) -> &mut Value

Source

pub fn values(&self) -> impl Iterator<Item = &Value>

Source

pub fn values_mut(&mut self) -> impl Iterator<Item = &mut Value>

Source

pub fn store_block(&mut self, block: BasicBlock) -> BasicBlockId

Source

pub fn inst_result(&self, inst: InstId) -> Option<&AssignableValue>

Returns an instruction result

+
Source

pub fn map_result(&mut self, inst: InstId, result: AssignableValue)

Source

pub fn remove_inst_result(&mut self, inst: InstId) -> Option<AssignableValue>

Source

pub fn rewrite_branch_dest( + &mut self, + inst: InstId, + from: BasicBlockId, + to: BasicBlockId, +)

Source

pub fn value_ty(&self, vid: ValueId) -> TypeId

Source

pub fn locals(&self) -> &[ValueId]

Source

pub fn locals_mut(&mut self) -> &[ValueId]

Source

pub fn func_args(&self) -> impl Iterator<Item = ValueId> + '_

Source

pub fn func_args_mut(&mut self) -> impl Iterator<Item = &mut Value>

Source

pub fn local_name(&self, value: ValueId) -> Option<&str>

Returns Some(local_name) if value is Value::Local.

+
Source

pub fn replace_value(&mut self, value: ValueId, to: Value) -> Value

Trait Implementations§

Source§

impl Clone for BodyDataStore

Source§

fn clone(&self) -> BodyDataStore

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BodyDataStore

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for BodyDataStore

Source§

fn default() -> BodyDataStore

Returns the “default value” for a type. Read more
Source§

impl PartialEq for BodyDataStore

Source§

fn eq(&self, other: &BodyDataStore) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for BodyDataStore

Source§

impl StructuralPartialEq for BodyDataStore

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.FunctionBody.html b/compiler-docs/fe_mir/ir/function/struct.FunctionBody.html new file mode 100644 index 0000000000..9d9352964c --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.FunctionBody.html @@ -0,0 +1,28 @@ +FunctionBody in fe_mir::ir::function - Rust

Struct FunctionBody

Source
pub struct FunctionBody {
+    pub fid: FunctionId,
+    pub store: BodyDataStore,
+    pub order: BodyOrder,
+    pub source: SourceInfo,
+}
Expand description

A function body, which is not stored in salsa db to enable in-place +transformation.

+

Fields§

§fid: FunctionId§store: BodyDataStore§order: BodyOrder

Tracks order of basic blocks and instructions in a function body.

+
§source: SourceInfo

Implementations§

Source§

impl FunctionBody

Source

pub fn new(fid: FunctionId, source: SourceInfo) -> Self

Trait Implementations§

Source§

impl Clone for FunctionBody

Source§

fn clone(&self) -> FunctionBody

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionBody

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for FunctionBody

Source§

fn eq(&self, other: &FunctionBody) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionBody

Source§

impl StructuralPartialEq for FunctionBody

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.FunctionId.html b/compiler-docs/fe_mir/ir/function/struct.FunctionId.html new file mode 100644 index 0000000000..4b8d4f1a4d --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.FunctionId.html @@ -0,0 +1,33 @@ +FunctionId in fe_mir::ir::function - Rust

Struct FunctionId

Source
pub struct FunctionId(pub u32);

Tuple Fields§

§0: u32

Implementations§

Source§

impl FunctionId

Source

pub fn signature(self, db: &dyn MirDb) -> Rc<FunctionSignature>

Source

pub fn return_type(self, db: &dyn MirDb) -> Option<TypeId>

Source

pub fn linkage(self, db: &dyn MirDb) -> Linkage

Source

pub fn analyzer_func(self, db: &dyn MirDb) -> FunctionId

Source

pub fn body(self, db: &dyn MirDb) -> Rc<FunctionBody>

Source

pub fn module(self, db: &dyn MirDb) -> ModuleId

Source

pub fn is_contract_init(self, db: &dyn MirDb) -> bool

Source

pub fn type_suffix(&self, db: &dyn MirDb) -> SmolStr

Returns a type suffix if a generic function was monomorphized

+
Source

pub fn name(&self, db: &dyn MirDb) -> SmolStr

Source

pub fn debug_name(self, db: &dyn MirDb) -> SmolStr

Returns class_name::fn_name if a function is a method else fn_name.

+
Source

pub fn returns_aggregate(self, db: &dyn MirDb) -> bool

Trait Implementations§

Source§

impl Clone for FunctionId

Source§

fn clone(&self) -> FunctionId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for FunctionId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl Ord for FunctionId

Source§

fn cmp(&self, other: &FunctionId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for FunctionId

Source§

fn eq(&self, other: &FunctionId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for FunctionId

Source§

fn partial_cmp(&self, other: &FunctionId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for FunctionId

Source§

impl Eq for FunctionId

Source§

impl StructuralPartialEq for FunctionId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<N> NodeTrait for N
where + N: Copy + Ord + Hash,

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.FunctionParam.html b/compiler-docs/fe_mir/ir/function/struct.FunctionParam.html new file mode 100644 index 0000000000..4c7a826bd5 --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.FunctionParam.html @@ -0,0 +1,26 @@ +FunctionParam in fe_mir::ir::function - Rust

Struct FunctionParam

Source
pub struct FunctionParam {
+    pub name: SmolStr,
+    pub ty: TypeId,
+    pub source: SourceInfo,
+}

Fields§

§name: SmolStr§ty: TypeId§source: SourceInfo

Trait Implementations§

Source§

impl Clone for FunctionParam

Source§

fn clone(&self) -> FunctionParam

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionParam

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionParam

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionParam

Source§

fn eq(&self, other: &FunctionParam) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionParam

Source§

impl StructuralPartialEq for FunctionParam

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/function/struct.FunctionSignature.html b/compiler-docs/fe_mir/ir/function/struct.FunctionSignature.html new file mode 100644 index 0000000000..4d14026e65 --- /dev/null +++ b/compiler-docs/fe_mir/ir/function/struct.FunctionSignature.html @@ -0,0 +1,30 @@ +FunctionSignature in fe_mir::ir::function - Rust

Struct FunctionSignature

Source
pub struct FunctionSignature {
+    pub params: Vec<FunctionParam>,
+    pub resolved_generics: BTreeMap<SmolStr, TypeId>,
+    pub return_type: Option<TypeId>,
+    pub module_id: ModuleId,
+    pub analyzer_func_id: FunctionId,
+    pub linkage: Linkage,
+}
Expand description

Represents function signature.

+

Fields§

§params: Vec<FunctionParam>§resolved_generics: BTreeMap<SmolStr, TypeId>§return_type: Option<TypeId>§module_id: ModuleId§analyzer_func_id: FunctionId§linkage: Linkage

Trait Implementations§

Source§

impl Clone for FunctionSignature

Source§

fn clone(&self) -> FunctionSignature

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSignature

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionSignature

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionSignature

Source§

fn eq(&self, other: &FunctionSignature) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for FunctionSignature

Source§

impl StructuralPartialEq for FunctionSignature

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/index.html b/compiler-docs/fe_mir/ir/index.html new file mode 100644 index 0000000000..438c527979 --- /dev/null +++ b/compiler-docs/fe_mir/ir/index.html @@ -0,0 +1,3 @@ +fe_mir::ir - Rust

Module ir

Source

Re-exports§

pub use basic_block::BasicBlock;
pub use basic_block::BasicBlockId;
pub use constant::Constant;
pub use constant::ConstantId;
pub use function::FunctionBody;
pub use function::FunctionId;
pub use function::FunctionParam;
pub use function::FunctionSignature;
pub use inst::Inst;
pub use inst::InstId;
pub use types::Type;
pub use types::TypeId;
pub use types::TypeKind;
pub use value::Value;
pub use value::ValueId;

Modules§

basic_block
body_builder
body_cursor
This module provides a collection of structs to modify function body +in-place.
body_order
constant
function
inst
types
value

Structs§

SourceInfo
An original source information that indicates where mir entities derive +from. SourceInfo is mainly used for diagnostics.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.BinOp.html b/compiler-docs/fe_mir/ir/inst/enum.BinOp.html new file mode 100644 index 0000000000..cd8f2e668f --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.BinOp.html @@ -0,0 +1,43 @@ +BinOp in fe_mir::ir::inst - Rust

Enum BinOp

Source
pub enum BinOp {
+
Show 19 variants Add, + Sub, + Mul, + Div, + Mod, + Pow, + Shl, + Shr, + BitOr, + BitXor, + BitAnd, + LogicalAnd, + LogicalOr, + Eq, + Ne, + Ge, + Gt, + Le, + Lt, +
}

Variants§

§

Add

§

Sub

§

Mul

§

Div

§

Mod

§

Pow

§

Shl

§

Shr

§

BitOr

§

BitXor

§

BitAnd

§

LogicalAnd

§

LogicalOr

§

Eq

§

Ne

§

Ge

§

Gt

§

Le

§

Lt

Trait Implementations§

Source§

impl Clone for BinOp

Source§

fn clone(&self) -> BinOp

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BinOp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for BinOp

Source§

fn fmt(&self, w: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for BinOp

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for BinOp

Source§

fn eq(&self, other: &BinOp) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for BinOp

Source§

impl Eq for BinOp

Source§

impl StructuralPartialEq for BinOp

Auto Trait Implementations§

§

impl Freeze for BinOp

§

impl RefUnwindSafe for BinOp

§

impl Send for BinOp

§

impl Sync for BinOp

§

impl Unpin for BinOp

§

impl UnwindSafe for BinOp

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.BranchInfo.html b/compiler-docs/fe_mir/ir/inst/enum.BranchInfo.html new file mode 100644 index 0000000000..3484beccf7 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.BranchInfo.html @@ -0,0 +1,16 @@ +BranchInfo in fe_mir::ir::inst - Rust

Enum BranchInfo

Source
pub enum BranchInfo<'a> {
+    NotBranch,
+    Jump(BasicBlockId),
+    Branch(ValueId, BasicBlockId, BasicBlockId),
+    Switch(ValueId, &'a SwitchTable, Option<BasicBlockId>),
+}

Variants§

Implementations§

Source§

impl<'a> BranchInfo<'a>

Source

pub fn is_not_a_branch(&self) -> bool

Source

pub fn block_iter(&self) -> BlockIter<'_>

Auto Trait Implementations§

§

impl<'a> Freeze for BranchInfo<'a>

§

impl<'a> RefUnwindSafe for BranchInfo<'a>

§

impl<'a> Send for BranchInfo<'a>

§

impl<'a> Sync for BranchInfo<'a>

§

impl<'a> Unpin for BranchInfo<'a>

§

impl<'a> UnwindSafe for BranchInfo<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.CallType.html b/compiler-docs/fe_mir/ir/inst/enum.CallType.html new file mode 100644 index 0000000000..3d699b305d --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.CallType.html @@ -0,0 +1,26 @@ +CallType in fe_mir::ir::inst - Rust

Enum CallType

Source
pub enum CallType {
+    Internal,
+    External,
+}

Variants§

§

Internal

§

External

Trait Implementations§

Source§

impl Clone for CallType

Source§

fn clone(&self) -> CallType

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CallType

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for CallType

Source§

fn fmt(&self, w: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CallType

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CallType

Source§

fn eq(&self, other: &CallType) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for CallType

Source§

impl Eq for CallType

Source§

impl StructuralPartialEq for CallType

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.CastKind.html b/compiler-docs/fe_mir/ir/inst/enum.CastKind.html new file mode 100644 index 0000000000..0dc34b1ebc --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.CastKind.html @@ -0,0 +1,27 @@ +CastKind in fe_mir::ir::inst - Rust

Enum CastKind

Source
pub enum CastKind {
+    Primitive,
+    Untag,
+}

Variants§

§

Primitive

A cast from a primitive type to a primitive type.

+
§

Untag

A cast from an enum type to its underlying type.

+

Trait Implementations§

Source§

impl Clone for CastKind

Source§

fn clone(&self) -> CastKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CastKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CastKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CastKind

Source§

fn eq(&self, other: &CastKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for CastKind

Source§

impl StructuralPartialEq for CastKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.InstKind.html b/compiler-docs/fe_mir/ir/inst/enum.InstKind.html new file mode 100644 index 0000000000..8612818ed4 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.InstKind.html @@ -0,0 +1,121 @@ +InstKind in fe_mir::ir::inst - Rust

Enum InstKind

Source
pub enum InstKind {
+
Show 23 variants Declare { + local: ValueId, + }, + Unary { + op: UnOp, + value: ValueId, + }, + Binary { + op: BinOp, + lhs: ValueId, + rhs: ValueId, + }, + Cast { + kind: CastKind, + value: ValueId, + to: TypeId, + }, + AggregateConstruct { + ty: TypeId, + args: Vec<ValueId>, + }, + Bind { + src: ValueId, + }, + MemCopy { + src: ValueId, + }, + Load { + src: ValueId, + }, + AggregateAccess { + value: ValueId, + indices: Vec<ValueId>, + }, + MapAccess { + key: ValueId, + value: ValueId, + }, + Call { + func: FunctionId, + args: Vec<ValueId>, + call_type: CallType, + }, + Jump { + dest: BasicBlockId, + }, + Branch { + cond: ValueId, + then: BasicBlockId, + else_: BasicBlockId, + }, + Switch { + disc: ValueId, + table: SwitchTable, + default: Option<BasicBlockId>, + }, + Revert { + arg: Option<ValueId>, + }, + Emit { + arg: ValueId, + }, + Return { + arg: Option<ValueId>, + }, + Keccak256 { + arg: ValueId, + }, + AbiEncode { + arg: ValueId, + }, + Nop, + Create { + value: ValueId, + contract: ContractId, + }, + Create2 { + value: ValueId, + salt: ValueId, + contract: ContractId, + }, + YulIntrinsic { + op: YulIntrinsicOp, + args: Vec<ValueId>, + }, +
}

Variants§

§

Declare

This is not a real instruction, just used to tag a position where a +local is declared.

+

Fields

§local: ValueId
§

Unary

Unary instruction.

+

Fields

§op: UnOp
§value: ValueId
§

Binary

Binary instruction.

+

Fields

§

Cast

Fields

§value: ValueId
§

AggregateConstruct

Constructs aggregate value, i.e. struct, tuple and array.

+

Fields

§args: Vec<ValueId>
§

Bind

Fields

§

MemCopy

Fields

§

Load

Load a primitive value from a ptr

+

Fields

§

AggregateAccess

Access to aggregate fields or elements.

+

§Example

struct Foo:
+    x: i32
+    y: Array<i32, 8>
+

foo.y is lowered into `AggregateAccess(foo, [1])’ for example.

+

Fields

§value: ValueId
§indices: Vec<ValueId>
§

MapAccess

Fields

§value: ValueId
§

Call

Fields

§args: Vec<ValueId>
§call_type: CallType
§

Jump

Unconditional jump instruction.

+

Fields

§

Branch

Conditional branching instruction.

+

Fields

§cond: ValueId
§

Switch

Fields

§disc: ValueId
§

Revert

Fields

§

Emit

Fields

§

Return

Fields

§

Keccak256

Fields

§

AbiEncode

Fields

§

Nop

§

Create

Fields

§value: ValueId
§contract: ContractId
§

Create2

Fields

§value: ValueId
§salt: ValueId
§contract: ContractId
§

YulIntrinsic

Trait Implementations§

Source§

impl Clone for InstKind

Source§

fn clone(&self) -> InstKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for InstKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for InstKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for InstKind

Source§

fn eq(&self, other: &InstKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for InstKind

Source§

impl StructuralPartialEq for InstKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.IterBase.html b/compiler-docs/fe_mir/ir/inst/enum.IterBase.html new file mode 100644 index 0000000000..41791364cd --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.IterBase.html @@ -0,0 +1,231 @@ +IterBase in fe_mir::ir::inst - Rust

Enum IterBase

Source
pub enum IterBase<'a, T> {
+    Zero,
+    One(Option<T>),
+    Slice(Iter<'a, T>),
+    Chain(Box<IterBase<'a, T>>, Box<IterBase<'a, T>>),
+}

Variants§

§

Zero

§

One(Option<T>)

§

Slice(Iter<'a, T>)

§

Chain(Box<IterBase<'a, T>>, Box<IterBase<'a, T>>)

Trait Implementations§

Source§

impl<'a, T> Iterator for IterBase<'a, T>
where + T: Copy,

Source§

type Item = T

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where + Self: Sized, + Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( + &mut self, +) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where + Self: Sized, + Self::Item: Try, + <Self::Item as Try>::Residual: Residual<B>, + B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if +a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a, T> Freeze for IterBase<'a, T>
where + T: Freeze,

§

impl<'a, T> RefUnwindSafe for IterBase<'a, T>
where + T: RefUnwindSafe,

§

impl<'a, T> Send for IterBase<'a, T>
where + T: Send + Sync,

§

impl<'a, T> Sync for IterBase<'a, T>
where + T: Sync,

§

impl<'a, T> Unpin for IterBase<'a, T>
where + T: Unpin,

§

impl<'a, T> UnwindSafe for IterBase<'a, T>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<I> UnicodeNormalization<I> for I
where + I: Iterator<Item = char>,

§

fn nfd(self) -> Decompositions<I>

Returns an iterator over the string in Unicode Normalization Form D +(canonical decomposition).
§

fn nfkd(self) -> Decompositions<I>

Returns an iterator over the string in Unicode Normalization Form KD +(compatibility decomposition).
§

fn nfc(self) -> Recompositions<I>

An Iterator over the string in Unicode Normalization Form C +(canonical decomposition followed by canonical composition).
§

fn nfkc(self) -> Recompositions<I>

An Iterator over the string in Unicode Normalization Form KC +(compatibility decomposition followed by canonical composition).
§

fn cjk_compat_variants(self) -> Replacements<I>

A transformation which replaces CJK Compatibility Ideograph codepoints +with normal forms using Standardized Variation Sequences. This is not +part of the canonical or compatibility decomposition algorithms, but +performing it before those algorithms produces normalized output which +better preserves the intent of the original text. Read more
§

fn stream_safe(self) -> StreamSafe<I>

An Iterator over the string with Conjoining Grapheme Joiner characters +inserted according to the Stream-Safe Text Process (UAX15-D4)
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.IterMutBase.html b/compiler-docs/fe_mir/ir/inst/enum.IterMutBase.html new file mode 100644 index 0000000000..8640746894 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.IterMutBase.html @@ -0,0 +1,217 @@ +IterMutBase in fe_mir::ir::inst - Rust

Enum IterMutBase

Source
pub enum IterMutBase<'a, T> {
+    Zero,
+    One(Option<&'a mut T>),
+    Slice(IterMut<'a, T>),
+    Chain(Box<IterMutBase<'a, T>>, Box<IterMutBase<'a, T>>),
+}

Variants§

§

Zero

§

One(Option<&'a mut T>)

§

Slice(IterMut<'a, T>)

§

Chain(Box<IterMutBase<'a, T>>, Box<IterMutBase<'a, T>>)

Trait Implementations§

Source§

impl<'a, T> Iterator for IterMutBase<'a, T>

Source§

type Item = &'a mut T

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where + Self: Sized, + Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>( + &mut self, +) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where + Self: Sized, + Self::Item: Try, + <Self::Item as Try>::Residual: Residual<B>, + B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if +a failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where + Self: Sized, + Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where + I: IntoIterator<Item = Self::Item>, + Self::Item: Ord, + Self: Sized,

Lexicographically compares the elements of this Iterator with those +of another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where + Self: Sized, + Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a, T> Freeze for IterMutBase<'a, T>

§

impl<'a, T> RefUnwindSafe for IterMutBase<'a, T>
where + T: RefUnwindSafe,

§

impl<'a, T> Send for IterMutBase<'a, T>
where + T: Send,

§

impl<'a, T> Sync for IterMutBase<'a, T>
where + T: Sync,

§

impl<'a, T> Unpin for IterMutBase<'a, T>

§

impl<'a, T> !UnwindSafe for IterMutBase<'a, T>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.UnOp.html b/compiler-docs/fe_mir/ir/inst/enum.UnOp.html new file mode 100644 index 0000000000..b24b67c0f2 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.UnOp.html @@ -0,0 +1,30 @@ +UnOp in fe_mir::ir::inst - Rust

Enum UnOp

Source
pub enum UnOp {
+    Not,
+    Neg,
+    Inv,
+}

Variants§

§

Not

not operator for logical inversion.

+
§

Neg

- operator for negation.

+
§

Inv

~ operator for bitwise inversion.

+

Trait Implementations§

Source§

impl Clone for UnOp

Source§

fn clone(&self) -> UnOp

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UnOp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for UnOp

Source§

fn fmt(&self, w: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for UnOp

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for UnOp

Source§

fn eq(&self, other: &UnOp) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for UnOp

Source§

impl Eq for UnOp

Source§

impl StructuralPartialEq for UnOp

Auto Trait Implementations§

§

impl Freeze for UnOp

§

impl RefUnwindSafe for UnOp

§

impl Send for UnOp

§

impl Sync for UnOp

§

impl Unpin for UnOp

§

impl UnwindSafe for UnOp

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/enum.YulIntrinsicOp.html b/compiler-docs/fe_mir/ir/inst/enum.YulIntrinsicOp.html new file mode 100644 index 0000000000..883b83d9dc --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/enum.YulIntrinsicOp.html @@ -0,0 +1,100 @@ +YulIntrinsicOp in fe_mir::ir::inst - Rust

Enum YulIntrinsicOp

Source
pub enum YulIntrinsicOp {
+
Show 76 variants Stop, + Add, + Sub, + Mul, + Div, + Sdiv, + Mod, + Smod, + Exp, + Not, + Lt, + Gt, + Slt, + Sgt, + Eq, + Iszero, + And, + Or, + Xor, + Byte, + Shl, + Shr, + Sar, + Addmod, + Mulmod, + Signextend, + Keccak256, + Pc, + Pop, + Mload, + Mstore, + Mstore8, + Sload, + Sstore, + Msize, + Gas, + Address, + Balance, + Selfbalance, + Caller, + Callvalue, + Calldataload, + Calldatasize, + Calldatacopy, + Codesize, + Codecopy, + Extcodesize, + Extcodecopy, + Returndatasize, + Returndatacopy, + Extcodehash, + Create, + Create2, + Call, + Callcode, + Delegatecall, + Staticcall, + Return, + Revert, + Selfdestruct, + Invalid, + Log0, + Log1, + Log2, + Log3, + Log4, + Chainid, + Basefee, + Origin, + Gasprice, + Blockhash, + Coinbase, + Timestamp, + Number, + Prevrandao, + Gaslimit, +
}

Variants§

§

Stop

§

Add

§

Sub

§

Mul

§

Div

§

Sdiv

§

Mod

§

Smod

§

Exp

§

Not

§

Lt

§

Gt

§

Slt

§

Sgt

§

Eq

§

Iszero

§

And

§

Or

§

Xor

§

Byte

§

Shl

§

Shr

§

Sar

§

Addmod

§

Mulmod

§

Signextend

§

Keccak256

§

Pc

§

Pop

§

Mload

§

Mstore

§

Mstore8

§

Sload

§

Sstore

§

Msize

§

Gas

§

Address

§

Balance

§

Selfbalance

§

Caller

§

Callvalue

§

Calldataload

§

Calldatasize

§

Calldatacopy

§

Codesize

§

Codecopy

§

Extcodesize

§

Extcodecopy

§

Returndatasize

§

Returndatacopy

§

Extcodehash

§

Create

§

Create2

§

Call

§

Callcode

§

Delegatecall

§

Staticcall

§

Return

§

Revert

§

Selfdestruct

§

Invalid

§

Log0

§

Log1

§

Log2

§

Log3

§

Log4

§

Chainid

§

Basefee

§

Origin

§

Gasprice

§

Blockhash

§

Coinbase

§

Timestamp

§

Number

§

Prevrandao

§

Gaslimit

Implementations§

Trait Implementations§

Source§

impl Clone for YulIntrinsicOp

Source§

fn clone(&self) -> YulIntrinsicOp

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for YulIntrinsicOp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for YulIntrinsicOp

Source§

fn fmt(&self, w: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Intrinsic> for YulIntrinsicOp

Source§

fn from(val: Intrinsic) -> Self

Converts to this type from the input type.
Source§

impl Hash for YulIntrinsicOp

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for YulIntrinsicOp

Source§

fn eq(&self, other: &YulIntrinsicOp) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for YulIntrinsicOp

Source§

impl Eq for YulIntrinsicOp

Source§

impl StructuralPartialEq for YulIntrinsicOp

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/index.html b/compiler-docs/fe_mir/ir/inst/index.html new file mode 100644 index 0000000000..4a6cd9608e --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/index.html @@ -0,0 +1 @@ +fe_mir::ir::inst - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/sidebar-items.js b/compiler-docs/fe_mir/ir/inst/sidebar-items.js new file mode 100644 index 0000000000..f72b94ba31 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["BinOp","BranchInfo","CallType","CastKind","InstKind","IterBase","IterMutBase","UnOp","YulIntrinsicOp"],"struct":["Inst","SwitchTable"],"type":["BlockIter","InstId","ValueIter","ValueIterMut"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/struct.Inst.html b/compiler-docs/fe_mir/ir/inst/struct.Inst.html new file mode 100644 index 0000000000..9b5bbf4781 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/struct.Inst.html @@ -0,0 +1,29 @@ +Inst in fe_mir::ir::inst - Rust

Struct Inst

Source
pub struct Inst {
+    pub kind: InstKind,
+    pub source: SourceInfo,
+}

Fields§

§kind: InstKind§source: SourceInfo

Implementations§

Source§

impl Inst

Source

pub fn new(kind: InstKind, source: SourceInfo) -> Self

Source

pub fn unary(op: UnOp, value: ValueId, source: SourceInfo) -> Self

Source

pub fn binary(op: BinOp, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> Self

Source

pub fn intrinsic( + op: YulIntrinsicOp, + args: Vec<ValueId>, + source: SourceInfo, +) -> Self

Source

pub fn nop() -> Self

Source

pub fn is_terminator(&self) -> bool

Source

pub fn branch_info(&self) -> BranchInfo<'_>

Source

pub fn args(&self) -> ValueIter<'_>

Source

pub fn args_mut(&mut self) -> ValueIterMut<'_>

Trait Implementations§

Source§

impl Clone for Inst

Source§

fn clone(&self) -> Inst

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Inst

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Inst

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Inst

Source§

fn eq(&self, other: &Inst) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Inst

Source§

impl StructuralPartialEq for Inst

Auto Trait Implementations§

§

impl Freeze for Inst

§

impl RefUnwindSafe for Inst

§

impl Send for Inst

§

impl Sync for Inst

§

impl Unpin for Inst

§

impl UnwindSafe for Inst

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/struct.SwitchTable.html b/compiler-docs/fe_mir/ir/inst/struct.SwitchTable.html new file mode 100644 index 0000000000..3071dfba42 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/struct.SwitchTable.html @@ -0,0 +1,22 @@ +SwitchTable in fe_mir::ir::inst - Rust

Struct SwitchTable

Source
pub struct SwitchTable { /* private fields */ }

Implementations§

Source§

impl SwitchTable

Source

pub fn iter(&self) -> impl Iterator<Item = (ValueId, BasicBlockId)> + '_

Source

pub fn len(&self) -> usize

Source

pub fn is_empty(&self) -> bool

Source

pub fn add_arm(&mut self, value: ValueId, block: BasicBlockId)

Trait Implementations§

Source§

impl Clone for SwitchTable

Source§

fn clone(&self) -> SwitchTable

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SwitchTable

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SwitchTable

Source§

fn default() -> SwitchTable

Returns the “default value” for a type. Read more
Source§

impl Hash for SwitchTable

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SwitchTable

Source§

fn eq(&self, other: &SwitchTable) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SwitchTable

Source§

impl StructuralPartialEq for SwitchTable

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/type.BlockIter.html b/compiler-docs/fe_mir/ir/inst/type.BlockIter.html new file mode 100644 index 0000000000..1c1ad8ce80 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/type.BlockIter.html @@ -0,0 +1,6 @@ +BlockIter in fe_mir::ir::inst - Rust

Type Alias BlockIter

Source
pub type BlockIter<'a> = IterBase<'a, BasicBlockId>;

Aliased Type§

pub enum BlockIter<'a> {
+    Zero,
+    One(Option<Id<BasicBlock>>),
+    Slice(Iter<'a, Id<BasicBlock>>),
+    Chain(Box<IterBase<'a, Id<BasicBlock>>>, Box<IterBase<'a, Id<BasicBlock>>>),
+}

Variants§

§

Zero

§

One(Option<Id<BasicBlock>>)

§

Slice(Iter<'a, Id<BasicBlock>>)

§

Chain(Box<IterBase<'a, Id<BasicBlock>>>, Box<IterBase<'a, Id<BasicBlock>>>)

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/type.InstId.html b/compiler-docs/fe_mir/ir/inst/type.InstId.html new file mode 100644 index 0000000000..7152f8541f --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/type.InstId.html @@ -0,0 +1,6 @@ +InstId in fe_mir::ir::inst - Rust

Type Alias InstId

Source
pub type InstId = Id<Inst>;

Aliased Type§

pub struct InstId { /* private fields */ }

Trait Implementations§

Source§

impl PrettyPrint for InstId

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Source§

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/type.ValueIter.html b/compiler-docs/fe_mir/ir/inst/type.ValueIter.html new file mode 100644 index 0000000000..81e3541d29 --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/type.ValueIter.html @@ -0,0 +1,6 @@ +ValueIter in fe_mir::ir::inst - Rust

Type Alias ValueIter

Source
pub type ValueIter<'a> = IterBase<'a, ValueId>;

Aliased Type§

pub enum ValueIter<'a> {
+    Zero,
+    One(Option<Id<Value>>),
+    Slice(Iter<'a, Id<Value>>),
+    Chain(Box<IterBase<'a, Id<Value>>>, Box<IterBase<'a, Id<Value>>>),
+}

Variants§

§

Zero

§

One(Option<Id<Value>>)

§

Slice(Iter<'a, Id<Value>>)

§

Chain(Box<IterBase<'a, Id<Value>>>, Box<IterBase<'a, Id<Value>>>)

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/inst/type.ValueIterMut.html b/compiler-docs/fe_mir/ir/inst/type.ValueIterMut.html new file mode 100644 index 0000000000..a72b8711ec --- /dev/null +++ b/compiler-docs/fe_mir/ir/inst/type.ValueIterMut.html @@ -0,0 +1,6 @@ +ValueIterMut in fe_mir::ir::inst - Rust

Type Alias ValueIterMut

Source
pub type ValueIterMut<'a> = IterMutBase<'a, ValueId>;

Aliased Type§

pub enum ValueIterMut<'a> {
+    Zero,
+    One(Option<&'a mut Id<Value>>),
+    Slice(IterMut<'a, Id<Value>>),
+    Chain(Box<IterMutBase<'a, Id<Value>>>, Box<IterMutBase<'a, Id<Value>>>),
+}

Variants§

§

Zero

§

One(Option<&'a mut Id<Value>>)

§

Slice(IterMut<'a, Id<Value>>)

§

Chain(Box<IterMutBase<'a, Id<Value>>>, Box<IterMutBase<'a, Id<Value>>>)

\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/sidebar-items.js b/compiler-docs/fe_mir/ir/sidebar-items.js new file mode 100644 index 0000000000..5e2dfdb31f --- /dev/null +++ b/compiler-docs/fe_mir/ir/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["basic_block","body_builder","body_cursor","body_order","constant","function","inst","types","value"],"struct":["SourceInfo"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/struct.SourceInfo.html b/compiler-docs/fe_mir/ir/struct.SourceInfo.html new file mode 100644 index 0000000000..82ddf8ca66 --- /dev/null +++ b/compiler-docs/fe_mir/ir/struct.SourceInfo.html @@ -0,0 +1,27 @@ +SourceInfo in fe_mir::ir - Rust

Struct SourceInfo

Source
pub struct SourceInfo {
+    pub span: Span,
+    pub id: NodeId,
+}
Expand description

An original source information that indicates where mir entities derive +from. SourceInfo is mainly used for diagnostics.

+

Fields§

§span: Span§id: NodeId

Implementations§

Source§

impl SourceInfo

Source

pub fn dummy() -> Self

Source

pub fn is_dummy(&self) -> bool

Trait Implementations§

Source§

impl Clone for SourceInfo

Source§

fn clone(&self) -> SourceInfo

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SourceInfo

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> From<&Node<T>> for SourceInfo

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl Hash for SourceInfo

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for SourceInfo

Source§

fn eq(&self, other: &SourceInfo) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for SourceInfo

Source§

impl StructuralPartialEq for SourceInfo

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/enum.TypeKind.html b/compiler-docs/fe_mir/ir/types/enum.TypeKind.html new file mode 100644 index 0000000000..677e0cf1e6 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/enum.TypeKind.html @@ -0,0 +1,47 @@ +TypeKind in fe_mir::ir::types - Rust

Enum TypeKind

Source
pub enum TypeKind {
+
Show 24 variants I8, + I16, + I32, + I64, + I128, + I256, + U8, + U16, + U32, + U64, + U128, + U256, + Bool, + Address, + Unit, + Array(ArrayDef), + String(usize), + Tuple(TupleDef), + Struct(StructDef), + Enum(EnumDef), + Contract(StructDef), + Map(MapDef), + MPtr(TypeId), + SPtr(TypeId), +
}

Variants§

§

I8

§

I16

§

I32

§

I64

§

I128

§

I256

§

U8

§

U16

§

U32

§

U64

§

U128

§

U256

§

Bool

§

Address

§

Unit

§

Array(ArrayDef)

§

String(usize)

§

Tuple(TupleDef)

§

Struct(StructDef)

§

Enum(EnumDef)

§

Contract(StructDef)

§

Map(MapDef)

§

MPtr(TypeId)

§

SPtr(TypeId)

Trait Implementations§

Source§

impl Clone for TypeKind

Source§

fn clone(&self) -> TypeKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeKind

Source§

fn eq(&self, other: &TypeKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TypeKind

Source§

impl StructuralPartialEq for TypeKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/index.html b/compiler-docs/fe_mir/ir/types/index.html new file mode 100644 index 0000000000..8c3e161750 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/index.html @@ -0,0 +1 @@ +fe_mir::ir::types - Rust

Module types

Source

Structs§

ArrayDef
A static array type definition.
EnumDef
A user defined struct type definition.
EnumVariant
A user defined struct type definition.
EventDef
A user defined struct type definition.
MapDef
A map type definition.
StructDef
A user defined struct type definition.
TupleDef
A tuple type definition.
Type
TypeId
An interned Id for ArrayDef.

Enums§

TypeKind
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/sidebar-items.js b/compiler-docs/fe_mir/ir/types/sidebar-items.js new file mode 100644 index 0000000000..24bf659759 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["TypeKind"],"struct":["ArrayDef","EnumDef","EnumVariant","EventDef","MapDef","StructDef","TupleDef","Type","TypeId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.ArrayDef.html b/compiler-docs/fe_mir/ir/types/struct.ArrayDef.html new file mode 100644 index 0000000000..82f1d0056c --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.ArrayDef.html @@ -0,0 +1,26 @@ +ArrayDef in fe_mir::ir::types - Rust

Struct ArrayDef

Source
pub struct ArrayDef {
+    pub elem_ty: TypeId,
+    pub len: usize,
+}
Expand description

A static array type definition.

+

Fields§

§elem_ty: TypeId§len: usize

Trait Implementations§

Source§

impl Clone for ArrayDef

Source§

fn clone(&self) -> ArrayDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ArrayDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ArrayDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ArrayDef

Source§

fn eq(&self, other: &ArrayDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for ArrayDef

Source§

impl StructuralPartialEq for ArrayDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.EnumDef.html b/compiler-docs/fe_mir/ir/types/struct.EnumDef.html new file mode 100644 index 0000000000..af353cb3e8 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.EnumDef.html @@ -0,0 +1,28 @@ +EnumDef in fe_mir::ir::types - Rust

Struct EnumDef

Source
pub struct EnumDef {
+    pub name: SmolStr,
+    pub variants: Vec<EnumVariant>,
+    pub span: Span,
+    pub module_id: ModuleId,
+}
Expand description

A user defined struct type definition.

+

Fields§

§name: SmolStr§variants: Vec<EnumVariant>§span: Span§module_id: ModuleId

Implementations§

Trait Implementations§

Source§

impl Clone for EnumDef

Source§

fn clone(&self) -> EnumDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EnumDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EnumDef

Source§

fn eq(&self, other: &EnumDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EnumDef

Source§

impl StructuralPartialEq for EnumDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.EnumVariant.html b/compiler-docs/fe_mir/ir/types/struct.EnumVariant.html new file mode 100644 index 0000000000..50b5790432 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.EnumVariant.html @@ -0,0 +1,27 @@ +EnumVariant in fe_mir::ir::types - Rust

Struct EnumVariant

Source
pub struct EnumVariant {
+    pub name: SmolStr,
+    pub span: Span,
+    pub ty: TypeId,
+}
Expand description

A user defined struct type definition.

+

Fields§

§name: SmolStr§span: Span§ty: TypeId

Trait Implementations§

Source§

impl Clone for EnumVariant

Source§

fn clone(&self) -> EnumVariant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EnumVariant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EnumVariant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EnumVariant

Source§

fn eq(&self, other: &EnumVariant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EnumVariant

Source§

impl StructuralPartialEq for EnumVariant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.EventDef.html b/compiler-docs/fe_mir/ir/types/struct.EventDef.html new file mode 100644 index 0000000000..3c7f5b75d2 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.EventDef.html @@ -0,0 +1,28 @@ +EventDef in fe_mir::ir::types - Rust

Struct EventDef

Source
pub struct EventDef {
+    pub name: SmolStr,
+    pub fields: Vec<(SmolStr, TypeId, bool)>,
+    pub span: Span,
+    pub module_id: ModuleId,
+}
Expand description

A user defined struct type definition.

+

Fields§

§name: SmolStr§fields: Vec<(SmolStr, TypeId, bool)>§span: Span§module_id: ModuleId

Trait Implementations§

Source§

impl Clone for EventDef

Source§

fn clone(&self) -> EventDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for EventDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for EventDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for EventDef

Source§

fn eq(&self, other: &EventDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for EventDef

Source§

impl StructuralPartialEq for EventDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.MapDef.html b/compiler-docs/fe_mir/ir/types/struct.MapDef.html new file mode 100644 index 0000000000..fd17e2f578 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.MapDef.html @@ -0,0 +1,26 @@ +MapDef in fe_mir::ir::types - Rust

Struct MapDef

Source
pub struct MapDef {
+    pub key_ty: TypeId,
+    pub value_ty: TypeId,
+}
Expand description

A map type definition.

+

Fields§

§key_ty: TypeId§value_ty: TypeId

Trait Implementations§

Source§

impl Clone for MapDef

Source§

fn clone(&self) -> MapDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MapDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for MapDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for MapDef

Source§

fn eq(&self, other: &MapDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for MapDef

Source§

impl Eq for MapDef

Source§

impl StructuralPartialEq for MapDef

Auto Trait Implementations§

§

impl Freeze for MapDef

§

impl RefUnwindSafe for MapDef

§

impl Send for MapDef

§

impl Sync for MapDef

§

impl Unpin for MapDef

§

impl UnwindSafe for MapDef

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.StructDef.html b/compiler-docs/fe_mir/ir/types/struct.StructDef.html new file mode 100644 index 0000000000..1664da5800 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.StructDef.html @@ -0,0 +1,28 @@ +StructDef in fe_mir::ir::types - Rust

Struct StructDef

Source
pub struct StructDef {
+    pub name: SmolStr,
+    pub fields: Vec<(SmolStr, TypeId)>,
+    pub span: Span,
+    pub module_id: ModuleId,
+}
Expand description

A user defined struct type definition.

+

Fields§

§name: SmolStr§fields: Vec<(SmolStr, TypeId)>§span: Span§module_id: ModuleId

Trait Implementations§

Source§

impl Clone for StructDef

Source§

fn clone(&self) -> StructDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for StructDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for StructDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for StructDef

Source§

fn eq(&self, other: &StructDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for StructDef

Source§

impl StructuralPartialEq for StructDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.TupleDef.html b/compiler-docs/fe_mir/ir/types/struct.TupleDef.html new file mode 100644 index 0000000000..5e7d3484ad --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.TupleDef.html @@ -0,0 +1,25 @@ +TupleDef in fe_mir::ir::types - Rust

Struct TupleDef

Source
pub struct TupleDef {
+    pub items: Vec<TypeId>,
+}
Expand description

A tuple type definition.

+

Fields§

§items: Vec<TypeId>

Trait Implementations§

Source§

impl Clone for TupleDef

Source§

fn clone(&self) -> TupleDef

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TupleDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TupleDef

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TupleDef

Source§

fn eq(&self, other: &TupleDef) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for TupleDef

Source§

impl StructuralPartialEq for TupleDef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.Type.html b/compiler-docs/fe_mir/ir/types/struct.Type.html new file mode 100644 index 0000000000..59809d8347 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.Type.html @@ -0,0 +1,25 @@ +Type in fe_mir::ir::types - Rust

Struct Type

Source
pub struct Type {
+    pub kind: TypeKind,
+    pub analyzer_ty: Option<TypeId>,
+}

Fields§

§kind: TypeKind§analyzer_ty: Option<TypeId>

Implementations§

Source§

impl Type

Source

pub fn new(kind: TypeKind, analyzer_ty: Option<TypeId>) -> Self

Trait Implementations§

Source§

impl Clone for Type

Source§

fn clone(&self) -> Type

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Type

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Type

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Type

Source§

fn eq(&self, other: &Type) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Type

Source§

impl StructuralPartialEq for Type

Auto Trait Implementations§

§

impl Freeze for Type

§

impl RefUnwindSafe for Type

§

impl Send for Type

§

impl Sync for Type

§

impl Unpin for Type

§

impl UnwindSafe for Type

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/types/struct.TypeId.html b/compiler-docs/fe_mir/ir/types/struct.TypeId.html new file mode 100644 index 0000000000..d2f7c80ac8 --- /dev/null +++ b/compiler-docs/fe_mir/ir/types/struct.TypeId.html @@ -0,0 +1,40 @@ +TypeId in fe_mir::ir::types - Rust

Struct TypeId

Source
pub struct TypeId(pub u32);
Expand description

An interned Id for ArrayDef.

+

Tuple Fields§

§0: u32

Implementations§

Source§

impl TypeId

Source

pub fn data(self, db: &dyn MirDb) -> Rc<Type>

Source

pub fn analyzer_ty(self, db: &dyn MirDb) -> Option<TypeId>

Source

pub fn projection_ty(self, db: &dyn MirDb, access: &Value) -> TypeId

Source

pub fn deref(self, db: &dyn MirDb) -> TypeId

Source

pub fn make_sptr(self, db: &dyn MirDb) -> TypeId

Source

pub fn make_mptr(self, db: &dyn MirDb) -> TypeId

Source

pub fn projection_ty_imm(self, db: &dyn MirDb, index: usize) -> TypeId

Source

pub fn aggregate_field_num(self, db: &dyn MirDb) -> usize

Source

pub fn enum_disc_type(self, db: &dyn MirDb) -> TypeId

Source

pub fn enum_data_offset(self, db: &dyn MirDb, slot_size: usize) -> usize

Source

pub fn enum_variant_type( + self, + db: &dyn MirDb, + variant_id: EnumVariantId, +) -> TypeId

Source

pub fn index_from_fname(self, db: &dyn MirDb, fname: &str) -> BigInt

Source

pub fn is_primitive(self, db: &dyn MirDb) -> bool

Source

pub fn is_integral(self, db: &dyn MirDb) -> bool

Source

pub fn is_address(self, db: &dyn MirDb) -> bool

Source

pub fn is_unit(self, db: &dyn MirDb) -> bool

Source

pub fn is_enum(self, db: &dyn MirDb) -> bool

Source

pub fn is_signed(self, db: &dyn MirDb) -> bool

Source

pub fn size_of(self, db: &dyn MirDb, slot_size: usize) -> usize

Returns size of the type in bytes.

+
Source

pub fn is_zero_sized(self, db: &dyn MirDb) -> bool

Source

pub fn align_of(self, db: &dyn MirDb, slot_size: usize) -> usize

Source

pub fn aggregate_elem_offset<T>( + self, + db: &dyn MirDb, + elem_idx: T, + slot_size: usize, +) -> usize
where + T: ToPrimitive,

Returns an offset of the element of aggregate type.

+
Source

pub fn is_aggregate(self, db: &dyn MirDb) -> bool

Source

pub fn is_struct(self, db: &dyn MirDb) -> bool

Source

pub fn is_array(self, db: &dyn MirDb) -> bool

Source

pub fn is_string(self, db: &dyn MirDb) -> bool

Source

pub fn is_ptr(self, db: &dyn MirDb) -> bool

Source

pub fn is_mptr(self, db: &dyn MirDb) -> bool

Source

pub fn is_sptr(self, db: &dyn MirDb) -> bool

Source

pub fn is_map(self, db: &dyn MirDb) -> bool

Source

pub fn is_contract(self, db: &dyn MirDb) -> bool

Source

pub fn array_elem_size(self, db: &dyn MirDb, slot_size: usize) -> usize

Source

pub fn print<W: Write>(&self, db: &dyn MirDb, w: &mut W) -> Result

Source

pub fn as_string(&self, db: &dyn MirDb) -> String

Trait Implementations§

Source§

impl Clone for TypeId

Source§

fn clone(&self) -> TypeId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl InternKey for TypeId

Source§

fn from_intern_id(v: InternId) -> Self

Create an instance of the intern-key from a u32 value.
Source§

fn as_intern_id(&self) -> InternId

Extract the u32 with which the intern-key was created.
Source§

impl PartialEq for TypeId

Source§

fn eq(&self, other: &TypeId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PrettyPrint for TypeId

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + _store: &BodyDataStore, + w: &mut W, +) -> Result

Source§

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

Source§

impl Copy for TypeId

Source§

impl Eq for TypeId

Source§

impl StructuralPartialEq for TypeId

Auto Trait Implementations§

§

impl Freeze for TypeId

§

impl RefUnwindSafe for TypeId

§

impl Send for TypeId

§

impl Sync for TypeId

§

impl Unpin for TypeId

§

impl UnwindSafe for TypeId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/enum.AssignableValue.html b/compiler-docs/fe_mir/ir/value/enum.AssignableValue.html new file mode 100644 index 0000000000..312457b456 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/enum.AssignableValue.html @@ -0,0 +1,37 @@ +AssignableValue in fe_mir::ir::value - Rust

Enum AssignableValue

Source
pub enum AssignableValue {
+    Value(ValueId),
+    Aggregate {
+        lhs: Box<AssignableValue>,
+        idx: ValueId,
+    },
+    Map {
+        lhs: Box<AssignableValue>,
+        key: ValueId,
+    },
+}

Variants§

§

Value(ValueId)

§

Aggregate

§

Map

Implementations§

Source§

impl AssignableValue

Source

pub fn ty(&self, db: &dyn MirDb, store: &BodyDataStore) -> TypeId

Source

pub fn value_id(&self) -> Option<ValueId>

Trait Implementations§

Source§

impl Clone for AssignableValue

Source§

fn clone(&self) -> AssignableValue

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AssignableValue

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Id<Value>> for AssignableValue

Source§

fn from(value: ValueId) -> Self

Converts to this type from the input type.
Source§

impl Hash for AssignableValue

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for AssignableValue

Source§

fn eq(&self, other: &AssignableValue) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PrettyPrint for AssignableValue

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Source§

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

Source§

impl Eq for AssignableValue

Source§

impl StructuralPartialEq for AssignableValue

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/enum.Value.html b/compiler-docs/fe_mir/ir/value/enum.Value.html new file mode 100644 index 0000000000..fcbe0f45d0 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/enum.Value.html @@ -0,0 +1,44 @@ +Value in fe_mir::ir::value - Rust

Enum Value

Source
pub enum Value {
+    Temporary {
+        inst: InstId,
+        ty: TypeId,
+    },
+    Local(Local),
+    Immediate {
+        imm: BigInt,
+        ty: TypeId,
+    },
+    Constant {
+        constant: ConstantId,
+        ty: TypeId,
+    },
+    Unit {
+        ty: TypeId,
+    },
+}

Variants§

§

Temporary

A value resulted from an instruction.

+

Fields

§inst: InstId
§

Local(Local)

A local variable declared in a function body.

+
§

Immediate

An immediate value.

+

Fields

§

Constant

A constant value.

+

Fields

§constant: ConstantId
§

Unit

A singleton value representing Unit type.

+

Fields

Implementations§

Source§

impl Value

Source

pub fn ty(&self) -> TypeId

Source

pub fn is_imm(&self) -> bool

Trait Implementations§

Source§

impl Clone for Value

Source§

fn clone(&self) -> Value

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Value

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Value

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Value

Source§

fn eq(&self, other: &Value) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Value

Source§

impl StructuralPartialEq for Value

Auto Trait Implementations§

§

impl Freeze for Value

§

impl RefUnwindSafe for Value

§

impl Send for Value

§

impl Sync for Value

§

impl Unpin for Value

§

impl UnwindSafe for Value

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/index.html b/compiler-docs/fe_mir/ir/value/index.html new file mode 100644 index 0000000000..9aad91eb93 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/index.html @@ -0,0 +1 @@ +fe_mir::ir::value - Rust

Module value

Source

Structs§

Local

Enums§

AssignableValue
Value

Type Aliases§

ValueId
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/sidebar-items.js b/compiler-docs/fe_mir/ir/value/sidebar-items.js new file mode 100644 index 0000000000..11357c9f58 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["AssignableValue","Value"],"struct":["Local"],"type":["ValueId"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/struct.Local.html b/compiler-docs/fe_mir/ir/value/struct.Local.html new file mode 100644 index 0000000000..6f9c095d4d --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/struct.Local.html @@ -0,0 +1,31 @@ +Local in fe_mir::ir::value - Rust

Struct Local

Source
pub struct Local {
+    pub name: SmolStr,
+    pub ty: TypeId,
+    pub is_arg: bool,
+    pub is_tmp: bool,
+    pub source: SourceInfo,
+}

Fields§

§name: SmolStr

An original name of a local variable.

+
§ty: TypeId§is_arg: bool

true if a local is a function argument.

+
§is_tmp: bool

true if a local is introduced in MIR.

+
§source: SourceInfo

Implementations§

Source§

impl Local

Source

pub fn user_local(name: SmolStr, ty: TypeId, source: SourceInfo) -> Local

Source

pub fn arg_local(name: SmolStr, ty: TypeId, source: SourceInfo) -> Local

Source

pub fn tmp_local(name: SmolStr, ty: TypeId) -> Local

Trait Implementations§

Source§

impl Clone for Local

Source§

fn clone(&self) -> Local

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Local

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Local

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Local

Source§

fn eq(&self, other: &Local) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Local

Source§

impl StructuralPartialEq for Local

Auto Trait Implementations§

§

impl Freeze for Local

§

impl RefUnwindSafe for Local

§

impl Send for Local

§

impl Sync for Local

§

impl Unpin for Local

§

impl UnwindSafe for Local

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_mir/ir/value/type.ValueId.html b/compiler-docs/fe_mir/ir/value/type.ValueId.html new file mode 100644 index 0000000000..bbffbe3238 --- /dev/null +++ b/compiler-docs/fe_mir/ir/value/type.ValueId.html @@ -0,0 +1,6 @@ +ValueId in fe_mir::ir::value - Rust

Type Alias ValueId

Source
pub type ValueId = Id<Value>;

Aliased Type§

pub struct ValueId { /* private fields */ }

Trait Implementations§

Source§

impl PrettyPrint for ValueId

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Source§

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

\ No newline at end of file diff --git a/compiler-docs/fe_mir/pretty_print/index.html b/compiler-docs/fe_mir/pretty_print/index.html new file mode 100644 index 0000000000..32213716f5 --- /dev/null +++ b/compiler-docs/fe_mir/pretty_print/index.html @@ -0,0 +1 @@ +fe_mir::pretty_print - Rust

Module pretty_print

Source

Traits§

PrettyPrint
\ No newline at end of file diff --git a/compiler-docs/fe_mir/pretty_print/sidebar-items.js b/compiler-docs/fe_mir/pretty_print/sidebar-items.js new file mode 100644 index 0000000000..d2a6034954 --- /dev/null +++ b/compiler-docs/fe_mir/pretty_print/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"trait":["PrettyPrint"]}; \ No newline at end of file diff --git a/compiler-docs/fe_mir/pretty_print/trait.PrettyPrint.html b/compiler-docs/fe_mir/pretty_print/trait.PrettyPrint.html new file mode 100644 index 0000000000..25644cb29e --- /dev/null +++ b/compiler-docs/fe_mir/pretty_print/trait.PrettyPrint.html @@ -0,0 +1,22 @@ +PrettyPrint in fe_mir::pretty_print - Rust

Trait PrettyPrint

Source
pub trait PrettyPrint {
+    // Required method
+    fn pretty_print<W: Write>(
+        &self,
+        db: &dyn MirDb,
+        store: &BodyDataStore,
+        w: &mut W,
+    ) -> Result;
+
+    // Provided method
+    fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String { ... }
+}

Required Methods§

Source

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Provided Methods§

Source

fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl PrettyPrint for &[ValueId]

Source§

fn pretty_print<W: Write>( + &self, + db: &dyn MirDb, + store: &BodyDataStore, + w: &mut W, +) -> Result

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_mir/sidebar-items.js b/compiler-docs/fe_mir/sidebar-items.js new file mode 100644 index 0000000000..12f0860546 --- /dev/null +++ b/compiler-docs/fe_mir/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["analysis","db","graphviz","ir","pretty_print"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/all.html b/compiler-docs/fe_parser/all.html new file mode 100644 index 0000000000..3a183ef640 --- /dev/null +++ b/compiler-docs/fe_parser/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Enums

Traits

Functions

Type Aliases

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.BinOperator.html b/compiler-docs/fe_parser/ast/enum.BinOperator.html new file mode 100644 index 0000000000..0e1d1e756f --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.BinOperator.html @@ -0,0 +1,38 @@ +BinOperator in fe_parser::ast - Rust

Enum BinOperator

Source
pub enum BinOperator {
+    Add,
+    Sub,
+    Mult,
+    Div,
+    Mod,
+    Pow,
+    LShift,
+    RShift,
+    BitOr,
+    BitXor,
+    BitAnd,
+}

Variants§

§

Add

§

Sub

§

Mult

§

Div

§

Mod

§

Pow

§

LShift

§

RShift

§

BitOr

§

BitXor

§

BitAnd

Trait Implementations§

Source§

impl Clone for BinOperator

Source§

fn clone(&self) -> BinOperator

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BinOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for BinOperator

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for BinOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for BinOperator

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for BinOperator

Source§

fn eq(&self, other: &BinOperator) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for BinOperator

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for BinOperator

Source§

impl Eq for BinOperator

Source§

impl StructuralPartialEq for BinOperator

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.BoolOperator.html b/compiler-docs/fe_parser/ast/enum.BoolOperator.html new file mode 100644 index 0000000000..9e891d8526 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.BoolOperator.html @@ -0,0 +1,29 @@ +BoolOperator in fe_parser::ast - Rust

Enum BoolOperator

Source
pub enum BoolOperator {
+    And,
+    Or,
+}

Variants§

§

And

§

Or

Trait Implementations§

Source§

impl Clone for BoolOperator

Source§

fn clone(&self) -> BoolOperator

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BoolOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for BoolOperator

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for BoolOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for BoolOperator

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for BoolOperator

Source§

fn eq(&self, other: &BoolOperator) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for BoolOperator

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for BoolOperator

Source§

impl Eq for BoolOperator

Source§

impl StructuralPartialEq for BoolOperator

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.CompOperator.html b/compiler-docs/fe_parser/ast/enum.CompOperator.html new file mode 100644 index 0000000000..141bf3be91 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.CompOperator.html @@ -0,0 +1,33 @@ +CompOperator in fe_parser::ast - Rust

Enum CompOperator

Source
pub enum CompOperator {
+    Eq,
+    NotEq,
+    Lt,
+    LtE,
+    Gt,
+    GtE,
+}

Variants§

§

Eq

§

NotEq

§

Lt

§

LtE

§

Gt

§

GtE

Trait Implementations§

Source§

impl Clone for CompOperator

Source§

fn clone(&self) -> CompOperator

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CompOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for CompOperator

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for CompOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CompOperator

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CompOperator

Source§

fn eq(&self, other: &CompOperator) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for CompOperator

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for CompOperator

Source§

impl Eq for CompOperator

Source§

impl StructuralPartialEq for CompOperator

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.ContractStmt.html b/compiler-docs/fe_parser/ast/enum.ContractStmt.html new file mode 100644 index 0000000000..f56783855a --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.ContractStmt.html @@ -0,0 +1,28 @@ +ContractStmt in fe_parser::ast - Rust

Enum ContractStmt

Source
pub enum ContractStmt {
+    Function(Node<Function>),
+}

Variants§

§

Function(Node<Function>)

Trait Implementations§

Source§

impl Clone for ContractStmt

Source§

fn clone(&self) -> ContractStmt

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ContractStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for ContractStmt

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for ContractStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ContractStmt

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ContractStmt

Source§

fn eq(&self, other: &ContractStmt) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for ContractStmt

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Spanned for ContractStmt

Source§

fn span(&self) -> Span

Source§

impl Eq for ContractStmt

Source§

impl StructuralPartialEq for ContractStmt

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.Expr.html b/compiler-docs/fe_parser/ast/enum.Expr.html new file mode 100644 index 0000000000..f0534f3d90 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.Expr.html @@ -0,0 +1,80 @@ +Expr in fe_parser::ast - Rust

Enum Expr

Source
pub enum Expr {
+
Show 17 variants Ternary { + if_expr: Box<Node<Expr>>, + test: Box<Node<Expr>>, + else_expr: Box<Node<Expr>>, + }, + BoolOperation { + left: Box<Node<Expr>>, + op: Node<BoolOperator>, + right: Box<Node<Expr>>, + }, + BinOperation { + left: Box<Node<Expr>>, + op: Node<BinOperator>, + right: Box<Node<Expr>>, + }, + UnaryOperation { + op: Node<UnaryOperator>, + operand: Box<Node<Expr>>, + }, + CompOperation { + left: Box<Node<Expr>>, + op: Node<CompOperator>, + right: Box<Node<Expr>>, + }, + Attribute { + value: Box<Node<Expr>>, + attr: Node<SmolStr>, + }, + Subscript { + value: Box<Node<Expr>>, + index: Box<Node<Expr>>, + }, + Call { + func: Box<Node<Expr>>, + generic_args: Option<Node<Vec<GenericArg>>>, + args: Node<Vec<Node<CallArg>>>, + }, + List { + elts: Vec<Node<Expr>>, + }, + Repeat { + value: Box<Node<Expr>>, + len: Box<Node<GenericArg>>, + }, + Tuple { + elts: Vec<Node<Expr>>, + }, + Bool(bool), + Name(SmolStr), + Path(Path), + Num(SmolStr), + Str(SmolStr), + Unit, +
}

Variants§

§

Ternary

Fields

§if_expr: Box<Node<Expr>>
§test: Box<Node<Expr>>
§else_expr: Box<Node<Expr>>
§

BoolOperation

Fields

§left: Box<Node<Expr>>
§right: Box<Node<Expr>>
§

BinOperation

Fields

§left: Box<Node<Expr>>
§right: Box<Node<Expr>>
§

UnaryOperation

Fields

§operand: Box<Node<Expr>>
§

CompOperation

Fields

§left: Box<Node<Expr>>
§right: Box<Node<Expr>>
§

Attribute

Fields

§value: Box<Node<Expr>>
§

Subscript

Fields

§value: Box<Node<Expr>>
§index: Box<Node<Expr>>
§

Call

Fields

§func: Box<Node<Expr>>
§generic_args: Option<Node<Vec<GenericArg>>>
§

List

Fields

§elts: Vec<Node<Expr>>
§

Repeat

Fields

§value: Box<Node<Expr>>
§

Tuple

Fields

§elts: Vec<Node<Expr>>
§

Bool(bool)

§

Name(SmolStr)

§

Path(Path)

§

Num(SmolStr)

§

Str(SmolStr)

§

Unit

Trait Implementations§

Source§

impl Clone for Expr

Source§

fn clone(&self) -> Expr

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Expr

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Expr

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Expr

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Expr

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Expr

Source§

fn eq(&self, other: &Expr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Expr

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Expr

Source§

impl StructuralPartialEq for Expr

Auto Trait Implementations§

§

impl Freeze for Expr

§

impl RefUnwindSafe for Expr

§

impl Send for Expr

§

impl Sync for Expr

§

impl Unpin for Expr

§

impl UnwindSafe for Expr

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.FuncStmt.html b/compiler-docs/fe_parser/ast/enum.FuncStmt.html new file mode 100644 index 0000000000..fe60db116b --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.FuncStmt.html @@ -0,0 +1,81 @@ +FuncStmt in fe_parser::ast - Rust

Enum FuncStmt

Source
pub enum FuncStmt {
+
Show 15 variants Return { + value: Option<Node<Expr>>, + }, + VarDecl { + mut_: Option<Span>, + target: Node<VarDeclTarget>, + typ: Node<TypeDesc>, + value: Option<Node<Expr>>, + }, + ConstantDecl { + name: Node<SmolStr>, + typ: Node<TypeDesc>, + value: Node<Expr>, + }, + Assign { + target: Node<Expr>, + value: Node<Expr>, + }, + AugAssign { + target: Node<Expr>, + op: Node<BinOperator>, + value: Node<Expr>, + }, + For { + target: Node<SmolStr>, + iter: Node<Expr>, + body: Vec<Node<FuncStmt>>, + }, + While { + test: Node<Expr>, + body: Vec<Node<FuncStmt>>, + }, + If { + test: Node<Expr>, + body: Vec<Node<FuncStmt>>, + or_else: Vec<Node<FuncStmt>>, + }, + Match { + expr: Node<Expr>, + arms: Vec<Node<MatchArm>>, + }, + Assert { + test: Node<Expr>, + msg: Option<Node<Expr>>, + }, + Expr { + value: Node<Expr>, + }, + Break, + Continue, + Revert { + error: Option<Node<Expr>>, + }, + Unsafe(Vec<Node<FuncStmt>>), +
}

Variants§

§

Return

Fields

§value: Option<Node<Expr>>
§

VarDecl

Fields

§mut_: Option<Span>
§value: Option<Node<Expr>>
§

ConstantDecl

Fields

§value: Node<Expr>
§

Assign

Fields

§target: Node<Expr>
§value: Node<Expr>
§

AugAssign

Fields

§target: Node<Expr>
§value: Node<Expr>
§

For

Fields

§target: Node<SmolStr>
§iter: Node<Expr>
§

While

Fields

§test: Node<Expr>
§

If

Fields

§test: Node<Expr>
§or_else: Vec<Node<FuncStmt>>
§

Match

Fields

§expr: Node<Expr>
§

Assert

Fields

§test: Node<Expr>
§

Expr

Fields

§value: Node<Expr>
§

Break

§

Continue

§

Revert

Fields

§error: Option<Node<Expr>>
§

Unsafe(Vec<Node<FuncStmt>>)

Trait Implementations§

Source§

impl Clone for FuncStmt

Source§

fn clone(&self) -> FuncStmt

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FuncStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for FuncStmt

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for FuncStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FuncStmt

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FuncStmt

Source§

fn eq(&self, other: &FuncStmt) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for FuncStmt

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for FuncStmt

Source§

impl StructuralPartialEq for FuncStmt

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.FunctionArg.html b/compiler-docs/fe_parser/ast/enum.FunctionArg.html new file mode 100644 index 0000000000..6d6a8ee1f1 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.FunctionArg.html @@ -0,0 +1,36 @@ +FunctionArg in fe_parser::ast - Rust

Enum FunctionArg

Source
pub enum FunctionArg {
+    Regular {
+        mut_: Option<Span>,
+        label: Option<Node<SmolStr>>,
+        name: Node<SmolStr>,
+        typ: Node<TypeDesc>,
+    },
+    Self_ {
+        mut_: Option<Span>,
+    },
+}

Variants§

§

Regular

Fields

§mut_: Option<Span>
§

Self_

Fields

§mut_: Option<Span>

Implementations§

Source§

impl FunctionArg

Source

pub fn label_span(&self) -> Option<Span>

Source

pub fn name_span(&self) -> Option<Span>

Source

pub fn typ_span(&self) -> Option<Span>

Trait Implementations§

Source§

impl Clone for FunctionArg

Source§

fn clone(&self) -> FunctionArg

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for FunctionArg

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for FunctionArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for FunctionArg

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionArg

Source§

fn eq(&self, other: &FunctionArg) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for FunctionArg

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for FunctionArg

Source§

impl StructuralPartialEq for FunctionArg

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.GenericArg.html b/compiler-docs/fe_parser/ast/enum.GenericArg.html new file mode 100644 index 0000000000..b1aea72df6 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.GenericArg.html @@ -0,0 +1,30 @@ +GenericArg in fe_parser::ast - Rust

Enum GenericArg

Source
pub enum GenericArg {
+    TypeDesc(Node<TypeDesc>),
+    Int(Node<usize>),
+    ConstExpr(Node<Expr>),
+}

Variants§

§

TypeDesc(Node<TypeDesc>)

§

Int(Node<usize>)

§

ConstExpr(Node<Expr>)

Trait Implementations§

Source§

impl Clone for GenericArg

Source§

fn clone(&self) -> GenericArg

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for GenericArg

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for GenericArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for GenericArg

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for GenericArg

Source§

fn eq(&self, other: &GenericArg) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for GenericArg

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Spanned for GenericArg

Source§

fn span(&self) -> Span

Source§

impl Eq for GenericArg

Source§

impl StructuralPartialEq for GenericArg

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.GenericParameter.html b/compiler-docs/fe_parser/ast/enum.GenericParameter.html new file mode 100644 index 0000000000..b84bfda90d --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.GenericParameter.html @@ -0,0 +1,32 @@ +GenericParameter in fe_parser::ast - Rust

Enum GenericParameter

Source
pub enum GenericParameter {
+    Unbounded(Node<SmolStr>),
+    Bounded {
+        name: Node<SmolStr>,
+        bound: Node<TypeDesc>,
+    },
+}

Variants§

§

Unbounded(Node<SmolStr>)

§

Bounded

Fields

Implementations§

Trait Implementations§

Source§

impl Clone for GenericParameter

Source§

fn clone(&self) -> GenericParameter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for GenericParameter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for GenericParameter

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for GenericParameter

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for GenericParameter

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for GenericParameter

Source§

fn eq(&self, other: &GenericParameter) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for GenericParameter

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Spanned for GenericParameter

Source§

fn span(&self) -> Span

Source§

impl Eq for GenericParameter

Source§

impl StructuralPartialEq for GenericParameter

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.LiteralPattern.html b/compiler-docs/fe_parser/ast/enum.LiteralPattern.html new file mode 100644 index 0000000000..2d2533f16f --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.LiteralPattern.html @@ -0,0 +1,28 @@ +LiteralPattern in fe_parser::ast - Rust

Enum LiteralPattern

Source
pub enum LiteralPattern {
+    Bool(bool),
+}

Variants§

§

Bool(bool)

Trait Implementations§

Source§

impl Clone for LiteralPattern

Source§

fn clone(&self) -> LiteralPattern

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LiteralPattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for LiteralPattern

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for LiteralPattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for LiteralPattern

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for LiteralPattern

Source§

fn eq(&self, other: &LiteralPattern) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for LiteralPattern

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for LiteralPattern

Source§

impl Eq for LiteralPattern

Source§

impl StructuralPartialEq for LiteralPattern

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.ModuleStmt.html b/compiler-docs/fe_parser/ast/enum.ModuleStmt.html new file mode 100644 index 0000000000..8331b16680 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.ModuleStmt.html @@ -0,0 +1,39 @@ +ModuleStmt in fe_parser::ast - Rust

Enum ModuleStmt

Source
pub enum ModuleStmt {
+    Pragma(Node<Pragma>),
+    Use(Node<Use>),
+    TypeAlias(Node<TypeAlias>),
+    Contract(Node<Contract>),
+    Constant(Node<ConstantDecl>),
+    Struct(Node<Struct>),
+    Enum(Node<Enum>),
+    Trait(Node<Trait>),
+    Impl(Node<Impl>),
+    Function(Node<Function>),
+    Attribute(Node<SmolStr>),
+    ParseError(Span),
+}

Variants§

§

Pragma(Node<Pragma>)

§

Use(Node<Use>)

§

TypeAlias(Node<TypeAlias>)

§

Contract(Node<Contract>)

§

Constant(Node<ConstantDecl>)

§

Struct(Node<Struct>)

§

Enum(Node<Enum>)

§

Trait(Node<Trait>)

§

Impl(Node<Impl>)

§

Function(Node<Function>)

§

Attribute(Node<SmolStr>)

§

ParseError(Span)

Trait Implementations§

Source§

impl Clone for ModuleStmt

Source§

fn clone(&self) -> ModuleStmt

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ModuleStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for ModuleStmt

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for ModuleStmt

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ModuleStmt

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ModuleStmt

Source§

fn eq(&self, other: &ModuleStmt) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for ModuleStmt

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Spanned for ModuleStmt

Source§

fn span(&self) -> Span

Source§

impl Eq for ModuleStmt

Source§

impl StructuralPartialEq for ModuleStmt

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.Pattern.html b/compiler-docs/fe_parser/ast/enum.Pattern.html new file mode 100644 index 0000000000..0ede6340e0 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.Pattern.html @@ -0,0 +1,48 @@ +Pattern in fe_parser::ast - Rust

Enum Pattern

Source
pub enum Pattern {
+    WildCard,
+    Rest,
+    Literal(Node<LiteralPattern>),
+    Tuple(Vec<Node<Pattern>>),
+    Path(Node<Path>),
+    PathTuple(Node<Path>, Vec<Node<Pattern>>),
+    PathStruct {
+        path: Node<Path>,
+        fields: Vec<(Node<SmolStr>, Node<Pattern>)>,
+        has_rest: bool,
+    },
+    Or(Vec<Node<Pattern>>),
+}

Variants§

§

WildCard

Represents a wildcard pattern _.

+
§

Rest

Rest pattern. e.g., ..

+
§

Literal(Node<LiteralPattern>)

Represents a literal pattern. e.g., true.

+
§

Tuple(Vec<Node<Pattern>>)

Represents tuple destructuring pattern. e.g., (x, y, z).

+
§

Path(Node<Path>)

Represents unit variant pattern. e.g., Enum::Unit.

+
§

PathTuple(Node<Path>, Vec<Node<Pattern>>)

Represents tuple variant pattern. e.g., Enum::Tuple(x, y, z).

+
§

PathStruct

Represents struct or struct variant destructuring pattern. e.g., +MyStruct {x: pat1, y: pat2}}.

+

Fields

§path: Node<Path>
§fields: Vec<(Node<SmolStr>, Node<Pattern>)>
§has_rest: bool
§

Or(Vec<Node<Pattern>>)

Represents or pattern. e.g., EnumUnit | EnumTuple(_, _, _)

+

Implementations§

Source§

impl Pattern

Source

pub fn is_rest(&self) -> bool

Trait Implementations§

Source§

impl Clone for Pattern

Source§

fn clone(&self) -> Pattern

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Pattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Pattern

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Pattern

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Pattern

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Pattern

Source§

fn eq(&self, other: &Pattern) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Pattern

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Pattern

Source§

impl StructuralPartialEq for Pattern

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.TypeDesc.html b/compiler-docs/fe_parser/ast/enum.TypeDesc.html new file mode 100644 index 0000000000..4ef672a4f4 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.TypeDesc.html @@ -0,0 +1,40 @@ +TypeDesc in fe_parser::ast - Rust

Enum TypeDesc

Source
pub enum TypeDesc {
+    Unit,
+    Base {
+        base: SmolStr,
+    },
+    Path(Path),
+    Tuple {
+        items: Vec1<Node<TypeDesc>>,
+    },
+    Generic {
+        base: Node<SmolStr>,
+        args: Node<Vec<GenericArg>>,
+    },
+    SelfType,
+}

Variants§

§

Unit

§

Base

Fields

§base: SmolStr
§

Path(Path)

§

Tuple

Fields

§items: Vec1<Node<TypeDesc>>
§

Generic

Fields

§

SelfType

Trait Implementations§

Source§

impl Clone for TypeDesc

Source§

fn clone(&self) -> TypeDesc

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeDesc

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for TypeDesc

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for TypeDesc

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeDesc

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeDesc

Source§

fn eq(&self, other: &TypeDesc) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for TypeDesc

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for TypeDesc

Source§

impl StructuralPartialEq for TypeDesc

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.UnaryOperator.html b/compiler-docs/fe_parser/ast/enum.UnaryOperator.html new file mode 100644 index 0000000000..3e5c68358d --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.UnaryOperator.html @@ -0,0 +1,30 @@ +UnaryOperator in fe_parser::ast - Rust

Enum UnaryOperator

Source
pub enum UnaryOperator {
+    Invert,
+    Not,
+    USub,
+}

Variants§

§

Invert

§

Not

§

USub

Trait Implementations§

Source§

impl Clone for UnaryOperator

Source§

fn clone(&self) -> UnaryOperator

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UnaryOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for UnaryOperator

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for UnaryOperator

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for UnaryOperator

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for UnaryOperator

Source§

fn eq(&self, other: &UnaryOperator) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for UnaryOperator

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for UnaryOperator

Source§

impl Eq for UnaryOperator

Source§

impl StructuralPartialEq for UnaryOperator

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.UseTree.html b/compiler-docs/fe_parser/ast/enum.UseTree.html new file mode 100644 index 0000000000..9104dae5ba --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.UseTree.html @@ -0,0 +1,38 @@ +UseTree in fe_parser::ast - Rust

Enum UseTree

Source
pub enum UseTree {
+    Glob {
+        prefix: Path,
+    },
+    Nested {
+        prefix: Path,
+        children: Vec<Node<UseTree>>,
+    },
+    Simple {
+        path: Path,
+        rename: Option<Node<SmolStr>>,
+    },
+}

Variants§

§

Glob

Fields

§prefix: Path
§

Nested

Fields

§prefix: Path
§children: Vec<Node<UseTree>>
§

Simple

Fields

§path: Path

Trait Implementations§

Source§

impl Clone for UseTree

Source§

fn clone(&self) -> UseTree

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for UseTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for UseTree

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for UseTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for UseTree

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for UseTree

Source§

fn eq(&self, other: &UseTree) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for UseTree

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for UseTree

Source§

impl StructuralPartialEq for UseTree

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.VarDeclTarget.html b/compiler-docs/fe_parser/ast/enum.VarDeclTarget.html new file mode 100644 index 0000000000..5970094721 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.VarDeclTarget.html @@ -0,0 +1,29 @@ +VarDeclTarget in fe_parser::ast - Rust

Enum VarDeclTarget

Source
pub enum VarDeclTarget {
+    Name(SmolStr),
+    Tuple(Vec<Node<VarDeclTarget>>),
+}

Variants§

Trait Implementations§

Source§

impl Clone for VarDeclTarget

Source§

fn clone(&self) -> VarDeclTarget

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for VarDeclTarget

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for VarDeclTarget

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for VarDeclTarget

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for VarDeclTarget

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for VarDeclTarget

Source§

fn eq(&self, other: &VarDeclTarget) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for VarDeclTarget

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for VarDeclTarget

Source§

impl StructuralPartialEq for VarDeclTarget

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/enum.VariantKind.html b/compiler-docs/fe_parser/ast/enum.VariantKind.html new file mode 100644 index 0000000000..8eccf73459 --- /dev/null +++ b/compiler-docs/fe_parser/ast/enum.VariantKind.html @@ -0,0 +1,39 @@ +VariantKind in fe_parser::ast - Rust

Enum VariantKind

Source
pub enum VariantKind {
+    Unit,
+    Tuple(Vec<Node<TypeDesc>>),
+}
Expand description

Enum variant kind.

+

Variants§

§

Unit

Unit variant. +E.g., Bar in

+
enum Foo {
+    Bar
+    Baz(u32, i32)
+}
§

Tuple(Vec<Node<TypeDesc>>)

Tuple variant. +E.g., Baz(u32, i32) in

+
enum Foo {
+    Bar
+    Baz(u32, i32)
+}

Trait Implementations§

Source§

impl Clone for VariantKind

Source§

fn clone(&self) -> VariantKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for VariantKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for VariantKind

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Hash for VariantKind

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for VariantKind

Source§

fn eq(&self, other: &VariantKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for VariantKind

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for VariantKind

Source§

impl StructuralPartialEq for VariantKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/index.html b/compiler-docs/fe_parser/ast/index.html new file mode 100644 index 0000000000..6345b0cd49 --- /dev/null +++ b/compiler-docs/fe_parser/ast/index.html @@ -0,0 +1 @@ +fe_parser::ast - Rust

Module ast

Source

Structs§

CallArg
ConstantDecl
Contract
Enum
Field
struct or contract field, with optional ‘pub’ and ‘const’ qualifiers
Function
FunctionSignature
Impl
MatchArm
Module
Path
Pragma
SmolStr
A SmolStr is a string type that has the following properties:
Struct
Trait
TypeAlias
Use
Variant
Enum variant definition.

Enums§

BinOperator
BoolOperator
CompOperator
ContractStmt
Expr
FuncStmt
FunctionArg
GenericArg
GenericParameter
LiteralPattern
ModuleStmt
Pattern
TypeDesc
UnaryOperator
UseTree
VarDeclTarget
VariantKind
Enum variant kind.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/sidebar-items.js b/compiler-docs/fe_parser/ast/sidebar-items.js new file mode 100644 index 0000000000..075bdbe892 --- /dev/null +++ b/compiler-docs/fe_parser/ast/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["BinOperator","BoolOperator","CompOperator","ContractStmt","Expr","FuncStmt","FunctionArg","GenericArg","GenericParameter","LiteralPattern","ModuleStmt","Pattern","TypeDesc","UnaryOperator","UseTree","VarDeclTarget","VariantKind"],"struct":["CallArg","ConstantDecl","Contract","Enum","Field","Function","FunctionSignature","Impl","MatchArm","Module","Path","Pragma","SmolStr","Struct","Trait","TypeAlias","Use","Variant"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.CallArg.html b/compiler-docs/fe_parser/ast/struct.CallArg.html new file mode 100644 index 0000000000..5cfad5c87f --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.CallArg.html @@ -0,0 +1,29 @@ +CallArg in fe_parser::ast - Rust

Struct CallArg

Source
pub struct CallArg {
+    pub label: Option<Node<SmolStr>>,
+    pub value: Node<Expr>,
+}

Fields§

§label: Option<Node<SmolStr>>§value: Node<Expr>

Trait Implementations§

Source§

impl Clone for CallArg

Source§

fn clone(&self) -> CallArg

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for CallArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for CallArg

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for CallArg

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for CallArg

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for CallArg

Source§

fn eq(&self, other: &CallArg) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for CallArg

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for CallArg

Source§

impl StructuralPartialEq for CallArg

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.ConstantDecl.html b/compiler-docs/fe_parser/ast/struct.ConstantDecl.html new file mode 100644 index 0000000000..98f915a339 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.ConstantDecl.html @@ -0,0 +1,31 @@ +ConstantDecl in fe_parser::ast - Rust

Struct ConstantDecl

Source
pub struct ConstantDecl {
+    pub name: Node<SmolStr>,
+    pub typ: Node<TypeDesc>,
+    pub value: Node<Expr>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§typ: Node<TypeDesc>§value: Node<Expr>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for ConstantDecl

Source§

fn clone(&self) -> ConstantDecl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ConstantDecl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for ConstantDecl

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for ConstantDecl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for ConstantDecl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ConstantDecl

Source§

fn eq(&self, other: &ConstantDecl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for ConstantDecl

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for ConstantDecl

Source§

impl StructuralPartialEq for ConstantDecl

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Contract.html b/compiler-docs/fe_parser/ast/struct.Contract.html new file mode 100644 index 0000000000..567afdfe23 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Contract.html @@ -0,0 +1,31 @@ +Contract in fe_parser::ast - Rust

Struct Contract

Source
pub struct Contract {
+    pub name: Node<SmolStr>,
+    pub fields: Vec<Node<Field>>,
+    pub body: Vec<ContractStmt>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§fields: Vec<Node<Field>>§body: Vec<ContractStmt>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for Contract

Source§

fn clone(&self) -> Contract

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Contract

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Contract

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Contract

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Contract

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Contract

Source§

fn eq(&self, other: &Contract) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Contract

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Contract

Source§

impl StructuralPartialEq for Contract

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Enum.html b/compiler-docs/fe_parser/ast/struct.Enum.html new file mode 100644 index 0000000000..9c42b2e6f7 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Enum.html @@ -0,0 +1,31 @@ +Enum in fe_parser::ast - Rust

Struct Enum

Source
pub struct Enum {
+    pub name: Node<SmolStr>,
+    pub variants: Vec<Node<Variant>>,
+    pub functions: Vec<Node<Function>>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§variants: Vec<Node<Variant>>§functions: Vec<Node<Function>>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for Enum

Source§

fn clone(&self) -> Enum

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Enum

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Enum

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Enum

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Enum

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Enum

Source§

fn eq(&self, other: &Enum) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Enum

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Enum

Source§

impl StructuralPartialEq for Enum

Auto Trait Implementations§

§

impl Freeze for Enum

§

impl RefUnwindSafe for Enum

§

impl Send for Enum

§

impl Sync for Enum

§

impl Unpin for Enum

§

impl UnwindSafe for Enum

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Field.html b/compiler-docs/fe_parser/ast/struct.Field.html new file mode 100644 index 0000000000..727b57c79d --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Field.html @@ -0,0 +1,34 @@ +Field in fe_parser::ast - Rust

Struct Field

Source
pub struct Field {
+    pub is_pub: bool,
+    pub is_const: bool,
+    pub attributes: Vec<Node<SmolStr>>,
+    pub name: Node<SmolStr>,
+    pub typ: Node<TypeDesc>,
+    pub value: Option<Node<Expr>>,
+}
Expand description

struct or contract field, with optional ‘pub’ and ‘const’ qualifiers

+

Fields§

§is_pub: bool§is_const: bool§attributes: Vec<Node<SmolStr>>§name: Node<SmolStr>§typ: Node<TypeDesc>§value: Option<Node<Expr>>

Trait Implementations§

Source§

impl Clone for Field

Source§

fn clone(&self) -> Field

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Field

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Field

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Field

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Field

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Field

Source§

fn eq(&self, other: &Field) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Field

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Field

Source§

impl StructuralPartialEq for Field

Auto Trait Implementations§

§

impl Freeze for Field

§

impl RefUnwindSafe for Field

§

impl Send for Field

§

impl Sync for Field

§

impl Unpin for Field

§

impl UnwindSafe for Field

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Function.html b/compiler-docs/fe_parser/ast/struct.Function.html new file mode 100644 index 0000000000..99b3bfad32 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Function.html @@ -0,0 +1,29 @@ +Function in fe_parser::ast - Rust

Struct Function

Source
pub struct Function {
+    pub sig: Node<FunctionSignature>,
+    pub body: Vec<Node<FuncStmt>>,
+}

Fields§

§sig: Node<FunctionSignature>§body: Vec<Node<FuncStmt>>

Trait Implementations§

Source§

impl Clone for Function

Source§

fn clone(&self) -> Function

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Function

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Function

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Function

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Function

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Function

Source§

fn eq(&self, other: &Function) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Function

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Function

Source§

impl StructuralPartialEq for Function

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.FunctionSignature.html b/compiler-docs/fe_parser/ast/struct.FunctionSignature.html new file mode 100644 index 0000000000..b8f17b5e75 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.FunctionSignature.html @@ -0,0 +1,32 @@ +FunctionSignature in fe_parser::ast - Rust

Struct FunctionSignature

Source
pub struct FunctionSignature {
+    pub pub_: Option<Span>,
+    pub unsafe_: Option<Span>,
+    pub name: Node<SmolStr>,
+    pub generic_params: Node<Vec<GenericParameter>>,
+    pub args: Vec<Node<FunctionArg>>,
+    pub return_type: Option<Node<TypeDesc>>,
+}

Fields§

§pub_: Option<Span>§unsafe_: Option<Span>§name: Node<SmolStr>§generic_params: Node<Vec<GenericParameter>>§args: Vec<Node<FunctionArg>>§return_type: Option<Node<TypeDesc>>

Trait Implementations§

Source§

impl Clone for FunctionSignature

Source§

fn clone(&self) -> FunctionSignature

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FunctionSignature

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for FunctionSignature

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Hash for FunctionSignature

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for FunctionSignature

Source§

fn eq(&self, other: &FunctionSignature) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for FunctionSignature

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for FunctionSignature

Source§

impl StructuralPartialEq for FunctionSignature

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Impl.html b/compiler-docs/fe_parser/ast/struct.Impl.html new file mode 100644 index 0000000000..ee9d2331a7 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Impl.html @@ -0,0 +1,30 @@ +Impl in fe_parser::ast - Rust

Struct Impl

Source
pub struct Impl {
+    pub impl_trait: Node<SmolStr>,
+    pub receiver: Node<TypeDesc>,
+    pub functions: Vec<Node<Function>>,
+}

Fields§

§impl_trait: Node<SmolStr>§receiver: Node<TypeDesc>§functions: Vec<Node<Function>>

Trait Implementations§

Source§

impl Clone for Impl

Source§

fn clone(&self) -> Impl

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Impl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Impl

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Impl

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Impl

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Impl

Source§

fn eq(&self, other: &Impl) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Impl

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Impl

Source§

impl StructuralPartialEq for Impl

Auto Trait Implementations§

§

impl Freeze for Impl

§

impl RefUnwindSafe for Impl

§

impl Send for Impl

§

impl Sync for Impl

§

impl Unpin for Impl

§

impl UnwindSafe for Impl

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.MatchArm.html b/compiler-docs/fe_parser/ast/struct.MatchArm.html new file mode 100644 index 0000000000..993ba77ef2 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.MatchArm.html @@ -0,0 +1,29 @@ +MatchArm in fe_parser::ast - Rust

Struct MatchArm

Source
pub struct MatchArm {
+    pub pat: Node<Pattern>,
+    pub body: Vec<Node<FuncStmt>>,
+}

Fields§

§pat: Node<Pattern>§body: Vec<Node<FuncStmt>>

Trait Implementations§

Source§

impl Clone for MatchArm

Source§

fn clone(&self) -> MatchArm

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MatchArm

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for MatchArm

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for MatchArm

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for MatchArm

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for MatchArm

Source§

fn eq(&self, other: &MatchArm) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for MatchArm

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for MatchArm

Source§

impl StructuralPartialEq for MatchArm

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Module.html b/compiler-docs/fe_parser/ast/struct.Module.html new file mode 100644 index 0000000000..4cb8be8265 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Module.html @@ -0,0 +1,28 @@ +Module in fe_parser::ast - Rust

Struct Module

Source
pub struct Module {
+    pub body: Vec<ModuleStmt>,
+}

Fields§

§body: Vec<ModuleStmt>

Trait Implementations§

Source§

impl Clone for Module

Source§

fn clone(&self) -> Module

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Module

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Module

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Module

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Module

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Module

Source§

fn eq(&self, other: &Module) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Module

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Module

Source§

impl StructuralPartialEq for Module

Auto Trait Implementations§

§

impl Freeze for Module

§

impl RefUnwindSafe for Module

§

impl Send for Module

§

impl Sync for Module

§

impl Unpin for Module

§

impl UnwindSafe for Module

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Path.html b/compiler-docs/fe_parser/ast/struct.Path.html new file mode 100644 index 0000000000..dfac899600 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Path.html @@ -0,0 +1,28 @@ +Path in fe_parser::ast - Rust

Struct Path

Source
pub struct Path {
+    pub segments: Vec<Node<SmolStr>>,
+}

Fields§

§segments: Vec<Node<SmolStr>>

Implementations§

Source§

impl Path

Source

pub fn remove_last(&self) -> Path

Trait Implementations§

Source§

impl Clone for Path

Source§

fn clone(&self) -> Path

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Path

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Path

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Path

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Path

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Path

Source§

fn eq(&self, other: &Path) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Path

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Path

Source§

impl StructuralPartialEq for Path

Auto Trait Implementations§

§

impl Freeze for Path

§

impl RefUnwindSafe for Path

§

impl Send for Path

§

impl Sync for Path

§

impl Unpin for Path

§

impl UnwindSafe for Path

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Pragma.html b/compiler-docs/fe_parser/ast/struct.Pragma.html new file mode 100644 index 0000000000..9932a89c49 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Pragma.html @@ -0,0 +1,28 @@ +Pragma in fe_parser::ast - Rust

Struct Pragma

Source
pub struct Pragma {
+    pub version_requirement: Node<SmolStr>,
+}

Fields§

§version_requirement: Node<SmolStr>

Trait Implementations§

Source§

impl Clone for Pragma

Source§

fn clone(&self) -> Pragma

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Pragma

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Pragma

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Pragma

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Pragma

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Pragma

Source§

fn eq(&self, other: &Pragma) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Pragma

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Pragma

Source§

impl StructuralPartialEq for Pragma

Auto Trait Implementations§

§

impl Freeze for Pragma

§

impl RefUnwindSafe for Pragma

§

impl Send for Pragma

§

impl Sync for Pragma

§

impl Unpin for Pragma

§

impl UnwindSafe for Pragma

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.SmolStr.html b/compiler-docs/fe_parser/ast/struct.SmolStr.html new file mode 100644 index 0000000000..696548b432 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.SmolStr.html @@ -0,0 +1,1368 @@ +SmolStr in fe_parser::ast - Rust

Struct SmolStr

pub struct SmolStr(/* private fields */);
Expand description

A SmolStr is a string type that has the following properties:

+
    +
  • size_of::<SmolStr>() == size_of::<String>()
  • +
  • Clone is O(1)
  • +
  • Strings are stack-allocated if they are: +
      +
    • Up to 23 bytes long
    • +
    • Longer than 23 bytes, but substrings of WS (see below). Such strings consist +solely of consecutive newlines, followed by consecutive spaces
    • +
    +
  • +
  • If a string does not satisfy the aforementioned conditions, it is heap-allocated
  • +
+

Unlike String, however, SmolStr is immutable. The primary use case for +SmolStr is a good enough default storage for tokens of typical programming +languages. Strings consisting of a series of newlines, followed by a series of +whitespace are a typical pattern in computer programs because of indentation. +Note that a specialized interner might be a better solution for some use cases.

+

WS: A string of 32 newlines followed by 128 spaces.

+

Implementations§

§

impl SmolStr

pub const fn new_inline_from_ascii(len: usize, bytes: &[u8]) -> SmolStr

👎Deprecated: Use new_inline instead

pub const fn new_inline(text: &str) -> SmolStr

Constructs inline variant of SmolStr.

+

Panics if text.len() > 23.

+

pub fn new<T>(text: T) -> SmolStr
where + T: AsRef<str>,

pub fn as_str(&self) -> &str

pub fn to_string(&self) -> String

pub fn len(&self) -> usize

pub fn is_empty(&self) -> bool

pub fn is_heap_allocated(&self) -> bool

Methods from Deref<Target = str>§

1.0.0 · Source

pub fn len(&self) -> usize

Returns the length of self.

+

This length is in bytes, not chars or graphemes. In other words, +it might not be what a human considers the length of the string.

+
§Examples
+
let len = "foo".len();
+assert_eq!(3, len);
+
+assert_eq!("ƒoo".len(), 4); // fancy f!
+assert_eq!("ƒoo".chars().count(), 3);
+
1.0.0 · Source

pub fn is_empty(&self) -> bool

Returns true if self has a length of zero bytes.

+
§Examples
+
let s = "";
+assert!(s.is_empty());
+
+let s = "not empty";
+assert!(!s.is_empty());
+
1.9.0 · Source

pub fn is_char_boundary(&self, index: usize) -> bool

Checks that index-th byte is the first byte in a UTF-8 code point +sequence or the end of the string.

+

The start and end of the string (when index == self.len()) are +considered to be boundaries.

+

Returns false if index is greater than self.len().

+
§Examples
+
let s = "Löwe 老虎 Léopard";
+assert!(s.is_char_boundary(0));
+// start of `老`
+assert!(s.is_char_boundary(6));
+assert!(s.is_char_boundary(s.len()));
+
+// second byte of `ö`
+assert!(!s.is_char_boundary(2));
+
+// third byte of `老`
+assert!(!s.is_char_boundary(8));
+
Source

pub fn floor_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not exceeding index where is_char_boundary(x) is true.

+

This method can help you truncate a string so that it’s still valid UTF-8, but doesn’t +exceed a given number of bytes. Note that this is done purely at the character level +and can still visually split graphemes, even though the underlying characters aren’t +split. For example, the emoji 🧑‍🔬 (scientist) could be split so that the string only +includes 🧑 (person) instead.

+
§Examples
+
#![feature(round_char_boundary)]
+let s = "❤️🧡💛💚💙💜";
+assert_eq!(s.len(), 26);
+assert!(!s.is_char_boundary(13));
+
+let closest = s.floor_char_boundary(13);
+assert_eq!(closest, 10);
+assert_eq!(&s[..closest], "❤️🧡");
+
Source

pub fn ceil_char_boundary(&self, index: usize) -> usize

🔬This is a nightly-only experimental API. (round_char_boundary)

Finds the closest x not below index where is_char_boundary(x) is true.

+

If index is greater than the length of the string, this returns the length of the string.

+

This method is the natural complement to floor_char_boundary. See that method +for more details.

+
§Examples
+
#![feature(round_char_boundary)]
+let s = "❤️🧡💛💚💙💜";
+assert_eq!(s.len(), 26);
+assert!(!s.is_char_boundary(13));
+
+let closest = s.ceil_char_boundary(13);
+assert_eq!(closest, 14);
+assert_eq!(&s[..closest], "❤️🧡💛");
+
1.0.0 · Source

pub fn as_bytes(&self) -> &[u8]

Converts a string slice to a byte slice. To convert the byte slice back +into a string slice, use the from_utf8 function.

+
§Examples
+
let bytes = "bors".as_bytes();
+assert_eq!(b"bors", bytes);
+
1.0.0 · Source

pub fn as_ptr(&self) -> *const u8

Converts a string slice to a raw pointer.

+

As string slices are a slice of bytes, the raw pointer points to a +u8. This pointer will be pointing to the first byte of the string +slice.

+

The caller must ensure that the returned pointer is never written to. +If you need to mutate the contents of the string slice, use as_mut_ptr.

+
§Examples
+
let s = "Hello";
+let ptr = s.as_ptr();
+
1.20.0 · Source

pub fn get<I>(&self, i: I) -> Option<&<I as SliceIndex<str>>::Output>
where + I: SliceIndex<str>,

Returns a subslice of str.

+

This is the non-panicking alternative to indexing the str. Returns +None whenever equivalent indexing operation would panic.

+
§Examples
+
let v = String::from("🗻∈🌏");
+
+assert_eq!(Some("🗻"), v.get(0..4));
+
+// indices not on UTF-8 sequence boundaries
+assert!(v.get(1..).is_none());
+assert!(v.get(..8).is_none());
+
+// out of bounds
+assert!(v.get(..42).is_none());
+
1.20.0 · Source

pub unsafe fn get_unchecked<I>(&self, i: I) -> &<I as SliceIndex<str>>::Output
where + I: SliceIndex<str>,

Returns an unchecked subslice of str.

+

This is the unchecked alternative to indexing the str.

+
§Safety
+

Callers of this function are responsible that these preconditions are +satisfied:

+
    +
  • The starting index must not exceed the ending index;
  • +
  • Indexes must be within bounds of the original slice;
  • +
  • Indexes must lie on UTF-8 sequence boundaries.
  • +
+

Failing that, the returned string slice may reference invalid memory or +violate the invariants communicated by the str type.

+
§Examples
+
let v = "🗻∈🌏";
+unsafe {
+    assert_eq!("🗻", v.get_unchecked(0..4));
+    assert_eq!("∈", v.get_unchecked(4..7));
+    assert_eq!("🌏", v.get_unchecked(7..11));
+}
+
1.0.0 · Source

pub unsafe fn slice_unchecked(&self, begin: usize, end: usize) -> &str

👎Deprecated since 1.29.0: use get_unchecked(begin..end) instead

Creates a string slice from another string slice, bypassing safety +checks.

+

This is generally not recommended, use with caution! For a safe +alternative see str and Index.

+

This new slice goes from begin to end, including begin but +excluding end.

+

To get a mutable string slice instead, see the +slice_mut_unchecked method.

+
§Safety
+

Callers of this function are responsible that three preconditions are +satisfied:

+
    +
  • begin must not exceed end.
  • +
  • begin and end must be byte positions within the string slice.
  • +
  • begin and end must lie on UTF-8 sequence boundaries.
  • +
+
§Examples
+
let s = "Löwe 老虎 Léopard";
+
+unsafe {
+    assert_eq!("Löwe 老虎 Léopard", s.slice_unchecked(0, 21));
+}
+
+let s = "Hello, world!";
+
+unsafe {
+    assert_eq!("world", s.slice_unchecked(7, 12));
+}
+
1.4.0 · Source

pub fn split_at(&self, mid: usize) -> (&str, &str)

Divides one string slice into two at an index.

+

The argument, mid, should be a byte offset from the start of the +string. It must also be on the boundary of a UTF-8 code point.

+

The two slices returned go from the start of the string slice to mid, +and from mid to the end of the string slice.

+

To get mutable string slices instead, see the split_at_mut +method.

+
§Panics
+

Panics if mid is not on a UTF-8 code point boundary, or if it is past +the end of the last code point of the string slice. For a non-panicking +alternative see split_at_checked.

+
§Examples
+
let s = "Per Martin-Löf";
+
+let (first, last) = s.split_at(3);
+
+assert_eq!("Per", first);
+assert_eq!(" Martin-Löf", last);
+
1.80.0 · Source

pub fn split_at_checked(&self, mid: usize) -> Option<(&str, &str)>

Divides one string slice into two at an index.

+

The argument, mid, should be a valid byte offset from the start of the +string. It must also be on the boundary of a UTF-8 code point. The +method returns None if that’s not the case.

+

The two slices returned go from the start of the string slice to mid, +and from mid to the end of the string slice.

+

To get mutable string slices instead, see the split_at_mut_checked +method.

+
§Examples
+
let s = "Per Martin-Löf";
+
+let (first, last) = s.split_at_checked(3).unwrap();
+assert_eq!("Per", first);
+assert_eq!(" Martin-Löf", last);
+
+assert_eq!(None, s.split_at_checked(13));  // Inside “ö”
+assert_eq!(None, s.split_at_checked(16));  // Beyond the string length
+
1.0.0 · Source

pub fn chars(&self) -> Chars<'_>

Returns an iterator over the chars of a string slice.

+

As a string slice consists of valid UTF-8, we can iterate through a +string slice by char. This method returns such an iterator.

+

It’s important to remember that char represents a Unicode Scalar +Value, and might not match your idea of what a ‘character’ is. Iteration +over grapheme clusters may be what you actually want. This functionality +is not provided by Rust’s standard library, check crates.io instead.

+
§Examples
+

Basic usage:

+ +
let word = "goodbye";
+
+let count = word.chars().count();
+assert_eq!(7, count);
+
+let mut chars = word.chars();
+
+assert_eq!(Some('g'), chars.next());
+assert_eq!(Some('o'), chars.next());
+assert_eq!(Some('o'), chars.next());
+assert_eq!(Some('d'), chars.next());
+assert_eq!(Some('b'), chars.next());
+assert_eq!(Some('y'), chars.next());
+assert_eq!(Some('e'), chars.next());
+
+assert_eq!(None, chars.next());
+

Remember, chars might not match your intuition about characters:

+ +
let y = "y̆";
+
+let mut chars = y.chars();
+
+assert_eq!(Some('y'), chars.next()); // not 'y̆'
+assert_eq!(Some('\u{0306}'), chars.next());
+
+assert_eq!(None, chars.next());
+
1.0.0 · Source

pub fn char_indices(&self) -> CharIndices<'_>

Returns an iterator over the chars of a string slice, and their +positions.

+

As a string slice consists of valid UTF-8, we can iterate through a +string slice by char. This method returns an iterator of both +these chars, as well as their byte positions.

+

The iterator yields tuples. The position is first, the char is +second.

+
§Examples
+

Basic usage:

+ +
let word = "goodbye";
+
+let count = word.char_indices().count();
+assert_eq!(7, count);
+
+let mut char_indices = word.char_indices();
+
+assert_eq!(Some((0, 'g')), char_indices.next());
+assert_eq!(Some((1, 'o')), char_indices.next());
+assert_eq!(Some((2, 'o')), char_indices.next());
+assert_eq!(Some((3, 'd')), char_indices.next());
+assert_eq!(Some((4, 'b')), char_indices.next());
+assert_eq!(Some((5, 'y')), char_indices.next());
+assert_eq!(Some((6, 'e')), char_indices.next());
+
+assert_eq!(None, char_indices.next());
+

Remember, chars might not match your intuition about characters:

+ +
let yes = "y̆es";
+
+let mut char_indices = yes.char_indices();
+
+assert_eq!(Some((0, 'y')), char_indices.next()); // not (0, 'y̆')
+assert_eq!(Some((1, '\u{0306}')), char_indices.next());
+
+// note the 3 here - the previous character took up two bytes
+assert_eq!(Some((3, 'e')), char_indices.next());
+assert_eq!(Some((4, 's')), char_indices.next());
+
+assert_eq!(None, char_indices.next());
+
1.0.0 · Source

pub fn bytes(&self) -> Bytes<'_>

Returns an iterator over the bytes of a string slice.

+

As a string slice consists of a sequence of bytes, we can iterate +through a string slice by byte. This method returns such an iterator.

+
§Examples
+
let mut bytes = "bors".bytes();
+
+assert_eq!(Some(b'b'), bytes.next());
+assert_eq!(Some(b'o'), bytes.next());
+assert_eq!(Some(b'r'), bytes.next());
+assert_eq!(Some(b's'), bytes.next());
+
+assert_eq!(None, bytes.next());
+
1.1.0 · Source

pub fn split_whitespace(&self) -> SplitWhitespace<'_>

Splits a string slice by whitespace.

+

The iterator returned will return string slices that are sub-slices of +the original string slice, separated by any amount of whitespace.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space. If you only want to split on ASCII whitespace +instead, use split_ascii_whitespace.

+
§Examples
+

Basic usage:

+ +
let mut iter = "A few words".split_whitespace();
+
+assert_eq!(Some("A"), iter.next());
+assert_eq!(Some("few"), iter.next());
+assert_eq!(Some("words"), iter.next());
+
+assert_eq!(None, iter.next());
+

All kinds of whitespace are considered:

+ +
let mut iter = " Mary   had\ta\u{2009}little  \n\t lamb".split_whitespace();
+assert_eq!(Some("Mary"), iter.next());
+assert_eq!(Some("had"), iter.next());
+assert_eq!(Some("a"), iter.next());
+assert_eq!(Some("little"), iter.next());
+assert_eq!(Some("lamb"), iter.next());
+
+assert_eq!(None, iter.next());
+

If the string is empty or all whitespace, the iterator yields no string slices:

+ +
assert_eq!("".split_whitespace().next(), None);
+assert_eq!("   ".split_whitespace().next(), None);
+
1.34.0 · Source

pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_>

Splits a string slice by ASCII whitespace.

+

The iterator returned will return string slices that are sub-slices of +the original string slice, separated by any amount of ASCII whitespace.

+

This uses the same definition as char::is_ascii_whitespace. +To split by Unicode Whitespace instead, use split_whitespace.

+
§Examples
+

Basic usage:

+ +
let mut iter = "A few words".split_ascii_whitespace();
+
+assert_eq!(Some("A"), iter.next());
+assert_eq!(Some("few"), iter.next());
+assert_eq!(Some("words"), iter.next());
+
+assert_eq!(None, iter.next());
+

Various kinds of ASCII whitespace are considered +(see char::is_ascii_whitespace):

+ +
let mut iter = " Mary   had\ta little  \n\t lamb".split_ascii_whitespace();
+assert_eq!(Some("Mary"), iter.next());
+assert_eq!(Some("had"), iter.next());
+assert_eq!(Some("a"), iter.next());
+assert_eq!(Some("little"), iter.next());
+assert_eq!(Some("lamb"), iter.next());
+
+assert_eq!(None, iter.next());
+

If the string is empty or all ASCII whitespace, the iterator yields no string slices:

+ +
assert_eq!("".split_ascii_whitespace().next(), None);
+assert_eq!("   ".split_ascii_whitespace().next(), None);
+
1.0.0 · Source

pub fn lines(&self) -> Lines<'_>

Returns an iterator over the lines of a string, as string slices.

+

Lines are split at line endings that are either newlines (\n) or +sequences of a carriage return followed by a line feed (\r\n).

+

Line terminators are not included in the lines returned by the iterator.

+

Note that any carriage return (\r) not immediately followed by a +line feed (\n) does not split a line. These carriage returns are +thereby included in the produced lines.

+

The final line ending is optional. A string that ends with a final line +ending will return the same lines as an otherwise identical string +without a final line ending.

+
§Examples
+

Basic usage:

+ +
let text = "foo\r\nbar\n\nbaz\r";
+let mut lines = text.lines();
+
+assert_eq!(Some("foo"), lines.next());
+assert_eq!(Some("bar"), lines.next());
+assert_eq!(Some(""), lines.next());
+// Trailing carriage return is included in the last line
+assert_eq!(Some("baz\r"), lines.next());
+
+assert_eq!(None, lines.next());
+

The final line does not require any ending:

+ +
let text = "foo\nbar\n\r\nbaz";
+let mut lines = text.lines();
+
+assert_eq!(Some("foo"), lines.next());
+assert_eq!(Some("bar"), lines.next());
+assert_eq!(Some(""), lines.next());
+assert_eq!(Some("baz"), lines.next());
+
+assert_eq!(None, lines.next());
+
1.0.0 · Source

pub fn lines_any(&self) -> LinesAny<'_>

👎Deprecated since 1.4.0: use lines() instead now

Returns an iterator over the lines of a string.

+
1.8.0 · Source

pub fn encode_utf16(&self) -> EncodeUtf16<'_>

Returns an iterator of u16 over the string encoded +as native endian UTF-16 (without byte-order mark).

+
§Examples
+
let text = "Zażółć gęślą jaźń";
+
+let utf8_len = text.len();
+let utf16_len = text.encode_utf16().count();
+
+assert!(utf16_len <= utf8_len);
+
1.0.0 · Source

pub fn contains<P>(&self, pat: P) -> bool
where + P: Pattern,

Returns true if the given pattern matches a sub-slice of +this string slice.

+

Returns false if it does not.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.contains("nana"));
+assert!(!bananas.contains("apples"));
+
1.0.0 · Source

pub fn starts_with<P>(&self, pat: P) -> bool
where + P: Pattern,

Returns true if the given pattern matches a prefix of this +string slice.

+

Returns false if it does not.

+

The pattern can be a &str, in which case this function will return true if +the &str is a prefix of this string slice.

+

The pattern can also be a char, a slice of chars, or a +function or closure that determines if a character matches. +These will only be checked against the first character of this string slice. +Look at the second example below regarding behavior for slices of chars.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.starts_with("bana"));
+assert!(!bananas.starts_with("nana"));
+ +
let bananas = "bananas";
+
+// Note that both of these assert successfully.
+assert!(bananas.starts_with(&['b', 'a', 'n', 'a']));
+assert!(bananas.starts_with(&['a', 'b', 'c', 'd']));
+
1.0.0 · Source

pub fn ends_with<P>(&self, pat: P) -> bool
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns true if the given pattern matches a suffix of this +string slice.

+

Returns false if it does not.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let bananas = "bananas";
+
+assert!(bananas.ends_with("anas"));
+assert!(!bananas.ends_with("nana"));
+
1.0.0 · Source

pub fn find<P>(&self, pat: P) -> Option<usize>
where + P: Pattern,

Returns the byte index of the first character of this string slice that +matches the pattern.

+

Returns None if the pattern doesn’t match.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
let s = "Löwe 老虎 Léopard Gepardi";
+
+assert_eq!(s.find('L'), Some(0));
+assert_eq!(s.find('é'), Some(14));
+assert_eq!(s.find("pard"), Some(17));
+

More complex patterns using point-free style and closures:

+ +
let s = "Löwe 老虎 Léopard";
+
+assert_eq!(s.find(char::is_whitespace), Some(5));
+assert_eq!(s.find(char::is_lowercase), Some(1));
+assert_eq!(s.find(|c: char| c.is_whitespace() || c.is_lowercase()), Some(1));
+assert_eq!(s.find(|c: char| (c < 'o') && (c > 'a')), Some(4));
+

Not finding the pattern:

+ +
let s = "Löwe 老虎 Léopard";
+let x: &[_] = &['1', '2'];
+
+assert_eq!(s.find(x), None);
+
1.0.0 · Source

pub fn rfind<P>(&self, pat: P) -> Option<usize>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns the byte index for the first character of the last match of the pattern in +this string slice.

+

Returns None if the pattern doesn’t match.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
let s = "Löwe 老虎 Léopard Gepardi";
+
+assert_eq!(s.rfind('L'), Some(13));
+assert_eq!(s.rfind('é'), Some(14));
+assert_eq!(s.rfind("pard"), Some(24));
+

More complex patterns with closures:

+ +
let s = "Löwe 老虎 Léopard";
+
+assert_eq!(s.rfind(char::is_whitespace), Some(12));
+assert_eq!(s.rfind(char::is_lowercase), Some(20));
+

Not finding the pattern:

+ +
let s = "Löwe 老虎 Léopard";
+let x: &[_] = &['1', '2'];
+
+assert_eq!(s.rfind(x), None);
+
1.0.0 · Source

pub fn split<P>(&self, pat: P) -> Split<'_, P>
where + P: Pattern,

Returns an iterator over substrings of this string slice, separated by +characters matched by a pattern.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

If there are no matches the full string slice is returned as the only +item in the iterator.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rsplit method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
+assert_eq!(v, ["Mary", "had", "a", "little", "lamb"]);
+
+let v: Vec<&str> = "".split('X').collect();
+assert_eq!(v, [""]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".split('X').collect();
+assert_eq!(v, ["lion", "", "tiger", "leopard"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".split("::").collect();
+assert_eq!(v, ["lion", "tiger", "leopard"]);
+
+let v: Vec<&str> = "AABBCC".split("DD").collect();
+assert_eq!(v, ["AABBCC"]);
+
+let v: Vec<&str> = "abc1def2ghi".split(char::is_numeric).collect();
+assert_eq!(v, ["abc", "def", "ghi"]);
+
+let v: Vec<&str> = "lionXtigerXleopard".split(char::is_uppercase).collect();
+assert_eq!(v, ["lion", "tiger", "leopard"]);
+

If the pattern is a slice of chars, split on each occurrence of any of the characters:

+ +
let v: Vec<&str> = "2020-11-03 23:59".split(&['-', ' ', ':', '@'][..]).collect();
+assert_eq!(v, ["2020", "11", "03", "23", "59"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".split(|c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["abc", "def", "ghi"]);
+

If a string contains multiple contiguous separators, you will end up +with empty strings in the output:

+ +
let x = "||||a||b|c".to_string();
+let d: Vec<_> = x.split('|').collect();
+
+assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
+

Contiguous separators are separated by the empty string.

+ +
let x = "(///)".to_string();
+let d: Vec<_> = x.split('/').collect();
+
+assert_eq!(d, &["(", "", "", ")"]);
+

Separators at the start or end of a string are neighbored +by empty strings.

+ +
let d: Vec<_> = "010".split("0").collect();
+assert_eq!(d, &["", "1", ""]);
+

When the empty string is used as a separator, it separates +every character in the string, along with the beginning +and end of the string.

+ +
let f: Vec<_> = "rust".split("").collect();
+assert_eq!(f, &["", "r", "u", "s", "t", ""]);
+

Contiguous separators can lead to possibly surprising behavior +when whitespace is used as the separator. This code is correct:

+ +
let x = "    a  b c".to_string();
+let d: Vec<_> = x.split(' ').collect();
+
+assert_eq!(d, &["", "", "", "", "a", "", "b", "c"]);
+

It does not give you:

+ +
assert_eq!(d, &["a", "b", "c"]);
+

Use split_whitespace for this behavior.

+
1.51.0 · Source

pub fn split_inclusive<P>(&self, pat: P) -> SplitInclusive<'_, P>
where + P: Pattern,

Returns an iterator over substrings of this string slice, separated by +characters matched by a pattern.

+

Differs from the iterator produced by split in that split_inclusive +leaves the matched part as the terminator of the substring.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb."
+    .split_inclusive('\n').collect();
+assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb."]);
+

If the last element of the string is matched, +that element will be considered the terminator of the preceding substring. +That substring will be the last item returned by the iterator.

+ +
let v: Vec<&str> = "Mary had a little lamb\nlittle lamb\nlittle lamb.\n"
+    .split_inclusive('\n').collect();
+assert_eq!(v, ["Mary had a little lamb\n", "little lamb\n", "little lamb.\n"]);
+
1.0.0 · Source

pub fn rsplit<P>(&self, pat: P) -> RSplit<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over substrings of the given string slice, separated +by characters matched by a pattern and yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the split method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".rsplit(' ').collect();
+assert_eq!(v, ["lamb", "little", "a", "had", "Mary"]);
+
+let v: Vec<&str> = "".rsplit('X').collect();
+assert_eq!(v, [""]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".rsplit('X').collect();
+assert_eq!(v, ["leopard", "tiger", "", "lion"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".rsplit("::").collect();
+assert_eq!(v, ["leopard", "tiger", "lion"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".rsplit(|c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["ghi", "def", "abc"]);
+
1.0.0 · Source

pub fn split_terminator<P>(&self, pat: P) -> SplitTerminator<'_, P>
where + P: Pattern,

Returns an iterator over substrings of the given string slice, separated +by characters matched by a pattern.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

Equivalent to split, except that the trailing substring +is skipped if empty.

+

This method can be used for string data that is terminated, +rather than separated by a pattern.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rsplit_terminator method can be used.

+
§Examples
+
let v: Vec<&str> = "A.B.".split_terminator('.').collect();
+assert_eq!(v, ["A", "B"]);
+
+let v: Vec<&str> = "A..B..".split_terminator(".").collect();
+assert_eq!(v, ["A", "", "B", ""]);
+
+let v: Vec<&str> = "A.B:C.D".split_terminator(&['.', ':'][..]).collect();
+assert_eq!(v, ["A", "B", "C", "D"]);
+
1.0.0 · Source

pub fn rsplit_terminator<P>(&self, pat: P) -> RSplitTerminator<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over substrings of self, separated by characters +matched by a pattern and yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+

Equivalent to split, except that the trailing substring is +skipped if empty.

+

This method can be used for string data that is terminated, +rather than separated by a pattern.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a +reverse search, and it will be double ended if a forward/reverse +search yields the same elements.

+

For iterating from the front, the split_terminator method can be +used.

+
§Examples
+
let v: Vec<&str> = "A.B.".rsplit_terminator('.').collect();
+assert_eq!(v, ["B", "A"]);
+
+let v: Vec<&str> = "A..B..".rsplit_terminator(".").collect();
+assert_eq!(v, ["", "B", "", "A"]);
+
+let v: Vec<&str> = "A.B:C.D".rsplit_terminator(&['.', ':'][..]).collect();
+assert_eq!(v, ["D", "C", "B", "A"]);
+
1.0.0 · Source

pub fn splitn<P>(&self, n: usize, pat: P) -> SplitN<'_, P>
where + P: Pattern,

Returns an iterator over substrings of the given string slice, separated +by a pattern, restricted to returning at most n items.

+

If n substrings are returned, the last substring (the nth substring) +will contain the remainder of the string.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will not be double ended, because it is +not efficient to support.

+

If the pattern allows a reverse search, the rsplitn method can be +used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lambda".splitn(3, ' ').collect();
+assert_eq!(v, ["Mary", "had", "a little lambda"]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".splitn(3, "X").collect();
+assert_eq!(v, ["lion", "", "tigerXleopard"]);
+
+let v: Vec<&str> = "abcXdef".splitn(1, 'X').collect();
+assert_eq!(v, ["abcXdef"]);
+
+let v: Vec<&str> = "".splitn(1, 'X').collect();
+assert_eq!(v, [""]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".splitn(2, |c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["abc", "defXghi"]);
+
1.0.0 · Source

pub fn rsplitn<P>(&self, n: usize, pat: P) -> RSplitN<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over substrings of this string slice, separated by a +pattern, starting from the end of the string, restricted to returning at +most n items.

+

If n substrings are returned, the last substring (the nth substring) +will contain the remainder of the string.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will not be double ended, because it is not +efficient to support.

+

For splitting from the front, the splitn method can be used.

+
§Examples
+

Simple patterns:

+ +
let v: Vec<&str> = "Mary had a little lamb".rsplitn(3, ' ').collect();
+assert_eq!(v, ["lamb", "little", "Mary had a"]);
+
+let v: Vec<&str> = "lionXXtigerXleopard".rsplitn(3, 'X').collect();
+assert_eq!(v, ["leopard", "tiger", "lionX"]);
+
+let v: Vec<&str> = "lion::tiger::leopard".rsplitn(2, "::").collect();
+assert_eq!(v, ["leopard", "lion::tiger"]);
+

A more complex pattern, using a closure:

+ +
let v: Vec<&str> = "abc1defXghi".rsplitn(2, |c| c == '1' || c == 'X').collect();
+assert_eq!(v, ["ghi", "abc1def"]);
+
1.52.0 · Source

pub fn split_once<P>(&self, delimiter: P) -> Option<(&str, &str)>
where + P: Pattern,

Splits the string on the first occurrence of the specified delimiter and +returns prefix before delimiter and suffix after delimiter.

+
§Examples
+
assert_eq!("cfg".split_once('='), None);
+assert_eq!("cfg=".split_once('='), Some(("cfg", "")));
+assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo")));
+assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar")));
+
1.52.0 · Source

pub fn rsplit_once<P>(&self, delimiter: P) -> Option<(&str, &str)>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Splits the string on the last occurrence of the specified delimiter and +returns prefix before delimiter and suffix after delimiter.

+
§Examples
+
assert_eq!("cfg".rsplit_once('='), None);
+assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo")));
+assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar")));
+
1.2.0 · Source

pub fn matches<P>(&self, pat: P) -> Matches<'_, P>
where + P: Pattern,

Returns an iterator over the disjoint matches of a pattern within the +given string slice.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rmatches method can be used.

+
§Examples
+
let v: Vec<&str> = "abcXXXabcYYYabc".matches("abc").collect();
+assert_eq!(v, ["abc", "abc", "abc"]);
+
+let v: Vec<&str> = "1abc2abc3".matches(char::is_numeric).collect();
+assert_eq!(v, ["1", "2", "3"]);
+
1.2.0 · Source

pub fn rmatches<P>(&self, pat: P) -> RMatches<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over the disjoint matches of a pattern within this +string slice, yielded in reverse order.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the matches method can be used.

+
§Examples
+
let v: Vec<&str> = "abcXXXabcYYYabc".rmatches("abc").collect();
+assert_eq!(v, ["abc", "abc", "abc"]);
+
+let v: Vec<&str> = "1abc2abc3".rmatches(char::is_numeric).collect();
+assert_eq!(v, ["3", "2", "1"]);
+
1.5.0 · Source

pub fn match_indices<P>(&self, pat: P) -> MatchIndices<'_, P>
where + P: Pattern,

Returns an iterator over the disjoint matches of a pattern within this string +slice as well as the index that the match starts at.

+

For matches of pat within self that overlap, only the indices +corresponding to the first match are returned.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator will be a DoubleEndedIterator if the pattern +allows a reverse search and forward/reverse search yields the same +elements. This is true for, e.g., char, but not for &str.

+

If the pattern allows a reverse search but its results might differ +from a forward search, the rmatch_indices method can be used.

+
§Examples
+
let v: Vec<_> = "abcXXXabcYYYabc".match_indices("abc").collect();
+assert_eq!(v, [(0, "abc"), (6, "abc"), (12, "abc")]);
+
+let v: Vec<_> = "1abcabc2".match_indices("abc").collect();
+assert_eq!(v, [(1, "abc"), (4, "abc")]);
+
+let v: Vec<_> = "ababa".match_indices("aba").collect();
+assert_eq!(v, [(0, "aba")]); // only the first `aba`
+
1.5.0 · Source

pub fn rmatch_indices<P>(&self, pat: P) -> RMatchIndices<'_, P>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns an iterator over the disjoint matches of a pattern within self, +yielded in reverse order along with the index of the match.

+

For matches of pat within self that overlap, only the indices +corresponding to the last match are returned.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Iterator behavior
+

The returned iterator requires that the pattern supports a reverse +search, and it will be a DoubleEndedIterator if a forward/reverse +search yields the same elements.

+

For iterating from the front, the match_indices method can be used.

+
§Examples
+
let v: Vec<_> = "abcXXXabcYYYabc".rmatch_indices("abc").collect();
+assert_eq!(v, [(12, "abc"), (6, "abc"), (0, "abc")]);
+
+let v: Vec<_> = "1abcabc2".rmatch_indices("abc").collect();
+assert_eq!(v, [(4, "abc"), (1, "abc")]);
+
+let v: Vec<_> = "ababa".rmatch_indices("aba").collect();
+assert_eq!(v, [(2, "aba")]); // only the last `aba`
+
1.0.0 · Source

pub fn trim(&self) -> &str

Returns a string slice with leading and trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Examples
+
let s = "\n Hello\tworld\t\n";
+
+assert_eq!("Hello\tworld", s.trim());
+
1.30.0 · Source

pub fn trim_start(&self) -> &str

Returns a string slice with leading whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Text directionality
+

A string is a sequence of bytes. start in this context means the first +position of that byte string; for a left-to-right language like English or +Russian, this will be left side, and for right-to-left languages like +Arabic or Hebrew, this will be the right side.

+
§Examples
+

Basic usage:

+ +
let s = "\n Hello\tworld\t\n";
+assert_eq!("Hello\tworld\t\n", s.trim_start());
+

Directionality:

+ +
let s = "  English  ";
+assert!(Some('E') == s.trim_start().chars().next());
+
+let s = "  עברית  ";
+assert!(Some('ע') == s.trim_start().chars().next());
+
1.30.0 · Source

pub fn trim_end(&self) -> &str

Returns a string slice with trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space, which includes newlines.

+
§Text directionality
+

A string is a sequence of bytes. end in this context means the last +position of that byte string; for a left-to-right language like English or +Russian, this will be right side, and for right-to-left languages like +Arabic or Hebrew, this will be the left side.

+
§Examples
+

Basic usage:

+ +
let s = "\n Hello\tworld\t\n";
+assert_eq!("\n Hello\tworld", s.trim_end());
+

Directionality:

+ +
let s = "  English  ";
+assert!(Some('h') == s.trim_end().chars().rev().next());
+
+let s = "  עברית  ";
+assert!(Some('ת') == s.trim_end().chars().rev().next());
+
1.0.0 · Source

pub fn trim_left(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_start

Returns a string slice with leading whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space.

+
§Text directionality
+

A string is a sequence of bytes. ‘Left’ in this context means the first +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the right side, not the left.

+
§Examples
+

Basic usage:

+ +
let s = " Hello\tworld\t";
+
+assert_eq!("Hello\tworld\t", s.trim_left());
+

Directionality:

+ +
let s = "  English";
+assert!(Some('E') == s.trim_left().chars().next());
+
+let s = "  עברית";
+assert!(Some('ע') == s.trim_left().chars().next());
+
1.0.0 · Source

pub fn trim_right(&self) -> &str

👎Deprecated since 1.33.0: superseded by trim_end

Returns a string slice with trailing whitespace removed.

+

‘Whitespace’ is defined according to the terms of the Unicode Derived +Core Property White_Space.

+
§Text directionality
+

A string is a sequence of bytes. ‘Right’ in this context means the last +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the left side, not the right.

+
§Examples
+

Basic usage:

+ +
let s = " Hello\tworld\t";
+
+assert_eq!(" Hello\tworld", s.trim_right());
+

Directionality:

+ +
let s = "English  ";
+assert!(Some('h') == s.trim_right().chars().rev().next());
+
+let s = "עברית  ";
+assert!(Some('ת') == s.trim_right().chars().rev().next());
+
1.0.0 · Source

pub fn trim_matches<P>(&self, pat: P) -> &str
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> DoubleEndedSearcher<'a>,

Returns a string slice with all prefixes and suffixes that match a +pattern repeatedly removed.

+

The pattern can be a char, a slice of chars, or a function +or closure that determines if a character matches.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_matches('1'), "foo1bar");
+assert_eq!("123foo1bar123".trim_matches(char::is_numeric), "foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_matches(x), "foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1foo1barXX".trim_matches(|c| c == '1' || c == 'X'), "foo1bar");
+
1.30.0 · Source

pub fn trim_start_matches<P>(&self, pat: P) -> &str
where + P: Pattern,

Returns a string slice with all prefixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. start in this context means the first +position of that byte string; for a left-to-right language like English or +Russian, this will be left side, and for right-to-left languages like +Arabic or Hebrew, this will be the right side.

+
§Examples
+
assert_eq!("11foo1bar11".trim_start_matches('1'), "foo1bar11");
+assert_eq!("123foo1bar123".trim_start_matches(char::is_numeric), "foo1bar123");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_start_matches(x), "foo1bar12");
+
1.45.0 · Source

pub fn strip_prefix<P>(&self, prefix: P) -> Option<&str>
where + P: Pattern,

Returns a string slice with the prefix removed.

+

If the string starts with the pattern prefix, returns the substring after the prefix, +wrapped in Some. Unlike trim_start_matches, this method removes the prefix exactly once.

+

If the string does not start with prefix, returns None.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
assert_eq!("foo:bar".strip_prefix("foo:"), Some("bar"));
+assert_eq!("foo:bar".strip_prefix("bar"), None);
+assert_eq!("foofoo".strip_prefix("foo"), Some("foo"));
+
1.45.0 · Source

pub fn strip_suffix<P>(&self, suffix: P) -> Option<&str>
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns a string slice with the suffix removed.

+

If the string ends with the pattern suffix, returns the substring before the suffix, +wrapped in Some. Unlike trim_end_matches, this method removes the suffix exactly once.

+

If the string does not end with suffix, returns None.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
assert_eq!("bar:foo".strip_suffix(":foo"), Some("bar"));
+assert_eq!("bar:foo".strip_suffix("bar"), None);
+assert_eq!("foofoo".strip_suffix("foo"), Some("foo"));
+
Source

pub fn trim_prefix<P>(&self, prefix: P) -> &str
where + P: Pattern,

🔬This is a nightly-only experimental API. (trim_prefix_suffix)

Returns a string slice with the optional prefix removed.

+

If the string starts with the pattern prefix, returns the substring after the prefix. +Unlike strip_prefix, this method always returns &str for easy method chaining, +instead of returning Option<&str>.

+

If the string does not start with prefix, returns the original string unchanged.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
#![feature(trim_prefix_suffix)]
+
+// Prefix present - removes it
+assert_eq!("foo:bar".trim_prefix("foo:"), "bar");
+assert_eq!("foofoo".trim_prefix("foo"), "foo");
+
+// Prefix absent - returns original string
+assert_eq!("foo:bar".trim_prefix("bar"), "foo:bar");
+
+// Method chaining example
+assert_eq!("<https://example.com/>".trim_prefix('<').trim_suffix('>'), "https://example.com/");
+
Source

pub fn trim_suffix<P>(&self, suffix: P) -> &str
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

🔬This is a nightly-only experimental API. (trim_prefix_suffix)

Returns a string slice with the optional suffix removed.

+

If the string ends with the pattern suffix, returns the substring before the suffix. +Unlike strip_suffix, this method always returns &str for easy method chaining, +instead of returning Option<&str>.

+

If the string does not end with suffix, returns the original string unchanged.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Examples
+
#![feature(trim_prefix_suffix)]
+
+// Suffix present - removes it
+assert_eq!("bar:foo".trim_suffix(":foo"), "bar");
+assert_eq!("foofoo".trim_suffix("foo"), "foo");
+
+// Suffix absent - returns original string
+assert_eq!("bar:foo".trim_suffix("bar"), "bar:foo");
+
+// Method chaining example
+assert_eq!("<https://example.com/>".trim_prefix('<').trim_suffix('>'), "https://example.com/");
+
1.30.0 · Source

pub fn trim_end_matches<P>(&self, pat: P) -> &str
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

Returns a string slice with all suffixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. end in this context means the last +position of that byte string; for a left-to-right language like English or +Russian, this will be right side, and for right-to-left languages like +Arabic or Hebrew, this will be the left side.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_end_matches('1'), "11foo1bar");
+assert_eq!("123foo1bar123".trim_end_matches(char::is_numeric), "123foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_end_matches(x), "12foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1fooX".trim_end_matches(|c| c == '1' || c == 'X'), "1foo");
+
1.0.0 · Source

pub fn trim_left_matches<P>(&self, pat: P) -> &str
where + P: Pattern,

👎Deprecated since 1.33.0: superseded by trim_start_matches

Returns a string slice with all prefixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. ‘Left’ in this context means the first +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the right side, not the left.

+
§Examples
+
assert_eq!("11foo1bar11".trim_left_matches('1'), "foo1bar11");
+assert_eq!("123foo1bar123".trim_left_matches(char::is_numeric), "foo1bar123");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_left_matches(x), "foo1bar12");
+
1.0.0 · Source

pub fn trim_right_matches<P>(&self, pat: P) -> &str
where + P: Pattern, + <P as Pattern>::Searcher<'a>: for<'a> ReverseSearcher<'a>,

👎Deprecated since 1.33.0: superseded by trim_end_matches

Returns a string slice with all suffixes that match a pattern +repeatedly removed.

+

The pattern can be a &str, char, a slice of chars, or a +function or closure that determines if a character matches.

+
§Text directionality
+

A string is a sequence of bytes. ‘Right’ in this context means the last +position of that byte string; for a language like Arabic or Hebrew +which are ‘right to left’ rather than ‘left to right’, this will be +the left side, not the right.

+
§Examples
+

Simple patterns:

+ +
assert_eq!("11foo1bar11".trim_right_matches('1'), "11foo1bar");
+assert_eq!("123foo1bar123".trim_right_matches(char::is_numeric), "123foo1bar");
+
+let x: &[_] = &['1', '2'];
+assert_eq!("12foo1bar12".trim_right_matches(x), "12foo1bar");
+

A more complex pattern, using a closure:

+ +
assert_eq!("1fooX".trim_right_matches(|c| c == '1' || c == 'X'), "1foo");
+
1.0.0 · Source

pub fn parse<F>(&self) -> Result<F, <F as FromStr>::Err>
where + F: FromStr,

Parses this string slice into another type.

+

Because parse is so general, it can cause problems with type +inference. As such, parse is one of the few times you’ll see +the syntax affectionately known as the ‘turbofish’: ::<>. This +helps the inference algorithm understand specifically which type +you’re trying to parse into.

+

parse can parse into any type that implements the FromStr trait.

+
§Errors
+

Will return Err if it’s not possible to parse this string slice into +the desired type.

+
§Examples
+

Basic usage:

+ +
let four: u32 = "4".parse().unwrap();
+
+assert_eq!(4, four);
+

Using the ‘turbofish’ instead of annotating four:

+ +
let four = "4".parse::<u32>();
+
+assert_eq!(Ok(4), four);
+

Failing to parse:

+ +
let nope = "j".parse::<u32>();
+
+assert!(nope.is_err());
+
1.23.0 · Source

pub fn is_ascii(&self) -> bool

Checks if all characters in this string are within the ASCII range.

+
§Examples
+
let ascii = "hello!\n";
+let non_ascii = "Grüße, Jürgen ❤";
+
+assert!(ascii.is_ascii());
+assert!(!non_ascii.is_ascii());
+
Source

pub fn as_ascii(&self) -> Option<&[AsciiChar]>

🔬This is a nightly-only experimental API. (ascii_char)

If this string slice is_ascii, returns it as a slice +of ASCII characters, otherwise returns None.

+
Source

pub unsafe fn as_ascii_unchecked(&self) -> &[AsciiChar]

🔬This is a nightly-only experimental API. (ascii_char)

Converts this string slice into a slice of ASCII characters, +without checking whether they are valid.

+
§Safety
+

Every character in this string must be ASCII, or else this is UB.

+
1.23.0 · Source

pub fn eq_ignore_ascii_case(&self, other: &str) -> bool

Checks that two strings are an ASCII case-insensitive match.

+

Same as to_ascii_lowercase(a) == to_ascii_lowercase(b), +but without allocating and copying temporaries.

+
§Examples
+
assert!("Ferris".eq_ignore_ascii_case("FERRIS"));
+assert!("Ferrös".eq_ignore_ascii_case("FERRöS"));
+assert!(!"Ferrös".eq_ignore_ascii_case("FERRÖS"));
+
1.80.0 · Source

pub fn trim_ascii_start(&self) -> &str

Returns a string slice with leading ASCII whitespace removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!(" \t \u{3000}hello world\n".trim_ascii_start(), "\u{3000}hello world\n");
+assert_eq!("  ".trim_ascii_start(), "");
+assert_eq!("".trim_ascii_start(), "");
+
1.80.0 · Source

pub fn trim_ascii_end(&self) -> &str

Returns a string slice with trailing ASCII whitespace removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!("\r hello world\u{3000}\n ".trim_ascii_end(), "\r hello world\u{3000}");
+assert_eq!("  ".trim_ascii_end(), "");
+assert_eq!("".trim_ascii_end(), "");
+
1.80.0 · Source

pub fn trim_ascii(&self) -> &str

Returns a string slice with leading and trailing ASCII whitespace +removed.

+

‘Whitespace’ refers to the definition used by +u8::is_ascii_whitespace.

+
§Examples
+
assert_eq!("\r hello world\n ".trim_ascii(), "hello world");
+assert_eq!("  ".trim_ascii(), "");
+assert_eq!("".trim_ascii(), "");
+
1.34.0 · Source

pub fn escape_debug(&self) -> EscapeDebug<'_>

Returns an iterator that escapes each char in self with char::escape_debug.

+

Note: only extended grapheme codepoints that begin the string will be +escaped.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_debug() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_debug());
+

Both are equivalent to:

+ +
println!("❤\\n!");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_debug().to_string(), "❤\\n!");
+
1.34.0 · Source

pub fn escape_default(&self) -> EscapeDefault<'_>

Returns an iterator that escapes each char in self with char::escape_default.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_default() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_default());
+

Both are equivalent to:

+ +
println!("\\u{{2764}}\\n!");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_default().to_string(), "\\u{2764}\\n!");
+
1.34.0 · Source

pub fn escape_unicode(&self) -> EscapeUnicode<'_>

Returns an iterator that escapes each char in self with char::escape_unicode.

+
§Examples
+

As an iterator:

+ +
for c in "❤\n!".escape_unicode() {
+    print!("{c}");
+}
+println!();
+

Using println! directly:

+ +
println!("{}", "❤\n!".escape_unicode());
+

Both are equivalent to:

+ +
println!("\\u{{2764}}\\u{{a}}\\u{{21}}");
+

Using to_string:

+ +
assert_eq!("❤\n!".escape_unicode().to_string(), "\\u{2764}\\u{a}\\u{21}");
+
Source

pub fn substr_range(&self, substr: &str) -> Option<Range<usize>>

🔬This is a nightly-only experimental API. (substr_range)

Returns the range that a substring points to.

+

Returns None if substr does not point within self.

+

Unlike str::find, this does not search through the string. +Instead, it uses pointer arithmetic to find where in the string +substr is derived from.

+

This is useful for extending str::split and similar methods.

+

Note that this method may return false positives (typically either +Some(0..0) or Some(self.len()..self.len())) if substr is a +zero-length str that points at the beginning or end of another, +independent, str.

+
§Examples
+
#![feature(substr_range)]
+
+let data = "a, b, b, a";
+let mut iter = data.split(", ").map(|s| data.substr_range(s).unwrap());
+
+assert_eq!(iter.next(), Some(0..1));
+assert_eq!(iter.next(), Some(3..4));
+assert_eq!(iter.next(), Some(6..7));
+assert_eq!(iter.next(), Some(9..10));
+
Source

pub fn as_str(&self) -> &str

🔬This is a nightly-only experimental API. (str_as_str)

Returns the same string as a string slice &str.

+

This method is redundant when used directly on &str, but +it helps dereferencing other string-like types to string slices, +for example references to Box<str> or Arc<str>.

+
1.0.0 · Source

pub fn replace<P>(&self, from: P, to: &str) -> String
where + P: Pattern,

Replaces all matches of a pattern with another string.

+

replace creates a new String, and copies the data from this string slice into it. +While doing so, it attempts to find matches of a pattern. If it finds any, it +replaces them with the replacement string slice.

+
§Examples
+
let s = "this is old";
+
+assert_eq!("this is new", s.replace("old", "new"));
+assert_eq!("than an old", s.replace("is", "an"));
+

When the pattern doesn’t match, it returns this string slice as String:

+ +
let s = "this is old";
+assert_eq!(s, s.replace("cookie monster", "little lamb"));
+
1.16.0 · Source

pub fn replacen<P>(&self, pat: P, to: &str, count: usize) -> String
where + P: Pattern,

Replaces first N matches of a pattern with another string.

+

replacen creates a new String, and copies the data from this string slice into it. +While doing so, it attempts to find matches of a pattern. If it finds any, it +replaces them with the replacement string slice at most count times.

+
§Examples
+
let s = "foo foo 123 foo";
+assert_eq!("new new 123 foo", s.replacen("foo", "new", 2));
+assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3));
+assert_eq!("foo foo new23 foo", s.replacen(char::is_numeric, "new", 1));
+

When the pattern doesn’t match, it returns this string slice as String:

+ +
let s = "this is old";
+assert_eq!(s, s.replacen("cookie monster", "little lamb", 10));
+
1.2.0 · Source

pub fn to_lowercase(&self) -> String

Returns the lowercase equivalent of this string slice, as a new String.

+

‘Lowercase’ is defined according to the terms of the Unicode Derived Core Property +Lowercase.

+

Since some characters can expand into multiple characters when changing +the case, this function returns a String instead of modifying the +parameter in-place.

+
§Examples
+

Basic usage:

+ +
let s = "HELLO";
+
+assert_eq!("hello", s.to_lowercase());
+

A tricky example, with sigma:

+ +
let sigma = "Σ";
+
+assert_eq!("σ", sigma.to_lowercase());
+
+// but at the end of a word, it's ς, not σ:
+let odysseus = "ὈΔΥΣΣΕΎΣ";
+
+assert_eq!("ὀδυσσεύς", odysseus.to_lowercase());
+

Languages without case are not changed:

+ +
let new_year = "农历新年";
+
+assert_eq!(new_year, new_year.to_lowercase());
+
1.2.0 · Source

pub fn to_uppercase(&self) -> String

Returns the uppercase equivalent of this string slice, as a new String.

+

‘Uppercase’ is defined according to the terms of the Unicode Derived Core Property +Uppercase.

+

Since some characters can expand into multiple characters when changing +the case, this function returns a String instead of modifying the +parameter in-place.

+
§Examples
+

Basic usage:

+ +
let s = "hello";
+
+assert_eq!("HELLO", s.to_uppercase());
+

Scripts without case are not changed:

+ +
let new_year = "农历新年";
+
+assert_eq!(new_year, new_year.to_uppercase());
+

One character can become multiple:

+ +
let s = "tschüß";
+
+assert_eq!("TSCHÜSS", s.to_uppercase());
+
1.16.0 · Source

pub fn repeat(&self, n: usize) -> String

Creates a new String by repeating a string n times.

+
§Panics
+

This function will panic if the capacity would overflow.

+
§Examples
+

Basic usage:

+ +
assert_eq!("abc".repeat(4), String::from("abcabcabcabc"));
+

A panic upon overflow:

+ +
// this will panic at runtime
+let huge = "0123456789abcdef".repeat(usize::MAX);
+
1.23.0 · Source

pub fn to_ascii_uppercase(&self) -> String

Returns a copy of this string where each character is mapped to its +ASCII upper case equivalent.

+

ASCII letters ‘a’ to ‘z’ are mapped to ‘A’ to ‘Z’, +but non-ASCII letters are unchanged.

+

To uppercase the value in-place, use make_ascii_uppercase.

+

To uppercase ASCII characters in addition to non-ASCII characters, use +to_uppercase.

+
§Examples
+
let s = "Grüße, Jürgen ❤";
+
+assert_eq!("GRüßE, JüRGEN ❤", s.to_ascii_uppercase());
+
1.23.0 · Source

pub fn to_ascii_lowercase(&self) -> String

Returns a copy of this string where each character is mapped to its +ASCII lower case equivalent.

+

ASCII letters ‘A’ to ‘Z’ are mapped to ‘a’ to ‘z’, +but non-ASCII letters are unchanged.

+

To lowercase the value in-place, use make_ascii_lowercase.

+

To lowercase ASCII characters in addition to non-ASCII characters, use +to_lowercase.

+
§Examples
+
let s = "Grüße, Jürgen ❤";
+
+assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
+

Trait Implementations§

§

impl Borrow<str> for SmolStr

§

fn borrow(&self) -> &str

Immutably borrows from an owned value. Read more
§

impl Clone for SmolStr

§

fn clone(&self) -> SmolStr

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for SmolStr

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Default for SmolStr

§

fn default() -> SmolStr

Returns the “default value” for a type. Read more
§

impl Deref for SmolStr

§

type Target = str

The resulting type after dereferencing.
§

fn deref(&self) -> &str

Dereferences the value.
§

impl<'de> Deserialize<'de> for SmolStr

§

fn deserialize<D>( + deserializer: D, +) -> Result<SmolStr, <D as Deserializer<'de>>::Error>
where + D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
§

impl Display for SmolStr

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl<T> From<T> for SmolStr
where + T: AsRef<str>,

§

fn from(text: T) -> SmolStr

Converts to this type from the input type.
§

impl<'a> FromIterator<&'a String> for SmolStr

§

fn from_iter<I>(iter: I) -> SmolStr
where + I: IntoIterator<Item = &'a String>,

Creates a value from an iterator. Read more
§

impl<'a> FromIterator<&'a str> for SmolStr

§

fn from_iter<I>(iter: I) -> SmolStr
where + I: IntoIterator<Item = &'a str>,

Creates a value from an iterator. Read more
§

impl FromIterator<String> for SmolStr

§

fn from_iter<I>(iter: I) -> SmolStr
where + I: IntoIterator<Item = String>,

Creates a value from an iterator. Read more
§

impl FromIterator<char> for SmolStr

§

fn from_iter<I>(iter: I) -> SmolStr
where + I: IntoIterator<Item = char>,

Creates a value from an iterator. Read more
§

impl FromStr for SmolStr

§

type Err = Infallible

The associated error which can be returned from parsing.
§

fn from_str(s: &str) -> Result<SmolStr, <SmolStr as FromStr>::Err>

Parses a string s to return a value of this type. Read more
§

impl Hash for SmolStr

§

fn hash<H>(&self, hasher: &mut H)
where + H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
§

impl Ord for SmolStr

§

fn cmp(&self, other: &SmolStr) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
§

impl<'a> PartialEq<&'a String> for SmolStr

§

fn eq(&self, other: &&'a String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a> PartialEq<&'a str> for SmolStr

§

fn eq(&self, other: &&'a str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl<'a> PartialEq<SmolStr> for &'a str

§

fn eq(&self, other: &SmolStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq<SmolStr> for str

§

fn eq(&self, other: &SmolStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq<String> for SmolStr

§

fn eq(&self, other: &String) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq<str> for SmolStr

§

fn eq(&self, other: &str) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialEq for SmolStr

§

fn eq(&self, other: &SmolStr) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
§

impl PartialOrd for SmolStr

§

fn partial_cmp(&self, other: &SmolStr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
§

impl Serialize for SmolStr

§

fn serialize<S>( + &self, + serializer: S, +) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where + S: Serializer,

Serialize this value into the given Serde serializer. Read more
§

impl Eq for SmolStr

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<P, T> Receiver for P
where + P: Deref<Target = T> + ?Sized, + T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Struct.html b/compiler-docs/fe_parser/ast/struct.Struct.html new file mode 100644 index 0000000000..c71404d4c4 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Struct.html @@ -0,0 +1,31 @@ +Struct in fe_parser::ast - Rust

Struct Struct

Source
pub struct Struct {
+    pub name: Node<SmolStr>,
+    pub fields: Vec<Node<Field>>,
+    pub functions: Vec<Node<Function>>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§fields: Vec<Node<Field>>§functions: Vec<Node<Function>>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for Struct

Source§

fn clone(&self) -> Struct

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Struct

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Struct

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Struct

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Struct

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Struct

Source§

fn eq(&self, other: &Struct) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Struct

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Struct

Source§

impl StructuralPartialEq for Struct

Auto Trait Implementations§

§

impl Freeze for Struct

§

impl RefUnwindSafe for Struct

§

impl Send for Struct

§

impl Sync for Struct

§

impl Unpin for Struct

§

impl UnwindSafe for Struct

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Trait.html b/compiler-docs/fe_parser/ast/struct.Trait.html new file mode 100644 index 0000000000..cc4946eb76 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Trait.html @@ -0,0 +1,30 @@ +Trait in fe_parser::ast - Rust

Struct Trait

Source
pub struct Trait {
+    pub name: Node<SmolStr>,
+    pub functions: Vec<Node<FunctionSignature>>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§functions: Vec<Node<FunctionSignature>>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for Trait

Source§

fn clone(&self) -> Trait

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Trait

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Trait

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Trait

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Trait

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Trait

Source§

fn eq(&self, other: &Trait) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Trait

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Trait

Source§

impl StructuralPartialEq for Trait

Auto Trait Implementations§

§

impl Freeze for Trait

§

impl RefUnwindSafe for Trait

§

impl Send for Trait

§

impl Sync for Trait

§

impl Unpin for Trait

§

impl UnwindSafe for Trait

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.TypeAlias.html b/compiler-docs/fe_parser/ast/struct.TypeAlias.html new file mode 100644 index 0000000000..2832c8ed44 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.TypeAlias.html @@ -0,0 +1,30 @@ +TypeAlias in fe_parser::ast - Rust

Struct TypeAlias

Source
pub struct TypeAlias {
+    pub name: Node<SmolStr>,
+    pub typ: Node<TypeDesc>,
+    pub pub_qual: Option<Span>,
+}

Fields§

§name: Node<SmolStr>§typ: Node<TypeDesc>§pub_qual: Option<Span>

Trait Implementations§

Source§

impl Clone for TypeAlias

Source§

fn clone(&self) -> TypeAlias

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TypeAlias

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for TypeAlias

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for TypeAlias

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for TypeAlias

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for TypeAlias

Source§

fn eq(&self, other: &TypeAlias) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for TypeAlias

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for TypeAlias

Source§

impl StructuralPartialEq for TypeAlias

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Use.html b/compiler-docs/fe_parser/ast/struct.Use.html new file mode 100644 index 0000000000..9a6e4b1215 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Use.html @@ -0,0 +1,28 @@ +Use in fe_parser::ast - Rust

Struct Use

Source
pub struct Use {
+    pub tree: Node<UseTree>,
+}

Fields§

§tree: Node<UseTree>

Trait Implementations§

Source§

impl Clone for Use

Source§

fn clone(&self) -> Use

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Use

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Use

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Use

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Use

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Use

Source§

fn eq(&self, other: &Use) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Use

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Use

Source§

impl StructuralPartialEq for Use

Auto Trait Implementations§

§

impl Freeze for Use

§

impl RefUnwindSafe for Use

§

impl Send for Use

§

impl Sync for Use

§

impl Unpin for Use

§

impl UnwindSafe for Use

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/ast/struct.Variant.html b/compiler-docs/fe_parser/ast/struct.Variant.html new file mode 100644 index 0000000000..7c0009ea52 --- /dev/null +++ b/compiler-docs/fe_parser/ast/struct.Variant.html @@ -0,0 +1,30 @@ +Variant in fe_parser::ast - Rust

Struct Variant

Source
pub struct Variant {
+    pub name: Node<SmolStr>,
+    pub kind: VariantKind,
+}
Expand description

Enum variant definition.

+

Fields§

§name: Node<SmolStr>§kind: VariantKind

Trait Implementations§

Source§

impl Clone for Variant

Source§

fn clone(&self) -> Variant

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Variant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Variant

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Variant

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Variant

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Variant

Source§

fn eq(&self, other: &Variant) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Variant

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Variant

Source§

impl StructuralPartialEq for Variant

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/fn.parse_file.html b/compiler-docs/fe_parser/fn.parse_file.html new file mode 100644 index 0000000000..41cdcfc84e --- /dev/null +++ b/compiler-docs/fe_parser/fn.parse_file.html @@ -0,0 +1,11 @@ +parse_file in fe_parser - Rust

Function parse_file

Source
pub fn parse_file(file_id: SourceFileId, src: &str) -> (Module, Vec<Diagnostic>)
Expand description

Parse a Module from the file content string.

+

Returns a Module (which may be incomplete), and a vec of Diagnostics +(which may be empty) to display to the user. If any of the returned +diagnostics are errors, the compilation of this file should ultimately fail.

+

If a fatal parse error occurred, the last element of the Module::body will +be a ModuleStmt::ParseError. The parser currently has very limited ability +to recover from syntax errors; this is just a first meager attempt at returning a +useful AST when there are syntax errors.

+

A SourceFileId is required to associate any diagnostics with the +underlying file.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/contracts/fn.parse_contract_def.html b/compiler-docs/fe_parser/grammar/contracts/fn.parse_contract_def.html new file mode 100644 index 0000000000..e9b4887003 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/contracts/fn.parse_contract_def.html @@ -0,0 +1,7 @@ +parse_contract_def in fe_parser::grammar::contracts - Rust

Function parse_contract_def

Source
pub fn parse_contract_def(
+    par: &mut Parser<'_>,
+    contract_pub_qual: Option<Span>,
+) -> ParseResult<Node<Contract>>
Expand description

Parse a contract definition.

+

§Panics

+

Panics if the next token isn’t contract.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/contracts/index.html b/compiler-docs/fe_parser/grammar/contracts/index.html new file mode 100644 index 0000000000..1747a2bad2 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/contracts/index.html @@ -0,0 +1 @@ +fe_parser::grammar::contracts - Rust

Module contracts

Source

Functions§

parse_contract_def
Parse a contract definition.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/contracts/sidebar-items.js b/compiler-docs/fe_parser/grammar/contracts/sidebar-items.js new file mode 100644 index 0000000000..6b31cd56ef --- /dev/null +++ b/compiler-docs/fe_parser/grammar/contracts/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_contract_def"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/fn.parse_call_args.html b/compiler-docs/fe_parser/grammar/expressions/fn.parse_call_args.html new file mode 100644 index 0000000000..69f63cfb4e --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/fn.parse_call_args.html @@ -0,0 +1,4 @@ +parse_call_args in fe_parser::grammar::expressions - Rust

Function parse_call_args

Source
pub fn parse_call_args(
+    par: &mut Parser<'_>,
+) -> ParseResult<Node<Vec<Node<CallArg>>>>
Expand description

Parse call arguments

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr.html b/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr.html new file mode 100644 index 0000000000..239052f9da --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr.html @@ -0,0 +1,2 @@ +parse_expr in fe_parser::grammar::expressions - Rust

Function parse_expr

Source
pub fn parse_expr(par: &mut Parser<'_>) -> ParseResult<Node<Expr>>
Expand description

Parse an expression, starting with the next token.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr_with_min_bp.html b/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr_with_min_bp.html new file mode 100644 index 0000000000..a80859bfaf --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/fn.parse_expr_with_min_bp.html @@ -0,0 +1,6 @@ +parse_expr_with_min_bp in fe_parser::grammar::expressions - Rust

Function parse_expr_with_min_bp

Source
pub fn parse_expr_with_min_bp(
+    par: &mut Parser<'_>,
+    min_bp: u8,
+) -> ParseResult<Node<Expr>>
Expand description

Parse an expression, stopping if/when we reach an operator that binds less +tightly than given binding power.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/index.html b/compiler-docs/fe_parser/grammar/expressions/index.html new file mode 100644 index 0000000000..357fb65efe --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/index.html @@ -0,0 +1,2 @@ +fe_parser::grammar::expressions - Rust

Module expressions

Source

Functions§

parse_call_args
Parse call arguments
parse_expr
Parse an expression, starting with the next token.
parse_expr_with_min_bp
Parse an expression, stopping if/when we reach an operator that binds less +tightly than given binding power.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/expressions/sidebar-items.js b/compiler-docs/fe_parser/grammar/expressions/sidebar-items.js new file mode 100644 index 0000000000..5a45a79b97 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/expressions/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_call_args","parse_expr","parse_expr_with_min_bp"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_assert_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_assert_stmt.html new file mode 100644 index 0000000000..ffb86ef0f8 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_assert_stmt.html @@ -0,0 +1,4 @@ +parse_assert_stmt in fe_parser::grammar::functions - Rust

Function parse_assert_stmt

Source
pub fn parse_assert_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse an assert statement.

+

§Panics

+

Panics if the next token isn’t assert.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_def.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_def.html new file mode 100644 index 0000000000..e6d2387e62 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_def.html @@ -0,0 +1,6 @@ +parse_fn_def in fe_parser::grammar::functions - Rust

Function parse_fn_def

Source
pub fn parse_fn_def(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<Function>>
Expand description

Parse a function definition. The optional pub qualifier must be parsed by +the caller, and passed in. Next token must be unsafe or fn.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_sig.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_sig.html new file mode 100644 index 0000000000..ba0fb8e989 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_fn_sig.html @@ -0,0 +1,7 @@ +parse_fn_sig in fe_parser::grammar::functions - Rust

Function parse_fn_sig

Source
pub fn parse_fn_sig(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<FunctionSignature>>
Expand description

Parse a function definition without a body. The optional pub qualifier +must be parsed by the caller, and passed in. Next token must be unsafe or +fn.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_for_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_for_stmt.html new file mode 100644 index 0000000000..975e5cf1d1 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_for_stmt.html @@ -0,0 +1,4 @@ +parse_for_stmt in fe_parser::grammar::functions - Rust

Function parse_for_stmt

Source
pub fn parse_for_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a for statement.

+

§Panics

+

Panics if the next token isn’t for.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_param.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_param.html new file mode 100644 index 0000000000..985f4276d3 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_param.html @@ -0,0 +1,5 @@ +parse_generic_param in fe_parser::grammar::functions - Rust

Function parse_generic_param

Source
pub fn parse_generic_param(
+    par: &mut Parser<'_>,
+) -> ParseResult<GenericParameter>
Expand description

Parse a single generic function parameter (eg. T:SomeTrait in fn foo<T: SomeTrait>(some_arg: u256) -> bool). # Panics +Panics if the first token isn’t Name.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_params.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_params.html new file mode 100644 index 0000000000..cfb2bad1f9 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_generic_params.html @@ -0,0 +1,5 @@ +parse_generic_params in fe_parser::grammar::functions - Rust

Function parse_generic_params

Source
pub fn parse_generic_params(
+    par: &mut Parser<'_>,
+) -> ParseResult<Node<Vec<GenericParameter>>>
Expand description

Parse an angle-bracket-wrapped list of generic arguments (eg. <T, R: SomeTrait> in fn foo<T, R: SomeTrait>(some_arg: u256) -> bool). # Panics +Panics if the first token isn’t <.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_if_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_if_stmt.html new file mode 100644 index 0000000000..c42825e2d2 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_if_stmt.html @@ -0,0 +1,4 @@ +parse_if_stmt in fe_parser::grammar::functions - Rust

Function parse_if_stmt

Source
pub fn parse_if_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse an if statement.

+

§Panics

+

Panics if the next token isn’t if.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_match_arms.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_match_arms.html new file mode 100644 index 0000000000..5fad691d22 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_match_arms.html @@ -0,0 +1,3 @@ +parse_match_arms in fe_parser::grammar::functions - Rust

Function parse_match_arms

Source
pub fn parse_match_arms(
+    par: &mut Parser<'_>,
+) -> ParseResult<Vec<Node<MatchArm>>>
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_match_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_match_stmt.html new file mode 100644 index 0000000000..52a0c41d7d --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_match_stmt.html @@ -0,0 +1,4 @@ +parse_match_stmt in fe_parser::grammar::functions - Rust

Function parse_match_stmt

Source
pub fn parse_match_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a match statement.

+

§Panics

+

Panics if the next token isn’t match.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_pattern.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_pattern.html new file mode 100644 index 0000000000..919c0052f9 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_pattern.html @@ -0,0 +1 @@ +parse_pattern in fe_parser::grammar::functions - Rust

Function parse_pattern

Source
pub fn parse_pattern(par: &mut Parser<'_>) -> ParseResult<Node<Pattern>>
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_return_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_return_stmt.html new file mode 100644 index 0000000000..8e21ca248c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_return_stmt.html @@ -0,0 +1,4 @@ +parse_return_stmt in fe_parser::grammar::functions - Rust

Function parse_return_stmt

Source
pub fn parse_return_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a return statement.

+

§Panics

+

Panics if the next token isn’t return.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_revert_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_revert_stmt.html new file mode 100644 index 0000000000..064fe2f629 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_revert_stmt.html @@ -0,0 +1,4 @@ +parse_revert_stmt in fe_parser::grammar::functions - Rust

Function parse_revert_stmt

Source
pub fn parse_revert_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a revert statement.

+

§Panics

+

Panics if the next token isn’t revert.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_single_word_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_single_word_stmt.html new file mode 100644 index 0000000000..815b1163bc --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_single_word_stmt.html @@ -0,0 +1,6 @@ +parse_single_word_stmt in fe_parser::grammar::functions - Rust

Function parse_single_word_stmt

Source
pub fn parse_single_word_stmt(
+    par: &mut Parser<'_>,
+) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a continue, break, pass, or revert statement.

+

§Panics

+

Panics if the next token isn’t one of the above.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_stmt.html new file mode 100644 index 0000000000..46a60f0993 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_stmt.html @@ -0,0 +1,2 @@ +parse_stmt in fe_parser::grammar::functions - Rust

Function parse_stmt

Source
pub fn parse_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a function-level statement.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_unsafe_block.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_unsafe_block.html new file mode 100644 index 0000000000..2705d05ffc --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_unsafe_block.html @@ -0,0 +1,4 @@ +parse_unsafe_block in fe_parser::grammar::functions - Rust

Function parse_unsafe_block

Source
pub fn parse_unsafe_block(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse an unsafe block.

+

§Panics

+

Panics if the next token isn’t unsafe.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/fn.parse_while_stmt.html b/compiler-docs/fe_parser/grammar/functions/fn.parse_while_stmt.html new file mode 100644 index 0000000000..8c9c6e3049 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/fn.parse_while_stmt.html @@ -0,0 +1,4 @@ +parse_while_stmt in fe_parser::grammar::functions - Rust

Function parse_while_stmt

Source
pub fn parse_while_stmt(par: &mut Parser<'_>) -> ParseResult<Node<FuncStmt>>
Expand description

Parse a while statement.

+

§Panics

+

Panics if the next token isn’t while.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/index.html b/compiler-docs/fe_parser/grammar/functions/index.html new file mode 100644 index 0000000000..eb10b054e6 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/index.html @@ -0,0 +1,6 @@ +fe_parser::grammar::functions - Rust

Module functions

Source

Functions§

parse_assert_stmt
Parse an assert statement.
parse_fn_def
Parse a function definition. The optional pub qualifier must be parsed by +the caller, and passed in. Next token must be unsafe or fn.
parse_fn_sig
Parse a function definition without a body. The optional pub qualifier +must be parsed by the caller, and passed in. Next token must be unsafe or +fn.
parse_for_stmt
Parse a for statement.
parse_generic_param
Parse a single generic function parameter (eg. T:SomeTrait in fn foo<T: SomeTrait>(some_arg: u256) -> bool). # Panics +Panics if the first token isn’t Name.
parse_generic_params
Parse an angle-bracket-wrapped list of generic arguments (eg. <T, R: SomeTrait> in fn foo<T, R: SomeTrait>(some_arg: u256) -> bool). # Panics +Panics if the first token isn’t <.
parse_if_stmt
Parse an if statement.
parse_match_arms
parse_match_stmt
Parse a match statement.
parse_pattern
parse_return_stmt
Parse a return statement.
parse_revert_stmt
Parse a revert statement.
parse_single_word_stmt
Parse a continue, break, pass, or revert statement.
parse_stmt
Parse a function-level statement.
parse_unsafe_block
Parse an unsafe block.
parse_while_stmt
Parse a while statement.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/functions/sidebar-items.js b/compiler-docs/fe_parser/grammar/functions/sidebar-items.js new file mode 100644 index 0000000000..088b1ad187 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/functions/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_assert_stmt","parse_fn_def","parse_fn_sig","parse_for_stmt","parse_generic_param","parse_generic_params","parse_if_stmt","parse_match_arms","parse_match_stmt","parse_pattern","parse_return_stmt","parse_revert_stmt","parse_single_word_stmt","parse_stmt","parse_unsafe_block","parse_while_stmt"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/index.html b/compiler-docs/fe_parser/grammar/index.html new file mode 100644 index 0000000000..5f8f310dff --- /dev/null +++ b/compiler-docs/fe_parser/grammar/index.html @@ -0,0 +1 @@ +fe_parser::grammar - Rust
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_constant.html b/compiler-docs/fe_parser/grammar/module/fn.parse_constant.html new file mode 100644 index 0000000000..ff9a6c1c3c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_constant.html @@ -0,0 +1,7 @@ +parse_constant in fe_parser::grammar::module - Rust

Function parse_constant

Source
pub fn parse_constant(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<ConstantDecl>>
Expand description

Parse a constant, e.g. const MAGIC_NUMBER: u256 = 4711.

+

§Panics

+

Panics if the next token isn’t const.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_module.html b/compiler-docs/fe_parser/grammar/module/fn.parse_module.html new file mode 100644 index 0000000000..3f23e3cf52 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_module.html @@ -0,0 +1,2 @@ +parse_module in fe_parser::grammar::module - Rust

Function parse_module

Source
pub fn parse_module(par: &mut Parser<'_>) -> Node<Module>
Expand description

Parse a Module.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_module_stmt.html b/compiler-docs/fe_parser/grammar/module/fn.parse_module_stmt.html new file mode 100644 index 0000000000..7f748b962d --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_module_stmt.html @@ -0,0 +1,2 @@ +parse_module_stmt in fe_parser::grammar::module - Rust

Function parse_module_stmt

Source
pub fn parse_module_stmt(par: &mut Parser<'_>) -> ParseResult<ModuleStmt>
Expand description

Parse a ModuleStmt.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_pragma.html b/compiler-docs/fe_parser/grammar/module/fn.parse_pragma.html new file mode 100644 index 0000000000..07f362a8ef --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_pragma.html @@ -0,0 +1,2 @@ +parse_pragma in fe_parser::grammar::module - Rust

Function parse_pragma

Source
pub fn parse_pragma(par: &mut Parser<'_>) -> ParseResult<Node<Pragma>>
Expand description

Parse a pragma <version-requirement> statement.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_use.html b/compiler-docs/fe_parser/grammar/module/fn.parse_use.html new file mode 100644 index 0000000000..c7f1569a2f --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_use.html @@ -0,0 +1,4 @@ +parse_use in fe_parser::grammar::module - Rust

Function parse_use

Source
pub fn parse_use(par: &mut Parser<'_>) -> ParseResult<Node<Use>>
Expand description

Parse a use statement.

+

§Panics

+

Panics if the next token isn’t use.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/fn.parse_use_tree.html b/compiler-docs/fe_parser/grammar/module/fn.parse_use_tree.html new file mode 100644 index 0000000000..cd318e786c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/fn.parse_use_tree.html @@ -0,0 +1,2 @@ +parse_use_tree in fe_parser::grammar::module - Rust

Function parse_use_tree

Source
pub fn parse_use_tree(par: &mut Parser<'_>) -> ParseResult<Node<UseTree>>
Expand description

Parse a use tree.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/index.html b/compiler-docs/fe_parser/grammar/module/index.html new file mode 100644 index 0000000000..c48e8c7156 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/index.html @@ -0,0 +1 @@ +fe_parser::grammar::module - Rust

Module module

Source

Functions§

parse_constant
Parse a constant, e.g. const MAGIC_NUMBER: u256 = 4711.
parse_module
Parse a Module.
parse_module_stmt
Parse a ModuleStmt.
parse_pragma
Parse a pragma <version-requirement> statement.
parse_use
Parse a use statement.
parse_use_tree
Parse a use tree.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/module/sidebar-items.js b/compiler-docs/fe_parser/grammar/module/sidebar-items.js new file mode 100644 index 0000000000..027949ed32 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/module/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_constant","parse_module","parse_module_stmt","parse_pragma","parse_use","parse_use_tree"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/sidebar-items.js b/compiler-docs/fe_parser/grammar/sidebar-items.js new file mode 100644 index 0000000000..8551943604 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"mod":["contracts","expressions","functions","module","types"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_enum_def.html b/compiler-docs/fe_parser/grammar/types/fn.parse_enum_def.html new file mode 100644 index 0000000000..f38bc56c27 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_enum_def.html @@ -0,0 +1,7 @@ +parse_enum_def in fe_parser::grammar::types - Rust

Function parse_enum_def

Source
pub fn parse_enum_def(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<Enum>>
Expand description

Parse a [ModuleStmt::Enum].

+

§Panics

+

Panics if the next token isn’t TokenKind::Enum.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_field.html b/compiler-docs/fe_parser/grammar/types/fn.parse_field.html new file mode 100644 index 0000000000..11974decf3 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_field.html @@ -0,0 +1,8 @@ +parse_field in fe_parser::grammar::types - Rust

Function parse_field

Source
pub fn parse_field(
+    par: &mut Parser<'_>,
+    attributes: Vec<Node<SmolStr>>,
+    pub_qual: Option<Span>,
+    const_qual: Option<Span>,
+) -> ParseResult<Node<Field>>
Expand description

Parse a field for a struct or contract. The leading optional pub and +const qualifiers must be parsed by the caller, and passed in.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_generic_args.html b/compiler-docs/fe_parser/grammar/types/fn.parse_generic_args.html new file mode 100644 index 0000000000..ebcb693bc6 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_generic_args.html @@ -0,0 +1,7 @@ +parse_generic_args in fe_parser::grammar::types - Rust

Function parse_generic_args

Source
pub fn parse_generic_args(
+    par: &mut Parser<'_>,
+) -> ParseResult<Node<Vec<GenericArg>>>
Expand description

Parse an angle-bracket-wrapped list of generic arguments (eg. the tail end +of Map<address, u256>).

+

§Panics

+

Panics if the first token isn’t <.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_impl_def.html b/compiler-docs/fe_parser/grammar/types/fn.parse_impl_def.html new file mode 100644 index 0000000000..7edb05ad9e --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_impl_def.html @@ -0,0 +1,4 @@ +parse_impl_def in fe_parser::grammar::types - Rust

Function parse_impl_def

Source
pub fn parse_impl_def(par: &mut Parser<'_>) -> ParseResult<Node<Impl>>
Expand description

Parse an impl block.

+

§Panics

+

Panics if the next token isn’t impl.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_opt_qualifier.html b/compiler-docs/fe_parser/grammar/types/fn.parse_opt_qualifier.html new file mode 100644 index 0000000000..c27ee7a06c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_opt_qualifier.html @@ -0,0 +1,2 @@ +parse_opt_qualifier in fe_parser::grammar::types - Rust

Function parse_opt_qualifier

Source
pub fn parse_opt_qualifier(par: &mut Parser<'_>, tk: TokenKind) -> Option<Span>
Expand description

Parse an optional qualifier (pub, const, or idx).

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_path_tail.html b/compiler-docs/fe_parser/grammar/types/fn.parse_path_tail.html new file mode 100644 index 0000000000..73ece4ea08 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_path_tail.html @@ -0,0 +1,5 @@ +parse_path_tail in fe_parser::grammar::types - Rust

Function parse_path_tail

Source
pub fn parse_path_tail<'a>(
+    par: &mut Parser<'a>,
+    head: Node<SmolStr>,
+) -> (Path, Span, Option<Token<'a>>)
Expand description

Returns path and trailing :: token, if present.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_struct_def.html b/compiler-docs/fe_parser/grammar/types/fn.parse_struct_def.html new file mode 100644 index 0000000000..ba2fc4749c --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_struct_def.html @@ -0,0 +1,7 @@ +parse_struct_def in fe_parser::grammar::types - Rust

Function parse_struct_def

Source
pub fn parse_struct_def(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<Struct>>
Expand description

Parse a [ModuleStmt::Struct].

+

§Panics

+

Panics if the next token isn’t struct.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_trait_def.html b/compiler-docs/fe_parser/grammar/types/fn.parse_trait_def.html new file mode 100644 index 0000000000..8302e353e0 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_trait_def.html @@ -0,0 +1,7 @@ +parse_trait_def in fe_parser::grammar::types - Rust

Function parse_trait_def

Source
pub fn parse_trait_def(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<Trait>>
Expand description

Parse a trait definition.

+

§Panics

+

Panics if the next token isn’t trait.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_type_alias.html b/compiler-docs/fe_parser/grammar/types/fn.parse_type_alias.html new file mode 100644 index 0000000000..057fad02c1 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_type_alias.html @@ -0,0 +1,7 @@ +parse_type_alias in fe_parser::grammar::types - Rust

Function parse_type_alias

Source
pub fn parse_type_alias(
+    par: &mut Parser<'_>,
+    pub_qual: Option<Span>,
+) -> ParseResult<Node<TypeAlias>>
Expand description

Parse a type alias definition, e.g. type MyMap = Map<u8, address>.

+

§Panics

+

Panics if the next token isn’t type.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_type_desc.html b/compiler-docs/fe_parser/grammar/types/fn.parse_type_desc.html new file mode 100644 index 0000000000..e2fd066e79 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_type_desc.html @@ -0,0 +1,2 @@ +parse_type_desc in fe_parser::grammar::types - Rust

Function parse_type_desc

Source
pub fn parse_type_desc(par: &mut Parser<'_>) -> ParseResult<Node<TypeDesc>>
Expand description

Parse a type description, e.g. u8 or Map<address, u256>.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/fn.parse_variant.html b/compiler-docs/fe_parser/grammar/types/fn.parse_variant.html new file mode 100644 index 0000000000..6caf1e5772 --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/fn.parse_variant.html @@ -0,0 +1,4 @@ +parse_variant in fe_parser::grammar::types - Rust

Function parse_variant

Source
pub fn parse_variant(par: &mut Parser<'_>) -> ParseResult<Node<Variant>>
Expand description

Parse a variant for a enum definition.

+

§Panics

+

Panics if the next token isn’t TokenKind::Name.

+
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/index.html b/compiler-docs/fe_parser/grammar/types/index.html new file mode 100644 index 0000000000..9adca7f0cf --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/index.html @@ -0,0 +1,3 @@ +fe_parser::grammar::types - Rust

Module types

Source

Functions§

parse_enum_def
Parse a [ModuleStmt::Enum].
parse_field
Parse a field for a struct or contract. The leading optional pub and +const qualifiers must be parsed by the caller, and passed in.
parse_generic_args
Parse an angle-bracket-wrapped list of generic arguments (eg. the tail end +of Map<address, u256>).
parse_impl_def
Parse an impl block.
parse_opt_qualifier
Parse an optional qualifier (pub, const, or idx).
parse_path_tail
Returns path and trailing :: token, if present.
parse_struct_def
Parse a [ModuleStmt::Struct].
parse_trait_def
Parse a trait definition.
parse_type_alias
Parse a type alias definition, e.g. type MyMap = Map<u8, address>.
parse_type_desc
Parse a type description, e.g. u8 or Map<address, u256>.
parse_variant
Parse a variant for a enum definition.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/grammar/types/sidebar-items.js b/compiler-docs/fe_parser/grammar/types/sidebar-items.js new file mode 100644 index 0000000000..f17d380f7e --- /dev/null +++ b/compiler-docs/fe_parser/grammar/types/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_enum_def","parse_field","parse_generic_args","parse_impl_def","parse_opt_qualifier","parse_path_tail","parse_struct_def","parse_trait_def","parse_type_alias","parse_type_desc","parse_variant"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/index.html b/compiler-docs/fe_parser/index.html new file mode 100644 index 0000000000..04370b85e7 --- /dev/null +++ b/compiler-docs/fe_parser/index.html @@ -0,0 +1,3 @@ +fe_parser - Rust

Crate fe_parser

Source

Re-exports§

pub use lexer::Token;
pub use lexer::TokenKind;

Modules§

ast
grammar
lexer
node

Structs§

Label
ParseFailed
Parser
Parser maintains the parsing state, such as the token stream, +“enclosure” (paren, brace, ..) stack, diagnostics, etc. +Syntax parsing logic is in the crate::grammar module.

Functions§

parse_file
Parse a Module from the file content string.

Type Aliases§

ParseResult
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/enum.TokenKind.html b/compiler-docs/fe_parser/lexer/enum.TokenKind.html new file mode 100644 index 0000000000..3240045eaa --- /dev/null +++ b/compiler-docs/fe_parser/lexer/enum.TokenKind.html @@ -0,0 +1,121 @@ +TokenKind in fe_parser::lexer - Rust

Enum TokenKind

Source
pub enum TokenKind {
+
Show 87 variants Error, + Newline, + Name, + Int, + Hex, + Octal, + Binary, + Text, + True, + False, + Assert, + Break, + Continue, + Contract, + Fn, + Const, + Else, + Idx, + If, + Match, + Impl, + Pragma, + For, + Pub, + Return, + Revert, + SelfType, + SelfValue, + Struct, + Enum, + Trait, + Type, + Unsafe, + While, + And, + As, + In, + Not, + Or, + Let, + Mut, + Use, + ParenOpen, + ParenClose, + BracketOpen, + BracketClose, + BraceOpen, + BraceClose, + Colon, + ColonColon, + Comma, + Hash, + Semi, + Plus, + Minus, + Star, + Slash, + Pipe, + Amper, + Lt, + LtLt, + Gt, + GtGt, + Eq, + Dot, + DotDot, + Percent, + EqEq, + NotEq, + LtEq, + GtEq, + Tilde, + Hat, + StarStar, + StarStarEq, + PlusEq, + MinusEq, + StarEq, + SlashEq, + PercentEq, + AmperEq, + PipeEq, + HatEq, + LtLtEq, + GtGtEq, + Arrow, + FatArrow, +
}

Variants§

§

Error

§

Newline

§

Name

§

Int

§

Hex

§

Octal

§

Binary

§

Text

§

True

§

False

§

Assert

§

Break

§

Continue

§

Contract

§

Fn

§

Const

§

Else

§

Idx

§

If

§

Match

§

Impl

§

Pragma

§

For

§

Pub

§

Return

§

Revert

§

SelfType

§

SelfValue

§

Struct

§

Enum

§

Trait

§

Type

§

Unsafe

§

While

§

And

§

As

§

In

§

Not

§

Or

§

Let

§

Mut

§

Use

§

ParenOpen

§

ParenClose

§

BracketOpen

§

BracketClose

§

BraceOpen

§

BraceClose

§

Colon

§

ColonColon

§

Comma

§

Hash

§

Semi

§

Plus

§

Minus

§

Star

§

Slash

§

Pipe

§

Amper

§

Lt

§

LtLt

§

Gt

§

GtGt

§

Eq

§

Dot

§

DotDot

§

Percent

§

EqEq

§

NotEq

§

LtEq

§

GtEq

§

Tilde

§

Hat

§

StarStar

§

StarStarEq

§

PlusEq

§

MinusEq

§

StarEq

§

SlashEq

§

PercentEq

§

AmperEq

§

PipeEq

§

HatEq

§

LtLtEq

§

GtGtEq

§

Arrow

§

FatArrow

Implementations§

Source§

impl TokenKind

Source

pub fn describe(&self) -> &str

Return a user-friendly description of the token kind. E.g. +TokenKind::Newline => “a newline” +TokenKind::Colon => “:

+

Trait Implementations§

Source§

impl Clone for TokenKind

Source§

fn clone(&self) -> TokenKind

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TokenKind

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'s> Logos<'s> for TokenKind

Source§

const ERROR: Self = TokenKind::Error

Helper const of the variant marked as #[error].
Source§

type Extras = ()

Associated type Extras for the particular lexer. This can be set using +#[logos(extras = MyExtras)] and accessed inside callbacks.
Source§

type Source = str

Source type this token can be lexed from. This will default to str, +unless one of the defined patterns explicitly uses non-unicode byte values +or byte slices, in which case that implementation will use [u8].
Source§

fn lex(lex: &mut Lexer<'s, Self>)

The heart of Logos. Called by the Lexer. The implementation for this function +is generated by the logos-derive crate.
§

fn lexer(source: &'source Self::Source) -> Lexer<'source, Self>
where + Self::Extras: Default,

Create a new instance of a Lexer that will produce tokens implementing +this Logos.
§

fn lexer_with_extras( + source: &'source Self::Source, + extras: Self::Extras, +) -> Lexer<'source, Self>

Create a new instance of a Lexer with the provided Extras that will +produce tokens implementing this Logos.
Source§

impl PartialEq for TokenKind

Source§

fn eq(&self, other: &TokenKind) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for TokenKind

Source§

impl Eq for TokenKind

Source§

impl StructuralPartialEq for TokenKind

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/index.html b/compiler-docs/fe_parser/lexer/index.html new file mode 100644 index 0000000000..f72e245e43 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/index.html @@ -0,0 +1 @@ +fe_parser::lexer - Rust

Module lexer

Source

Structs§

Lexer
Token

Enums§

TokenKind
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/sidebar-items.js b/compiler-docs/fe_parser/lexer/sidebar-items.js new file mode 100644 index 0000000000..bbe99d1cc8 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["TokenKind"],"struct":["Lexer","Token"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/struct.Lexer.html b/compiler-docs/fe_parser/lexer/struct.Lexer.html new file mode 100644 index 0000000000..0c0b1d9018 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/struct.Lexer.html @@ -0,0 +1,195 @@ +Lexer in fe_parser::lexer - Rust

Struct Lexer

Source
pub struct Lexer<'a> { /* private fields */ }

Implementations§

Source§

impl<'a> Lexer<'a>

Source

pub fn new(file_id: SourceFileId, src: &'a str) -> Lexer<'_>

Create a new lexer with the given source code string.

+
Source

pub fn source(&self) -> &'a str

Return the full source code string that’s being tokenized.

+

Trait Implementations§

Source§

impl<'a> Clone for Lexer<'a>

Source§

fn clone(&self) -> Lexer<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Iterator for Lexer<'a>

Source§

type Item = Token<'a>

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>( + &mut self, +) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where + Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where + Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where + Self: Sized,

Creates an iterator starting at the same point, but stepping by +the given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where + Self: Sized, + U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where + Self: Sized, + Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent +items of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where + Self: Sized, + G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator +between adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each +element. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where + Self: Sized, + F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element +should be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where + Self: Sized,

Creates an iterator which gives the current iteration count as well as +the next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where + Self: Sized,

Creates an iterator which can use the peek and peek_mut methods +to look at the next element of the iterator without consuming it. See +their documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where + Self: Sized, + P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where + Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where + Self: Sized,

Creates an iterator that yields the first n elements, or fewer +if the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where + Self: Sized, + F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but +unlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where + Self: Sized, + U: IntoIterator, + F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where + Self: Sized, + F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over +self and returns an iterator over the outputs of f. Like slice::windows(), +the windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where + Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where + Self: Sized, + F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where + Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where + B: FromIterator<Self::Item>, + Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where + E: Extend<Self::Item>, + Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where + Self: Sized, + B: Default + Extend<Self::Item>, + F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate, +such that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where + Self: Sized, + F: FnMut(B, Self::Item) -> R, + R: Try<Output = B>,

An iterator method that applies a function as long as it returns +successfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where + Self: Sized, + F: FnMut(Self::Item) -> R, + R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the +iterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where + Self: Sized, + F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation, +returning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing +operation. Read more
Source§

fn try_reduce<R>( + &mut self, + f: impl FnMut(Self::Item, Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where + Self: Sized, + R: Try<Output = Self::Item>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the +closure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where + Self: Sized, + P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where + Self: Sized, + F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns +the first non-none result. Read more
Source§

fn try_find<R>( + &mut self, + f: impl FnMut(&Self::Item) -> R, +) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where + Self: Sized, + R: Try<Output = bool>, + <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns +the first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where + Self: Sized, + P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the +specified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the +specified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where + B: Ord, + Self: Sized, + F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the +specified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the +specified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where + FromA: Default + Extend<A>, + FromB: Default + Extend<B>, + Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where + T: Copy + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where + T: Clone + 'a, + Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
1.0.0 · Source§

fn cycle(self) -> Cycle<Self>
where + Self: Sized + Clone,

Repeats an iterator endlessly. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where + Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where + Self: Sized, + S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where + Self: Sized, + P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Lexicographically compares the PartialOrd elements of +this Iterator with those of another. The comparison works like short-circuit +evaluation, returning a result without comparing the remaining elements. +As soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those +of another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are equal to those of +another. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where + Self: Sized, + I: IntoIterator, + F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of +another with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialEq<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are not equal to those of +another. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +less or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where + I: IntoIterator, + Self::Item: PartialOrd<<I as IntoIterator>::Item>, + Self: Sized,

Determines if the elements of this Iterator are lexicographically +greater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where + Self: Sized, + F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where + Self: Sized, + F: FnMut(Self::Item) -> K, + K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction +function. Read more

Auto Trait Implementations§

§

impl<'a> Freeze for Lexer<'a>

§

impl<'a> RefUnwindSafe for Lexer<'a>

§

impl<'a> Send for Lexer<'a>

§

impl<'a> Sync for Lexer<'a>

§

impl<'a> Unpin for Lexer<'a>

§

impl<'a> UnwindSafe for Lexer<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<I> IntoIterator for I
where + I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/struct.Token.html b/compiler-docs/fe_parser/lexer/struct.Token.html new file mode 100644 index 0000000000..db039e33de --- /dev/null +++ b/compiler-docs/fe_parser/lexer/struct.Token.html @@ -0,0 +1,24 @@ +Token in fe_parser::lexer - Rust

Struct Token

Source
pub struct Token<'a> {
+    pub kind: TokenKind,
+    pub text: &'a str,
+    pub span: Span,
+}

Fields§

§kind: TokenKind§text: &'a str§span: Span

Trait Implementations§

Source§

impl<'a> Add<&Token<'a>> for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: &Token<'a>) -> Self

Performs the + operation. Read more
Source§

impl<'a> Clone for Token<'a>

Source§

fn clone(&self) -> Token<'a>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for Token<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'a> From<Token<'a>> for Node<SmolStr>

Source§

fn from(tok: Token<'a>) -> Node<SmolStr>

Converts to this type from the input type.
Source§

impl<'a> PartialEq for Token<'a>

Source§

fn eq(&self, other: &Token<'a>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl<'a> Eq for Token<'a>

Source§

impl<'a> StructuralPartialEq for Token<'a>

Auto Trait Implementations§

§

impl<'a> Freeze for Token<'a>

§

impl<'a> RefUnwindSafe for Token<'a>

§

impl<'a> Send for Token<'a>

§

impl<'a> Sync for Token<'a>

§

impl<'a> Unpin for Token<'a>

§

impl<'a> UnwindSafe for Token<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/token/enum.TokenKind.html b/compiler-docs/fe_parser/lexer/token/enum.TokenKind.html new file mode 100644 index 0000000000..24f9bbe054 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/token/enum.TokenKind.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_parser/lexer/enum.TokenKind.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/lexer/token/struct.Token.html b/compiler-docs/fe_parser/lexer/token/struct.Token.html new file mode 100644 index 0000000000..dd6eee4eb3 --- /dev/null +++ b/compiler-docs/fe_parser/lexer/token/struct.Token.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../fe_parser/lexer/struct.Token.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/node/index.html b/compiler-docs/fe_parser/node/index.html new file mode 100644 index 0000000000..cd97d50516 --- /dev/null +++ b/compiler-docs/fe_parser/node/index.html @@ -0,0 +1 @@ +fe_parser::node - Rust

Module node

Source

Structs§

Node
NodeId
Span
An exclusive span of byte offsets in a source file.

Traits§

Spanned
\ No newline at end of file diff --git a/compiler-docs/fe_parser/node/sidebar-items.js b/compiler-docs/fe_parser/node/sidebar-items.js new file mode 100644 index 0000000000..3078e3d906 --- /dev/null +++ b/compiler-docs/fe_parser/node/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["Node","NodeId","Span"],"trait":["Spanned"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/node/struct.Node.html b/compiler-docs/fe_parser/node/struct.Node.html new file mode 100644 index 0000000000..c7fc1140d0 --- /dev/null +++ b/compiler-docs/fe_parser/node/struct.Node.html @@ -0,0 +1,38 @@ +Node in fe_parser::node - Rust

Struct Node

Source
pub struct Node<T> {
+    pub kind: T,
+    pub id: NodeId,
+    pub span: Span,
+}

Fields§

§kind: T§id: NodeId§span: Span

Implementations§

Source§

impl Node<Contract>

Source

pub fn name(&self) -> &str

Source§

impl Node<Struct>

Source

pub fn name(&self) -> &str

Source§

impl Node<Enum>

Source

pub fn name(&self) -> &str

Source§

impl Node<Variant>

Source

pub fn name(&self) -> &str

Source§

impl Node<Trait>

Source

pub fn name(&self) -> &str

Source§

impl Node<Field>

Source

pub fn name(&self) -> &str

Source§

impl Node<Function>

Source

pub fn name(&self) -> &str

Source§

impl Node<FunctionArg>

Source

pub fn name(&self) -> &str

Source

pub fn name_span(&self) -> Span

Source§

impl Node<TypeAlias>

Source

pub fn name(&self) -> &str

Source§

impl<T> Node<T>

Source

pub fn new(kind: T, span: Span) -> Self

Trait Implementations§

Source§

impl<T: Clone> Clone for Node<T>

Source§

fn clone(&self) -> Node<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T: Debug> Debug for Node<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de, T> Deserialize<'de> for Node<T>
where + T: Deserialize<'de>,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for Node<Function>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> From<&Node<T>> for NodeId

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<&Node<T>> for Span

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl<'a> From<Token<'a>> for Node<SmolStr>

Source§

fn from(tok: Token<'a>) -> Node<SmolStr>

Converts to this type from the input type.
Source§

impl<T: Hash> Hash for Node<T>

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl<T: PartialEq> PartialEq for Node<T>

Source§

fn eq(&self, other: &Node<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl<T> Serialize for Node<T>
where + T: Serialize,

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl<T> Spanned for Node<T>

Source§

fn span(&self) -> Span

Source§

impl<T: Eq> Eq for Node<T>

Source§

impl<T> StructuralPartialEq for Node<T>

Auto Trait Implementations§

§

impl<T> Freeze for Node<T>
where + T: Freeze,

§

impl<T> RefUnwindSafe for Node<T>
where + T: RefUnwindSafe,

§

impl<T> Send for Node<T>
where + T: Send,

§

impl<T> Sync for Node<T>
where + T: Sync,

§

impl<T> Unpin for Node<T>
where + T: Unpin,

§

impl<T> UnwindSafe for Node<T>
where + T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/node/struct.NodeId.html b/compiler-docs/fe_parser/node/struct.NodeId.html new file mode 100644 index 0000000000..f127b8d450 --- /dev/null +++ b/compiler-docs/fe_parser/node/struct.NodeId.html @@ -0,0 +1,30 @@ +NodeId in fe_parser::node - Rust

Struct NodeId

Source
pub struct NodeId(/* private fields */);

Implementations§

Source§

impl NodeId

Source

pub fn create() -> Self

Source

pub fn dummy() -> Self

Source

pub fn is_dummy(self) -> bool

Trait Implementations§

Source§

impl Clone for NodeId

Source§

fn clone(&self) -> NodeId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for NodeId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for NodeId

Source§

fn default() -> NodeId

Returns the “default value” for a type. Read more
Source§

impl<T> From<&Box<Node<T>>> for NodeId

Source§

fn from(node: &Box<Node<T>>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<&Node<T>> for NodeId

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl Hash for NodeId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for NodeId

Source§

fn cmp(&self, other: &NodeId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where + Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for NodeId

Source§

fn eq(&self, other: &NodeId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl PartialOrd for NodeId

Source§

fn partial_cmp(&self, other: &NodeId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the +<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > +operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by +the >= operator. Read more
Source§

impl Copy for NodeId

Source§

impl Eq for NodeId

Source§

impl StructuralPartialEq for NodeId

Auto Trait Implementations§

§

impl Freeze for NodeId

§

impl RefUnwindSafe for NodeId

§

impl Send for NodeId

§

impl Sync for NodeId

§

impl Unpin for NodeId

§

impl UnwindSafe for NodeId

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Comparable<K> for Q
where + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/node/struct.Span.html b/compiler-docs/fe_parser/node/struct.Span.html new file mode 100644 index 0000000000..49ad91c22a --- /dev/null +++ b/compiler-docs/fe_parser/node/struct.Span.html @@ -0,0 +1,43 @@ +Span in fe_parser::node - Rust

Struct Span

Source
pub struct Span {
+    pub file_id: SourceFileId,
+    pub start: usize,
+    pub end: usize,
+}
Expand description

An exclusive span of byte offsets in a source file.

+

Fields§

§file_id: SourceFileId§start: usize

A byte offset specifying the inclusive start of a span.

+
§end: usize

A byte offset specifying the exclusive end of a span.

+

Implementations§

Source§

impl Span

Source

pub fn new(file_id: SourceFileId, start: usize, end: usize) -> Span

Source

pub fn zero(file_id: SourceFileId) -> Span

Source

pub fn dummy() -> Span

Source

pub fn is_dummy(&self) -> bool

Source

pub fn from_pair<S, E>(start_elem: S, end_elem: E) -> Span
where + S: Into<Span>, + E: Into<Span>,

Trait Implementations§

Source§

impl<'a, T> Add<&'a T> for Span
where + T: Spanned,

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: &'a T) -> Span

Performs the + operation. Read more
Source§

impl<'a> Add<&Token<'a>> for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: &Token<'a>) -> Self

Performs the + operation. Read more
Source§

impl<'a, T> Add<Option<&'a T>> for Span
where + Span: Add<&'a T, Output = Span>,

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Option<&'a T>) -> Span

Performs the + operation. Read more
Source§

impl Add<Option<Span>> for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Option<Span>) -> Span

Performs the + operation. Read more
Source§

impl Add for Span

Source§

type Output = Span

The resulting type after applying the + operator.
Source§

fn add(self, other: Span) -> Span

Performs the + operation. Read more
Source§

impl<T> AddAssign<T> for Span
where + Span: Add<T, Output = Span>,

Source§

fn add_assign(&mut self, other: T)

Performs the += operation. Read more
Source§

impl Clone for Span

Source§

fn clone(&self) -> Span

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Span

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Span

Source§

fn deserialize<__D>( + __deserializer: __D, +) -> Result<Span, <__D as Deserializer<'de>>::Error>
where + __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<T> From<&Box<Node<T>>> for Span

Source§

fn from(node: &Box<Node<T>>) -> Self

Converts to this type from the input type.
Source§

impl<T> From<&Node<T>> for Span

Source§

fn from(node: &Node<T>) -> Self

Converts to this type from the input type.
Source§

impl Hash for Span

Source§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Span

Source§

fn eq(&self, other: &Span) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Serialize for Span

Source§

fn serialize<__S>( + &self, + __serializer: __S, +) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where + __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Copy for Span

Source§

impl Eq for Span

Source§

impl StructuralPartialEq for Span

Auto Trait Implementations§

§

impl Freeze for Span

§

impl RefUnwindSafe for Span

§

impl Send for Span

§

impl Sync for Span

§

impl Unpin for Span

§

impl UnwindSafe for Span

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> DeserializeOwned for T
where + T: for<'de> Deserialize<'de>,

\ No newline at end of file diff --git a/compiler-docs/fe_parser/node/trait.Spanned.html b/compiler-docs/fe_parser/node/trait.Spanned.html new file mode 100644 index 0000000000..c3140f9734 --- /dev/null +++ b/compiler-docs/fe_parser/node/trait.Spanned.html @@ -0,0 +1,4 @@ +Spanned in fe_parser::node - Rust

Trait Spanned

Source
pub trait Spanned {
+    // Required method
+    fn span(&self) -> Span;
+}

Required Methods§

Source

fn span(&self) -> Span

Implementors§

\ No newline at end of file diff --git a/compiler-docs/fe_parser/parser/struct.Label.html b/compiler-docs/fe_parser/parser/struct.Label.html new file mode 100644 index 0000000000..87ea1515b1 --- /dev/null +++ b/compiler-docs/fe_parser/parser/struct.Label.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_parser/struct.Label.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/parser/struct.ParseFailed.html b/compiler-docs/fe_parser/parser/struct.ParseFailed.html new file mode 100644 index 0000000000..b1843d8358 --- /dev/null +++ b/compiler-docs/fe_parser/parser/struct.ParseFailed.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_parser/struct.ParseFailed.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/parser/struct.Parser.html b/compiler-docs/fe_parser/parser/struct.Parser.html new file mode 100644 index 0000000000..6f325de554 --- /dev/null +++ b/compiler-docs/fe_parser/parser/struct.Parser.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_parser/struct.Parser.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/parser/type.ParseResult.html b/compiler-docs/fe_parser/parser/type.ParseResult.html new file mode 100644 index 0000000000..366f14864a --- /dev/null +++ b/compiler-docs/fe_parser/parser/type.ParseResult.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../fe_parser/type.ParseResult.html...

+ + + \ No newline at end of file diff --git a/compiler-docs/fe_parser/sidebar-items.js b/compiler-docs/fe_parser/sidebar-items.js new file mode 100644 index 0000000000..245b322b5e --- /dev/null +++ b/compiler-docs/fe_parser/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["parse_file"],"mod":["ast","grammar","lexer","node"],"struct":["Label","ParseFailed","Parser"],"type":["ParseResult"]}; \ No newline at end of file diff --git a/compiler-docs/fe_parser/struct.Label.html b/compiler-docs/fe_parser/struct.Label.html new file mode 100644 index 0000000000..36a29f7e99 --- /dev/null +++ b/compiler-docs/fe_parser/struct.Label.html @@ -0,0 +1,34 @@ +Label in fe_parser - Rust

Struct Label

Source
pub struct Label {
+    pub style: LabelStyle,
+    pub span: Span,
+    pub message: String,
+}

Fields§

§style: LabelStyle§span: Span§message: String

Implementations§

Source§

impl Label

Source

pub fn primary<S>(span: Span, message: S) -> Label
where + S: Into<String>,

Create a primary label with the given message. This will underline the +given span with carets (^^^^).

+
Source

pub fn secondary<S>(span: Span, message: S) -> Label
where + S: Into<String>,

Create a secondary label with the given message. This will underline the +given span with hyphens (----).

+
Source

pub fn into_cs_label(self) -> Label<SourceFileId>

Convert into a [codespan_reporting::Diagnostic::Label]

+

Trait Implementations§

Source§

impl Clone for Label

Source§

fn clone(&self) -> Label

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Label

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Hash for Label

Source§

fn hash<__H>(&self, state: &mut __H)
where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Label

Source§

fn eq(&self, other: &Label) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Eq for Label

Source§

impl StructuralPartialEq for Label

Auto Trait Implementations§

§

impl Freeze for Label

§

impl RefUnwindSafe for Label

§

impl Send for Label

§

impl Sync for Label

§

impl Unpin for Label

§

impl UnwindSafe for Label

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/struct.ParseFailed.html b/compiler-docs/fe_parser/struct.ParseFailed.html new file mode 100644 index 0000000000..d33e9f02db --- /dev/null +++ b/compiler-docs/fe_parser/struct.ParseFailed.html @@ -0,0 +1,23 @@ +ParseFailed in fe_parser - Rust

Struct ParseFailed

Source
pub struct ParseFailed;

Trait Implementations§

Source§

impl Clone for ParseFailed

Source§

fn clone(&self) -> ParseFailed

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ParseFailed

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for ParseFailed

Source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl Error for ParseFailed

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl Hash for ParseFailed

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for ParseFailed

Source§

fn eq(&self, other: &ParseFailed) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, +and should not be overridden without very good reason.
Source§

impl Copy for ParseFailed

Source§

impl Eq for ParseFailed

Source§

impl StructuralPartialEq for ParseFailed

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where + T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T> ToOwned for T
where + T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/struct.Parser.html b/compiler-docs/fe_parser/struct.Parser.html new file mode 100644 index 0000000000..780e587fa9 --- /dev/null +++ b/compiler-docs/fe_parser/struct.Parser.html @@ -0,0 +1,81 @@ +Parser in fe_parser - Rust

Struct Parser

Source
pub struct Parser<'a> {
+    pub file_id: SourceFileId,
+    pub diagnostics: Vec<Diagnostic>,
+    /* private fields */
+}
Expand description

Parser maintains the parsing state, such as the token stream, +“enclosure” (paren, brace, ..) stack, diagnostics, etc. +Syntax parsing logic is in the crate::grammar module.

+

See [BTParser] if you need backtrackable parser.

+

Fields§

§file_id: SourceFileId§diagnostics: Vec<Diagnostic>

The diagnostics (errors and warnings) emitted during parsing.

+

Implementations§

Source§

impl<'a> Parser<'a>

Source

pub fn new(file_id: SourceFileId, content: &'a str) -> Self

Create a new parser for a source code string and associated file id.

+
Source

pub fn as_bt_parser<'b>(&'b mut self) -> BTParser<'a, 'b>

Returns back tracking parser.

+
Source

pub fn next(&mut self) -> ParseResult<Token<'a>>

Return the next token, or an error if we’ve reached the end of the file.

+
Source

pub fn peek_or_err(&mut self) -> ParseResult<TokenKind>

Take a peek at the next token kind without consuming it, or return an +error if we’ve reached the end of the file.

+
Source

pub fn peek(&mut self) -> Option<TokenKind>

Take a peek at the next token kind. Returns None if we’ve reached the +end of the file.

+
Source

pub fn split_next(&mut self) -> ParseResult<Token<'a>>

Split the next token into two tokens, returning the first. Only supports +splitting the >> token into two > tokens, specifically for +parsing the closing angle bracket of a generic type argument list +(Map<x, Map<y, z>>).

+
§Panics
+

Panics if the next token isn’t >>

+
Source

pub fn done(&mut self) -> bool

Returns true if the parser has reached the end of the file.

+
Source

pub fn eat_newlines(&mut self)

Source

pub fn assert(&mut self, tk: TokenKind) -> Token<'a>

Assert that the next token kind it matches the expected token +kind, and return it. This should be used in cases where the next token +kind is expected to have been checked already.

+
§Panics
+

Panics if the next token kind isn’t tk.

+
Source

pub fn expect<S: Into<String>>( + &mut self, + expected: TokenKind, + message: S, +) -> ParseResult<Token<'a>>

If the next token matches the expected kind, return it. Otherwise emit +an error diagnostic with the given message and return an error.

+
Source

pub fn expect_with_notes<Str, NotesFn>( + &mut self, + expected: TokenKind, + message: Str, + notes_fn: NotesFn, +) -> ParseResult<Token<'a>>
where + Str: Into<String>, + NotesFn: FnOnce(&Token<'_>) -> Vec<String>,

Like Parser::expect, but with additional notes to be appended to the +bottom of the diagnostic message. The notes are provided by a +function that returns a Vec<String>, to avoid allocations in the +case where the token is as expected.

+
Source

pub fn optional(&mut self, kind: TokenKind) -> Option<Token<'a>>

If the next token matches the expected kind, return it. Otherwise return +None.

+
Source

pub fn unexpected_token_error<S: Into<String>>( + &mut self, + tok: &Token<'_>, + message: S, + notes: Vec<String>, +)

Emit an “unexpected token” error diagnostic with the given message.

+
Source

pub fn enter_block( + &mut self, + context_span: Span, + context_name: &str, +) -> ParseResult<()>

Enter a “block”, which is a brace-enclosed list of statements, +separated by newlines and/or semicolons. +This checks for and consumes the { that precedes the block.

+
Source

pub fn expect_stmt_end(&mut self, context_name: &str) -> ParseResult<()>

Consumes newlines and semicolons. Returns Ok if one or more newlines or +semicolons are consumed, or if the next token is a }.

+
Source

pub fn error<S: Into<String>>(&mut self, span: Span, message: S)

Emit an error diagnostic, but don’t stop parsing

+
Source

pub fn fancy_error<S: Into<String>>( + &mut self, + message: S, + labels: Vec<Label>, + notes: Vec<String>, +)

Emit a “fancy” error diagnostic with any number of labels and notes, +but don’t stop parsing.

+

Auto Trait Implementations§

§

impl<'a> Freeze for Parser<'a>

§

impl<'a> RefUnwindSafe for Parser<'a>

§

impl<'a> Send for Parser<'a>

§

impl<'a> Sync for Parser<'a>

§

impl<'a> Unpin for Parser<'a>

§

impl<'a> UnwindSafe for Parser<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_parser/type.ParseResult.html b/compiler-docs/fe_parser/type.ParseResult.html new file mode 100644 index 0000000000..4d44941c3e --- /dev/null +++ b/compiler-docs/fe_parser/type.ParseResult.html @@ -0,0 +1,6 @@ +ParseResult in fe_parser - Rust

Type Alias ParseResult

Source
pub type ParseResult<T> = Result<T, ParseFailed>;

Aliased Type§

pub enum ParseResult<T> {
+    Ok(T),
+    Err(ParseFailed),
+}

Variants§

§1.0.0

Ok(T)

Contains the success value

+
§1.0.0

Err(ParseFailed)

Contains the error value

+
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/all.html b/compiler-docs/fe_test_files/all.html new file mode 100644 index 0000000000..ab4c55477e --- /dev/null +++ b/compiler-docs/fe_test_files/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.fixture.html b/compiler-docs/fe_test_files/fn.fixture.html new file mode 100644 index 0000000000..a5e3b82a09 --- /dev/null +++ b/compiler-docs/fe_test_files/fn.fixture.html @@ -0,0 +1 @@ +fixture in fe_test_files - Rust

Function fixture

Source
pub fn fixture(path: &str) -> &'static str
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.fixture_bytes.html b/compiler-docs/fe_test_files/fn.fixture_bytes.html new file mode 100644 index 0000000000..a11bf3e988 --- /dev/null +++ b/compiler-docs/fe_test_files/fn.fixture_bytes.html @@ -0,0 +1 @@ +fixture_bytes in fe_test_files - Rust

Function fixture_bytes

Source
pub fn fixture_bytes(path: &str) -> &'static [u8] 
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.fixture_dir.html b/compiler-docs/fe_test_files/fn.fixture_dir.html new file mode 100644 index 0000000000..4bf2f0cb39 --- /dev/null +++ b/compiler-docs/fe_test_files/fn.fixture_dir.html @@ -0,0 +1 @@ +fixture_dir in fe_test_files - Rust

Function fixture_dir

Source
pub fn fixture_dir(path: &str) -> &Dir<'static>
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.fixture_dir_files.html b/compiler-docs/fe_test_files/fn.fixture_dir_files.html new file mode 100644 index 0000000000..4bfa1d1e3c --- /dev/null +++ b/compiler-docs/fe_test_files/fn.fixture_dir_files.html @@ -0,0 +1,2 @@ +fixture_dir_files in fe_test_files - Rust

Function fixture_dir_files

Source
pub fn fixture_dir_files(path: &str) -> Vec<(&'static str, &'static str)>
Expand description

Returns (file_path, file_content)

+
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/fn.new_fixture_dir_files.html b/compiler-docs/fe_test_files/fn.new_fixture_dir_files.html new file mode 100644 index 0000000000..b5a3f88938 --- /dev/null +++ b/compiler-docs/fe_test_files/fn.new_fixture_dir_files.html @@ -0,0 +1,2 @@ +new_fixture_dir_files in fe_test_files - Rust

Function new_fixture_dir_files

Source
pub fn new_fixture_dir_files(path: &str) -> Vec<(&'static str, &'static str)>
Expand description

Returns (file_path, file_content)

+
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/index.html b/compiler-docs/fe_test_files/index.html new file mode 100644 index 0000000000..bd34c8f7f6 --- /dev/null +++ b/compiler-docs/fe_test_files/index.html @@ -0,0 +1 @@ +fe_test_files - Rust

Crate fe_test_files

Source

Functions§

fixture
fixture_bytes
fixture_dir
fixture_dir_files
Returns (file_path, file_content)
new_fixture_dir_files
Returns (file_path, file_content)
\ No newline at end of file diff --git a/compiler-docs/fe_test_files/sidebar-items.js b/compiler-docs/fe_test_files/sidebar-items.js new file mode 100644 index 0000000000..58ff4389ca --- /dev/null +++ b/compiler-docs/fe_test_files/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["fixture","fixture_bytes","fixture_dir","fixture_dir_files","new_fixture_dir_files"]}; \ No newline at end of file diff --git a/compiler-docs/fe_test_runner/all.html b/compiler-docs/fe_test_runner/all.html new file mode 100644 index 0000000000..67f9159183 --- /dev/null +++ b/compiler-docs/fe_test_runner/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Functions

\ No newline at end of file diff --git a/compiler-docs/fe_test_runner/fn.execute.html b/compiler-docs/fe_test_runner/fn.execute.html new file mode 100644 index 0000000000..6251eec0a1 --- /dev/null +++ b/compiler-docs/fe_test_runner/fn.execute.html @@ -0,0 +1,6 @@ +execute in fe_test_runner - Rust

Function execute

Source
pub fn execute(
+    name: &str,
+    events: &[Event],
+    bytecode: &str,
+    sink: &mut TestSink,
+) -> bool
\ No newline at end of file diff --git a/compiler-docs/fe_test_runner/index.html b/compiler-docs/fe_test_runner/index.html new file mode 100644 index 0000000000..a219e3d028 --- /dev/null +++ b/compiler-docs/fe_test_runner/index.html @@ -0,0 +1 @@ +fe_test_runner - Rust

Crate fe_test_runner

Source

Re-exports§

pub use ethabi;

Structs§

TestSink

Functions§

execute
\ No newline at end of file diff --git a/compiler-docs/fe_test_runner/sidebar-items.js b/compiler-docs/fe_test_runner/sidebar-items.js new file mode 100644 index 0000000000..78183fd290 --- /dev/null +++ b/compiler-docs/fe_test_runner/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["execute"],"struct":["TestSink"]}; \ No newline at end of file diff --git a/compiler-docs/fe_test_runner/struct.TestSink.html b/compiler-docs/fe_test_runner/struct.TestSink.html new file mode 100644 index 0000000000..80f7f749e6 --- /dev/null +++ b/compiler-docs/fe_test_runner/struct.TestSink.html @@ -0,0 +1,92 @@ +TestSink in fe_test_runner - Rust

Struct TestSink

Source
pub struct TestSink { /* private fields */ }

Implementations§

Source§

impl TestSink

Source

pub fn new(collect_logs: bool) -> Self

Source

pub fn test_count(&self) -> usize

Source

pub fn failure_count(&self) -> usize

Source

pub fn logs_count(&self) -> usize

Source

pub fn success_count(&self) -> usize

Source

pub fn insert_failure(&mut self, name: &str, reason: &str)

Source

pub fn insert_logs(&mut self, name: &str, logs: &str)

Source

pub fn inc_success_count(&mut self)

Source

pub fn failure_details(&self) -> String

Source

pub fn logs_details(&self) -> String

Trait Implementations§

Source§

impl Debug for TestSink

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Display for TestSink

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where + Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where + Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where + Self: Display,

Causes self to use its Display implementation when +Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where + Self: LowerExp,

Causes self to use its LowerExp implementation when +Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where + Self: LowerHex,

Causes self to use its LowerHex implementation when +Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where + Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where + Self: Pointer,

Causes self to use its Pointer implementation when +Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where + Self: UpperExp,

Causes self to use its UpperExp implementation when +Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where + Self: UpperHex,

Causes self to use its UpperHex implementation when +Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where + &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
§

impl<T> Pipe for T
where + T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where + Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where + R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where + R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where + Self: Borrow<B>, + B: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( + &'a mut self, + func: impl FnOnce(&'a mut B) -> R, +) -> R
where + Self: BorrowMut<B>, + B: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe +function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where + Self: AsRef<U>, + U: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where + Self: AsMut<U>, + U: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe +function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where + Self: Deref<Target = T>, + T: 'a + ?Sized, + R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( + &'a mut self, + func: impl FnOnce(&'a mut T) -> R, +) -> R
where + Self: DerefMut<Target = T> + Deref, + T: 'a + ?Sized, + R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe +function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where + Self: Borrow<B>, + B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release +builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where + Self: BorrowMut<B>, + B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release +builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where + Self: AsRef<R>, + R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release +builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where + Self: AsMut<R>, + R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release +builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where + Self: Deref<Target = T>, + T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release +builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where + Self: DerefMut<Target = T> + Deref, + T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release +builds.
Source§

impl<T> ToString for T
where + T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where + Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/compiler-docs/fe_yulc/all.html b/compiler-docs/fe_yulc/all.html new file mode 100644 index 0000000000..39c19d2d37 --- /dev/null +++ b/compiler-docs/fe_yulc/all.html @@ -0,0 +1 @@ +List of all items in this crate
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/fn.compile.html b/compiler-docs/fe_yulc/fn.compile.html new file mode 100644 index 0000000000..a0acbefdf7 --- /dev/null +++ b/compiler-docs/fe_yulc/fn.compile.html @@ -0,0 +1,6 @@ +compile in fe_yulc - Rust

Function compile

Source
pub fn compile(
+    contracts: impl Iterator<Item = (impl AsRef<str>, impl AsRef<str>)>,
+    optimize: bool,
+) -> Result<IndexMap<String, ContractBytecode>, YulcError>
Expand description

Compile a map of Yul contracts to a map of bytecode contracts.

+

Returns a contract_name -> hex_encoded_bytecode map.

+
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/fn.compile_single_contract.html b/compiler-docs/fe_yulc/fn.compile_single_contract.html new file mode 100644 index 0000000000..3b855074f0 --- /dev/null +++ b/compiler-docs/fe_yulc/fn.compile_single_contract.html @@ -0,0 +1,7 @@ +compile_single_contract in fe_yulc - Rust

Function compile_single_contract

Source
pub fn compile_single_contract(
+    _name: &str,
+    _yul_src: &str,
+    _optimize: bool,
+    _verify_runtime_bytecode: bool,
+) -> Result<ContractBytecode, YulcError>
Expand description

Compiles a single Yul contract to bytecode.

+
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/index.html b/compiler-docs/fe_yulc/index.html new file mode 100644 index 0000000000..81b11dde23 --- /dev/null +++ b/compiler-docs/fe_yulc/index.html @@ -0,0 +1 @@ +fe_yulc - Rust

Crate fe_yulc

Source

Structs§

ContractBytecode
YulcError

Functions§

compile
Compile a map of Yul contracts to a map of bytecode contracts.
compile_single_contract
Compiles a single Yul contract to bytecode.
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/sidebar-items.js b/compiler-docs/fe_yulc/sidebar-items.js new file mode 100644 index 0000000000..b446eb2011 --- /dev/null +++ b/compiler-docs/fe_yulc/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"fn":["compile","compile_single_contract"],"struct":["ContractBytecode","YulcError"]}; \ No newline at end of file diff --git a/compiler-docs/fe_yulc/struct.ContractBytecode.html b/compiler-docs/fe_yulc/struct.ContractBytecode.html new file mode 100644 index 0000000000..ffaa2fe95f --- /dev/null +++ b/compiler-docs/fe_yulc/struct.ContractBytecode.html @@ -0,0 +1,14 @@ +ContractBytecode in fe_yulc - Rust

Struct ContractBytecode

Source
pub struct ContractBytecode {
+    pub bytecode: String,
+    pub runtime_bytecode: String,
+}

Fields§

§bytecode: String§runtime_bytecode: String

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/fe_yulc/struct.YulcError.html b/compiler-docs/fe_yulc/struct.YulcError.html new file mode 100644 index 0000000000..48ea5f23a1 --- /dev/null +++ b/compiler-docs/fe_yulc/struct.YulcError.html @@ -0,0 +1,11 @@ +YulcError in fe_yulc - Rust

Struct YulcError

Source
pub struct YulcError(pub String);

Tuple Fields§

§0: String

Trait Implementations§

Source§

impl Debug for YulcError

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where + T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where + T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where + T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

+
Source§

impl<T, U> Into<U> for T
where + U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
Source§

impl<T, U> TryFrom<U> for T
where + U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where + U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
\ No newline at end of file diff --git a/compiler-docs/help.html b/compiler-docs/help.html new file mode 100644 index 0000000000..e7c66c6d58 --- /dev/null +++ b/compiler-docs/help.html @@ -0,0 +1 @@ +Help

Rustdoc help

Back
\ No newline at end of file diff --git a/compiler-docs/search-index.js b/compiler-docs/search-index.js new file mode 100644 index 0000000000..4a2859d5e7 --- /dev/null +++ b/compiler-docs/search-index.js @@ -0,0 +1,4 @@ +var searchIndex = new Map(JSON.parse('[["fe",{"t":"FNNNNONNNNNNHCNNNNNNPEPEGPENNNNCECEENNNNNCNNNNNNPPFPSGPPPPNNNNNNNHHHNNNNNONNNNNNNNNNONNHOHOOONNNNNNNNNNNNHNNHHFNNNNHHHNNNONNNNNNNFSNNNNHHNNNNONNNNNN","n":["FelangCli","augment_args","augment_args_for_update","borrow","borrow_mut","command","from","from_arg_matches","from_arg_matches_mut","into","into_app","into_app_for_update","main","task","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","Build","BuildArgs","Check","CheckArgs","Commands","New","NewProjectArgs","augment_subcommands","augment_subcommands_for_update","borrow","borrow_mut","build","","check","","create_new_project","from","from_arg_matches","from_arg_matches_mut","has_subcommand","into","new","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","Abi","Ast","BuildArgs","Bytecode","DEFAULT_OUTPUT_DIR_NAME","Emit","LoweredAst","RuntimeBytecode","Tokens","Yul","__clone_box","augment_args","augment_args_for_update","borrow","","borrow_mut","","build","build_ingot","build_single_file","clone","clone_into","clone_to_uninit","cmp","compare","emit","eq","equivalent","","","","fmt","from","","from_arg_matches","from_arg_matches_mut","input_path","into","","ioerr_to_string","mir","mir_dump","optimize","output_dir","overwrite","partial_cmp","to_owned","to_possible_value","try_from","","try_into","","type_id","","update_from_arg_matches","update_from_arg_matches_mut","value_variants","verify_nonexistent_or_empty","vzip","","write_compiled_module","write_output","CheckArgs","augment_args","augment_args_for_update","borrow","borrow_mut","check","check_ingot","check_single_file","from","from_arg_matches","from_arg_matches_mut","input_path","into","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip","NewProjectArgs","SRC_TEMPLATE_DIR","augment_args","augment_args_for_update","borrow","borrow_mut","create_new_project","create_project","from","from_arg_matches","from_arg_matches_mut","into","name","try_from","try_into","type_id","update_from_arg_matches","update_from_arg_matches_mut","vzip"],"q":[[0,"fe"],[20,"fe::task"],[48,"fe::task::build"],[110,"fe::task::check"],[129,"fe::task::new"],[148,"clap::builder::command"],[149,"clap::parser::matches::arg_matches"],[150,"clap::error"],[151,"core::result"],[152,"core::any"],[153,"dyn_clone::sealed"],[154,"alloc::string"],[155,"fe_driver"],[156,"core::cmp"],[157,"alloc::vec"],[158,"core::fmt"],[159,"std::io::error"],[160,"core::option"],[161,"clap::builder::possible_value"],[162,"std::path"],[163,"fe_codegen::db"],[164,"fe_common::diagnostics"],[165,"include_dir::dir"]],"i":"`h0000000000``000000j`0``0`0000`````00000`000000Bd0`0``00000Al01010```1111101111111000010`0`000111101010001`10```Cj000```00000000000``Db000``00000000000","f":"`{bb}0{d{{d{c}}}{}}{{{d{f}}}{{d{fc}}}{}}{hj}{cc{}}{{{d{l}}}{{A`{hn}}}}{{{d{fl}}}{{A`{hn}}}}{{}c{}}{{}b}0{{}Ab}`{c{{A`{e}}}{}{}}{{}{{A`{c}}}{}}{dAd}{{{d{fh}}{d{l}}}{{A`{Abn}}}}{{{d{fh}}{d{fl}}}{{A`{Abn}}}}{{}c{}}```````??>=`````;{{{d{l}}}{{A`{jn}}}}{{{d{fl}}}{{A`{jn}}}}{{{d{Af}}}Ah};`876{{{d{fj}}{d{l}}}{{A`{Abn}}}}{{{d{fj}}{d{fl}}}{{A`{Abn}}}}5````{{}d}`````{{dAj}Ab}{bb}0{d{{d{c}}}{}}0{{{d{f}}}{{d{fc}}}{}}0{AlAb}{{{d{Al}}}{{Bb{AnB`}}}}0{{{d{Bd}}}Bd}{{d{d{fc}}}Ab{}}{{dBf}Ab}{{{d{Bd}}{d{Bd}}}Bh}{{d{d{c}}}Bh{}}{AlBj}{{{d{Bd}}{d{Bd}}}Ah}{{d{d{c}}}Ah{}}000{{{d{Bd}}{d{fBl}}}Bn}{cc{}}0{{{d{l}}}{{A`{Aln}}}}{{{d{fl}}}{{A`{Aln}}}}{AlAn}{{}c{}}0{C`An}{AlAh}{{{d{Af}}}Ab}{AlCb}52{{{d{Bd}}{d{Bd}}}{{Cb{Bh}}}}{dc{}}{{{d{Bd}}}{{Cb{Cd}}}}{c{{A`{e}}}{}{}}0{{}{{A`{c}}}{}}0{dAd}0{{{d{fAl}}{d{l}}}{{A`{Abn}}}}{{{d{fAl}}{d{fl}}}{{A`{Abn}}}}{{}{{d{{Cf{Bd}}}}}}{{{d{Ch}}}{{A`{AbAn}}}}{{}c{}}0{{B`{d{Af}}{d{{Cf{Bd}}}}{d{Af}}Ah}{{A`{AbAn}}}}{{{d{Ch}}{d{Af}}}{{A`{AbAn}}}}`{bb}0{d{{d{c}}}{}}{{{d{f}}}{{d{fc}}}{}}{CjAb}{{{d{fCl}}{d{Af}}}{{Bj{Cn}}}}0{cc{}}{{{d{l}}}{{A`{Cjn}}}}{{{d{fl}}}{{A`{Cjn}}}}{CjAn}{{}c{}}{c{{A`{e}}}{}{}}{{}{{A`{c}}}{}}{dAd}{{{d{fCj}}{d{l}}}{{A`{Abn}}}}{{{d{fCj}}{d{fl}}}{{A`{Abn}}}}{{}c{}}`{{}D`}{bb}0{d{{d{c}}}{}}{{{d{f}}}{{d{fc}}}{}}{DbAb}{{{d{Af}}{d{Ch}}}Ab}{cc{}}{{{d{l}}}{{A`{Dbn}}}}{{{d{fl}}}{{A`{Dbn}}}}?{DbAn}?>={{{d{fDb}}{d{l}}}{{A`{Abn}}}}{{{d{fDb}}{d{fl}}}{{A`{Abn}}}}<","D":"Ah","p":[[8,"Command",148],[1,"reference",null,null,1],[0,"mut"],[5,"FelangCli",0],[6,"Commands",20],[5,"ArgMatches",149],[5,"Error",150],[6,"Result",151,null,1],[1,"unit"],[5,"TypeId",152],[1,"str"],[1,"bool"],[5,"Private",153],[5,"BuildArgs",48],[5,"String",154],[5,"CompiledModule",155],[1,"tuple",null,null,1],[6,"Emit",48],[1,"u8"],[6,"Ordering",156],[5,"Vec",157],[5,"Formatter",158],[8,"Result",158],[5,"Error",159],[6,"Option",160,null,1],[5,"PossibleValue",161],[1,"slice"],[5,"Path",162],[5,"CheckArgs",110],[5,"Db",163],[5,"Diagnostic",164],[5,"Dir",165],[5,"NewProjectArgs",129]],"r":[[21,48],[23,110],[26,129],[32,48],[34,110],[35,129]],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAIgACwAAAAYACAABAAsAGQAmAAIAKgAmAFMAAgBYAB4AeAACAHwADQCLAAEAjgAGAA==","P":[[3,"T"],[5,""],[6,"T"],[7,""],[9,"U"],[10,""],[14,"U,T"],[15,"U"],[16,""],[19,"V"],[27,""],[29,"T"],[37,""],[40,"U"],[42,"U,T"],[43,"U"],[44,""],[47,"V"],[52,""],[61,"T"],[65,""],[69,"T"],[70,""],[72,"K"],[73,""],[75,"K"],[79,""],[80,"T"],[82,""],[85,"U"],[87,""],[94,"T"],[95,""],[96,"U,T"],[98,"U"],[100,""],[106,"V"],[108,""],[113,"T"],[115,""],[118,"T"],[119,""],[122,"U"],[123,"U,T"],[124,"U"],[125,""],[128,"V"],[130,""],[133,"T"],[135,""],[137,"T"],[138,""],[140,"U"],[141,""],[142,"U,T"],[143,"U"],[144,""],[147,"V"]]}],["fe_abi",{"t":"CCCCFNNNNNNNNNNNNNNNNNNNFFFONNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNOONNNNNNNNNNNNNNOONNNFFGPGPPPPPPPPPPPPPGGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFGPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNOO","n":["contract","event","function","types","AbiContract","borrow","borrow_mut","clone","clone_into","clone_to_uninit","eq","equivalent","","","","fmt","from","into","new","serialize","to_owned","try_from","try_into","type_id","AbiEvent","AbiEventField","AbiEventSignature","anonymous","borrow","","","borrow_mut","","","clone","","clone_into","","clone_to_uninit","","eq","","equivalent","","","","","","","","fmt","","from","","","hash_hex","hash_raw","indexed","inputs","into","","","name","","new","","serialize","","signature","","to_owned","","try_from","","","try_into","","","ty","","type_id","","","AbiFunction","AbiFunctionSelector","AbiFunctionType","Constructor","CtxParam","Fallback","Function","Imm","","Mut","","None","","Nonpayable","Payable","","Pure","Receive","SelfParam","StateMutability","View","borrow","","","","","","borrow_mut","","","","","","clone","","","clone_into","","","clone_to_uninit","","","eq","","","equivalent","","","","","","","","","","","","fmt","","","from","","","","","","from_self_and_ctx_params","hex","into","","","","","","new","selector","selector_raw","selector_signature","serialize","","","to_owned","","","try_from","","","","","","try_into","","","","","","type_id","","","","","","AbiTupleField","AbiType","Address","Array","Bool","Bytes","Function","Int","String","Tuple","UInt","abi_type_name","borrow","","borrow_mut","","clone","","clone_into","","clone_to_uninit","","eq","","equivalent","","","","","","","","fmt","","from","","header_size","into","","is_bytes","is_primitive","is_static","is_string","name","new","selector_type_name","serialize","","size","to_owned","","try_from","","try_into","","ty","type_id","","elem_ty","len"],"q":[[0,"fe_abi"],[4,"fe_abi::contract"],[24,"fe_abi::event"],[83,"fe_abi::function"],[185,"fe_abi::types"],[243,"fe_abi::types::AbiType"],[245,"core::fmt"],[246,"alloc::vec"],[247,"core::result"],[248,"serde::ser"],[249,"core::any"],[250,"alloc::string"],[251,"core::convert"],[252,"core::option"],[253,"alloc::boxed"]],"i":"`````f000000000000000000```AfB`1An1202020202022220000201201102120202020122012012020120```Bn`00C`Cb1010Bl0303``021Cd1Ab5431205205205205205222200005555205431205214312050011205205431205431205431205``Bf0000000000Cj10101010101111000010101101111001101101010010Cn0","f":"`````{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}{{{b{f}}}f}{{b{b{dc}}}h{}}{{bj}h}{{{b{f}}{b{f}}}l}{{b{b{c}}}l{}}000{{{b{f}}{b{dn}}}A`}{cc{}}{{}c{}}{{{Ad{Ab}}{Ad{Af}}}f}{{{b{f}}c}AhAj}{bc{}}{c{{Ah{e}}}{}{}}{{}{{Ah{c}}}{}}{bAl}```{Afl}{b{{b{c}}}{}}00{{{b{d}}}{{b{dc}}}{}}00{{{b{Af}}}Af}{{{b{An}}}An}{{b{b{dc}}}h{}}0{{bj}h}0{{{b{Af}}{b{Af}}}l}{{{b{An}}{b{An}}}l}{{b{b{c}}}l{}}0000000{{{b{Af}}{b{dn}}}A`}{{{b{An}}{b{dn}}}A`}{cc{}}00{{{b{B`}}}Bb}{{{b{B`}}}{{Bd{j}}}}{Anl}{AfAd}{{}c{}}00{AfBb}{AnBb}{{Bb{Ad{An}}l}Af}{{Bbcl}An{{Bh{Bf}}}}{{{b{Af}}c}AhAj}{{{b{An}}c}AhAj}{{{b{B`}}}{{b{Bj}}}}{{{b{Af}}}B`}{bc{}}0{c{{Ah{e}}}{}{}}00{{}{{Ah{c}}}{}}00{Afb}{AnBf}{bAl}00`````````````````````{b{{b{c}}}{}}00000{{{b{d}}}{{b{dc}}}{}}00000{{{b{Bl}}}Bl}{{{b{Ab}}}Ab}{{{b{Bn}}}Bn}{{b{b{dc}}}h{}}00{{bj}h}00{{{b{Bl}}{b{Bl}}}l}{{{b{Ab}}{b{Ab}}}l}{{{b{Bn}}{b{Bn}}}l}{{b{b{c}}}l{}}00000000000{{{b{Bl}}{b{dn}}}A`}{{{b{Ab}}{b{dn}}}A`}{{{b{Bn}}{b{dn}}}A`}{cc{}}00000{{C`Cb}Bl}{{{b{Cd}}}Bb}{{}c{}}00000{{BnBb{Ad{{Cf{BbBf}}}}{Ch{Bf}}Bl}Ab}{{{b{Ab}}}Cd}{{{b{Cd}}}{{Bd{j}}}}{{{b{Cd}}}{{b{Bj}}}}{{{b{Bl}}c}AhAj}{{{b{Ab}}c}AhAj}{{{b{Bn}}c}AhAj}{bc{}}00{c{{Ah{e}}}{}{}}00000{{}{{Ah{c}}}{}}00000{bAl}00000```````````{{{b{Bf}}}Bb}{b{{b{c}}}{}}0{{{b{d}}}{{b{dc}}}{}}0{{{b{Bf}}}Bf}{{{b{Cj}}}Cj}{{b{b{dc}}}h{}}0{{bj}h}0{{{b{Bf}}{b{Bf}}}l}{{{b{Cj}}{b{Cj}}}l}{{b{b{c}}}l{}}0000000{{{b{Bf}}{b{dn}}}A`}{{{b{Cj}}{b{dn}}}A`}{cc{}}0{{{b{Bf}}}Cl}{{}c{}}0{{{b{Bf}}}l}000{CjBb}{{Bbc}Cj{{Bh{Bf}}}}{{{b{Bf}}}Bb}{{{b{Bf}}c}AhAj}{{{b{Cj}}c}AhAj}{{{b{Bf}}}{{Ch{Cl}}}}{bc{}}0{c{{Ah{e}}}{}{}}0{{}{{Ah{c}}}{}}0{CjBf}{bAl}0{CnD`}{CnCl}","D":"Cf","p":[[1,"reference",null,null,1],[0,"mut"],[5,"AbiContract",4],[1,"unit"],[1,"u8"],[1,"bool"],[5,"Formatter",245],[8,"Result",245],[5,"AbiFunction",83],[5,"Vec",246],[5,"AbiEvent",24],[6,"Result",247,null,1],[10,"Serializer",248],[5,"TypeId",249],[5,"AbiEventField",24],[5,"AbiEventSignature",24],[5,"String",250],[1,"array"],[6,"AbiType",185],[10,"Into",251,null,1],[1,"str"],[6,"StateMutability",83],[6,"AbiFunctionType",83],[6,"SelfParam",83],[6,"CtxParam",83],[5,"AbiFunctionSelector",83],[1,"tuple",null,null,1],[6,"Option",252,null,1],[5,"AbiTupleField",185],[1,"usize"],[15,"Array",243],[5,"Box",253,null,1]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAANoACgAAABAAEwAhADgAAwA/ACcAaAAnAJYAAACeAD0A3gAAAOEACADrAAoA","P":[[5,"T"],[7,""],[8,"T"],[9,""],[11,"K"],[15,""],[16,"T"],[17,"U"],[18,""],[19,"S"],[20,"T"],[21,"U,T"],[22,"U"],[23,""],[28,"T"],[34,""],[36,"T"],[38,""],[42,"K"],[50,""],[52,"T"],[55,""],[59,"U"],[62,""],[66,"__S"],[68,""],[70,"T"],[72,"U,T"],[75,"U"],[78,""],[104,"T"],[116,""],[119,"T"],[122,""],[128,"K"],[140,""],[143,"T"],[149,""],[151,"U"],[157,""],[161,"__S"],[164,"T"],[167,"U,T"],[173,"U"],[179,""],[197,"T"],[201,""],[203,"T"],[205,""],[209,"K"],[217,""],[219,"T"],[221,""],[222,"U"],[224,""],[231,"S"],[232,"__S"],[233,""],[234,"T"],[236,"U,T"],[238,"U"],[240,""]]}],["fe_analyzer",{"t":"EEHHCCCCCCCCPGPPGFGFPPGPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNSSSSPFGFKPPPPPGGPFPPFPFPPPPFPGPPPPFPPPPMNMNMNMNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOMNMNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNONNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNNNNNMNNNNNNNNNNNNONNMNNNOOOMNNNNNNNNMNMNNNMNMNMNNMNNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNMNOOOOOOOOOOOOOOOOOOOOOOFKFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNONNMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNOMNOMNOMNOMNONMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNONMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNONNMNMNMNMNMNMNMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNKKFNNNNNMNNNNNNNFGFFPFGPPPPPPGFPPPNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNHHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNHHHNNNNNNNNNNNNNNNNNNHNNNNNNNNCCCPFPFPPFPFFFIFGKPFPFFFGPPFPFFFPFPFFPFGPGPPPFPFFFGPPFPFFFFPFPPFFGPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNOOOOOOOOONNNNNNNNNNNNNNNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNNNNNNNNNNNNNNNNNNNNMNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHFGPFPFPPPPNNNNNNNNNNNNNONNNNNNNNHNNNONNNNNNOOONNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNONNNNNNNOPPFPPGPPPFPFFFFPGFGGFPPPPPPPPGFFPPPPPPKPFPPPPPGFPGPKFPPPPSPPPPNNHNMNMNNMNNNMNNNMNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHHNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNOONNNNMNONNOONNNNOOONNNNNNNNONNNNNNOONNONNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNHHNNNOPPGPPGPFFFFGPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNOO","n":["AnalyzerDb","TestDb","analyze_ingot","analyze_module","builtins","constants","context","db","display","errors","namespace","pattern_analysis","AbiEncode","ContractTypeMethod","Create","Create2","GlobalFunction","GlobalFunctionIter","Intrinsic","IntrinsicIter","Keccak256","ToMem","ValueMethod","__add","__addmod","__address","__and","__balance","__basefee","__blockhash","__byte","__call","__callcode","__calldatacopy","__calldataload","__calldatasize","__caller","__callvalue","__chainid","__codecopy","__codesize","__coinbase","__create","__create2","__delegatecall","__div","__eq","__exp","__extcodecopy","__extcodehash","__extcodesize","__gas","__gaslimit","__gasprice","__gt","__invalid","__iszero","__keccak256","__log0","__log1","__log2","__log3","__log4","__lt","__mload","__mod","__msize","__mstore","__mstore8","__mul","__mulmod","__not","__number","__or","__origin","__pc","__pop","__prevrandao","__return","__returndatacopy","__returndatasize","__revert","__sar","__sdiv","__selfbalance","__selfdestruct","__sgt","__shl","__shr","__signextend","__sload","__slt","__smod","__sstore","__staticcall","__stop","__sub","__timestamp","__xor","arg_count","","as_ref","","","","borrow","","","","","","borrow_mut","","","","","","clone","","","","","","clone_into","","","","","","clone_to_uninit","","","","","","cmp","","compare","","eq","","","","equivalent","","","","","","","","","","","","","","","","fmt","","","","from","","","","","","from_str","","","","hash","","","into","","","","","","into_iter","","iter","","len","","next","","next_back","","nth","","partial_cmp","","return_type","size_hint","","to_owned","","","","","","try_from","","","","","","","","","","try_into","","","","","","type_id","","","","","","EMITTABLE_TRAIT_NAME","EMIT_FN_NAME","INDEXED","MAX_INDEXED_EVENT_FIELDS","Address","Adjustment","AdjustmentKind","Analysis","AnalyzerContext","AssociatedFunction","Bool","BuiltinAssociatedFunction","BuiltinFunction","BuiltinValueMethod","CallType","Constant","Copy","DiagnosticVoucher","EnumConstructor","EnumVariant","ExpressionAttributes","External","FunctionBody","Int","IntSizeIncrease","Intrinsic","Item","Label","Load","NamedThing","Pure","SelfValue","Str","StringSizeIncrease","TempContext","TraitValueMethod","TypeConstructor","ValueMethod","Variable","add_call","","add_constant","","add_diagnostic","","add_expression","","adjusted_type","assume_the_parser_handled_it","borrow","","","","","","","","","","","borrow_mut","","","","","","","","","","","calls","clone","","","","","","","","","","clone_into","","","","","","","","","","clone_to_uninit","","","","","","","","","","const_value","constant_value_by_name","","db","","default","","diagnostics","","duplicate_name_error","eq","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","error","expr_typ","","expressions","fancy_error","fmt","","","","","","","","","","","format","from","","","","","","","","","","","from_num_str","function","function_name","get_call","","get_context_type","","has_diag","hash","","","inherits_type","","into","","","","","","","","","","","","into_cs_label","is_builtin","is_in_function","","is_unsafe","item_kind_display_name","kind","matches","message","module","","name","name_conflict_error","name_span","new","","not_yet_implemented","original_type","parent","","parent_function","","primary","register_diag","resolve_any_path","","resolve_name","","resolve_path","","resolve_path_segment","resolve_visible_path","","root_item","secondary","sink_diagnostics","span","spans","style","to_owned","","","","","","","","","","to_string","try_from","","","","","","","","","","","try_into","","","","","","","","","","","typ","type_adjustments","type_error","type_id","","","","","","","","","","","update_expression","","value","var_types","contract","","function","","","generic_type","method","","","trait_id","typ","","","decl","is_const","name","parent","span","","typ","AllImplsQuery","AnalyzerDb","AnalyzerDbGroupStorage__","AnalyzerDbStorage","ContractAllFieldsQuery","ContractAllFunctionsQuery","ContractCallFunctionQuery","ContractDependencyGraphQuery","ContractFieldMapQuery","ContractFieldTypeQuery","ContractFunctionMapQuery","ContractInitFunctionQuery","ContractPublicFunctionMapQuery","ContractRuntimeDependencyGraphQuery","EnumAllFunctionsQuery","EnumAllVariantsQuery","EnumDependencyGraphQuery","EnumFunctionMapQuery","EnumVariantKindQuery","EnumVariantMapQuery","FunctionBodyQuery","FunctionDependencyGraphQuery","FunctionSignatureQuery","FunctionSigsQuery","ImplAllFunctionsQuery","ImplForQuery","ImplFunctionMapQuery","IngotExternalIngotsQuery","IngotFilesQuery","IngotModulesQuery","IngotRootModuleQuery","InternAttributeLookupQuery","InternAttributeQuery","InternContractFieldLookupQuery","InternContractFieldQuery","InternContractLookupQuery","InternContractQuery","InternEnumLookupQuery","InternEnumQuery","InternEnumVariantLookupQuery","InternEnumVariantQuery","InternFunctionLookupQuery","InternFunctionQuery","InternFunctionSigLookupQuery","InternFunctionSigQuery","InternImplLookupQuery","InternImplQuery","InternIngotLookupQuery","InternIngotQuery","InternModuleConstLookupQuery","InternModuleConstQuery","InternModuleLookupQuery","InternModuleQuery","InternStructFieldLookupQuery","InternStructFieldQuery","InternStructLookupQuery","InternStructQuery","InternTraitLookupQuery","InternTraitQuery","InternTypeAliasLookupQuery","InternTypeAliasQuery","InternTypeLookupQuery","InternTypeQuery","ModuleAllImplsQuery","ModuleAllItemsQuery","ModuleConstantTypeQuery","ModuleConstantValueQuery","ModuleConstantsQuery","ModuleContractsQuery","ModuleFilePathQuery","ModuleImplMapQuery","ModuleIsIncompleteQuery","ModuleItemMapQuery","ModuleParentModuleQuery","ModuleParseQuery","ModuleStructsQuery","ModuleSubmodulesQuery","ModuleTestsQuery","ModuleUsedItemMapQuery","RootIngotQuery","StructAllFieldsQuery","StructAllFunctionsQuery","StructDependencyGraphQuery","StructFieldMapQuery","StructFieldTypeQuery","StructFunctionMapQuery","TestDb","TraitAllFunctionsQuery","TraitFunctionMapQuery","TraitIsImplementedForQuery","TypeAliasTypeQuery","all_impls","","","borrow","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","contract_all_fields","","","contract_all_functions","","","contract_call_function","","","contract_dependency_graph","","","contract_field_map","","","contract_field_type","","","contract_function_map","","","contract_init_function","","","contract_public_function_map","","","contract_runtime_dependency_graph","","","default","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","enum_all_functions","","","enum_all_variants","","","enum_dependency_graph","","","enum_function_map","","","enum_variant_kind","","","enum_variant_map","","","execute","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","file_content","file_line_starts","file_name","fmt","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fmt_index","","for_each_query","","from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","function_body","","","function_dependency_graph","","","function_signature","","","function_sigs","","","group_storage","","impl_all_functions","","","impl_for","","","impl_function_map","","","in_db","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","in_db_mut","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","ingot_external_ingots","","","ingot_files","","","ingot_modules","","","ingot_root_module","","","intern_attribute","","","intern_contract","","","intern_contract_field","","","intern_enum","","","intern_enum_variant","","","intern_file","intern_function","","","intern_function_sig","","","intern_impl","","","intern_ingot","","","intern_module","","","intern_module_const","","","intern_struct","","","intern_struct_field","","","intern_trait","","","intern_type","","","intern_type_alias","","","into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","lookup_intern_attribute","","","lookup_intern_contract","","","lookup_intern_contract_field","","","lookup_intern_enum","","","lookup_intern_enum_variant","","","lookup_intern_file","lookup_intern_function","","","lookup_intern_function_sig","","","lookup_intern_impl","","","lookup_intern_ingot","","","lookup_intern_module","","","lookup_intern_module_const","","","lookup_intern_struct","","","lookup_intern_struct_field","","","lookup_intern_trait","","","lookup_intern_type","","","lookup_intern_type_alias","","","maybe_changed_since","","module_all_impls","","","module_all_items","","","module_constant_type","","","module_constant_value","","","module_constants","","","module_contracts","","","module_file_path","","","module_impl_map","","","module_is_incomplete","","","module_item_map","","","module_parent_module","","","module_parse","","","module_structs","","","module_submodules","","","module_tests","","","module_used_item_map","","","new","ops_database","ops_salsa_runtime","ops_salsa_runtime_mut","query_storage","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","recover","","","","","","","","root_ingot","","","set_file_content","set_file_content_with_durability","set_ingot_external_ingots","","set_ingot_external_ingots_with_durability","","set_ingot_files","","set_ingot_files_with_durability","","set_root_ingot","","set_root_ingot_with_durability","","struct_all_fields","","","struct_all_functions","","","struct_dependency_graph","","","struct_field_map","","","struct_field_type","","","struct_function_map","","","trait_all_functions","","","trait_function_map","","","trait_is_implemented_for","","","try_from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","type_alias_type","","","type_id","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","upcast","upcast_mut","DisplayWithDb","Displayable","DisplayableWrapper","borrow","borrow_mut","child","display","fmt","format","from","into","new","to_string","try_from","try_into","type_id","AlreadyDefined","BinaryOperationError","ConstEvalError","FatalError","Incompatible","IncompleteItem","IndexingError","NotEqualAndUnsigned","NotSubscriptable","RequiresToMem","RightIsSigned","RightTooLarge","SelfContractType","TypeCoercionError","TypeError","TypesNotCompatible","TypesNotNumeric","WrongIndexType","borrow","","","","","","","","borrow_mut","","","","","","","","clone","","clone_into","","clone_to_uninit","","duplicate_name_error","eq","","","","","equivalent","","","","","","","","","","","","","","","","","","","","error","fancy_error","fmt","","","","","","","","from","","","","","","","","","","","","","","","","","","hash","","into","","","","","","","","name_conflict_error","new","","","","","not_yet_implemented","self_contract_type_error","to_mem_error","to_owned","","try_from","","","","","","","","try_into","","","","","","","","type_error","type_id","","","","","","","","items","scopes","types","Alias","Attribute","","AttributeId","BuiltinFunction","Constant","Contract","","ContractField","ContractFieldId","ContractId","DepGraph","DepGraphWrapper","DepLocality","DiagnosticSink","Dir","Enum","","EnumId","EnumVariant","EnumVariantId","EnumVariantKind","External","File","Function","","FunctionId","FunctionSig","FunctionSigId","GenericType","Impl","","ImplId","Ingot","","IngotId","IngotMode","Intrinsic","Item","Lib","Local","Main","Module","","ModuleConstant","ModuleConstantId","ModuleId","ModuleSource","Primitive","StandaloneModule","Struct","","StructField","StructFieldId","StructId","Trait","","TraitId","Tuple","Type","TypeAlias","TypeAliasId","TypeDef","Unit","all_constants","all_contracts","all_functions","","","","","","all_impls","all_items","all_modules","as_intern_id","","","","","","","","","","","","","","","as_trait_or_type","as_type","","","ast","","","","","","","","","","","","","","","attributes","","body","borrow","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","builtin_items","call_function","can_stand_in_for","clone","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone_to_uninit","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","cmp","","","","","","","","","","","","","","","","","compare","","","","","","","","","","","","","","","","","constant_value","data","","","","","","","","","","","","","","","default","","","","","dependency_graph","","","","","diagnostics","","disc","display_name","eq","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","external_ingots","field","field_len","field_type","fields","","file_path_relative_to_src_dir","fmt","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","format","from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","from_build_files","from_files","from_intern_id","","","","","","","","","","","","","","","function","","","","","","function_sig","functions","","","","","generic_param","generic_params","global_items","has_private_field","hash","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","impls","ingot","","init_function","internal_items","into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","is_builtin","is_constructor","","is_contract","is_contract_func","","is_generic","","is_impl_fn","is_implemented_for","is_in_scope","is_in_std","","is_incomplete","is_indexed","is_module_fn","is_public","","","","","","","","","","","is_receiver_type","is_std_trait","is_struct","is_test","is_trait_fn","is_unit","is_unsafe","item_kind_display_name","items","","","","kind","mode","module","","","","","","","","","","","","","","","","","","","name","","","","","","","","","","","","","","","","","","","","name_span","","","","","","","","","","name_with_parent","new","","new_standalone","node_id","non_used_internal_items","parent","","","","","","","","","","","","","","","","","","parent_module","partial_cmp","","","","","","","","","","","","","","","","","path","pub_span","public_functions","push","push_all","receiver","","resolve_constant","resolve_name","","resolve_path","resolve_path_internal","resolve_path_non_used_internal","resolve_path_segments","root_module","runtime_dependency_graph","self_item","self_span","","self_type","","sig","","signature","","sink_diagnostics","","","","","","","","","","","","","","","","sink_external_ingot_diagnostics","source","span","","","","","","","","","","","src_dir","std_lib","submodules","tag","takes_self","","tests","to_owned","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","trait_id","","try_from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","typ","","","","type_id","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","unsafe_span","","used_items","value","variant","variants","walk_local_dependencies","BlockScope","BlockScopeType","Function","FunctionScope","IfElse","ItemScope","Loop","Match","MatchArm","Unsafe","add_call","","","add_constant","","","add_diagnostic","","","add_expression","","","add_var","body","borrow","","","","borrow_mut","","","","check_visibility","clone","clone_into","clone_to_uninit","constant_defs","constant_value_by_name","","","db","","","","diagnostics","","eq","equivalent","","","","expr_typ","","","fmt","from","","","","function","function_return_type","get_call","","","get_context_type","","","inherits_type","","","into","","","","is_in_function","","","map_pattern_matrix","map_variable_type","module","","","new","","","new_child","parent","","","","parent_function","","","resolve_any_path","","","resolve_name","","","resolve_path","","","resolve_visible_path","","","root","to_owned","try_from","","","","try_into","","","","typ","type_id","","","","update_expression","","","variable_defs","Address","AnyType","Array","","","Base","","Bool","Contract","CtxDecl","Enum","FeString","FunctionParam","FunctionSignature","Generic","","GenericArg","GenericParam","GenericParamKind","GenericType","GenericTypeIter","I128","I16","I256","I32","I64","I8","Int","","Integer","IntegerIter","Map","","","Mut","Numeric","PrimitiveType","SPtr","SafeNames","SelfContract","SelfDecl","SelfType","String","","Struct","TraitId","TraitOrType","Tuple","","Type","","TypeDowncast","TypeId","","U128","U16","U256","","U32","U64","U8","Unit","address","","address_max","apply","as_array","","as_int","","as_intern_id","as_map","","as_ref","","as_string","","as_struct","as_trait_or_type","as_tuple","","base","bits","bool","","borrow","","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","","bounds","can_hold","clone","","","","","","","","","","","","","","","","","","","clone_into","","","","","","","","","","","","","","","","","","","clone_to_uninit","","","","","","","","","","","","","","","","","","","cmp","","","","","","compare","","","","","","ctx_decl","def_span","default","deref","deref_typ","eq","","","","","","","","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fits","fmt","","","","","","","","","","","","","","","","","","","","","format","","","from","","","","","","","","","","","","","","","","","","","","","from_intern_id","from_str","","","function_sig","function_sigs","get_impl_for","has_fixed_size","","hash","","","","","","","","","","","","","","","","","i256_max","i256_min","id","inner","int","","into","","","","","","","","","","","","","","","","","","","","into_iter","","is_bool","is_contract","is_emittable","is_encodable","is_generic","is_integer","is_map","is_mut","","is_primitive","is_self_ty","is_signed","is_sptr","is_string","is_struct","is_unit","items","iter","","key","kind","kind_display_name","label","len","","lower_snake","make_sptr","max_size","max_value","min_value","mut_","","name","","","","","","","new","next","","next_back","","nth","","params","","partial_cmp","","","","","","return_type","self_decl","self_function","size","","size_hint","","span","","to_owned","","","","","","","","","","","","","","","","","","","to_string","","","","trait_function_candidates","try_from","","","","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","","tuple","typ","","type_id","","","","","","","","","","","","","","","","","","","","u256","","u256_max","u256_min","u8","unit","","value","Bool","Constructor","ConstructorKind","Enum","Literal","LiteralConstructor","Or","PatternMatrix","PatternRowVec","SigmaSet","SimplifiedPattern","SimplifiedPatternKind","Struct","Tuple","WildCard","arity","borrow","","","","","","","borrow_mut","","","","","","","clone","","","","","","","clone_into","","","","","","","clone_to_uninit","","","","","","","collect_column_ctors","collect_ctors","complete_sigma","ctor_with_wild_card_fields","d_specialize","","difference","eq","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","field_types","find_non_exhaustiveness","fmt","","","","","","","format","from","","","","","","","from_arms","from_rows","hash","","head","inner","into","","","","","","","into_iter","into_rows","is_complete","is_empty","","is_row_useful","is_wildcard","iter","kind","len","","ncols","new","","","nrows","pats","phi_specialize","","rows","sigma_set","swap","swap_col","to_owned","","","","","","","try_from","","","","","","","try_into","","","","","","","ty","","type_id","","","","","","","wildcard","fields","kind"],"q":[[0,"fe_analyzer"],[12,"fe_analyzer::builtins"],[227,"fe_analyzer::constants"],[231,"fe_analyzer::context"],[532,"fe_analyzer::context::CallType"],[545,"fe_analyzer::context::NamedThing"],[552,"fe_analyzer::db"],[2063,"fe_analyzer::display"],[2079,"fe_analyzer::errors"],[2219,"fe_analyzer::namespace"],[2222,"fe_analyzer::namespace::items"],[3319,"fe_analyzer::namespace::scopes"],[3443,"fe_analyzer::namespace::types"],[3989,"fe_analyzer::pattern_analysis"],[4166,"fe_analyzer::pattern_analysis::SimplifiedPatternKind"],[4168,"fe_common::diagnostics"],[4169,"alloc::vec"],[4170,"core::result"],[4171,"core::cmp"],[4172,"core::fmt"],[4173,"core::hash"],[4174,"core::option"],[4175,"core::any"],[4176,"fe_parser::ast"],[4177,"fe_parser::node"],[4178,"smol_str"],[4179,"indexmap::map"],[4180,"core::clone"],[4181,"fe_common::span"],[4182,"alloc::rc"],[4183,"core::cell"],[4184,"alloc::string"],[4185,"fe_common::files"],[4186,"codespan_reporting::diagnostic"],[4187,"core::convert"],[4188,"std::collections::hash::map"],[4189,"core::ops::function"],[4190,"alloc::sync"],[4191,"salsa"],[4192,"salsa::runtime"],[4193,"salsa::revision"],[4194,"salsa::durability"],[4195,"fe_common::db"],[4196,"salsa::intern_id"],[4197,"fe_common::utils::files"],[4198,"core::iter::traits::iterator"],[4199,"fe_analyzer::traversal::pattern_analysis"],[4200,"alloc::collections::btree::map"],[4201,"num_bigint::bigint"],[4202,"fe_analyzer::traversal"]],"i":"````````````Ah`Ab0````Al2`Af0000000000000000000000000000000000000000000000000000000000000000000000000002031203B`231Bb51342051342051342051342032325342555533334444222253425134205342532513420103210101010322105134205513344220513420513420````Dd````Cn1000``Ej`1Ef`2`3120`1`2031`2220ChD`101010DfDjE`Eb624Dl4Eh9:;328461509:;132841509:;32841509:;32841509:;576766126732841509:;33332222888844441111555500009999::::;;;;7761732841509::;5328461509:;;::7676232476328461509:;03876:801376878257576763776767687673231332841509:;:328461509:;328461509:;557328461509:;7621HlI`1Ib1IdIhIj22130J`Jb01100```````````````````````````````````````````````````````````````````````````````````````````bAEnJfBAf1K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnBAfJfK`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1Jf120120120120120120120120120K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1Jf120120120120120OfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEn00K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElJfAEn10BAf2K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1Jf12012012022120120120K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElK`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElbAEnJf2102102102102102102102101210210210210210210210210210210210BAf1K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1Jf1201201201202120120120120120120120120120120120021201201201201201201201201201201201201201201201200222K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAAfAAhABjABlACbACnADh7bAEnJf11212121212121210210210210210210210210210BAf1K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnBAfJfK`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEnb1JfBAf1K`KbKdKfKhKjKlKnL`LbLdLfLhLjLlLnM`MbMdMfMhMjMlMnN`NbNdNfNhNjNlNnO`ObOdOfOhOjOlOnA@`A@bA@dA@fA@hA@jA@lA@nAA`AAbAAdAAfAAhAAjAAlAAnAB`ABbABdABfABhABjABlABnAC`ACbACdACfAChACjAClACnAD`ADbADdADfADhADjADlADnAE`AEbAEdAEfAEhAEjAElAEn00```AJh00AJj1AJl2222222````AKb``AK`AJn2112``110JnHbFnEnAKd56743210567424242`4256744442222555566667777``432105674444333332222105674243210567`43210```424321056743210567`43210567```ALb`Gl`00`1```````AL``2````ALd1`2```2`2``2``2`AKn10`3````40`4````3`AFd4```0A`00HnAI`AF`JdIn55f06AHlAIj7JjIlG`9AIdAGd:AFb:99=<;>:AHjAIhAGfAGhAHbAH`AHnAIbAGbAGjAGlAHdAIfGlAIdG`2AKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALd`Hn5GlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGf=AGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlfA`AHlALbAIjHnJjIlG`AI`AIdAGdAF`AFbJdInGlfA`AHlALbAIjHnJjIlG`AI`AIdAGdAF`AFbJdIn=?>=;:987654321064310Gl;874fA`5AFd3AKnAHf4AL`AHh5AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGl000AKn000AHf000f000AL`000AHh000A`000AHj000AHl000ALb000AIh000AIj000AGf000Hn000AGh000Jj000AHb000Il000AH`000G`000AHn000AI`000AIb000AId000AGb000AGd000AGj000AF`000AGl000AFb000AFd000AHd000Jd000AIf000In000Jl000ALd000fAI`8Hn01A`GlAKnAHf6AL`AHh5AHjAHlALbAIhAIjAGf70AKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInA`0AHhHn2GlAKnAHffAL`67AHjAHlALbAIhAIjAGf;AGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlIlG`2101015A`060AId34AHlALbAIjHn76AI`5AF`=?=:89AFd9;;f96AFbAHf>96=<5AGd5JdInAHjAIhAGfAHbAHnAGbAGjAHdAIfGl?A`AHlALbAIjHnJjIlG`AI`AIdAGdAF`AFbJdInAHfAHhAGfGlAHlALbAIjHnIlG`AI`>;=A`AH`181918765432AGdAF`AFbJdInAGhAHbAIbAGl:Glf=213AHlALbAIjHnJjIlG`AI`AIdAF`AFbJdIn>AHh=;:765AGd5432AHffA`AGl=<1GlAKn54AL`84AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALd45GlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdGlAKnAHffAL`AHhA`AHjAHlALbAIhAIjAGfHnAGhJjAHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdAHlALbJjAIdGlAKnAHffAL`AHhA`AHj;::AIhAIj0AGfHnAGh>AHbIlAH`G`AHnAI`AIbAIdAGbAGdAGjAF`AGlAFbAFdAHdJdAIfInJlALdIlG`A`AHl==```Gd`0`0000AMhAMjAMl2102102100121032103`3330210210121333332103210311210210210210321011210210021002102102102102100321032103021032100CbB@``FfANf`131`1````1`````ANn000003ANh```323543`3`3323AKj``4`1``0222`22264Dh`4ANj101101450111011461B@b7329AOf6ANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANh>FfAKjDhCbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANh:=FfAKjDhCbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANhFfAKjDhCbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANhFfAKjDhCbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANhDhCb?<:510?<:59Ff2220AKj32ANnANlAO`IfAOdAObAFlAOhAOjAOlANfB@`ANh>>>>====Dh000Cb000>>>>====<<<<;;;;::::99998888777766665555444433332222>FfAKj322ANn0ANlAO`If0AOdAOb0AFlAOhAOjAOlANfB@`ANh>Dh7B@bFf0AKj3CbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANhDhCb?5111Ff20AKj32ANnANlAO`IfAOdAObAFlAOhAOjAOlANfB@`ANh``>;>DhB@bFfAKj3CbAOfANnANlAO`IfAOdAObAFlAOhAOjAOlANfAOnB@`ANh>2Dh0000000700>000Ff;?5=B@b27AOf6B@d4=ANn0<;45Cb:4If<<4:4:4:;?7120AOb?=AKjDh?>==``>>DhAO`B@lB@j`B@f0`1`````0010AN`B@h324B@nBA`3254610325461032546103254610051530132546103333222255554444666611110000433254610232546103146003254610131103212103320303033033254610325461032546104232546102BAd0","f":"``{{{d{b}}f}{{n{h{l{j}}}}}}{{{d{b}}A`}{{n{h{l{j}}}}}}```````````````````````````````````````````````````````````````````````````````````````````````{{{d{Ab}}}Ad}{{{d{Af}}}Ad}{{{d{Ah}}}{{d{Aj}}}}{{{d{Al}}}{{d{Aj}}}}{{{d{Ab}}}{{d{Aj}}}}{{{d{Af}}}{{d{Aj}}}}{d{{d{c}}}{}}00000{{{d{An}}}{{d{Anc}}}{}}00000{{{d{Ah}}}Ah}{{{d{B`}}}B`}{{{d{Al}}}Al}{{{d{Ab}}}Ab}{{{d{Af}}}Af}{{{d{Bb}}}Bb}{{d{d{Anc}}}h{}}00000{{dBd}h}00000{{{d{Al}}{d{Al}}}Bf}{{{d{Af}}{d{Af}}}Bf}{{d{d{c}}}Bf{}}0{{{d{Ah}}{d{Ah}}}Bh}{{{d{Al}}{d{Al}}}Bh}{{{d{Ab}}{d{Ab}}}Bh}{{{d{Af}}{d{Af}}}Bh}{{d{d{c}}}Bh{}}000000000000000{{{d{Ah}}{d{AnBj}}}Bl}{{{d{Al}}{d{AnBj}}}Bl}{{{d{Ab}}{d{AnBj}}}Bl}{{{d{Af}}{d{AnBj}}}Bl}{cc{}}00000{{{d{Aj}}}{{n{Ahc}}}{}}{{{d{Aj}}}{{n{Alc}}}{}}{{{d{Aj}}}{{n{Abc}}}{}}{{{d{Aj}}}{{n{Afc}}}{}}{{{d{Ah}}{d{Anc}}}hBn}{{{d{Al}}{d{Anc}}}hBn}{{{d{Af}}{d{Anc}}}hBn}{{}c{}}00000{{}c{}}0{{}B`}{{}Bb}{{{d{B`}}}Ad}{{{d{Bb}}}Ad}{{{d{AnB`}}}{{C`{c}}}{}}{{{d{AnBb}}}{{C`{c}}}{}}10{{{d{AnB`}}Ad}{{C`{c}}}{}}{{{d{AnBb}}Ad}{{C`{c}}}{}}{{{d{Al}}{d{Al}}}{{C`{Bf}}}}{{{d{Af}}{d{Af}}}{{C`{Bf}}}}{{{d{Af}}}Cb}{{{d{B`}}}{{Cd{Ad{C`{Ad}}}}}}{{{d{Bb}}}{{Cd{Ad{C`{Ad}}}}}}{dc{}}00000{c{{n{e}}}{}{}}{{{d{Aj}}}{{n{Ahc}}}{}}11{{{d{Aj}}}{{n{Alc}}}{}}{{{d{Aj}}}{{n{Abc}}}{}}3{{{d{Aj}}}{{n{Afc}}}{}}44{{}{{n{c}}}{}}00000{dCf}00000{{}d}00{{}Ad}```````````````````````````````````{{{d{Ch}}{d{{Cl{Cj}}}}Cn}h}{{{d{D`}}{d{{Cl{Cj}}}}Cn}h}{{{d{Ch}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{D`}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{Ch}}j}h}{{{d{D`}}j}h}{{{d{Ch}}{d{{Cl{Cj}}}}Df}h}{{{d{D`}}{d{{Cl{Cj}}}}Df}h}{{{d{Df}}}Dh}{{}Dj}{d{{d{c}}}{}}0000000000{{{d{An}}}{{d{Anc}}}{}}0000000000{DlDn}{{{d{E`}}}E`}{{{d{{Eb{c}}}}}{{Eb{c}}}Ed}{{{d{Ef}}}Ef}{{{d{Dj}}}Dj}{{{d{Dl}}}Dl}{{{d{Df}}}Df}{{{d{Eh}}}Eh}{{{d{Ej}}}Ej}{{{d{Cn}}}Cn}{{{d{Dd}}}Dd}{{d{d{Anc}}}h{}}000000000{{dBd}h}000000000{DfC`}{{{d{Ch}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{D`}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{Ch}}}{{d{b}}}}{{{d{D`}}}{{d{b}}}}{{}D`}{{}Dl}{EbF`}{D`Fb}{{{d{Ch}}{d{Aj}}{d{Aj}}ElEl}Dj}{{{d{E`}}{d{E`}}}Bh}{{{d{{Eb{c}}}}{d{{Eb{c}}}}}BhFd}{{{d{Ef}}{d{Ef}}}Bh}{{{d{Dj}}{d{Dj}}}Bh}{{{d{Dl}}{d{Dl}}}Bh}{{{d{Df}}{d{Df}}}Bh}{{{d{Eh}}{d{Eh}}}Bh}{{{d{Ej}}{d{Ej}}}Bh}{{{d{Cn}}{d{Cn}}}Bh}{{{d{Dd}}{d{Dd}}}Bh}{{d{d{c}}}Bh{}}000000000000000000000000000000000000000{{{d{Ch}}{d{Aj}}El{d{Aj}}}Dj}{{{d{Ch}}{d{{Cl{Cj}}}}}Ff}{{{d{D`}}{d{{Cl{Cj}}}}}Ff}{DlDn}{{{d{Ch}}{d{Aj}}{l{E`}}{l{Fh}}}Dj}{{{d{E`}}{d{AnBj}}}{{n{hFj}}}}{{{d{{Eb{c}}}}{d{AnBj}}}BlFl}{{{d{Ef}}{d{AnBj}}}Bl}{{{d{Dj}}{d{AnBj}}}Bl}{{{d{Dl}}{d{AnBj}}}Bl}{{{d{Df}}{d{AnBj}}}Bl}{{{d{Eh}}{d{AnBj}}}Bl}{{{d{Ej}}{d{AnBj}}}Bl}{{{d{Cn}}{d{AnBj}}}Bl}{{{d{Cn}}{d{AnBj}}}{{n{hFj}}}}{{{d{Dd}}{d{AnBj}}}Bl}{{{d{Df}}{d{b}}{d{AnBj}}}{{n{hFj}}}}{cc{}}0000000000{{{d{AnCh}}{d{Aj}}{d{Ff}}El}{{n{DdFn}}}}{{{d{Cn}}}{{C`{G`}}}}{{{d{Cn}}{d{b}}}Db}{{{d{Ch}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{D`}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{Ch}}}{{C`{Dh}}}}{{{d{D`}}}{{C`{Dh}}}}{{{d{{Eb{c}}}}}Bh{}}{{{d{E`}}{d{Anc}}}hBn}{{{d{{Eb{c}}}}{d{Ane}}}hGbBn}{{{d{Dj}}{d{Anc}}}hBn}{{{d{Ch}}Gd}Bh}{{{d{D`}}Gd}Bh}{{}c{}}0000000000{EhDh}{E`{{Gh{Gf}}}}{{{d{Ef}}}Bh}{{{d{Ch}}}Bh}{{{d{D`}}}Bh}{{{d{Cn}}{d{b}}}Bh}{{{d{Ef}}}{{d{Aj}}}}{EhEj}{DlDn}{E`Fh}{{{d{Ch}}}A`}{{{d{D`}}}A`}{{{d{Ef}}{d{b}}}Db}{{{d{Ch}}{d{Aj}}{d{Aj}}{d{Ef}}{C`{El}}El}Dj}{{{d{Ef}}{d{b}}}{{C`{El}}}}{{c{F`{{Gj{j}}}}}{{Eb{c}}}{}}{DhDf}{{{d{Ch}}{d{Aj}}El}Dj}{{{d{Df}}}Dh}{{{d{Ch}}}Gl}{{{d{D`}}}Gl}{{{d{Ch}}}G`}{{{d{D`}}}G`}{{Elc}E`{{Gn{Fh}}}}{{{d{Ch}}j}Dj}{{{d{Ch}}{d{H`}}}{{C`{Ef}}}}{{{d{D`}}{d{H`}}}{{C`{Ef}}}}{{{d{Ch}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{D`}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{Ch}}{d{H`}}El}{{n{EfHb}}}}{{{d{D`}}{d{H`}}El}{{n{EfHb}}}}{{{d{Ef}}{d{b}}{d{Db}}}{{C`{Ef}}}}65<8{{{d{{Eb{c}}}}{d{Ane}}}h{}Hd}{E`El}{DlHf}{E`Hh}{dc{}}000000000{dFh}{c{{n{e}}}{}{}}0000000000{{}{{n{c}}}{}}0000000000{DfDh}{Dfl}{{{d{Ch}}{d{Aj}}ElDhDh}Dj}{dCf}0000000000{{{d{Ch}}{d{{Cl{Cj}}}}{d{Hj}}}h}{{{d{D`}}{d{{Cl{Cj}}}}{d{Hj}}}h}{Eb}{DlDn}{HlHn}{I`Hn}{HlAb}{IbG`}{I`G`}{IdIf}{IhAh}{IjG`}{IdIl}{IdIn}{IhDh}{IbDh}{IjDh}{J`C`}{JbBh}{JbDb}22{JbEl}{Jbn}```````````````````````````````````````````````````````````````````````````````````````````{{{d{b}}Dh}{{F`{{Gj{Jd}}}}}}{{dDh}{{F`{{Gj{Jd}}}}}}{JfJh}{d{{d{c}}}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{An}}}{{d{Anc}}}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{b}}Hn}{{F`{{Gj{Jj}}}}}}{{dHn}{{F`{{Gj{Jj}}}}}}4{{{d{b}}Hn}{{F`{{Gj{G`}}}}}}{{dHn}{{F`{{Gj{G`}}}}}}6{{{d{b}}Hn}{{Eb{{C`{G`}}}}}}{{dHn}{{Eb{{C`{G`}}}}}}8{{{d{b}}Hn}Jl}{{dHn}Jl}:{{{d{b}}Hn}{{Eb{{F`{{Dn{DbJj}}}}}}}}{{dHn}{{Eb{{F`{{Dn{DbJj}}}}}}}}<{{{d{b}}Jj}{{Eb{{n{DhJn}}}}}}{{dJj}{{Eb{{n{DhJn}}}}}}>{{{d{b}}Hn}{{Eb{{F`{{Dn{DbG`}}}}}}}}{{dHn}{{Eb{{F`{{Dn{DbG`}}}}}}}}{JfJh}:90{{{d{b}}Hn}{{F`{{Dn{DbG`}}}}}}{{dHn}{{F`{{Dn{DbG`}}}}}}2:92{{}K`}{{}Kb}{{}Kd}{{}Kf}{{}Kh}{{}Kj}{{}Kl}{{}Kn}{{}L`}{{}Lb}{{}Ld}{{}Lf}{{}Lh}{{}Lj}{{}Ll}{{}Ln}{{}M`}{{}Mb}{{}Md}{{}Mf}{{}Mh}{{}Mj}{{}Ml}{{}Mn}{{}N`}{{}Nb}{{}Nd}{{}Nf}{{}Nh}{{}Nj}{{}Nl}{{}Nn}{{}O`}{{}Ob}{{}Od}{{}Of}{{}Oh}{{}Oj}{{}Ol}{{}On}{{}A@`}{{}A@b}{{}A@d}{{}A@f}{{}A@h}{{}A@j}{{}A@l}{{}A@n}{{}AA`}{{}AAb}{{}AAd}{{}AAf}{{}AAh}{{}AAj}{{}AAl}{{}AAn}{{}AB`}{{}ABb}{{}ABd}{{}ABf}{{}ABh}{{}ABj}{{}ABl}{{}ABn}{{}AC`}{{}ACb}{{}ACd}{{}ACf}{{}ACh}{{}ACj}{{}ACl}{{}ACn}{{}AD`}{{}ADb}{{}ADd}{{}ADf}{{}ADh}{{}ADj}{{}ADl}{{}ADn}{{}AE`}{{}AEb}{{}AEd}{{}AEf}{{}AEh}{{}AEj}{{}AEl}{{}AEn}{{{d{b}}AF`}{{F`{{Gj{G`}}}}}}{{dAF`}{{F`{{Gj{G`}}}}}}{JfJh}{{{d{b}}AF`}{{F`{{Gj{AFb}}}}}}{{dAF`}{{F`{{Gj{AFb}}}}}}2{{{d{b}}AF`}{{Eb{Jl}}}}{{dAF`}{{Eb{Jl}}}}4{{{d{b}}AF`}{{Eb{{F`{{Dn{DbG`}}}}}}}}{{dAF`}{{Eb{{F`{{Dn{DbG`}}}}}}}}6{{{d{b}}AFb}{{Eb{{n{AFdJn}}}}}}{{dAFb}{{Eb{{n{AFdJn}}}}}}8{{{d{b}}AF`}{{Eb{{F`{{Dn{DbAFb}}}}}}}}{{dAF`}{{Eb{{F`{{Dn{DbAFb}}}}}}}}:{{{d{c}}e}g{}{}{}}000000000000000000000000000000000000000000000000000{{dGf}{{F`{Aj}}}}{{dGf}{{F`{{Gj{Ad}}}}}}{{dGf}Db}{{{d{K`}}{d{AnBj}}}Bl}{{{d{Kb}}{d{AnBj}}}Bl}{{{d{Kd}}{d{AnBj}}}Bl}{{{d{Kf}}{d{AnBj}}}Bl}{{{d{Kh}}{d{AnBj}}}Bl}{{{d{Kj}}{d{AnBj}}}Bl}{{{d{Kl}}{d{AnBj}}}Bl}{{{d{Kn}}{d{AnBj}}}Bl}{{{d{L`}}{d{AnBj}}}Bl}{{{d{Lb}}{d{AnBj}}}Bl}{{{d{Ld}}{d{AnBj}}}Bl}{{{d{Lf}}{d{AnBj}}}Bl}{{{d{Lh}}{d{AnBj}}}Bl}{{{d{Lj}}{d{AnBj}}}Bl}{{{d{Ll}}{d{AnBj}}}Bl}{{{d{Ln}}{d{AnBj}}}Bl}{{{d{M`}}{d{AnBj}}}Bl}{{{d{Mb}}{d{AnBj}}}Bl}{{{d{Md}}{d{AnBj}}}Bl}{{{d{Mf}}{d{AnBj}}}Bl}{{{d{Mh}}{d{AnBj}}}Bl}{{{d{Mj}}{d{AnBj}}}Bl}{{{d{Ml}}{d{AnBj}}}Bl}{{{d{Mn}}{d{AnBj}}}Bl}{{{d{N`}}{d{AnBj}}}Bl}{{{d{Nb}}{d{AnBj}}}Bl}{{{d{Nd}}{d{AnBj}}}Bl}{{{d{Nf}}{d{AnBj}}}Bl}{{{d{Nh}}{d{AnBj}}}Bl}{{{d{Nj}}{d{AnBj}}}Bl}{{{d{Nl}}{d{AnBj}}}Bl}{{{d{Nn}}{d{AnBj}}}Bl}{{{d{O`}}{d{AnBj}}}Bl}{{{d{Ob}}{d{AnBj}}}Bl}{{{d{Od}}{d{AnBj}}}Bl}{{{d{Of}}{d{AnBj}}}Bl}{{{d{Oh}}{d{AnBj}}}Bl}{{{d{Oj}}{d{AnBj}}}Bl}{{{d{Ol}}{d{AnBj}}}Bl}{{{d{On}}{d{AnBj}}}Bl}{{{d{A@`}}{d{AnBj}}}Bl}{{{d{A@b}}{d{AnBj}}}Bl}{{{d{A@d}}{d{AnBj}}}Bl}{{{d{A@f}}{d{AnBj}}}Bl}{{{d{A@h}}{d{AnBj}}}Bl}{{{d{A@j}}{d{AnBj}}}Bl}{{{d{A@l}}{d{AnBj}}}Bl}{{{d{A@n}}{d{AnBj}}}Bl}{{{d{AA`}}{d{AnBj}}}Bl}{{{d{AAb}}{d{AnBj}}}Bl}{{{d{AAd}}{d{AnBj}}}Bl}{{{d{AAf}}{d{AnBj}}}Bl}{{{d{AAh}}{d{AnBj}}}Bl}{{{d{AAj}}{d{AnBj}}}Bl}{{{d{AAl}}{d{AnBj}}}Bl}{{{d{AAn}}{d{AnBj}}}Bl}{{{d{AB`}}{d{AnBj}}}Bl}{{{d{ABb}}{d{AnBj}}}Bl}{{{d{ABd}}{d{AnBj}}}Bl}{{{d{ABf}}{d{AnBj}}}Bl}{{{d{ABh}}{d{AnBj}}}Bl}{{{d{ABj}}{d{AnBj}}}Bl}{{{d{ABl}}{d{AnBj}}}Bl}{{{d{ABn}}{d{AnBj}}}Bl}{{{d{AC`}}{d{AnBj}}}Bl}{{{d{ACb}}{d{AnBj}}}Bl}{{{d{ACd}}{d{AnBj}}}Bl}{{{d{ACf}}{d{AnBj}}}Bl}{{{d{ACh}}{d{AnBj}}}Bl}{{{d{ACj}}{d{AnBj}}}Bl}{{{d{ACl}}{d{AnBj}}}Bl}{{{d{ACn}}{d{AnBj}}}Bl}{{{d{AD`}}{d{AnBj}}}Bl}{{{d{ADb}}{d{AnBj}}}Bl}{{{d{ADd}}{d{AnBj}}}Bl}{{{d{ADf}}{d{AnBj}}}Bl}{{{d{ADh}}{d{AnBj}}}Bl}{{{d{ADj}}{d{AnBj}}}Bl}{{{d{ADl}}{d{AnBj}}}Bl}{{{d{ADn}}{d{AnBj}}}Bl}{{{d{AE`}}{d{AnBj}}}Bl}{{{d{AEb}}{d{AnBj}}}Bl}{{{d{AEd}}{d{AnBj}}}Bl}{{{d{AEf}}{d{AnBj}}}Bl}{{{d{AEh}}{d{AnBj}}}Bl}{{{d{AEj}}{d{AnBj}}}Bl}{{{d{AEl}}{d{AnBj}}}Bl}{{{d{Jf}}{d{b}}AFf{d{AnBj}}}Bl}{{{d{AEn}}AFf{d{AnBj}}}Bl}{{{d{Jf}}{d{AFh}}{d{AnAFj}}}h}{{{d{AEn}}{d{AnAFj}}}h}{cc{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{b}}G`}{{Eb{{F`{Dl}}}}}}{{dG`}{{Eb{{F`{Dl}}}}}}{JfJh}{{{d{b}}G`}Jl}{{dG`}Jl}2{{{d{b}}Il}{{Eb{{F`{AFl}}}}}}{{dIl}{{Eb{{F`{AFl}}}}}}4{{{d{b}}DhDb}{{F`{{Gj{Il}}}}}}{{dDhDb}{{F`{{Gj{Il}}}}}}6{{{d{AEn}}}d}0{{{d{b}}Jd}{{F`{{Gj{G`}}}}}}{{dJd}{{F`{{Gj{G`}}}}}}9{{{d{b}}DhIn}{{C`{Jd}}}}{{dDhIn}{{C`{Jd}}}};{{{d{b}}Jd}{{Eb{{F`{{Dn{DbG`}}}}}}}}{{dJd}{{Eb{{F`{{Dn{DbG`}}}}}}}}={{K`{d{b}}}{{AFn{K`}}}}{{Kb{d{b}}}{{AFn{Kb}}}}{{Kd{d{b}}}{{AFn{Kd}}}}{{Kf{d{b}}}{{AFn{Kf}}}}{{Kh{d{b}}}{{AFn{Kh}}}}{{Kj{d{b}}}{{AFn{Kj}}}}{{Kl{d{b}}}{{AFn{Kl}}}}{{Kn{d{b}}}{{AFn{Kn}}}}{{L`{d{b}}}{{AFn{L`}}}}{{Lb{d{b}}}{{AFn{Lb}}}}{{Ld{d{b}}}{{AFn{Ld}}}}{{Lf{d{b}}}{{AFn{Lf}}}}{{Lh{d{b}}}{{AFn{Lh}}}}{{Lj{d{b}}}{{AFn{Lj}}}}{{Ll{d{b}}}{{AFn{Ll}}}}{{Ln{d{b}}}{{AFn{Ln}}}}{{M`{d{b}}}{{AFn{M`}}}}{{Mb{d{b}}}{{AFn{Mb}}}}{{Md{d{b}}}{{AFn{Md}}}}{{Mf{d{b}}}{{AFn{Mf}}}}{{Mh{d{b}}}{{AFn{Mh}}}}{{Mj{d{b}}}{{AFn{Mj}}}}{{Ml{d{b}}}{{AFn{Ml}}}}{{Mn{d{b}}}{{AFn{Mn}}}}{{N`{d{b}}}{{AFn{N`}}}}{{Nb{d{b}}}{{AFn{Nb}}}}{{Nd{d{b}}}{{AFn{Nd}}}}{{Nf{d{b}}}{{AFn{Nf}}}}{{Nh{d{b}}}{{AFn{Nh}}}}{{Nj{d{b}}}{{AFn{Nj}}}}{{Nl{d{b}}}{{AFn{Nl}}}}{{Nn{d{b}}}{{AFn{Nn}}}}{{O`{d{b}}}{{AFn{O`}}}}{{Ob{d{b}}}{{AFn{Ob}}}}{{Od{d{b}}}{{AFn{Od}}}}{{Of{d{b}}}{{AFn{Of}}}}{{Oh{d{b}}}{{AFn{Oh}}}}{{Oj{d{b}}}{{AFn{Oj}}}}{{Ol{d{b}}}{{AFn{Ol}}}}{{On{d{b}}}{{AFn{On}}}}{{A@`{d{b}}}{{AFn{A@`}}}}{{A@b{d{b}}}{{AFn{A@b}}}}{{A@d{d{b}}}{{AFn{A@d}}}}{{A@f{d{b}}}{{AFn{A@f}}}}{{A@h{d{b}}}{{AFn{A@h}}}}{{A@j{d{b}}}{{AFn{A@j}}}}{{A@l{d{b}}}{{AFn{A@l}}}}{{A@n{d{b}}}{{AFn{A@n}}}}{{AA`{d{b}}}{{AFn{AA`}}}}{{AAb{d{b}}}{{AFn{AAb}}}}{{AAd{d{b}}}{{AFn{AAd}}}}{{AAf{d{b}}}{{AFn{AAf}}}}{{AAh{d{b}}}{{AFn{AAh}}}}{{AAj{d{b}}}{{AFn{AAj}}}}{{AAl{d{b}}}{{AFn{AAl}}}}{{AAn{d{b}}}{{AFn{AAn}}}}{{AB`{d{b}}}{{AFn{AB`}}}}{{ABb{d{b}}}{{AFn{ABb}}}}{{ABd{d{b}}}{{AFn{ABd}}}}{{ABf{d{b}}}{{AFn{ABf}}}}{{ABh{d{b}}}{{AFn{ABh}}}}{{ABj{d{b}}}{{AFn{ABj}}}}{{ABl{d{b}}}{{AFn{ABl}}}}{{ABn{d{b}}}{{AFn{ABn}}}}{{AC`{d{b}}}{{AFn{AC`}}}}{{ACb{d{b}}}{{AFn{ACb}}}}{{ACd{d{b}}}{{AFn{ACd}}}}{{ACf{d{b}}}{{AFn{ACf}}}}{{ACh{d{b}}}{{AFn{ACh}}}}{{ACj{d{b}}}{{AFn{ACj}}}}{{ACl{d{b}}}{{AFn{ACl}}}}{{ACn{d{b}}}{{AFn{ACn}}}}{{AD`{d{b}}}{{AFn{AD`}}}}{{ADb{d{b}}}{{AFn{ADb}}}}{{ADd{d{b}}}{{AFn{ADd}}}}{{ADf{d{b}}}{{AFn{ADf}}}}{{ADh{d{b}}}{{AFn{ADh}}}}{{ADj{d{b}}}{{AFn{ADj}}}}{{ADl{d{b}}}{{AFn{ADl}}}}{{ADn{d{b}}}{{AFn{ADn}}}}{{AE`{d{b}}}{{AFn{AE`}}}}{{AEb{d{b}}}{{AFn{AEb}}}}{{AEd{d{b}}}{{AFn{AEd}}}}{{AEf{d{b}}}{{AFn{AEf}}}}{{AEh{d{b}}}{{AFn{AEh}}}}{{AEj{d{b}}}{{AFn{AEj}}}}{{AEl{d{b}}}{{AFn{AEl}}}}{{K`{d{Anb}}}{{AG`{K`}}}}{{Kb{d{Anb}}}{{AG`{Kb}}}}{{Kd{d{Anb}}}{{AG`{Kd}}}}{{Kf{d{Anb}}}{{AG`{Kf}}}}{{Kh{d{Anb}}}{{AG`{Kh}}}}{{Kj{d{Anb}}}{{AG`{Kj}}}}{{Kl{d{Anb}}}{{AG`{Kl}}}}{{Kn{d{Anb}}}{{AG`{Kn}}}}{{L`{d{Anb}}}{{AG`{L`}}}}{{Lb{d{Anb}}}{{AG`{Lb}}}}{{Ld{d{Anb}}}{{AG`{Ld}}}}{{Lf{d{Anb}}}{{AG`{Lf}}}}{{Lh{d{Anb}}}{{AG`{Lh}}}}{{Lj{d{Anb}}}{{AG`{Lj}}}}{{Ll{d{Anb}}}{{AG`{Ll}}}}{{Ln{d{Anb}}}{{AG`{Ln}}}}{{M`{d{Anb}}}{{AG`{M`}}}}{{Mb{d{Anb}}}{{AG`{Mb}}}}{{Md{d{Anb}}}{{AG`{Md}}}}{{Mf{d{Anb}}}{{AG`{Mf}}}}{{Mh{d{Anb}}}{{AG`{Mh}}}}{{Mj{d{Anb}}}{{AG`{Mj}}}}{{Ml{d{Anb}}}{{AG`{Ml}}}}{{Mn{d{Anb}}}{{AG`{Mn}}}}{{N`{d{Anb}}}{{AG`{N`}}}}{{Nb{d{Anb}}}{{AG`{Nb}}}}{{Nd{d{Anb}}}{{AG`{Nd}}}}{{Nf{d{Anb}}}{{AG`{Nf}}}}{{Nh{d{Anb}}}{{AG`{Nh}}}}{{Nj{d{Anb}}}{{AG`{Nj}}}}{{Nl{d{Anb}}}{{AG`{Nl}}}}{{Nn{d{Anb}}}{{AG`{Nn}}}}{{O`{d{Anb}}}{{AG`{O`}}}}{{Ob{d{Anb}}}{{AG`{Ob}}}}{{Od{d{Anb}}}{{AG`{Od}}}}{{Of{d{Anb}}}{{AG`{Of}}}}{{Oh{d{Anb}}}{{AG`{Oh}}}}{{Oj{d{Anb}}}{{AG`{Oj}}}}{{Ol{d{Anb}}}{{AG`{Ol}}}}{{On{d{Anb}}}{{AG`{On}}}}{{A@`{d{Anb}}}{{AG`{A@`}}}}{{A@b{d{Anb}}}{{AG`{A@b}}}}{{A@d{d{Anb}}}{{AG`{A@d}}}}{{A@f{d{Anb}}}{{AG`{A@f}}}}{{A@h{d{Anb}}}{{AG`{A@h}}}}{{A@j{d{Anb}}}{{AG`{A@j}}}}{{A@l{d{Anb}}}{{AG`{A@l}}}}{{A@n{d{Anb}}}{{AG`{A@n}}}}{{AA`{d{Anb}}}{{AG`{AA`}}}}{{AAb{d{Anb}}}{{AG`{AAb}}}}{{AAd{d{Anb}}}{{AG`{AAd}}}}{{AAf{d{Anb}}}{{AG`{AAf}}}}{{AAh{d{Anb}}}{{AG`{AAh}}}}{{AAj{d{Anb}}}{{AG`{AAj}}}}{{AAl{d{Anb}}}{{AG`{AAl}}}}{{AAn{d{Anb}}}{{AG`{AAn}}}}{{AB`{d{Anb}}}{{AG`{AB`}}}}{{ABb{d{Anb}}}{{AG`{ABb}}}}{{ABd{d{Anb}}}{{AG`{ABd}}}}{{ABf{d{Anb}}}{{AG`{ABf}}}}{{ABh{d{Anb}}}{{AG`{ABh}}}}{{ABj{d{Anb}}}{{AG`{ABj}}}}{{ABl{d{Anb}}}{{AG`{ABl}}}}{{ABn{d{Anb}}}{{AG`{ABn}}}}{{AC`{d{Anb}}}{{AG`{AC`}}}}{{ACb{d{Anb}}}{{AG`{ACb}}}}{{ACd{d{Anb}}}{{AG`{ACd}}}}{{ACf{d{Anb}}}{{AG`{ACf}}}}{{ACh{d{Anb}}}{{AG`{ACh}}}}{{ACj{d{Anb}}}{{AG`{ACj}}}}{{ACl{d{Anb}}}{{AG`{ACl}}}}{{ACn{d{Anb}}}{{AG`{ACn}}}}{{AD`{d{Anb}}}{{AG`{AD`}}}}{{ADb{d{Anb}}}{{AG`{ADb}}}}{{ADd{d{Anb}}}{{AG`{ADd}}}}{{ADf{d{Anb}}}{{AG`{ADf}}}}{{ADh{d{Anb}}}{{AG`{ADh}}}}{{ADj{d{Anb}}}{{AG`{ADj}}}}{{ADl{d{Anb}}}{{AG`{ADl}}}}{{ADn{d{Anb}}}{{AG`{ADn}}}}{{AE`{d{Anb}}}{{AG`{AE`}}}}{{AEb{d{Anb}}}{{AG`{AEb}}}}{{AEd{d{Anb}}}{{AG`{AEd}}}}{{AEf{d{Anb}}}{{AG`{AEf}}}}{{AEh{d{Anb}}}{{AG`{AEh}}}}{{AEj{d{Anb}}}{{AG`{AEj}}}}{{AEl{d{Anb}}}{{AG`{AEl}}}}{{{d{b}}f}{{F`{{Dn{Dbf}}}}}}{{df}{{F`{{Dn{Dbf}}}}}}{JfJh}{{{d{b}}f}{{F`{{Gj{Gf}}}}}}{{df}{{F`{{Gj{Gf}}}}}}2{{{d{b}}f}{{F`{{Gj{A`}}}}}}{{df}{{F`{{Gj{A`}}}}}}4{{{d{b}}f}{{C`{A`}}}}{{df}{{C`{A`}}}}6{{{d{b}}{F`{AGb}}}AGd}{{d{F`{AGb}}}AGd}8{{{d{b}}{F`{AGf}}}Hn}{{d{F`{AGf}}}Hn}:{{{d{b}}{F`{AGh}}}Jj}{{d{F`{AGh}}}Jj}<{{{d{b}}{F`{AGj}}}AF`}{{d{F`{AGj}}}AF`}>{{{d{b}}{F`{AGl}}}AFb}{{d{F`{AGl}}}AFb}{JfJh}{{dAGn}Gf}{{{d{b}}{F`{AH`}}}G`}{{d{F`{AH`}}}G`}3{{{d{b}}{F`{AHb}}}Il}{{d{F`{AHb}}}Il}5{{{d{b}}{F`{AHd}}}Jd}{{d{F`{AHd}}}Jd}7{{{d{b}}{F`{AHf}}}f}{{d{F`{AHf}}}f}9{{{d{b}}{F`{AHh}}}A`}{{d{F`{AHh}}}A`};{{{d{b}}{F`{AHj}}}AHl}{{d{F`{AHj}}}AHl}={{{d{b}}{F`{AHn}}}AI`}{{d{F`{AHn}}}AI`}?{{{d{b}}{F`{AIb}}}AId}{{d{F`{AIb}}}AId}{JfJh}{{{d{b}}{F`{AIf}}}In}{{d{F`{AIf}}}In}2{{{d{b}}Ff}Dh}{{dFf}Dh}4{{{d{b}}{F`{AIh}}}AIj}{{d{F`{AIh}}}AIj}6{{}c{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{b}}AGd}{{F`{AGb}}}}{{dAGd}{{F`{AGb}}}}9{{{d{b}}Hn}{{F`{AGf}}}}{{dHn}{{F`{AGf}}}};{{{d{b}}Jj}{{F`{AGh}}}}{{dJj}{{F`{AGh}}}}={{{d{b}}AF`}{{F`{AGj}}}}{{dAF`}{{F`{AGj}}}}?{{{d{b}}AFb}{{F`{AGl}}}}{{dAFb}{{F`{AGl}}}}{JfJh}{{dGf}AGn}{{{d{b}}G`}{{F`{AH`}}}}{{dG`}{{F`{AH`}}}}3{{{d{b}}Il}{{F`{AHb}}}}{{dIl}{{F`{AHb}}}}5{{{d{b}}Jd}{{F`{AHd}}}}{{dJd}{{F`{AHd}}}}7{{{d{b}}f}{{F`{AHf}}}}{{df}{{F`{AHf}}}}9{{{d{b}}A`}{{F`{AHh}}}}{{dA`}{{F`{AHh}}}};{{{d{b}}AHl}{{F`{AHj}}}}{{dAHl}{{F`{AHj}}}}={{{d{b}}AI`}{{F`{AHn}}}}{{dAI`}{{F`{AHn}}}}?{{{d{b}}AId}{{F`{AIb}}}}{{dAId}{{F`{AIb}}}}{JfJh}{{{d{b}}In}{{F`{AIf}}}}{{dIn}{{F`{AIf}}}}2{{{d{b}}Dh}Ff}{{dDh}Ff}4{{{d{b}}AIj}{{F`{AIh}}}}{{dAIj}{{F`{AIh}}}}6{{{d{Jf}}{d{b}}AFfAIl}Bh}{{{d{AEn}}AFfAIl}Bh}{{{d{b}}A`}{{Eb{{F`{{Gj{Jd}}}}}}}}{{dA`}{{Eb{{F`{{Gj{Jd}}}}}}}}:{{{d{b}}A`}{{F`{{Gj{Gl}}}}}}{{dA`}{{F`{{Gj{Gl}}}}}}<{{{d{b}}AHl}{{Eb{{n{DhJn}}}}}}{{dAHl}{{Eb{{n{DhJn}}}}}}>{{{d{b}}AHl}{{Eb{{n{DdFn}}}}}}{{dAHl}{{Eb{{n{DdFn}}}}}}{JfJh}{{{d{b}}A`}{{F`{{l{AHl}}}}}}{{dA`}{{F`{{l{AHl}}}}}}2{{{d{b}}A`}{{F`{{Gj{Hn}}}}}}{{dA`}{{F`{{Gj{Hn}}}}}}4{{{d{b}}A`}Db}{{dA`}Db}6{{{d{b}}A`}{{Eb{{F`{{Dn{{Cd{InDh}}Jd}}}}}}}}{{dA`}{{Eb{{F`{{Dn{{Cd{InDh}}Jd}}}}}}}}8{{{d{b}}A`}Bh}{{dA`}Bh}:{{{d{b}}A`}{{Eb{{F`{{Dn{DbGl}}}}}}}}{{dA`}{{Eb{{F`{{Dn{DbGl}}}}}}}}<{{{d{b}}A`}{{C`{A`}}}}{{dA`}{{C`{A`}}}}>{{{d{b}}A`}{{Eb{{F`{AIn}}}}}}{{dA`}{{Eb{{F`{AIn}}}}}}{JfJh}{{{d{b}}A`}{{F`{{Gj{AI`}}}}}}{{dA`}{{F`{{Gj{AI`}}}}}}2{{{d{b}}A`}{{F`{{Gj{A`}}}}}}{{dA`}{{F`{{Gj{A`}}}}}}4{{{d{b}}A`}{{l{G`}}}}{{dA`}{{l{G`}}}}6{{{d{b}}A`}{{Eb{{F`{{Dn{Db{Cd{ElGl}}}}}}}}}}{{dA`}{{Eb{{F`{{Dn{Db{Cd{ElGl}}}}}}}}}}8{AJ`Jf}{{{d{AEn}}}{{d{AJb}}}}{{{d{AEn}}}{{d{AFh}}}}{{{d{AnAEn}}}{{d{AnAFh}}}}{{{d{c}}}{{d{{Jh{e}}}}}{}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{c}}{d{{Gj{AFf}}}}{d{e}}}{{C`{g}}}{}{}{}}0000000{{{d{b}}}f}{df}{JfJh}{{{d{An}}Gf{F`{Aj}}}h}{{{d{An}}Gf{F`{Aj}}AJd}h}{{{d{Anb}}f{F`{{Dn{Dbf}}}}}h}{{{d{An}}f{F`{{Dn{Dbf}}}}}h}{{{d{Anb}}f{F`{{Dn{Dbf}}}}AJd}h}{{{d{An}}f{F`{{Dn{Dbf}}}}AJd}h}{{{d{Anb}}f{F`{{Gj{Gf}}}}}h}{{{d{An}}f{F`{{Gj{Gf}}}}}h}{{{d{Anb}}f{F`{{Gj{Gf}}}}AJd}h}{{{d{An}}f{F`{{Gj{Gf}}}}AJd}h}{{{d{Anb}}f}h}{{{d{An}}f}h}{{{d{Anb}}fAJd}h}{{{d{An}}fAJd}h}{{{d{b}}AI`}{{F`{{Gj{AId}}}}}}{{dAI`}{{F`{{Gj{AId}}}}}}{JfJh}{{{d{b}}AI`}{{F`{{Gj{G`}}}}}}{{dAI`}{{F`{{Gj{G`}}}}}}2{{{d{b}}AI`}{{Eb{Jl}}}}{{dAI`}{{Eb{Jl}}}}4{{{d{b}}AI`}{{Eb{{F`{{Dn{DbAId}}}}}}}}{{dAI`}{{Eb{{F`{{Dn{DbAId}}}}}}}}6{{{d{b}}AId}{{Eb{{n{DhJn}}}}}}{{dAId}{{Eb{{n{DhJn}}}}}}8{{{d{b}}AI`}{{Eb{{F`{{Dn{DbG`}}}}}}}}{{dAI`}{{Eb{{F`{{Dn{DbG`}}}}}}}}:{{{d{b}}In}{{F`{{Gj{Il}}}}}}{{dIn}{{F`{{Gj{Il}}}}}}<{{{d{b}}In}{{Eb{{F`{{Dn{DbIl}}}}}}}}{{dIn}{{Eb{{F`{{Dn{DbIl}}}}}}}}>{{{d{b}}InDh}Bh}{{dInDh}Bh}{JfJh}{c{{n{e}}}{}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{}{{n{c}}}{}}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{b}}AIj}{{Eb{{n{DhJn}}}}}}{{dAIj}{{Eb{{n{DhJn}}}}}}4{dCf}00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{AEn}}}{{d{AJf}}}}{{{d{AnAEn}}}{{d{AnAJf}}}}```{d{{d{c}}}{}}{{{d{An}}}{{d{Anc}}}{}}{{{d{{AJh{c}}}}c}{{AJh{c}}}{}}{{{d{AJj}}{d{b}}}{{AJh{{d{AJj}}}}}}{{{d{{AJh{c}}}}{d{AnBj}}}BlAJl}{{{d{AJl}}{d{b}}{d{AnBj}}}Bl}{cc{}}{{}c{}}{{{d{b}}c}{{AJh{c}}}{}}{dFh}{c{{n{e}}}{}{}}{{}{{n{c}}}{}}>``````````````````;;;;;;;;::::::::{{{d{Jn}}}Jn}{{{d{Fn}}}Fn}{{d{d{Anc}}}h{}}0{{dBd}h}0{{{d{Aj}}{d{Aj}}ElEl}j}{{{d{Jn}}{d{Jn}}}Bh}{{{d{Fn}}{d{Fn}}}Bh}{{{d{AJn}}{d{AJn}}}Bh}{{{d{AK`}}{d{AK`}}}Bh}{{{d{AKb}}{d{AKb}}}Bh}{{d{d{c}}}Bh{}}0000000000000000000{{cEle}j{{Gn{Fh}}}{{Gn{Fh}}}}{{c{l{E`}}{l{Fh}}}j{{Gn{Fh}}}}{{{d{Jn}}{d{AnBj}}}Bl}{{{d{Hb}}{d{AnBj}}}Bl}{{{d{Fn}}{d{AnBj}}}Bl}{{{d{En}}{d{AnBj}}}Bl}{{{d{AKd}}{d{AnBj}}}Bl}{{{d{AJn}}{d{AnBj}}}Bl}{{{d{AK`}}{d{AnBj}}}Bl}{{{d{AKb}}{d{AnBj}}}Bl}{EnJn}{cc{}}{FnJn}{HbJn}{FnHb}3{AKdHb}{EnHb}{JnHb}{JnFn}{HbFn}{EnFn}999999{{{d{Jn}}{d{Anc}}}hBn}{{{d{Fn}}{d{Anc}}}hBn}{{}c{}}0000000{{{d{Aj}}{d{Aj}}{d{Ef}}{C`{El}}El}j}{DjJn}{DjHb}{DjFn}{{}En}{DjAKd}{{cEl}jAKf}{{El{d{AKf}}}j}{Elj}{dc{}}0{c{{n{e}}}{}{}}0000000{{}{{n{c}}}{}}0000000{{cEleg}j{{Gn{Fh}}}AKfAKf}{dCf}0000000```````````````````````````````````````````````````````````````````{{{d{A`}}{d{b}}}{{F`{{l{AHl}}}}}}{{{d{A`}}{d{b}}}{{l{Hn}}}}{{{d{A`}}{d{b}}}{{l{G`}}}}{{{d{Hn}}{d{b}}}{{F`{{Gj{G`}}}}}}{{{d{AI`}}{d{b}}}{{F`{{Gj{G`}}}}}}{{{d{AF`}}{d{b}}}{{F`{{Gj{G`}}}}}}{{{d{Jd}}{d{b}}}{{F`{{Gj{G`}}}}}}{{{d{In}}{d{b}}}{{F`{{Gj{Il}}}}}}{{{d{A`}}{d{b}}}{{F`{{Gj{Jd}}}}}}{{{d{A`}}{d{b}}}{{F`{{Gj{Gl}}}}}}{{{d{f}}{d{b}}}{{F`{{Gj{A`}}}}}}{{{d{f}}}AKh}{{{d{A`}}}AKh}{{{d{AHl}}}AKh}{{{d{AIj}}}AKh}{{{d{Hn}}}AKh}{{{d{Jj}}}AKh}{{{d{Il}}}AKh}{{{d{G`}}}AKh}{{{d{AI`}}}AKh}{{{d{AId}}}AKh}{{{d{AGd}}}AKh}{{{d{AF`}}}AKh}{{{d{AFb}}}AKh}{{{d{Jd}}}AKh}{{{d{In}}}AKh}{{{d{In}}}AKj}{{{d{Hn}}{d{b}}}Dh}{{{d{AI`}}{d{b}}}Dh}{{AF`{d{b}}}Dh}{{{d{A`}}{d{b}}}{{F`{AIn}}}}{{{d{Jd}}{d{b}}}{{Cl{AKl}}}}{AHjCl}{AIhCl}{AGfCl}{AGhCl}{AHbCl}{AH`Cl}{AHnCl}{AIbCl}{AGbCl}{AGjCl}{AGlCl}{AHdCl}{AIfCl}{{{d{Gl}}{d{b}}}{{l{AGd}}}}{{{d{AId}}{d{b}}}{{l{Db}}}}{{{d{G`}}{d{b}}}{{F`{Dl}}}}{d{{d{c}}}{}}000000000000000000000000000000000000{{{d{An}}}{{d{Anc}}}{}}000000000000000000000000000000000000{{}{{Dn{DbGl}}}}{{{d{Hn}}{d{b}}}{{C`{G`}}}}{{{d{Jd}}{d{b}}DhDh}Bh}{{{d{Gl}}}Gl}{{{d{AKn}}}AKn}{{{d{AHf}}}AHf}{{{d{f}}}f}{{{d{AL`}}}AL`}{{{d{AHh}}}AHh}{{{d{A`}}}A`}{{{d{AHj}}}AHj}{{{d{AHl}}}AHl}{{{d{ALb}}}ALb}{{{d{AIh}}}AIh}{{{d{AIj}}}AIj}{{{d{AGf}}}AGf}{{{d{Hn}}}Hn}{{{d{AGh}}}AGh}{{{d{Jj}}}Jj}{{{d{AHb}}}AHb}{{{d{Il}}}Il}{{{d{AH`}}}AH`}{{{d{G`}}}G`}{{{d{AHn}}}AHn}{{{d{AI`}}}AI`}{{{d{AIb}}}AIb}{{{d{AId}}}AId}{{{d{AGb}}}AGb}{{{d{AGd}}}AGd}{{{d{AGj}}}AGj}{{{d{AF`}}}AF`}{{{d{AGl}}}AGl}{{{d{AFb}}}AFb}{{{d{AFd}}}AFd}{{{d{AHd}}}AHd}{{{d{Jd}}}Jd}{{{d{AIf}}}AIf}{{{d{In}}}In}{{{d{Jl}}}Jl}{{{d{ALd}}}ALd}{{d{d{Anc}}}h{}}000000000000000000000000000000000000{{dBd}h}000000000000000000000000000000000000{{{d{Gl}}{d{Gl}}}Bf}{{{d{f}}{d{f}}}Bf}{{{d{A`}}{d{A`}}}Bf}{{{d{AHl}}{d{AHl}}}Bf}{{{d{ALb}}{d{ALb}}}Bf}{{{d{AIj}}{d{AIj}}}Bf}{{{d{Hn}}{d{Hn}}}Bf}{{{d{Jj}}{d{Jj}}}Bf}{{{d{Il}}{d{Il}}}Bf}{{{d{G`}}{d{G`}}}Bf}{{{d{AI`}}{d{AI`}}}Bf}{{{d{AId}}{d{AId}}}Bf}{{{d{AGd}}{d{AGd}}}Bf}{{{d{AF`}}{d{AF`}}}Bf}{{{d{AFb}}{d{AFb}}}Bf}{{{d{Jd}}{d{Jd}}}Bf}{{{d{In}}{d{In}}}Bf}{{d{d{c}}}Bf{}}0000000000000000{{{d{AHl}}{d{b}}}{{n{DdFn}}}}{{{d{f}}{d{b}}}{{F`{AHf}}}}{{{d{A`}}{d{b}}}{{F`{AHh}}}}{{{d{AHl}}{d{b}}}{{F`{AHj}}}}{{{d{AIj}}{d{b}}}{{F`{AIh}}}}{{{d{Hn}}{d{b}}}{{F`{AGf}}}}{{{d{Jj}}{d{b}}}{{F`{AGh}}}}{{{d{Il}}{d{b}}}{{F`{AHb}}}}{{{d{G`}}{d{b}}}{{F`{AH`}}}}{{{d{AI`}}{d{b}}}{{F`{AHn}}}}{{{d{AId}}{d{b}}}{{F`{AIb}}}}{{AGd{d{b}}}{{F`{AGb}}}}{{AF`{d{b}}}{{F`{AGj}}}}{{AFb{d{b}}}{{F`{AGl}}}}{{{d{Jd}}{d{b}}}{{F`{AHd}}}}{{{d{In}}{d{b}}}{{F`{AIf}}}}{{}AI`}{{}AGd}{{}AF`}{{}Jd}{{}In}{{{d{Gl}}{d{b}}}{{C`{{F`{ALf}}}}}}{{{d{Hn}}{d{b}}}{{F`{ALf}}}}{{{d{G`}}{d{b}}}{{F`{ALf}}}}{{{d{AI`}}{d{b}}}{{F`{ALf}}}}{{AF`{d{b}}}{{F`{ALf}}}}{{{d{f}}{d{b}}}{{l{j}}}}{{{d{A`}}{d{b}}}{{l{j}}}}{{AFb{d{b}}}Ad}{{{d{AFd}}}{{d{Aj}}}}{{{d{Gl}}{d{Gl}}}Bh}{{{d{AKn}}{d{AKn}}}Bh}{{{d{AHf}}{d{AHf}}}Bh}{{{d{f}}{d{f}}}Bh}{{{d{AL`}}{d{AL`}}}Bh}{{{d{AHh}}{d{AHh}}}Bh}{{{d{A`}}{d{A`}}}Bh}{{{d{AHj}}{d{AHj}}}Bh}{{{d{AHl}}{d{AHl}}}Bh}{{{d{ALb}}{d{ALb}}}Bh}{{{d{AIh}}{d{AIh}}}Bh}{{{d{AIj}}{d{AIj}}}Bh}{{{d{AGf}}{d{AGf}}}Bh}{{{d{Hn}}{d{Hn}}}Bh}{{{d{AGh}}{d{AGh}}}Bh}{{{d{Jj}}{d{Jj}}}Bh}{{{d{AHb}}{d{AHb}}}Bh}{{{d{Il}}{d{Il}}}Bh}{{{d{AH`}}{d{AH`}}}Bh}{{{d{G`}}{d{G`}}}Bh}{{{d{AHn}}{d{AHn}}}Bh}{{{d{AI`}}{d{AI`}}}Bh}{{{d{AIb}}{d{AIb}}}Bh}{{{d{AId}}{d{AId}}}Bh}{{{d{AGb}}{d{AGb}}}Bh}{{{d{AGd}}{d{AGd}}}Bh}{{{d{AGj}}{d{AGj}}}Bh}{{{d{AF`}}{d{AF`}}}Bh}{{{d{AGl}}{d{AGl}}}Bh}{{{d{AFb}}{d{AFb}}}Bh}{{{d{AFd}}{d{AFd}}}Bh}{{{d{AHd}}{d{AHd}}}Bh}{{{d{Jd}}{d{Jd}}}Bh}{{{d{AIf}}{d{AIf}}}Bh}{{{d{In}}{d{In}}}Bh}{{{d{Jl}}{d{Jl}}}Bh}{{{d{ALd}}{d{ALd}}}Bh}{{d{d{c}}}Bh{}}000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{{{d{f}}{d{b}}}{{F`{{Dn{Dbf}}}}}}{{{d{AI`}}{d{b}}{d{Aj}}}{{C`{AId}}}}{{{d{AFd}}}Ad}{{{d{Hn}}{d{b}}{d{Aj}}}{{C`{{n{DhJn}}}}}}{{{d{Hn}}{d{b}}}{{F`{{Dn{DbJj}}}}}}{{{d{AI`}}{d{b}}}{{F`{{Dn{DbAId}}}}}}{{{d{A`}}{d{b}}}Db}{{{d{Gl}}{d{AnBj}}}Bl}{{{d{AKn}}{d{AnBj}}}Bl}{{{d{AHf}}{d{AnBj}}}Bl}{{{d{f}}{d{AnBj}}}Bl}{{{d{AL`}}{d{AnBj}}}Bl}{{{d{AHh}}{d{AnBj}}}Bl}{{{d{A`}}{d{AnBj}}}Bl}{{{d{AHj}}{d{AnBj}}}Bl}{{{d{AHl}}{d{AnBj}}}Bl}{{{d{ALb}}{d{AnBj}}}Bl}{{{d{AIh}}{d{AnBj}}}Bl}{{{d{AIj}}{d{AnBj}}}Bl}{{{d{AGf}}{d{AnBj}}}Bl}{{{d{Hn}}{d{AnBj}}}Bl}{{{d{AGh}}{d{AnBj}}}Bl}{{{d{Jj}}{d{AnBj}}}Bl}{{{d{AHb}}{d{AnBj}}}Bl}{{{d{Il}}{d{AnBj}}}Bl}{{{d{AH`}}{d{AnBj}}}Bl}{{{d{G`}}{d{AnBj}}}Bl}{{{d{AHn}}{d{AnBj}}}Bl}{{{d{AI`}}{d{AnBj}}}Bl}{{{d{AIb}}{d{AnBj}}}Bl}{{{d{AId}}{d{AnBj}}}Bl}{{{d{AGb}}{d{AnBj}}}Bl}{{{d{AGd}}{d{AnBj}}}Bl}{{{d{AGj}}{d{AnBj}}}Bl}{{{d{AF`}}{d{AnBj}}}Bl}{{{d{AGl}}{d{AnBj}}}Bl}{{{d{AFb}}{d{AnBj}}}Bl}{{{d{AFd}}{d{AnBj}}}Bl}{{{d{AHd}}{d{AnBj}}}Bl}{{{d{Jd}}{d{AnBj}}}Bl}{{{d{AIf}}{d{AnBj}}}Bl}{{{d{In}}{d{AnBj}}}Bl}{{{d{Jl}}{d{AnBj}}}Bl}{{{d{ALd}}{d{AnBj}}}Bl}{{{d{AFd}}{d{b}}{d{AnBj}}}Bl}{cc{}}000000000000000000000000000000000000{{{d{Anb}}{d{ALh}}}f}{{{d{Anb}}{d{Aj}}AKnALj{d{{Gj{{Cd{ce}}}}}}}f{{ALl{Aj}}}{{ALl{Aj}}}}{AKhf}{AKhA`}{AKhAHl}{AKhAIj}{AKhHn}{AKhJj}{AKhIl}{AKhG`}{AKhAI`}{AKhAId}{AKhAGd}{AKhAF`}{AKhAFb}{AKhJd}{AKhIn}{{{d{Hn}}{d{b}}{d{Aj}}}{{C`{G`}}}}{{{d{Il}}{d{b}}}{{C`{G`}}}}{{{d{AI`}}{d{b}}{d{Aj}}}{{C`{G`}}}}{{{d{AF`}}{d{b}}{d{Aj}}}{{C`{G`}}}}{{{d{Jd}}{d{b}}{d{Aj}}}{{C`{G`}}}}{{{d{In}}{d{b}}{d{Aj}}}{{C`{Il}}}}{{{d{Gl}}{d{b}}{d{Aj}}}{{C`{Il}}}}{{{d{Hn}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{AI`}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{AF`}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{Jd}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{In}}{d{b}}}{{F`{{Dn{DbIl}}}}}}{{{d{Il}}{d{b}}{d{Aj}}}{{C`{ALn}}}}{{{d{Il}}{d{b}}}{{l{ALn}}}}{{{d{A`}}{d{b}}}{{Dn{DbGl}}}}{{{d{AI`}}{d{b}}}Bh}{{{d{Gl}}{d{Anc}}}hBn}{{{d{AKn}}{d{Anc}}}hBn}{{{d{AHf}}{d{Anc}}}hBn}{{{d{f}}{d{Anc}}}hBn}{{{d{AL`}}{d{Anc}}}hBn}{{{d{AHh}}{d{Anc}}}hBn}{{{d{A`}}{d{Anc}}}hBn}{{{d{AHj}}{d{Anc}}}hBn}{{{d{AHl}}{d{Anc}}}hBn}{{{d{ALb}}{d{Anc}}}hBn}{{{d{AIh}}{d{Anc}}}hBn}{{{d{AIj}}{d{Anc}}}hBn}{{{d{AGf}}{d{Anc}}}hBn}{{{d{Hn}}{d{Anc}}}hBn}{{{d{AGh}}{d{Anc}}}hBn}{{{d{Jj}}{d{Anc}}}hBn}{{{d{AHb}}{d{Anc}}}hBn}{{{d{Il}}{d{Anc}}}hBn}{{{d{AH`}}{d{Anc}}}hBn}{{{d{G`}}{d{Anc}}}hBn}{{{d{AHn}}{d{Anc}}}hBn}{{{d{AI`}}{d{Anc}}}hBn}{{{d{AIb}}{d{Anc}}}hBn}{{{d{AId}}{d{Anc}}}hBn}{{{d{AGb}}{d{Anc}}}hBn}{{{d{AGd}}{d{Anc}}}hBn}{{{d{AGj}}{d{Anc}}}hBn}{{{d{AF`}}{d{Anc}}}hBn}{{{d{AGl}}{d{Anc}}}hBn}{{{d{AFb}}{d{Anc}}}hBn}{{{d{AFd}}{d{Anc}}}hBn}{{{d{AHd}}{d{Anc}}}hBn}{{{d{Jd}}{d{Anc}}}hBn}{{{d{AIf}}{d{Anc}}}hBn}{{{d{In}}{d{Anc}}}hBn}{{{d{A`}}{d{b}}}{{F`{{Dn{{Cd{InDh}}Jd}}}}}}{{{d{A`}}{d{b}}}f}{AHhf}{{{d{Hn}}{d{b}}}{{C`{G`}}}}{{{d{A`}}{d{b}}}{{Dn{DbGl}}}}{{}c{}}000000000000000000000000000000000000{{{d{Gl}}}Bh}{{{d{Il}}{d{b}}}Bh}{{{d{G`}}{d{b}}}Bh}2{{Il{d{b}}}Bh}{{G`{d{b}}}Bh}323{{{d{In}}{d{b}}Dh}Bh}{{{d{A`}}{d{b}}Gl}Bh}{{{d{A`}}{d{b}}}Bh}{{{d{In}}{d{b}}}Bh}1{{{d{AId}}{d{b}}}Bh}8{{{d{Gl}}{d{b}}}Bh}{{{d{AHl}}{d{b}}}Bh}{{{d{ALb}}{d{b}}}Bh}{{{d{AIj}}{d{b}}}Bh}{{{d{Hn}}{d{b}}}Bh}=<{{{d{AI`}}{d{b}}}Bh}6{{AF`{d{b}}}Bh}8{{{d{Jd}}Dh{d{b}}}Bh}{{{d{In}}{d{b}}{d{Aj}}}Bh}{{{d{Gl}}{d{AI`}}}Bh}{{{d{G`}}{d{b}}}Bh}{{{d{Il}}{d{b}}}Bh}{{{d{AFd}}}Bh}2{{{d{Gl}}}{{d{Aj}}}}{{{d{Gl}}{d{b}}}{{F`{{Dn{DbGl}}}}}}{{{d{f}}{d{b}}}{{F`{{Dn{DbGl}}}}}}{{{d{A`}}{d{b}}}{{F`{{Dn{DbGl}}}}}}{{{d{ALb}}{d{b}}}{{F`{{Dn{DbGl}}}}}}{{AFb{d{b}}}{{n{AFdJn}}}}{AHfAKn}{{{d{Gl}}{d{b}}}{{C`{A`}}}}{{{d{AHl}}{d{b}}}A`}{{{d{Hn}}{d{b}}}A`}{{{d{Il}}{d{b}}}A`}{{{d{G`}}{d{b}}}A`}{{{d{AI`}}{d{b}}}A`}{{AGd{d{b}}}A`}{{AF`{d{b}}}A`}{{{d{Jd}}{d{b}}}A`}{{{d{In}}{d{b}}}A`}{AHjA`}{AIhA`}{AGfA`}{AHbA`}{AHnA`}{AGbA`}{AGjA`}{AHdA`}{AIfA`}{{{d{Gl}}{d{b}}}Db}{{{d{f}}{d{b}}}Db}{{{d{A`}}{d{b}}}Db}{{{d{AHl}}{d{b}}}Db}{{{d{ALb}}{d{b}}}Db}{{{d{AIj}}{d{b}}}Db}{{{d{Hn}}{d{b}}}Db}{{{d{Jj}}{d{b}}}Db}{{{d{Il}}{d{b}}}Db}{{{d{G`}}{d{b}}}Db}{{{d{AI`}}{d{b}}}Db}{{{d{AId}}{d{b}}}Db}{{AGd{d{b}}}Db}{{AF`{d{b}}}Db}{{AFb{d{b}}}Db}{{{d{Jd}}{d{b}}}Db}{{{d{In}}{d{b}}}Db}{AHfDb}{AHhDb}{AGfDb}{{{d{Gl}}{d{b}}}{{C`{El}}}}{{{d{AHl}}{d{b}}}El}{{{d{ALb}}{d{b}}}{{C`{El}}}}{{{d{AIj}}{d{b}}}El}{{{d{Hn}}{d{b}}}El}{{{d{Il}}{d{b}}}El}{{{d{G`}}{d{b}}}El}{{{d{AI`}}{d{b}}}El}{{AF`{d{b}}}El}{{{d{In}}{d{b}}}El}?{{{d{b}}{d{Aj}}AL`f}A`}{{{d{b}}{d{{Cl{AM`}}}}{C`{Gl}}A`}AH`}{{{d{Anb}}{d{Aj}}{d{Aj}}}A`}{{{d{AHl}}{d{b}}}AMb}{{{d{A`}}{d{b}}}{{Dn{DbGl}}}}{{{d{Gl}}{d{b}}}{{C`{Gl}}}}{{{d{A`}}{d{b}}}Gl}{{{d{AHl}}{d{b}}}Gl}{{{d{ALb}}{d{b}}}{{C`{Gl}}}}{{{d{AIj}}{d{b}}}Gl}{{{d{Hn}}{d{b}}}Gl}{{{d{Il}}{d{b}}}Gl}{{{d{G`}}{d{b}}}Gl}{{{d{AI`}}{d{b}}}Gl}{{AGd{d{b}}}Gl}{{AF`{d{b}}}Gl}{{AFb{d{b}}}AF`}{{{d{Jd}}{d{b}}}Gl}{{{d{In}}{d{b}}}Gl}{AGhHn}{AHbC`}{AIbAI`}{AGlAF`}{{{d{A`}}{d{b}}}{{C`{A`}}}}{{{d{Gl}}{d{Gl}}}{{C`{Bf}}}}{{{d{f}}{d{f}}}{{C`{Bf}}}}{{{d{A`}}{d{A`}}}{{C`{Bf}}}}{{{d{AHl}}{d{AHl}}}{{C`{Bf}}}}{{{d{ALb}}{d{ALb}}}{{C`{Bf}}}}{{{d{AIj}}{d{AIj}}}{{C`{Bf}}}}{{{d{Hn}}{d{Hn}}}{{C`{Bf}}}}{{{d{Jj}}{d{Jj}}}{{C`{Bf}}}}{{{d{Il}}{d{Il}}}{{C`{Bf}}}}{{{d{G`}}{d{G`}}}{{C`{Bf}}}}{{{d{AI`}}{d{AI`}}}{{C`{Bf}}}}{{{d{AId}}{d{AId}}}{{C`{Bf}}}}{{{d{AGd}}{d{AGd}}}{{C`{Bf}}}}{{{d{AF`}}{d{AF`}}}{{C`{Bf}}}}{{{d{AFb}}{d{AFb}}}{{C`{Bf}}}}{{{d{Jd}}{d{Jd}}}{{C`{Bf}}}}{{{d{In}}{d{In}}}{{C`{Bf}}}}{{{d{Gl}}{d{b}}}{{F`{{Gj{Db}}}}}}{{{d{Il}}{d{b}}}{{C`{El}}}}{{{d{Hn}}{d{b}}}{{F`{{Dn{DbG`}}}}}}{{{d{AnHd}}{d{j}}}h}{{{d{AnHd}}c}h{{AMf{}{{AMd{{d{j}}}}}}}}{{{d{Jd}}{d{b}}}Dh}{AHdDh}{{{d{A`}}{d{b}}{d{Aj}}}{{n{{C`{AHl}}En}}}}{{{d{A`}}{d{b}}{d{Aj}}}{{n{{C`{Ef}}En}}}}{{{d{Hn}}{d{b}}{d{Aj}}}{{n{{C`{Ef}}En}}}}{{{d{A`}}{d{b}}{d{H`}}}{{Eb{{C`{Ef}}}}}}00{{{d{Gl}}{d{b}}{d{{Gj{{Cl{Db}}}}}}}{{Eb{{C`{Ef}}}}}}{{{d{f}}{d{b}}}{{C`{A`}}}}{{{d{Hn}}{d{b}}}{{F`{ALf}}}}{{{d{Il}}{d{b}}}{{C`{Gl}}}}={{{d{G`}}{d{b}}}{{C`{El}}}}{{{d{Il}}{d{b}}}{{C`{Dh}}}}{{{d{G`}}{d{b}}}{{C`{Dh}}}}{{{d{G`}}{d{b}}}Il}{AH`Il}{{{d{Il}}{d{b}}}{{F`{AFl}}}}{{{d{G`}}{d{b}}}{{F`{AFl}}}}{{{d{Gl}}{d{b}}{d{Anc}}}hHd}{{{d{f}}{d{b}}{d{Anc}}}hHd}{{{d{A`}}{d{b}}{d{Anc}}}hHd}{{{d{AHl}}{d{b}}{d{Anc}}}hHd}{{{d{ALb}}{d{b}}{d{Anc}}}hHd}{{{d{AIj}}{d{b}}{d{Anc}}}hHd}{{{d{Hn}}{d{b}}{d{Anc}}}hHd}{{{d{Jj}}{d{b}}{d{Anc}}}hHd}{{{d{Il}}{d{b}}{d{Anc}}}hHd}{{{d{G`}}{d{b}}{d{Anc}}}hHd}{{{d{AI`}}{d{b}}{d{Anc}}}hHd}{{{d{AId}}{d{b}}{d{Anc}}}hHd}{{AF`{d{b}}{d{Anc}}}hHd}{{AFb{d{b}}{d{Anc}}}hHd}{{{d{Jd}}{d{b}}{d{Anc}}}hHd}{{{d{In}}{d{b}}{d{Anc}}}hHd}>{AHhAL`}{{{d{AHl}}{d{b}}}El}{{{d{AIj}}{d{b}}}El}{{{d{Hn}}{d{b}}}El}{{{d{G`}}{d{b}}}El}{{{d{AI`}}{d{b}}}El}{{{d{AId}}{d{b}}}El}{{AGd{d{b}}}El}{{AF`{d{b}}}El}{{AFb{d{b}}}El}{{{d{Jd}}{d{b}}}El}{{{d{In}}{d{b}}}El}{AHfDb}{{{d{Anb}}}f}{{{d{A`}}{d{b}}}{{F`{{Gj{A`}}}}}}{AGlAd}{{{d{Il}}{d{b}}}Bh}{{{d{G`}}{d{b}}}Bh}{{{d{A`}}{d{b}}}{{l{G`}}}}{dc{}}000000000000000000000000000000000000{{{d{Jd}}{d{b}}}In}{AHdIn}{c{{n{e}}}{}{}}000000000000000000000000000000000000{{}{{n{c}}}{}}000000000000000000000000000000000000{{{d{AHl}}{d{b}}}{{n{DhJn}}}}{{{d{ALb}}{d{b}}}{{n{FfJn}}}}{{{d{Jj}}{d{b}}}{{n{DhJn}}}}{{{d{AId}}{d{b}}}{{n{DhJn}}}}{dCf}00000000{{{d{ALb}}{d{b}}}{{n{DhJn}}}}111{{{d{AIj}}{d{b}}}{{n{DhJn}}}}2222222222222222222222222{{{d{Il}}{d{b}}}{{C`{El}}}}{{{d{G`}}{d{b}}}{{C`{El}}}}{{{d{A`}}{d{b}}}{{F`{{Dn{Db{Cd{ElGl}}}}}}}}{{{d{AHl}}{d{b}}}Cj}{{AF`{d{b}}{d{Aj}}}{{C`{AFb}}}}{{AF`{d{b}}}{{F`{{Dn{DbAFb}}}}}}{{{d{ALf}}Glc}h{{AFj{Gl}}}}``````````{{{d{AMh}}{d{{Cl{Cj}}}}Cn}h}{{{d{AMj}}{d{{Cl{Cj}}}}Cn}h}{{{d{AMl}}{d{{Cl{Cj}}}}Cn}h}{{{d{AMh}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{AMj}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{AMl}}{d{{Cl{Db}}}}{d{{Cl{Cj}}}}Dd}h}{{{d{AMh}}j}h}{{{d{AMj}}j}h}{{{d{AMl}}j}h}{{{d{AMh}}{d{{Cl{Cj}}}}Df}h}{{{d{AMj}}{d{{Cl{Cj}}}}Df}h}{{{d{AMl}}{d{{Cl{Cj}}}}Df}h}{{{d{AnAMl}}{d{Aj}}DhBhEl}{{n{hAKd}}}}{AMjFb}{d{{d{c}}}{}}000{{{d{An}}}{{d{Anc}}}{}}000{{{d{Ch}}{d{Ef}}El}h}{{{d{Gd}}}Gd}{{d{d{Anc}}}h{}}{{dBd}h}{AMlFb}{{{d{AMh}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{AMj}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{AMl}}{d{Db}}El}{{n{{C`{Dd}}En}}}}{{{d{AMh}}}{{d{b}}}}{{{d{AMj}}}{{d{b}}}}{{{d{AMl}}}{{d{b}}}}{AMjd}{AMhFb}?{{{d{Gd}}{d{Gd}}}Bh}{{d{d{c}}}Bh{}}000{{{d{AMh}}{d{{Cl{Cj}}}}}Ff}{{{d{AMj}}{d{{Cl{Cj}}}}}Ff}{{{d{AMl}}{d{{Cl{Cj}}}}}Ff}{{{d{Gd}}{d{AnBj}}}Bl}{cc{}}000{AMjG`}{{{d{AMj}}}{{n{DhJn}}}}{{{d{AMh}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{AMj}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{AMl}}{d{{Cl{Cj}}}}}{{C`{Cn}}}}{{{d{AMh}}}{{C`{Dh}}}}{{{d{AMj}}}{{C`{Dh}}}}{{{d{AMl}}}{{C`{Dh}}}}{{{d{AMh}}Gd}Bh}{{{d{AMj}}Gd}Bh}{{{d{AMl}}Gd}Bh}{{}c{}}000{{{d{AMh}}}Bh}{{{d{AMj}}}Bh}{{{d{AMl}}}Bh}{{{d{AMj}}{d{{Cl{AMn}}}}AN`}h}{{{d{AMj}}{d{{Cl{c}}}}Dh}h{}}{{{d{AMh}}}A`}{{{d{AMj}}}A`}{{{d{AMl}}}A`}{{{d{b}}A`}AMh}{{{d{b}}G`}AMj}{{{d{AMj}}Gd}AMl}{{{d{AMl}}Gd}AMl}{{{d{AMh}}}Gl}{{{d{AMj}}}Gl}{{{d{AMl}}}Gl}{AMlC`}{{{d{AMh}}}G`}{{{d{AMj}}}G`}{{{d{AMl}}}G`}{{{d{AMh}}{d{H`}}}{{C`{Ef}}}}{{{d{AMj}}{d{H`}}}{{C`{Ef}}}}{{{d{AMl}}{d{H`}}}{{C`{Ef}}}}{{{d{AMh}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{AMj}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{AMl}}{d{Aj}}El}{{n{{C`{Ef}}En}}}}{{{d{AMh}}{d{H`}}El}{{n{EfHb}}}}{{{d{AMj}}{d{H`}}El}{{n{EfHb}}}}{{{d{AMl}}{d{H`}}El}{{n{EfHb}}}}876{AMld}{dc{}}{c{{n{e}}}{}{}}000{{}{{n{c}}}{}}000{AMlGd}{dCf}000{{{d{AMh}}{d{{Cl{Cj}}}}{d{Hj}}}h}{{{d{AMj}}{d{{Cl{Cj}}}}{d{Hj}}}h}{{{d{AMl}}{d{{Cl{Cj}}}}{d{Hj}}}h}{AMlANb}`````````````````````````````````````````````````````````{{}Cb}````{{}Ff}{{{d{b}}}Dh}{{}ANd}{{{d{ANf}}{d{b}}{d{{Gj{ANh}}}}}{{C`{Dh}}}}{{{d{ANj}}{d{b}}}{{C`{ANl}}}}{{{d{Dh}}{d{b}}}{{C`{ANl}}}}{{{d{ANj}}{d{b}}}{{C`{ANn}}}}{{{d{Dh}}{d{b}}}{{C`{ANn}}}}{{{d{Dh}}}AKh}{{{d{ANj}}{d{b}}}{{C`{AO`}}}}{{{d{Dh}}{d{b}}}{{C`{AO`}}}}{{{d{ANn}}}{{d{Aj}}}}{{{d{ANf}}}{{d{Aj}}}}{{{d{ANj}}{d{b}}}{{C`{AOb}}}}{{{d{Dh}}{d{b}}}{{C`{AOb}}}}{{{d{Dh}}{d{b}}}{{C`{AI`}}}}{{{d{Dh}}}AKj}{{{d{ANj}}{d{b}}}{{C`{AOd}}}}{{{d{Dh}}{d{b}}}{{C`{AOd}}}}{{{d{b}}Cb}Dh}{{{d{ANn}}}Ad}{{}Ff}{{{d{b}}}Dh}{d{{d{c}}}{}}0000000000000000000{{{d{An}}}{{d{Anc}}}{}}0000000000000000000{IfF`}{{{d{ANn}}ANn}Bh}{{{d{Ff}}}Ff}{{{d{AKj}}}AKj}{{{d{Dh}}}Dh}{{{d{Cb}}}Cb}{{{d{AOf}}}AOf}{{{d{ANn}}}ANn}{{{d{ANl}}}ANl}{{{d{AO`}}}AO`}{{{d{If}}}If}{{{d{AOd}}}AOd}{{{d{AOb}}}AOb}{{{d{AFl}}}AFl}{{{d{AOh}}}AOh}{{{d{AOj}}}AOj}{{{d{AOl}}}AOl}{{{d{ANf}}}ANf}{{{d{AOn}}}AOn}{{{d{B@`}}}B@`}{{{d{ANh}}}ANh}{{d{d{Anc}}}h{}}000000000000000000{{dBd}h}000000000000000000{{{d{Dh}}{d{Dh}}}Bf}{{{d{Cb}}{d{Cb}}}Bf}{{{d{ANn}}{d{ANn}}}Bf}{{{d{If}}{d{If}}}Bf}{{{d{AOb}}{d{AOb}}}Bf}{{{d{ANf}}{d{ANf}}}Bf}{{d{d{c}}}Bf{}}00000{AFlC`}{{{d{Ff}}{d{Ch}}}{{C`{El}}}}{{}Dh}{{Dh{d{b}}}Dh}{{{d{Dh}}{d{b}}}Ff}{{{d{Ff}}{d{Ff}}}Bh}{{{d{AKj}}{d{AKj}}}Bh}{{{d{Dh}}{d{Dh}}}Bh}{{{d{Cb}}{d{Cb}}}Bh}{{{d{ANn}}{d{ANn}}}Bh}{{{d{ANl}}{d{ANl}}}Bh}{{{d{AO`}}{d{AO`}}}Bh}{{{d{If}}{d{If}}}Bh}{{{d{AOd}}{d{AOd}}}Bh}{{{d{AOb}}{d{AOb}}}Bh}{{{d{AFl}}{d{AFl}}}Bh}{{{d{AOh}}{d{AOh}}}Bh}{{{d{AOj}}{d{AOj}}}Bh}{{{d{AOl}}{d{AOl}}}Bh}{{{d{ANf}}{d{ANf}}}Bh}{{{d{B@`}}{d{B@`}}}Bh}{{{d{ANh}}{d{ANh}}}Bh}{{d{d{c}}}Bh{}}0000000000000000000000000000000000000000000000000000000000000000000{{{d{ANn}}ANd}Bh}{{{d{Ff}}{d{AnBj}}}Bl}{{{d{AKj}}{d{AnBj}}}Bl}{{{d{Dh}}{d{AnBj}}}Bl}{{{d{Cb}}{d{AnBj}}}Bl}0{{{d{ANn}}{d{AnBj}}}Bl}0{{{d{ANl}}{d{AnBj}}}Bl}{{{d{AO`}}{d{AnBj}}}Bl}{{{d{If}}{d{AnBj}}}Bl}0{{{d{AOd}}{d{AnBj}}}Bl}{{{d{AOb}}{d{AnBj}}}Bl}0{{{d{AFl}}{d{AnBj}}}Bl}{{{d{AOh}}{d{AnBj}}}Bl}{{{d{AOj}}{d{AnBj}}}Bl}{{{d{AOl}}{d{AnBj}}}Bl}{{{d{ANf}}{d{AnBj}}}Bl}{{{d{B@`}}{d{AnBj}}}Bl}{{{d{ANh}}{d{AnBj}}}Bl}{{{d{Ff}}{d{b}}{d{AnBj}}}Bl}{{{d{Dh}}{d{b}}{d{AnBj}}}Bl}{{{d{AFl}}{d{b}}{d{AnBj}}}Bl}{cc{}}{CbFf}1111111111111111111{AKhDh}{{{d{Aj}}}{{n{Cbc}}}{}}{{{d{Aj}}}{{n{ANnc}}}{}}{{{d{Aj}}}{{n{ANfc}}}{}}{{{d{Dh}}{d{b}}{d{Aj}}}{{C`{Il}}}}{{{d{Dh}}{d{b}}{d{Aj}}}{{F`{{Gj{Il}}}}}}{{{d{Dh}}{d{b}}In}{{C`{Jd}}}}{{{d{Ff}}{d{b}}}Bh}{{{d{Dh}}{d{b}}}Bh}{{{d{Ff}}{d{Anc}}}hBn}{{{d{AKj}}{d{Anc}}}hBn}{{{d{Dh}}{d{Anc}}}hBn}{{{d{Cb}}{d{Anc}}}hBn}{{{d{ANn}}{d{Anc}}}hBn}{{{d{ANl}}{d{Anc}}}hBn}{{{d{AO`}}{d{Anc}}}hBn}{{{d{If}}{d{Anc}}}hBn}{{{d{AOd}}{d{Anc}}}hBn}{{{d{AOb}}{d{Anc}}}hBn}{{{d{AFl}}{d{Anc}}}hBn}{{{d{AOh}}{d{Anc}}}hBn}{{{d{AOj}}{d{Anc}}}hBn}{{{d{AOl}}{d{Anc}}}hBn}{{{d{ANf}}{d{Anc}}}hBn}{{{d{B@`}}{d{Anc}}}hBn}{{{d{ANh}}{d{Anc}}}hBn}{{}ANd}0{{{d{Ff}}{d{b}}}Dh}{ANlDh}{ANnFf}{{{d{b}}ANn}Dh}{{}c{}}0000000000000000000{{}c{}}0{{{d{Dh}}{d{b}}}Bh}0{{Dh{d{b}}}Bh}{{Dh{d{b}}}{{n{BhJn}}}}2222{{{d{AOh}}}Bh}33{{{d{ANn}}}Bh}444{{{d{Ff}}}Bh}{AOdF`}{{}AOf}{{}AOn}{AO`Dh}{B@bB@`}{{{d{Dh}}{d{b}}}{{d{Aj}}}}{{{d{AOl}}}{{C`{{d{Aj}}}}}}{{{d{AOf}}}Ad}{{{d{AOn}}}Ad}{{{d{B@d}}}Fh}{{Dh{d{b}}}Dh}{AObAd}{{{d{ANn}}}ANd}0{AOhC`}{AOjC`}{{{d{Ff}}{d{b}}}Db}{{{d{Dh}}{d{b}}}Db}{{{d{Cb}}}Db}{{{d{ANf}}}Db}{B@bDb}{IfDb}{AOlDb}{{{C`{{d{Aj}}}}{d{Aj}}{n{DhJn}}}AOl}{{{d{AnAOf}}}{{C`{c}}}{}}{{{d{AnAOn}}}{{C`{c}}}{}}10{{{d{AnAOf}}Ad}{{C`{c}}}{}}{{{d{AnAOn}}Ad}{{C`{c}}}{}}{{{d{ANf}}}{{l{B@b}}}}{AFll}{{{d{Dh}}{d{Dh}}}{{C`{Bf}}}}{{{d{Cb}}{d{Cb}}}{{C`{Bf}}}}{{{d{ANn}}{d{ANn}}}{{C`{Bf}}}}{{{d{If}}{d{If}}}{{C`{Bf}}}}{{{d{AOb}}{d{AOb}}}{{C`{Bf}}}}{{{d{ANf}}{d{ANf}}}{{C`{Bf}}}}{AFln}{AFlC`}{{{d{Dh}}{d{b}}{d{Aj}}}{{C`{Il}}}}{{{d{ANn}}}Ad}{ANlAd}{{{d{AOf}}}{{Cd{Ad{C`{Ad}}}}}}{{{d{AOn}}}{{Cd{Ad{C`{Ad}}}}}}{AOhEl}{AOjEl}{dc{}}000000000000000000{dFh}000{{{d{Dh}}{d{AnCh}}{d{Aj}}}{{Cd{{l{{Cd{G`Jd}}}}{l{{Cd{G`Jd}}}}}}}}{c{{n{e}}}{}{}}00000{{{d{Aj}}}{{n{ANnc}}}{}}11111111111{{{d{Aj}}}{{n{ANfc}}}{}}222{{}{{n{c}}}{}}0000000000000000000{{{d{b}}{d{{Gj{Dh}}}}}Dh}{{{d{Dh}}{d{b}}}Ff}{AOln}{dCf}0000000000000000000{{}Ff}{{}Cb}{{}ANd}022{{{d{b}}}Dh}{AO`Dh}```````````````{{{d{B@f}}{d{b}}}Ad}{d{{d{c}}}{}}000000{{{d{An}}}{{d{Anc}}}{}}000000{{{d{AN`}}}AN`}{{{d{B@h}}}B@h}{{{d{B@j}}}B@j}{{{d{B@f}}}B@f}{{{d{B@l}}}B@l}{{{d{B@n}}}B@n}{{{d{BA`}}}BA`}{{d{d{Anc}}}h{}}000000{{dBd}h}000000{{{d{BA`}}Ad}{{l{B@f}}}}{{{d{B@j}}}{{l{B@f}}}}{{{d{b}}Dh}B@n}{{{d{b}}B@f}B@j}{{{d{AN`}}{d{b}}}AN`}{{{d{BA`}}{d{b}}}{{l{BA`}}}}{{{d{B@n}}{d{B@n}}}B@n}{{{d{AN`}}{d{AN`}}}Bh}{{{d{B@h}}{d{B@h}}}Bh}{{{d{B@j}}{d{B@j}}}Bh}{{{d{B@f}}{d{B@f}}}Bh}{{{d{B@l}}{d{B@l}}}Bh}{{{d{B@n}}{d{B@n}}}Bh}{{{d{BA`}}{d{BA`}}}Bh}{{d{d{c}}}Bh{}}000000000000000000000000000{{{d{B@f}}{d{b}}}{{l{Dh}}}}{{{d{AN`}}{d{b}}}{{C`{{l{B@h}}}}}}{{{d{AN`}}{d{AnBj}}}Bl}{{{d{B@h}}{d{AnBj}}}Bl}{{{d{B@j}}{d{AnBj}}}Bl}{{{d{B@f}}{d{AnBj}}}Bl}{{{d{B@l}}{d{AnBj}}}Bl}{{{d{B@n}}{d{AnBj}}}Bl}{{{d{BA`}}{d{AnBj}}}Bl}{{{d{B@h}}{d{b}}{d{AnBj}}}Bl}{cc{}}000000{{{d{AMl}}{d{{Gj{{Cl{BAb}}}}}}Dh}AN`}{{cAd}B@n{{AMf{}{{AMd{{d{BA`}}}}}}}}{{{d{B@f}}{d{Anc}}}hBn}{{{d{B@l}}{d{Anc}}}hBn}{{{d{BA`}}}{{C`{{d{B@h}}}}}}{BA`l}{{}c{}}000000{B@nc{}}{AN`{{l{BA`}}}}{{{d{B@n}}{d{b}}}Bh}{{{d{B@n}}}Bh}{{{d{BA`}}}Bh}{{{d{AN`}}{d{b}}Ad}Bh}{{{d{B@h}}}Bh}{{{d{B@n}}}{{`{{AMf{}{{AMd{{d{B@f}}}}}}}}}}{B@hB@j}{{{d{B@n}}}Ad}{{{d{BA`}}}Ad}{{{d{AN`}}}Ad}{{{l{BA`}}}AN`}{{B@jDh}B@h}{{{l{B@h}}}BA`}3{{{d{BA`}}}{{d{{Gj{B@h}}}}}}{{{d{AN`}}{d{b}}B@f}AN`}{{{d{BA`}}{d{b}}B@f}{{l{BA`}}}}{{{d{AN`}}}{{d{{Gj{BA`}}}}}}{{{d{AN`}}}B@n}{{{d{AnBA`}}AdAd}h}{{{d{AnAN`}}AdAd}h}{dc{}}000000{c{{n{e}}}{}{}}000000{{}{{n{c}}}{}}000000{{{d{B@f}}{d{b}}}Dh}{B@hDh}{dCf}000000{{{C`{{Cd{DbAd}}}}Dh}B@h}{BAdl}{BAdB@f}","D":"EAd","p":[[10,"AnalyzerDb",552],[1,"reference",null,null,1],[5,"IngotId",2222],[1,"unit"],[5,"Diagnostic",4168],[5,"Vec",4169],[6,"Result",4170,null,1],[5,"ModuleId",2222],[6,"ContractTypeMethod",12],[1,"usize"],[6,"Intrinsic",12],[6,"ValueMethod",12],[1,"str"],[6,"GlobalFunction",12],[0,"mut"],[5,"GlobalFunctionIter",12],[5,"IntrinsicIter",12],[1,"u8"],[6,"Ordering",4171],[1,"bool"],[5,"Formatter",4172],[8,"Result",4172],[10,"Hasher",4173],[6,"Option",4174,null,1],[6,"Base",3443],[1,"tuple",null,null,1],[5,"TypeId",4175],[10,"AnalyzerContext",231],[6,"Expr",4176],[5,"Node",4177],[6,"CallType",231],[5,"TempContext",231],[5,"SmolStr",4178],[6,"Constant",231],[5,"ExpressionAttributes",231],[5,"TypeId",3443],[5,"DiagnosticVoucher",231],[5,"FunctionBody",231],[5,"IndexMap",4179],[5,"Label",231,4168],[5,"Analysis",231],[10,"Clone",4180],[6,"NamedThing",231],[5,"Adjustment",231],[6,"AdjustmentKind",231],[5,"Span",4181],[5,"IncompleteItem",2079],[5,"Rc",4182,null,1],[5,"RefCell",4183],[10,"PartialEq",4171],[6,"Type",3443],[5,"String",4184],[5,"Error",4172],[10,"Debug",4172],[5,"ConstEvalError",2079],[5,"FunctionId",2222],[10,"Hash",4173],[6,"BlockScopeType",3319],[5,"SourceFileId",4185],[5,"Label",4186],[1,"slice"],[6,"Item",2222],[10,"Into",4187,null,1],[5,"Path",4176],[5,"FatalError",2079],[10,"DiagnosticSink",2222],[5,"HashMap",4188],[6,"LabelStyle",4168],[10,"Fn",4189],[15,"BuiltinAssociatedFunction",532],[5,"ContractId",2222],[15,"External",532],[15,"AssociatedFunction",532],[15,"TraitValueMethod",532],[5,"Generic",3443],[15,"BuiltinValueMethod",532],[15,"ValueMethod",532],[5,"FunctionSigId",2222],[5,"TraitId",2222],[15,"SelfValue",545],[15,"Variable",545],[5,"ImplId",2222],[5,"AnalyzerDbGroupStorage__",552],[5,"Arc",4190,null,1],[5,"ContractFieldId",2222],[5,"DepGraphWrapper",2222],[5,"TypeError",2079],[5,"InternIngotQuery",552],[5,"InternIngotLookupQuery",552],[5,"InternModuleQuery",552],[5,"InternModuleLookupQuery",552],[5,"InternModuleConstQuery",552],[5,"InternModuleConstLookupQuery",552],[5,"InternStructQuery",552],[5,"InternStructLookupQuery",552],[5,"InternStructFieldQuery",552],[5,"InternStructFieldLookupQuery",552],[5,"InternEnumQuery",552],[5,"InternEnumLookupQuery",552],[5,"InternAttributeQuery",552],[5,"InternAttributeLookupQuery",552],[5,"InternEnumVariantQuery",552],[5,"InternEnumVariantLookupQuery",552],[5,"InternTraitQuery",552],[5,"InternTraitLookupQuery",552],[5,"InternImplQuery",552],[5,"InternImplLookupQuery",552],[5,"InternTypeAliasQuery",552],[5,"InternTypeAliasLookupQuery",552],[5,"InternContractQuery",552],[5,"InternContractLookupQuery",552],[5,"InternContractFieldQuery",552],[5,"InternContractFieldLookupQuery",552],[5,"InternFunctionSigQuery",552],[5,"InternFunctionSigLookupQuery",552],[5,"InternFunctionQuery",552],[5,"InternFunctionLookupQuery",552],[5,"InternTypeQuery",552],[5,"InternTypeLookupQuery",552],[5,"IngotFilesQuery",552],[5,"IngotExternalIngotsQuery",552],[5,"RootIngotQuery",552],[5,"IngotModulesQuery",552],[5,"IngotRootModuleQuery",552],[5,"ModuleFilePathQuery",552],[5,"ModuleParseQuery",552],[5,"ModuleIsIncompleteQuery",552],[5,"ModuleAllItemsQuery",552],[5,"ModuleAllImplsQuery",552],[5,"ModuleItemMapQuery",552],[5,"ModuleImplMapQuery",552],[5,"ModuleContractsQuery",552],[5,"ModuleStructsQuery",552],[5,"ModuleConstantsQuery",552],[5,"ModuleUsedItemMapQuery",552],[5,"ModuleParentModuleQuery",552],[5,"ModuleSubmodulesQuery",552],[5,"ModuleTestsQuery",552],[5,"ModuleConstantTypeQuery",552],[5,"ModuleConstantValueQuery",552],[5,"ContractAllFunctionsQuery",552],[5,"ContractFunctionMapQuery",552],[5,"ContractPublicFunctionMapQuery",552],[5,"ContractInitFunctionQuery",552],[5,"ContractCallFunctionQuery",552],[5,"ContractAllFieldsQuery",552],[5,"ContractFieldMapQuery",552],[5,"ContractFieldTypeQuery",552],[5,"ContractDependencyGraphQuery",552],[5,"ContractRuntimeDependencyGraphQuery",552],[5,"FunctionSignatureQuery",552],[5,"FunctionBodyQuery",552],[5,"FunctionDependencyGraphQuery",552],[5,"StructAllFieldsQuery",552],[5,"StructFieldMapQuery",552],[5,"StructFieldTypeQuery",552],[5,"StructAllFunctionsQuery",552],[5,"StructFunctionMapQuery",552],[5,"StructDependencyGraphQuery",552],[5,"EnumAllVariantsQuery",552],[5,"EnumVariantMapQuery",552],[5,"EnumAllFunctionsQuery",552],[5,"EnumFunctionMapQuery",552],[5,"EnumDependencyGraphQuery",552],[5,"EnumVariantKindQuery",552],[5,"TraitAllFunctionsQuery",552],[5,"TraitFunctionMapQuery",552],[5,"TraitIsImplementedForQuery",552],[5,"ImplAllFunctionsQuery",552],[5,"ImplFunctionMapQuery",552],[5,"AllImplsQuery",552],[5,"ImplForQuery",552],[5,"FunctionSigsQuery",552],[5,"TypeAliasTypeQuery",552],[5,"TestDb",552],[5,"EnumId",2222],[5,"EnumVariantId",2222],[6,"EnumVariantKind",2222],[5,"DatabaseKeyIndex",4191],[5,"Runtime",4192],[10,"FnMut",4189],[5,"FunctionSignature",3443],[5,"QueryTable",4191],[5,"QueryTableMut",4191],[5,"Attribute",2222],[5,"AttributeId",2222],[5,"Contract",2222],[5,"ContractField",2222],[5,"Enum",2222],[5,"EnumVariant",2222],[5,"File",4185],[5,"Function",2222],[5,"FunctionSig",2222],[5,"Impl",2222],[5,"Ingot",2222],[5,"Module",2222],[5,"ModuleConstant",2222],[5,"ModuleConstantId",2222],[5,"Struct",2222],[5,"StructId",2222],[5,"StructField",2222],[5,"StructFieldId",2222],[5,"Trait",2222],[5,"TypeAlias",2222],[5,"TypeAliasId",2222],[5,"Revision",4193],[5,"Module",4176],[1,"u16"],[10,"Database",4191],[5,"Durability",4194],[10,"SourceDb",4195],[5,"DisplayableWrapper",2063],[10,"Displayable",2063],[10,"DisplayWithDb",2063],[6,"IndexingError",2079],[6,"BinaryOperationError",2079],[6,"TypeCoercionError",2079],[5,"AlreadyDefined",2079],[10,"Display",4172],[5,"InternId",4196],[6,"TraitOrType",3443],[5,"Impl",4176],[6,"IngotMode",2222],[6,"ModuleSource",2222],[6,"TypeDef",2222],[6,"DepLocality",2222],[8,"DepGraph",2222],[5,"BuildFiles",4197],[6,"FileKind",4185],[10,"AsRef",4187],[6,"GenericParameter",4176],[5,"Function",4176],[5,"NodeId",4177],[17,"Item"],[10,"Iterator",4198],[5,"ItemScope",3319],[5,"FunctionScope",3319],[5,"BlockScope",3319],[6,"FuncStmt",4176],[5,"PatternMatrix",3989,4199],[5,"BTreeMap",4200],[5,"BigInt",4201],[6,"GenericType",3443],[6,"GenericArg",3443],[10,"TypeDowncast",3443],[5,"Array",3443],[6,"Integer",3443],[5,"Map",3443],[5,"FeString",3443],[5,"Tuple",3443],[5,"IntegerIter",3443],[5,"SelfDecl",3443],[5,"CtxDecl",3443],[5,"FunctionParam",3443],[5,"GenericTypeIter",3443],[6,"GenericParamKind",3443],[5,"GenericParam",3443],[10,"SafeNames",3443],[6,"ConstructorKind",3989,4199],[5,"SimplifiedPattern",3989,4199],[6,"SimplifiedPatternKind",3989,4199],[6,"LiteralConstructor",3989,4199],[5,"SigmaSet",3989,4199],[5,"PatternRowVec",3989,4199],[5,"MatchArm",4176],[15,"Constructor",4166],[5,"AnalyzerDbStorage",552]],"r":[[0,552],[1,552],[11,4202],[254,4168],[276,4168],[287,4168],[299,4168],[309,4168],[319,4168],[339,4168],[349,4168],[350,4168],[351,4168],[352,4168],[394,4168],[406,4168],[425,4168],[430,4168],[442,4168],[450,4168],[464,4168],[476,4168],[478,4168],[480,4168],[481,4168],[492,4168],[503,4168],[517,4168],[3989,4199],[3990,4199],[3991,4199],[3992,4199],[3993,4199],[3994,4199],[3995,4199],[3996,4199],[3997,4199],[3998,4199],[3999,4199],[4000,4199],[4001,4199],[4002,4199],[4003,4199],[4004,4199],[4005,4199],[4006,4199],[4007,4199],[4008,4199],[4009,4199],[4010,4199],[4011,4199],[4012,4199],[4013,4199],[4014,4199],[4015,4199],[4016,4199],[4017,4199],[4018,4199],[4019,4199],[4020,4199],[4021,4199],[4022,4199],[4023,4199],[4024,4199],[4025,4199],[4026,4199],[4027,4199],[4028,4199],[4029,4199],[4030,4199],[4031,4199],[4032,4199],[4033,4199],[4034,4199],[4035,4199],[4036,4199],[4037,4199],[4038,4199],[4039,4199],[4040,4199],[4041,4199],[4042,4199],[4043,4199],[4044,4199],[4045,4199],[4046,4199],[4047,4199],[4048,4199],[4049,4199],[4050,4199],[4051,4199],[4052,4199],[4053,4199],[4054,4199],[4055,4199],[4056,4199],[4057,4199],[4058,4199],[4059,4199],[4060,4199],[4061,4199],[4062,4199],[4063,4199],[4064,4199],[4065,4199],[4066,4199],[4067,4199],[4068,4199],[4069,4199],[4070,4199],[4071,4199],[4072,4199],[4073,4199],[4074,4199],[4075,4199],[4076,4199],[4077,4199],[4078,4199],[4079,4199],[4080,4199],[4081,4199],[4082,4199],[4083,4199],[4084,4199],[4085,4199],[4086,4199],[4087,4199],[4088,4199],[4089,4199],[4090,4199],[4091,4199],[4092,4199],[4093,4199],[4094,4199],[4095,4199],[4096,4199],[4097,4199],[4098,4199],[4099,4199],[4100,4199],[4101,4199],[4102,4199],[4103,4199],[4104,4199],[4105,4199],[4106,4199],[4107,4199],[4108,4199],[4109,4199],[4110,4199],[4111,4199],[4112,4199],[4113,4199],[4114,4199],[4115,4199],[4116,4199],[4117,4199],[4118,4199],[4119,4199],[4120,4199],[4121,4199],[4122,4199],[4123,4199],[4124,4199],[4125,4199],[4126,4199],[4127,4199],[4128,4199],[4129,4199],[4130,4199],[4131,4199],[4132,4199],[4133,4199],[4134,4199],[4135,4199],[4136,4199],[4137,4199],[4138,4199],[4139,4199],[4140,4199],[4141,4199],[4142,4199],[4143,4199],[4144,4199],[4145,4199],[4146,4199],[4147,4199],[4148,4199],[4149,4199],[4150,4199],[4151,4199],[4152,4199],[4153,4199],[4154,4199],[4155,4199],[4156,4199],[4157,4199],[4158,4199],[4159,4199],[4160,4199],[4161,4199],[4162,4199],[4163,4199],[4164,4199],[4165,4199]],"b":[[402,"impl-Debug-for-CallType"],[403,"impl-Display-for-CallType"],[1210,"impl-HasQueryGroup%3CSourceDbStorage%3E-for-TestDb"],[1211,"impl-HasQueryGroup%3CAnalyzerDbStorage%3E-for-TestDb"],[2155,"impl-From%3CIncompleteItem%3E-for-TypeError"],[2157,"impl-From%3CConstEvalError%3E-for-TypeError"],[2158,"impl-From%3CFatalError%3E-for-TypeError"],[2159,"impl-From%3CConstEvalError%3E-for-FatalError"],[2161,"impl-From%3CAlreadyDefined%3E-for-FatalError"],[2162,"impl-From%3CIncompleteItem%3E-for-FatalError"],[2163,"impl-From%3CTypeError%3E-for-FatalError"],[2164,"impl-From%3CTypeError%3E-for-ConstEvalError"],[2165,"impl-From%3CFatalError%3E-for-ConstEvalError"],[2166,"impl-From%3CIncompleteItem%3E-for-ConstEvalError"],[3733,"impl-Display-for-Base"],[3734,"impl-Debug-for-Base"],[3735,"impl-Display-for-Integer"],[3736,"impl-Debug-for-Integer"],[3739,"impl-Debug-for-Generic"],[3740,"impl-Display-for-Generic"],[3742,"impl-Display-for-FeString"],[3743,"impl-Debug-for-FeString"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAL4NZgABAAgACwAAAA0ABQAUAI8AqgAGALcAOgD0AAAA9gABAPkABgABAQkADAEAAA4BAgASATgATAE6AIgBDgCjAQMAqAEEAK4BAAC6AQAAvAEAAL4BBQDFAQcAzgEAANABAADSAQAA1AECANgBAQDbAQAA3gEyABICDwAjAgEAJgIFAC0CJwKvBBYAdAU8AAsGygDXBgAA2QYAANsGAADdBgAA3wYAAOEGNwEbCAQAJwgBACoIAQAvCD0AbggCAHIIBQB+CAEAiAgBAIsIMAC9CAAAvwgQANEIAwDXCAAA2QgDAN4IAQDhCA0A8ggEAPkIcQBsCaYAFArsACYLEAA5CwQAPwsFAEYLJwCUCwkAnwsPALALCAC6CzgA9AslABsMBAAhDAAAJQwAACgMygD0DBkADw0IABkNFQAzDQQAOQ0EAEINMAB0DQcAfQ0cAJwNFQCzDRIAyA0pAPMNngCTDhcArA4AAMAOAwDHDhgA9A4DAPoOBAAADwAAAg8MABAPAQAUDzcATQ9AAI8PAgCUD2gABBAFABEQNwA=","P":[[105,"T"],[117,""],[123,"T"],[129,""],[137,"K"],[139,""],[143,"K"],[159,""],[163,"T"],[169,"FromStr::Err"],[173,"__H"],[176,"U"],[182,"I"],[184,""],[188,"Iterator::Item"],[194,""],[199,"T"],[205,"U,T"],[206,"TryFrom::Error"],[207,"U,T"],[209,"TryFrom::Error"],[211,"U,T"],[212,"TryFrom::Error"],[213,"U,T"],[215,"U"],[221,""],[276,"T"],[298,""],[300,"T"],[301,""],[309,"T"],[319,""],[340,"T"],[341,""],[349,"K"],[389,""],[395,"T"],[396,""],[406,"T"],[417,""],[424,"T"],[425,"__H"],[426,"T,__H"],[427,"__H"],[428,""],[430,"U"],[441,""],[456,"T"],[457,""],[464,"S"],[465,""],[476,"S"],[477,"T"],[478,""],[481,"T"],[491,""],[492,"U,T"],[503,"U"],[514,""],[646,"T"],[826,""],[962,"QueryDb::DynDb,Query::Key,Query::Value"],[1014,""],[1108,"T"],[1198,""],[1456,"U"],[1546,""],[1649,"QueryDb::GroupStorage,Query::Storage"],[1736,"QueryDb::DynDb,Query::Key,Query::Value"],[1744,""],[1788,"U,T"],[1878,"U"],[1968,""],[2066,"T"],[2069,""],[2070,"T"],[2071,""],[2072,"T"],[2073,"U"],[2074,"T"],[2075,""],[2076,"U,T"],[2077,"U"],[2078,""],[2097,"T"],[2113,""],[2115,"T"],[2117,""],[2125,"K"],[2145,""],[2156,"T"],[2157,""],[2160,"T"],[2161,""],[2167,"T"],[2173,"__H"],[2175,"U"],[2183,""],[2192,"T"],[2194,"U,T"],[2202,"U"],[2210,""],[2334,"T"],[2408,""],[2448,"T"],[2485,""],[2539,"K"],[2556,""],[2623,"K"],[2771,""],[2816,"T"],[2853,""],[2886,"__H"],[2921,""],[2926,"U"],[2963,""],[3156,"T"],[3193,""],[3195,"U,T"],[3232,"U"],[3269,""],[3318,"F"],[3329,""],[3343,"T"],[3351,""],[3353,"T"],[3354,""],[3366,"K"],[3370,""],[3374,"T"],[3378,""],[3389,"U"],[3393,""],[3397,"T"],[3398,""],[3425,"T"],[3426,"U,T"],[3430,"U"],[3434,""],[3528,"T"],[3568,""],[3589,"T"],[3608,""],[3633,"K"],[3639,""],[3661,"K"],[3729,""],[3754,"T"],[3755,""],[3756,"T"],[3775,""],[3776,"FromStr::Err"],[3779,""],[3784,"__H"],[3801,""],[3807,"U"],[3827,"I"],[3829,""],[3869,"Iterator::Item"],[3875,""],[3892,"T"],[3911,""],[3916,"U,T"],[3922,"TryFrom::Error"],[3923,"U,T"],[3934,"TryFrom::Error"],[3935,"U,T"],[3938,"U"],[3958,""],[4005,"T"],[4019,""],[4026,"T"],[4033,""],[4054,"K"],[4082,""],[4092,"T"],[4099,""],[4101,"__H"],[4103,""],[4105,"U"],[4112,"IntoIterator::IntoIter"],[4113,""],[4135,"T"],[4142,"U,T"],[4149,"U"],[4156,""]]}],["fe_codegen",{"t":"CCFFFFFFFFFFFFKFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCCCCHHHHFNNNNNONNNHHGPFPKMNMNMNMNMNMNNNNNNNNMNMNMNNMNMNNNNNNNMNNMNMNMNMNMNMNMNMNMNMNMNMNNNNNNNN","n":["db","yul","CodegenAbiContractQuery","CodegenAbiEventQuery","CodegenAbiFunctionArgumentMaximumSizeQuery","CodegenAbiFunctionQuery","CodegenAbiFunctionReturnMaximumSizeQuery","CodegenAbiModuleEventsQuery","CodegenAbiTypeMaximumSizeQuery","CodegenAbiTypeMinimumSizeQuery","CodegenAbiTypeQuery","CodegenConstantStringSymbolNameQuery","CodegenContractDeployerSymbolNameQuery","CodegenContractSymbolNameQuery","CodegenDb","CodegenDbGroupStorage__","CodegenDbStorage","CodegenFunctionSymbolNameQuery","CodegenLegalizedBodyQuery","CodegenLegalizedSignatureQuery","CodegenLegalizedTypeQuery","Db","all_impls","borrow","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","codegen_abi_contract","","","codegen_abi_event","","","codegen_abi_function","","","codegen_abi_function_argument_maximum_size","","","codegen_abi_function_return_maximum_size","","","codegen_abi_module_events","","","codegen_abi_type","","","codegen_abi_type_maximum_size","","","codegen_abi_type_minimum_size","","","codegen_constant_string_symbol_name","","","codegen_contract_deployer_symbol_name","","","codegen_contract_symbol_name","","","codegen_function_symbol_name","","","codegen_legalized_body","","","codegen_legalized_signature","","","codegen_legalized_type","","","contract_all_fields","contract_all_functions","contract_call_function","contract_dependency_graph","contract_field_map","contract_field_type","contract_function_map","contract_init_function","contract_public_function_map","contract_runtime_dependency_graph","default","","","","","","","","","","","","","","","","","enum_all_functions","enum_all_variants","enum_dependency_graph","enum_function_map","enum_variant_kind","enum_variant_map","execute","","","","","","","","","","","","","","","","file_content","file_line_starts","file_name","fmt","","","","","","","","","","","","","","","","fmt_index","","for_each_query","","from","","","","","","","","","","","","","","","","","","","function_body","function_dependency_graph","function_signature","function_sigs","group_storage","","","","impl_all_functions","impl_for","impl_function_map","in_db","","","","","","","","","","","","","","","","in_db_mut","","","","","","","","","","","","","","","","ingot_external_ingots","ingot_files","ingot_modules","ingot_root_module","intern_attribute","intern_contract","intern_contract_field","intern_enum","intern_enum_variant","intern_file","intern_function","intern_function_sig","intern_impl","intern_ingot","intern_module","intern_module_const","intern_struct","intern_struct_field","intern_trait","intern_type","intern_type_alias","into","","","","","","","","","","","","","","","","","","","lookup_intern_attribute","lookup_intern_contract","lookup_intern_contract_field","lookup_intern_enum","lookup_intern_enum_variant","lookup_intern_file","lookup_intern_function","lookup_intern_function_sig","lookup_intern_impl","lookup_intern_ingot","lookup_intern_module","lookup_intern_module_const","lookup_intern_struct","lookup_intern_struct_field","lookup_intern_trait","lookup_intern_type","lookup_intern_type_alias","lookup_mir_intern_const","lookup_mir_intern_function","lookup_mir_intern_type","maybe_changed_since","","mir_intern_const","mir_intern_function","mir_intern_type","mir_lower_contract_all_functions","mir_lower_enum_all_functions","mir_lower_module_all_functions","mir_lower_struct_all_functions","mir_lowered_constant","mir_lowered_func_body","mir_lowered_func_signature","mir_lowered_monomorphized_func_signature","mir_lowered_pseudo_monomorphized_func_signature","mir_lowered_type","module_all_impls","module_all_items","module_constant_type","module_constant_value","module_constants","module_contracts","module_file_path","module_impl_map","module_is_incomplete","module_item_map","module_parent_module","module_parse","module_structs","module_submodules","module_tests","module_used_item_map","new","ops_database","ops_salsa_runtime","ops_salsa_runtime_mut","query_storage","","","","","","","","","","","","","","","","root_ingot","set_file_content","set_file_content_with_durability","set_ingot_external_ingots","set_ingot_external_ingots_with_durability","set_ingot_files","set_ingot_files_with_durability","set_root_ingot","set_root_ingot_with_durability","struct_all_fields","struct_all_functions","struct_dependency_graph","struct_field_map","struct_field_type","struct_function_map","trait_all_functions","trait_function_map","trait_is_implemented_for","try_from","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","type_alias_type","type_id","","","","","","","","","","","","","","","","","","","upcast","","","upcast_mut","","","isel","legalize","runtime","context","lower_contract","lower_contract_deployable","lower_function","lower_test","Context","borrow","borrow_mut","default","from","into","runtime","try_from","try_into","type_id","legalize_func_body","legalize_func_signature","AbiSrcLocation","CallData","DefaultRuntimeProvider","Memory","RuntimeProvider","abi_decode","","abi_encode","","abi_encode_seq","","aggregate_init","","alloc","","avail","","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","collect_definitions","","create","","create2","","default","emit","","external_call","","fmt","","from","","into","","map_value_ptr","","primitive_cast","ptr_copy","","ptr_load","","ptr_store","","revert","","safe_add","","safe_div","","safe_mod","","safe_mul","","safe_pow","","safe_sub","","string_construct","","string_copy","","to_owned","try_from","","try_into","","type_id",""],"q":[[0,"fe_codegen"],[2,"fe_codegen::db"],[436,"fe_codegen::yul"],[439,"fe_codegen::yul::isel"],[444,"fe_codegen::yul::isel::context"],[454,"fe_codegen::yul::legalize"],[456,"fe_codegen::yul::runtime"],[531,"fe_analyzer::namespace::types"],[532,"fe_analyzer::namespace::items"],[533,"alloc::rc"],[534,"fe_abi::contract"],[535,"alloc::sync"],[536,"fe_mir::ir::types"],[537,"fe_abi::event"],[538,"fe_mir::ir::function"],[539,"fe_abi::function"],[540,"alloc::vec"],[541,"fe_abi::types"],[542,"alloc::string"],[543,"core::option"],[544,"fe_analyzer::context"],[545,"smol_str"],[546,"indexmap::map"],[547,"fe_analyzer::errors"],[548,"core::result"],[549,"fe_common::files"],[550,"core::fmt"],[551,"salsa"],[552,"salsa::runtime"],[553,"core::ops::function"],[554,"fe_mir::ir::constant"],[555,"salsa::revision"],[556,"alloc::collections::btree::map"],[557,"fe_parser::ast"],[558,"fe_common::span"],[559,"salsa::durability"],[560,"core::any"],[561,"fe_analyzer::db"],[562,"fe_common::db"],[563,"fe_mir::db"],[564,"yultsur::yul"],[565,"alloc::boxed"],[566,"fe_codegen::yul::isel::contract"],[567,"fe_codegen::yul::isel::function"],[568,"fe_codegen::yul::isel::test"],[569,"fe_codegen::yul::legalize::body"],[570,"fe_codegen::yul::legalize::signature"]],"i":"``````````````````````F`NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`n1Ad1201201201201201201201201201201201201201201202222222222D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`000000D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`00D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnAdF`10Nj2D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`00000000000D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEn?>=<;:9876543210F`00000000000000000000NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`00000000000000000000Ad1111111111111111111111111111110111D`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`00000000000000000NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`0NjAdD`DbDdDfDhDjDlDnE`EbEdEfEhEjElEnF`000000`````````Mj00000000```Nd`0`N`Nf10101010102020222101010010102020201011010101010101010101010102202020","f":"``````````````````````{{bd}{{j{{h{f}}}}}}{b{{b{c}}}{}}000000000000000000{{{b{l}}}{{b{lc}}}{}}000000000000000000{{{b{n}}A`}Ab}{{bA`}Ab}{AdAf}{{{b{n}}Ah}Aj}{{bAh}Aj}2{{{b{n}}Al}An}{{bAl}An}4{{{b{n}}Al}B`}{{bAl}B`}6106{{{b{n}}Bb}{{Bd{Aj}}}}{{bBb}{{Bd{Aj}}}}8{{{b{n}}Ah}Bf}{{bAh}Bf}:{{{b{n}}Ah}B`}{{bAh}B`}<10<{{{b{n}}Bh}{{j{Bh}}}}{{bBh}{{j{Bh}}}}>{{{b{n}}A`}{{j{Bh}}}}{{bA`}{{j{Bh}}}}{AdAf}210{{{b{n}}Al}{{j{Bh}}}}{{bAl}{{j{Bh}}}}2{{{b{n}}Al}{{j{Bj}}}}{{bAl}{{j{Bj}}}}4{{{b{n}}Al}{{j{Bl}}}}{{bAl}{{j{Bl}}}}6{{{b{n}}Ah}Ah}{{bAh}Ah}8{{bA`}{{j{{h{Bn}}}}}}{{bA`}{{j{{h{C`}}}}}}{{bA`}{{Cd{{Cb{C`}}}}}}{{bA`}Cf}{{bA`}{{Cd{{j{{Cj{ChBn}}}}}}}}{{bBn}{{Cd{{Cn{dCl}}}}}}{{bA`}{{Cd{{j{{Cj{ChC`}}}}}}}}4{{bA`}{{j{{Cj{ChC`}}}}}}4{{}D`}{{}Db}{{}Dd}{{}Df}{{}Dh}{{}Dj}{{}Dl}{{}Dn}{{}E`}{{}Eb}{{}Ed}{{}Ef}{{}Eh}{{}Ej}{{}El}{{}En}{{}F`}{{bFb}{{j{{h{C`}}}}}}{{bFb}{{j{{h{Fd}}}}}}{{bFb}{{Cd{Cf}}}}{{bFb}{{Cd{{j{{Cj{ChC`}}}}}}}}{{bFd}{{Cd{{Cn{FfCl}}}}}}{{bFb}{{Cd{{j{{Cj{ChFd}}}}}}}}{{{b{c}}e}g{}{}{}}000000000000000{{bFh}{{j{Fj}}}}{{bFh}{{j{{h{B`}}}}}}{{bFh}Ch}{{{b{D`}}{b{lFl}}}Fn}{{{b{Db}}{b{lFl}}}Fn}{{{b{Dd}}{b{lFl}}}Fn}{{{b{Df}}{b{lFl}}}Fn}{{{b{Dh}}{b{lFl}}}Fn}{{{b{Dj}}{b{lFl}}}Fn}{{{b{Dl}}{b{lFl}}}Fn}{{{b{Dn}}{b{lFl}}}Fn}{{{b{E`}}{b{lFl}}}Fn}{{{b{Eb}}{b{lFl}}}Fn}{{{b{Ed}}{b{lFl}}}Fn}{{{b{Ef}}{b{lFl}}}Fn}{{{b{Eh}}{b{lFl}}}Fn}{{{b{Ej}}{b{lFl}}}Fn}{{{b{El}}{b{lFl}}}Fn}{{{b{En}}{b{lFl}}}Fn}{{{b{Ad}}{b{n}}G`{b{lFl}}}Fn}{{{b{F`}}G`{b{lFl}}}Fn}{{{b{Ad}}{b{Gb}}{b{lGd}}}Gf}{{{b{F`}}{b{lGd}}}Gf}{cc{}}000000000000000000{{bC`}{{Cd{{j{Gh}}}}}}{{bC`}Cf}{{bGj}{{Cd{{j{Gl}}}}}}{{bdCh}{{j{{h{Gj}}}}}}{{{b{F`}}}b}000{{bf}{{j{{h{C`}}}}}}{{bdGn}{{Cb{f}}}}{{bf}{{Cd{{j{{Cj{ChC`}}}}}}}}{{D`{b{n}}}{{H`{D`}}}}{{Db{b{n}}}{{H`{Db}}}}{{Dd{b{n}}}{{H`{Dd}}}}{{Df{b{n}}}{{H`{Df}}}}{{Dh{b{n}}}{{H`{Dh}}}}{{Dj{b{n}}}{{H`{Dj}}}}{{Dl{b{n}}}{{H`{Dl}}}}{{Dn{b{n}}}{{H`{Dn}}}}{{E`{b{n}}}{{H`{E`}}}}{{Eb{b{n}}}{{H`{Eb}}}}{{Ed{b{n}}}{{H`{Ed}}}}{{Ef{b{n}}}{{H`{Ef}}}}{{Eh{b{n}}}{{H`{Eh}}}}{{Ej{b{n}}}{{H`{Ej}}}}{{El{b{n}}}{{H`{El}}}}{{En{b{n}}}{{H`{En}}}}{{D`{b{ln}}}{{Hb{D`}}}}{{Db{b{ln}}}{{Hb{Db}}}}{{Dd{b{ln}}}{{Hb{Dd}}}}{{Df{b{ln}}}{{Hb{Df}}}}{{Dh{b{ln}}}{{Hb{Dh}}}}{{Dj{b{ln}}}{{Hb{Dj}}}}{{Dl{b{ln}}}{{Hb{Dl}}}}{{Dn{b{ln}}}{{Hb{Dn}}}}{{E`{b{ln}}}{{Hb{E`}}}}{{Eb{b{ln}}}{{Hb{Eb}}}}{{Ed{b{ln}}}{{Hb{Ed}}}}{{Ef{b{ln}}}{{Hb{Ef}}}}{{Eh{b{ln}}}{{Hb{Eh}}}}{{Ej{b{ln}}}{{Hb{Ej}}}}{{El{b{ln}}}{{Hb{El}}}}{{En{b{ln}}}{{Hb{En}}}}{{bHd}{{j{{Cj{ChHd}}}}}}{{bHd}{{j{{h{Fh}}}}}}{{bHd}{{j{{h{Bb}}}}}}{{bHd}{{Cb{Bb}}}}{{b{j{Hf}}}Hh}{{b{j{Hj}}}A`}{{b{j{Hl}}}Bn}{{b{j{Hn}}}Fb}{{b{j{I`}}}Fd}{{bIb}Fh}{{b{j{Id}}}C`}{{b{j{If}}}Gj}{{b{j{Ih}}}f}{{b{j{Ij}}}Hd}{{b{j{Il}}}Bb}{{b{j{In}}}J`}{{b{j{Jb}}}Jd}{{b{j{Jf}}}Jh}{{b{j{Jj}}}Gn}{{bJl}d}{{b{j{Jn}}}K`}{{}c{}}000000000000000000{{bHh}{{j{Hf}}}}{{bA`}{{j{Hj}}}}{{bBn}{{j{Hl}}}}{{bFb}{{j{Hn}}}}{{bFd}{{j{I`}}}}{{bFh}Ib}{{bC`}{{j{Id}}}}{{bGj}{{j{If}}}}{{bf}{{j{Ih}}}}{{bHd}{{j{Ij}}}}{{bBb}{{j{Il}}}}{{bJ`}{{j{In}}}}{{bJd}{{j{Jb}}}}{{bJh}{{j{Jf}}}}{{bGn}{{j{Jj}}}}{{bd}Jl}{{bK`}{{j{Jn}}}}{{bKb}{{j{Kd}}}}{{bAl}{{j{Bl}}}}{{bAh}{{j{Kf}}}}{{{b{Ad}}{b{n}}G`Kh}Kj}{{{b{F`}}G`Kh}Kj}{{b{j{Kd}}}Kb}{{b{j{Bl}}}Al}{{b{j{Kf}}}Ah}{{bA`}{{j{{Bd{Al}}}}}}{{bFb}{{j{{Bd{Al}}}}}}{{bBb}{{j{{Bd{Al}}}}}}{{bJd}{{j{{Bd{Al}}}}}}{{bJ`}Kb}{{bAl}{{j{Bj}}}}{{bC`}Al}{{bC`{Kl{Chd}}}Al}1{{bd}Ah}{{bBb}{{Cd{{j{{h{f}}}}}}}}{{bBb}{{j{{h{Kn}}}}}}{{bJ`}{{Cd{{Cn{dCl}}}}}}{{bJ`}{{Cd{{Cn{L`Lb}}}}}}{{bBb}{{j{{Bd{J`}}}}}}{{bBb}{{j{{h{A`}}}}}}{{bBb}Ch}{{bBb}{{Cd{{j{{Cj{{Ld{Gnd}}f}}}}}}}}{{bBb}Kj}{{bBb}{{Cd{{j{{Cj{ChKn}}}}}}}}{{bBb}{{Cb{Bb}}}}{{bBb}{{Cd{{j{Lf}}}}}}{{bBb}{{j{{h{Jd}}}}}}{{bBb}{{j{{h{Bb}}}}}}{{bBb}{{Bd{C`}}}}{{bBb}{{Cd{{j{{Cj{Ch{Ld{LhKn}}}}}}}}}}{LjAd}{{{b{F`}}}{{b{Ll}}}}{{{b{F`}}}{{b{Gb}}}}{{{b{lF`}}}{{b{lGb}}}}{{{b{c}}}{{b{{Af{e}}}}}{}{}}000000000000000{bHd}{{{b{l}}Fh{j{Fj}}}Gf}{{{b{l}}Fh{j{Fj}}Ln}Gf}{{{b{l}}Hd{j{{Cj{ChHd}}}}}Gf}{{{b{l}}Hd{j{{Cj{ChHd}}}}Ln}Gf}{{{b{l}}Hd{j{{h{Fh}}}}}Gf}{{{b{l}}Hd{j{{h{Fh}}}}Ln}Gf}{{{b{l}}Hd}Gf}{{{b{l}}HdLn}Gf}{{bJd}{{j{{h{Jh}}}}}}{{bJd}{{j{{h{C`}}}}}}{{bJd}{{Cd{Cf}}}}{{bJd}{{Cd{{j{{Cj{ChJh}}}}}}}}{{bJh}{{Cd{{Cn{dCl}}}}}}{{bJd}{{Cd{{j{{Cj{ChC`}}}}}}}}{{bGn}{{j{{h{Gj}}}}}}{{bGn}{{Cd{{j{{Cj{ChGj}}}}}}}}{{bGnd}Kj}{c{{Cn{e}}}{}{}}000000000000000000{{}{{Cn{c}}}{}}000000000000000000{{bK`}{{Cd{{Cn{dCl}}}}}}{bM`}000000000000000000{{{b{F`}}}{{b{Mb}}}}{{{b{F`}}}{{b{Md}}}}{{{b{F`}}}{{b{Mf}}}}{{{b{lF`}}}{{b{lMd}}}}{{{b{lF`}}}{{b{lMf}}}}{{{b{lF`}}}{{b{lMb}}}}````{{{b{n}}A`}Mh}0{{{b{n}}{b{lMj}}Al}Ml}{{{b{n}}C`}Mh}`{b{{b{c}}}{}}{{{b{l}}}{{b{lc}}}{}}{{}Mj}{cc{}}{{}c{}}{MjMn}{c{{Cn{e}}}{}{}}{{}{{Cn{c}}}{}}{bM`}{{{b{n}}{b{lBj}}}Gf}{{{b{n}}{b{lBl}}}Gf}`````{{{b{lN`}}{b{n}}NbNb{b{{h{Ah}}}}Nd}Nb}{{{b{lNf}}{b{n}}NbNb{b{{h{Ah}}}}Nd}Nb}{{{b{lN`}}{b{n}}NbNbAhKj}Nb}{{{b{lNf}}{b{n}}NbNbAhKj}Nb}{{{b{lN`}}{b{n}}{b{{h{Nb}}}}Nb{b{{h{Ah}}}}Kj}Nb}{{{b{lNf}}{b{n}}{b{{h{Nb}}}}Nb{b{{h{Ah}}}}Kj}Nb}{{{b{lN`}}{b{n}}Nb{Bd{Nb}}Ah{Bd{Ah}}}Nb}{{{b{lNf}}{b{n}}Nb{Bd{Nb}}Ah{Bd{Ah}}}Nb}{{{b{lN`}}{b{n}}Nb}Nb}{{{b{lNf}}{b{n}}Nb}Nb}{{{b{lN`}}{b{n}}}Nb}{{{b{lNf}}{b{n}}}Nb}{b{{b{c}}}{}}0{{{b{l}}}{{b{lc}}}{}}0{{{b{Nd}}}Nd}{{b{b{lc}}}Gf{}}{{bNh}Gf}{{{b{N`}}}{{Bd{Ml}}}}{{{b{Nf}}}{{Bd{Ml}}}}{{{b{lN`}}{b{n}}A`Nb}Nb}{{{b{lNf}}{b{n}}A`Nb}Nb}{{{b{lN`}}{b{n}}A`NbNb}Nb}{{{b{lNf}}{b{n}}A`NbNb}Nb}{{}Nf}{{{b{lN`}}{b{n}}NbAh}Nb}{{{b{lNf}}{b{n}}NbAh}Nb}{{{b{lN`}}{b{n}}Al{Bd{Nb}}}Nb}{{{b{lNf}}{b{n}}Al{Bd{Nb}}}Nb}{{{b{Nd}}{b{lFl}}}Fn}{{{b{Nf}}{b{lFl}}}Fn}{cc{}}0{{}c{}}0{{{b{lN`}}{b{n}}NbNbAh}Nb}{{{b{lNf}}{b{n}}NbNbAh}Nb}9{{{b{lN`}}{b{n}}NbNbNbKjKj}Nb}{{{b{lNf}}{b{n}}NbNbNbKjKj}Nb};:32{{{b{lN`}}{b{n}}{Cb{Nb}}{b{Fj}}Ah}Nb}{{{b{lNf}}{b{n}}{Cb{Nb}}{b{Fj}}Ah}Nb}545454545454{{{b{lN`}}{b{n}}{b{Fj}}B`}Nb}{{{b{lNf}}{b{n}}{b{Fj}}B`}Nb}{{{b{lN`}}{b{n}}Nb{b{Fj}}Kj}Nb}{{{b{lNf}}{b{n}}Nb{b{Fj}}Kj}Nb}{bc{}}{c{{Cn{e}}}{}{}}0{{}{{Cn{c}}}{}}0{bM`}0","D":"Il","p":[[1,"reference",null,null,1],[5,"TypeId",531],[5,"ImplId",532],[1,"slice"],[5,"Rc",533,null,1],[0,"mut"],[10,"CodegenDb",2],[5,"ContractId",532],[5,"AbiContract",534],[5,"CodegenDbGroupStorage__",2],[5,"Arc",535,null,1],[5,"TypeId",536],[5,"AbiEvent",537],[5,"FunctionId",538],[5,"AbiFunction",539],[1,"usize"],[5,"ModuleId",532],[5,"Vec",540],[6,"AbiType",541],[5,"String",542],[5,"FunctionBody",538],[5,"FunctionSignature",538],[5,"ContractFieldId",532],[5,"FunctionId",532],[6,"Option",543,null,1],[5,"Analysis",544],[5,"DepGraphWrapper",532],[5,"SmolStr",545],[5,"IndexMap",546],[5,"TypeError",547],[6,"Result",548,null,1],[5,"CodegenLegalizedSignatureQuery",2],[5,"CodegenLegalizedBodyQuery",2],[5,"CodegenFunctionSymbolNameQuery",2],[5,"CodegenLegalizedTypeQuery",2],[5,"CodegenAbiTypeQuery",2],[5,"CodegenAbiFunctionQuery",2],[5,"CodegenAbiEventQuery",2],[5,"CodegenAbiContractQuery",2],[5,"CodegenAbiModuleEventsQuery",2],[5,"CodegenAbiTypeMaximumSizeQuery",2],[5,"CodegenAbiTypeMinimumSizeQuery",2],[5,"CodegenAbiFunctionArgumentMaximumSizeQuery",2],[5,"CodegenAbiFunctionReturnMaximumSizeQuery",2],[5,"CodegenContractSymbolNameQuery",2],[5,"CodegenContractDeployerSymbolNameQuery",2],[5,"CodegenConstantStringSymbolNameQuery",2],[5,"Db",2],[5,"EnumId",532],[5,"EnumVariantId",532],[6,"EnumVariantKind",532],[5,"SourceFileId",549],[1,"str"],[5,"Formatter",550],[8,"Result",550],[5,"DatabaseKeyIndex",551],[5,"Runtime",552],[10,"FnMut",553],[1,"unit"],[5,"FunctionBody",544],[5,"FunctionSigId",532],[5,"FunctionSignature",531],[5,"TraitId",532],[5,"QueryTable",551],[5,"QueryTableMut",551],[5,"IngotId",532],[5,"Attribute",532],[5,"AttributeId",532],[5,"Contract",532],[5,"ContractField",532],[5,"Enum",532],[5,"EnumVariant",532],[5,"File",549],[5,"Function",532],[5,"FunctionSig",532],[5,"Impl",532],[5,"Ingot",532],[5,"Module",532],[5,"ModuleConstant",532],[5,"ModuleConstantId",532],[5,"Struct",532],[5,"StructId",532],[5,"StructField",532],[5,"StructFieldId",532],[5,"Trait",532],[6,"Type",531],[5,"TypeAlias",532],[5,"TypeAliasId",532],[5,"ConstantId",554],[5,"Constant",554],[5,"Type",536],[5,"Revision",555],[1,"bool"],[5,"BTreeMap",556],[6,"Item",532],[6,"Constant",544],[5,"ConstEvalError",547],[1,"tuple",null,null,1],[5,"Module",557],[5,"Span",558],[1,"u16"],[10,"Database",551],[5,"Durability",559],[5,"TypeId",560],[10,"AnalyzerDb",561],[10,"SourceDb",562],[10,"MirDb",563],[5,"Object",564],[5,"Context",444],[5,"FunctionDefinition",564],[5,"Box",565,null,1],[10,"RuntimeProvider",456],[6,"Expression",564],[6,"AbiSrcLocation",456],[5,"DefaultRuntimeProvider",456],[1,"u8"],[5,"CodegenDbStorage",2]],"r":[[440,566],[441,566],[442,567],[443,568],[454,569],[455,570]],"b":[[204,"impl-HasQueryGroup%3CAnalyzerDbStorage%3E-for-Db"],[205,"impl-HasQueryGroup%3CCodegenDbStorage%3E-for-Db"],[206,"impl-HasQueryGroup%3CMirDbStorage%3E-for-Db"],[207,"impl-HasQueryGroup%3CSourceDbStorage%3E-for-Db"],[430,"impl-Upcast%3Cdyn+AnalyzerDb%3E-for-Db"],[431,"impl-Upcast%3Cdyn+SourceDb%3E-for-Db"],[432,"impl-Upcast%3Cdyn+MirDb%3E-for-Db"],[433,"impl-UpcastMut%3Cdyn+SourceDb%3E-for-Db"],[434,"impl-UpcastMut%3Cdyn+MirDb%3E-for-Db"],[435,"impl-UpcastMut%3Cdyn+AnalyzerDb%3E-for-Db"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAMUBCAAAABAAEgCjAMkACgD0ABQAHAGkAMMBKgDyAQIA9gEdAA==","P":[[23,"T"],[61,""],[142,"QueryDb::DynDb,Query::Key,Query::Value"],[158,""],[181,"T"],[200,""],[264,"U"],[283,""],[338,"QueryDb::GroupStorage,Query::Storage"],[354,""],[372,"U,T"],[391,"U"],[410,""],[445,"T"],[447,""],[448,"T"],[449,"U"],[450,""],[451,"U,T"],[452,"U"],[453,""],[473,"T"],[477,""],[478,"T"],[479,""],[493,"T"],[495,"U"],[497,""],[524,"T"],[525,"U,T"],[527,"U"],[529,""]]}],["fe_common",{"t":"EEEFKNNNNNQQNNNNNCNCNONNNNNOCNNNNQNNNCCNMONNNNCNFFFFFKFFFKKNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNMNONNNNNNNNMNONNNNNNNNNNNMNMNNNNNNNNNNNNNNNNNNNNNNNNNMMPFPPFGPPPGPNNNNNNNNNNNNNNNNNNNNCHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNHNOOONNNNNNNNNNNNNNNNPFPPFGPPPGPNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNONNNNNNNNNNNOOONNNONNONOONNNNNNNNNNNNNNNNNNPFGPPPPPFPGFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNENNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPPFPGNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNHCCCCCCHHFFGKGPPFPPFPFGPNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNHNNNNNNNNONNOOOOMNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOHKHMMHHHHFNNNNNNHNNNN","n":["File","FileKind","SourceFileId","Span","Spanned","add","","","","add_assign","assert_snapshot_wasm","assert_strings_eq","borrow","borrow_mut","clone","clone_into","clone_to_uninit","db","deserialize","diagnostics","dummy","end","eq","equivalent","","","","file_id","files","fmt","from","from_pair","hash","impl_intern_key","into","is_dummy","new","numeric","panic","serialize","span","start","to_owned","try_from","try_into","type_id","utils","zero","FileContentQuery","FileLineStartsQuery","FileNameQuery","InternFileLookupQuery","InternFileQuery","SourceDb","SourceDbGroupStorage__","SourceDbStorage","TestDb","Upcast","UpcastMut","borrow","","","","","","","","borrow_mut","","","","","","","","default","","","","","","execute","","file_content","","","file_line_starts","","","file_name","","","fmt","","","","","fmt_index","","for_each_query","","from","","","","","","","","group_storage","in_db","","","","","in_db_mut","","","","","intern_file","","","into","","","","","","","","lookup_intern_file","","","maybe_changed_since","","new","ops_database","ops_salsa_runtime","ops_salsa_runtime_mut","query_storage","","","","","set_file_content","","set_file_content_with_durability","","try_from","","","","","","","","try_into","","","","","","","","type_id","","","","","","","","upcast","upcast_mut","Bug","Diagnostic","Error","Help","Label","LabelStyle","Note","Primary","Secondary","Severity","Warning","borrow","","","","borrow_mut","","","","clone","","","","clone_into","","","","clone_to_uninit","","","","cs","diagnostics_string","eq","","","","equivalent","","","","","","","","","","","","","","","","error","fmt","","","","from","","","","hash","","","","into","","","","into_cs","into_cs_label","labels","message","","notes","partial_cmp","primary","print_diagnostics","secondary","severity","span","style","to_owned","","","","try_from","","","","try_into","","","","type_id","","","","Bug","Diagnostic","Error","Help","Label","LabelStyle","Note","Primary","Secondary","Severity","Warning","borrow","","","borrow_mut","","","bug","clone","","","clone_into","","","clone_to_uninit","","","code","eq","","","equivalent","","","","","","","","","","","","error","file_id","fmt","","","from","","","","help","into","","","labels","message","","new","","note","notes","partial_cmp","primary","range","secondary","severity","style","to_owned","","","try_from","","","try_into","","","type_id","","","warning","with_code","with_labels","with_message","","with_notes","CurDir","File","FileKind","Local","Normal","ParentDir","Prefix","RootDir","SourceFileId","Std","Utf8Component","Utf8Path","Utf8PathBuf","ancestors","as_intern_id","as_os_str","","as_path","as_ref","","","","","","","","","","","","as_std_path","as_str","","borrow","","","","","","","borrow_mut","","","","","","canonicalize","canonicalize_utf8","capacity","clear","clone","","","","","clone_into","","","","","clone_to_uninit","","","","","cmp","","","common_prefix","compare","","","components","content","default","deref","deserialize","dummy_file","ends_with","eq","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","exists","extend","extension","file_name","file_stem","fmt","","","","","","","","","from","","","","","","","","","","from_intern_id","from_iter","from_path","from_path_buf","from_str","has_root","hash","","","","","","include_dir","into","","","","","into_boxed_path","into_iter","","into_os_string","into_path_buf","into_std_path_buf","into_string","is_absolute","is_dir","is_dummy","is_file","is_relative","is_symlink","iter","join","join_os","kind","line_index","line_range","metadata","new","","","new_local","new_std","parent","partial_cmp","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","path","","pop","push","read_dir","read_dir_utf8","read_link","read_link_utf8","reserve","reserve_exact","set_extension","set_file_name","shrink_to","shrink_to_fit","starts_with","strip_prefix","symlink_metadata","to_owned","","","","","","to_path_buf","to_string","","","try_exists","try_from","","","","","","","try_into","","","","","try_reserve","try_reserve_exact","type_id","","","","","","with_capacity","with_extension","with_file_name","Binary","Decimal","Hexadecimal","Literal","Octal","Radix","as_num","borrow","","borrow_mut","","clone","","clone_into","","clone_to_uninit","","eq","equivalent","","","","fmt","","from","","into","","new","parse","radix","to_hex_str","to_owned","","try_from","","try_into","","type_id","","install_panic_hook","dirs","files","git","humanize","keccak","ron","get_fe_deps","get_fe_home","BuildFiles","Dependency","DependencyKind","DependencyResolver","FileLoader","Fs","Git","GitDependency","Lib","Local","LocalDependency","Main","ProjectFiles","ProjectMode","Static","borrow","","","","","","","","borrow_mut","","","","","","","","canonicalize_path","canonicalized_path","clone","","","","","clone_into","","","","","clone_to_uninit","","","","","dependencies","eq","equivalent","","","","fe_files","file_content","from","","","","","","","","get_project_root","into","","","","","","","","kind","load_fs","load_static","mode","name","","project_files","resolve","","","root_project_mode","root_project_path","src","to_owned","","","","","try_from","","","","","","","","try_into","","","","","","","","type_id","","","","","","","","version","","fetch_and_checkout","Pluralizable","pluralize_conditionally","to_plural","to_singular","full","full_as_bytes","partial","partial_right_padded","Diff","borrow","borrow_mut","fmt","from","into","new","to_ron_string_pretty","to_string","try_from","try_into","type_id"],"q":[[0,"fe_common"],[48,"fe_common::db"],[175,"fe_common::diagnostics"],[275,"fe_common::diagnostics::cs"],[276,"fe_common::diagnostics"],[278,"fe_common::diagnostics::cs"],[280,"fe_common::diagnostics"],[281,"fe_common::diagnostics::cs"],[284,"fe_common::diagnostics"],[285,"fe_common::diagnostics::cs"],[361,"fe_common::files"],[672,"fe_common::numeric"],[712,"fe_common::panic"],[713,"fe_common::utils"],[719,"fe_common::utils::dirs"],[721,"fe_common::utils::files"],[838,"fe_common::utils::git"],[839,"fe_common::utils::humanize"],[843,"fe_common::utils::keccak"],[847,"fe_common::utils::ron"],[859,"fe_common::span"],[860,"core::option"],[861,"core::result"],[862,"serde::de"],[863,"core::fmt"],[864,"core::convert"],[865,"core::hash"],[866,"serde::ser"],[867,"core::any"],[868,"alloc::rc"],[869,"alloc::sync"],[870,"smol_str"],[871,"salsa"],[872,"salsa::runtime"],[873,"core::ops::function"],[874,"salsa::revision"],[875,"salsa::durability"],[876,"core::marker"],[877,"codespan_reporting::diagnostic"],[878,"alloc::string"],[879,"alloc::vec"],[880,"core::cmp"],[881,"core::clone"],[882,"core::ops::range"],[883,"camino"],[884,"salsa::intern_id"],[885,"std::ffi::os_str"],[886,"std::path"],[887,"std::io::error"],[888,"alloc::borrow"],[889,"core::iter::traits::collect"],[890,"alloc::boxed"],[891,"std::fs"],[892,"alloc::collections"],[893,"num_traits"],[894,"num_bigint::bigint"],[895,"indexmap::map"],[896,"core::error"],[897,"ron::ser"]],"i":"`````b0000``00000`0`00000000`0000`000``0f11111`1```````````M`ChBfBhBjBlBnC`7654321054321021Cb17017017654327171876543211654326543201787654321017717111654320101876543218765432187654321EdEhEj`00``0En0`11El1F`3120312031203120``312033331111222200001312031203120312010110130`010031203120312031203`33``3Fn0`40FhFf2100210210210021022221111000001210221002100101000211101210210210210000100H```Hj1111`0```GhAh13Hb2222000044442242004Dj423150423311150421504215042315`31532112233333333333333333333333333311111111111111115042333311115555000044442222313333311550423111115042213113315042`15042131131133233333302233122233333333333333333333333333311111111111111115201133331111113333150423315331150421504211315042133Jf00`0`00Jj1010101011111101010000`10101010``````````````K`Kj`Kd1`0``22L`Kl2KbKfKh674352106725210652106521063555557774352106`743521062443324Mb215546321785463217854632178546321743```Lf0`````Lj00000`0000","f":"`````{{b{d{c}}}bf}{{bb}b}{{b{h{b}}}b}{{b{h{{d{c}}}}}b{}}{{{d{jb}}c}l{}}``{d{{d{c}}}{}}{{{d{j}}}{{d{jc}}}{}}{{{d{b}}}b}{{d{d{jc}}}l{}}{{dn}l}`{c{{A`{b}}}Ab}`{{}b}{bAd}{{{d{b}}{d{b}}}Af}{{d{d{c}}}Af{}}000{bAh}`{{{d{b}}{d{jAj}}}Al}{cc{}}{{ce}b{{An{b}}}{{An{b}}}}{{{d{b}}{d{jc}}}lB`}`{{}c{}}{{{d{b}}}Af}{{AhAdAd}b}``{{{d{b}}c}A`Bb}{{{d{f}}}b}<{dc{}}{c{{A`{e}}}{}{}}{{}{{A`{c}}}{}}{dBd}`{Ahb}```````````{d{{d{c}}}{}}0000000{{{d{j}}}{{d{jc}}}{}}0000000{{}Bf}{{}Bh}{{}Bj}{{}Bl}{{}Bn}{{}C`}{{{d{c}}e}g{}{}{}}0{{{d{Cb}}Ah}{{Cf{Cd}}}}{{dAh}{{Cf{Cd}}}}{ChCj}{{{d{Cb}}Ah}{{Cf{{Cl{Ad}}}}}}{{dAh}{{Cf{{Cl{Ad}}}}}}2{{{d{Cb}}Ah}Cn}{{dAh}Cn}4{{{d{Bf}}{d{jAj}}}Al}{{{d{Bh}}{d{jAj}}}Al}{{{d{Bj}}{d{jAj}}}Al}{{{d{Bl}}{d{jAj}}}Al}{{{d{Bn}}{d{jAj}}}Al}{{{d{Ch}}{d{Cb}}D`{d{jAj}}}Al}{{{d{C`}}D`{d{jAj}}}Al}{{{d{Ch}}{d{Db}}{d{jDd}}}l}{{{d{C`}}{d{jDd}}}l}{cc{}}0000000{{{d{C`}}}d}{{Bf{d{Cb}}}{{Df{Bf}}}}{{Bh{d{Cb}}}{{Df{Bh}}}}{{Bj{d{Cb}}}{{Df{Bj}}}}{{Bl{d{Cb}}}{{Df{Bl}}}}{{Bn{d{Cb}}}{{Df{Bn}}}}{{Bf{d{jCb}}}{{Dh{Bf}}}}{{Bh{d{jCb}}}{{Dh{Bh}}}}{{Bj{d{jCb}}}{{Dh{Bj}}}}{{Bl{d{jCb}}}{{Dh{Bl}}}}{{Bn{d{jCb}}}{{Dh{Bn}}}}{{{d{Cb}}Dj}Ah}{{dDj}Ah}{ChCj}{{}c{}}0000000{{{d{Cb}}Ah}Dj}{{dAh}Dj}3{{{d{Ch}}{d{Cb}}D`Dl}Af}{{{d{C`}}D`Dl}Af}{DnCh}{{{d{C`}}}{{d{E`}}}}{{{d{C`}}}{{d{Db}}}}{{{d{jC`}}}{{d{jDb}}}}{{{d{c}}}{{d{{Cj{e}}}}}{}{}}0000{{{d{jCb}}Ah{Cf{Cd}}}l}{{{d{j}}Ah{Cf{Cd}}}l}{{{d{jCb}}Ah{Cf{Cd}}Eb}l}{{{d{j}}Ah{Cf{Cd}}Eb}l}{c{{A`{e}}}{}{}}0000000{{}{{A`{c}}}{}}0000000{dBd}0000000{{{d{Ed}}}{{d{c}}}Ef}{{{d{jEh}}}{{d{jc}}}Ef}```````````{d{{d{c}}}{}}000{{{d{j}}}{{d{jc}}}{}}000{{{d{Ej}}}Ej}{{{d{El}}}El}{{{d{En}}}En}{{{d{F`}}}F`}{{d{d{jc}}}l{}}000{{dn}l}000`{{{d{Cb}}{d{{Cl{El}}}}}Fb}{{{d{Ej}}{d{Ej}}}Af}{{{d{El}}{d{El}}}Af}{{{d{En}}{d{En}}}Af}{{{d{F`}}{d{F`}}}Af}{{d{d{c}}}Af{}}000000000000000{FbEl}{{{d{Ej}}{d{jAj}}}{{A`{lFd}}}}{{{d{El}}{d{jAj}}}Al}{{{d{En}}{d{jAj}}}Al}{{{d{F`}}{d{jAj}}}Al}{cc{}}000{{{d{Ej}}{d{jc}}}lB`}{{{d{El}}{d{jc}}}lB`}{{{d{En}}{d{jc}}}lB`}{{{d{F`}}{d{jc}}}lB`}{{}c{}}000{El{{Ff{Ah}}}}{F`{{Fh{Ah}}}}{ElFj}{ElFb}{F`Fb}2{{{d{Ej}}{d{Ej}}}{{h{Fl}}}}{{bc}F`{{An{Fb}}}}{{{d{Cb}}{d{{Cl{El}}}}}l}1{ElEj}{F`b}{F`En}{dc{}}000{c{{A`{e}}}{}{}}000{{}{{A`{c}}}{}}000{dBd}000```````````{d{{d{c}}}{}}00{{{d{j}}}{{d{jc}}}{}}00{{}{{Ff{c}}}{}}{{{d{Fn}}}Fn}{{{d{{Fh{c}}}}}{{Fh{c}}}G`}{{{d{{Ff{c}}}}}{{Ff{c}}}G`}{{d{d{jc}}}l{}}00{{dn}l}00{Ffh}{{{d{Fn}}{d{Fn}}}Af}{{{d{{Fh{c}}}}{d{{Fh{c}}}}}AfGb}{{{d{{Ff{c}}}}{d{{Ff{c}}}}}AfGb}{{d{d{c}}}Af{}}00000000000:{Fh}{{{d{Fn}}{d{jAj}}}{{A`{lFd}}}}{{{d{{Fh{c}}}}{d{jAj}}}{{A`{lFd}}}Gd}{{{d{{Ff{c}}}}{d{jAj}}}{{A`{lFd}}}Gd}{EnFn}{cc{}}00{{}{{Ff{c}}}{}}{{}c{}}00{FfFj}{FhFb}{FfFb}{{Fnce}{{Fh{c}}}{}{{An{{Gf{Ad}}}}}}{Ej{{Ff{c}}}{}}64{{{d{Fn}}{d{Fn}}}{{h{Fl}}}}{{ce}{{Fh{c}}}{}{{An{{Gf{Ad}}}}}}{FhGf}1{FfEj}{FhFn}{dc{}}00{c{{A`{e}}}{}{}}00{{}{{A`{c}}}{}}00{dBd}00?{{{Ff{c}}e}{{Ff{c}}}{}{{An{Fb}}}}{{{Ff{c}}{Fj{{Fh{c}}}}}{{Ff{c}}}{}}{{{Fh{c}}e}{{Fh{c}}}{}{{An{Fb}}}}2{{{Ff{c}}{Fj{Fb}}}{{Ff{c}}}{}}`````````````{{{d{Gh}}}Gj}{{{d{Ah}}}Gl}{{{d{Gh}}}{{d{Gn}}}}{{{d{H`}}}{{d{Gn}}}}{{{d{Hb}}}{{d{Gh}}}}{{{d{Gh}}}{{d{Cd}}}}{{{d{Gh}}}{{d{Gh}}}}4{{{d{Gh}}}{{d{Hd}}}}3{{{d{Hb}}}{{d{Gn}}}}{{{d{Hb}}}{{d{Hd}}}}{{{d{Hb}}}{{d{Cd}}}}{{{d{H`}}}{{d{Cd}}}}8{{{d{H`}}}{{d{Hd}}}}{{{d{H`}}}{{d{Gh}}}}682{d{{d{c}}}{}}0:0000{{{d{j}}}{{d{jc}}}{}}00000{{{d{Gh}}}{{A`{HfHh}}}}{{{d{Gh}}}{{A`{HbHh}}}}{{{d{Hb}}}Ad}{{{d{jHb}}}l}{{{d{Hb}}}Hb}{{{d{H`}}}H`}{{{d{Dj}}}Dj}{{{d{Hj}}}Hj}{{{d{Ah}}}Ah}{{d{d{jc}}}l{}}0000{{dn}l}0000{{{d{Gh}}{d{Gh}}}Fl}{{{d{Hb}}{d{Hb}}}Fl}{{{d{H`}}{d{H`}}}Fl}{{{d{Gh}}{d{Gh}}}Hb}{{d{d{c}}}Fl{}}00{{{d{Gh}}}Hl}{{{d{Ah}}{d{Cb}}}{{Cf{Cd}}}}{{}Hb}{{{d{Hb}}}{{d{Gh}}}}{c{{A`{Ah}}}Ab}{{}Ah}{{{d{Gh}}c}Af{{Hn{Hd}}}}{{{d{{d{Gh}}}}{d{{I`{Gn}}}}}Af}{{{d{Gh}}{d{Hf}}}Af}{{{d{Gh}}{d{{I`{Gn}}}}}Af}{{{d{Gh}}{d{{d{Gn}}}}}Af}{{{d{Gh}}{d{Gn}}}Af}{{{d{{d{Gh}}}}{d{Gn}}}Af}{{{d{Gh}}{d{Gh}}}Af}{{{d{Gh}}{d{Hb}}}Af}{{{d{Gh}}{d{Ib}}}Af}{{{d{{d{Gh}}}}{d{Fb}}}Af}{{{d{{d{Gh}}}}{d{{I`{Cd}}}}}Af}{{{d{{d{Gh}}}}{d{Cd}}}Af}{{{d{Gh}}{d{Fb}}}Af}{{{d{{d{Gh}}}}{d{Ib}}}Af}{{{d{Gh}}{d{{d{Cd}}}}}Af}{{{d{Gh}}{d{Cd}}}Af}{{{d{{d{Gh}}}}{d{Hb}}}Af}{{{d{Gh}}{d{{I`{Gh}}}}}Af}{{{d{{d{Gh}}}}{d{{I`{Gh}}}}}Af}{{{d{Gh}}{d{Hd}}}Af}{{{d{{d{Gh}}}}{d{Hf}}}Af}{{{d{{d{Gh}}}}{d{{I`{Hd}}}}}Af}{{{d{{d{Gh}}}}{d{Hd}}}Af}{{{d{Gh}}{d{{d{Hd}}}}}Af}{{{d{Gh}}{d{{I`{Hd}}}}}Af}{{{d{Gh}}{d{{I`{Cd}}}}}Af}{{{d{Hb}}{d{Gn}}}Af}{{{d{Hb}}{d{Hf}}}Af}{{{d{Hb}}{d{{d{Gh}}}}}Af}{{{d{Hb}}{d{Ib}}}Af}{{{d{Hb}}{d{{I`{Cd}}}}}Af}{{{d{Hb}}{d{{d{Cd}}}}}Af}{{{d{Hb}}{d{Cd}}}Af}{{{d{Hb}}{d{{I`{Gh}}}}}Af}{{{d{Hb}}{d{Hd}}}Af}{{{d{Hb}}{d{{d{Hd}}}}}Af}{{{d{Hb}}{d{{I`{Gn}}}}}Af}{{{d{Hb}}{d{{I`{Hd}}}}}Af}{{{d{Hb}}{d{Hb}}}Af}{{{d{Hb}}{d{{d{Gn}}}}}Af}{{{d{Hb}}{d{Gh}}}Af}{{{d{Hb}}{d{Fb}}}Af}{{{d{H`}}{d{H`}}}Af}{{{d{Dj}}{d{Dj}}}Af}{{{d{Hj}}{d{Hj}}}Af}{{{d{Ah}}{d{Ah}}}Af}{{d{d{c}}}Af{}}00000000000000000000000{{{d{Gh}}}Af}{{{d{jHb}}e}l{{Hn{Gh}}}{{If{}{{Id{c}}}}}}{{{d{Gh}}}{{h{{d{Cd}}}}}}00{{{d{Gh}}{d{jAj}}}{{A`{lFd}}}}0{{{d{Hb}}{d{jAj}}}{{A`{lFd}}}}0{{{d{H`}}{d{jAj}}}{{A`{lFd}}}}0{{{d{Dj}}{d{jAj}}}Al}{{{d{Hj}}{d{jAj}}}Al}{{{d{Ah}}{d{jAj}}}Al}{{{d{Cd}}}{{d{Gh}}}}{cc{}}{FbHb}{{{d{c}}}Hb{{Hn{Cd}}Ef}}{{{Ih{Gh}}}Hb}{{{I`{Gh}}}Hb}4444{GlAh}{eHb{{Hn{Gh}}}{{If{}{{Id{c}}}}}}{{{d{Hd}}}{{h{{d{Gh}}}}}}{Hf{{A`{HbHf}}}}{{{d{Cd}}}{{A`{Hb}}}}{{{d{Gh}}}Af}{{{d{Gh}}{d{jc}}}lB`}{{{d{Hb}}{d{jc}}}lB`}{{{d{H`}}{d{jc}}}lB`}{{{d{Dj}}{d{jc}}}lB`}{{{d{Hj}}{d{jc}}}lB`}{{{d{Ah}}{d{jc}}}lB`}`{{}c{}}0000{Hb{{Ih{Gh}}}}{{{d{Gh}}}Ij}{{{d{Hb}}}Ij}{HbIb}{{{Ih{Gh}}}Hb}{HbHf}{HbFb}>>{AhAf}???6{{{d{Gh}}c}Hb{{Hn{Gh}}}}{{{d{Gh}}c}Hf{{Hn{Hd}}}}{DjHj}{{{d{Ah}}{d{Cb}}Ad}Ad}{{{d{Ah}}{d{Cb}}Ad}{{h{{Gf{Ad}}}}}}{{{d{Gh}}}{{A`{IlHh}}}}{{{d{c}}}{{d{Gh}}}{{Hn{Cd}}Ef}}{{}Hb}{{{d{jCb}}Hj{d{Cd}}{Cf{Cd}}}Ah}{{{d{jCb}}{d{Cd}}{Cf{Cd}}}Ah}0{{{d{Gh}}}{{h{{d{Gh}}}}}}{{{d{{d{Gh}}}}{d{Gn}}}{{h{Fl}}}}{{{d{Gh}}{d{{d{Gn}}}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{{I`{Gh}}}}}{{h{Fl}}}}{{{d{Gh}}{d{Hd}}}{{h{Fl}}}}{{{d{Gh}}{d{Hb}}}{{h{Fl}}}}{{{d{Gh}}{d{{d{Hd}}}}}{{h{Fl}}}}{{{d{Gh}}{d{{I`{Hd}}}}}{{h{Fl}}}}{{{d{Gh}}{d{Hf}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Hd}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{{I`{Hd}}}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Hf}}}{{h{Fl}}}}{{{d{Gh}}{d{Cd}}}{{h{Fl}}}}{{{d{Gh}}{d{{d{Cd}}}}}{{h{Fl}}}}{{{d{Gh}}{d{Gh}}}{{h{Fl}}}}{{{d{Gh}}{d{Fb}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Ib}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Hb}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{{I`{Gn}}}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Cd}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{{I`{Cd}}}}}{{h{Fl}}}}{{{d{{d{Gh}}}}{d{Fb}}}{{h{Fl}}}}{{{d{Gh}}{d{{I`{Gh}}}}}{{h{Fl}}}}{{{d{Gh}}{d{Ib}}}{{h{Fl}}}}{{{d{Gh}}{d{Gn}}}{{h{Fl}}}}{{{d{Gh}}{d{{I`{Gn}}}}}{{h{Fl}}}}{{{d{Gh}}{d{{I`{Cd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Gn}}}{{h{Fl}}}}{{{d{Hb}}{d{{I`{Cd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{{I`{Gh}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Ib}}}{{h{Fl}}}}{{{d{Hb}}{d{{I`{Gn}}}}}{{h{Fl}}}}{{{d{Hb}}{d{{d{Gn}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Hd}}}{{h{Fl}}}}{{{d{Hb}}{d{{d{Gh}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Gh}}}{{h{Fl}}}}{{{d{Hb}}{d{Hb}}}{{h{Fl}}}}{{{d{Hb}}{d{{d{Hd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{{I`{Hd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Hf}}}{{h{Fl}}}}{{{d{Hb}}{d{{d{Cd}}}}}{{h{Fl}}}}{{{d{Hb}}{d{Fb}}}{{h{Fl}}}}{{{d{Hb}}{d{Cd}}}{{h{Fl}}}}{{{d{H`}}{d{H`}}}{{h{Fl}}}}{{{d{Ah}}{d{Cb}}}{{Cf{Hb}}}}{DjCf}{{{d{jHb}}}Af}{{{d{jHb}}c}l{{Hn{Gh}}}}{{{d{Gh}}}{{A`{InHh}}}}{{{d{Gh}}}{{A`{J`Hh}}}}{{{d{Gh}}}{{A`{HfHh}}}}{{{d{Gh}}}{{A`{HbHh}}}}{{{d{jHb}}Ad}l}0{{{d{jHb}}c}Af{{Hn{Cd}}}}{{{d{jHb}}c}l{{Hn{Cd}}}}2{{{d{jHb}}}l}{{{d{Gh}}c}Af{{Hn{Hd}}}}{{{d{Gh}}c}{{A`{{d{Gh}}Jb}}}{{Hn{Hd}}}}{{{d{Gh}}}{{A`{IlHh}}}}{{{d{Gh}}}Hb}{dc{}}00001{dFb}00{{{d{Gh}}}{{A`{AfHh}}}}{{{d{Hd}}}{{A`{{d{Gh}}}}}}{c{{A`{e}}}{}{}}{Hf{{A`{Hb}}}}1111{{}{{A`{c}}}{}}0000{{{d{jHb}}Ad}{{A`{lJd}}}}0{dBd}00000{AdHb}{{{d{Gh}}c}Hb{{Hn{Cd}}}}0``````{JfJh}{d{{d{c}}}{}}0{{{d{j}}}{{d{jc}}}{}}0{{{d{Jf}}}Jf}{{{d{Jj}}}Jj}{{d{d{jc}}}l{}}0{{dn}l}0{{{d{Jf}}{d{Jf}}}Af}{{d{d{c}}}Af{}}000{{{d{Jf}}{d{jAj}}}Al}{{{d{Jj}}{d{jAj}}}Al}{cc{}}0{{}c{}}0{{{d{Cd}}}Jj}{{{d{Jj}}}{{A`{c}}}Jl}{{{d{Jj}}}Jf}{{{d{Jn}}}Fb}{dc{}}0{c{{A`{e}}}{}{}}0{{}{{A`{c}}}{}}0{dBd}0{{}l}``````{{}Hf}0```````````````{d{{d{c}}}{}}0000000{{{d{j}}}{{d{jc}}}{}}0000000{{{d{K`}}{d{Cd}}}{{A`{CnFb}}}}{KbCn}{{{d{Kd}}}Kd}{{{d{Kb}}}Kb}{{{d{Kf}}}Kf}{{{d{Kh}}}Kh}{{{d{Kj}}}Kj}{{d{d{jc}}}l{}}0000{{dn}l}0000{KlFj}{{{d{Kd}}{d{Kd}}}Af}{{d{d{c}}}Af{}}000{{{d{K`}}{d{Cd}}}{{A`{{Fj{{Kn{FbFb}}}}Fb}}}}{{{d{K`}}{d{Cd}}}{{A`{FbFb}}}}{cc{}}0000000{{}{{h{Fb}}}}{{}c{}}0000000{KbKj}{{{d{Cd}}}{{A`{L`Fb}}}}{{{Fj{{Kn{{d{Cd}}{d{Cd}}}}}}{d{Cd}}}{{A`{L`Fb}}}}{KlKd}{KlCn}{KbCn}{L`Lb}{{{d{Kb}}{d{K`}}}{{A`{KlFb}}}}00{{{d{L`}}}Kd}{L`Cn}{KlFj}{dc{}}0000{c{{A`{e}}}{}{}}0000000{{}{{A`{c}}}{}}0000000{dBd}0000000:{Kbh}{{{d{Cd}}c{d{Cd}}}{{A`{l{Ih{Ld}}}}}{{Hn{Hd}}}}`{{cAd}FbLf}{{{d{Lf}}}Fb}0{{{d{{Cl{n}}}}}Fb}{{{d{{Cl{n}}}}}{{Lh{n}}}}{{{d{{Cl{n}}}}Ad}Fb}0`{d{{d{c}}}{}}{{{d{j}}}{{d{jc}}}{}}{{{d{Lj}}{d{jAj}}}Al}{cc{}}{{}c{}}{{{d{Cd}}{d{Cd}}}Lj}{{{d{c}}}{{Ll{Fb}}}Ln}{dFb}{c{{A`{e}}}{}{}}{{}{{A`{c}}}{}}{dBd}","D":"AJn","p":[[5,"Span",0,859],[1,"reference",null,null,1],[10,"Spanned",0,859],[6,"Option",860,null,1],[0,"mut"],[1,"unit"],[1,"u8"],[6,"Result",861,null,1],[10,"Deserializer",862],[1,"usize"],[1,"bool"],[5,"SourceFileId",361],[5,"Formatter",863],[8,"Result",863],[10,"Into",864,null,1],[10,"Hasher",865],[10,"Serializer",866],[5,"TypeId",867],[5,"InternFileQuery",48],[5,"InternFileLookupQuery",48],[5,"FileContentQuery",48],[5,"FileLineStartsQuery",48],[5,"FileNameQuery",48],[5,"TestDb",48],[10,"SourceDb",48],[1,"str"],[5,"Rc",868,null,1],[5,"SourceDbGroupStorage__",48],[5,"Arc",869,null,1],[1,"slice"],[5,"SmolStr",870],[5,"DatabaseKeyIndex",871],[5,"Runtime",872],[10,"FnMut",873],[5,"QueryTable",871],[5,"QueryTableMut",871],[5,"File",361],[5,"Revision",874],[1,"u16"],[10,"Database",871],[5,"Durability",875],[10,"Upcast",48],[10,"Sized",876],[10,"UpcastMut",48],[6,"Severity",284,877],[5,"Diagnostic",284],[6,"LabelStyle",284],[5,"Label",284],[5,"String",878],[5,"Error",863],[5,"Diagnostic",285,877],[5,"Label",285,877],[5,"Vec",879],[6,"Ordering",880],[6,"LabelStyle",285,877],[10,"Clone",881],[10,"PartialEq",880],[10,"Debug",863],[5,"Range",882],[5,"Utf8Path",361,883],[5,"Utf8Ancestors",883],[5,"InternId",884],[5,"OsStr",885],[6,"Utf8Component",361,883],[5,"Utf8PathBuf",361,883],[5,"Path",886],[5,"PathBuf",886],[5,"Error",887],[6,"FileKind",361],[5,"Utf8Components",883],[10,"AsRef",864],[6,"Cow",888],[5,"OsString",885],[17,"Item"],[10,"IntoIterator",889],[5,"Box",890,null,1],[5,"Iter",883],[5,"Metadata",891],[5,"ReadDir",891],[5,"ReadDirUtf8",883],[5,"StripPrefixError",886],[5,"TryReserveError",892],[6,"Radix",672],[1,"u32"],[5,"Literal",672],[10,"Num",893],[5,"BigInt",894],[6,"FileLoader",721],[5,"Dependency",721],[6,"ProjectMode",721],[5,"LocalDependency",721],[5,"GitDependency",721],[6,"DependencyKind",721],[5,"ProjectFiles",721],[1,"tuple",null,null,1],[5,"BuildFiles",721],[5,"IndexMap",895],[10,"Error",896],[10,"Pluralizable",839],[1,"array"],[5,"Diff",847],[8,"Result",897],[10,"Serialize",866],[5,"SourceDbStorage",48],[10,"DependencyResolver",721]],"r":[[0,361],[1,361],[2,361],[3,859],[4,859],[5,859],[6,859],[7,859],[8,859],[9,859],[12,859],[13,859],[14,859],[15,859],[16,859],[18,859],[20,859],[21,859],[22,859],[23,859],[24,859],[25,859],[26,859],[27,859],[29,859],[30,859],[31,859],[32,859],[34,859],[35,859],[36,859],[39,859],[40,859],[41,859],[42,859],[43,859],[44,859],[45,859],[47,859],[175,877],[177,877],[178,877],[181,877],[184,877],[185,877],[186,877],[190,877],[194,877],[198,877],[202,877],[208,877],[212,877],[213,877],[214,877],[215,877],[229,877],[233,877],[237,877],[241,877],[251,877],[258,877],[262,877],[266,877],[270,877],[274,877],[275,877],[276,877],[277,877],[278,877],[279,877],[280,877],[281,877],[282,877],[283,877],[284,877],[285,877],[286,877],[287,877],[288,877],[289,877],[290,877],[291,877],[292,877],[293,877],[294,877],[295,877],[296,877],[297,877],[298,877],[299,877],[300,877],[301,877],[302,877],[303,877],[304,877],[305,877],[306,877],[307,877],[308,877],[309,877],[310,877],[311,877],[312,877],[313,877],[314,877],[315,877],[316,877],[317,877],[318,877],[319,877],[320,877],[321,877],[322,877],[323,877],[324,877],[325,877],[326,877],[327,877],[328,877],[329,877],[330,877],[331,877],[332,877],[333,877],[334,877],[335,877],[336,877],[337,877],[338,877],[339,877],[340,877],[341,877],[342,877],[343,877],[344,877],[345,877],[346,877],[347,877],[348,877],[349,877],[350,877],[351,877],[352,877],[353,877],[354,877],[355,877],[356,877],[357,877],[358,877],[359,877],[360,877],[361,883],[365,883],[366,883],[367,883],[368,883],[371,883],[372,883],[373,883],[374,883],[376,883],[377,883],[378,883],[379,883],[380,883],[381,883],[382,883],[383,883],[384,883],[385,883],[386,883],[387,883],[388,883],[389,883],[390,883],[391,883],[392,883],[393,883],[394,883],[395,883],[396,883],[397,883],[401,883],[402,883],[403,883],[407,883],[408,883],[409,883],[410,883],[411,883],[412,883],[416,883],[417,883],[421,883],[422,883],[426,883],[427,883],[428,883],[430,883],[431,883],[432,883],[433,883],[435,883],[436,883],[439,883],[440,883],[441,883],[442,883],[443,883],[444,883],[445,883],[446,883],[447,883],[448,883],[449,883],[450,883],[451,883],[452,883],[453,883],[454,883],[455,883],[456,883],[457,883],[458,883],[459,883],[460,883],[461,883],[462,883],[463,883],[464,883],[465,883],[466,883],[467,883],[468,883],[469,883],[470,883],[471,883],[472,883],[473,883],[474,883],[475,883],[476,883],[477,883],[478,883],[479,883],[480,883],[481,883],[482,883],[486,883],[487,883],[488,883],[489,883],[490,883],[491,883],[492,883],[493,883],[494,883],[495,883],[496,883],[497,883],[510,883],[511,883],[512,883],[513,883],[514,883],[515,883],[516,883],[517,883],[518,883],[519,883],[520,883],[524,883],[525,883],[526,883],[527,883],[528,883],[529,883],[530,883],[535,883],[536,883],[537,883],[538,883],[539,883],[540,883],[541,883],[542,883],[547,883],[548,883],[552,883],[553,883],[554,883],[555,883],[556,883],[557,883],[558,883],[559,883],[560,883],[562,883],[563,883],[564,883],[565,883],[566,883],[567,883],[571,883],[572,883],[573,883],[577,883],[578,883],[579,883],[580,883],[581,883],[582,883],[583,883],[584,883],[585,883],[586,883],[587,883],[588,883],[589,883],[590,883],[591,883],[592,883],[593,883],[594,883],[595,883],[596,883],[597,883],[598,883],[599,883],[600,883],[601,883],[602,883],[603,883],[604,883],[605,883],[606,883],[607,883],[608,883],[609,883],[610,883],[611,883],[612,883],[613,883],[614,883],[615,883],[616,883],[617,883],[618,883],[619,883],[620,883],[623,883],[624,883],[625,883],[626,883],[627,883],[628,883],[629,883],[630,883],[631,883],[632,883],[633,883],[634,883],[635,883],[636,883],[637,883],[638,883],[639,883],[640,883],[644,883],[645,883],[646,883],[647,883],[648,883],[649,883],[650,883],[651,883],[652,883],[656,883],[657,883],[661,883],[662,883],[663,883],[664,883],[665,883],[669,883],[670,883],[671,883]],"b":[[5,"impl-Add%3C%26T%3E-for-Span"],[6,"impl-Add-for-Span"],[7,"impl-Add%3COption%3CSpan%3E%3E-for-Span"],[8,"impl-Add%3COption%3C%26T%3E%3E-for-Span"],[379,"impl-AsRef%3Cstr%3E-for-Utf8Path"],[380,"impl-AsRef%3CUtf8Path%3E-for-Utf8Path"],[381,"impl-AsRef%3COsStr%3E-for-Utf8Path"],[382,"impl-AsRef%3CPath%3E-for-Utf8Path"],[383,"impl-AsRef%3CUtf8Path%3E-for-Utf8PathBuf"],[384,"impl-AsRef%3COsStr%3E-for-Utf8PathBuf"],[385,"impl-AsRef%3CPath%3E-for-Utf8PathBuf"],[386,"impl-AsRef%3Cstr%3E-for-Utf8PathBuf"],[387,"impl-AsRef%3Cstr%3E-for-Utf8Component%3C\'_%3E"],[388,"impl-AsRef%3COsStr%3E-for-Utf8Component%3C\'_%3E"],[389,"impl-AsRef%3CPath%3E-for-Utf8Component%3C\'_%3E"],[390,"impl-AsRef%3CUtf8Path%3E-for-Utf8Component%3C\'_%3E"],[440,"impl-PartialEq%3CCow%3C\'b,+OsStr%3E%3E-for-%26Utf8Path"],[441,"impl-PartialEq%3CPathBuf%3E-for-Utf8Path"],[442,"impl-PartialEq%3CCow%3C\'a,+OsStr%3E%3E-for-Utf8Path"],[443,"impl-PartialEq%3C%26OsStr%3E-for-Utf8Path"],[444,"impl-PartialEq%3COsStr%3E-for-Utf8Path"],[445,"impl-PartialEq%3COsStr%3E-for-%26Utf8Path"],[446,"impl-PartialEq-for-Utf8Path"],[447,"impl-PartialEq%3CUtf8PathBuf%3E-for-Utf8Path"],[448,"impl-PartialEq%3COsString%3E-for-Utf8Path"],[449,"impl-PartialEq%3CString%3E-for-%26Utf8Path"],[450,"impl-PartialEq%3CCow%3C\'b,+str%3E%3E-for-%26Utf8Path"],[451,"impl-PartialEq%3Cstr%3E-for-%26Utf8Path"],[452,"impl-PartialEq%3CString%3E-for-Utf8Path"],[453,"impl-PartialEq%3COsString%3E-for-%26Utf8Path"],[454,"impl-PartialEq%3C%26str%3E-for-Utf8Path"],[455,"impl-PartialEq%3Cstr%3E-for-Utf8Path"],[456,"impl-PartialEq%3CUtf8PathBuf%3E-for-%26Utf8Path"],[457,"impl-PartialEq%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8Path"],[458,"impl-PartialEq%3CCow%3C\'a,+Utf8Path%3E%3E-for-%26Utf8Path"],[459,"impl-PartialEq%3CPath%3E-for-Utf8Path"],[460,"impl-PartialEq%3CPathBuf%3E-for-%26Utf8Path"],[461,"impl-PartialEq%3CCow%3C\'b,+Path%3E%3E-for-%26Utf8Path"],[462,"impl-PartialEq%3CPath%3E-for-%26Utf8Path"],[463,"impl-PartialEq%3C%26Path%3E-for-Utf8Path"],[464,"impl-PartialEq%3CCow%3C\'a,+Path%3E%3E-for-Utf8Path"],[465,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-Utf8Path"],[466,"impl-PartialEq%3COsStr%3E-for-Utf8PathBuf"],[467,"impl-PartialEq%3CPathBuf%3E-for-Utf8PathBuf"],[468,"impl-PartialEq%3C%26Utf8Path%3E-for-Utf8PathBuf"],[469,"impl-PartialEq%3COsString%3E-for-Utf8PathBuf"],[470,"impl-PartialEq%3CCow%3C\'a,+str%3E%3E-for-Utf8PathBuf"],[471,"impl-PartialEq%3C%26str%3E-for-Utf8PathBuf"],[472,"impl-PartialEq%3Cstr%3E-for-Utf8PathBuf"],[473,"impl-PartialEq%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8PathBuf"],[474,"impl-PartialEq%3CPath%3E-for-Utf8PathBuf"],[475,"impl-PartialEq%3C%26Path%3E-for-Utf8PathBuf"],[476,"impl-PartialEq%3CCow%3C\'a,+OsStr%3E%3E-for-Utf8PathBuf"],[477,"impl-PartialEq%3CCow%3C\'a,+Path%3E%3E-for-Utf8PathBuf"],[478,"impl-PartialEq-for-Utf8PathBuf"],[479,"impl-PartialEq%3C%26OsStr%3E-for-Utf8PathBuf"],[480,"impl-PartialEq%3CUtf8Path%3E-for-Utf8PathBuf"],[481,"impl-PartialEq%3CString%3E-for-Utf8PathBuf"],[515,"impl-Debug-for-Utf8Path"],[516,"impl-Display-for-Utf8Path"],[517,"impl-Debug-for-Utf8PathBuf"],[518,"impl-Display-for-Utf8PathBuf"],[519,"impl-Display-for-Utf8Component%3C\'a%3E"],[520,"impl-Debug-for-Utf8Component%3C\'a%3E"],[526,"impl-From%3CString%3E-for-Utf8PathBuf"],[527,"impl-From%3C%26T%3E-for-Utf8PathBuf"],[528,"impl-From%3CBox%3CUtf8Path%3E%3E-for-Utf8PathBuf"],[529,"impl-From%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8PathBuf"],[578,"impl-PartialOrd%3COsStr%3E-for-%26Utf8Path"],[579,"impl-PartialOrd%3C%26OsStr%3E-for-Utf8Path"],[580,"impl-PartialOrd%3CCow%3C\'a,+Utf8Path%3E%3E-for-%26Utf8Path"],[581,"impl-PartialOrd%3CPath%3E-for-Utf8Path"],[582,"impl-PartialOrd%3CUtf8PathBuf%3E-for-Utf8Path"],[583,"impl-PartialOrd%3C%26Path%3E-for-Utf8Path"],[584,"impl-PartialOrd%3CCow%3C\'a,+Path%3E%3E-for-Utf8Path"],[585,"impl-PartialOrd%3CPathBuf%3E-for-Utf8Path"],[586,"impl-PartialOrd%3CPath%3E-for-%26Utf8Path"],[587,"impl-PartialOrd%3CCow%3C\'b,+Path%3E%3E-for-%26Utf8Path"],[588,"impl-PartialOrd%3CPathBuf%3E-for-%26Utf8Path"],[589,"impl-PartialOrd%3Cstr%3E-for-Utf8Path"],[590,"impl-PartialOrd%3C%26str%3E-for-Utf8Path"],[591,"impl-PartialOrd-for-Utf8Path"],[592,"impl-PartialOrd%3CString%3E-for-Utf8Path"],[593,"impl-PartialOrd%3COsString%3E-for-%26Utf8Path"],[594,"impl-PartialOrd%3CUtf8PathBuf%3E-for-%26Utf8Path"],[595,"impl-PartialOrd%3CCow%3C\'b,+OsStr%3E%3E-for-%26Utf8Path"],[596,"impl-PartialOrd%3Cstr%3E-for-%26Utf8Path"],[597,"impl-PartialOrd%3CCow%3C\'b,+str%3E%3E-for-%26Utf8Path"],[598,"impl-PartialOrd%3CString%3E-for-%26Utf8Path"],[599,"impl-PartialOrd%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8Path"],[600,"impl-PartialOrd%3COsString%3E-for-Utf8Path"],[601,"impl-PartialOrd%3COsStr%3E-for-Utf8Path"],[602,"impl-PartialOrd%3CCow%3C\'a,+OsStr%3E%3E-for-Utf8Path"],[603,"impl-PartialOrd%3CCow%3C\'a,+str%3E%3E-for-Utf8Path"],[604,"impl-PartialOrd%3COsStr%3E-for-Utf8PathBuf"],[605,"impl-PartialOrd%3CCow%3C\'a,+str%3E%3E-for-Utf8PathBuf"],[606,"impl-PartialOrd%3CCow%3C\'a,+Utf8Path%3E%3E-for-Utf8PathBuf"],[607,"impl-PartialOrd%3COsString%3E-for-Utf8PathBuf"],[608,"impl-PartialOrd%3CCow%3C\'a,+OsStr%3E%3E-for-Utf8PathBuf"],[609,"impl-PartialOrd%3C%26OsStr%3E-for-Utf8PathBuf"],[610,"impl-PartialOrd%3CPath%3E-for-Utf8PathBuf"],[611,"impl-PartialOrd%3C%26Utf8Path%3E-for-Utf8PathBuf"],[612,"impl-PartialOrd%3CUtf8Path%3E-for-Utf8PathBuf"],[613,"impl-PartialOrd-for-Utf8PathBuf"],[614,"impl-PartialOrd%3C%26Path%3E-for-Utf8PathBuf"],[615,"impl-PartialOrd%3CCow%3C\'a,+Path%3E%3E-for-Utf8PathBuf"],[616,"impl-PartialOrd%3CPathBuf%3E-for-Utf8PathBuf"],[617,"impl-PartialOrd%3C%26str%3E-for-Utf8PathBuf"],[618,"impl-PartialOrd%3CString%3E-for-Utf8PathBuf"],[619,"impl-PartialOrd%3Cstr%3E-for-Utf8PathBuf"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAIQCQQAAAAMABQAGAA0ACAAXAAcAIAACACQABQArAAwAOQAaAFUAEABuAAAAeQACAIQADQCTAAAAlQAaALEAAAC0AAEAtwABALsAEwDRABgA7gADAPYAAAD4AAQAAAESABgBAAAeAQUAJQEIAC8BDgBAAQMAUgEAAFgBCwBrAQEAcgEAAHgBAAB8AQsAiwEMAJwBEQCvAQIAswEEALkBRQAAAgAABAIJAA8CAwAXAgEAGwIAAB0CBgAqAgEAMgIAADoCAQA/AgIAQwIrAH8CBQCGAgIAigILAJgCBQChAgIApQIAAKgCEAC9AgAAwAJJABsDAAAeAygASQMCAFEDAgBWAwAAWAMDAA==","P":[[5,"T"],[6,""],[8,"T"],[14,""],[15,"T"],[16,""],[18,"__D"],[20,""],[23,"K"],[27,""],[30,"T"],[31,"S,E"],[32,"__H"],[34,"U"],[35,""],[39,"__S"],[40,""],[42,"T"],[43,"U,T"],[44,"U"],[45,""],[59,"T"],[75,""],[81,"QueryDb::DynDb,Query::Key,Query::Value"],[83,""],[101,"T"],[109,""],[123,"U"],[131,""],[140,"QueryDb::GroupStorage,Query::Storage"],[145,""],[149,"U,T"],[157,"U"],[165,""],[173,"T"],[194,""],[198,"T"],[202,""],[212,"K"],[228,""],[233,"T"],[237,"__H"],[241,"U"],[245,""],[252,"S"],[253,""],[254,"S"],[255,""],[258,"T"],[262,"U,T"],[266,"U"],[270,""],[285,"T"],[291,"FileId"],[292,""],[293,"FileId"],[295,"T"],[298,""],[303,"FileId"],[305,"K"],[317,"FileId"],[318,""],[320,"FileId"],[322,""],[323,"T"],[326,"FileId"],[327,"U"],[330,""],[333,"FileId"],[336,""],[338,"FileId"],[339,""],[340,"FileId"],[341,""],[343,"T"],[346,"U,T"],[349,"U"],[352,""],[355,"FileId"],[374,""],[394,"T"],[396,""],[397,"T"],[407,""],[416,"T"],[421,""],[430,"K"],[433,""],[437,"__D"],[438,""],[486,"K"],[510,""],[511,"P,I"],[512,""],[525,"T"],[526,""],[527,"T"],[528,""],[530,"T"],[534,""],[535,"P,I"],[536,""],[540,"H"],[542,"__H"],[547,"U"],[552,""],[639,"T"],[644,""],[650,"U,T"],[651,""],[652,"U,T"],[656,"U"],[661,""],[679,"T"],[683,""],[685,"T"],[687,""],[690,"K"],[694,""],[696,"T"],[698,"U"],[700,""],[701,"T"],[702,""],[704,"T"],[706,"U,T"],[708,"U"],[710,""],[736,"T"],[752,""],[759,"T"],[764,""],[771,"K"],[775,""],[777,"T"],[785,""],[786,"U"],[794,""],[807,"T"],[812,"U,T"],[820,"U"],[828,""],[838,"P"],[840,""],[848,"T"],[850,""],[851,"T"],[852,"U"],[853,""],[854,"T"],[855,""],[856,"U,T"],[857,"U"],[858,""]]}],["fe_compiler_test_utils",{"t":"IFSFIFFFFFIKONNHOHHQHNNNNNNNNNNNNNNNHNONNNNOHHHHHHHNNNNNNNNNNNNNNNNOOHNOOHHNNNNNNNHNNNOHNNNNNHMNNNNNNNNNNNNNNNNNHNNNNNNNOOHHHHHONNNNNNNNHHNN","n":["Backend","ContractHarness","DEFAULT_CALLER","ExecutionOutput","Executor","GasRecord","GasReporter","NumericAbiTokenBounds","Runtime","SolidityCompileError","StackState","ToBeBytes","abi","add_func_call_record","add_record","address","","address_array_token","address_token","assert_harness_gas_report","bool_token","borrow","","","","","","","borrow_mut","","","","","","","build_calldata","bytes_token","call_function","caller","capture_call","capture_call_raw_bytes","default","","description","encode_error_reason","encode_revert","encoded_div_or_mod_by_zero","encoded_invalid_abi_data","encoded_over_or_underflow","encoded_panic_assert","encoded_panic_out_of_bounds","events_emitted","expect_revert","expect_revert_reason","expect_success","fmt","","","","","from","","","","","","","gas_reporter","gas_used","get_2s_complement_for_negative","get_all","i_max","i_min","int_array_token","int_token","into","","","","","","","load_contract","new","","set_caller","size","string_token","test_call_returns","test_call_reverts","test_function","test_function_returns","test_function_reverts","to_2s_complement","to_be_bytes","to_string","","to_yul","try_from","","","","","","","try_into","","","","","","","tuple_token","type_id","","","","","","","u_max","u_min","uint_array_token","uint_token","uint_token_from_dec_str","validate_return","validate_revert","value","vzip","","","","","","","with_data","with_executor","with_executor_backend","with_functions","with_test_statements"],"q":[[0,"fe_compiler_test_utils"],[140,"ethabi::contract"],[141,"ethabi::token::token"],[142,"primitive_types"],[143,"alloc::vec"],[144,"core::option"],[145,"evm_core::error"],[146,"core::convert"],[147,"alloc::string"],[148,"core::fmt"],[149,"yultsur::yul"],[150,"core::result"],[151,"core::any"],[152,"core::ops::function"]],"i":"````````````dh0`1````1BjC`Cj3BlCf64325106`6666451```````633355100643251061`222``6432510`4362`66666`D`61575436217543621`754362133`````775436215``55","f":"``{{}b}`````````{df}{{{b{h}}{b{j}}{b{{n{l}}}}A`}Ab}{{{b{h}}{b{j}}A`}Ab}{{{b{j}}}Ad}{dAd}{{{b{{n{{b{j}}}}}}}l}{{{b{j}}}l}`{Afl}{b{{b{c}}}{}}000000{{{b{Ah}}}{{b{Ahc}}}{}}000000{{{b{d}}{b{j}}{b{{n{l}}}}}{{Al{Aj}}}}4{{{b{d}}{b{AhAn}}{b{j}}{b{{n{l}}}}}{{B`{l}}}}7{{{b{d}}{b{AhAn}}{b{j}}{b{{n{l}}}}}{{Bh{{Bd{Bb{Al{Aj}}}}Bf}}}}{{{b{d}}{b{AhAn}}{Al{Aj}}}{{Bh{{Bd{Bb{Al{Aj}}}}Bf}}}}{{}Bj}{{}h}{BlBn}{{{b{j}}}{{Al{Aj}}}}{{{b{j}}{b{{n{l}}}}}{{Al{Aj}}}}{{}{{Al{Aj}}}}0000{{{b{d}}An{b{{n{{Bd{{b{j}}{b{{n{l}}}}}}}}}}}Ab}{C`C`}{{C`{b{j}}}C`}1{{{b{h}}{b{AhCb}}}Cd}0{{{b{Bl}}{b{AhCb}}}Cd}{{{b{Cf}}{b{AhCb}}}Cd}0{cc{}}000000{dh}{BlA`}{ChCh}{{}{{Cl{Cj}}}}{Cjl}0{{{b{{n{Cn}}}}}l}{Cnl}{{}c{}}000000{{Ad{b{j}}{b{j}}}d}{{}Bj}{{Bb{Al{Aj}}}C`}{{{b{Ahd}}Ad}Ab}{CjA`}{{{b{j}}}l}{{{b{d}}{b{AhAn}}{Al{Aj}}{b{{n{Aj}}}}}Ab}0{{{b{d}}{b{AhAn}}{b{j}}{b{{n{l}}}}{B`{{b{l}}}}}Ab}{{{b{d}}{b{AhAn}}{b{j}}{b{{n{l}}}}{b{{n{Aj}}}}}Ab}0{CnCh}{{{b{D`}}}{{Cl{Aj}}}}{bBn}0{{{b{Bj}}}Db}{c{{Dd{e}}}{}{}}000000{{}{{Dd{c}}}{}}000000{{{b{{n{l}}}}}l}{bDf}000000{Cjl}0{{{b{{n{A`}}}}}l}{A`l}>{{{Bh{{Bd{Bb{Al{Aj}}}}Bf}}{b{{n{Aj}}}}}Ab}0{dCh}{{}c{}}000000{{Bj{Al{Dh}}}Bj}{{{b{Dj}}}Ab}{{Dl{b{Dj}}}Ab}{{Bj{Al{Dn}}}Bj}0","D":"Bn","p":[[1,"reference",null,null,1],[5,"ContractHarness",0],[5,"Contract",140],[5,"GasReporter",0],[1,"str"],[6,"Token",141],[1,"slice"],[1,"u64"],[1,"unit"],[5,"H160",142],[1,"bool"],[0,"mut"],[1,"u8"],[5,"Vec",143],[8,"Executor",0],[6,"Option",144,null,1],[6,"ExitReason",145],[1,"tuple",null,null,1],[6,"Infallible",146],[6,"Capture",145],[5,"Runtime",0],[5,"GasRecord",0],[5,"String",147],[5,"ExecutionOutput",0],[5,"Formatter",148],[8,"Result",148],[5,"SolidityCompileError",0],[5,"U256",142],[5,"NumericAbiTokenBounds",0],[1,"array"],[1,"i64"],[10,"ToBeBytes",0],[5,"Object",149],[6,"Result",150,null,1],[5,"TypeId",151],[5,"Data",149],[10,"Fn",152],[8,"Backend",0],[6,"Statement",149]],"r":[],"b":[[55,"impl-Debug-for-GasReporter"],[56,"impl-Display-for-GasReporter"],[58,"impl-Display-for-SolidityCompileError"],[59,"impl-Debug-for-SolidityCompileError"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAHUABwAAADQAOAAEAEQAAQBHAAQAUwAAAFYACwBjACcA","P":[[21,"T"],[35,""],[60,"T"],[67,""],[75,"U"],[82,""],[98,"U,T"],[105,"U"],[112,""],[128,"V"],[135,""]]}],["fe_compiler_tests",{"t":"","n":[],"q":[],"i":"","f":"","D":"`","p":[],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAAAEAAAAAAA","P":[]}],["fe_compiler_tests_legacy",{"t":"","n":[],"q":[],"i":"","f":"","D":"`","p":[],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAAAEAAAAAAA","P":[]}],["fe_driver",{"t":"KFFFFNNNNNNNNNHHMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNMNHHNNNNNNNNNNONHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNO","n":["CodegenDb","CompileError","CompiledContract","CompiledModule","Db","all_impls","borrow","","","","borrow_mut","","","","check_ingot","check_single_file","codegen_abi_contract","","codegen_abi_event","","codegen_abi_function","","codegen_abi_function_argument_maximum_size","","codegen_abi_function_return_maximum_size","","codegen_abi_module_events","","codegen_abi_type","","codegen_abi_type_maximum_size","","codegen_abi_type_minimum_size","","codegen_constant_string_symbol_name","","codegen_contract_deployer_symbol_name","","codegen_contract_symbol_name","","codegen_function_symbol_name","","codegen_legalized_body","","codegen_legalized_signature","","codegen_legalized_type","","compile_ingot","compile_single_file","contract_all_fields","contract_all_functions","contract_call_function","contract_dependency_graph","contract_field_map","contract_field_type","contract_function_map","contract_init_function","contract_public_function_map","contract_runtime_dependency_graph","contracts","default","dump_mir_single_file","enum_all_functions","enum_all_variants","enum_dependency_graph","enum_function_map","enum_variant_kind","enum_variant_map","file_content","file_line_starts","file_name","fmt","from","","","","function_body","function_dependency_graph","function_signature","function_sigs","impl_all_functions","impl_for","impl_function_map","ingot_external_ingots","ingot_files","ingot_modules","ingot_root_module","intern_attribute","intern_contract","intern_contract_field","intern_enum","intern_enum_variant","intern_file","intern_function","intern_function_sig","intern_impl","intern_ingot","intern_module","intern_module_const","intern_struct","intern_struct_field","intern_trait","intern_type","intern_type_alias","into","","","","json_abi","lookup_intern_attribute","lookup_intern_contract","lookup_intern_contract_field","lookup_intern_enum","lookup_intern_enum_variant","lookup_intern_file","lookup_intern_function","lookup_intern_function_sig","lookup_intern_impl","lookup_intern_ingot","lookup_intern_module","lookup_intern_module_const","lookup_intern_struct","lookup_intern_struct_field","lookup_intern_trait","lookup_intern_type","lookup_intern_type_alias","lookup_mir_intern_const","lookup_mir_intern_function","lookup_mir_intern_type","lowered_ast","mir_intern_const","mir_intern_function","mir_intern_type","mir_lower_contract_all_functions","mir_lower_enum_all_functions","mir_lower_module_all_functions","mir_lower_struct_all_functions","mir_lowered_constant","mir_lowered_func_body","mir_lowered_func_signature","mir_lowered_monomorphized_func_signature","mir_lowered_pseudo_monomorphized_func_signature","mir_lowered_type","module_all_impls","module_all_items","module_constant_type","module_constant_value","module_constants","module_contracts","module_file_path","module_impl_map","module_is_incomplete","module_item_map","module_parent_module","module_parse","module_structs","module_submodules","module_tests","module_used_item_map","origin","root_ingot","set_file_content","set_file_content_with_durability","set_ingot_external_ingots","set_ingot_external_ingots_with_durability","set_ingot_files","set_ingot_files_with_durability","set_root_ingot","set_root_ingot_with_durability","src_ast","struct_all_fields","struct_all_functions","struct_dependency_graph","struct_field_map","struct_field_type","struct_function_map","trait_all_functions","trait_function_map","trait_is_implemented_for","try_from","","","","try_into","","","","type_alias_type","type_id","","","","upcast","","","upcast_mut","","","vzip","","","","yul"],"q":[[0,"fe_driver"],[204,"fe_analyzer::namespace::types"],[205,"fe_analyzer::namespace::items"],[206,"alloc::rc"],[207,"fe_codegen::db"],[208,"fe_common::utils::files"],[209,"fe_common::diagnostics"],[210,"alloc::vec"],[211,"fe_abi::contract"],[212,"fe_mir::ir::types"],[213,"fe_abi::event"],[214,"fe_mir::ir::function"],[215,"fe_abi::function"],[216,"fe_abi::types"],[217,"alloc::string"],[218,"core::result"],[219,"core::option"],[220,"fe_analyzer::context"],[221,"smol_str"],[222,"indexmap::map"],[223,"fe_analyzer::errors"],[224,"fe_common::files"],[225,"core::fmt"],[226,"fe_mir::ir::constant"],[227,"alloc::collections::btree::map"],[228,"fe_parser::ast"],[229,"fe_common::span"],[230,"salsa::durability"],[231,"core::any"],[232,"fe_mir::db"],[233,"fe_common::db"],[234,"fe_analyzer::db"]],"i":"`````nCdHlCf32103``Ah4040404040404040404040404040404``444444444434`444444444132144444444444444444444444444444321424444444444444444444434444444444444444444444444444424444444443444444444321432144321444444432142","f":"`````{{bd}{{j{{h{f}}}}}}{b{{b{c}}}{}}000{{{b{l}}}{{b{lc}}}{}}000{{{b{ln}}{b{A`}}}{{Ad{Ab}}}}{{{b{ln}}{b{Af}}{b{Af}}}{{Ad{Ab}}}}{{{b{Ah}}Aj}Al}{{bAj}Al}{{{b{Ah}}An}B`}{{bAn}B`}{{{b{Ah}}Bb}Bd}{{bBb}Bd}{{{b{Ah}}Bb}Bf}{{bBb}Bf}10{{{b{Ah}}Bh}{{Ad{B`}}}}{{bBh}{{Ad{B`}}}}{{{b{Ah}}An}Bj}{{bAn}Bj}{{{b{Ah}}An}Bf}{{bAn}Bf}10{{{b{Ah}}Bl}{{j{Bl}}}}{{bBl}{{j{Bl}}}}{{{b{Ah}}Aj}{{j{Bl}}}}{{bAj}{{j{Bl}}}}10{{{b{Ah}}Bb}{{j{Bl}}}}{{bBb}{{j{Bl}}}}{{{b{Ah}}Bb}{{j{Bn}}}}{{bBb}{{j{Bn}}}}{{{b{Ah}}Bb}{{j{C`}}}}{{bBb}{{j{C`}}}}{{{b{Ah}}An}An}{{bAn}An}{{{b{ln}}{b{A`}}CbCbCb}{{Ch{CdCf}}}}{{{b{ln}}{b{Af}}{b{Af}}CbCbCb}{{Ch{CdCf}}}}{{bAj}{{j{{h{Cj}}}}}}{{bAj}{{j{{h{Cl}}}}}}{{bAj}{{D`{{Cn{Cl}}}}}}{{bAj}Db}{{bAj}{{D`{{j{{Df{DdCj}}}}}}}}{{bCj}{{D`{{Ch{dDh}}}}}}{{bAj}{{D`{{j{{Df{DdCl}}}}}}}}4{{bAj}{{j{{Df{DdCl}}}}}}4{CdDf}{{}n}{{{b{ln}}{b{Af}}{b{Af}}}{{Ch{BlCf}}}}{{bDj}{{j{{h{Cl}}}}}}{{bDj}{{j{{h{Dl}}}}}}{{bDj}{{D`{Db}}}}{{bDj}{{D`{{j{{Df{DdCl}}}}}}}}{{bDl}{{D`{{Ch{DnDh}}}}}}{{bDj}{{D`{{j{{Df{DdDl}}}}}}}}{{bE`}{{j{Af}}}}{{bE`}{{j{{h{Bf}}}}}}{{bE`}Dd}{{{b{Cf}}{b{lEb}}}Ed}{cc{}}000{{bCl}{{D`{{j{Ef}}}}}}{{bCl}Db}{{bEh}{{D`{{j{Ej}}}}}}{{bdDd}{{j{{h{Eh}}}}}}{{bf}{{j{{h{Cl}}}}}}{{bdEl}{{Cn{f}}}}{{bf}{{D`{{j{{Df{DdCl}}}}}}}}{{bEn}{{j{{Df{DdEn}}}}}}{{bEn}{{j{{h{E`}}}}}}{{bEn}{{j{{h{Bh}}}}}}{{bEn}{{Cn{Bh}}}}{{b{j{F`}}}Fb}{{b{j{Fd}}}Aj}{{b{j{Ff}}}Cj}{{b{j{Fh}}}Dj}{{b{j{Fj}}}Dl}{{bFl}E`}{{b{j{Fn}}}Cl}{{b{j{G`}}}Eh}{{b{j{Gb}}}f}{{b{j{Gd}}}En}{{b{j{Gf}}}Bh}{{b{j{Gh}}}Gj}{{b{j{Gl}}}Gn}{{b{j{H`}}}Hb}{{b{j{Hd}}}El}{{bHf}d}{{b{j{Hh}}}Hj}{{}c{}}000{HlBl}{{bFb}{{j{F`}}}}{{bAj}{{j{Fd}}}}{{bCj}{{j{Ff}}}}{{bDj}{{j{Fh}}}}{{bDl}{{j{Fj}}}}{{bE`}Fl}{{bCl}{{j{Fn}}}}{{bEh}{{j{G`}}}}{{bf}{{j{Gb}}}}{{bEn}{{j{Gd}}}}{{bBh}{{j{Gf}}}}{{bGj}{{j{Gh}}}}{{bGn}{{j{Gl}}}}{{bHb}{{j{H`}}}}{{bEl}{{j{Hd}}}}{{bd}Hf}{{bHj}{{j{Hh}}}}{{bHn}{{j{I`}}}}{{bBb}{{j{C`}}}}{{bAn}{{j{Ib}}}}{CdBl}{{b{j{I`}}}Hn}{{b{j{C`}}}Bb}{{b{j{Ib}}}An}{{bAj}{{j{{Ad{Bb}}}}}}{{bDj}{{j{{Ad{Bb}}}}}}{{bBh}{{j{{Ad{Bb}}}}}}{{bGn}{{j{{Ad{Bb}}}}}}{{bGj}Hn}{{bBb}{{j{Bn}}}}{{bCl}Bb}{{bCl{Id{Ddd}}}Bb}1{{bd}An}{{bBh}{{D`{{j{{h{f}}}}}}}}{{bBh}{{j{{h{If}}}}}}{{bGj}{{D`{{Ch{dDh}}}}}}{{bGj}{{D`{{Ch{IhIj}}}}}}{{bBh}{{j{{Ad{Gj}}}}}}{{bBh}{{j{{h{Aj}}}}}}{{bBh}Dd}{{bBh}{{D`{{j{{Df{{Il{Eld}}f}}}}}}}}{{bBh}Cb}{{bBh}{{D`{{j{{Df{DdIf}}}}}}}}{{bBh}{{Cn{Bh}}}}{{bBh}{{D`{{j{In}}}}}}{{bBh}{{j{{h{Gn}}}}}}{{bBh}{{j{{h{Bh}}}}}}{{bBh}{{Ad{Cl}}}}{{bBh}{{D`{{j{{Df{Dd{Il{J`If}}}}}}}}}}{HlAj}{bEn}{{{b{l}}E`{j{Af}}}Jb}{{{b{l}}E`{j{Af}}Jd}Jb}{{{b{l}}En{j{{Df{DdEn}}}}}Jb}{{{b{l}}En{j{{Df{DdEn}}}}Jd}Jb}{{{b{l}}En{j{{h{E`}}}}}Jb}{{{b{l}}En{j{{h{E`}}}}Jd}Jb}{{{b{l}}En}Jb}{{{b{l}}EnJd}Jb}{CdBl}{{bGn}{{j{{h{Hb}}}}}}{{bGn}{{j{{h{Cl}}}}}}{{bGn}{{D`{Db}}}}{{bGn}{{D`{{j{{Df{DdHb}}}}}}}}{{bHb}{{D`{{Ch{dDh}}}}}}{{bGn}{{D`{{j{{Df{DdCl}}}}}}}}{{bEl}{{j{{h{Eh}}}}}}{{bEl}{{D`{{j{{Df{DdEh}}}}}}}}{{bEld}Cb}{c{{Ch{e}}}{}{}}000{{}{{Ch{c}}}{}}000{{bHj}{{D`{{Ch{dDh}}}}}}{bJf}000{{{b{n}}}{{b{Jh}}}}{{{b{n}}}{{b{Jj}}}}{{{b{n}}}{{b{Jl}}}}{{{b{ln}}}{{b{lJh}}}}{{{b{ln}}}{{b{lJj}}}}{{{b{ln}}}{{b{lJl}}}}{{}c{}}000{HlBl}","D":"Ah","p":[[1,"reference",null,null,1],[5,"TypeId",204],[5,"ImplId",205],[1,"slice"],[5,"Rc",206,null,1],[0,"mut"],[5,"Db",0,207],[5,"BuildFiles",208],[5,"Diagnostic",209],[5,"Vec",210],[1,"str"],[10,"CodegenDb",0,207],[5,"ContractId",205],[5,"AbiContract",211],[5,"TypeId",212],[5,"AbiEvent",213],[5,"FunctionId",214],[5,"AbiFunction",215],[1,"usize"],[5,"ModuleId",205],[6,"AbiType",216],[5,"String",217],[5,"FunctionBody",214],[5,"FunctionSignature",214],[1,"bool"],[5,"CompiledModule",0],[5,"CompileError",0],[6,"Result",218,null,1],[5,"ContractFieldId",205],[5,"FunctionId",205],[6,"Option",219,null,1],[5,"Analysis",220],[5,"DepGraphWrapper",205],[5,"SmolStr",221],[5,"IndexMap",222],[5,"TypeError",223],[5,"EnumId",205],[5,"EnumVariantId",205],[6,"EnumVariantKind",205],[5,"SourceFileId",224],[5,"Formatter",225],[8,"Result",225],[5,"FunctionBody",220],[5,"FunctionSigId",205],[5,"FunctionSignature",204],[5,"TraitId",205],[5,"IngotId",205],[5,"Attribute",205],[5,"AttributeId",205],[5,"Contract",205],[5,"ContractField",205],[5,"Enum",205],[5,"EnumVariant",205],[5,"File",224],[5,"Function",205],[5,"FunctionSig",205],[5,"Impl",205],[5,"Ingot",205],[5,"Module",205],[5,"ModuleConstant",205],[5,"ModuleConstantId",205],[5,"Struct",205],[5,"StructId",205],[5,"StructField",205],[5,"StructFieldId",205],[5,"Trait",205],[6,"Type",204],[5,"TypeAlias",205],[5,"TypeAliasId",205],[5,"CompiledContract",0],[5,"ConstantId",226],[5,"Constant",226],[5,"Type",212],[5,"BTreeMap",227],[6,"Item",205],[6,"Constant",220],[5,"ConstEvalError",223],[1,"tuple",null,null,1],[5,"Module",228],[5,"Span",229],[1,"unit"],[5,"Durability",230],[5,"TypeId",231],[10,"MirDb",232],[10,"SourceDb",233],[10,"AnalyzerDb",234]],"r":[[0,207],[4,207],[5,207],[9,207],[13,207],[16,207],[17,207],[18,207],[19,207],[20,207],[21,207],[22,207],[23,207],[24,207],[25,207],[26,207],[27,207],[28,207],[29,207],[30,207],[31,207],[32,207],[33,207],[34,207],[35,207],[36,207],[37,207],[38,207],[39,207],[40,207],[41,207],[42,207],[43,207],[44,207],[45,207],[46,207],[47,207],[50,207],[51,207],[52,207],[53,207],[54,207],[55,207],[56,207],[57,207],[58,207],[59,207],[61,207],[63,207],[64,207],[65,207],[66,207],[67,207],[68,207],[69,207],[70,207],[71,207],[76,207],[77,207],[78,207],[79,207],[80,207],[81,207],[82,207],[83,207],[84,207],[85,207],[86,207],[87,207],[88,207],[89,207],[90,207],[91,207],[92,207],[93,207],[94,207],[95,207],[96,207],[97,207],[98,207],[99,207],[100,207],[101,207],[102,207],[103,207],[104,207],[108,207],[110,207],[111,207],[112,207],[113,207],[114,207],[115,207],[116,207],[117,207],[118,207],[119,207],[120,207],[121,207],[122,207],[123,207],[124,207],[125,207],[126,207],[127,207],[128,207],[129,207],[131,207],[132,207],[133,207],[134,207],[135,207],[136,207],[137,207],[138,207],[139,207],[140,207],[141,207],[142,207],[143,207],[144,207],[145,207],[146,207],[147,207],[148,207],[149,207],[150,207],[151,207],[152,207],[153,207],[154,207],[155,207],[156,207],[157,207],[158,207],[159,207],[161,207],[162,207],[163,207],[164,207],[165,207],[166,207],[167,207],[168,207],[169,207],[171,207],[172,207],[173,207],[174,207],[175,207],[176,207],[177,207],[178,207],[179,207],[183,207],[187,207],[188,207],[192,207],[193,207],[194,207],[195,207],[196,207],[197,207],[198,207],[202,207]],"b":[[193,"impl-Upcast%3Cdyn+MirDb%3E-for-Db"],[194,"impl-Upcast%3Cdyn+SourceDb%3E-for-Db"],[195,"impl-Upcast%3Cdyn+AnalyzerDb%3E-for-Db"],[196,"impl-UpcastMut%3Cdyn+MirDb%3E-for-Db"],[197,"impl-UpcastMut%3Cdyn+SourceDb%3E-for-Db"],[198,"impl-UpcastMut%3Cdyn+AnalyzerDb%3E-for-Db"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAMAABgAAAAIABQArADIADABAAAkATgAbAG4AXgA=","P":[[6,"T"],[14,""],[73,"T"],[77,""],[105,"U"],[109,""],[180,"U,T"],[184,"U"],[188,""],[199,"V"],[203,""]]}],["fe_library",{"t":"SEHH","n":["STD","include_dir","static_dir_files","std_src_files"],"q":[[0,"fe_library"],[4,"include_dir::dir"],[5,"alloc::vec"]],"i":"````","f":"{{}b}`{{{d{b}}}{{j{{h{{d{f}}{d{f}}}}}}}}{{}{{j{{h{{d{f}}{d{f}}}}}}}}","D":"`","p":[[5,"Dir",4],[1,"reference",null,null,1],[1,"str"],[1,"tuple",null,null,1],[5,"Vec",5]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAQAEAAAAAAAAQACAAMABAA=","P":[]}],["fe_mir",{"t":"CCCCCEEEECCCCFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFFIFNNNNNNONNNNNNNNNNNNNNNNNNONNNNNNNNNNNONNNNNNNNNNNNPPPFGNNNNNNNNNNNNNNNNNNNNNNNNNNNNKFFFFFFFFFFFFFFFFFFFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNOMNOMNONNMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNOMNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHEEEEEEEEEEFEEEEECCCCNNNNNCNNNNNNNNNCNOCNNONNNNCCFINNNNNNNNNNNNNNNNNNFNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPPFGPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNPFFGPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONNNNNNNNNNONNNOFPFFFFGPPNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNONONOONNNNONONNNOOONNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNPPPPPPPPPPGPPPPPIPPPGPPPGPPPPPPPGPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPFIGPPPPGGPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPFPGPPIIPPGPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPFPPPFFFPPPPPPPPFPPPFPFFFGPPPPPPPNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOONNOOOOOOONNNNNNOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNOOPGPPFPPPPGPINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONOONNONNNNNNNNNNNNONNNNNOOOOOOOOOOOKMN","n":["analysis","db","graphviz","ir","pretty_print","ControlFlowGraph","DomTree","LoopTree","PostDomTree","cfg","domtree","loop_tree","post_domtree","CfgPostOrder","ControlFlowGraph","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","compute","entry","eq","equivalent","","","","fmt","from","","into","","into_iter","next","post_order","preds","succs","to_owned","try_from","","try_into","","type_id","","DFSet","DomTree","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","compute","compute_df","default","dominates","fmt","","from","","frontier_num","frontiers","idom","into","","is_reachable","rpo","strictly_dominates","to_owned","try_from","","try_into","","type_id","","BlocksInLoopPostOrder","Loop","LoopId","LoopTree","borrow","","","borrow_mut","","","children","clone","","clone_into","","clone_to_uninit","","compute","default","eq","equivalent","","","","fmt","","from","","","header","into","","","into_iter","is_block_in_loop","iter_blocks_post_order","loop_header","loop_num","loop_of_block","loops","next","parent","parent_loop","to_owned","","try_from","","","try_into","","","type_id","","","Block","DummyEntry","DummyExit","PostDomTree","PostIDom","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","compute","eq","equivalent","","","","fmt","","from","","into","","is_reachable","post_idom","to_owned","try_from","","try_into","","type_id","","MirDb","MirDbGroupStorage__","MirDbStorage","MirInternConstLookupQuery","MirInternConstQuery","MirInternFunctionLookupQuery","MirInternFunctionQuery","MirInternTypeLookupQuery","MirInternTypeQuery","MirLowerContractAllFunctionsQuery","MirLowerEnumAllFunctionsQuery","MirLowerModuleAllFunctionsQuery","MirLowerStructAllFunctionsQuery","MirLoweredConstantQuery","MirLoweredFuncBodyQuery","MirLoweredFuncSignatureQuery","MirLoweredMonomorphizedFuncSignatureQuery","MirLoweredPseudoMonomorphizedFuncSignatureQuery","MirLoweredTypeQuery","NewDb","all_impls","borrow","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","contract_all_fields","contract_all_functions","contract_call_function","contract_dependency_graph","contract_field_map","contract_field_type","contract_function_map","contract_init_function","contract_public_function_map","contract_runtime_dependency_graph","default","","","","","","","","","","","","","","","","","enum_all_functions","enum_all_variants","enum_dependency_graph","enum_function_map","enum_variant_kind","enum_variant_map","execute","","","","","","","","","","file_content","file_line_starts","file_name","fmt","","","","","","","","","","","","","","","","fmt_index","","for_each_query","","from","","","","","","","","","","","","","","","","","","","function_body","function_dependency_graph","function_signature","function_sigs","group_storage","","","impl_all_functions","impl_for","impl_function_map","in_db","","","","","","","","","","","","","","","","in_db_mut","","","","","","","","","","","","","","","","ingot_external_ingots","ingot_files","ingot_modules","ingot_root_module","intern_attribute","intern_contract","intern_contract_field","intern_enum","intern_enum_variant","intern_file","intern_function","intern_function_sig","intern_impl","intern_ingot","intern_module","intern_module_const","intern_struct","intern_struct_field","intern_trait","intern_type","intern_type_alias","into","","","","","","","","","","","","","","","","","","","lookup_intern_attribute","lookup_intern_contract","lookup_intern_contract_field","lookup_intern_enum","lookup_intern_enum_variant","lookup_intern_file","lookup_intern_function","lookup_intern_function_sig","lookup_intern_impl","lookup_intern_ingot","lookup_intern_module","lookup_intern_module_const","lookup_intern_struct","lookup_intern_struct_field","lookup_intern_trait","lookup_intern_type","lookup_intern_type_alias","lookup_mir_intern_const","","","lookup_mir_intern_function","","","lookup_mir_intern_type","","","maybe_changed_since","","mir_intern_const","","","mir_intern_function","","","mir_intern_type","","","mir_lower_contract_all_functions","","","mir_lower_enum_all_functions","","","mir_lower_module_all_functions","","","mir_lower_struct_all_functions","","","mir_lowered_constant","","","mir_lowered_func_body","","","mir_lowered_func_signature","","","mir_lowered_monomorphized_func_signature","","","mir_lowered_pseudo_monomorphized_func_signature","","","mir_lowered_type","","","module_all_impls","module_all_items","module_constant_type","module_constant_value","module_constants","module_contracts","module_file_path","module_impl_map","module_is_incomplete","module_item_map","module_parent_module","module_parse","module_structs","module_submodules","module_tests","module_used_item_map","new","ops_database","ops_salsa_runtime","ops_salsa_runtime_mut","query_storage","","","","","","","","","","","","","","","","root_ingot","set_file_content","set_file_content_with_durability","set_ingot_external_ingots","set_ingot_external_ingots_with_durability","set_ingot_files","set_ingot_files_with_durability","set_root_ingot","set_root_ingot_with_durability","struct_all_fields","struct_all_functions","struct_dependency_graph","struct_field_map","struct_field_type","struct_function_map","trait_all_functions","trait_function_map","trait_is_implemented_for","try_from","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","type_alias_type","type_id","","","","","","","","","","","","","","","","","","","upcast","","upcast_mut","","write_mir_graphs","BasicBlock","BasicBlockId","Constant","ConstantId","FunctionBody","FunctionId","FunctionParam","FunctionSignature","Inst","InstId","SourceInfo","Type","TypeId","TypeKind","Value","ValueId","basic_block","body_builder","body_cursor","body_order","borrow","borrow_mut","clone","clone_into","clone_to_uninit","constant","dummy","eq","equivalent","","","","fmt","from","","function","hash","id","inst","into","is_dummy","span","to_owned","try_from","try_into","type_id","types","value","BasicBlock","BasicBlockId","borrow","borrow_mut","clone","clone_into","clone_to_uninit","eq","equivalent","","","","fmt","from","hash","into","to_owned","try_from","try_into","type_id","BodyBuilder","abi_encode","add","aggregate_access","aggregate_construct","bind","bit_and","bit_or","bit_xor","body","borrow","borrow_mut","branch","build","call","create","create2","current_block","declare","div","emit","eq","fmt","from","func_id","ge","gt","inst_data","inst_result","into","inv","is_block_terminated","is_current_block_terminated","jump","keccak256","le","load","logical_and","logical_or","lt","make_block","make_constant","make_imm","make_imm_from_bool","make_unit","make_value","map_access","map_result","mem_copy","modulo","move_to_block","move_to_block_top","mul","ne","neg","new","nop","not","pow","primitive_cast","remove_inst","ret","revert","shl","shr","store_func_arg","sub","switch","try_from","try_into","type_id","untag_cast","value_data","value_ty","yul_intrinsic","BlockBottom","BlockTop","BodyCursor","CursorLocation","Inst","NoWhere","back","body","body_mut","borrow","","borrow_mut","","clone","clone_into","clone_to_uninit","eq","equivalent","","","","expect_block","expect_inst","fmt","from","","insert_block","insert_inst","into","","loc","map_result","new","new_at_entry","next_block","next_loc","prev_block","prev_loc","proceed","remove_block","remove_inst","set_loc","set_to_entry","store_and_insert_block","store_and_insert_inst","to_owned","try_from","","try_into","","type_id","","BodyOrder","append_block","append_inst","block_num","borrow","borrow_mut","clone","clone_into","clone_to_uninit","entry","eq","equivalent","","","","first_inst","fmt","from","insert_block_after_block","insert_block_before_block","insert_inst_after","insert_inst_before_inst","inst_block","into","is_block_empty","is_block_inserted","is_inst_inserted","is_terminated","iter_block","iter_inst","last_block","last_inst","new","next_block","next_inst","prepend_inst","prev_block","prev_inst","remove_block","remove_inst","terminator","to_owned","try_from","try_into","type_id","Bool","Constant","ConstantId","ConstantValue","Immediate","Str","as_intern_id","borrow","","","borrow_mut","","","clone","","","clone_into","","","clone_to_uninit","","","data","eq","","","equivalent","","","","","","","","","","","","fmt","","","from","","","","from_intern_id","hash","","","into","","","module_id","name","source","to_owned","","","try_from","","","try_into","","","ty","","type_id","","","value","BodyDataStore","Export","FunctionBody","FunctionId","FunctionParam","FunctionSignature","Linkage","Private","Public","analyzer_func","analyzer_func_id","as_intern_id","body","borrow","","","","","","borrow_mut","","","","","","branch_info","clone","","","","","","clone_into","","","","","","clone_to_uninit","","","","","","cmp","compare","debug_name","default","eq","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","fid","fmt","","","","","","from","","","","","","from_intern_id","func_args","func_args_mut","hash","","","","inst_data","inst_data_mut","inst_result","into","","","","","","is_contract_init","is_exported","is_nop","is_terminator","linkage","","local_name","locals","locals_mut","map_result","module","module_id","name","","new","order","params","partial_cmp","remove_inst_result","replace_inst","replace_value","resolved_generics","return_type","","returns_aggregate","rewrite_branch_dest","signature","source","","store","store_block","store_inst","store_value","to_owned","","","","","","try_from","","","","","","try_into","","","","","","ty","type_id","","","","","","type_suffix","value_data","value_data_mut","value_ty","values","values_mut","AbiEncode","Add","","Addmod","Address","AggregateAccess","AggregateConstruct","And","Balance","Basefee","BinOp","Binary","Bind","BitAnd","BitOr","BitXor","BlockIter","Blockhash","Branch","","BranchInfo","Byte","Call","","CallType","Callcode","Calldatacopy","Calldataload","Calldatasize","Caller","Callvalue","Cast","CastKind","Chain","","","","","Chainid","Codecopy","Codesize","Coinbase","Create","","Create2","","Declare","Delegatecall","Div","","Emit","Eq","","Exp","Extcodecopy","Extcodehash","Extcodesize","External","Gas","Gaslimit","Gasprice","Ge","Gt","","Inst","InstId","InstKind","Internal","Inv","Invalid","Iszero","IterBase","IterMutBase","Jump","","Keccak256","","Le","Load","Log0","Log1","Log2","Log3","Log4","LogicalAnd","LogicalOr","Lt","","MapAccess","MemCopy","Mload","Mod","","Msize","Mstore","Mstore8","Mul","","Mulmod","Ne","Neg","Nop","Not","","NotBranch","Number","One","","","","","Or","Origin","Pc","Pop","Pow","Prevrandao","Primitive","Return","","Returndatacopy","Returndatasize","Revert","","Sar","Sdiv","Selfbalance","Selfdestruct","Sgt","Shl","","Shr","","Signextend","Slice","","","","","Sload","Slt","Smod","Sstore","Staticcall","Stop","Sub","","Switch","","SwitchTable","Timestamp","UnOp","Unary","Untag","ValueIter","ValueIterMut","Xor","YulIntrinsic","YulIntrinsicOp","Zero","","","","","add_arm","args","args_mut","binary","block_iter","borrow","","","","","","","","","","","borrow_mut","","","","","","","","","","","branch_info","cjk_compat_variants","clone","","","","","","","","clone_into","","","","","","","","clone_to_uninit","","","","","","","","default","eq","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fmt","","","","","","","","","","","","from","","","","","","","","","","","","hash","","","","","","","","into","","","","","","","","","","","into_iter","","intrinsic","is_empty","is_not_a_branch","is_terminator","","iter","kind","len","new","next","","nfc","nfd","nfkc","nfkd","nop","pretty_print","source","stream_safe","to_owned","","","","","","","","to_string","","","","try_from","","","","","","","","","","","try_into","","","","","","","","","","","type_id","","","","","","","","","","","unary","arg","","","","","args","","","call_type","cond","contract","","default","dest","disc","else_","func","indices","key","kind","lhs","local","op","","","rhs","salt","src","","","table","then","to","ty","value","","","","","","Address","Array","ArrayDef","Bool","Contract","Enum","EnumDef","EnumVariant","EventDef","I128","I16","I256","I32","I64","I8","MPtr","Map","MapDef","SPtr","String","Struct","StructDef","Tuple","TupleDef","Type","TypeId","TypeKind","U128","U16","U256","U32","U64","U8","Unit","aggregate_elem_offset","aggregate_field_num","align_of","analyzer_ty","","array_elem_size","as_intern_id","as_string","borrow","","","","","","","","","","borrow_mut","","","","","","","","","","clone","","","","","","","","","","clone_into","","","","","","","","","","clone_to_uninit","","","","","","","","","","data","deref","elem_ty","enum_data_offset","enum_disc_type","enum_variant_type","eq","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fields","","fmt","","","","","","","","","","from","","","","","","","","","","from_intern_id","hash","","","","","","","","","","index_from_fname","into","","","","","","","","","","is_address","is_aggregate","is_array","is_contract","is_enum","is_integral","is_map","is_mptr","is_primitive","is_ptr","is_signed","is_sptr","is_string","is_struct","is_unit","is_zero_sized","items","key_ty","kind","len","make_mptr","make_sptr","module_id","","","name","","","","new","pretty_print","print","projection_ty","projection_ty_imm","size_of","span","","","","tag_type","to_owned","","","","","","","","","","try_from","","","","","","","","","","try_into","","","","","","","","","","ty","type_id","","","","","","","","","","value_ty","variants","Aggregate","AssignableValue","Constant","Immediate","Local","","Map","Temporary","Unit","Value","","ValueId","arg_local","borrow","","","borrow_mut","","","clone","","","clone_into","","","clone_to_uninit","","","eq","","","equivalent","","","","","","","","","","","","fmt","","","from","","","","hash","","","into","","","is_arg","is_imm","is_tmp","name","pretty_print","","source","tmp_local","to_owned","","","try_from","","","try_into","","","ty","","","type_id","","","user_local","value_id","idx","key","lhs","","constant","imm","inst","ty","","","","PrettyPrint","pretty_print","pretty_string"],"q":[[0,"fe_mir"],[5,"fe_mir::analysis"],[13,"fe_mir::analysis::cfg"],[46,"fe_mir::analysis::domtree"],[78,"fe_mir::analysis::loop_tree"],[132,"fe_mir::analysis::post_domtree"],[165,"fe_mir::db"],[574,"fe_mir::graphviz"],[575,"fe_mir::ir"],[623,"fe_mir::ir::basic_block"],[643,"fe_mir::ir::body_builder"],[718,"fe_mir::ir::body_cursor"],[770,"fe_mir::ir::body_order"],[815,"fe_mir::ir::constant"],[885,"fe_mir::ir::function"],[1056,"fe_mir::ir::inst"],[1424,"fe_mir::ir::inst::InstKind"],[1464,"fe_mir::ir::types"],[1739,"fe_mir::ir::value"],[1820,"fe_mir::ir::value::AssignableValue"],[1824,"fe_mir::ir::value::Value"],[1831,"fe_mir::pretty_print"],[1834,"core::fmt"],[1835,"core::option"],[1836,"core::result"],[1837,"core::any"],[1838,"core::iter::traits::iterator"],[1839,"alloc::vec"],[1840,"fe_analyzer::namespace::types"],[1841,"fe_analyzer::namespace::items"],[1842,"alloc::rc"],[1843,"fe_analyzer::context"],[1844,"smol_str"],[1845,"indexmap::map"],[1846,"fe_analyzer::errors"],[1847,"fe_common::files"],[1848,"salsa"],[1849,"salsa::runtime"],[1850,"core::ops::function"],[1851,"alloc::sync"],[1852,"salsa::revision"],[1853,"alloc::collections::btree::map"],[1854,"fe_parser::ast"],[1855,"fe_common::span"],[1856,"salsa::durability"],[1857,"fe_common::db"],[1858,"fe_analyzer::db"],[1859,"std::io::error"],[1860,"std::io"],[1861,"fe_parser::node"],[1862,"core::hash"],[1863,"num_bigint::bigint"],[1864,"core::convert"],[1865,"salsa::intern_id"],[1866,"core::cmp"],[1867,"unicode_normalization::replace"],[1868,"fe_analyzer::builtins"],[1869,"core::marker"],[1870,"unicode_normalization::recompose"],[1871,"unicode_normalization::decompose"],[1872,"unicode_normalization::stream_safe"],[1873,"alloc::string"],[1874,"num_traits::cast"],[1875,"alloc::boxed"]],"i":"```````````````Aff10000000000001010110000101010``B`Bb1011111011010001101111101010````CbBnBj21001010101100000102100210211111120110210210210Cd00``Cf101111011111010101001010101````````````````````FnAIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFnAIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn0000000000DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn000000:987654321000DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlGjFn10AIb2DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn0000000000DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFl?>=<;:9876543210Fn00000000000000000000AIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn00000000000000000Gl1Gj1201200212012012012012012012012012012012012012022222222222222220222DnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn00000000000000000AIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFnAIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn0AIbGjDnE`EbEdEfEhEjElEnF`FbFdFfFhFjFlFn0000`````````````````````Nl0000`000000000`00`0000000````Od00000000000000000`Of0000000000000000000000000000000000000000000000000000000000000000000000000AA`0``00A@n000101111111110010100010000000000000001010101`AAb0000000000000000000000000000000000000000000AAh```00L`Lb12012012012012101200001111222201201221012012000012012012100120`AAn`````00LfLh110AAl23lAAd32451003245103245103245104440324510333322224444555511110000132451032451040032450003245104500430000434211340003434042110003245103245103245102324510400000ABlABfA@l0022000`22111`0AAj3`131`1111113`ABhABbABdACdACh6666868686768766666Ol777887```0ABn88``7::89:888889998::89888898890:087865432888898AC`;999;999999:9:9976543999999:98;`9`;0``9;`76543A@jA@`00::650=13<42;:650=13<42;060=13<42;0=13<42;0=13<42;10=13<42;0000====11113333<<<<44442222;;;;0=133<<442;;:650=13<42;;0=13<42;:650=13<42;6501:0;10106566660Oj171>24=53<4=5<;761>24=53<;761>24=53<;761>24=53<1ADdADfADhADjADlADnAE`AEb1AEdAEfAEhAEjAEl146AEnAF`AFbAFdAFfAFh2;28AFjAFlAFn:=6ADn4798={{{b{Gl}}G`}{{Cl{{Bl{Lf}}}}}}{{bG`}{{Cl{{Bl{Lf}}}}}}{GjLd}{{{b{Gl}}Ib}{{Cl{{Bl{Lf}}}}}}{{bIb}{{Cl{{Bl{Lf}}}}}}2{{{b{Gl}}Kb}{{Cl{{Bl{Lf}}}}}}{{bKb}{{Cl{{Bl{Lf}}}}}}4{{{b{Gl}}Jn}L`}{{bJn}L`}6{{{b{Gl}}Lf}{{Cl{l}}}}{{bLf}{{Cl{l}}}}8{{{b{Gl}}Db}Lf}{{bDb}Lf}:{{{b{Gl}}Db{M`{DhCh}}}Lf}{{bDb{M`{DhCh}}}Lf}<32<{{{b{Gl}}Ch}Lj}{{bCh}Lj}>{{bIb}{{Dd{{Cl{{Aj{Cj}}}}}}}}{{bIb}{{Cl{{Aj{Mb}}}}}}{{bJn}{{Dd{{Al{ChDl}}}}}}{{bJn}{{Dd{{Al{MdMf}}}}}}{{bIb}{{Cl{{Bl{Jn}}}}}}{{bIb}{{Cl{{Aj{Cn}}}}}}{{bIb}Dh}{{bIb}{{Dd{{Cl{{Dj{{Mh{HjCh}}Cj}}}}}}}}{{bIb}A`}{{bIb}{{Dd{{Cl{{Dj{DhMb}}}}}}}}{{bIb}{{Ah{Ib}}}}{{bIb}{{Dd{{Cl{Mj}}}}}}{{bIb}{{Cl{{Aj{Kb}}}}}}{{bIb}{{Cl{{Aj{Ib}}}}}}{{bIb}{{Bl{Db}}}}{{bIb}{{Dd{{Cl{{Dj{Dh{Mh{MlMb}}}}}}}}}}{MnGj}{{{b{Fn}}}{{b{N`}}}}{{{b{Fn}}}{{b{H`}}}}{{{b{dFn}}}{{b{dH`}}}}{{{b{c}}}{{b{{Ld{e}}}}}{}{}}000000000000000{bI`}{{{b{d}}Gf{Cl{Gh}}}h}{{{b{d}}Gf{Cl{Gh}}Nb}h}{{{b{d}}I`{Cl{{Dj{DhI`}}}}}h}{{{b{d}}I`{Cl{{Dj{DhI`}}}}Nb}h}{{{b{d}}I`{Cl{{Aj{Gf}}}}}h}{{{b{d}}I`{Cl{{Aj{Gf}}}}Nb}h}{{{b{d}}I`}h}{{{b{d}}I`Nb}h}{{bKb}{{Cl{{Aj{Kf}}}}}}{{bKb}{{Cl{{Aj{Db}}}}}}{{bKb}{{Dd{Df}}}}{{bKb}{{Dd{{Cl{{Dj{DhKf}}}}}}}}{{bKf}{{Dd{{Al{ChDl}}}}}}{{bKb}{{Dd{{Cl{{Dj{DhDb}}}}}}}}{{bHj}{{Cl{{Aj{Hf}}}}}}{{bHj}{{Dd{{Cl{{Dj{DhHf}}}}}}}}{{bHjCh}A`}{c{{Al{e}}}{}{}}000000000000000000{{}{{Al{c}}}{}}000000000000000000{{bKn}{{Dd{{Al{ChDl}}}}}}{bAn}000000000000000000{{{b{Fn}}}{{b{Nd}}}}{{{b{Fn}}}{{b{Nf}}}}{{{b{dFn}}}{{b{dNd}}}}{{{b{dFn}}}{{b{dNf}}}}{{{b{Gl}}Ib{b{dc}}}{{Nh{h}}}Nj}````````````````````{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}{{{b{Nl}}}Nl}{{b{b{dc}}}h{}}{{bj}h}`{{}Nl}{{{b{Nl}}{b{Nl}}}A`}{{b{b{c}}}A`{}}000{{{b{Nl}}{b{dAb}}}Ad}{cc{}}{{{b{{Nn{c}}}}}Nl{}}`{{{b{Nl}}{b{dc}}}hO`}{NlOb}`{{}c{}}{{{b{Nl}}}A`}{NlMl}{bc{}}{c{{Al{e}}}{}{}}{{}{{Al{c}}}{}}{bAn}````{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}{{{b{Od}}}Od}{{b{b{dc}}}h{}}{{bj}h}{{{b{Od}}{b{Od}}}A`}{{b{b{c}}}A`{}}000{{{b{Od}}{b{dAb}}}Ad}{cc{}}{{{b{Od}}{b{dc}}}hO`}{{}c{}}>=<;`{{{b{dOf}}OhNl}Oj}{{{b{dOf}}OhOhNl}Oj}{{{b{dOf}}Oh{Bl{Oh}}Nl}Oj}{{{b{dOf}}Lj{Bl{Oh}}Nl}Oj}3222{Ofl}?>{{{b{dOf}}OhnnNl}Oj}1{{{b{dOf}}Lf{Bl{Oh}}OlNl}Oj}{{{b{dOf}}OhCnNl}Oj}{{{b{dOf}}OhOhCnNl}Oj}{{{b{dOf}}}n}{{{b{dOf}}On}Oh}9:9{{{b{Of}}{b{dAb}}}Ad}>{{{b{Of}}}Lf};;{{{b{Of}}Oj}{{b{A@`}}}}{{{b{dOf}}Oj}{{Ah{{b{A@b}}}}}}?>{{{b{dOf}}n}A`}{{{b{dOf}}}A`}{{{b{dOf}}nNl}Oj}{{{b{dOf}}OhNl}Oj}{{{b{dOf}}OhOhNl}Oj}1000:{{{b{dOf}}L`Lj}Oh}{{{b{dOf}}A@dLj}Oh}{{{b{dOf}}A`Lj}Oh}{{{b{dOf}}Lj}Oh}{{{b{dOf}}c}Oh{{A@h{A@f}}}}5{{{b{dOf}}OjA@b}h}76{{{b{dOf}}n}h}0778{{LfNl}Of}{{{b{dOf}}Nl}Oj}:9{{{b{dOf}}OhLjNl}Oj}{{{b{dOf}}Oj}h}<{{{b{dOf}}{Ah{Oh}}Nl}Oj}<<{{{b{dOf}}On}Oh}={{{b{dOf}}OhA@j{Ah{n}}Nl}Oj}{c{{Al{e}}}{}{}}{{}{{Al{c}}}{}}{bAn}7{{{b{dOf}}Oh}{{b{A@f}}}}{{{b{dOf}}Oh}Lj}{{{b{dOf}}A@l{Bl{Oh}}Nl}Oj}``````{{{b{dA@n}}}h}{{{b{A@n}}}{{b{l}}}}{{{b{dA@n}}}{{b{dl}}}}{b{{b{c}}}{}}0{{{b{d}}}{{b{dc}}}{}}0{{{b{AA`}}}AA`}{{b{b{dc}}}h{}}{{bj}h}{{{b{AA`}}{b{AA`}}}A`}{{b{b{c}}}A`{}}000{{{b{A@n}}}n}{{{b{A@n}}}Oj}{{{b{AA`}}{b{dAb}}}Ad}{cc{}}0{{{b{dA@n}}n}h}{{{b{dA@n}}Oj}h}{{}c{}}0{{{b{A@n}}}AA`}{{{b{dA@n}}A@b}{{Ah{Oh}}}}{{{b{dl}}AA`}A@n}{{{b{dl}}}A@n}{{{b{A@n}}}{{Ah{n}}}}404{{{b{dA@n}}}h}00{{{b{dA@n}}AA`}h}1{{{b{dA@n}}Od}n}{{{b{dA@n}}A@`}Oj}{bc{}}{c{{Al{e}}}{}{}}0{{}{{Al{c}}}{}}0{bAn}0`{{{b{dAAb}}n}h}{{{b{dAAb}}Ojn}h}{{{b{AAb}}}Bd}{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}{{{b{AAb}}}AAb}{{b{b{dc}}}h{}}{{bj}h}{{{b{AAb}}}n}{{{b{AAb}}{b{AAb}}}A`}{{b{b{c}}}A`{}}000{{{b{AAb}}n}{{Ah{Oj}}}}{{{b{AAb}}{b{dAb}}}Ad}{cc{}}{{{b{dAAb}}nn}h}0{{{b{dAAb}}OjOj}h}0{{{b{AAb}}Oj}n}{{}c{}}{{{b{AAb}}n}A`}0{{{b{AAb}}Oj}A`}{{{b{AAb}}{b{AAd}}n}A`}{{{b{AAb}}}{{`{{Bh{}{{Bf{n}}}}}}}}{{{b{AAb}}n}{{`{{Bh{}{{Bf{Oj}}}}}}}}>;{nAAb}{{{b{AAb}}n}{{Ah{n}}}}{{{b{AAb}}Oj}{{Ah{Oj}}}}{{{b{dAAb}}Ojn}h}21{{{b{dAAb}}n}h}{{{b{dAAb}}Oj}h}{{{b{AAb}}{b{AAd}}n}{{Ah{Oj}}}}{bc{}}{c{{Al{e}}}{}{}}{{}{{Al{c}}}{}}{bAn}``````{{{b{L`}}}AAf}{b{{b{c}}}{}}00{{{b{d}}}{{b{dc}}}{}}00{{{b{Lb}}}Lb}{{{b{L`}}}L`}{{{b{AAh}}}AAh}{{b{b{dc}}}h{}}00{{bj}h}00{{L`{b{Gl}}}{{Cl{Lb}}}}{{{b{Lb}}{b{Lb}}}A`}{{{b{L`}}{b{L`}}}A`}{{{b{AAh}}{b{AAh}}}A`}{{b{b{c}}}A`{}}00000000000{{{b{Lb}}{b{dAb}}}Ad}{{{b{L`}}{b{dAb}}}Ad}{{{b{AAh}}{b{dAb}}}Ad}{cc{}}00{MdAAh}{AAfL`}{{{b{Lb}}{b{dc}}}hO`}{{{b{L`}}{b{dc}}}hO`}{{{b{AAh}}{b{dc}}}hO`}{{}c{}}00{LbIb}{LbDh}{LbNl}{bc{}}00{c{{Al{e}}}{}{}}00{{}{{Al{c}}}{}}00{{L`{b{Gl}}}Lj}{LbLj}{bAn}00{LbAAh}`````````{{Lf{b{Gl}}}Db}{LhDb}{{{b{Lf}}}AAf}{{Lf{b{Gl}}}{{Cl{l}}}}{b{{b{c}}}{}}00000{{{b{d}}}{{b{dc}}}{}}00000{{{b{AAd}}Oj}AAj}{{{b{Lh}}}Lh}{{{b{AAl}}}AAl}{{{b{Lf}}}Lf}{{{b{AAn}}}AAn}{{{b{l}}}l}{{{b{AAd}}}AAd}{{b{b{dc}}}h{}}00000{{bj}h}00000{{{b{Lf}}{b{Lf}}}AB`}{{b{b{c}}}AB`{}}{{Lf{b{Gl}}}Dh}{{}AAd}{{{b{Lh}}{b{Lh}}}A`}{{{b{AAl}}{b{AAl}}}A`}{{{b{Lf}}{b{Lf}}}A`}{{{b{AAn}}{b{AAn}}}A`}{{{b{l}}{b{l}}}A`}{{{b{AAd}}{b{AAd}}}A`}{{b{b{c}}}A`{}}00000000000000000000000{lLf}{{{b{Lh}}{b{dAb}}}Ad}{{{b{AAl}}{b{dAb}}}Ad}{{{b{Lf}}{b{dAb}}}Ad}{{{b{AAn}}{b{dAb}}}Ad}{{{b{l}}{b{dAb}}}Ad}{{{b{AAd}}{b{dAb}}}Ad}{cc{}}00000{AAfLf}{{{b{AAd}}}{{`{{Bh{}{{Bf{Oh}}}}}}}}{{{b{dAAd}}}{{`{{Bh{}{{Bf{{b{dA@f}}}}}}}}}}{{{b{Lh}}{b{dc}}}hO`}{{{b{AAl}}{b{dc}}}hO`}{{{b{Lf}}{b{dc}}}hO`}{{{b{AAn}}{b{dc}}}hO`}{{{b{AAd}}Oj}{{b{A@`}}}}{{{b{dAAd}}Oj}{{b{dA@`}}}}{{{b{AAd}}Oj}{{Ah{{b{A@b}}}}}}{{}c{}}00000{{Lf{b{Gl}}}A`}{AAnA`}{{{b{AAd}}Oj}A`}0{{Lf{b{Gl}}}AAn}{LhAAn}{{{b{AAd}}Oh}{{Ah{{b{Gh}}}}}}{{{b{AAd}}}{{b{{Aj{Oh}}}}}}{{{b{dAAd}}}{{b{{Aj{Oh}}}}}}{{{b{dAAd}}OjA@b}h}{{Lf{b{Gl}}}Ib}{LhIb}{{{b{Lf}}{b{Gl}}}Dh}{AAlDh}{{LfNl}l}{lAAb}{LhBl}{{{b{Lf}}{b{Lf}}}{{Ah{AB`}}}}{{{b{dAAd}}Oj}{{Ah{A@b}}}}{{{b{dAAd}}OjA@`}A@`}{{{b{dAAd}}OhA@f}A@f}{LhM`}{{Lf{b{Gl}}}{{Ah{Lj}}}}{LhAh}{{Lf{b{Gl}}}A`}{{{b{dAAd}}Ojnn}h}{{Lf{b{Gl}}}{{Cl{Lh}}}}{AAlNl}{lNl}{lAAd}{{{b{dAAd}}Od}n}{{{b{dAAd}}A@`}Oj}{{{b{dAAd}}A@f}Oh}{bc{}}00000{c{{Al{e}}}{}{}}00000{{}{{Al{c}}}{}}00000{AAlLj}{bAn}00000{{{b{Lf}}{b{Gl}}}Dh}{{{b{AAd}}Oh}{{b{A@f}}}}{{{b{dAAd}}Oh}{{b{dA@f}}}}{{{b{AAd}}Oh}Lj}{{{b{AAd}}}{{`{{Bh{}{{Bf{{b{A@f}}}}}}}}}}{{{b{dAAd}}}{{`{{Bh{}{{Bf{{b{dA@f}}}}}}}}}}````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{{{b{dA@j}}Ohn}h}{{{b{A@`}}}ABb}{{{b{dA@`}}}ABd}{{ABfOhOhNl}A@`}{{{b{AAj}}}ABh}{b{{b{c}}}{}}0000000000{{{b{d}}}{{b{dc}}}{}}0000000000{{{b{A@`}}}AAj}{{}{{ABj{c}}}{}}{{{b{A@`}}}A@`}{{{b{ABl}}}ABl}{{{b{A@j}}}A@j}{{{b{ABn}}}ABn}{{{b{ABf}}}ABf}{{{b{Ol}}}Ol}{{{b{AC`}}}AC`}{{{b{A@l}}}A@l}{{b{b{dc}}}h{}}0000000{{bj}h}0000000{{}A@j}{{{b{A@`}}{b{A@`}}}A`}{{{b{ABl}}{b{ABl}}}A`}{{{b{A@j}}{b{A@j}}}A`}{{{b{ABn}}{b{ABn}}}A`}{{{b{ABf}}{b{ABf}}}A`}{{{b{Ol}}{b{Ol}}}A`}{{{b{AC`}}{b{AC`}}}A`}{{{b{A@l}}{b{A@l}}}A`}{{b{b{c}}}A`{}}0000000000000000000000000000000{{{b{A@`}}{b{dAb}}}Ad}{{{b{ABl}}{b{dAb}}}Ad}{{{b{A@j}}{b{dAb}}}Ad}{{{b{ABn}}{b{dAb}}}Ad}0{{{b{ABf}}{b{dAb}}}Ad}0{{{b{Ol}}{b{dAb}}}Ad}0{{{b{AC`}}{b{dAb}}}Ad}{{{b{A@l}}{b{dAb}}}Ad}0{cc{}}0000000000{ACbA@l}{{{b{A@`}}{b{dc}}}hO`}{{{b{ABl}}{b{dc}}}hO`}{{{b{A@j}}{b{dc}}}hO`}{{{b{ABn}}{b{dc}}}hO`}{{{b{ABf}}{b{dc}}}hO`}{{{b{Ol}}{b{dc}}}hO`}{{{b{AC`}}{b{dc}}}hO`}{{{b{A@l}}{b{dc}}}hO`}{{}c{}}0000000000{{}c{}}0{{A@l{Bl{Oh}}Nl}A@`}{{{b{A@j}}}A`}{{{b{AAj}}}A`}{{{b{A@`}}}A`}{A@lA`}{{{b{A@j}}}{{`{{Bh{}{{Bf{{Mh{Ohn}}}}}}}}}}{A@`ABl}{{{b{A@j}}}Bd}{{ABlNl}A@`}{{{b{d{ACd{c}}}}}{{Ah{e}}}ACf{}}{{{b{d{ACh{c}}}}}{{Ah{e}}}{}{}}{{}{{ACj{c}}}{}}{{}{{ACl{c}}}{}}10{{}A@`}{{{b{Oj}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{A@`Nl}{{}{{AD`{c}}}{}}{bc{}}0000000{bADb}000{c{{Al{e}}}{}{}}0000000000{{}{{Al{c}}}{}}0000000000{bAn}0000000000{{ABnOhNl}A@`}{ADdAh}{ADfOh}{ADhAh}{ADjOh}{ADlOh}{ADnBl}{AE`Bl}{AEbBl}{AE`Ol}{AEdOh}{AEfCn}{AEhCn}{AEjAh}{AEln}{AEjOh}{AEdn}{AE`Lf}{AEnBl}{AF`Oh}{AFbAC`}{AFdOh}{AFfOh}{AFhABn}{AFdABf}{AEbA@l}4{AEhOh}{AFjOh}{AFlOh}{AFnOh}{AEjA@j}>{AFbLj}{ADnLj}{AFhOh}{AFbOh}{AEnOh}{AF`Oh}{AEfOh};``````````````````````````````````{{Lj{b{Gl}}cBd}BdAG`}{{Lj{b{Gl}}}Bd}{{Lj{b{Gl}}Bd}Bd}{{Lj{b{Gl}}}{{Ah{Ch}}}}{LlAh}2{{{b{Lj}}}AAf}{{{b{Lj}}{b{Gl}}}ADb}{b{{b{c}}}{}}000000000{{{b{d}}}{{b{dc}}}{}}000000000{{{b{Ll}}}Ll}{{{b{AGb}}}AGb}{{{b{Lj}}}Lj}{{{b{AGd}}}AGd}{{{b{AGf}}}AGf}{{{b{AGh}}}AGh}{{{b{AGj}}}AGj}{{{b{AGl}}}AGl}{{{b{AGn}}}AGn}{{{b{AH`}}}AH`}{{b{b{dc}}}h{}}000000000{{bj}h}000000000{{Lj{b{Gl}}}{{Cl{Ll}}}}{{Lj{b{Gl}}}Lj}{AGdLj}{{Lj{b{Gl}}Bd}Bd}2{{Lj{b{Gl}}Gb}Lj}{{{b{Ll}}{b{Ll}}}A`}{{{b{AGb}}{b{AGb}}}A`}{{{b{Lj}}{b{Lj}}}A`}{{{b{AGd}}{b{AGd}}}A`}{{{b{AGf}}{b{AGf}}}A`}{{{b{AGh}}{b{AGh}}}A`}{{{b{AGj}}{b{AGj}}}A`}{{{b{AGl}}{b{AGl}}}A`}{{{b{AGn}}{b{AGn}}}A`}{{{b{AH`}}{b{AH`}}}A`}{{b{b{c}}}A`{}}000000000000000000000000000000000000000{AGhBl}{AGnBl}{{{b{Ll}}{b{dAb}}}Ad}{{{b{AGb}}{b{dAb}}}Ad}{{{b{Lj}}{b{dAb}}}Ad}{{{b{AGd}}{b{dAb}}}Ad}{{{b{AGf}}{b{dAb}}}Ad}{{{b{AGh}}{b{dAb}}}Ad}{{{b{AGj}}{b{dAb}}}Ad}{{{b{AGl}}{b{dAb}}}Ad}{{{b{AGn}}{b{dAb}}}Ad}{{{b{AH`}}{b{dAb}}}Ad}{cc{}}000000000{AAfLj}{{{b{Ll}}{b{dc}}}hO`}{{{b{AGb}}{b{dc}}}hO`}{{{b{Lj}}{b{dc}}}hO`}{{{b{AGd}}{b{dc}}}hO`}{{{b{AGf}}{b{dc}}}hO`}{{{b{AGh}}{b{dc}}}hO`}{{{b{AGj}}{b{dc}}}hO`}{{{b{AGl}}{b{dc}}}hO`}{{{b{AGn}}{b{dc}}}hO`}{{{b{AH`}}{b{dc}}}hO`}{{Lj{b{Gl}}{b{Gh}}}A@d}{{}c{}}000000000{{Lj{b{Gl}}}A`}000000000000000{AGfBl}{AH`Lj}{LlAGb}{AGdBd}{{Lj{b{Gl}}}Lj}0{AGhIb}{AGjIb}{AGnIb}{AGhDh}{AGjDh}{AGlDh}{AGnDh}{{AGb{Ah{Ch}}}Ll}{{{b{Lj}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{{{b{Lj}}{b{Gl}}{b{dc}}}AdACn}{{Lj{b{Gl}}{b{A@f}}}Lj}{{Lj{b{Gl}}Bd}Lj}{{Lj{b{Gl}}Bd}Bd}{AGhMl}{AGjMl}{AGlMl}{AGnMl}{{{b{AGj}}}AGb}{bc{}}000000000{c{{Al{e}}}{}{}}000000000{{}{{Al{c}}}{}}000000000{AGlLj}{bAn}000000000{AH`Lj}{AGjBl}````````````{{DhLjNl}On}{b{{b{c}}}{}}00{{{b{d}}}{{b{dc}}}{}}00{{{b{A@f}}}A@f}{{{b{A@b}}}A@b}{{{b{On}}}On}{{b{b{dc}}}h{}}00{{bj}h}00{{{b{A@f}}{b{A@f}}}A`}{{{b{A@b}}{b{A@b}}}A`}{{{b{On}}{b{On}}}A`}{{b{b{c}}}A`{}}00000000000{{{b{A@f}}{b{dAb}}}Ad}{{{b{A@b}}{b{dAb}}}Ad}{{{b{On}}{b{dAb}}}Ad}{cc{}}{OhA@b}11{{{b{A@f}}{b{dc}}}hO`}{{{b{A@b}}{b{dc}}}hO`}{{{b{On}}{b{dc}}}hO`}{{}c{}}00{OnA`}{{{b{A@f}}}A`}1{OnDh}{{{b{Oh}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{{{b{A@b}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{OnNl}{{DhLj}On}{bc{}}00{c{{Al{e}}}{}{}}00{{}{{Al{c}}}{}}00{{{b{A@f}}}Lj}{{{b{A@b}}{b{Gl}}{b{AAd}}}Lj}{OnLj}{bAn}00{{DhLjNl}On}{{{b{A@b}}}{{Ah{Oh}}}}{AHbOh}{AHdOh}{AHbAHf}{AHdAHf}{AHhL`}{AHjA@d}{AHlOj}{AHlLj}{AHjLj}{AHhLj}{AHnLj}`{{{b{AI`}}{b{Gl}}{b{AAd}}{b{dc}}}AdACn}{{{b{AI`}}{b{Gl}}{b{AAd}}}ADb}","D":"BBh","p":[[1,"reference",null,null,1],[0,"mut"],[5,"ControlFlowGraph",13],[1,"unit"],[1,"u8"],[5,"FunctionBody",885],[8,"BasicBlockId",623],[1,"bool"],[5,"Formatter",1834],[8,"Result",1834],[5,"CfgPostOrder",13],[6,"Option",1835,null,1],[1,"slice"],[6,"Result",1836,null,1],[5,"TypeId",1837],[5,"DomTree",46],[5,"DFSet",46],[1,"usize"],[17,"Item"],[10,"Iterator",1838],[5,"Loop",78],[5,"Vec",1839],[5,"LoopTree",78],[8,"LoopId",78],[5,"BlocksInLoopPostOrder",78],[6,"PostIDom",132],[5,"PostDomTree",132],[5,"TypeId",1840],[5,"ImplId",1841],[5,"Rc",1842,null,1],[5,"ContractId",1841],[5,"ContractFieldId",1841],[5,"FunctionId",1841],[5,"Analysis",1843],[5,"DepGraphWrapper",1841],[5,"SmolStr",1844],[5,"IndexMap",1845],[5,"TypeError",1846],[5,"MirInternConstQuery",165],[5,"MirInternConstLookupQuery",165],[5,"MirInternTypeQuery",165],[5,"MirInternTypeLookupQuery",165],[5,"MirInternFunctionQuery",165],[5,"MirInternFunctionLookupQuery",165],[5,"MirLowerModuleAllFunctionsQuery",165],[5,"MirLowerContractAllFunctionsQuery",165],[5,"MirLowerStructAllFunctionsQuery",165],[5,"MirLowerEnumAllFunctionsQuery",165],[5,"MirLoweredTypeQuery",165],[5,"MirLoweredConstantQuery",165],[5,"MirLoweredFuncSignatureQuery",165],[5,"MirLoweredMonomorphizedFuncSignatureQuery",165],[5,"MirLoweredPseudoMonomorphizedFuncSignatureQuery",165],[5,"MirLoweredFuncBodyQuery",165],[5,"NewDb",165],[5,"EnumId",1841],[5,"EnumVariantId",1841],[6,"EnumVariantKind",1841],[5,"SourceFileId",1847],[1,"str"],[5,"MirDbGroupStorage__",165],[10,"MirDb",165],[5,"DatabaseKeyIndex",1848],[5,"Runtime",1849],[10,"FnMut",1850],[5,"FunctionBody",1843],[5,"FunctionSigId",1841],[5,"FunctionSignature",1840],[5,"TraitId",1841],[5,"QueryTable",1848],[5,"QueryTableMut",1848],[5,"IngotId",1841],[5,"ModuleId",1841],[5,"Attribute",1841],[5,"AttributeId",1841],[5,"Contract",1841],[5,"ContractField",1841],[5,"Enum",1841],[5,"EnumVariant",1841],[5,"File",1847],[5,"Function",1841],[5,"FunctionSig",1841],[5,"Impl",1841],[5,"Ingot",1841],[5,"Module",1841],[5,"ModuleConstant",1841],[5,"ModuleConstantId",1841],[5,"Struct",1841],[5,"StructId",1841],[5,"StructField",1841],[5,"StructFieldId",1841],[5,"Trait",1841],[6,"Type",1840],[5,"TypeAlias",1841],[5,"TypeAliasId",1841],[5,"ConstantId",815],[5,"Constant",815],[5,"Arc",1851,null,1],[5,"FunctionId",885],[5,"FunctionSignature",885],[5,"TypeId",1464],[5,"Type",1464],[5,"Revision",1852],[5,"BTreeMap",1853],[6,"Item",1841],[6,"Constant",1843],[5,"ConstEvalError",1846],[1,"tuple",null,null,1],[5,"Module",1854],[5,"Span",1855],[1,"u16"],[10,"Database",1848],[5,"Durability",1856],[10,"SourceDb",1857],[10,"AnalyzerDb",1858],[8,"Result",1859,null,1],[10,"Write",1860],[5,"SourceInfo",575],[5,"Node",1861],[10,"Hasher",1862],[5,"NodeId",1861],[5,"BasicBlock",623],[5,"BodyBuilder",643],[8,"ValueId",1739],[8,"InstId",1056],[6,"CallType",1056],[5,"Local",1739],[5,"Inst",1056],[6,"AssignableValue",1739],[5,"BigInt",1863],[6,"Value",1739],[10,"Into",1864,null,1],[5,"SwitchTable",1056],[6,"YulIntrinsicOp",1056],[5,"BodyCursor",718],[6,"CursorLocation",718],[5,"BodyOrder",770],[5,"BodyDataStore",885],[5,"InternId",1865],[6,"ConstantValue",815],[6,"BranchInfo",1056],[5,"FunctionParam",885],[6,"Linkage",885],[6,"Ordering",1866],[8,"ValueIter",1056],[8,"ValueIterMut",1056],[6,"BinOp",1056],[8,"BlockIter",1056],[5,"Replacements",1867],[6,"InstKind",1056],[6,"UnOp",1056],[6,"CastKind",1056],[6,"Intrinsic",1868],[6,"IterBase",1056],[10,"Copy",1869],[6,"IterMutBase",1056],[5,"Recompositions",1870],[5,"Decompositions",1871],[10,"Write",1834],[5,"StreamSafe",1872],[5,"String",1873],[15,"Revert",1424],[15,"Emit",1424],[15,"Return",1424],[15,"Keccak256",1424],[15,"AbiEncode",1424],[15,"AggregateConstruct",1424],[15,"Call",1424],[15,"YulIntrinsic",1424],[15,"Branch",1424],[15,"Create",1424],[15,"Create2",1424],[15,"Switch",1424],[15,"Jump",1424],[15,"AggregateAccess",1424],[15,"MapAccess",1424],[15,"Cast",1424],[15,"Binary",1424],[15,"Declare",1424],[15,"Unary",1424],[15,"Bind",1424],[15,"MemCopy",1424],[15,"Load",1424],[10,"ToPrimitive",1874],[6,"TypeKind",1464],[5,"ArrayDef",1464],[5,"TupleDef",1464],[5,"StructDef",1464],[5,"EnumDef",1464],[5,"EnumVariant",1464],[5,"EventDef",1464],[5,"MapDef",1464],[15,"Aggregate",1820],[15,"Map",1820],[5,"Box",1875,null,1],[15,"Constant",1824],[15,"Immediate",1824],[15,"Temporary",1824],[15,"Unit",1824],[10,"PrettyPrint",1831],[5,"MirDbStorage",165]],"r":[[5,13],[6,46],[7,78],[8,132],[575,623],[576,623],[577,815],[578,815],[579,885],[580,885],[581,885],[582,885],[583,1056],[584,1056],[586,1464],[587,1464],[588,1464],[589,1739],[590,1739]],"b":[[313,"impl-HasQueryGroup%3CSourceDbStorage%3E-for-NewDb"],[314,"impl-HasQueryGroup%3CAnalyzerDbStorage%3E-for-NewDb"],[315,"impl-HasQueryGroup%3CMirDbStorage%3E-for-NewDb"],[570,"impl-Upcast%3Cdyn+SourceDb%3E-for-NewDb"],[571,"impl-Upcast%3Cdyn+AnalyzerDb%3E-for-NewDb"],[572,"impl-UpcastMut%3Cdyn+SourceDb%3E-for-NewDb"],[573,"impl-UpcastMut%3Cdyn+AnalyzerDb%3E-for-NewDb"],[1317,"impl-Display-for-UnOp"],[1318,"impl-Debug-for-UnOp"],[1319,"impl-Display-for-BinOp"],[1320,"impl-Debug-for-BinOp"],[1321,"impl-Display-for-CallType"],[1322,"impl-Debug-for-CallType"],[1324,"impl-Display-for-YulIntrinsicOp"],[1325,"impl-Debug-for-YulIntrinsicOp"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAABYGUAAAAAoADAAAAA4AEAAjAAsAMAAIADoAAAA8AAEASAAQAFoADgBwAAAAdwAAAHoAHgCeAAkAqQB5ADYBCQBgARQAiAG2AEACCQBLAgYAUwINAGICBABoAhQAfgIAAIACGgCcAgQAogIAAKQCLQDTAhAA5gIAAO0CCAD4AgAA+gIIAAcDBAANAwQAEwMAACMDAAAsAwUAMwMlAFwDBABnAwkAcgMCAHkDAQB8AwAAfwMkAKUDJQDRAwgA4QMFAOgDBwDxAykAHAQJACgEAwAtBAYANQQZAFAEFABmBAQAbAQCAHAEFACGBAAAiAQNAJcEIQC7BHMAOgUIAE4FbAC8BQIAwgUHAMsFAgDPBQAA0QUAANMFBwDcBXwAYwYLAHkGIQCcBjEA0AYAANIGAADVBiQA+wYAAP4GAgAFBwAACAciAA==","P":[[15,"T"],[19,""],[20,"T"],[21,""],[25,"K"],[29,""],[30,"T"],[32,"U"],[34,"I"],[35,""],[39,"T"],[40,"U,T"],[42,"U"],[44,""],[48,"T"],[52,""],[53,"T"],[54,""],[61,"T"],[63,""],[66,"U"],[68,""],[71,"T"],[72,"U,T"],[74,"U"],[76,""],[82,"T"],[88,""],[91,"T"],[93,""],[98,"K"],[102,""],[104,"T"],[107,""],[108,"U"],[111,"I"],[112,""],[118,"Iterator::Item"],[119,""],[121,"T"],[123,"U,T"],[126,"U"],[129,""],[137,"T"],[141,""],[142,"T"],[143,""],[146,"K"],[150,""],[152,"T"],[154,"U"],[156,""],[158,"T"],[159,"U,T"],[161,"U"],[163,""],[186,"T"],[224,""],[257,"QueryDb::DynDb,Query::Key,Query::Value"],[267,""],[290,"T"],[309,""],[372,"U"],[391,""],[478,"QueryDb::GroupStorage,Query::Storage"],[494,""],[512,"U,T"],[531,"U"],[550,""],[574,"W"],[595,"T"],[597,""],[598,"T"],[599,""],[603,"K"],[607,""],[608,"T"],[611,"__H"],[612,""],[614,"U"],[615,""],[617,"T"],[618,"U,T"],[619,"U"],[620,""],[625,"T"],[627,""],[628,"T"],[629,""],[631,"K"],[635,""],[636,"T"],[637,"__H"],[638,"U"],[639,"T"],[640,"U,T"],[641,"U"],[642,""],[653,"T"],[655,""],[666,"T"],[667,""],[672,"U"],[673,""],[711,"U,T"],[712,"U"],[713,""],[727,"T"],[731,""],[732,"T"],[733,""],[735,"K"],[739,""],[742,"T"],[744,""],[746,"U"],[748,""],[763,"T"],[764,"U,T"],[766,"U"],[768,""],[774,"T"],[776,""],[777,"T"],[778,""],[781,"K"],[785,""],[787,"T"],[788,""],[793,"U"],[794,""],[811,"T"],[812,"U,T"],[813,"U"],[814,""],[822,"T"],[828,""],[831,"T"],[834,""],[841,"K"],[853,""],[856,"T"],[859,""],[861,"__H"],[864,"U"],[867,""],[870,"T"],[873,"U,T"],[876,"U"],[879,""],[898,"T"],[910,""],[917,"T"],[923,""],[930,"K"],[931,""],[939,"K"],[963,""],[970,"T"],[976,""],[979,"__H"],[983,""],[986,"U"],[992,""],[1025,"T"],[1031,"U,T"],[1037,"U"],[1043,""],[1225,"T"],[1247,""],[1248,"I"],[1249,""],[1257,"T"],[1265,""],[1282,"K"],[1314,""],[1326,"T"],[1337,""],[1338,"__H"],[1346,"U"],[1357,"I"],[1359,""],[1368,"T,Iterator::Item"],[1370,"I"],[1374,""],[1375,"W"],[1376,""],[1377,"I"],[1378,"T"],[1386,""],[1390,"U,T"],[1401,"U"],[1412,""],[1498,"T"],[1499,""],[1506,"T"],[1526,""],[1536,"T"],[1546,""],[1572,"K"],[1612,""],[1624,"T"],[1634,""],[1635,"__H"],[1645,""],[1646,"U"],[1656,""],[1686,"W"],[1688,""],[1696,"T"],[1706,"U,T"],[1716,"U"],[1726,""],[1752,"T"],[1758,""],[1761,"T"],[1764,""],[1770,"K"],[1782,""],[1785,"T"],[1786,""],[1787,"T"],[1789,"__H"],[1792,"U"],[1795,""],[1799,"W"],[1801,""],[1803,"T"],[1806,"U,T"],[1809,"U"],[1812,""],[1832,"W"],[1833,""]]}],["fe_parser",{"t":"PFPFIFEENNCNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNONNNNNNCNNNNNNCONNCNHNNNNONONNNNNNNNNNNNNPPPPPPPPPGPPPPPPGPPPFPGPPFPPFPGPFPPGPFPGFPPGFPGGPPPPFPPPPPPGPPPFPFGPPPPPPPPPPFPPPPPGPFPPPPPPPPPPFPFPPPPFPPPPPPFPGPPPGPPPPPFPGPGFGPPONOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNONOONNNOOOOOOOOONNNNNNOOOOOOOOONOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOCCCCCHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPFPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPFGPPPPPPNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNOONNNNNNNNNNNNFFFKNNNNNNNNNNNNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNONNNNNONNNNNNNNNNNNNNNMNOONNNNNNNNNNNNNN","n":["Err","Label","Ok","ParseFailed","ParseResult","Parser","Token","TokenKind","as_bt_parser","assert","ast","borrow","","","borrow_mut","","","clone","","clone_into","","clone_to_uninit","","diagnostics","done","eat_newlines","enter_block","eq","","equivalent","","","","","","","","error","expect","expect_stmt_end","expect_with_notes","fancy_error","file_id","fmt","","","from","","","grammar","hash","","into","","","into_cs_label","lexer","message","new","next","node","optional","parse_file","peek","peek_or_err","primary","secondary","span","split_next","style","to_owned","","to_string","try_from","","","try_into","","","type_id","","","unexpected_token_error","Add","And","Assert","Assign","Attribute","","AugAssign","Base","BinOperation","BinOperator","BitAnd","BitOr","BitXor","Bool","","BoolOperation","BoolOperator","Bounded","Break","Call","CallArg","CompOperation","CompOperator","ConstExpr","Constant","ConstantDecl","","Continue","Contract","","ContractStmt","Div","Enum","","Eq","Expr","","Field","For","FuncStmt","Function","","","FunctionArg","FunctionSignature","Generic","GenericArg","GenericParameter","Glob","Gt","GtE","If","Impl","","Int","Invert","LShift","List","Literal","LiteralPattern","Lt","LtE","Match","MatchArm","Mod","Module","ModuleStmt","Mult","Name","","Nested","Not","NotEq","Num","Or","","ParseError","Path","","","","PathStruct","PathTuple","Pattern","Pow","Pragma","","RShift","Regular","Repeat","Rest","Return","Revert","SelfType","Self_","Simple","SmolStr","Str","Struct","","Sub","Subscript","Ternary","Trait","","Tuple","","","","","TypeAlias","","TypeDesc","","USub","UnaryOperation","UnaryOperator","Unbounded","Unit","","","Unsafe","Use","","UseTree","VarDecl","VarDeclTarget","Variant","VariantKind","While","WildCard","args","as_str","attributes","body","","","","borrow","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","borrow_mut","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","clone_to_uninit","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","cmp","compare","default","deref","deserialize","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","eq","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","equivalent","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","fields","","fmt","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","from_iter","","","","from_str","functions","","","","generic_params","hash","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","impl_trait","into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","is_const","is_empty","is_heap_allocated","is_pub","is_rest","kind","label","label_span","len","name","","","","","","","","","","name_node","name_span","new","new_inline","new_inline_from_ascii","partial_cmp","pat","pub_","pub_qual","","","","","","receiver","remove_last","return_type","segments","serialize","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","sig","span","","","","to_owned","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","to_string","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","tree","try_from","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","try_into","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","typ","","","typ_span","type_id","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","unsafe_","value","","","variants","version_requirement","args","attr","else_expr","elts","","func","generic_args","if_expr","index","left","","","len","op","","","","operand","right","","","test","value","","","arms","body","","","error","expr","iter","msg","mut_","name","op","or_else","target","","","","test","","","typ","","value","","","","","","label","mut_","","name","typ","bound","name","fields","has_rest","path","args","base","","items","children","path","prefix","","rename","contracts","expressions","functions","module","types","parse_contract_def","parse_call_args","parse_expr","parse_expr_with_min_bp","parse_assert_stmt","parse_fn_def","parse_fn_sig","parse_for_stmt","parse_generic_param","parse_generic_params","parse_if_stmt","parse_match_arms","parse_match_stmt","parse_pattern","parse_return_stmt","parse_revert_stmt","parse_single_word_stmt","parse_stmt","parse_unsafe_block","parse_while_stmt","parse_constant","parse_module","parse_module_stmt","parse_pragma","parse_use","parse_use_tree","parse_enum_def","parse_field","parse_generic_args","parse_impl_def","parse_opt_qualifier","parse_path_tail","parse_struct_def","parse_trait_def","parse_type_alias","parse_type_desc","parse_variant","Amper","AmperEq","And","Arrow","As","Assert","Binary","BraceClose","BraceOpen","BracketClose","BracketOpen","Break","Colon","ColonColon","Comma","Const","Continue","Contract","Dot","DotDot","Else","Enum","Eq","EqEq","Error","False","FatArrow","Fn","For","Gt","GtEq","GtGt","GtGtEq","Hash","Hat","HatEq","Hex","Idx","If","Impl","In","Int","Let","Lexer","Lt","LtEq","LtLt","LtLtEq","Match","Minus","MinusEq","Mut","Name","Newline","Not","NotEq","Octal","Or","ParenClose","ParenOpen","Percent","PercentEq","Pipe","PipeEq","Plus","PlusEq","Pragma","Pub","Return","Revert","SelfType","SelfValue","Semi","Slash","SlashEq","Star","StarEq","StarStar","StarStarEq","Struct","Text","Tilde","Token","TokenKind","Trait","True","Type","Unsafe","Use","While","borrow","","","borrow_mut","","","clone","","","clone_into","","","clone_to_uninit","","","describe","eq","","equivalent","","","","","","","","fmt","","from","","","into","","","into_iter","kind","lex","new","next","source","span","text","to_owned","","","try_from","","","try_into","","","type_id","","","Node","NodeId","Span","Spanned","add","","","","","add_assign","borrow","","","borrow_mut","","","clone","","","clone_into","","","clone_to_uninit","","","cmp","compare","create","default","deserialize","","dummy","","end","eq","","","equivalent","","","","","","","","","","","","file_id","fmt","","","","from","","","","","","","","from_pair","hash","","","id","into","","","is_dummy","","kind","name","","","","","","","","","name_span","new","","partial_cmp","serialize","","span","","","start","to_owned","","","to_string","try_from","","","try_into","","","type_id","","","zero"],"q":[[0,"fe_parser"],[83,"fe_parser::ast"],[1064,"fe_parser::ast::Expr"],[1089,"fe_parser::ast::FuncStmt"],[1116,"fe_parser::ast::FunctionArg"],[1121,"fe_parser::ast::GenericParameter"],[1123,"fe_parser::ast::Pattern"],[1126,"fe_parser::ast::TypeDesc"],[1130,"fe_parser::ast::UseTree"],[1135,"fe_parser::grammar"],[1140,"fe_parser::grammar::contracts"],[1141,"fe_parser::grammar::expressions"],[1144,"fe_parser::grammar::functions"],[1160,"fe_parser::grammar::module"],[1166,"fe_parser::grammar::types"],[1177,"fe_parser::lexer"],[1321,"fe_parser::node"],[1427,"fe_parser::parser"],[1428,"fe_parser::lexer::token"],[1429,"fe_common::diagnostics"],[1430,"alloc::vec"],[1431,"fe_common::span"],[1432,"alloc::string"],[1433,"core::convert"],[1434,"core::ops::function"],[1435,"fe_common::files"],[1436,"core::fmt"],[1437,"core::result"],[1438,"core::hash"],[1439,"codespan_reporting::diagnostic"],[1440,"core::option"],[1441,"core::any"],[1442,"smol_str"],[1443,"core::cmp"],[1444,"serde::de"],[1445,"core::iter::traits::collect"],[1446,"serde::ser"],[1447,"alloc::boxed"],[1448,"vec1"],[1449,"logos::lexer"],[1450,"core::clone"]],"i":"Al`0`````d0`0ln21010101022221011110000222222100210`102101`122`2`22111211002102102102GnGlG`0DlGh2Fb1`555Gd22`Ff53`3`Fd5`66`5`8`5Hb`7`7``6Fl``5``Ed229`83H`<8Gb`44;`=``=Gf:325:1=;`91:11`>`;>Fn;2==:04`;``=`>```>3D`DbDdCfDfDhDj553DlDnE`EbEdEfEh9EjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDb0000CfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDb0000CfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDb000Cf000Dl000Dn000E`000Eb000Ed000Ef000Eh000Df000Ej000El000En000F`000Fb000Fd000Ff000Dd000Fh000Fj000Fl000D`000Dh000Fn000G`000Dj000Gb000Gd000Gf000Gh000Gj000Gl000Gn000H`000Hb000DfEjDb0Cf0Dl0Dn0E`0Eb0Ed0Ef0Eh0::99El0En0F`0Fb0Fd0Ff0Dd0Fh0FjFl0D`Dh0Fn0G`0Dj0Gb0Gd0Gf0Gh0Gj0Gl0Gn0H`0Hb0Db0CfDlDnE`EbEdEfEhDfEjElEnF`FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDb0000EjElEnF`D`5CfDlDnE`EbEdEfEhDf=<;:FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbF`DbCfDlDnE`EbEdEfEhDfEjElEn=FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDdDb01:Fh7>1FfEfEhDfEjElEn97D`7Fn::::Dj2876543F`E`40=CfDlDn3EbEd?>=<;:6FbFdFfDdFhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`HbDbCfDlDnE`EbEd98DfEjElEnF`FbFdFf?FhFjFlD`DhFnG`DjGbGdGfGhGjGlGnH`Hb=EfDd6ElDnIhIjIlJ`Jb442JdJfJhJjJl32Jn204328951K`KbKdKfKh43KjKlKnL`52Lb1876432Ld4312LfLh0Lj11Ll0Ln00M`Mb1MdMhMjMl21``````````````````````````````````````````h000000000000000000000000000000000000000000`00000000000000000000000000000000000000``000000j1Mn120120120120212111122221212012001200011120120120120````Ah000000NdI`210210210210111120212210222211110000221002221110022100210210000000000020120Nb11332113213213213","f":"`````````{{{f{bd}}h}j}`{f{{f{c}}}{}}00{{{f{b}}}{{f{bc}}}{}}00{{{f{l}}}l}{{{f{n}}}n}{{f{f{bc}}}A`{}}0{{fAb}A`}0{dAd}{{{f{bd}}}Af}{{{f{bd}}}A`}{{{f{bd}}Ah{f{Aj}}}{{Al{A`}}}}{{{f{l}}{f{l}}}Af}{{{f{n}}{f{n}}}Af}{{f{f{c}}}Af{}}0000000{{{f{bd}}Ahc}A`{{B`{An}}}}{{{f{bd}}hc}{{Al{j}}}{{B`{An}}}}{{{f{bd}}{f{Aj}}}{{Al{A`}}}}{{{f{bd}}hce}{{Al{j}}}{{B`{An}}}{{Bd{{f{j}}}{{Bb{{Ad{An}}}}}}}}{{{f{bd}}c{Ad{l}}{Ad{An}}}A`{{B`{An}}}}{dBf}{{{f{l}}{f{bBh}}}{{Bl{A`Bj}}}}{{{f{n}}{f{bBh}}}Bn}{{{f{n}}{f{bBh}}}{{Bl{A`Bj}}}}{cc{}}00`{{{f{l}}{f{bc}}}A`C`}{{{f{n}}{f{bc}}}A`C`}{{}c{}}00{l{{Cb{Bf}}}}`{lAn}{{Bf{f{Aj}}}d}{{{f{bd}}}{{Al{j}}}}`{{{f{bd}}h}{{Cd{j}}}}{{Bf{f{Aj}}}{{Cj{Cf{Ad{Ch}}}}}}{{{f{bd}}}{{Cd{h}}}}{{{f{bd}}}{{Al{h}}}}{{Ahc}l{{B`{An}}}}0{lAh}6{lCl}{fc{}}0{fAn}{c{{Bl{e}}}{}{}}00{{}{{Bl{c}}}{}}00{fCn}00{{{f{bd}}{f{j}}c{Ad{An}}}A`{{B`{An}}}}```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````{D`Ad}{{{f{Db}}}{{f{Aj}}}}{DdAd}{CfAd}{DfAd}{DhAd}{DjAd}5{f{{f{c}}}{}}0000000000000000000000000000000000{{{f{b}}}{{f{bc}}}{}}0000000000000000000000000000000000{{{f{Db}}}Db}{{{f{Cf}}}Cf}{{{f{Dl}}}Dl}{{{f{Dn}}}Dn}{{{f{E`}}}E`}{{{f{Eb}}}Eb}{{{f{Ed}}}Ed}{{{f{Ef}}}Ef}{{{f{Eh}}}Eh}{{{f{Df}}}Df}{{{f{Ej}}}Ej}{{{f{El}}}El}{{{f{En}}}En}{{{f{F`}}}F`}{{{f{Fb}}}Fb}{{{f{Fd}}}Fd}{{{f{Ff}}}Ff}{{{f{Dd}}}Dd}{{{f{Fh}}}Fh}{{{f{Fj}}}Fj}{{{f{Fl}}}Fl}{{{f{D`}}}D`}{{{f{Dh}}}Dh}{{{f{Fn}}}Fn}{{{f{G`}}}G`}{{{f{Dj}}}Dj}{{{f{Gb}}}Gb}{{{f{Gd}}}Gd}{{{f{Gf}}}Gf}{{{f{Gh}}}Gh}{{{f{Gj}}}Gj}{{{f{Gl}}}Gl}{{{f{Gn}}}Gn}{{{f{H`}}}H`}{{{f{Hb}}}Hb}{{f{f{bc}}}A`{}}0000000000000000000000000000000000{{fAb}A`}0000000000000000000000000000000000{{{f{Db}}{f{Db}}}Hd}{{f{f{c}}}Hd{}}{{}Db}{{{f{Db}}}{{f{Aj}}}}{c{{Bl{Db}}}Hf}{c{{Bl{Cf}}}Hf}{c{{Bl{Dl}}}Hf}{c{{Bl{Dn}}}Hf}{c{{Bl{E`}}}Hf}{c{{Bl{Eb}}}Hf}{c{{Bl{Ed}}}Hf}{c{{Bl{Ef}}}Hf}{c{{Bl{Eh}}}Hf}{c{{Bl{Df}}}Hf}{c{{Bl{Ej}}}Hf}{c{{Bl{El}}}Hf}{c{{Bl{En}}}Hf}{c{{Bl{F`}}}Hf}{c{{Bl{Fb}}}Hf}{c{{Bl{Fd}}}Hf}{c{{Bl{Ff}}}Hf}{c{{Bl{Dd}}}Hf}{c{{Bl{Fh}}}Hf}{c{{Bl{Fj}}}Hf}{c{{Bl{Fl}}}Hf}{c{{Bl{D`}}}Hf}{c{{Bl{Dh}}}Hf}{c{{Bl{Fn}}}Hf}{c{{Bl{G`}}}Hf}{c{{Bl{Dj}}}Hf}{c{{Bl{Gb}}}Hf}{c{{Bl{Gd}}}Hf}{c{{Bl{Gf}}}Hf}{c{{Bl{Gh}}}Hf}{c{{Bl{Gj}}}Hf}{c{{Bl{Gl}}}Hf}{c{{Bl{Gn}}}Hf}{c{{Bl{H`}}}Hf}{c{{Bl{Hb}}}Hf}{{{f{Db}}{f{{f{Aj}}}}}Af}{{{f{Db}}{f{Aj}}}Af}{{{f{Db}}{f{An}}}Af}{{{f{Db}}{f{Db}}}Af}{{{f{Db}}{f{{f{An}}}}}Af}{{{f{Cf}}{f{Cf}}}Af}{{{f{Dl}}{f{Dl}}}Af}{{{f{Dn}}{f{Dn}}}Af}{{{f{E`}}{f{E`}}}Af}{{{f{Eb}}{f{Eb}}}Af}{{{f{Ed}}{f{Ed}}}Af}{{{f{Ef}}{f{Ef}}}Af}{{{f{Eh}}{f{Eh}}}Af}{{{f{Df}}{f{Df}}}Af}{{{f{Ej}}{f{Ej}}}Af}{{{f{El}}{f{El}}}Af}{{{f{En}}{f{En}}}Af}{{{f{F`}}{f{F`}}}Af}{{{f{Fb}}{f{Fb}}}Af}{{{f{Fd}}{f{Fd}}}Af}{{{f{Ff}}{f{Ff}}}Af}{{{f{Dd}}{f{Dd}}}Af}{{{f{Fh}}{f{Fh}}}Af}{{{f{Fj}}{f{Fj}}}Af}{{{f{Fl}}{f{Fl}}}Af}{{{f{D`}}{f{D`}}}Af}{{{f{Dh}}{f{Dh}}}Af}{{{f{Fn}}{f{Fn}}}Af}{{{f{G`}}{f{G`}}}Af}{{{f{Dj}}{f{Dj}}}Af}{{{f{Gb}}{f{Gb}}}Af}{{{f{Gd}}{f{Gd}}}Af}{{{f{Gf}}{f{Gf}}}Af}{{{f{Gh}}{f{Gh}}}Af}{{{f{Gj}}{f{Gj}}}Af}{{{f{Gl}}{f{Gl}}}Af}{{{f{Gn}}{f{Gn}}}Af}{{{f{H`}}{f{H`}}}Af}{{{f{Hb}}{f{Hb}}}Af}{{f{f{c}}}Af{}}0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000{DfAd}{EjAd}{{{f{Db}}{f{bBh}}}{{Bl{A`Bj}}}}0{{{f{Cf}}{f{bBh}}}Bn}0{{{f{Dl}}{f{bBh}}}Bn}0{{{f{Dn}}{f{bBh}}}Bn}0{{{f{E`}}{f{bBh}}}Bn}0{{{f{Eb}}{f{bBh}}}Bn}0{{{f{Ed}}{f{bBh}}}Bn}0{{{f{Ef}}{f{bBh}}}Bn}0{{{f{Eh}}{f{bBh}}}Bn}0{{{f{Df}}{f{bBh}}}Bn}0{{{f{Ej}}{f{bBh}}}Bn}0{{{f{El}}{f{bBh}}}Bn}0{{{f{En}}{f{bBh}}}Bn}0{{{f{F`}}{f{bBh}}}Bn}0{{{f{Fb}}{f{bBh}}}Bn}0{{{f{Fd}}{f{bBh}}}Bn}0{{{f{Ff}}{f{bBh}}}Bn}0{{{f{Dd}}{f{bBh}}}Bn}0{{{f{Fh}}{f{bBh}}}Bn}0{{{f{Fj}}{f{bBh}}}Bn}{{{f{Fl}}{f{bBh}}}Bn}0{{{f{D`}}{f{bBh}}}Bn}{{{f{Dh}}{f{bBh}}}Bn}0{{{f{Fn}}{f{bBh}}}Bn}0{{{f{G`}}{f{bBh}}}Bn}0{{{f{Dj}}{f{bBh}}}Bn}0{{{f{Gb}}{f{bBh}}}Bn}0{{{f{Gd}}{f{bBh}}}Bn}0{{{f{Gf}}{f{bBh}}}Bn}0{{{f{Gh}}{f{bBh}}}Bn}0{{{f{Gj}}{f{bBh}}}Bn}0{{{f{Gl}}{f{bBh}}}Bn}0{{{f{Gn}}{f{bBh}}}Bn}0{{{f{H`}}{f{bBh}}}Bn}0{{{f{Hb}}{f{bBh}}}Bn}0{cc{}}{cDb{{Hh{Aj}}}}1111111111111111111111111111111111{cDb{{Hl{}{{Hj{{f{An}}}}}}}}{cDb{{Hl{}{{Hj{{f{Aj}}}}}}}}{cDb{{Hl{}{{Hj{An}}}}}}{cDb{{Hl{}{{Hj{Hn}}}}}}{{{f{Aj}}}{{Bl{Db}}}}{EjAd}{ElAd}{EnAd}{F`Ad}{D`I`}{{{f{Db}}{f{bc}}}A`C`}{{{f{Cf}}{f{bc}}}A`C`}{{{f{Dl}}{f{bc}}}A`C`}{{{f{Dn}}{f{bc}}}A`C`}{{{f{E`}}{f{bc}}}A`C`}{{{f{Eb}}{f{bc}}}A`C`}{{{f{Ed}}{f{bc}}}A`C`}{{{f{Ef}}{f{bc}}}A`C`}{{{f{Eh}}{f{bc}}}A`C`}{{{f{Df}}{f{bc}}}A`C`}{{{f{Ej}}{f{bc}}}A`C`}{{{f{El}}{f{bc}}}A`C`}{{{f{En}}{f{bc}}}A`C`}{{{f{F`}}{f{bc}}}A`C`}{{{f{Fb}}{f{bc}}}A`C`}{{{f{Fd}}{f{bc}}}A`C`}{{{f{Ff}}{f{bc}}}A`C`}{{{f{Dd}}{f{bc}}}A`C`}{{{f{Fh}}{f{bc}}}A`C`}{{{f{Fj}}{f{bc}}}A`C`}{{{f{Fl}}{f{bc}}}A`C`}{{{f{D`}}{f{bc}}}A`C`}{{{f{Dh}}{f{bc}}}A`C`}{{{f{Fn}}{f{bc}}}A`C`}{{{f{G`}}{f{bc}}}A`C`}{{{f{Dj}}{f{bc}}}A`C`}{{{f{Gb}}{f{bc}}}A`C`}{{{f{Gd}}{f{bc}}}A`C`}{{{f{Gf}}{f{bc}}}A`C`}{{{f{Gh}}{f{bc}}}A`C`}{{{f{Gj}}{f{bc}}}A`C`}{{{f{Gl}}{f{bc}}}A`C`}{{{f{Gn}}{f{bc}}}A`C`}{{{f{H`}}{f{bc}}}A`C`}{{{f{Hb}}{f{bc}}}A`C`}{F`I`}{{}c{}}0000000000000000000000000000000000{DdAf}{{{f{Db}}}Af}01{{{f{Gb}}}Af}{FhFj}{GjCd}{{{f{Fn}}}{{Cd{Ah}}}}{{{f{Db}}}Ib}{{{f{Ff}}}Db}{EfI`}{EhI`}{DfI`}{EjI`}{ElI`}{EnI`}{DdI`}{FhI`}{D`I`}{{{f{Ff}}}{{I`{Db}}}}<{cDb{{Hh{Aj}}}}{{{f{Aj}}}Db}{{Ib{f{{Id{Ab}}}}}Db}{{{f{Db}}{f{Db}}}{{Cd{Hd}}}}{DjI`}{D`Cd}{EfCd}{EhCd}{DfCd}{EjCd}{ElCd}{EnCd}{F`I`}{{{f{E`}}}E`}8{E`Ad}{{{f{Db}}c}BlIf}{{{f{Cf}}c}BlIf}{{{f{Dl}}c}BlIf}{{{f{Dn}}c}BlIf}{{{f{E`}}c}BlIf}{{{f{Eb}}c}BlIf}{{{f{Ed}}c}BlIf}{{{f{Ef}}c}BlIf}{{{f{Eh}}c}BlIf}{{{f{Df}}c}BlIf}{{{f{Ej}}c}BlIf}{{{f{El}}c}BlIf}{{{f{En}}c}BlIf}{{{f{F`}}c}BlIf}{{{f{Fb}}c}BlIf}{{{f{Fd}}c}BlIf}{{{f{Ff}}c}BlIf}{{{f{Dd}}c}BlIf}{{{f{Fh}}c}BlIf}{{{f{Fj}}c}BlIf}{{{f{Fl}}c}BlIf}{{{f{D`}}c}BlIf}{{{f{Dh}}c}BlIf}{{{f{Fn}}c}BlIf}{{{f{G`}}c}BlIf}{{{f{Dj}}c}BlIf}{{{f{Gb}}c}BlIf}{{{f{Gd}}c}BlIf}{{{f{Gf}}c}BlIf}{{{f{Gh}}c}BlIf}{{{f{Gj}}c}BlIf}{{{f{Gl}}c}BlIf}{{{f{Gn}}c}BlIf}{{{f{H`}}c}BlIf}{{{f{Hb}}c}BlIf}{DhI`}{{{f{Dl}}}Ah}{{{f{Fd}}}Ah}{{{f{Ff}}}Ah}{{{f{Fl}}}Ah}{fc{}}0000000000000000000000000000000000{{{f{Db}}}An}{fAn}00000000000000000000000000000000{EbI`}{c{{Bl{e}}}{}{}}0000000000000000000000000000000000{{}{{Bl{c}}}{}}0000000000000000000000000000000000{EfI`}{EhI`}{DdI`}{{{f{Fn}}}{{Cd{Ah}}}}{fCn}0000000000000000000000000000000000{D`Cd}5{DdCd}{GjI`}{ElAd}{DnI`}{IhI`}{IjI`}{IlIn}{J`Ad}{JbAd}{IhIn}{IhCd}4{JdIn}{JfIn}{JhIn}{JjIn}{JlIn}{JfI`}{JhI`}{JnI`}{JjI`}{JnIn}876>{IjIn}:6{K`Ad}{KbAd}{KdAd}{KfAd}{KhCd}{K`I`}{KbI`}{KjCd}{KlCd}{KnI`}{L`I`}7{KlI`}{LbI`}26{KdI`}{KfI`}{KjI`}46{LdCd}8746{LfI`}{LhCd}0{LjCd}{LhI`}0{LlI`}0{LnAd}{LnAf}{LnI`}{M`I`}{MbDb}1{MdMf}{MhAd}{MjE`}{MlE`}{MhE`}{MjCd}`````{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Df}}}}}}{{{f{bd}}}{{Al{{I`{{Ad{{I`{Gj}}}}}}}}}}{{{f{bd}}}{{Al{{I`{Gh}}}}}}{{{f{bd}}Ab}{{Al{{I`{Gh}}}}}}{{{f{bd}}}{{Al{{I`{G`}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Dh}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{D`}}}}}}2{{{f{bd}}}{{Al{Ff}}}}{{{f{bd}}}{{Al{{I`{{Ad{Ff}}}}}}}}4{{{f{bd}}}{{Al{{Ad{{I`{Dj}}}}}}}}5{{{f{bd}}}{{Al{{I`{Gb}}}}}}666666{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Ef}}}}}}{{{f{bd}}}{{I`{Cf}}}}{{{f{bd}}}{{Al{Dl}}}}{{{f{bd}}}{{Al{{I`{Dn}}}}}}{{{f{bd}}}{{Al{{I`{Eb}}}}}}{{{f{bd}}}{{Al{{I`{Ed}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{El}}}}}}{{{f{bd}}{Ad{{I`{Db}}}}{Cd{Ah}}{Cd{Ah}}}{{Al{{I`{Dd}}}}}}{{{f{bd}}}{{Al{{I`{{Ad{Fd}}}}}}}}{{{f{bd}}}{{Al{{I`{F`}}}}}}{{{f{bd}}h}{{Cd{Ah}}}}{{{f{bd}}{I`{Db}}}{{Cj{E`Ah{Cd{j}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Ej}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{En}}}}}}{{{f{bd}}{Cd{Ah}}}{{Al{{I`{Eh}}}}}}{{{f{bd}}}{{Al{{I`{Fb}}}}}}{{{f{bd}}}{{Al{{I`{Fh}}}}}}``````````````````````````````````````````````````````````````````````````````````````````{f{{f{c}}}{}}00{{{f{b}}}{{f{bc}}}{}}00{{{f{j}}}j}{{{f{h}}}h}{{{f{Mn}}}Mn}{{f{f{bc}}}A`{}}00{{fAb}A`}00{{{f{h}}}{{f{Aj}}}}{{{f{j}}{f{j}}}Af}{{{f{h}}{f{h}}}Af}{{f{f{c}}}Af{}}0000000{{{f{j}}{f{bBh}}}Bn}{{{f{h}}{f{bBh}}}Bn}{cc{}}00{{}c{}}00{{}c{}}{jh}{{{f{b{N`{h}}}}}A`}{{Bf{f{Aj}}}Mn}{{{f{bMn}}}{{Cd{c}}}{}}{{{f{Mn}}}{{f{Aj}}}}{jAh}{jf}{fc{}}00{c{{Bl{e}}}{}{}}00{{}{{Bl{c}}}{}}00{fCn}00````{{Ah{f{c}}}AhNb}{{Ah{Cd{{f{c}}}}}Ah{}}{{Ah{Cd{Ah}}}Ah}{{AhAh}Ah}{{Ah{f{j}}}Ah}{{{f{bAh}}c}A`{}}{f{{f{c}}}{}}00{{{f{b}}}{{f{bc}}}{}}00{{{f{Ah}}}Ah}{{{f{Nd}}}Nd}{{{f{{I`{c}}}}}{{I`{c}}}Nf}{{f{f{bc}}}A`{}}00{{fAb}A`}00{{{f{Nd}}{f{Nd}}}Hd}{{f{f{c}}}Hd{}}{{}Nd}0{c{{Bl{Ah}}}Hf}{c{{Bl{{I`{e}}}}}HfNh}{{}Ah}3{AhIb}{{{f{Ah}}{f{Ah}}}Af}{{{f{Nd}}{f{Nd}}}Af}{{{f{{I`{c}}}}{f{{I`{c}}}}}AfNj}{{f{f{c}}}Af{}}00000000000{AhBf}{{{f{Ah}}{f{bBh}}}{{Bl{A`Bj}}}}{{{f{Nd}}{f{bBh}}}Bn}{{{f{{I`{c}}}}{f{bBh}}}BnNl}{{{f{{I`{Dh}}}}{f{bBh}}}Bn}{cc{}}{{{f{{I`{c}}}}}Ah{}}{{{f{{In{{I`{c}}}}}}}Ah{}}{{{f{{I`{c}}}}}Nd{}}3{{{f{{In{{I`{c}}}}}}}Nd{}}4{j{{I`{Db}}}}{{ce}Ah{{B`{Ah}}}{{B`{Ah}}}}{{{f{Ah}}{f{bc}}}A`C`}{{{f{Nd}}{f{bc}}}A`C`}{{{f{{I`{c}}}}{f{be}}}A`NnC`}{I`Nd}{{}c{}}00{{{f{Ah}}}Af}{NdAf}{I`}{{{f{{I`{Dd}}}}}{{f{Aj}}}}{{{f{{I`{Ej}}}}}{{f{Aj}}}}{{{f{{I`{Dh}}}}}{{f{Aj}}}}{{{f{{I`{Eh}}}}}{{f{Aj}}}}{{{f{{I`{En}}}}}{{f{Aj}}}}{{{f{{I`{Fn}}}}}{{f{Aj}}}}{{{f{{I`{Df}}}}}{{f{Aj}}}}{{{f{{I`{Fh}}}}}{{f{Aj}}}}{{{f{{I`{El}}}}}{{f{Aj}}}}{{{f{{I`{Fn}}}}}Ah}{{BfIbIb}Ah}{{cAh}{{I`{c}}}{}}{{{f{Nd}}{f{Nd}}}{{Cd{Hd}}}}{{{f{Ah}}c}BlIf}{{{f{{I`{c}}}}e}BlO`If}{{{f{Nb}}}Ah}{{{f{{I`{c}}}}}Ah{}}{I`Ah}{AhIb}{fc{}}00{fAn}{c{{Bl{e}}}{}{}}00{{}{{Bl{c}}}{}}00{fCn}00{BfAh}","D":"AE`","p":[[0,"mut"],[5,"Parser",0,1427],[1,"reference",null,null,1],[6,"TokenKind",1177,1428],[5,"Token",1177,1428],[5,"Label",0,1429],[5,"ParseFailed",0,1427],[1,"unit"],[1,"u8"],[5,"Vec",1430],[1,"bool"],[5,"Span",1321,1431],[1,"str"],[8,"ParseResult",0,1427],[5,"String",1432],[10,"Into",1433,null,1],[17,"Output"],[10,"FnOnce",1434],[5,"SourceFileId",1435],[5,"Formatter",1436],[5,"Error",1436],[6,"Result",1437,null,1],[8,"Result",1436],[10,"Hasher",1438],[5,"Label",1439],[6,"Option",1440,null,1],[5,"Module",83],[5,"Diagnostic",1429],[1,"tuple",null,null,1],[6,"LabelStyle",1429],[5,"TypeId",1441],[5,"FunctionSignature",83],[5,"SmolStr",83,1442],[5,"Field",83],[5,"Contract",83],[5,"Function",83],[5,"MatchArm",83],[6,"ModuleStmt",83],[5,"Pragma",83],[5,"Path",83],[5,"Use",83],[6,"UseTree",83],[5,"ConstantDecl",83],[5,"TypeAlias",83],[5,"Struct",83],[5,"Enum",83],[5,"Trait",83],[5,"Impl",83],[6,"TypeDesc",83],[6,"GenericArg",83],[6,"GenericParameter",83],[5,"Variant",83],[6,"VariantKind",83],[6,"ContractStmt",83],[6,"FunctionArg",83],[6,"FuncStmt",83],[6,"Pattern",83],[6,"LiteralPattern",83],[6,"VarDeclTarget",83],[6,"Expr",83],[5,"CallArg",83],[6,"BoolOperator",83],[6,"BinOperator",83],[6,"UnaryOperator",83],[6,"CompOperator",83],[6,"Ordering",1443],[10,"Deserializer",1444],[10,"AsRef",1433],[17,"Item"],[10,"IntoIterator",1445],[1,"char"],[5,"Node",1321],[1,"usize"],[1,"slice"],[10,"Serializer",1446],[15,"Call",1064],[15,"Attribute",1064],[15,"Ternary",1064],[5,"Box",1447,null,1],[15,"List",1064],[15,"Tuple",1064],[15,"Subscript",1064],[15,"BoolOperation",1064],[15,"BinOperation",1064],[15,"CompOperation",1064],[15,"Repeat",1064],[15,"UnaryOperation",1064],[15,"Match",1089],[15,"For",1089],[15,"While",1089],[15,"If",1089],[15,"Revert",1089],[15,"Assert",1089],[15,"VarDecl",1089],[15,"ConstantDecl",1089],[15,"AugAssign",1089],[15,"Assign",1089],[15,"Return",1089],[15,"Expr",1089],[15,"Regular",1116],[15,"Self_",1116],[15,"Bounded",1121],[15,"PathStruct",1123],[15,"Generic",1126],[15,"Base",1126],[15,"Tuple",1126],[5,"Vec1",1448],[15,"Nested",1130],[15,"Simple",1130],[15,"Glob",1130],[5,"Lexer",1177],[5,"Lexer",1449],[10,"Spanned",1321,1431],[5,"NodeId",1321],[10,"Clone",1450],[10,"Deserialize",1444],[10,"PartialEq",1443],[10,"Debug",1436],[10,"Hash",1438],[10,"Serialize",1446]],"r":[[0,1427],[1,1429],[2,1427],[3,1427],[4,1427],[5,1427],[6,1428],[7,1428],[8,1427],[9,1427],[11,1427],[12,1429],[13,1427],[14,1427],[15,1429],[16,1427],[17,1429],[18,1427],[19,1429],[20,1427],[21,1429],[22,1427],[23,1427],[24,1427],[25,1427],[26,1427],[27,1429],[28,1427],[29,1429],[30,1429],[31,1429],[32,1429],[33,1427],[34,1427],[35,1427],[36,1427],[37,1427],[38,1427],[39,1427],[40,1427],[41,1427],[42,1427],[43,1429],[44,1427],[45,1427],[46,1427],[47,1429],[48,1427],[50,1429],[51,1427],[52,1427],[53,1429],[54,1427],[55,1429],[57,1429],[58,1427],[59,1427],[61,1427],[63,1427],[64,1427],[65,1429],[66,1429],[67,1429],[68,1427],[69,1429],[70,1429],[71,1427],[72,1427],[73,1427],[74,1429],[75,1427],[76,1427],[77,1429],[78,1427],[79,1427],[80,1429],[81,1427],[82,1427],[179,1442],[215,1442],[221,1442],[222,1442],[257,1442],[292,1442],[327,1442],[362,1442],[397,1442],[398,1442],[399,1442],[400,1442],[401,1442],[436,1442],[437,1442],[438,1442],[439,1442],[440,1442],[475,1442],[476,1442],[477,1442],[478,1442],[617,1442],[618,1442],[685,1442],[686,1442],[721,1442],[722,1442],[723,1442],[724,1442],[725,1442],[731,1442],[767,1442],[803,1442],[804,1442],[810,1442],[823,1442],[824,1442],[825,1442],[826,1442],[839,1442],[879,1442],[914,1442],[915,1442],[949,1442],[984,1442],[1023,1442],[1177,1428],[1178,1428],[1179,1428],[1180,1428],[1181,1428],[1182,1428],[1183,1428],[1184,1428],[1185,1428],[1186,1428],[1187,1428],[1188,1428],[1189,1428],[1190,1428],[1191,1428],[1192,1428],[1193,1428],[1194,1428],[1195,1428],[1196,1428],[1197,1428],[1198,1428],[1199,1428],[1200,1428],[1201,1428],[1202,1428],[1203,1428],[1204,1428],[1205,1428],[1206,1428],[1207,1428],[1208,1428],[1209,1428],[1210,1428],[1211,1428],[1212,1428],[1213,1428],[1214,1428],[1215,1428],[1216,1428],[1217,1428],[1218,1428],[1219,1428],[1221,1428],[1222,1428],[1223,1428],[1224,1428],[1225,1428],[1226,1428],[1227,1428],[1228,1428],[1229,1428],[1230,1428],[1231,1428],[1232,1428],[1233,1428],[1234,1428],[1235,1428],[1236,1428],[1237,1428],[1238,1428],[1239,1428],[1240,1428],[1241,1428],[1242,1428],[1243,1428],[1244,1428],[1245,1428],[1246,1428],[1247,1428],[1248,1428],[1249,1428],[1250,1428],[1251,1428],[1252,1428],[1253,1428],[1254,1428],[1255,1428],[1256,1428],[1257,1428],[1258,1428],[1259,1428],[1260,1428],[1261,1428],[1262,1428],[1263,1428],[1264,1428],[1265,1428],[1266,1428],[1267,1428],[1268,1428],[1270,1428],[1271,1428],[1273,1428],[1274,1428],[1276,1428],[1277,1428],[1279,1428],[1280,1428],[1282,1428],[1283,1428],[1284,1428],[1285,1428],[1286,1428],[1287,1428],[1288,1428],[1289,1428],[1290,1428],[1291,1428],[1292,1428],[1293,1428],[1294,1428],[1295,1428],[1296,1428],[1298,1428],[1299,1428],[1302,1428],[1303,1428],[1307,1428],[1308,1428],[1309,1428],[1310,1428],[1312,1428],[1313,1428],[1315,1428],[1316,1428],[1318,1428],[1319,1428],[1323,1431],[1324,1431],[1325,1431],[1326,1431],[1327,1431],[1328,1431],[1329,1431],[1330,1431],[1331,1431],[1334,1431],[1337,1431],[1340,1431],[1343,1431],[1350,1431],[1352,1431],[1354,1431],[1355,1431],[1358,1431],[1359,1431],[1360,1431],[1361,1431],[1370,1431],[1371,1431],[1375,1431],[1376,1431],[1377,1431],[1383,1431],[1384,1431],[1388,1431],[1391,1431],[1404,1431],[1407,1431],[1409,1431],[1412,1431],[1413,1431],[1417,1431],[1420,1431],[1423,1431],[1426,1431]],"b":[[44,"impl-Debug-for-ParseFailed"],[45,"impl-Display-for-ParseFailed"],[436,"impl-PartialEq%3C%26str%3E-for-SmolStr"],[437,"impl-PartialEq%3Cstr%3E-for-SmolStr"],[438,"impl-PartialEq%3CString%3E-for-SmolStr"],[439,"impl-PartialEq-for-SmolStr"],[440,"impl-PartialEq%3C%26String%3E-for-SmolStr"],[617,"impl-Debug-for-SmolStr"],[618,"impl-Display-for-SmolStr"],[619,"impl-Display-for-Module"],[620,"impl-Debug-for-Module"],[621,"impl-Display-for-ModuleStmt"],[622,"impl-Debug-for-ModuleStmt"],[623,"impl-Display-for-Pragma"],[624,"impl-Debug-for-Pragma"],[625,"impl-Debug-for-Path"],[626,"impl-Display-for-Path"],[627,"impl-Display-for-Use"],[628,"impl-Debug-for-Use"],[629,"impl-Display-for-UseTree"],[630,"impl-Debug-for-UseTree"],[631,"impl-Display-for-ConstantDecl"],[632,"impl-Debug-for-ConstantDecl"],[633,"impl-Debug-for-TypeAlias"],[634,"impl-Display-for-TypeAlias"],[635,"impl-Debug-for-Contract"],[636,"impl-Display-for-Contract"],[637,"impl-Debug-for-Struct"],[638,"impl-Display-for-Struct"],[639,"impl-Display-for-Enum"],[640,"impl-Debug-for-Enum"],[641,"impl-Display-for-Trait"],[642,"impl-Debug-for-Trait"],[643,"impl-Display-for-Impl"],[644,"impl-Debug-for-Impl"],[645,"impl-Display-for-TypeDesc"],[646,"impl-Debug-for-TypeDesc"],[647,"impl-Debug-for-GenericArg"],[648,"impl-Display-for-GenericArg"],[649,"impl-Debug-for-GenericParameter"],[650,"impl-Display-for-GenericParameter"],[651,"impl-Debug-for-Field"],[652,"impl-Display-for-Field"],[653,"impl-Display-for-Variant"],[654,"impl-Debug-for-Variant"],[656,"impl-Display-for-ContractStmt"],[657,"impl-Debug-for-ContractStmt"],[659,"impl-Display-for-Function"],[660,"impl-Debug-for-Function"],[661,"impl-Display-for-FunctionArg"],[662,"impl-Debug-for-FunctionArg"],[663,"impl-Debug-for-FuncStmt"],[664,"impl-Display-for-FuncStmt"],[665,"impl-Display-for-MatchArm"],[666,"impl-Debug-for-MatchArm"],[667,"impl-Debug-for-Pattern"],[668,"impl-Display-for-Pattern"],[669,"impl-Display-for-LiteralPattern"],[670,"impl-Debug-for-LiteralPattern"],[671,"impl-Debug-for-VarDeclTarget"],[672,"impl-Display-for-VarDeclTarget"],[673,"impl-Debug-for-Expr"],[674,"impl-Display-for-Expr"],[675,"impl-Display-for-CallArg"],[676,"impl-Debug-for-CallArg"],[677,"impl-Display-for-BoolOperator"],[678,"impl-Debug-for-BoolOperator"],[679,"impl-Display-for-BinOperator"],[680,"impl-Debug-for-BinOperator"],[681,"impl-Display-for-UnaryOperator"],[682,"impl-Debug-for-UnaryOperator"],[683,"impl-Debug-for-CompOperator"],[684,"impl-Display-for-CompOperator"],[721,"impl-FromIterator%3C%26String%3E-for-SmolStr"],[722,"impl-FromIterator%3C%26str%3E-for-SmolStr"],[723,"impl-FromIterator%3CString%3E-for-SmolStr"],[724,"impl-FromIterator%3Cchar%3E-for-SmolStr"],[1325,"impl-Add%3C%26T%3E-for-Span"],[1326,"impl-Add%3COption%3C%26T%3E%3E-for-Span"],[1327,"impl-Add%3COption%3CSpan%3E%3E-for-Span"],[1328,"impl-Add-for-Span"],[1329,"impl-Add%3C%26Token%3C\'a%3E%3E-for-Span"],[1373,"impl-Debug-for-Node%3CT%3E"],[1374,"impl-Display-for-Node%3CFunction%3E"],[1376,"impl-From%3C%26Node%3CT%3E%3E-for-Span"],[1377,"impl-From%3C%26Box%3CNode%3CT%3E%3E%3E-for-Span"],[1378,"impl-From%3C%26Node%3CT%3E%3E-for-NodeId"],[1380,"impl-From%3C%26Box%3CNode%3CT%3E%3E%3E-for-NodeId"],[1394,"impl-Node%3CField%3E"],[1395,"impl-Node%3CStruct%3E"],[1396,"impl-Node%3CFunction%3E"],[1397,"impl-Node%3CTypeAlias%3E"],[1398,"impl-Node%3CTrait%3E"],[1399,"impl-Node%3CFunctionArg%3E"],[1400,"impl-Node%3CContract%3E"],[1401,"impl-Node%3CVariant%3E"],[1402,"impl-Node%3CEnum%3E"]],"c":"OjAAAAEAAAAAAAAAEAAAADoD","e":"OzAAAAEAAOsEKwAAAAAAAgAAAAQAAQAHAAEACwAMABoAAAAcAAkAKwADADIAAgA5AAEAPQAAAEQAAABGAAwAVAAkAHoAEwCPAA4AnwADAKQAAACnAAYArwAEALUACADAAAoAzAAGANUAAADXANYBrwIAANICLQAjAxUAOgM6AYAEAACCBAAAmgRoAAQFCwAWBQIAGgUAABwFDwAtBR0ATAUTAGEFAgBlBQAAZwUFAHAFFACGBQ0A","P":[[11,"T"],[17,""],[19,"T"],[21,""],[29,"K"],[37,"S"],[39,""],[40,"Str,NotesFn"],[41,"S"],[42,""],[46,"T"],[50,"__H"],[52,"U"],[55,""],[65,"S"],[67,""],[70,"T"],[72,""],[73,"U,T"],[76,"U"],[79,""],[82,"S"],[214,""],[222,"T"],[292,""],[327,"T"],[362,""],[398,"K"],[399,""],[401,"D"],[402,"__D"],[436,""],[475,"K"],[615,""],[685,"T"],[721,"I"],[725,""],[731,"H"],[732,"__H"],[766,""],[767,"U"],[802,""],[823,"T"],[824,""],[839,"S"],[840,"__S"],[874,""],[879,"T"],[914,""],[949,"U,T"],[984,"U"],[1019,""],[1267,"T"],[1273,""],[1276,"T"],[1279,""],[1285,"K"],[1293,""],[1295,"T"],[1298,"U"],[1301,"I"],[1302,""],[1305,"Iterator::Item"],[1306,""],[1309,"T"],[1312,"U,T"],[1315,"U"],[1318,""],[1325,"T"],[1327,""],[1330,"T"],[1337,""],[1339,"T"],[1343,""],[1347,"K"],[1348,""],[1350,"__D"],[1351,"__D,T"],[1352,""],[1357,"T"],[1358,"K"],[1370,""],[1373,"T"],[1374,""],[1375,"T"],[1382,""],[1383,"S,E"],[1384,"__H"],[1386,"T,__H"],[1387,""],[1388,"U"],[1391,""],[1405,"T"],[1406,""],[1407,"__S"],[1408,"T,__S"],[1409,""],[1410,"T"],[1411,""],[1413,"T"],[1416,""],[1417,"U,T"],[1420,"U"],[1423,""]]}],["fe_test_files",{"t":"HHHHH","n":["fixture","fixture_bytes","fixture_dir","fixture_dir_files","new_fixture_dir_files"],"q":[[0,"fe_test_files"],[5,"include_dir::dir"],[6,"alloc::vec"]],"i":"`````","f":"{{{d{b}}}{{d{b}}}}{{{d{b}}}{{d{{h{f}}}}}}{{{d{b}}}{{d{j}}}}{{{d{b}}}{{n{{l{{d{b}}{d{b}}}}}}}}0","D":"d","p":[[1,"str"],[1,"reference",null,null,1],[1,"u8"],[1,"slice"],[5,"Dir",5],[1,"tuple",null,null,1],[5,"Vec",6]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OjAAAAEAAAAAAAMAEAAAAAAAAQACAAMA","P":[]}],["fe_test_runner",{"t":"FNNEHNNNNNNNNNNNNNNNNNNN","n":["TestSink","borrow","borrow_mut","ethabi","execute","failure_count","failure_details","fmt","","from","inc_success_count","insert_failure","insert_logs","into","logs_count","logs_details","new","success_count","test_count","to_string","try_from","try_into","type_id","vzip"],"q":[[0,"fe_test_runner"],[24,"ethabi::event"],[25,"alloc::string"],[26,"core::fmt"],[27,"core::result"],[28,"core::any"]],"i":"`l0``0000000000000000000","f":"`{b{{b{c}}}{}}{{{b{d}}}{{b{dc}}}{}}`{{{b{f}}{b{{j{h}}}}{b{f}}{b{dl}}}n}{{{b{l}}}A`}{{{b{l}}}Ab}{{{b{l}}{b{dAd}}}Af}0{cc{}}{{{b{dl}}}Ah}{{{b{dl}}{b{f}}{b{f}}}Ah}0{{}c{}}65{nl}77{bAb}{c{{Aj{e}}}{}{}}{{}{{Aj{c}}}{}}{bAl}{{}c{}}","D":"d","p":[[1,"reference",null,null,1],[0,"mut"],[1,"str"],[5,"Event",24],[1,"slice"],[5,"TestSink",0],[1,"bool"],[1,"usize"],[5,"String",25],[5,"Formatter",26],[8,"Result",26],[1,"unit"],[6,"Result",27,null,1],[5,"TypeId",28]],"r":[],"b":[[7,"impl-Display-for-TestSink"],[8,"impl-Debug-for-TestSink"]],"c":"OjAAAAAAAAA=","e":"OzAAAAEAABYAAwAAAAkACwACAA8ACQA=","P":[[1,"T"],[4,""],[9,"T"],[10,""],[13,"U"],[14,""],[20,"U,T"],[21,"U"],[22,""],[23,"V"]]}],["fe_yulc",{"t":"FFNNNNOHHNNNNNONNNNNN","n":["ContractBytecode","YulcError","borrow","","borrow_mut","","bytecode","compile","compile_single_contract","fmt","from","","into","","runtime_bytecode","try_from","","try_into","","type_id",""],"q":[[0,"fe_yulc"],[21,"alloc::string"],[22,"indexmap::map"],[23,"core::result"],[24,"core::convert"],[25,"core::iter::traits::iterator"],[26,"core::fmt"],[27,"core::any"]],"i":"``fn101``010101101010","f":"``{b{{b{c}}}{}}0{{{b{d}}}{{b{dc}}}{}}0{fh}{{gj}{{A`{{l{hf}}n}}}{{Ad{Ab}}}{{Ad{Ab}}}{{Aj{}{{Af{{Ah{ce}}}}}}}}{{{b{Ab}}{b{Ab}}jj}{{A`{fn}}}}{{{b{n}}{b{dAl}}}An}{cc{}}0{{}c{}}05{c{{A`{e}}}{}{}}0{{}{{A`{c}}}{}}0{bB`}0","D":"l","p":[[1,"reference",null,null,1],[0,"mut"],[5,"ContractBytecode",0],[5,"String",21],[1,"bool"],[5,"IndexMap",22],[5,"YulcError",0],[6,"Result",23,null,1],[1,"str"],[10,"AsRef",24],[17,"Item"],[1,"tuple",null,null,1],[10,"Iterator",25],[5,"Formatter",26],[8,"Result",26],[5,"TypeId",27]],"r":[],"b":[],"c":"OjAAAAAAAAA=","e":"OzAAAAEAAA8AAwAAAAcACgAAAA8ABgA=","P":[[2,"T"],[6,""],[10,"T"],[12,"U"],[14,""],[15,"U,T"],[17,"U"],[19,""]]}]]')); +if (typeof exports !== 'undefined') exports.searchIndex = searchIndex; +else if (window.initSearch) window.initSearch(searchIndex); +//{"start":39,"fragment_lengths":[5493,5433,86127,17574,31363,4368,145,152,11561,421,42802,31988,501,1171,1103]} \ No newline at end of file diff --git a/compiler-docs/search.desc/fe/fe-desc-0-.js b/compiler-docs/search.desc/fe/fe-desc-0-.js new file mode 100644 index 0000000000..f17cc328b2 --- /dev/null +++ b/compiler-docs/search.desc/fe/fe-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe", 0, "Returns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_abi/fe_abi-desc-0-.js b/compiler-docs/search.desc/fe_abi/fe_abi-desc-0-.js new file mode 100644 index 0000000000..4aa7e87623 --- /dev/null +++ b/compiler-docs/search.desc/fe_abi/fe_abi-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_abi", 0, "Returns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe mutability of a public function.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns first 4 bytes of signature hash in hex.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nReturns bytes size of the encoded type if the type is …") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_analyzer/fe_analyzer-desc-0-.js b/compiler-docs/search.desc/fe_analyzer/fe_analyzer-desc-0-.js new file mode 100644 index 0000000000..dc5b20cf83 --- /dev/null +++ b/compiler-docs/search.desc/fe_analyzer/fe_analyzer-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_analyzer", 0, "Fe semantic analysis.\nSemantic errors.\nThis module includes utility structs and its functions for …\nThe evm functions exposed by yul.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nThe type of a function call.\nRepresents constant value.\nThis should only be created by AnalyzerContext.\nContains contextual information relating to an expression …\nLoad from storage ptr\nPanics\nAdd evaluated constant value in a constant declaration to …\nAttribute contextual information to an expression node.\nReturns constant value from variable name.\nReturns a type of an expression.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns constant from numeric literal represented by …\nReturns the Context type, if it is defined.\nReturns true if the scope or any of its parents is of the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert into a [codespan_reporting::Diagnostic::Label]\nReturns true if the context is in function scope.\nReturns the module enclosing current context.\nReturns an item enclosing current context.\nReturns a function id that encloses a context.\nCreate a primary label with the given message. This will …\nResolves the given path. Does not register any errors\nResolves the given path and registers all errors\nResolves the given path only if it is visible. Does not …\nReturns a non-function item that encloses a context.\nCreate a secondary label with the given message. This will …\nUpdate the expression attributes.\nFunction self parameter.\nThe function’s parent, if any. If None, self has been …\nRepresentative struct for the query group.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nSet the value of the ingot_external_ingots input.\nSet the value of the ingot_external_ingots input and …\nSet the value of the ingot_files input.\nSet the value of the ingot_files input and promise that …\nSet the value of the root_ingot input.\nSet the value of the root_ingot input and promise that its …\nReturns the argument unchanged.\nCalls U::from(self).\nError to be returned from APIs that should reject …\nErrors that can result from a binary operation\nError indicating constant evaluation failed.\nError to be returned when otherwise no meaningful …\nValue type cannot be coerced to the expected type\nError returned by ModuleId::resolve_name if the name is …\nErrors that can result from indexing\nValue is in storage and must be explicitly moved with …\nself contract used where an external contract value is …\nErrors that can result from an implicit type coercion\nError indicating that a type is invalid.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a FatalError instance, given a “voucher” …\nDepGraph edge label. “Locality” refers to the deployed …\nFor directory modules without a corresponding source file …\nAn Ingot is composed of a tree of Modules (set via […\nA named item. This does not include things inside of a …\nA library; expected to have a lib.fe file.\nThe target of compilation. Expected to have a main.fe file.\nId of a Module, which corresponds to a single Fe source …\nA fake ingot, created to hold a single module with any …\nAll module constants.\nAll contracts, including from submodules and including …\nAll functions, including from submodules and including …\nIncludes duplicate names\nIncludes duplicate names\nReturns true if the type_in_impl can stand in for the …\nDependency graph of the contract type, which consists of …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nLookup a function by name. Searches all user functions, …\nLooks up the FunctionId based on the parent of the …\nUser functions, public and not. Excludes __init__ and …\nReturns the map of ingot deps, built-ins, and the ingot …\nReturns all of the internal items. Internal items refers …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if the item is in scope of the module.\nReturns true if other either is Self or the type of the …\nReturns a map of the named items in the module\nReturns all of the internal items, except for used items. …\nExcludes __init__ and __call__.\nReturns Err(IncompleteItem) if the name could not be …\nResolve a path that starts with an item defined in the …\nResolve a path that starts with an internal item.\nResolve a path that starts with an internal item. We omit …\nReturns the main.fe, or lib.fe module, depending on the …\nDependency graph of the (imaginary) __call__ function, …\nReturns a name -> (name_span, external_item) map for all …\nAdd a variable to the block scope.\nCheck an item visibility and sink diagnostics if an item …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGets std::context::Context if it exists\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nMaps Name -> (Type, is_const, span)\nAn “external” contract. Effectively just a newtyped …\nNames that can be used to build identifiers without …\nThe type of a contract while it’s being executed. Ie. …\nCreates an instance of address.\nReturns size of integer type in bits.\nCreates an instance of bool.\nReturns true if the integer is at least the same size (or …\nReturns true if num represents a number that fits the type\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nSignature for the function with the given name defined …\nLike function_sig but returns a Vec<FunctionSigId> which …\nReturn the impl for the given trait. There can only ever …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if the type qualifies to implement the …\nReturns true if the type is encodable in Solidity ABI. …\ntrue if Type::Base or Type::Contract (which is just an …\nReturns true if the integer is signed, otherwise false\nName in the lower snake format (e.g. lower_snake_case).\nReturns max value of the integer type.\nReturns min value of the integer type.\nLooks up all possible candidates of the given function …\nCreates an instance of u256.\nCreates an instance of u8.\nCreates an instance of ().\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_codegen/fe_codegen-desc-0-.js b/compiler-docs/search.desc/fe_codegen/fe_codegen-desc-0-.js new file mode 100644 index 0000000000..9108a6ba94 --- /dev/null +++ b/compiler-docs/search.desc/fe_codegen/fe_codegen-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_codegen", 0, "Representative struct for the query group.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCopy data from src to dst. NOTE: src and dst must be …") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_common/fe_common-desc-0-.js b/compiler-docs/search.desc/fe_common/fe_common-desc-0-.js new file mode 100644 index 0000000000..231ad4640c --- /dev/null +++ b/compiler-docs/search.desc/fe_common/fe_common-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_common", 0, "An exclusive span of byte offsets in a source file.\nCompare the given strings and panic when not equal with a …\nA byte offset specifying the exclusive end of a span.\nReturns the argument unchanged.\nCalls U::from(self).\nA byte offset specifying the inclusive start of a span.\nRepresentative struct for the query group.\nSet with `fn set_file_content(&mut self, file: …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nSet the value of the file_content input.\nSet the value of the file_content input and promise that …\nAn unexpected bug.\nAn error.\nA help message.\nA note.\nA severity level for diagnostic messages.\nA warning.\nDiagnostic data structures.\nFormat the given diagnostics as a string.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert into a [codespan_reporting::Diagnostic::Label]\nCreate a primary label with the given message. This will …\nPrint the given diagnostics to stderr.\nCreate a secondary label with the given message. This will …\nAn unexpected bug.\nRepresents a diagnostic message that can provide …\nAn error.\nA help message.\nA label describing an underlined region of code associated …\nA note.\nLabels that describe the primary cause of a diagnostic.\nLabels that provide additional context for a diagnostic.\nA severity level for diagnostic messages.\nA warning.\nCreate a new diagnostic with a severity of Severity::Bug.\nAn optional code that identifies this diagnostic.\nCreate a new diagnostic with a severity of Severity::Error.\nThe file that we are labelling.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCreate a new diagnostic with a severity of Severity::Help.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nSource labels that describe the cause of the diagnostic. …\nAn optional message to provide some additional information …\nThe main message associated with this diagnostic.\nCreate a new label.\nCreate a new diagnostic.\nCreate a new diagnostic with a severity of Severity::Note.\nNotes that are associated with the primary cause of the …\nCreate a new label with a style of LabelStyle::Primary.\nThe range in bytes we are going to include in the final …\nCreate a new label with a style of LabelStyle::Secondary.\nThe overall severity of the diagnostic\nThe style of the label.\nCreate a new diagnostic with a severity of …\nSet the error code of the diagnostic.\nAdd some labels to the diagnostic.\nAdd a message to the diagnostic.\nSet the message of the diagnostic.\nAdd some notes to the diagnostic.\nA reference to the current directory, i.e., ..\nUser file; either part of the target project or an …\nA normal component, e.g., a and b in a/b.\nA reference to the parent directory, i.e., ...\nA Windows path prefix, e.g., C: or \\\\server\\share.\nThe root directory component, appears after any prefix and …\nFile is part of the fe standard library\nA single component of a path.\nA slice of a UTF-8 path (akin to str).\nAn owned, mutable UTF-8 path (akin to String).\nProduces an iterator over Utf8Path and its ancestors.\nYields the underlying OsStr slice.\nExtracts the underlying OsStr slice.\nCoerces to a Utf8Path slice.\nConverts a Utf8Path to a Path.\nYields the underlying str slice.\nExtracts the underlying str slice.\nReturns the canonical, absolute form of the path with all …\nReturns the canonical, absolute form of the path with all …\nInvokes capacity on the underlying instance of PathBuf.\nInvokes clear on the underlying instance of PathBuf.\nReturns the common prefix of two paths. If the paths are …\nProduces an iterator over the Utf8Components of the path.\nDetermines whether child is a suffix of self.\nReturns true if the path points at an existing entity.\nExtracts the extension of self.file_name, if possible.\nReturns the final component of the Utf8Path, if there is …\nExtracts the stem (non-extension) portion of self.file_name…\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nConverts a Path to a Utf8Path.\nCreates a new Utf8PathBuf from a PathBuf containing valid …\nReturns true if the Utf8Path has a root.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConverts this Utf8PathBuf into a boxed Utf8Path.\nConsumes the Utf8PathBuf, yielding its internal OsString …\nConverts a Box<Utf8Path> into a Utf8PathBuf without …\nConverts a Utf8PathBuf to a PathBuf.\nConsumes the Utf8PathBuf, yielding its internal String …\nReturns true if the Utf8Path is absolute, i.e., if it is …\nReturns true if the path exists on disk and is pointing at …\nReturns true if the path exists on disk and is pointing at …\nReturns true if the Utf8Path is relative, i.e., not …\nReturns true if the path exists on disk and is pointing at …\nProduces an iterator over the path’s components viewed …\nCreates an owned Utf8PathBuf with path adjoined to self.\nCreates an owned PathBuf with path adjoined to self.\nDifferentiates between local source files and fe std lib …\nQueries the file system to get information about a file, …\nDirectly wraps a string slice as a Utf8Path slice.\nAllocates an empty Utf8PathBuf.\nReturns the Path without its final component, if there is …\nPath of the file. May include src/ dir or longer prefix; …\nTruncates self to self.parent.\nExtends self with path.\nReturns an iterator over the entries within a directory.\nReturns an iterator over the entries within a directory.\nReads a symbolic link, returning the file that the link …\nReads a symbolic link, returning the file that the link …\nInvokes reserve on the underlying instance of PathBuf.\nInvokes reserve_exact on the underlying instance of PathBuf…\nUpdates self.extension to extension.\nUpdates self.file_name to file_name.\nInvokes shrink_to on the underlying instance of PathBuf.\nInvokes shrink_to_fit on the underlying instance of PathBuf…\nDetermines whether base is a prefix of self.\nReturns a path that, when joined onto base, yields self.\nQueries the metadata about a file without following …\nConverts a Utf8Path to an owned Utf8PathBuf.\nReturns Ok(true) if the path points at an existing entity.\nInvokes try_reserve on the underlying instance of PathBuf.\nInvokes try_reserve_exact on the underlying instance of …\nCreates a new Utf8PathBuf with a given capacity used to …\nCreates an owned Utf8PathBuf like self but with the given …\nCreates an owned Utf8PathBuf like self but with the given …\nA helper type to interpret a numeric literal represented …\nA type that represents the radix of a numeric literal.\nReturns number representation of the radix.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nParse the numeric literal to T.\nReturns radix of the numeric literal.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the root path of the current Fe project\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nBuild files are loaded from the file system.\nBuild files are loaded from static file vector.\nFetch and checkout the specified refspec from the remote …\nA trait to derive plural or singular representations from\nGet the full 32 byte hash of the content.\nGet the full 32 byte hash of the content as a byte array.\nTake the first size number of bytes of the hash with no …\nTake the first size number of bytes of the hash and pad …\nWrapper struct for formatting changesets from the …\nReturns the argument unchanged.\nCalls U::from(self).\nConvenience function to serialize objects in RON format …") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_compiler_test_utils/fe_compiler_test_utils-desc-0-.js b/compiler-docs/search.desc/fe_compiler_test_utils/fe_compiler_test_utils-desc-0-.js new file mode 100644 index 0000000000..ed5c13f5af --- /dev/null +++ b/compiler-docs/search.desc/fe_compiler_test_utils/fe_compiler_test_utils-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_compiler_test_utils", 0, "Panic if the execution did not revert.\nPanic if the output is not an encoded error reason of the …\nPanic if the execution did not succeed.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nTo get the 2s complement value for e.g. -128 call …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new Runtime instance.\nCreate an ExecutionOutput instance\nGenerate the top level YUL object\nAdd the given set of functions\nAdd the given set of test statements") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_compiler_tests/fe_compiler_tests-desc-0-.js b/compiler-docs/search.desc/fe_compiler_tests/fe_compiler_tests-desc-0-.js new file mode 100644 index 0000000000..c44c3c48eb --- /dev/null +++ b/compiler-docs/search.desc/fe_compiler_tests/fe_compiler_tests-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_compiler_tests", 0, "") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_compiler_tests_legacy/fe_compiler_tests_legacy-desc-0-.js b/compiler-docs/search.desc/fe_compiler_tests_legacy/fe_compiler_tests_legacy-desc-0-.js new file mode 100644 index 0000000000..baaf135be0 --- /dev/null +++ b/compiler-docs/search.desc/fe_compiler_tests_legacy/fe_compiler_tests_legacy-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_compiler_tests_legacy", 0, "") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_driver/fe_driver-desc-0-.js b/compiler-docs/search.desc/fe_driver/fe_driver-desc-0-.js new file mode 100644 index 0000000000..45e6031ffc --- /dev/null +++ b/compiler-docs/search.desc/fe_driver/fe_driver-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_driver", 0, "The artifacts of a compiled contract.\nThe artifacts of a compiled module.\nCompiles the main module of a project.\nReturns graphviz string.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_library/fe_library-desc-0-.js b/compiler-docs/search.desc/fe_library/fe_library-desc-0-.js new file mode 100644 index 0000000000..f7288c344a --- /dev/null +++ b/compiler-docs/search.desc/fe_library/fe_library-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_library", 0, "") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_mir/fe_mir-desc-0-.js b/compiler-docs/search.desc/fe_mir/fe_mir-desc-0-.js new file mode 100644 index 0000000000..68eef8c25b --- /dev/null +++ b/compiler-docs/search.desc/fe_mir/fe_mir-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_mir", 0, "This module contains dominator tree related structs.\nThis module contains implementation of Post Dominator Tree.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nDominance frontiers of each blocks.\nCompute dominance frontiers of each blocks.\nReturns true if block1 dominates block2.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns number of frontier blocks of a block.\nReturns all dominance frontieres of a block.\nReturns the immediate dominator of the block. Returns None …\nCalls U::from(self).\nCalls U::from(self).\nReturns true if block is reachable from the entry block.\nReturns blocks in RPO.\nReturns true if block1 strictly dominates block2.\nChild loops that the loop includes.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nA header of the loop.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns true if the block is in the lp.\nReturns all blocks in the loop.\nReturns header block of the lp.\nReturns number of loops found.\nReturns the loop that the block belongs to. If the block …\nReturns all loops in a function body. An outer loop is …\nA parent loop that includes the loop.\nGet parent loop of the lp if exists.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nReturns true if block is reachable from the exit blocks.\nRepresentative struct for the query group.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nGet access to extra methods pertaining to this query. For …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nLike in_db, but gives access to methods for setting the …\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nWrites mir graphs of functions in a module.\nAn original source information that indicates where mir …\nThis module provides a collection of structs to modify …\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns the argument unchanged.\nCalls U::from(self).\nReturns true if current block is terminated.\nSpecify a current location of BodyCursor\nReturns current block that cursor points.\nReturns current inst that cursor points.\nReturns the argument unchanged.\nReturns the argument unchanged.\nInsert BasicBlockId to a location where a cursor points. …\nInsert InstId to a location where a cursor points. If you …\nCalls U::from(self).\nCalls U::from(self).\nRemove a current pointed block and contained insts from a …\nRemove a current pointed Inst from a function body. A …\nSets a cursor to an entry block.\nRepresents basic block order and instruction order.\nAppends a given block to a function body.\nAppends inst to the end of a block\nReturns a number of block in a function.\nReturns an entry block of a function body.\nReturns first instruction of a block if exists.\nReturns the argument unchanged.\nInserts a given block after a after block.\nInserts a given block before a before block.\nInsert inst after after inst.\nInsert inst before before inst.\nReturns a block to which a given inst belongs.\nCalls U::from(self).\nReturns true if a block doesn’t contain any block.\nReturns true if a function body contains a given block.\nReturns true is a given inst is inserted.\nReturns true if a block is terminated.\nReturns an iterator which iterates all basic blocks in a …\nReturns an iterator which iterates all instruction in a …\nReturns a last block of a function body.\nReturns a last instruction of a block.\nReturns a next block of a given block.\nReturns a next instruction of a given inst.\nPrepends inst to the beginning of a block\nReturns a previous block of a given block.\nReturns a previous instruction of a given inst.\nRemove a given block from a function. All instructions in …\nRemove instruction from the function body.\nReturns a terminator instruction of a block.\nAn interned Id for Constant.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA module where a constant is declared.\nA name of a constant.\nA span where a constant is declared.\nA type of a constant.\nA value of a constant.\nA collection of basic block, instructions and values …\nA function can be called from other modules, and also can …\nA function body, which is not stored in salsa db to enable …\nRepresents function signature.\nA function can only be called within the same module.\nA function can be called from other modules, but can NOT …\nReturns class_name::fn_name if a function is a method else …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns an instruction result\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns Some(local_name) if value is Value::Local.\nTracks order of basic blocks and instructions in a …\nReturns a type suffix if a generic function was …\nAccess to aggregate fields or elements.\nConstructs aggregate value, i.e. struct, tuple and array.\nBinary instruction.\nConditional branching instruction.\nThis is not a real instruction, just used to tag a …\n~ operator for bitwise inversion.\nUnconditional jump instruction.\nLoad a primitive value from a ptr\n- operator for negation.\nnot operator for logical inversion.\nA cast from a primitive type to a primitive type.\nUnary instruction.\nA cast from an enum type to its underlying type.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA static array type definition.\nA user defined struct type definition.\nA user defined struct type definition.\nA user defined struct type definition.\nA map type definition.\nA user defined struct type definition.\nA tuple type definition.\nAn interned Id for ArrayDef.\nReturns an offset of the element of aggregate type.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nReturns size of the type in bytes.\nA constant value.\nAn immediate value.\nA local variable declared in a function body.\nA value resulted from an instruction.\nA singleton value representing Unit type.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\ntrue if a local is a function argument.\ntrue if a local is introduced in MIR.\nAn original name of a local variable.") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_parser/fe_parser-desc-0-.js b/compiler-docs/search.desc/fe_parser/fe_parser-desc-0-.js new file mode 100644 index 0000000000..5888c7c3ce --- /dev/null +++ b/compiler-docs/search.desc/fe_parser/fe_parser-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_parser", 0, "Contains the error value\nContains the success value\nParser maintains the parsing state, such as the token …\nReturns back tracking parser.\nAssert that the next token kind it matches the expected …\nThe diagnostics (errors and warnings) emitted during …\nReturns true if the parser has reached the end of the file.\nEnter a “block”, which is a brace-enclosed list of …\nEmit an error diagnostic, but don’t stop parsing\nIf the next token matches the expected kind, return it. …\nConsumes newlines and semicolons. Returns Ok if one or …\nLike Parser::expect, but with additional notes to be …\nEmit a “fancy” error diagnostic with any number of …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConvert into a [codespan_reporting::Diagnostic::Label]\nCreate a new parser for a source code string and …\nReturn the next token, or an error if we’ve reached the …\nIf the next token matches the expected kind, return it. …\nParse a Module from the file content string.\nTake a peek at the next token kind. Returns None if we’…\nTake a peek at the next token kind without consuming it, …\nCreate a primary label with the given message. This will …\nCreate a secondary label with the given message. This will …\nSplit the next token into two tokens, returning the first. …\nEmit an “unexpected token” error diagnostic with the …\nstruct or contract field, with optional ‘pub’ and ‘…\nRepresents a literal pattern. e.g., true.\nRepresents or pattern. e.g., EnumUnit | EnumTuple(_, _, _)\nRepresents unit variant pattern. e.g., Enum::Unit.\nRepresents struct or struct variant destructuring pattern. …\nRepresents tuple variant pattern. e.g., …\nRest pattern. e.g., ..\nA SmolStr is a string type that has the following …\nTuple variant. E.g., Baz(u32, i32) in\nRepresents tuple destructuring pattern. e.g., (x, y, z).\nUnit variant. E.g., Bar in\nEnum variant definition.\nEnum variant kind.\nRepresents a wildcard pattern _.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nConstructs inline variant of SmolStr.\nParse a contract definition.\nParse call arguments\nParse an expression, starting with the next token.\nParse an expression, stopping if/when we reach an operator …\nParse an assert statement.\nParse a function definition. The optional pub qualifier …\nParse a function definition without a body. The optional …\nParse a for statement.\nParse a single generic function parameter (eg. T:SomeTrait …\nParse an angle-bracket-wrapped list of generic arguments …\nParse an if statement.\nParse a match statement.\nParse a return statement.\nParse a revert statement.\nParse a continue, break, pass, or revert statement.\nParse a function-level statement.\nParse an unsafe block.\nParse a while statement.\nParse a constant, e.g. const MAGIC_NUMBER: u256 = 4711.\nParse a Module.\nParse a ModuleStmt.\nParse a pragma <version-requirement> statement.\nParse a use statement.\nParse a use tree.\nParse a [ModuleStmt::Enum].\nParse a field for a struct or contract. The leading …\nParse an angle-bracket-wrapped list of generic arguments …\nParse an impl block.\nParse an optional qualifier (pub, const, or idx).\nReturns path and trailing :: token, if present.\nParse a [ModuleStmt::Struct].\nParse a trait definition.\nParse a type alias definition, e.g. …\nParse a type description, e.g. u8 or Map<address, u256>.\nParse a variant for a enum definition.\nReturn a user-friendly description of the token kind. E.g. …\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nCreate a new lexer with the given source code string.\nReturn the full source code string that’s being …\nAn exclusive span of byte offsets in a source file.\nA byte offset specifying the exclusive end of a span.\nReturns the argument unchanged.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).\nCalls U::from(self).\nA byte offset specifying the inclusive start of a span.") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_test_files/fe_test_files-desc-0-.js b/compiler-docs/search.desc/fe_test_files/fe_test_files-desc-0-.js new file mode 100644 index 0000000000..58e30443ce --- /dev/null +++ b/compiler-docs/search.desc/fe_test_files/fe_test_files-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_test_files", 0, "Returns (file_path, file_content)\nReturns (file_path, file_content)") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_test_runner/fe_test_runner-desc-0-.js b/compiler-docs/search.desc/fe_test_runner/fe_test_runner-desc-0-.js new file mode 100644 index 0000000000..e7447b352e --- /dev/null +++ b/compiler-docs/search.desc/fe_test_runner/fe_test_runner-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_test_runner", 0, "Returns the argument unchanged.\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/search.desc/fe_yulc/fe_yulc-desc-0-.js b/compiler-docs/search.desc/fe_yulc/fe_yulc-desc-0-.js new file mode 100644 index 0000000000..aa537409c4 --- /dev/null +++ b/compiler-docs/search.desc/fe_yulc/fe_yulc-desc-0-.js @@ -0,0 +1 @@ +searchState.loadedDescShard("fe_yulc", 0, "Compile a map of Yul contracts to a map of bytecode …\nCompiles a single Yul contract to bytecode.\nReturns the argument unchanged.\nReturns the argument unchanged.\nCalls U::from(self).\nCalls U::from(self).") \ No newline at end of file diff --git a/compiler-docs/settings.html b/compiler-docs/settings.html new file mode 100644 index 0000000000..fd6fec8a66 --- /dev/null +++ b/compiler-docs/settings.html @@ -0,0 +1 @@ +Settings

Rustdoc settings

Back
\ No newline at end of file diff --git a/compiler-docs/src-files.js b/compiler-docs/src-files.js new file mode 100644 index 0000000000..583a4c339b --- /dev/null +++ b/compiler-docs/src-files.js @@ -0,0 +1,2 @@ +createSrcSidebar('[["fe",["",[["task",[],["build.rs","check.rs","mod.rs","new.rs"]]],["main.rs"]]],["fe_abi",["",[],["contract.rs","event.rs","function.rs","lib.rs","types.rs"]]],["fe_analyzer",["",[["db",[["queries",[],["contracts.rs","enums.rs","functions.rs","impls.rs","ingots.rs","module.rs","structs.rs","traits.rs","types.rs"]]],["queries.rs"]],["namespace",[],["items.rs","mod.rs","scopes.rs","types.rs"]],["traversal",[],["assignments.rs","borrowck.rs","call_args.rs","const_expr.rs","declarations.rs","expressions.rs","functions.rs","matching_anomaly.rs","mod.rs","pattern_analysis.rs","pragma.rs","types.rs","utils.rs"]]],["builtins.rs","constants.rs","context.rs","db.rs","display.rs","errors.rs","lib.rs","operations.rs"]]],["fe_codegen",["",[["db",[["queries",[],["abi.rs","constant.rs","contract.rs","function.rs","types.rs"]]],["queries.rs"]],["yul",[["isel",[],["context.rs","contract.rs","function.rs","inst_order.rs","mod.rs","test.rs"]],["legalize",[],["body.rs","critical_edge.rs","mod.rs","signature.rs"]],["runtime",[],["abi.rs","contract.rs","data.rs","emit.rs","mod.rs","revert.rs","safe_math.rs"]]],["mod.rs","slot_size.rs"]]],["db.rs","lib.rs"]]],["fe_common",["",[["utils",[],["dirs.rs","files.rs","git.rs","humanize.rs","keccak.rs","mod.rs","ron.rs"]]],["db.rs","diagnostics.rs","files.rs","lib.rs","numeric.rs","panic.rs","span.rs"]]],["fe_compiler_test_utils",["",[],["lib.rs"]]],["fe_compiler_tests",["",[],["lib.rs"]]],["fe_compiler_tests_legacy",["",[],["lib.rs"]]],["fe_driver",["",[],["lib.rs"]]],["fe_library",["",[],["lib.rs"]]],["fe_mir",["",[["analysis",[],["cfg.rs","domtree.rs","loop_tree.rs","mod.rs","post_domtree.rs"]],["db",[["queries",[],["constant.rs","contract.rs","enums.rs","function.rs","module.rs","structs.rs","types.rs"]]],["queries.rs"]],["graphviz",[],["block.rs","function.rs","mod.rs","module.rs"]],["ir",[],["basic_block.rs","body_builder.rs","body_cursor.rs","body_order.rs","constant.rs","function.rs","inst.rs","mod.rs","types.rs","value.rs"]],["lower",[["pattern_match",[],["decision_tree.rs","mod.rs","tree_vis.rs"]]],["function.rs","mod.rs","types.rs"]],["pretty_print",[],["inst.rs","mod.rs","types.rs","value.rs"]]],["db.rs","lib.rs"]]],["fe_parser",["",[["grammar",[],["contracts.rs","expressions.rs","functions.rs","module.rs","types.rs"]],["lexer",[],["token.rs"]]],["ast.rs","grammar.rs","lexer.rs","lib.rs","node.rs","parser.rs"]]],["fe_test_files",["",[],["lib.rs"]]],["fe_test_runner",["",[],["lib.rs"]]],["fe_yulc",["",[],["lib.rs"]]]]'); +//{"start":19,"fragment_lengths":[79,80,558,437,191,46,41,48,33,34,638,200,37,38,31]} \ No newline at end of file diff --git a/compiler-docs/src/fe/main.rs.html b/compiler-docs/src/fe/main.rs.html new file mode 100644 index 0000000000..93a0609783 --- /dev/null +++ b/compiler-docs/src/fe/main.rs.html @@ -0,0 +1,38 @@ +main.rs - source

fe/
main.rs

1mod task;
+2
+3use clap::Parser;
+4use fe_common::panic::install_panic_hook;
+5use task::Commands;
+6
+7#[derive(Parser)]
+8#[clap(author, version, about, long_about = None)]
+9struct FelangCli {
+10    #[clap(subcommand)]
+11    command: Commands,
+12}
+13
+14fn main() {
+15    install_panic_hook();
+16
+17    let cli = FelangCli::parse();
+18
+19    match cli.command {
+20        Commands::Build(arg) => {
+21            task::build(arg);
+22        }
+23        Commands::Check(arg) => {
+24            task::check(arg);
+25        }
+26        Commands::New(arg) => {
+27            task::create_new_project(arg);
+28        }
+29        #[cfg(feature = "solc-backend")]
+30        Commands::Verify(arg) => {
+31            task::verify(arg);
+32        }
+33        #[cfg(feature = "solc-backend")]
+34        Commands::Test(arg) => {
+35            task::test(arg);
+36        }
+37    }
+38}
\ No newline at end of file diff --git a/compiler-docs/src/fe/task/build.rs.html b/compiler-docs/src/fe/task/build.rs.html new file mode 100644 index 0000000000..5a28008d5f --- /dev/null +++ b/compiler-docs/src/fe/task/build.rs.html @@ -0,0 +1,278 @@ +build.rs - source

fe/task/
build.rs

1use std::fs;
+2use std::io::{Error, Write};
+3use std::path::Path;
+4
+5use clap::{ArgEnum, Args};
+6use fe_common::diagnostics::print_diagnostics;
+7use fe_common::files::SourceFileId;
+8use fe_common::utils::files::{get_project_root, BuildFiles, ProjectMode};
+9use fe_driver::CompiledModule;
+10
+11const DEFAULT_OUTPUT_DIR_NAME: &str = "output";
+12
+13#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ArgEnum, Debug)]
+14enum Emit {
+15    Abi,
+16    Ast,
+17    LoweredAst,
+18    Bytecode,
+19    RuntimeBytecode,
+20    Tokens,
+21    Yul,
+22}
+23
+24#[derive(Args)]
+25#[clap(about = "Build the current project")]
+26pub struct BuildArgs {
+27    #[clap(default_value_t = get_project_root().unwrap_or(".".to_string()))]
+28    input_path: String,
+29    #[clap(short, long, default_value = DEFAULT_OUTPUT_DIR_NAME)]
+30    output_dir: String,
+31    #[clap(
+32        arg_enum,
+33        use_value_delimiter = true,
+34        long,
+35        short,
+36        default_value = "abi,bytecode"
+37    )]
+38    emit: Vec<Emit>,
+39    #[clap(long)]
+40    mir: bool,
+41    #[clap(long)]
+42    overwrite: bool,
+43    #[clap(long, takes_value(true))]
+44    optimize: Option<bool>,
+45}
+46
+47fn build_single_file(compile_arg: &BuildArgs) -> (String, CompiledModule) {
+48    let emit = &compile_arg.emit;
+49    let with_bytecode = emit.contains(&Emit::Bytecode);
+50    let with_runtime_bytecode = emit.contains(&Emit::RuntimeBytecode);
+51    let input_path = &compile_arg.input_path;
+52    let optimize = compile_arg.optimize.unwrap_or(true);
+53
+54    let mut db = fe_driver::Db::default();
+55    let content = match std::fs::read_to_string(input_path) {
+56        Err(err) => {
+57            eprintln!("Failed to load file: `{input_path}`. Error: {err}");
+58            std::process::exit(1)
+59        }
+60        Ok(content) => content,
+61    };
+62
+63    let compiled_module = match fe_driver::compile_single_file(
+64        &mut db,
+65        input_path,
+66        &content,
+67        with_bytecode,
+68        with_runtime_bytecode,
+69        optimize,
+70    ) {
+71        Ok(module) => module,
+72        Err(error) => {
+73            eprintln!("Unable to compile {input_path}.");
+74            print_diagnostics(&db, &error.0);
+75            std::process::exit(1)
+76        }
+77    };
+78    (content, compiled_module)
+79}
+80
+81fn build_ingot(compile_arg: &BuildArgs) -> (String, CompiledModule) {
+82    let emit = &compile_arg.emit;
+83    let with_bytecode = emit.contains(&Emit::Bytecode);
+84    let with_runtime_bytecode = emit.contains(&Emit::RuntimeBytecode);
+85    let input_path = &compile_arg.input_path;
+86    let optimize = compile_arg.optimize.unwrap_or(true);
+87
+88    if !Path::new(input_path).exists() {
+89        eprintln!("Input directory does not exist: `{input_path}`.");
+90        std::process::exit(1)
+91    }
+92
+93    let build_files = match BuildFiles::load_fs(input_path) {
+94        Ok(files) => files,
+95        Err(err) => {
+96            eprintln!("Failed to load project files.\nError: {err}");
+97            std::process::exit(1)
+98        }
+99    };
+100
+101    if build_files.root_project_mode() == ProjectMode::Lib {
+102        eprintln!("Unable to compile {input_path}. No build targets in library mode.");
+103        eprintln!("Consider replacing `src/lib.fe` with `src/main.fe`.");
+104        std::process::exit(1)
+105    }
+106
+107    let mut db = fe_driver::Db::default();
+108    let compiled_module = match fe_driver::compile_ingot(
+109        &mut db,
+110        &build_files,
+111        with_bytecode,
+112        with_runtime_bytecode,
+113        optimize,
+114    ) {
+115        Ok(module) => module,
+116        Err(error) => {
+117            eprintln!("Unable to compile {input_path}.");
+118            print_diagnostics(&db, &error.0);
+119            std::process::exit(1)
+120        }
+121    };
+122
+123    // no file content for ingots
+124    ("".to_string(), compiled_module)
+125}
+126
+127pub fn build(compile_arg: BuildArgs) {
+128    let emit = &compile_arg.emit;
+129
+130    let input_path = &compile_arg.input_path;
+131
+132    if compile_arg.mir {
+133        return mir_dump(input_path);
+134    }
+135
+136    let _with_bytecode = emit.contains(&Emit::Bytecode);
+137    #[cfg(not(feature = "solc-backend"))]
+138    if _with_bytecode {
+139        eprintln!("Warning: bytecode output requires 'solc-backend' feature. Try `cargo build --release --features solc-backend`. Skipping.");
+140    }
+141
+142    let (content, compiled_module) = if Path::new(input_path).is_file() {
+143        build_single_file(&compile_arg)
+144    } else {
+145        build_ingot(&compile_arg)
+146    };
+147
+148    let output_dir = &compile_arg.output_dir;
+149    let overwrite = compile_arg.overwrite;
+150    match write_compiled_module(compiled_module, &content, emit, output_dir, overwrite) {
+151        Ok(_) => eprintln!("Compiled {input_path}. Outputs in `{output_dir}`"),
+152        Err(err) => {
+153            eprintln!("Failed to write output to directory: `{output_dir}`. Error: {err}");
+154            std::process::exit(1)
+155        }
+156    }
+157}
+158
+159fn write_compiled_module(
+160    mut module: CompiledModule,
+161    file_content: &str,
+162    targets: &[Emit],
+163    output_dir: &str,
+164    overwrite: bool,
+165) -> Result<(), String> {
+166    let output_dir = Path::new(output_dir);
+167    if output_dir.is_file() {
+168        return Err(format!(
+169            "A file exists at path `{}`, the location of the output directory. Refusing to overwrite.",
+170            output_dir.display()
+171        ));
+172    }
+173
+174    if !overwrite {
+175        verify_nonexistent_or_empty(output_dir)?;
+176    }
+177
+178    fs::create_dir_all(output_dir).map_err(ioerr_to_string)?;
+179
+180    if targets.contains(&Emit::Ast) {
+181        write_output(&output_dir.join("module.ast"), &module.src_ast)?;
+182    }
+183
+184    if targets.contains(&Emit::LoweredAst) {
+185        write_output(&output_dir.join("lowered_module.ast"), &module.lowered_ast)?;
+186    }
+187
+188    if targets.contains(&Emit::Tokens) {
+189        let tokens = {
+190            let lexer = fe_parser::lexer::Lexer::new(SourceFileId::dummy_file(), file_content);
+191            lexer.collect::<Vec<_>>()
+192        };
+193        write_output(&output_dir.join("module.tokens"), &format!("{tokens:#?}"))?;
+194    }
+195
+196    for (name, contract) in module.contracts.drain(0..) {
+197        let contract_output_dir = output_dir.join(&name);
+198        fs::create_dir_all(&contract_output_dir).map_err(ioerr_to_string)?;
+199
+200        if targets.contains(&Emit::Abi) {
+201            let file_name = format!("{}_abi.json", &name);
+202            write_output(&contract_output_dir.join(file_name), &contract.json_abi)?;
+203        }
+204
+205        if targets.contains(&Emit::Yul) {
+206            let file_name = format!("{}_ir.yul", &name);
+207            write_output(&contract_output_dir.join(file_name), &contract.yul)?;
+208        }
+209
+210        #[cfg(feature = "solc-backend")]
+211        if targets.contains(&Emit::Bytecode) {
+212            let file_name = format!("{}.bin", &name);
+213            write_output(&contract_output_dir.join(file_name), &contract.bytecode)?;
+214        }
+215        #[cfg(feature = "solc-backend")]
+216        if targets.contains(&Emit::RuntimeBytecode) {
+217            let file_name = format!("{}.runtime.bin", &name);
+218            write_output(
+219                &contract_output_dir.join(file_name),
+220                &contract.runtime_bytecode,
+221            )?;
+222        }
+223    }
+224
+225    Ok(())
+226}
+227
+228fn write_output(path: &Path, content: &str) -> Result<(), String> {
+229    let mut file = fs::OpenOptions::new()
+230        .write(true)
+231        .create(true)
+232        .truncate(true)
+233        .open(path)
+234        .map_err(ioerr_to_string)?;
+235    file.write_all(content.as_bytes())
+236        .map_err(ioerr_to_string)?;
+237    Ok(())
+238}
+239
+240fn ioerr_to_string(error: Error) -> String {
+241    format!("{error}")
+242}
+243
+244fn verify_nonexistent_or_empty(dir: &Path) -> Result<(), String> {
+245    if !dir.exists() || dir.read_dir().map_err(ioerr_to_string)?.next().is_none() {
+246        Ok(())
+247    } else {
+248        Err(format!(
+249            "Directory '{}' is not empty. Use --overwrite to overwrite.",
+250            dir.display()
+251        ))
+252    }
+253}
+254
+255fn mir_dump(input_path: &str) {
+256    let mut db = fe_driver::Db::default();
+257    if Path::new(input_path).is_file() {
+258        let content = match std::fs::read_to_string(input_path) {
+259            Err(err) => {
+260                eprintln!("Failed to load file: `{input_path}`. Error: {err}");
+261                std::process::exit(1)
+262            }
+263            Ok(content) => content,
+264        };
+265
+266        match fe_driver::dump_mir_single_file(&mut db, input_path, &content) {
+267            Ok(text) => println!("{text}"),
+268            Err(err) => {
+269                eprintln!("Unable to dump mir `{input_path}");
+270                print_diagnostics(&db, &err.0);
+271                std::process::exit(1)
+272            }
+273        }
+274    } else {
+275        eprintln!("dumping mir for ingot is not supported yet");
+276        std::process::exit(1)
+277    }
+278}
\ No newline at end of file diff --git a/compiler-docs/src/fe/task/check.rs.html b/compiler-docs/src/fe/task/check.rs.html new file mode 100644 index 0000000000..fa504e090c --- /dev/null +++ b/compiler-docs/src/fe/task/check.rs.html @@ -0,0 +1,59 @@ +check.rs - source

fe/task/
check.rs

1use std::path::Path;
+2
+3use clap::Args;
+4use fe_common::{
+5    diagnostics::{print_diagnostics, Diagnostic},
+6    utils::files::get_project_root,
+7    utils::files::BuildFiles,
+8};
+9use fe_driver::Db;
+10
+11#[derive(Args)]
+12#[clap(about = "Analyze the current project and report errors, but don't build artifacts")]
+13pub struct CheckArgs {
+14    #[clap(default_value_t = get_project_root().unwrap_or(".".to_string()))]
+15    input_path: String,
+16}
+17
+18fn check_single_file(db: &mut Db, input_path: &str) -> Vec<Diagnostic> {
+19    let content = match std::fs::read_to_string(input_path) {
+20        Err(err) => {
+21            eprintln!("Failed to load file: `{}`. Error: {}", &input_path, err);
+22            std::process::exit(1)
+23        }
+24        Ok(content) => content,
+25    };
+26
+27    fe_driver::check_single_file(db, input_path, &content)
+28}
+29
+30fn check_ingot(db: &mut Db, input_path: &str) -> Vec<Diagnostic> {
+31    let build_files = match BuildFiles::load_fs(input_path) {
+32        Ok(files) => files,
+33        Err(err) => {
+34            eprintln!("Failed to load project files.\nError: {err}");
+35            std::process::exit(1)
+36        }
+37    };
+38
+39    fe_driver::check_ingot(db, &build_files)
+40}
+41
+42pub fn check(args: CheckArgs) {
+43    let mut db = fe_driver::Db::default();
+44    let input_path = args.input_path;
+45
+46    // check project
+47    let diags = if Path::new(&input_path).is_file() {
+48        check_single_file(&mut db, &input_path)
+49    } else {
+50        check_ingot(&mut db, &input_path)
+51    };
+52
+53    if !diags.is_empty() {
+54        print_diagnostics(&db, &diags);
+55        std::process::exit(1);
+56    }
+57
+58    eprintln!("Finished");
+59}
\ No newline at end of file diff --git a/compiler-docs/src/fe/task/mod.rs.html b/compiler-docs/src/fe/task/mod.rs.html new file mode 100644 index 0000000000..8f63150c22 --- /dev/null +++ b/compiler-docs/src/fe/task/mod.rs.html @@ -0,0 +1,26 @@ +mod.rs - source

fe/task/
mod.rs

1mod build;
+2mod check;
+3mod new;
+4#[cfg(feature = "solc-backend")]
+5mod test;
+6mod verify;
+7
+8pub use build::{build, BuildArgs};
+9pub use check::{check, CheckArgs};
+10use clap::Subcommand;
+11pub use new::{create_new_project, NewProjectArgs};
+12#[cfg(feature = "solc-backend")]
+13pub use test::{test, TestArgs};
+14#[cfg(feature = "solc-backend")]
+15pub use verify::{verify, VerifyArgs};
+16
+17#[derive(Subcommand)]
+18pub enum Commands {
+19    Build(BuildArgs),
+20    Check(CheckArgs),
+21    New(NewProjectArgs),
+22    #[cfg(feature = "solc-backend")]
+23    Verify(VerifyArgs),
+24    #[cfg(feature = "solc-backend")]
+25    Test(TestArgs),
+26}
\ No newline at end of file diff --git a/compiler-docs/src/fe/task/new.rs.html b/compiler-docs/src/fe/task/new.rs.html new file mode 100644 index 0000000000..145f93e9ac --- /dev/null +++ b/compiler-docs/src/fe/task/new.rs.html @@ -0,0 +1,49 @@ +new.rs - source

fe/task/
new.rs

1use clap::Args;
+2use include_dir::{include_dir, Dir};
+3use std::{fs, path::Path};
+4
+5const SRC_TEMPLATE_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/src/template/src");
+6
+7#[derive(Args)]
+8#[clap(about = "Create new fe project")]
+9pub struct NewProjectArgs {
+10    name: String,
+11}
+12
+13fn create_project(name: &str, path: &Path) {
+14    for src_file in SRC_TEMPLATE_DIR.entries() {
+15        let file = src_file.as_file().unwrap();
+16        fs::write(path.join("src").join(file.path()), file.contents()).unwrap();
+17    }
+18
+19    let manifest_content = format!(
+20        "name = \"{name}\"
+21version = \"1.0\"
+22
+23[dependencies]
+24# my_lib = \"../my_lib\"
+25# my_lib = {{ path = \"../my_lib\", version = \"1.0\" }}"
+26    );
+27    fs::write(path.join("fe.toml"), manifest_content).unwrap();
+28}
+29
+30pub fn create_new_project(args: NewProjectArgs) {
+31    let project_path = Path::new(&args.name);
+32
+33    if project_path.exists() {
+34        eprintln!(
+35            "Error: destination directory {} already exists",
+36            project_path.canonicalize().unwrap().display(),
+37        );
+38        std::process::exit(1)
+39    }
+40
+41    match fs::create_dir_all(project_path.join("src")) {
+42        Ok(_) => create_project(&args.name, project_path),
+43        Err(err) => {
+44            eprintln!("{err}");
+45            std::process::exit(1);
+46        }
+47    }
+48    eprintln!("Created {}", project_path.display());
+49}
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/contract.rs.html b/compiler-docs/src/fe_abi/contract.rs.html new file mode 100644 index 0000000000..a4651d8c6b --- /dev/null +++ b/compiler-docs/src/fe_abi/contract.rs.html @@ -0,0 +1,33 @@ +contract.rs - source

fe_abi/
contract.rs

1use super::{event::AbiEvent, function::AbiFunction};
+2
+3use serde::{ser::SerializeSeq, Serialize, Serializer};
+4
+5#[derive(Debug, Clone, PartialEq, Eq)]
+6pub struct AbiContract {
+7    /// Public functions in the contract.
+8    funcs: Vec<AbiFunction>,
+9
+10    /// Events emitted from the contract.
+11    events: Vec<AbiEvent>,
+12}
+13
+14impl Serialize for AbiContract {
+15    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
+16        let mut seq = s.serialize_seq(Some(self.funcs.len() + self.events.len()))?;
+17        for func in &self.funcs {
+18            seq.serialize_element(func)?;
+19        }
+20
+21        for event in &self.events {
+22            seq.serialize_element(event)?;
+23        }
+24
+25        seq.end()
+26    }
+27}
+28
+29impl AbiContract {
+30    pub fn new(funcs: Vec<AbiFunction>, events: Vec<AbiEvent>) -> Self {
+31        Self { funcs, events }
+32    }
+33}
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/event.rs.html b/compiler-docs/src/fe_abi/event.rs.html new file mode 100644 index 0000000000..8af29b798b --- /dev/null +++ b/compiler-docs/src/fe_abi/event.rs.html @@ -0,0 +1,148 @@ +event.rs - source

fe_abi/
event.rs

1use super::types::AbiType;
+2
+3use fe_common::utils::keccak;
+4use serde::Serialize;
+5
+6#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+7pub struct AbiEvent {
+8    #[serde(rename = "type")]
+9    pub ty: &'static str,
+10    pub name: String,
+11    pub inputs: Vec<AbiEventField>,
+12    pub anonymous: bool,
+13}
+14
+15impl AbiEvent {
+16    pub fn new(name: String, fields: Vec<AbiEventField>, anonymous: bool) -> Self {
+17        Self {
+18            ty: "event",
+19            name,
+20            inputs: fields,
+21            anonymous,
+22        }
+23    }
+24
+25    pub fn signature(&self) -> AbiEventSignature {
+26        AbiEventSignature::new(self)
+27    }
+28}
+29
+30pub struct AbiEventSignature {
+31    sig: String,
+32}
+33
+34impl AbiEventSignature {
+35    pub fn signature(&self) -> &str {
+36        &self.sig
+37    }
+38
+39    pub fn hash_hex(&self) -> String {
+40        keccak::full(self.sig.as_bytes())
+41    }
+42
+43    pub fn hash_raw(&self) -> [u8; 32] {
+44        keccak::full_as_bytes(self.sig.as_bytes())
+45    }
+46
+47    fn new(event: &AbiEvent) -> Self {
+48        let sig = format!(
+49            "{}({})",
+50            event.name,
+51            event
+52                .inputs
+53                .iter()
+54                .map(|input| input.ty.selector_type_name())
+55                .collect::<Vec<_>>()
+56                .join(",")
+57        );
+58
+59        Self { sig }
+60    }
+61}
+62
+63#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+64pub struct AbiEventField {
+65    pub name: String,
+66    #[serde(flatten)]
+67    pub ty: AbiType,
+68    pub indexed: bool,
+69}
+70
+71impl AbiEventField {
+72    pub fn new(name: String, ty: impl Into<AbiType>, indexed: bool) -> Self {
+73        Self {
+74            name,
+75            ty: ty.into(),
+76            indexed,
+77        }
+78    }
+79}
+80
+81#[cfg(test)]
+82mod tests {
+83    use super::*;
+84
+85    use serde_test::{assert_ser_tokens, Token};
+86
+87    fn test_event() -> AbiEvent {
+88        let i32_ty = AbiType::Int(32);
+89        let u32_ty = AbiType::UInt(32);
+90        let field1 = AbiEventField::new("x".into(), i32_ty, true);
+91        let field2 = AbiEventField::new("y".into(), u32_ty, false);
+92
+93        AbiEvent::new("MyEvent".into(), vec![field1, field2], false)
+94    }
+95
+96    #[test]
+97    fn serialize_event() {
+98        let event = test_event();
+99
+100        assert_ser_tokens(
+101            &event,
+102            &[
+103                Token::Struct {
+104                    name: "AbiEvent",
+105                    len: 4,
+106                },
+107                Token::Str("type"),
+108                Token::Str("event"),
+109                Token::String("name"),
+110                Token::String("MyEvent"),
+111                Token::Str("inputs"),
+112                Token::Seq { len: Some(2) },
+113                Token::Map { len: None },
+114                Token::String("name"),
+115                Token::String("x"),
+116                Token::String("type"),
+117                Token::String("int32"),
+118                Token::Str("indexed"),
+119                Token::Bool(true),
+120                Token::MapEnd,
+121                Token::Map { len: None },
+122                Token::String("name"),
+123                Token::String("y"),
+124                Token::String("type"),
+125                Token::String("uint32"),
+126                Token::Str("indexed"),
+127                Token::Bool(false),
+128                Token::MapEnd,
+129                Token::SeqEnd,
+130                Token::Str("anonymous"),
+131                Token::Bool(false),
+132                Token::StructEnd,
+133            ],
+134        )
+135    }
+136
+137    #[test]
+138    fn event_signature() {
+139        let event = test_event();
+140
+141        let sig = event.signature();
+142        debug_assert_eq!(sig.signature(), "MyEvent(int32,uint32)");
+143        debug_assert_eq!(
+144            sig.hash_hex(),
+145            "ec835d5150565cb216f72ba07d715e875b0738b1ac3f412e103839e5157b7ee6"
+146        );
+147    }
+148}
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/function.rs.html b/compiler-docs/src/fe_abi/function.rs.html new file mode 100644 index 0000000000..eb2ea0e01f --- /dev/null +++ b/compiler-docs/src/fe_abi/function.rs.html @@ -0,0 +1,307 @@ +function.rs - source

fe_abi/
function.rs

1use fe_common::utils::keccak;
+2
+3use serde::Serialize;
+4
+5use super::types::AbiType;
+6
+7/// The mutability of a public function.
+8#[derive(Serialize, Debug, PartialEq, Eq, Clone)]
+9#[serde(rename_all = "lowercase")]
+10pub enum StateMutability {
+11    Pure,
+12    View,
+13    Nonpayable,
+14    Payable,
+15}
+16
+17pub enum SelfParam {
+18    None,
+19    Imm,
+20    Mut,
+21}
+22pub enum CtxParam {
+23    None,
+24    Imm,
+25    Mut,
+26}
+27
+28impl StateMutability {
+29    pub fn from_self_and_ctx_params(self_: SelfParam, ctx: CtxParam) -> Self {
+30        // Check ABI conformity
+31        // See https://github.com/ethereum/fe/issues/558
+32        //
+33        //              no self   |   self   |  mut self  |
+34        //           ......................................
+35        // no ctx    :    pure    |   view    |  payable  |
+36        // ctx       :    view    |   view    |  payable  |
+37        // mut ctx   :   payable  |  payable  |  payable  |
+38
+39        match (self_, ctx) {
+40            (SelfParam::None, CtxParam::None) => StateMutability::Pure,
+41            (SelfParam::None, CtxParam::Imm) => StateMutability::View,
+42            (SelfParam::None, CtxParam::Mut) => StateMutability::Payable,
+43            (SelfParam::Imm, CtxParam::None) => StateMutability::View,
+44            (SelfParam::Imm, CtxParam::Imm) => StateMutability::View,
+45            (SelfParam::Imm, CtxParam::Mut) => StateMutability::Payable,
+46            (SelfParam::Mut, _) => StateMutability::Payable,
+47        }
+48    }
+49}
+50
+51#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+52pub struct AbiFunction {
+53    #[serde(rename = "type")]
+54    func_type: AbiFunctionType,
+55    name: String,
+56    inputs: Vec<AbiFunctionParamInner>,
+57    outputs: Vec<AbiFunctionParamInner>,
+58    #[serde(rename = "stateMutability")]
+59    state_mutability: StateMutability,
+60}
+61
+62impl AbiFunction {
+63    pub fn new(
+64        func_type: AbiFunctionType,
+65        name: String,
+66        args: Vec<(String, AbiType)>,
+67        ret_ty: Option<AbiType>,
+68        state_mutability: StateMutability,
+69    ) -> Self {
+70        let inputs = args
+71            .into_iter()
+72            .map(|(arg_name, arg_ty)| AbiFunctionParamInner::new(arg_name, arg_ty))
+73            .collect();
+74        let outputs = ret_ty.map_or_else(Vec::new, |ret_ty| {
+75            vec![AbiFunctionParamInner::new("".into(), ret_ty)]
+76        });
+77
+78        Self {
+79            func_type,
+80            name,
+81            inputs,
+82            outputs,
+83            state_mutability,
+84        }
+85    }
+86
+87    pub fn selector(&self) -> AbiFunctionSelector {
+88        AbiFunctionSelector::new(self)
+89    }
+90}
+91
+92#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
+93#[serde(rename_all = "lowercase")]
+94pub enum AbiFunctionType {
+95    Function,
+96    Constructor,
+97    Receive,
+98    Payable,
+99    Fallback,
+100}
+101
+102pub struct AbiFunctionSelector {
+103    selector_sig: String,
+104}
+105
+106impl AbiFunctionSelector {
+107    fn new(func_sig: &AbiFunction) -> Self {
+108        let selector_sig = format!(
+109            "{}({})",
+110            func_sig.name,
+111            func_sig
+112                .inputs
+113                .iter()
+114                .map(|param| param.ty.selector_type_name())
+115                .collect::<Vec<_>>()
+116                .join(",")
+117        );
+118
+119        Self { selector_sig }
+120    }
+121
+122    pub fn selector_signature(&self) -> &str {
+123        &self.selector_sig
+124    }
+125
+126    pub fn selector_raw(&self) -> [u8; 4] {
+127        keccak::full_as_bytes(self.selector_sig.as_bytes())[..4]
+128            .try_into()
+129            .unwrap()
+130    }
+131
+132    /// Returns first 4 bytes of signature hash in hex.
+133    pub fn hex(&self) -> String {
+134        keccak::partial(self.selector_sig.as_bytes(), 4)
+135    }
+136}
+137
+138#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+139struct AbiFunctionParamInner {
+140    name: String,
+141    #[serde(flatten)]
+142    ty: AbiType,
+143}
+144
+145impl AbiFunctionParamInner {
+146    fn new(name: String, ty: AbiType) -> Self {
+147        Self { name, ty }
+148    }
+149}
+150
+151#[cfg(test)]
+152mod tests {
+153    use crate::types::AbiTupleField;
+154
+155    use super::*;
+156    use serde_test::{assert_ser_tokens, Token};
+157
+158    fn simple_tuple() -> AbiType {
+159        let u16_ty = AbiType::UInt(16);
+160        let bool_ty = AbiType::Bool;
+161        let field1 = AbiTupleField::new("field1".into(), u16_ty);
+162        let field2 = AbiTupleField::new("field2".into(), bool_ty);
+163
+164        AbiType::Tuple(vec![field1, field2])
+165    }
+166
+167    fn test_func(state_mutability: StateMutability) -> AbiFunction {
+168        let i32_ty = AbiType::Int(32);
+169        let tuple_ty = simple_tuple();
+170        let u64_ty = AbiType::UInt(64);
+171
+172        AbiFunction::new(
+173            AbiFunctionType::Function,
+174            "test_func".into(),
+175            vec![("arg1".into(), i32_ty), ("arg2".into(), tuple_ty)],
+176            Some(u64_ty),
+177            state_mutability,
+178        )
+179    }
+180
+181    #[test]
+182    fn serialize_func() {
+183        let func = test_func(StateMutability::Payable);
+184
+185        assert_ser_tokens(
+186            &func,
+187            &[
+188                Token::Struct {
+189                    name: "AbiFunction",
+190                    len: 5,
+191                },
+192                Token::Str("type"),
+193                Token::UnitVariant {
+194                    name: "AbiFunctionType",
+195                    variant: "function",
+196                },
+197                Token::String("name"),
+198                Token::String("test_func"),
+199                Token::Str("inputs"),
+200                Token::Seq { len: Some(2) },
+201                Token::Map { len: None },
+202                Token::String("name"),
+203                Token::String("arg1"),
+204                Token::String("type"),
+205                Token::String("int32"),
+206                Token::MapEnd,
+207                Token::Map { len: None },
+208                Token::String("name"),
+209                Token::String("arg2"),
+210                Token::String("type"),
+211                Token::String("tuple"),
+212                Token::String("components"),
+213                Token::Seq { len: Some(2) },
+214                Token::Map { len: None },
+215                Token::String("name"),
+216                Token::String("field1"),
+217                Token::String("type"),
+218                Token::String("uint16"),
+219                Token::MapEnd,
+220                Token::Map { len: None },
+221                Token::String("name"),
+222                Token::String("field2"),
+223                Token::String("type"),
+224                Token::String("bool"),
+225                Token::MapEnd,
+226                Token::SeqEnd,
+227                Token::MapEnd,
+228                Token::SeqEnd,
+229                Token::Str("outputs"),
+230                Token::Seq { len: Some(1) },
+231                Token::Map { len: None },
+232                Token::String("name"),
+233                Token::String(""),
+234                Token::String("type"),
+235                Token::String("uint64"),
+236                Token::MapEnd,
+237                Token::SeqEnd,
+238                Token::Str("stateMutability"),
+239                Token::UnitVariant {
+240                    name: "StateMutability",
+241                    variant: "payable",
+242                },
+243                Token::StructEnd,
+244            ],
+245        )
+246    }
+247
+248    #[test]
+249    fn test_state_mutability() {
+250        assert_eq!(
+251            StateMutability::from_self_and_ctx_params(SelfParam::None, CtxParam::None),
+252            StateMutability::Pure
+253        );
+254        assert_eq!(
+255            StateMutability::from_self_and_ctx_params(SelfParam::None, CtxParam::Imm),
+256            StateMutability::View
+257        );
+258        assert_eq!(
+259            StateMutability::from_self_and_ctx_params(SelfParam::None, CtxParam::Mut),
+260            StateMutability::Payable
+261        );
+262
+263        assert_eq!(
+264            StateMutability::from_self_and_ctx_params(SelfParam::Imm, CtxParam::None),
+265            StateMutability::View
+266        );
+267        assert_eq!(
+268            StateMutability::from_self_and_ctx_params(SelfParam::Imm, CtxParam::Imm),
+269            StateMutability::View
+270        );
+271        assert_eq!(
+272            StateMutability::from_self_and_ctx_params(SelfParam::Imm, CtxParam::Mut),
+273            StateMutability::Payable
+274        );
+275
+276        assert_eq!(
+277            StateMutability::from_self_and_ctx_params(SelfParam::Mut, CtxParam::None),
+278            StateMutability::Payable
+279        );
+280        assert_eq!(
+281            StateMutability::from_self_and_ctx_params(SelfParam::Mut, CtxParam::Imm),
+282            StateMutability::Payable
+283        );
+284        assert_eq!(
+285            StateMutability::from_self_and_ctx_params(SelfParam::Mut, CtxParam::Mut),
+286            StateMutability::Payable
+287        );
+288
+289        let pure_func = test_func(StateMutability::Pure);
+290        assert_eq!(pure_func.state_mutability, StateMutability::Pure);
+291
+292        let impure_func = test_func(StateMutability::Payable);
+293        assert_eq!(impure_func.state_mutability, StateMutability::Payable);
+294    }
+295
+296    #[test]
+297    fn func_selector() {
+298        let func = test_func(StateMutability::Payable);
+299        let selector = func.selector();
+300
+301        debug_assert_eq!(
+302            selector.selector_signature(),
+303            "test_func(int32,(uint16,bool))"
+304        );
+305        debug_assert_eq!(selector.hex(), "79c3c8b2");
+306    }
+307}
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/lib.rs.html b/compiler-docs/src/fe_abi/lib.rs.html new file mode 100644 index 0000000000..7df2ca15e0 --- /dev/null +++ b/compiler-docs/src/fe_abi/lib.rs.html @@ -0,0 +1,4 @@ +lib.rs - source

fe_abi/
lib.rs

1pub mod contract;
+2pub mod event;
+3pub mod function;
+4pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_abi/types.rs.html b/compiler-docs/src/fe_abi/types.rs.html new file mode 100644 index 0000000000..b4efbedf58 --- /dev/null +++ b/compiler-docs/src/fe_abi/types.rs.html @@ -0,0 +1,374 @@ +types.rs - source

fe_abi/
types.rs

1use serde::{ser::SerializeMap, Serialize, Serializer};
+2
+3#[derive(Debug, Clone, PartialEq, Eq)]
+4pub enum AbiType {
+5    UInt(usize),
+6    Int(usize),
+7    Address,
+8    Bool,
+9    Function,
+10    Array { elem_ty: Box<AbiType>, len: usize },
+11    Tuple(Vec<AbiTupleField>),
+12    Bytes,
+13    String,
+14}
+15
+16impl AbiType {
+17    pub fn selector_type_name(&self) -> String {
+18        match self {
+19            Self::UInt(bits) => format!("uint{bits}"),
+20            Self::Int(bits) => format!("int{bits}"),
+21            Self::Address => "address".to_string(),
+22            Self::Bool => "bool".to_string(),
+23            Self::Function => "function".to_string(),
+24            Self::Array { elem_ty, len } => {
+25                if elem_ty.as_ref() == &AbiType::UInt(8) {
+26                    "bytes".to_string()
+27                } else {
+28                    format!("{}[{}]", elem_ty.selector_type_name(), len)
+29                }
+30            }
+31            Self::Tuple(elems) => format!(
+32                "({})",
+33                elems
+34                    .iter()
+35                    .map(|component| component.ty.selector_type_name())
+36                    .collect::<Vec<_>>()
+37                    .join(",")
+38            ),
+39
+40            Self::Bytes => "bytes".to_string(),
+41            Self::String => "string".to_string(),
+42        }
+43    }
+44
+45    pub fn abi_type_name(&self) -> String {
+46        match self {
+47            Self::Tuple(_) => "tuple".to_string(),
+48            Self::Array { elem_ty, len } => {
+49                if elem_ty.as_ref() == &AbiType::UInt(8) {
+50                    "bytes".to_string()
+51                } else {
+52                    format!("{}[{}]", elem_ty.abi_type_name(), len)
+53                }
+54            }
+55            _ => self.selector_type_name(),
+56        }
+57    }
+58
+59    pub fn header_size(&self) -> usize {
+60        match self {
+61            Self::UInt(_) | Self::Int(_) | Self::Address | Self::Bool | Self::Function => 32,
+62
+63            Self::Array { elem_ty, len } if elem_ty.is_static() => elem_ty.header_size() * len,
+64            Self::Array { .. } => 32,
+65
+66            Self::Tuple(fields) if self.is_static() => fields
+67                .iter()
+68                .fold(0, |acc, field| field.ty.header_size() + acc),
+69            Self::Tuple(_) => 32,
+70
+71            Self::Bytes | Self::String => 32,
+72        }
+73    }
+74
+75    pub fn is_primitive(&self) -> bool {
+76        matches! {
+77            self,
+78            Self::UInt(_) | Self::Int(_) | Self::Address | Self::Bool
+79        }
+80    }
+81
+82    pub fn is_bytes(&self) -> bool {
+83        matches! {
+84            self,
+85            Self::Bytes,
+86        }
+87    }
+88
+89    pub fn is_string(&self) -> bool {
+90        matches! {
+91            self,
+92            Self::String
+93        }
+94    }
+95
+96    pub fn is_static(&self) -> bool {
+97        match self {
+98            Self::UInt(_) | Self::Int(_) | Self::Address | Self::Bool | Self::Function => true,
+99            Self::Array { elem_ty, .. } => elem_ty.is_static(),
+100            Self::Tuple(fields) => fields.iter().all(|field| field.ty.is_static()),
+101            Self::Bytes | Self::String => false,
+102        }
+103    }
+104
+105    /// Returns bytes size of the encoded type if the type is static.
+106    pub fn size(&self) -> Option<usize> {
+107        match self {
+108            Self::UInt(_) | Self::Int(_) | Self::Address | Self::Bool => Some(32),
+109            Self::Function => Some(24),
+110            Self::Array { elem_ty, len } => Some(elem_ty.size()? * len),
+111            Self::Tuple(fields) => {
+112                let mut size = 0;
+113                for field in fields.iter() {
+114                    size += field.ty.size()?;
+115                }
+116                Some(size)
+117            }
+118
+119            Self::Bytes | Self::String => None,
+120        }
+121    }
+122
+123    fn serialize_component<S: SerializeMap>(&self, s: &mut S) -> Result<(), S::Error> {
+124        match self {
+125            Self::Tuple(entry) => s.serialize_entry("components", entry),
+126            Self::Array { elem_ty, .. } => elem_ty.serialize_component(s),
+127            _ => Ok(()),
+128        }
+129    }
+130}
+131
+132impl Serialize for AbiType {
+133    fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
+134        let mut map = s.serialize_map(None)?;
+135        let type_name = self.abi_type_name();
+136
+137        map.serialize_entry("type", &type_name)?;
+138
+139        self.serialize_component(&mut map)?;
+140        map.end()
+141    }
+142}
+143
+144#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
+145pub struct AbiTupleField {
+146    pub name: String,
+147    #[serde(flatten)]
+148    pub ty: AbiType,
+149}
+150
+151impl AbiTupleField {
+152    pub fn new(name: String, ty: impl Into<AbiType>) -> Self {
+153        Self {
+154            name,
+155            ty: ty.into(),
+156        }
+157    }
+158}
+159
+160#[cfg(test)]
+161mod tests {
+162    use super::*;
+163
+164    use serde_test::{assert_ser_tokens, Token};
+165
+166    #[test]
+167    fn primitive() {
+168        let u32_ty = AbiType::UInt(32);
+169        assert_ser_tokens(
+170            &u32_ty,
+171            &[
+172                Token::Map { len: None },
+173                Token::String("type"),
+174                Token::String("uint32"),
+175                Token::MapEnd,
+176            ],
+177        )
+178    }
+179
+180    #[test]
+181    fn primitive_array() {
+182        let i32_ty = AbiType::Int(32);
+183        let array_i32 = AbiType::Array {
+184            elem_ty: i32_ty.into(),
+185            len: 10,
+186        };
+187
+188        assert_ser_tokens(
+189            &array_i32,
+190            &[
+191                Token::Map { len: None },
+192                Token::String("type"),
+193                Token::String("int32[10]"),
+194                Token::MapEnd,
+195            ],
+196        )
+197    }
+198
+199    #[test]
+200    fn tuple_array() {
+201        let u16_ty = AbiType::UInt(16);
+202        let bool_ty = AbiType::Bool;
+203        let array_bool = AbiType::Array {
+204            elem_ty: bool_ty.into(),
+205            len: 16,
+206        };
+207
+208        let field1 = AbiTupleField::new("field1".into(), u16_ty);
+209        let field2 = AbiTupleField::new("field2".into(), array_bool);
+210        let tuple_ty = AbiType::Tuple(vec![field1, field2]);
+211
+212        let tuple_array_ty = AbiType::Array {
+213            elem_ty: tuple_ty.into(),
+214            len: 16,
+215        };
+216
+217        assert_ser_tokens(
+218            &tuple_array_ty,
+219            &[
+220                Token::Map { len: None },
+221                Token::String("type"),
+222                Token::String("tuple[16]"),
+223                Token::String("components"),
+224                Token::Seq { len: Some(2) },
+225                // Field1.
+226                Token::Map { len: None },
+227                Token::String("name"),
+228                Token::String("field1"),
+229                Token::String("type"),
+230                Token::String("uint16"),
+231                Token::MapEnd,
+232                // Field2.
+233                Token::Map { len: None },
+234                Token::String("name"),
+235                Token::String("field2"),
+236                Token::String("type"),
+237                Token::String("bool[16]"),
+238                Token::MapEnd,
+239                Token::SeqEnd,
+240                Token::MapEnd,
+241            ],
+242        )
+243    }
+244
+245    #[test]
+246    fn simple_tuple() {
+247        let u16_ty = AbiType::UInt(16);
+248        let bool_ty = AbiType::Bool;
+249        let bool_array_ty = AbiType::Array {
+250            elem_ty: bool_ty.into(),
+251            len: 16,
+252        };
+253
+254        let field1 = AbiTupleField::new("field1".into(), u16_ty);
+255        let field2 = AbiTupleField::new("field2".into(), bool_array_ty);
+256        let tuple_ty = AbiType::Tuple(vec![field1, field2]);
+257
+258        assert_ser_tokens(
+259            &tuple_ty,
+260            &[
+261                Token::Map { len: None },
+262                Token::String("type"),
+263                Token::String("tuple"),
+264                Token::String("components"),
+265                Token::Seq { len: Some(2) },
+266                // Field1.
+267                Token::Map { len: None },
+268                Token::String("name"),
+269                Token::String("field1"),
+270                Token::String("type"),
+271                Token::String("uint16"),
+272                Token::MapEnd,
+273                // Field2.
+274                Token::Map { len: None },
+275                Token::String("name"),
+276                Token::String("field2"),
+277                Token::String("type"),
+278                Token::String("bool[16]"),
+279                Token::MapEnd,
+280                Token::SeqEnd,
+281                Token::MapEnd,
+282            ],
+283        )
+284    }
+285
+286    #[test]
+287    fn complex_tuple() {
+288        let u16_ty = AbiType::UInt(16);
+289        let bool_ty = AbiType::Bool;
+290
+291        let inner_field1 = AbiTupleField::new("inner_field1".into(), u16_ty);
+292        let inner_field2 = AbiTupleField::new("inner_field2".into(), bool_ty);
+293        let inner_tuple_ty = AbiType::Tuple(vec![inner_field1, inner_field2]);
+294
+295        let inner_tuple_array_ty = AbiType::Array {
+296            elem_ty: inner_tuple_ty.clone().into(),
+297            len: 16,
+298        };
+299
+300        let outer_field1 = AbiTupleField::new("outer_field1".into(), inner_tuple_array_ty);
+301        let outer_field2 = AbiTupleField::new("outer_field2".into(), inner_tuple_ty);
+302        let outer_tuple_ty = AbiType::Tuple(vec![outer_field1, outer_field2]);
+303
+304        assert_ser_tokens(
+305            &outer_tuple_ty,
+306            &[
+307                // Outer tuple start.
+308                Token::Map { len: None },
+309                Token::String("type"),
+310                Token::String("tuple"),
+311                // Outer tuple components start.
+312                Token::String("components"),
+313                Token::Seq { len: Some(2) },
+314                // Outer field1 start.
+315                Token::Map { len: None },
+316                Token::String("name"),
+317                Token::String("outer_field1"),
+318                Token::String("type"),
+319                Token::String("tuple[16]"),
+320                Token::String("components"),
+321                Token::Seq { len: Some(2) },
+322                // Inner field1 start.
+323                Token::Map { len: None },
+324                Token::String("name"),
+325                Token::String("inner_field1"),
+326                Token::String("type"),
+327                Token::String("uint16"),
+328                Token::MapEnd,
+329                // Inner field1 end.
+330                // Inner field2 start.
+331                Token::Map { len: None },
+332                Token::String("name"),
+333                Token::String("inner_field2"),
+334                Token::String("type"),
+335                Token::String("bool"),
+336                Token::MapEnd,
+337                // Inner field2 end.
+338                Token::SeqEnd,
+339                Token::MapEnd,
+340                // Outer field1 end.
+341                // Outer field2 start.
+342                Token::Map { len: None },
+343                Token::String("name"),
+344                Token::String("outer_field2"),
+345                Token::String("type"),
+346                Token::String("tuple"),
+347                Token::String("components"),
+348                Token::Seq { len: Some(2) },
+349                // Inner field1 start.
+350                Token::Map { len: None },
+351                Token::String("name"),
+352                Token::String("inner_field1"),
+353                Token::String("type"),
+354                Token::String("uint16"),
+355                Token::MapEnd,
+356                // Inner field1 end.
+357                // Inner field2 start.
+358                Token::Map { len: None },
+359                Token::String("name"),
+360                Token::String("inner_field2"),
+361                Token::String("type"),
+362                Token::String("bool"),
+363                Token::MapEnd,
+364                // Inner field2 end.
+365                Token::SeqEnd,
+366                Token::MapEnd,
+367                // Outer field2 end.
+368                Token::SeqEnd,
+369                // Outer tuple components end.
+370                Token::MapEnd,
+371            ],
+372        )
+373    }
+374}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/builtins.rs.html b/compiler-docs/src/fe_analyzer/builtins.rs.html new file mode 100644 index 0000000000..b65b1494a5 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/builtins.rs.html @@ -0,0 +1,154 @@ +builtins.rs - source

fe_analyzer/
builtins.rs

1use crate::namespace::types::Base;
+2use strum::{AsRefStr, EnumIter, EnumString};
+3
+4#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, EnumString, AsRefStr)]
+5#[strum(serialize_all = "snake_case")]
+6pub enum ValueMethod {
+7    ToMem,
+8    AbiEncode,
+9}
+10
+11#[derive(
+12    Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, EnumString, AsRefStr, EnumIter,
+13)]
+14#[strum(serialize_all = "snake_case")]
+15pub enum GlobalFunction {
+16    Keccak256,
+17}
+18
+19#[derive(Debug, Copy, Clone, PartialEq, Eq, EnumString, AsRefStr)]
+20#[strum(serialize_all = "snake_case")]
+21pub enum ContractTypeMethod {
+22    Create,
+23    Create2,
+24}
+25
+26impl ContractTypeMethod {
+27    pub fn arg_count(&self) -> usize {
+28        match self {
+29            ContractTypeMethod::Create => 2,
+30            ContractTypeMethod::Create2 => 3,
+31        }
+32    }
+33}
+34
+35/// The evm functions exposed by yul.
+36#[allow(non_camel_case_types)]
+37#[derive(
+38    Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, EnumString, AsRefStr, EnumIter,
+39)]
+40pub enum Intrinsic {
+41    __stop,           // () -> ()
+42    __add,            // (x, y)
+43    __sub,            // (x, y)
+44    __mul,            // (x, y)
+45    __div,            // (x, y)
+46    __sdiv,           // (x, y)
+47    __mod,            // (x, y)
+48    __smod,           // (x, y)
+49    __exp,            // (x, y)
+50    __not,            // (x)
+51    __lt,             // (x, y)
+52    __gt,             // (x, y)
+53    __slt,            // (x, y)
+54    __sgt,            // (x, y)
+55    __eq,             // (x, y)
+56    __iszero,         // (x)
+57    __and,            // (x, y)
+58    __or,             // (x, y)
+59    __xor,            // (x, y)
+60    __byte,           // (n, x)
+61    __shl,            // (x, y)
+62    __shr,            // (x, y)
+63    __sar,            // (x, y)
+64    __addmod,         // (x, y, m)
+65    __mulmod,         // (x, y, m)
+66    __signextend,     // (i, x)
+67    __keccak256,      // (p, n)
+68    __pc,             // ()
+69    __pop,            // (x) -> ()
+70    __mload,          // (p)
+71    __mstore,         // (p, v) -> ()
+72    __mstore8,        // (p, v) -> ()
+73    __sload,          // (p)
+74    __sstore,         // (p, v) -> ()
+75    __msize,          // ()
+76    __gas,            // ()
+77    __address,        // ()
+78    __balance,        // (a)
+79    __selfbalance,    // ()
+80    __caller,         // ()
+81    __callvalue,      // ()
+82    __calldataload,   // (p)
+83    __calldatasize,   // ()
+84    __calldatacopy,   // (t, f, s) -> ()
+85    __codesize,       // ()
+86    __codecopy,       // (t, f, s) -> ()
+87    __extcodesize,    // (a)
+88    __extcodecopy,    // (a, t, f, s) -> ()
+89    __returndatasize, // ()
+90    __returndatacopy, // (t, f, s) -> ()
+91    __extcodehash,    // (a)
+92    __create,         // (v, p, n)
+93    __create2,        // (v, p, n, s)
+94    __call,           // (g, a, v, in, insize, out, outsize)
+95    __callcode,       // (g, a, v, in, insize, out, outsize)
+96    __delegatecall,   // (g, a, in, insize, out, outsize)
+97    __staticcall,     // (g, a, in, insize, out, outsize)
+98    __return,         // (p, s) -> ()
+99    __revert,         // (p, s) -> ()
+100    __selfdestruct,   // (a) -> ()
+101    __invalid,        // () -> ()
+102    __log0,           // (p, s) -> ()
+103    __log1,           // (p, s, t1) -> ()
+104    __log2,           // (p, s, t1, t2) -> ()
+105    __log3,           // (p, s, t1, t2, t3) -> ()
+106    __log4,           // (p, s, t1, t2, t3, t4) -> ()
+107    __chainid,        // ()
+108    __basefee,        // ()
+109    __origin,         // ()
+110    __gasprice,       // ()
+111    __blockhash,      // (b)
+112    __coinbase,       // ()
+113    __timestamp,      // ()
+114    __number,         // ()
+115    __prevrandao,     // ()
+116    __gaslimit,       // ()
+117}
+118
+119impl Intrinsic {
+120    pub fn arg_count(&self) -> usize {
+121        use Intrinsic::*;
+122        match self {
+123            __stop | __basefee | __origin | __gasprice | __coinbase | __timestamp | __number
+124            | __prevrandao | __gaslimit | __pc | __msize | __gas | __address | __selfbalance
+125            | __caller | __callvalue | __calldatasize | __codesize | __returndatasize
+126            | __invalid | __chainid => 0,
+127
+128            __not | __iszero | __pop | __mload | __balance | __sload | __calldataload
+129            | __extcodesize | __extcodehash | __selfdestruct | __blockhash => 1,
+130
+131            __add | __sub | __mul | __div | __sdiv | __mod | __smod | __exp | __lt | __gt
+132            | __slt | __sgt | __eq | __and | __or | __xor | __byte | __shl | __shr | __sar
+133            | __signextend | __keccak256 | __mstore | __mstore8 | __sstore | __return
+134            | __revert | __log0 => 2,
+135
+136            __addmod | __mulmod | __calldatacopy | __codecopy | __returndatacopy | __create
+137            | __log1 => 3,
+138            __extcodecopy | __create2 | __log2 => 4,
+139            __log3 => 5,
+140            __delegatecall | __staticcall | __log4 => 6,
+141            __call | __callcode => 7,
+142        }
+143    }
+144
+145    pub fn return_type(&self) -> Base {
+146        use Intrinsic::*;
+147        match self {
+148            __stop | __pop | __mstore | __mstore8 | __sstore | __calldatacopy | __codecopy
+149            | __extcodecopy | __returndatacopy | __return | __revert | __selfdestruct
+150            | __invalid | __log0 | __log1 | __log2 | __log3 | __log4 => Base::Unit,
+151            _ => Base::u256(),
+152        }
+153    }
+154}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/constants.rs.html b/compiler-docs/src/fe_analyzer/constants.rs.html new file mode 100644 index 0000000000..40d2bfae47 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/constants.rs.html @@ -0,0 +1,4 @@ +constants.rs - source

fe_analyzer/
constants.rs

1pub const EMITTABLE_TRAIT_NAME: &str = "Emittable";
+2pub const EMIT_FN_NAME: &str = "emit";
+3pub const INDEXED: &str = "indexed";
+4pub const MAX_INDEXED_EVENT_FIELDS: usize = 3;
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/context.rs.html b/compiler-docs/src/fe_analyzer/context.rs.html new file mode 100644 index 0000000000..2f827859ed --- /dev/null +++ b/compiler-docs/src/fe_analyzer/context.rs.html @@ -0,0 +1,595 @@ +context.rs - source

fe_analyzer/
context.rs

1use crate::{
+2    display::Displayable,
+3    errors::FatalError,
+4    namespace::items::{EnumVariantId, TypeDef},
+5    pattern_analysis::PatternMatrix,
+6};
+7
+8use crate::namespace::items::{
+9    ContractId, DiagnosticSink, FunctionId, FunctionSigId, Item, TraitId,
+10};
+11use crate::namespace::types::{Generic, SelfDecl, Type, TypeId};
+12use crate::AnalyzerDb;
+13use crate::{
+14    builtins::{ContractTypeMethod, GlobalFunction, Intrinsic, ValueMethod},
+15    namespace::scopes::BlockScopeType,
+16};
+17use crate::{
+18    errors::{self, IncompleteItem, TypeError},
+19    namespace::items::ModuleId,
+20};
+21use fe_common::diagnostics::Diagnostic;
+22pub use fe_common::diagnostics::Label;
+23use fe_common::Span;
+24use fe_parser::ast;
+25use fe_parser::node::{Node, NodeId};
+26
+27use indexmap::IndexMap;
+28use num_bigint::BigInt;
+29use smol_str::SmolStr;
+30use std::fmt::{self, Debug};
+31use std::hash::Hash;
+32use std::marker::PhantomData;
+33use std::rc::Rc;
+34use std::{cell::RefCell, collections::HashMap};
+35
+36#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+37pub struct Analysis<T> {
+38    pub value: T,
+39    pub diagnostics: Rc<[Diagnostic]>,
+40}
+41impl<T> Analysis<T> {
+42    pub fn new(value: T, diagnostics: Rc<[Diagnostic]>) -> Self {
+43        Self { value, diagnostics }
+44    }
+45    pub fn sink_diagnostics(&self, sink: &mut impl DiagnosticSink) {
+46        self.diagnostics.iter().for_each(|diag| sink.push(diag))
+47    }
+48    pub fn has_diag(&self) -> bool {
+49        !self.diagnostics.is_empty()
+50    }
+51}
+52
+53pub trait AnalyzerContext {
+54    fn resolve_name(&self, name: &str, span: Span) -> Result<Option<NamedThing>, IncompleteItem>;
+55    /// Resolves the given path and registers all errors
+56    fn resolve_path(&self, path: &ast::Path, span: Span) -> Result<NamedThing, FatalError>;
+57    /// Resolves the given path only if it is visible. Does not register any errors
+58    fn resolve_visible_path(&self, path: &ast::Path) -> Option<NamedThing>;
+59    /// Resolves the given path. Does not register any errors
+60    fn resolve_any_path(&self, path: &ast::Path) -> Option<NamedThing>;
+61
+62    fn add_diagnostic(&self, diag: Diagnostic);
+63    fn db(&self) -> &dyn AnalyzerDb;
+64
+65    fn error(&self, message: &str, label_span: Span, label: &str) -> DiagnosticVoucher {
+66        self.register_diag(errors::error(message, label_span, label))
+67    }
+68
+69    /// Attribute contextual information to an expression node.
+70    ///
+71    /// # Panics
+72    ///
+73    /// Panics if an entry already exists for the node id.
+74    fn add_expression(&self, node: &Node<ast::Expr>, attributes: ExpressionAttributes);
+75
+76    /// Update the expression attributes.
+77    ///
+78    /// # Panics
+79    ///
+80    /// Panics if an entry does not already exist for the node id.
+81    fn update_expression(&self, node: &Node<ast::Expr>, f: &dyn Fn(&mut ExpressionAttributes));
+82
+83    /// Returns a type of an expression.
+84    ///
+85    /// # Panics
+86    ///
+87    /// Panics if type analysis is not performed for an `expr`.
+88    fn expr_typ(&self, expr: &Node<ast::Expr>) -> Type;
+89
+90    /// Add evaluated constant value in a constant declaration to the context.
+91    fn add_constant(&self, name: &Node<ast::SmolStr>, expr: &Node<ast::Expr>, value: Constant);
+92
+93    /// Returns constant value from variable name.
+94    fn constant_value_by_name(
+95        &self,
+96        name: &ast::SmolStr,
+97        span: Span,
+98    ) -> Result<Option<Constant>, IncompleteItem>;
+99
+100    /// Returns an item enclosing current context.
+101    ///
+102    /// # Example
+103    ///
+104    /// ```fe
+105    /// contract Foo:
+106    ///     fn foo():
+107    ///        if ...:
+108    ///            ...
+109    ///        else:
+110    ///            ...
+111    /// ```
+112    /// If the context is in `then` block, then this function returns
+113    /// `Item::Function(..)`.
+114    fn parent(&self) -> Item;
+115
+116    /// Returns the module enclosing current context.
+117    fn module(&self) -> ModuleId;
+118
+119    /// Returns a function id that encloses a context.
+120    ///
+121    /// # Panics
+122    ///
+123    /// Panics if a context is not in a function. Use [`Self::is_in_function`]
+124    /// to determine whether a context is in a function.
+125    fn parent_function(&self) -> FunctionId;
+126
+127    /// Returns a non-function item that encloses a context.
+128    ///
+129    /// # Example
+130    ///
+131    /// ```fe
+132    /// contract Foo:
+133    ///     fn foo():
+134    ///        if ...:
+135    ///            ...
+136    ///        else:
+137    ///            ...
+138    /// ```
+139    /// If the context is in `then` block, then this function returns
+140    /// `Item::Type(TypeDef::Contract(..))`.
+141    fn root_item(&self) -> Item {
+142        let mut item = self.parent();
+143        while let Item::Function(func_id) = item {
+144            item = func_id.parent(self.db());
+145        }
+146        item
+147    }
+148
+149    /// # Panics
+150    ///
+151    /// Panics if a context is not in a function. Use [`Self::is_in_function`]
+152    /// to determine whether a context is in a function.
+153    fn add_call(&self, node: &Node<ast::Expr>, call_type: CallType);
+154    fn get_call(&self, node: &Node<ast::Expr>) -> Option<CallType>;
+155
+156    /// Returns `true` if the context is in function scope.
+157    fn is_in_function(&self) -> bool;
+158
+159    /// Returns `true` if the scope or any of its parents is of the given type.
+160    fn inherits_type(&self, typ: BlockScopeType) -> bool;
+161
+162    /// Returns the `Context` type, if it is defined.
+163    fn get_context_type(&self) -> Option<TypeId>;
+164
+165    fn type_error(
+166        &self,
+167        message: &str,
+168        span: Span,
+169        expected: TypeId,
+170        actual: TypeId,
+171    ) -> DiagnosticVoucher {
+172        self.register_diag(errors::type_error(
+173            message,
+174            span,
+175            expected.display(self.db()),
+176            actual.display(self.db()),
+177        ))
+178    }
+179
+180    fn not_yet_implemented(&self, feature: &str, span: Span) -> DiagnosticVoucher {
+181        self.register_diag(errors::not_yet_implemented(feature, span))
+182    }
+183
+184    fn fancy_error(
+185        &self,
+186        message: &str,
+187        labels: Vec<Label>,
+188        notes: Vec<String>,
+189    ) -> DiagnosticVoucher {
+190        self.register_diag(errors::fancy_error(message, labels, notes))
+191    }
+192
+193    fn duplicate_name_error(
+194        &self,
+195        message: &str,
+196        name: &str,
+197        original: Span,
+198        duplicate: Span,
+199    ) -> DiagnosticVoucher {
+200        self.register_diag(errors::duplicate_name_error(
+201            message, name, original, duplicate,
+202        ))
+203    }
+204
+205    fn name_conflict_error(
+206        &self,
+207        name_kind: &str, // Eg "function parameter" or "variable name"
+208        name: &str,
+209        original: &NamedThing,
+210        original_span: Option<Span>,
+211        duplicate_span: Span,
+212    ) -> DiagnosticVoucher {
+213        self.register_diag(errors::name_conflict_error(
+214            name_kind,
+215            name,
+216            original,
+217            original_span,
+218            duplicate_span,
+219        ))
+220    }
+221
+222    fn register_diag(&self, diag: Diagnostic) -> DiagnosticVoucher {
+223        self.add_diagnostic(diag);
+224        DiagnosticVoucher(PhantomData)
+225    }
+226}
+227
+228#[derive(Clone, Debug, PartialEq, Eq)]
+229pub enum NamedThing {
+230    Item(Item),
+231    EnumVariant(EnumVariantId),
+232    SelfValue {
+233        /// Function `self` parameter.
+234        decl: Option<SelfDecl>,
+235
+236        /// The function's parent, if any. If `None`, `self` has been
+237        /// used in a module-level function.
+238        parent: Option<Item>,
+239        span: Option<Span>,
+240    },
+241    // SelfType // when/if we add a `Self` type keyword
+242    Variable {
+243        name: SmolStr,
+244        typ: Result<TypeId, TypeError>,
+245        is_const: bool,
+246        span: Span,
+247    },
+248}
+249
+250impl NamedThing {
+251    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+252        match self {
+253            NamedThing::Item(item) => item.name(db),
+254            NamedThing::EnumVariant(variant) => variant.name(db),
+255            NamedThing::SelfValue { .. } => "self".into(),
+256            NamedThing::Variable { name, .. } => name.clone(),
+257        }
+258    }
+259
+260    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+261        match self {
+262            NamedThing::Item(item) => item.name_span(db),
+263            NamedThing::EnumVariant(variant) => Some(variant.span(db)),
+264            NamedThing::SelfValue { span, .. } => *span,
+265            NamedThing::Variable { span, .. } => Some(*span),
+266        }
+267    }
+268
+269    pub fn is_builtin(&self) -> bool {
+270        match self {
+271            NamedThing::Item(item) => item.is_builtin(),
+272            NamedThing::EnumVariant(_)
+273            | NamedThing::Variable { .. }
+274            | NamedThing::SelfValue { .. } => false,
+275        }
+276    }
+277
+278    pub fn item_kind_display_name(&self) -> &str {
+279        match self {
+280            NamedThing::Item(item) => item.item_kind_display_name(),
+281            NamedThing::EnumVariant(_) => "enum variant",
+282            NamedThing::Variable { .. } => "variable",
+283            NamedThing::SelfValue { .. } => "value",
+284        }
+285    }
+286
+287    pub fn resolve_path_segment(
+288        &self,
+289        db: &dyn AnalyzerDb,
+290        segment: &SmolStr,
+291    ) -> Option<NamedThing> {
+292        if let Self::Item(Item::Type(TypeDef::Enum(enum_))) = self {
+293            if let Some(variant) = enum_.variant(db, segment) {
+294                return Some(NamedThing::EnumVariant(variant));
+295            }
+296        }
+297
+298        match self {
+299            Self::Item(item) => item
+300                .items(db)
+301                .get(segment)
+302                .map(|resolved| NamedThing::Item(*resolved)),
+303
+304            _ => None,
+305        }
+306    }
+307}
+308
+309/// This should only be created by [`AnalyzerContext`].
+310#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+311pub struct DiagnosticVoucher(PhantomData<()>);
+312
+313impl DiagnosticVoucher {
+314    pub fn assume_the_parser_handled_it() -> Self {
+315        Self(PhantomData)
+316    }
+317}
+318
+319#[derive(Default)]
+320pub struct TempContext {
+321    pub diagnostics: RefCell<Vec<Diagnostic>>,
+322}
+323impl AnalyzerContext for TempContext {
+324    fn db(&self) -> &dyn AnalyzerDb {
+325        panic!("TempContext has no analyzer db")
+326    }
+327
+328    fn resolve_name(&self, _name: &str, _span: Span) -> Result<Option<NamedThing>, IncompleteItem> {
+329        panic!("TempContext can't resolve names")
+330    }
+331
+332    fn resolve_path(&self, _path: &ast::Path, _span: Span) -> Result<NamedThing, FatalError> {
+333        panic!("TempContext can't resolve paths")
+334    }
+335
+336    fn resolve_visible_path(&self, _path: &ast::Path) -> Option<NamedThing> {
+337        panic!("TempContext can't resolve paths")
+338    }
+339
+340    fn resolve_any_path(&self, _path: &ast::Path) -> Option<NamedThing> {
+341        panic!("TempContext can't resolve paths")
+342    }
+343
+344    fn add_expression(&self, _node: &Node<ast::Expr>, _attributes: ExpressionAttributes) {
+345        panic!("TempContext can't store expression")
+346    }
+347
+348    fn update_expression(&self, _node: &Node<ast::Expr>, _f: &dyn Fn(&mut ExpressionAttributes)) {
+349        panic!("TempContext can't update expression");
+350    }
+351
+352    fn expr_typ(&self, _expr: &Node<ast::Expr>) -> Type {
+353        panic!("TempContext can't return expression type")
+354    }
+355
+356    fn add_constant(&self, _name: &Node<ast::SmolStr>, _expr: &Node<ast::Expr>, _value: Constant) {
+357        panic!("TempContext can't store constant")
+358    }
+359
+360    fn constant_value_by_name(
+361        &self,
+362        _name: &ast::SmolStr,
+363        _span: Span,
+364    ) -> Result<Option<Constant>, IncompleteItem> {
+365        Ok(None)
+366    }
+367
+368    fn parent(&self) -> Item {
+369        panic!("TempContext has no root item")
+370    }
+371
+372    fn module(&self) -> ModuleId {
+373        panic!("TempContext has no module")
+374    }
+375
+376    fn parent_function(&self) -> FunctionId {
+377        panic!("TempContext has no parent function")
+378    }
+379
+380    fn add_call(&self, _node: &Node<ast::Expr>, _call_type: CallType) {
+381        panic!("TempContext can't add call");
+382    }
+383
+384    fn get_call(&self, _node: &Node<ast::Expr>) -> Option<CallType> {
+385        panic!("TempContext can't have calls");
+386    }
+387
+388    fn is_in_function(&self) -> bool {
+389        false
+390    }
+391
+392    fn inherits_type(&self, _typ: BlockScopeType) -> bool {
+393        false
+394    }
+395
+396    fn add_diagnostic(&self, diag: Diagnostic) {
+397        self.diagnostics.borrow_mut().push(diag)
+398    }
+399
+400    fn get_context_type(&self) -> Option<TypeId> {
+401        panic!("TempContext can't resolve Context")
+402    }
+403}
+404
+405#[derive(Default, Clone, Debug, PartialEq, Eq)]
+406pub struct FunctionBody {
+407    pub expressions: IndexMap<NodeId, ExpressionAttributes>,
+408    // Map match statements to the corresponding [`PatternMatrix`]
+409    pub matches: IndexMap<NodeId, PatternMatrix>,
+410    // Map lhs of variable declaration to type.
+411    pub var_types: IndexMap<NodeId, TypeId>,
+412    pub calls: IndexMap<NodeId, CallType>,
+413    pub spans: HashMap<NodeId, Span>,
+414}
+415
+416/// Contains contextual information relating to an expression AST node.
+417#[derive(Clone, Debug, PartialEq, Eq)]
+418pub struct ExpressionAttributes {
+419    pub typ: TypeId,
+420    // Evaluated constant value of const local definition.
+421    pub const_value: Option<Constant>,
+422    pub type_adjustments: Vec<Adjustment>,
+423}
+424impl ExpressionAttributes {
+425    pub fn original_type(&self) -> TypeId {
+426        self.typ
+427    }
+428    pub fn adjusted_type(&self) -> TypeId {
+429        if let Some(adj) = self.type_adjustments.last() {
+430            adj.into
+431        } else {
+432            self.typ
+433        }
+434    }
+435}
+436
+437#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+438pub struct Adjustment {
+439    pub into: TypeId,
+440    pub kind: AdjustmentKind,
+441}
+442
+443#[derive(Copy, Clone, Debug, PartialEq, Eq)]
+444pub enum AdjustmentKind {
+445    Copy,
+446    /// Load from storage ptr
+447    Load,
+448    IntSizeIncrease,
+449    StringSizeIncrease,
+450}
+451
+452impl ExpressionAttributes {
+453    pub fn new(typ: TypeId) -> Self {
+454        Self {
+455            typ,
+456            const_value: None,
+457            type_adjustments: vec![],
+458        }
+459    }
+460}
+461
+462impl crate::display::DisplayWithDb for ExpressionAttributes {
+463    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
+464        let ExpressionAttributes {
+465            typ,
+466            const_value,
+467            type_adjustments,
+468        } = self;
+469        write!(f, "{}", typ.display(db))?;
+470        if let Some(val) = &const_value {
+471            write!(f, " = {val:?}")?;
+472        }
+473        for adj in type_adjustments {
+474            write!(f, " -{:?}-> {}", adj.kind, adj.into.display(db))?;
+475        }
+476        Ok(())
+477    }
+478}
+479
+480/// The type of a function call.
+481#[derive(Clone, Debug, PartialEq, Eq)]
+482pub enum CallType {
+483    BuiltinFunction(GlobalFunction),
+484    Intrinsic(Intrinsic),
+485    BuiltinValueMethod {
+486        method: ValueMethod,
+487        typ: TypeId,
+488    },
+489
+490    // create, create2 (will be methods of the context struct soon)
+491    BuiltinAssociatedFunction {
+492        contract: ContractId,
+493        function: ContractTypeMethod,
+494    },
+495
+496    // MyStruct.foo() (soon MyStruct::foo())
+497    AssociatedFunction {
+498        typ: TypeId,
+499        function: FunctionId,
+500    },
+501    // some_struct_or_contract.foo()
+502    ValueMethod {
+503        typ: TypeId,
+504        method: FunctionId,
+505    },
+506    // some_trait.foo()
+507    // The reason this can not use `ValueMethod` is mainly because the trait might not have a
+508    // function implementation and even if it had it might not be the one that ends up getting
+509    // executed. An `impl` block will decide that.
+510    TraitValueMethod {
+511        trait_id: TraitId,
+512        method: FunctionSigId,
+513        // Traits can not directly be used as types but can act as bounds for generics. This is the
+514        // generic type that the method is called on.
+515        generic_type: Generic,
+516    },
+517    External {
+518        contract: ContractId,
+519        function: FunctionId,
+520    },
+521    Pure(FunctionId),
+522    TypeConstructor(TypeId),
+523    EnumConstructor(EnumVariantId),
+524}
+525
+526impl CallType {
+527    pub fn function(&self) -> Option<FunctionId> {
+528        use CallType::*;
+529        match self {
+530            BuiltinFunction(_)
+531            | BuiltinValueMethod { .. }
+532            | TypeConstructor(_)
+533            | EnumConstructor(_)
+534            | Intrinsic(_)
+535            | TraitValueMethod { .. }
+536            | BuiltinAssociatedFunction { .. } => None,
+537            AssociatedFunction { function: id, .. }
+538            | ValueMethod { method: id, .. }
+539            | External { function: id, .. }
+540            | Pure(id) => Some(*id),
+541        }
+542    }
+543
+544    pub fn function_name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+545        match self {
+546            CallType::BuiltinFunction(f) => f.as_ref().into(),
+547            CallType::Intrinsic(f) => f.as_ref().into(),
+548            CallType::BuiltinValueMethod { method, .. } => method.as_ref().into(),
+549            CallType::BuiltinAssociatedFunction { function, .. } => function.as_ref().into(),
+550            CallType::AssociatedFunction { function: id, .. }
+551            | CallType::ValueMethod { method: id, .. }
+552            | CallType::External { function: id, .. }
+553            | CallType::Pure(id) => id.name(db),
+554            CallType::TraitValueMethod { method: id, .. } => id.name(db),
+555            CallType::TypeConstructor(typ) => typ.display(db).to_string().into(),
+556            CallType::EnumConstructor(variant) => {
+557                let enum_name = variant.parent(db).name(db);
+558                let variant_name = variant.name(db);
+559                format!("{enum_name}::{variant_name}").into()
+560            }
+561        }
+562    }
+563
+564    pub fn is_unsafe(&self, db: &dyn AnalyzerDb) -> bool {
+565        if let CallType::Intrinsic(_) = self {
+566            true
+567        } else if let CallType::TypeConstructor(type_id) = self {
+568            // check that this is the `Context` struct defined in `std`
+569            // this should be deleted once associated functions are supported and we can
+570            // define unsafe constructors in Fe
+571            if let Type::Struct(struct_) = type_id.typ(db) {
+572                struct_.name(db) == "Context" && struct_.module(db).ingot(db).name(db) == "std"
+573            } else {
+574                false
+575            }
+576        } else {
+577            self.function().map(|id| id.is_unsafe(db)).unwrap_or(false)
+578        }
+579    }
+580}
+581
+582impl fmt::Display for CallType {
+583    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
+584        write!(f, "{self:?}")
+585    }
+586}
+587
+588/// Represents constant value.
+589#[derive(Debug, Clone, PartialEq, Eq)]
+590pub enum Constant {
+591    Int(BigInt),
+592    Address(BigInt),
+593    Bool(bool),
+594    Str(SmolStr),
+595}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db.rs.html b/compiler-docs/src/fe_analyzer/db.rs.html new file mode 100644 index 0000000000..48f5b7375a --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db.rs.html @@ -0,0 +1,238 @@ +db.rs - source

fe_analyzer/
db.rs

1#![allow(clippy::arc_with_non_send_sync)]
+2use crate::namespace::items::{
+3    self, AttributeId, ContractFieldId, ContractId, DepGraphWrapper, EnumVariantKind, FunctionId,
+4    FunctionSigId, ImplId, IngotId, Item, ModuleConstantId, ModuleId, StructFieldId, StructId,
+5    TraitId, TypeAliasId,
+6};
+7use crate::namespace::types::{self, Type, TypeId};
+8use crate::{
+9    context::{Analysis, Constant, FunctionBody},
+10    namespace::items::EnumId,
+11};
+12use crate::{
+13    errors::{ConstEvalError, TypeError},
+14    namespace::items::EnumVariantId,
+15};
+16use fe_common::db::{SourceDb, SourceDbStorage, Upcast, UpcastMut};
+17use fe_common::{SourceFileId, Span};
+18use fe_parser::ast;
+19use indexmap::map::IndexMap;
+20use smol_str::SmolStr;
+21use std::rc::Rc;
+22mod queries;
+23
+24#[salsa::query_group(AnalyzerDbStorage)]
+25pub trait AnalyzerDb: SourceDb + Upcast<dyn SourceDb> + UpcastMut<dyn SourceDb> {
+26    #[salsa::interned]
+27    fn intern_ingot(&self, data: Rc<items::Ingot>) -> IngotId;
+28    #[salsa::interned]
+29    fn intern_module(&self, data: Rc<items::Module>) -> ModuleId;
+30    #[salsa::interned]
+31    fn intern_module_const(&self, data: Rc<items::ModuleConstant>) -> ModuleConstantId;
+32    #[salsa::interned]
+33    fn intern_struct(&self, data: Rc<items::Struct>) -> StructId;
+34    #[salsa::interned]
+35    fn intern_struct_field(&self, data: Rc<items::StructField>) -> StructFieldId;
+36    #[salsa::interned]
+37    fn intern_enum(&self, data: Rc<items::Enum>) -> EnumId;
+38    #[salsa::interned]
+39    fn intern_attribute(&self, data: Rc<items::Attribute>) -> AttributeId;
+40    #[salsa::interned]
+41    fn intern_enum_variant(&self, data: Rc<items::EnumVariant>) -> EnumVariantId;
+42    #[salsa::interned]
+43    fn intern_trait(&self, data: Rc<items::Trait>) -> TraitId;
+44    #[salsa::interned]
+45    fn intern_impl(&self, data: Rc<items::Impl>) -> ImplId;
+46    #[salsa::interned]
+47    fn intern_type_alias(&self, data: Rc<items::TypeAlias>) -> TypeAliasId;
+48    #[salsa::interned]
+49    fn intern_contract(&self, data: Rc<items::Contract>) -> ContractId;
+50    #[salsa::interned]
+51    fn intern_contract_field(&self, data: Rc<items::ContractField>) -> ContractFieldId;
+52    #[salsa::interned]
+53    fn intern_function_sig(&self, data: Rc<items::FunctionSig>) -> FunctionSigId;
+54    #[salsa::interned]
+55    fn intern_function(&self, data: Rc<items::Function>) -> FunctionId;
+56    #[salsa::interned]
+57    fn intern_type(&self, data: Type) -> TypeId;
+58
+59    // Ingot
+60
+61    // These are inputs so that the (future) language server can add
+62    // and remove files/dependencies. Set via eg `db.set_ingot_files`.
+63    // If an input is used before it's set, salsa will panic.
+64    #[salsa::input]
+65    fn ingot_files(&self, ingot: IngotId) -> Rc<[SourceFileId]>;
+66    #[salsa::input]
+67    fn ingot_external_ingots(&self, ingot: IngotId) -> Rc<IndexMap<SmolStr, IngotId>>;
+68    // Having the root ingot available as a "global" might offend functional
+69    // programming purists but it makes for much nicer ergonomics in queries
+70    // that just need the global entrypoint
+71    #[salsa::input]
+72    fn root_ingot(&self) -> IngotId;
+73
+74    #[salsa::invoke(queries::ingots::ingot_modules)]
+75    fn ingot_modules(&self, ingot: IngotId) -> Rc<[ModuleId]>;
+76    #[salsa::invoke(queries::ingots::ingot_root_module)]
+77    fn ingot_root_module(&self, ingot: IngotId) -> Option<ModuleId>;
+78
+79    // Module
+80    #[salsa::invoke(queries::module::module_file_path)]
+81    fn module_file_path(&self, module: ModuleId) -> SmolStr;
+82    #[salsa::invoke(queries::module::module_parse)]
+83    fn module_parse(&self, module: ModuleId) -> Analysis<Rc<ast::Module>>;
+84    #[salsa::invoke(queries::module::module_is_incomplete)]
+85    fn module_is_incomplete(&self, module: ModuleId) -> bool;
+86    #[salsa::invoke(queries::module::module_all_items)]
+87    fn module_all_items(&self, module: ModuleId) -> Rc<[Item]>;
+88    #[salsa::invoke(queries::module::module_all_impls)]
+89    fn module_all_impls(&self, module: ModuleId) -> Analysis<Rc<[ImplId]>>;
+90    #[salsa::invoke(queries::module::module_item_map)]
+91    fn module_item_map(&self, module: ModuleId) -> Analysis<Rc<IndexMap<SmolStr, Item>>>;
+92    #[salsa::invoke(queries::module::module_impl_map)]
+93    fn module_impl_map(
+94        &self,
+95        module: ModuleId,
+96    ) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>>;
+97    #[salsa::invoke(queries::module::module_contracts)]
+98    fn module_contracts(&self, module: ModuleId) -> Rc<[ContractId]>;
+99    #[salsa::invoke(queries::module::module_structs)]
+100    fn module_structs(&self, module: ModuleId) -> Rc<[StructId]>;
+101    #[salsa::invoke(queries::module::module_constants)]
+102    fn module_constants(&self, module: ModuleId) -> Rc<Vec<ModuleConstantId>>;
+103    #[salsa::invoke(queries::module::module_used_item_map)]
+104    fn module_used_item_map(
+105        &self,
+106        module: ModuleId,
+107    ) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>>;
+108    #[salsa::invoke(queries::module::module_parent_module)]
+109    fn module_parent_module(&self, module: ModuleId) -> Option<ModuleId>;
+110    #[salsa::invoke(queries::module::module_submodules)]
+111    fn module_submodules(&self, module: ModuleId) -> Rc<[ModuleId]>;
+112    #[salsa::invoke(queries::module::module_tests)]
+113    fn module_tests(&self, module: ModuleId) -> Vec<FunctionId>;
+114
+115    // Module Constant
+116    #[salsa::cycle(queries::module::module_constant_type_cycle)]
+117    #[salsa::invoke(queries::module::module_constant_type)]
+118    fn module_constant_type(&self, id: ModuleConstantId) -> Analysis<Result<TypeId, TypeError>>;
+119    #[salsa::cycle(queries::module::module_constant_value_cycle)]
+120    #[salsa::invoke(queries::module::module_constant_value)]
+121    fn module_constant_value(
+122        &self,
+123        id: ModuleConstantId,
+124    ) -> Analysis<Result<Constant, ConstEvalError>>;
+125
+126    // Contract
+127    #[salsa::invoke(queries::contracts::contract_all_functions)]
+128    fn contract_all_functions(&self, id: ContractId) -> Rc<[FunctionId]>;
+129    #[salsa::invoke(queries::contracts::contract_function_map)]
+130    fn contract_function_map(&self, id: ContractId) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>;
+131    #[salsa::invoke(queries::contracts::contract_public_function_map)]
+132    fn contract_public_function_map(&self, id: ContractId) -> Rc<IndexMap<SmolStr, FunctionId>>;
+133    #[salsa::invoke(queries::contracts::contract_init_function)]
+134    fn contract_init_function(&self, id: ContractId) -> Analysis<Option<FunctionId>>;
+135    #[salsa::invoke(queries::contracts::contract_call_function)]
+136    fn contract_call_function(&self, id: ContractId) -> Analysis<Option<FunctionId>>;
+137
+138    #[salsa::invoke(queries::contracts::contract_all_fields)]
+139    fn contract_all_fields(&self, id: ContractId) -> Rc<[ContractFieldId]>;
+140    #[salsa::invoke(queries::contracts::contract_field_map)]
+141    fn contract_field_map(
+142        &self,
+143        id: ContractId,
+144    ) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>>;
+145    #[salsa::invoke(queries::contracts::contract_field_type)]
+146    fn contract_field_type(&self, field: ContractFieldId) -> Analysis<Result<TypeId, TypeError>>;
+147    #[salsa::cycle(queries::contracts::contract_dependency_graph_cycle)]
+148    #[salsa::invoke(queries::contracts::contract_dependency_graph)]
+149    fn contract_dependency_graph(&self, id: ContractId) -> DepGraphWrapper;
+150    #[salsa::cycle(queries::contracts::contract_runtime_dependency_graph_cycle)]
+151    #[salsa::invoke(queries::contracts::contract_runtime_dependency_graph)]
+152    fn contract_runtime_dependency_graph(&self, id: ContractId) -> DepGraphWrapper;
+153
+154    // Function
+155    #[salsa::invoke(queries::functions::function_signature)]
+156    fn function_signature(&self, id: FunctionSigId) -> Analysis<Rc<types::FunctionSignature>>;
+157    #[salsa::invoke(queries::functions::function_body)]
+158    fn function_body(&self, id: FunctionId) -> Analysis<Rc<FunctionBody>>;
+159    #[salsa::cycle(queries::functions::function_dependency_graph_cycle)]
+160    #[salsa::invoke(queries::functions::function_dependency_graph)]
+161    fn function_dependency_graph(&self, id: FunctionId) -> DepGraphWrapper;
+162
+163    // Struct
+164    #[salsa::invoke(queries::structs::struct_all_fields)]
+165    fn struct_all_fields(&self, id: StructId) -> Rc<[StructFieldId]>;
+166    #[salsa::invoke(queries::structs::struct_field_map)]
+167    fn struct_field_map(&self, id: StructId) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>>;
+168    #[salsa::invoke(queries::structs::struct_field_type)]
+169    fn struct_field_type(&self, field: StructFieldId) -> Analysis<Result<TypeId, TypeError>>;
+170    #[salsa::invoke(queries::structs::struct_all_functions)]
+171    fn struct_all_functions(&self, id: StructId) -> Rc<[FunctionId]>;
+172    #[salsa::invoke(queries::structs::struct_function_map)]
+173    fn struct_function_map(&self, id: StructId) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>;
+174    #[salsa::cycle(queries::structs::struct_cycle)]
+175    #[salsa::invoke(queries::structs::struct_dependency_graph)]
+176    fn struct_dependency_graph(&self, id: StructId) -> Analysis<DepGraphWrapper>;
+177
+178    // Enum
+179    #[salsa::invoke(queries::enums::enum_all_variants)]
+180    fn enum_all_variants(&self, id: EnumId) -> Rc<[EnumVariantId]>;
+181    #[salsa::invoke(queries::enums::enum_variant_map)]
+182    fn enum_variant_map(&self, id: EnumId) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>>;
+183    #[salsa::invoke(queries::enums::enum_all_functions)]
+184    fn enum_all_functions(&self, id: EnumId) -> Rc<[FunctionId]>;
+185    #[salsa::invoke(queries::enums::enum_function_map)]
+186    fn enum_function_map(&self, id: EnumId) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>;
+187    #[salsa::cycle(queries::enums::enum_cycle)]
+188    #[salsa::invoke(queries::enums::enum_dependency_graph)]
+189    fn enum_dependency_graph(&self, id: EnumId) -> Analysis<DepGraphWrapper>;
+190    #[salsa::invoke(queries::enums::enum_variant_kind)]
+191    fn enum_variant_kind(&self, id: EnumVariantId) -> Analysis<Result<EnumVariantKind, TypeError>>;
+192
+193    // Trait
+194    #[salsa::invoke(queries::traits::trait_all_functions)]
+195    fn trait_all_functions(&self, id: TraitId) -> Rc<[FunctionSigId]>;
+196    #[salsa::invoke(queries::traits::trait_function_map)]
+197    fn trait_function_map(&self, id: TraitId) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>>;
+198    #[salsa::invoke(queries::traits::trait_is_implemented_for)]
+199    fn trait_is_implemented_for(&self, id: TraitId, typ: TypeId) -> bool;
+200
+201    // Impl
+202    #[salsa::invoke(queries::impls::impl_all_functions)]
+203    fn impl_all_functions(&self, id: ImplId) -> Rc<[FunctionId]>;
+204    #[salsa::invoke(queries::impls::impl_function_map)]
+205    fn impl_function_map(&self, id: ImplId) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>>;
+206
+207    // Type
+208    #[salsa::invoke(queries::types::all_impls)]
+209    fn all_impls(&self, ty: TypeId) -> Rc<[ImplId]>;
+210    #[salsa::invoke(queries::types::impl_for)]
+211    fn impl_for(&self, ty: TypeId, treit: TraitId) -> Option<ImplId>;
+212    #[salsa::invoke(queries::types::function_sigs)]
+213    fn function_sigs(&self, ty: TypeId, name: SmolStr) -> Rc<[FunctionSigId]>;
+214
+215    // Type alias
+216    #[salsa::invoke(queries::types::type_alias_type)]
+217    #[salsa::cycle(queries::types::type_alias_type_cycle)]
+218    fn type_alias_type(&self, id: TypeAliasId) -> Analysis<Result<TypeId, TypeError>>;
+219}
+220
+221#[salsa::database(AnalyzerDbStorage, SourceDbStorage)]
+222#[derive(Default)]
+223pub struct TestDb {
+224    storage: salsa::Storage<TestDb>,
+225}
+226impl salsa::Database for TestDb {}
+227
+228impl Upcast<dyn SourceDb> for TestDb {
+229    fn upcast(&self) -> &(dyn SourceDb + 'static) {
+230        self
+231    }
+232}
+233
+234impl UpcastMut<dyn SourceDb> for TestDb {
+235    fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static) {
+236        &mut *self
+237    }
+238}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries.rs.html b/compiler-docs/src/fe_analyzer/db/queries.rs.html new file mode 100644 index 0000000000..6e0e2953a5 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries.rs.html @@ -0,0 +1,9 @@ +queries.rs - source

fe_analyzer/db/
queries.rs

1pub mod contracts;
+2pub mod enums;
+3pub mod functions;
+4pub mod impls;
+5pub mod ingots;
+6pub mod module;
+7pub mod structs;
+8pub mod traits;
+9pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/contracts.rs.html b/compiler-docs/src/fe_analyzer/db/queries/contracts.rs.html new file mode 100644 index 0000000000..b0762338dc --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/contracts.rs.html @@ -0,0 +1,403 @@ +contracts.rs - source

fe_analyzer/db/queries/
contracts.rs

1use crate::context::AnalyzerContext;
+2use crate::db::{Analysis, AnalyzerDb};
+3use crate::errors;
+4use crate::namespace::items::{
+5    self, ContractFieldId, ContractId, DepGraph, DepGraphWrapper, DepLocality, FunctionId, Item,
+6    TypeDef,
+7};
+8use crate::namespace::scopes::ItemScope;
+9use crate::namespace::types::{self, Type};
+10use crate::traversal::types::type_desc;
+11use fe_common::diagnostics::Label;
+12use fe_parser::ast;
+13use indexmap::map::{Entry, IndexMap};
+14use smol_str::SmolStr;
+15use std::rc::Rc;
+16
+17/// A `Vec` of every function defined in the contract, including duplicates and
+18/// the init function.
+19pub fn contract_all_functions(db: &dyn AnalyzerDb, contract: ContractId) -> Rc<[FunctionId]> {
+20    let module = contract.module(db);
+21    let body = &contract.data(db).ast.kind.body;
+22    body.iter()
+23        .map(|stmt| match stmt {
+24            ast::ContractStmt::Function(node) => db.intern_function(Rc::new(items::Function::new(
+25                db,
+26                node,
+27                Some(Item::Type(TypeDef::Contract(contract))),
+28                module,
+29            ))),
+30        })
+31        .collect()
+32}
+33
+34pub fn contract_function_map(
+35    db: &dyn AnalyzerDb,
+36    contract: ContractId,
+37) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>> {
+38    let scope = ItemScope::new(db, contract.module(db));
+39    let mut map = IndexMap::<SmolStr, FunctionId>::new();
+40
+41    for func in db.contract_all_functions(contract).iter() {
+42        let def = &func.data(db).ast;
+43        let def_name = def.name();
+44        if def_name == "__init__" || def_name == "__call__" {
+45            continue;
+46        }
+47
+48        if let Ok(Some(named_item)) = scope.resolve_name(def_name, func.name_span(db)) {
+49            scope.name_conflict_error(
+50                "function",
+51                def_name,
+52                &named_item,
+53                named_item.name_span(db),
+54                def.kind.sig.kind.name.span,
+55            );
+56            continue;
+57        }
+58
+59        let func_sig = func.sig(db);
+60        if let Ok(ret_ty) = func_sig.signature(db).return_type {
+61            if func.is_public(db) && !ret_ty.is_encodable(db).unwrap_or(false) {
+62                scope.fancy_error(
+63                    "can't return unencodable type from public contract function",
+64                    vec![Label::primary(
+65                        func_sig
+66                            .data(db)
+67                            .ast
+68                            .kind
+69                            .return_type
+70                            .as_ref()
+71                            .unwrap()
+72                            .span,
+73                        format! {"can't return `{}` here", ret_ty.name(db)},
+74                    )],
+75                    vec![],
+76                );
+77            }
+78        }
+79        for (i, param) in func_sig.signature(db).params.iter().enumerate() {
+80            if let Ok(param_ty) = param.typ {
+81                if func.is_public(db) && !param_ty.is_encodable(db).unwrap_or(false) {
+82                    scope.fancy_error(
+83                        "can't use unencodable type as a public contract function argument",
+84                        vec![Label::primary(
+85                            func_sig.data(db).ast.kind.args[i].kind.typ_span().unwrap(),
+86                            format! {"can't use `{}` here", param_ty.name(db)},
+87                        )],
+88                        vec![],
+89                    );
+90                }
+91            }
+92        }
+93
+94        match map.entry(def.name().into()) {
+95            Entry::Occupied(entry) => {
+96                scope.duplicate_name_error(
+97                    &format!(
+98                        "duplicate function names in `contract {}`",
+99                        contract.name(db),
+100                    ),
+101                    entry.key(),
+102                    entry.get().data(db).ast.span,
+103                    def.span,
+104                );
+105            }
+106            Entry::Vacant(entry) => {
+107                entry.insert(*func);
+108            }
+109        }
+110    }
+111    Analysis {
+112        value: Rc::new(map),
+113        diagnostics: scope.diagnostics.take().into(),
+114    }
+115}
+116
+117pub fn contract_public_function_map(
+118    db: &dyn AnalyzerDb,
+119    contract: ContractId,
+120) -> Rc<IndexMap<SmolStr, FunctionId>> {
+121    Rc::new(
+122        contract
+123            .functions(db)
+124            .iter()
+125            .filter(|(_, func)| func.is_public(db))
+126            .map(|(name, func)| (name.clone(), *func))
+127            .collect(),
+128    )
+129}
+130
+131pub fn contract_init_function(
+132    db: &dyn AnalyzerDb,
+133    contract: ContractId,
+134) -> Analysis<Option<FunctionId>> {
+135    let all_fns = db.contract_all_functions(contract);
+136    let mut init_fns = all_fns.iter().filter_map(|func| {
+137        let def = &func.data(db).ast;
+138        (def.name() == "__init__").then_some((func, def.span))
+139    });
+140
+141    let mut diagnostics = vec![];
+142
+143    let first_def = init_fns.next();
+144    if let Some((_, dupe_span)) = init_fns.next() {
+145        let mut labels = vec![
+146            Label::primary(first_def.unwrap().1, "`__init__` first defined here"),
+147            Label::secondary(dupe_span, "`init` redefined here"),
+148        ];
+149        for (_, dupe_span) in init_fns {
+150            labels.push(Label::secondary(dupe_span, "`__init__` redefined here"));
+151        }
+152        diagnostics.push(errors::fancy_error(
+153            format!(
+154                "`fn __init__()` is defined multiple times in `contract {}`",
+155                contract.name(db),
+156            ),
+157            labels,
+158            vec![],
+159        ));
+160    }
+161
+162    if let Some((id, span)) = first_def {
+163        // `__init__` must be `pub`.
+164        // Return type is checked in `queries::functions::function_signature`.
+165        if !id.is_public(db) {
+166            diagnostics.push(errors::fancy_error(
+167                "`__init__` function is not public",
+168                vec![Label::primary(span, "`__init__` function must be public")],
+169                vec![
+170                    "Hint: Add the `pub` modifier.".to_string(),
+171                    "Example: `pub fn __init__():`".to_string(),
+172                ],
+173            ));
+174        }
+175    }
+176
+177    Analysis {
+178        value: first_def.map(|(id, _span)| *id),
+179        diagnostics: diagnostics.into(),
+180    }
+181}
+182
+183pub fn contract_call_function(
+184    db: &dyn AnalyzerDb,
+185    contract: ContractId,
+186) -> Analysis<Option<FunctionId>> {
+187    let all_fns = db.contract_all_functions(contract);
+188    let mut call_fns = all_fns.iter().filter_map(|func| {
+189        let def = &func.data(db).ast;
+190        (def.name() == "__call__").then_some((func, def.span))
+191    });
+192
+193    let mut diagnostics = vec![];
+194
+195    let first_def = call_fns.next();
+196    if let Some((_, dupe_span)) = call_fns.next() {
+197        let mut labels = vec![
+198            Label::primary(first_def.unwrap().1, "`__call__` first defined here"),
+199            Label::secondary(dupe_span, "`__call__` redefined here"),
+200        ];
+201        for (_, dupe_span) in call_fns {
+202            labels.push(Label::secondary(dupe_span, "`__call__` redefined here"));
+203        }
+204        diagnostics.push(errors::fancy_error(
+205            format!(
+206                "`fn __call__()` is defined multiple times in `contract {}`",
+207                contract.name(db),
+208            ),
+209            labels,
+210            vec![],
+211        ));
+212    }
+213
+214    if let Some((id, span)) = first_def {
+215        // `__call__` must be `pub`.
+216        // Return type is checked in `queries::functions::function_signature`.
+217        if !id.is_public(db) {
+218            diagnostics.push(errors::fancy_error(
+219                "`__call__` function is not public",
+220                vec![Label::primary(span, "`__call__` function must be public")],
+221                vec![
+222                    "Hint: Add the `pub` modifier.".to_string(),
+223                    "Example: `pub fn __call__():`".to_string(),
+224                ],
+225            ));
+226        }
+227    }
+228
+229    if let Some((_id, init_span)) = first_def {
+230        for func in all_fns.iter() {
+231            let name = func.name(db);
+232            if func.is_public(db) && name != "__init__" && name != "__call__" {
+233                diagnostics.push(errors::fancy_error(
+234                    "`pub` not allowed if `__call__` is defined",
+235                    vec![
+236                        Label::primary(func.name_span(db), format!("`{name}` can't be public")),
+237                        Label::secondary(init_span, "`__call__` defined here"),
+238                    ],
+239                    vec![
+240                        "The `__call__` function replaces the default function dispatcher, which makes `pub` modifiers obsolete.".to_string(),
+241                        "Hint: Remove the `pub` modifier or `__call__` function.".to_string(),
+242                    ],
+243                ));
+244            }
+245        }
+246    }
+247
+248    Analysis {
+249        value: first_def.map(|(id, _span)| *id),
+250        diagnostics: diagnostics.into(),
+251    }
+252}
+253
+254/// All field ids, including those with duplicate names
+255pub fn contract_all_fields(db: &dyn AnalyzerDb, contract: ContractId) -> Rc<[ContractFieldId]> {
+256    contract
+257        .data(db)
+258        .ast
+259        .kind
+260        .fields
+261        .iter()
+262        .map(|node| {
+263            db.intern_contract_field(Rc::new(items::ContractField {
+264                ast: node.clone(),
+265                parent: contract,
+266            }))
+267        })
+268        .collect()
+269}
+270
+271pub fn contract_field_map(
+272    db: &dyn AnalyzerDb,
+273    contract: ContractId,
+274) -> Analysis<Rc<IndexMap<SmolStr, ContractFieldId>>> {
+275    let scope = ItemScope::new(db, contract.module(db));
+276    let mut map = IndexMap::<SmolStr, ContractFieldId>::new();
+277
+278    let contract_name = contract.name(db);
+279    for field in db.contract_all_fields(contract).iter() {
+280        let node = &field.data(db).ast;
+281
+282        match map.entry(node.name().into()) {
+283            Entry::Occupied(entry) => {
+284                scope.duplicate_name_error(
+285                    &format!("duplicate field names in `contract {contract_name}`",),
+286                    entry.key(),
+287                    entry.get().data(db).ast.span,
+288                    node.span,
+289                );
+290            }
+291            Entry::Vacant(entry) => {
+292                entry.insert(*field);
+293            }
+294        }
+295    }
+296
+297    Analysis {
+298        value: Rc::new(map),
+299        diagnostics: scope.diagnostics.take().into(),
+300    }
+301}
+302
+303pub fn contract_field_type(
+304    db: &dyn AnalyzerDb,
+305    field: ContractFieldId,
+306) -> Analysis<Result<types::TypeId, errors::TypeError>> {
+307    let mut scope = ItemScope::new(db, field.data(db).parent.module(db));
+308    let self_ty = Some(field.data(db).parent.as_type(db).as_trait_or_type());
+309    let typ = type_desc(&mut scope, &field.data(db).ast.kind.typ, self_ty);
+310
+311    let node = &field.data(db).ast;
+312
+313    if node.kind.is_pub {
+314        scope.not_yet_implemented("contract `pub` fields", node.span);
+315    }
+316    if node.kind.is_const {
+317        scope.not_yet_implemented("contract `const` fields", node.span);
+318    }
+319    if let Some(value_node) = &node.kind.value {
+320        scope.not_yet_implemented("contract field initial value assignment", value_node.span);
+321    }
+322
+323    Analysis {
+324        value: typ,
+325        diagnostics: scope.diagnostics.take().into(),
+326    }
+327}
+328
+329pub fn contract_dependency_graph(db: &dyn AnalyzerDb, contract: ContractId) -> DepGraphWrapper {
+330    // A contract depends on the types of its fields, and the things those types
+331    // depend on. Note that this *does not* include the contract's public
+332    // function graph. (See `contract_runtime_dependency_graph` below)
+333
+334    let fields = contract.fields(db);
+335    let field_types = fields
+336        .values()
+337        .filter_map(|field| match field.typ(db).ok()?.typ(db) {
+338            Type::Contract(id) => Some(Item::Type(TypeDef::Contract(id))),
+339            Type::Struct(id) => Some(Item::Type(TypeDef::Struct(id))),
+340            // TODO: when tuples can contain non-primitive items,
+341            // we'll have to depend on tuple element types
+342            _ => None,
+343        })
+344        .collect::<Vec<_>>();
+345
+346    let root = Item::Type(TypeDef::Contract(contract));
+347    let mut graph = DepGraph::from_edges(
+348        field_types
+349            .iter()
+350            .map(|item| (root, *item, DepLocality::Local)),
+351    );
+352
+353    for item in field_types {
+354        if let Some(subgraph) = item.dependency_graph(db) {
+355            graph.extend(subgraph.all_edges())
+356        }
+357    }
+358    DepGraphWrapper(Rc::new(graph))
+359}
+360
+361pub fn contract_dependency_graph_cycle(
+362    _db: &dyn AnalyzerDb,
+363    _cycle: &[String],
+364    _contract: &ContractId,
+365) -> DepGraphWrapper {
+366    DepGraphWrapper(Rc::new(DepGraph::new()))
+367}
+368
+369pub fn contract_runtime_dependency_graph(
+370    db: &dyn AnalyzerDb,
+371    contract: ContractId,
+372) -> DepGraphWrapper {
+373    // This is the dependency graph of the (as yet imaginary) `__call__` function,
+374    // which dispatches to the contract's public functions. This should be used
+375    // when compiling the runtime object for a contract.
+376
+377    let root = Item::Type(TypeDef::Contract(contract));
+378    let root_fns = if let Some(call_id) = contract.call_function(db) {
+379        vec![call_id]
+380    } else {
+381        contract.public_functions(db).values().copied().collect()
+382    }
+383    .into_iter()
+384    .map(|fun| (root, Item::Function(fun), DepLocality::Local))
+385    .collect::<Vec<_>>();
+386
+387    let mut graph = DepGraph::from_edges(root_fns.iter());
+388
+389    for (_, item, _) in root_fns {
+390        if let Some(subgraph) = item.dependency_graph(db) {
+391            graph.extend(subgraph.all_edges())
+392        }
+393    }
+394    DepGraphWrapper(Rc::new(graph))
+395}
+396
+397pub fn contract_runtime_dependency_graph_cycle(
+398    _db: &dyn AnalyzerDb,
+399    _cycle: &[String],
+400    _contract: &ContractId,
+401) -> DepGraphWrapper {
+402    DepGraphWrapper(Rc::new(DepGraph::new()))
+403}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/enums.rs.html b/compiler-docs/src/fe_analyzer/db/queries/enums.rs.html new file mode 100644 index 0000000000..0663a06d24 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/enums.rs.html @@ -0,0 +1,241 @@ +enums.rs - source

fe_analyzer/db/queries/
enums.rs

1use std::{rc::Rc, str::FromStr};
+2
+3use fe_parser::ast;
+4use indexmap::{map::Entry, IndexMap};
+5use smallvec::SmallVec;
+6use smol_str::SmolStr;
+7
+8use crate::{
+9    builtins,
+10    context::{Analysis, AnalyzerContext},
+11    errors::TypeError,
+12    namespace::{
+13        items::{
+14            self, DepGraph, DepGraphWrapper, DepLocality, EnumId, EnumVariant, EnumVariantId,
+15            EnumVariantKind, FunctionId, Item, TypeDef,
+16        },
+17        scopes::ItemScope,
+18        types::Type,
+19    },
+20    traversal::types::type_desc,
+21    AnalyzerDb,
+22};
+23
+24pub fn enum_all_variants(db: &dyn AnalyzerDb, enum_: EnumId) -> Rc<[EnumVariantId]> {
+25    enum_
+26        .data(db)
+27        .ast
+28        .kind
+29        .variants
+30        .iter()
+31        .enumerate()
+32        .map(|(tag, variant)| {
+33            db.intern_enum_variant(Rc::new(EnumVariant {
+34                ast: variant.clone(),
+35                tag,
+36                parent: enum_,
+37            }))
+38        })
+39        .collect()
+40}
+41
+42pub fn enum_variant_map(
+43    db: &dyn AnalyzerDb,
+44    enum_: EnumId,
+45) -> Analysis<Rc<IndexMap<SmolStr, EnumVariantId>>> {
+46    let scope = ItemScope::new(db, enum_.module(db));
+47    let mut variants = IndexMap::<SmolStr, EnumVariantId>::new();
+48
+49    for &variant in db.enum_all_variants(enum_).iter() {
+50        let variant_name = variant.name(db);
+51
+52        match variants.entry(variant_name) {
+53            Entry::Occupied(entry) => {
+54                scope.duplicate_name_error(
+55                    &format!("duplicate variant names in `enum {}`", enum_.name(db)),
+56                    entry.key(),
+57                    entry.get().data(db).ast.span,
+58                    variant.span(db),
+59                );
+60            }
+61
+62            Entry::Vacant(entry) => {
+63                entry.insert(variant);
+64            }
+65        }
+66    }
+67
+68    Analysis::new(Rc::new(variants), scope.diagnostics.take().into())
+69}
+70
+71pub fn enum_variant_kind(
+72    db: &dyn AnalyzerDb,
+73    variant: EnumVariantId,
+74) -> Analysis<Result<EnumVariantKind, TypeError>> {
+75    let variant_data = variant.data(db);
+76    let mut scope = ItemScope::new(db, variant_data.parent.module(db));
+77    let self_ty = Some(variant.parent(db).as_type(db).as_trait_or_type());
+78    let kind = match &variant_data.ast.kind.kind {
+79        ast::VariantKind::Unit => Ok(EnumVariantKind::Unit),
+80        ast::VariantKind::Tuple(tuple) => {
+81            let elem_tys: Result<SmallVec<[_; 4]>, _> = tuple
+82                .iter()
+83                .map(
+84                    |ast_ty| match type_desc(&mut scope, ast_ty, self_ty.clone()) {
+85                        Ok(ty) if ty.has_fixed_size(db) => Ok(ty),
+86                        Ok(_) => Err(TypeError::new(scope.error(
+87                            "enum variant type must have a fixed size",
+88                            variant_data.ast.span,
+89                            "this can't be used as an struct field",
+90                        ))),
+91                        Err(err) => Err(err),
+92                    },
+93                )
+94                .collect();
+95            elem_tys.map(EnumVariantKind::Tuple)
+96        }
+97    };
+98
+99    Analysis::new(kind, scope.diagnostics.take().into())
+100}
+101
+102pub fn enum_all_functions(db: &dyn AnalyzerDb, enum_: EnumId) -> Rc<[FunctionId]> {
+103    let enum_data = enum_.data(db);
+104    enum_data
+105        .ast
+106        .kind
+107        .functions
+108        .iter()
+109        .map(|node| {
+110            db.intern_function(Rc::new(items::Function::new(
+111                db,
+112                node,
+113                Some(Item::Type(TypeDef::Enum(enum_))),
+114                enum_data.module,
+115            )))
+116        })
+117        .collect()
+118}
+119
+120pub fn enum_function_map(
+121    db: &dyn AnalyzerDb,
+122    enum_: EnumId,
+123) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>> {
+124    let scope = ItemScope::new(db, enum_.module(db));
+125    let mut map = IndexMap::<SmolStr, FunctionId>::new();
+126    let variant_map = enum_.variants(db);
+127
+128    for func in db.enum_all_functions(enum_).iter() {
+129        let def = &func.data(db).ast;
+130        let def_name = def.name();
+131
+132        if let Ok(Some(named_item)) = scope.resolve_name(def_name, func.name_span(db)) {
+133            scope.name_conflict_error(
+134                "function",
+135                def_name,
+136                &named_item,
+137                named_item.name_span(db),
+138                func.name_span(db),
+139            );
+140            continue;
+141        }
+142
+143        if builtins::ValueMethod::from_str(def_name).is_ok() {
+144            scope.error(
+145                &format!("function name `{def_name}` conflicts with built-in function"),
+146                func.name_span(db),
+147                &format!("`{def_name}` is a built-in function"),
+148            );
+149            continue;
+150        }
+151
+152        match map.entry(def_name.into()) {
+153            Entry::Occupied(entry) => {
+154                scope.duplicate_name_error(
+155                    &format!("duplicate function names in `struct {}`", enum_.name(db)),
+156                    entry.key(),
+157                    entry.get().data(db).ast.span,
+158                    def.span,
+159                );
+160            }
+161
+162            Entry::Vacant(entry) => {
+163                if let Some(variant) = variant_map.get(def_name) {
+164                    scope.duplicate_name_error(
+165                        &format!("function name `{def_name}` conflicts with enum variant"),
+166                        def_name,
+167                        variant.span(db),
+168                        func.name_span(db),
+169                    );
+170                    continue;
+171                }
+172                entry.insert(*func);
+173            }
+174        }
+175    }
+176    Analysis::new(Rc::new(map), scope.diagnostics.take().into())
+177}
+178
+179pub fn enum_dependency_graph(db: &dyn AnalyzerDb, enum_: EnumId) -> Analysis<DepGraphWrapper> {
+180    let scope = ItemScope::new(db, enum_.module(db));
+181    let root = Item::Type(TypeDef::Enum(enum_));
+182    let mut edges = vec![];
+183
+184    for variant in enum_.variants(db).values() {
+185        match variant.kind(db) {
+186            Ok(EnumVariantKind::Unit) | Err(_) => {}
+187            Ok(EnumVariantKind::Tuple(elts)) => {
+188                for ty in elts {
+189                    let edge = match ty.typ(db) {
+190                        Type::Contract(id) => (
+191                            root,
+192                            Item::Type(TypeDef::Contract(id)),
+193                            DepLocality::External,
+194                        ),
+195
+196                        Type::Struct(id) => {
+197                            (root, Item::Type(TypeDef::Struct(id)), DepLocality::Local)
+198                        }
+199
+200                        Type::Enum(id) => (root, Item::Type(TypeDef::Enum(id)), DepLocality::Local),
+201
+202                        _ => continue,
+203                    };
+204                    edges.push(edge);
+205                }
+206            }
+207        }
+208    }
+209
+210    let mut graph = DepGraph::from_edges(edges.iter());
+211    for (_, item, _) in edges {
+212        if let Some(subgraph) = item.dependency_graph(db) {
+213            graph.extend(subgraph.all_edges())
+214        }
+215    }
+216
+217    Analysis::new(
+218        DepGraphWrapper(Rc::new(graph)),
+219        scope.diagnostics.take().into(),
+220    )
+221}
+222
+223pub fn enum_cycle(
+224    db: &dyn AnalyzerDb,
+225    _cycle: &[String],
+226    enum_: &EnumId,
+227) -> Analysis<DepGraphWrapper> {
+228    let scope = ItemScope::new(db, enum_.module(db));
+229    let enum_name = enum_.name(db);
+230    let enum_span = enum_.span(db);
+231    scope.error(
+232        &format!("recursive enum `{enum_name}`"),
+233        enum_span,
+234        &format!("enum `{enum_name}` has infinite size due to recursive definition",),
+235    );
+236
+237    Analysis::new(
+238        DepGraphWrapper(Rc::new(DepGraph::new())),
+239        scope.diagnostics.take().into(),
+240    )
+241}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/functions.rs.html b/compiler-docs/src/fe_analyzer/db/queries/functions.rs.html new file mode 100644 index 0000000000..9bec67e4fa --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/functions.rs.html @@ -0,0 +1,501 @@ +functions.rs - source

fe_analyzer/db/queries/
functions.rs

1use crate::context::{AnalyzerContext, CallType, FunctionBody};
+2use crate::db::{Analysis, AnalyzerDb};
+3use crate::display::Displayable;
+4use crate::errors::TypeError;
+5use crate::namespace::items::{
+6    DepGraph, DepGraphWrapper, DepLocality, FunctionId, FunctionSigId, Item, TypeDef,
+7};
+8use crate::namespace::scopes::{BlockScope, BlockScopeType, FunctionScope, ItemScope};
+9use crate::namespace::types::{self, CtxDecl, Generic, SelfDecl, Type, TypeId};
+10use crate::traversal::functions::traverse_statements;
+11use crate::traversal::types::{type_desc, type_desc_to_trait};
+12use fe_common::diagnostics::Label;
+13use fe_parser::ast::{self, GenericParameter};
+14use fe_parser::node::Node;
+15use if_chain::if_chain;
+16use smol_str::SmolStr;
+17use std::collections::HashMap;
+18use std::rc::Rc;
+19
+20/// Gather context information for a function definition and check for type
+21/// errors. Does not inspect the function body.
+22pub fn function_signature(
+23    db: &dyn AnalyzerDb,
+24    function: FunctionSigId,
+25) -> Analysis<Rc<types::FunctionSignature>> {
+26    let def = &function.data(db).ast;
+27
+28    let mut scope = ItemScope::new(db, function.module(db));
+29    let fn_parent = function.parent(db);
+30
+31    let mut self_decl = None;
+32    let mut ctx_decl = None;
+33    let mut names = HashMap::new();
+34    let mut labels = HashMap::new();
+35
+36    let sig_ast = &function.data(db).ast.kind;
+37    sig_ast.generic_params.kind.iter().fold(
+38        HashMap::<SmolStr, Node<_>>::new(),
+39        |mut accum, param| {
+40            if let Some(previous) = accum.get(&param.name()) {
+41                scope.duplicate_name_error(
+42                    "duplicate generic parameter",
+43                    &param.name(),
+44                    previous.span,
+45                    param.name_node().span,
+46                );
+47            } else {
+48                accum.insert(param.name(), param.name_node());
+49            };
+50
+51            accum
+52        },
+53    );
+54
+55    if !matches!(fn_parent, Item::Type(TypeDef::Struct(_))) && function.is_generic(db) {
+56        scope.fancy_error(
+57            "generic function parameters aren't yet supported outside of struct functions",
+58            vec![Label::primary(
+59                function.data(db).ast.kind.generic_params.span,
+60                "this cannot appear here",
+61            )],
+62            vec!["Hint: Struct functions can have generic parameters".into()],
+63        );
+64    }
+65
+66    if function.is_generic(db) {
+67        for param in function.data(db).ast.kind.generic_params.kind.iter() {
+68            if let GenericParameter::Unbounded(val) = param {
+69                scope.fancy_error(
+70                    "unbounded generic parameters aren't yet supported",
+71                    vec![Label::primary(
+72                        val.span,
+73                        format!("`{}` needs to be bound by some trait", val.kind),
+74                    )],
+75                    vec![format!(
+76                        "Hint: Change `{}` to `{}: SomeTrait`",
+77                        val.kind, val.kind
+78                    )],
+79                );
+80            }
+81        }
+82    }
+83
+84    let params = def
+85        .kind
+86        .args
+87        .iter()
+88        .enumerate()
+89        .filter_map(|(index, arg)| match &arg.kind {
+90            ast::FunctionArg::Self_ { mut_ }=> {
+91                if matches!(fn_parent, Item::Module(_)) {
+92                    scope.error(
+93                        "`self` can only be used in contract, struct, trait or impl functions",
+94                        arg.span,
+95                        "not allowed in functions defined directly in a module",
+96                    );
+97                } else {
+98                    self_decl = Some(SelfDecl { span: arg.span, mut_: *mut_ });
+99                    if index != 0 {
+100                        scope.error(
+101                            "`self` is not the first parameter",
+102                            arg.span,
+103                            "`self` may only be used as the first parameter",
+104                        );
+105                    }
+106                }
+107                None
+108            }
+109            ast::FunctionArg::Regular { mut_, label, name, typ: typedesc } => {
+110                let typ = resolve_function_param_type(db, function, &mut scope, typedesc).and_then(|typ| match typ {
+111                    typ if typ.has_fixed_size(db) => {
+112                        if let Some(mut_span) = mut_ {
+113                            if typ.is_primitive(db) {
+114                                Err(TypeError::new(scope.error(
+115                                    "primitive type function parameters cannot be `mut`",
+116                                    *mut_span + typedesc.span,
+117                                    &format!("`{}` type can't be used as a `mut` function parameter",
+118                                             typ.display(db)))))
+119                            } else {
+120                                Ok(Type::Mut(typ).id(db))
+121                            }
+122                        } else {
+123                            Ok(typ)
+124                        }
+125                    }
+126                    _ => Err(TypeError::new(scope.error(
+127                        "function parameter types must have fixed size",
+128                        typedesc.span,
+129                        &format!("`{}` type can't be used as a function parameter", typ.display(db)),
+130                    ))),
+131                });
+132
+133                if let Some(context_type) = scope.get_context_type() {
+134                    if arg.name() == "ctx" &&  typ.as_ref().map(|val| val.deref(db)) != Ok(context_type) {
+135                        scope.error(
+136                            "`ctx` is reserved for instances of `Context`",
+137                            arg.span,
+138                            "`ctx` must be an instance of `Context`",
+139                        );
+140                    };
+141
+142                    if typ.as_ref().map(|val| val.deref(db)) == Ok(context_type) {
+143                        if arg.name() != "ctx" {
+144                            scope.error(
+145                                "invalid `Context` instance name",
+146                                arg.span,
+147                                "instances of `Context` must be named `ctx`",
+148                            );
+149                        } else if self_decl.is_some() && index != 1 {
+150                            scope.error(
+151                                "invalid parameter order",
+152                                arg.span,
+153                                "`ctx: Context` must be placed after the `self` parameter",
+154                            );
+155                        } else if self_decl.is_none() && index != 0 {
+156                            scope.error(
+157                                "invalid parameter order",
+158                                arg.span,
+159                                "`ctx: Context` must be the first parameter",
+160                            );
+161                        }
+162                        else {
+163                            ctx_decl = Some(CtxDecl {span: arg.span,  mut_: *mut_})
+164                        }
+165                    }
+166                }
+167
+168                if let Some(label) = &label {
+169                    if_chain! {
+170                        if label.kind != "_";
+171                        if let Some(dup_idx) = labels.get(&label.kind);
+172                        then {
+173                            let dup_arg: &Node<ast::FunctionArg> = &def.kind.args[*dup_idx];
+174                            scope.fancy_error(
+175                                &format!("duplicate parameter labels in function `{}`", def.kind.name.kind),
+176                                vec![
+177                                    Label::primary(dup_arg.span, "the label `{}` was first used here"),
+178                                    Label::primary(label.span, "label `{}` used again here"),
+179                                ], vec![]);
+180                            return None;
+181                        } else {
+182                            labels.insert(&label.kind, index);
+183                        }
+184                    }
+185                }
+186
+187                if let Ok(Some(named_item)) = scope.resolve_name(&name.kind, name.span) {
+188                    scope.name_conflict_error(
+189                        "function parameter",
+190                        &name.kind,
+191                        &named_item,
+192                        named_item.name_span(db),
+193                        name.span,
+194                    );
+195                    None
+196                } else if let Some(dup_idx) = names.get(&name.kind) {
+197                    let dup_arg: &Node<ast::FunctionArg> = &def.kind.args[*dup_idx];
+198                    scope.duplicate_name_error(
+199                        &format!("duplicate parameter names in function `{}`", function.name(db)),
+200                        &name.kind,
+201                        dup_arg.span,
+202                        arg.span,
+203                    );
+204                    None
+205                } else {
+206                    names.insert(&name.kind, index);
+207
+208                    Some(types::FunctionParam::new(
+209                        label.as_ref().map(|s| s.kind.as_str()),
+210                        &name.kind,
+211                        typ,
+212                    ))
+213                }
+214            }
+215        })
+216        .collect();
+217
+218    let return_type = def
+219        .kind
+220        .return_type
+221        .as_ref()
+222        .map(|type_node| {
+223            let fn_name = &function.name(db);
+224            if fn_name == "__init__" || fn_name == "__call__" {
+225                // `__init__` and `__call__` must not return any type other than `()`.
+226                if type_node.kind != ast::TypeDesc::Unit {
+227                    scope.fancy_error(
+228                        &format!("`{fn_name}` function has incorrect return type"),
+229                        vec![Label::primary(type_node.span, "return type should be `()`")],
+230                        vec![
+231                            "Hint: Remove the return type specification.".to_string(),
+232                            format!("Example: `pub fn {fn_name}():`"),
+233                        ],
+234                    );
+235                }
+236                Ok(TypeId::unit(scope.db()))
+237            } else {
+238                let self_ty = match function.parent(db) {
+239                    Item::Trait(id) => Some(id.as_trait_or_type()),
+240                    _ => function.self_type(db).map(|ty| ty.as_trait_or_type()),
+241                };
+242
+243                match type_desc(&mut scope, type_node, self_ty)? {
+244                    typ if typ.has_fixed_size(scope.db()) => Ok(typ),
+245                    _ => Err(TypeError::new(scope.error(
+246                        "function return type must have a fixed size",
+247                        type_node.span,
+248                        "this can't be returned from a function",
+249                    ))),
+250                }
+251            }
+252        })
+253        .unwrap_or_else(|| Ok(TypeId::unit(db)));
+254
+255    Analysis {
+256        value: Rc::new(types::FunctionSignature {
+257            self_decl,
+258            ctx_decl,
+259            params,
+260            return_type,
+261        }),
+262        diagnostics: scope.diagnostics.take().into(),
+263    }
+264}
+265
+266fn resolve_function_param_type(
+267    db: &dyn AnalyzerDb,
+268    function: FunctionSigId,
+269    context: &mut dyn AnalyzerContext,
+270    desc: &Node<ast::TypeDesc>,
+271) -> Result<TypeId, TypeError> {
+272    // First check if the param type is a local generic of the function. This won't
+273    // hold when in the future generics can appear on the contract, struct or
+274    // module level but it could be good enough for now.
+275    if let ast::TypeDesc::Base { base } = &desc.kind {
+276        if let Some(val) = function.generic_param(db, base) {
+277            let bounds = match val {
+278                ast::GenericParameter::Unbounded(_) => vec![].into(),
+279                ast::GenericParameter::Bounded { bound, .. } => {
+280                    vec![type_desc_to_trait(context, &bound)?].into()
+281                }
+282            };
+283
+284            return Ok(db.intern_type(Type::Generic(Generic {
+285                name: base.clone(),
+286                bounds,
+287            })));
+288        }
+289    }
+290
+291    let self_ty = if let Item::Trait(id) = function.parent(db) {
+292        Some(id.as_trait_or_type())
+293    } else {
+294        function.self_type(db).map(|ty| ty.as_trait_or_type())
+295    };
+296
+297    type_desc(context, desc, self_ty)
+298}
+299
+300/// Gather context information for a function body and check for type errors.
+301pub fn function_body(db: &dyn AnalyzerDb, function: FunctionId) -> Analysis<Rc<FunctionBody>> {
+302    let def = &function.data(db).ast.kind;
+303    let scope = FunctionScope::new(db, function);
+304
+305    // If the return type is unit, explicit return or no return (implicit) is valid,
+306    // so no scanning is necessary.
+307    // If the return type is anything else, we need to ensure that all code paths
+308    // return or revert.
+309    if let Ok(return_type) = &function.signature(db).return_type {
+310        if !return_type.typ(db).is_unit() && !all_paths_return_or_revert(&def.body) {
+311            scope.fancy_error(
+312                "function body is missing a return or revert statement",
+313                vec![
+314                    Label::primary(
+315                        function.name_span(db),
+316                        "all paths of this function must `return` or `revert`",
+317                    ),
+318                    Label::secondary(
+319                        def.sig.kind.return_type.as_ref().unwrap().span,
+320                        format!("expected function to return `{}`", return_type.display(db)),
+321                    ),
+322                ],
+323                vec![],
+324            );
+325        }
+326    }
+327
+328    let mut block_scope = BlockScope::new(
+329        &scope,
+330        if function.is_unsafe(db) {
+331            BlockScopeType::Unsafe
+332        } else {
+333            BlockScopeType::Function
+334        },
+335    );
+336
+337    // If `traverse_statements` fails, we can be confident that a diagnostic
+338    // has been emitted, either while analyzing this fn body or while analyzing
+339    // a type or fn used in this fn body, because of the `DiagnosticVoucher`
+340    // system. (See the definition of `FatalError`)
+341    let _ = traverse_statements(&mut block_scope, &def.body);
+342    Analysis {
+343        value: Rc::new(scope.body.into_inner()),
+344        diagnostics: scope.diagnostics.into_inner().into(),
+345    }
+346}
+347
+348fn all_paths_return_or_revert(block: &[Node<ast::FuncStmt>]) -> bool {
+349    for statement in block.iter().rev() {
+350        match &statement.kind {
+351            ast::FuncStmt::Return { .. } | ast::FuncStmt::Revert { .. } => return true,
+352            ast::FuncStmt::If {
+353                test: _,
+354                body,
+355                or_else,
+356            } => {
+357                let body_returns = all_paths_return_or_revert(body);
+358                let or_else_returns = all_paths_return_or_revert(or_else);
+359                if body_returns && or_else_returns {
+360                    return true;
+361                }
+362            }
+363
+364            ast::FuncStmt::Match { arms, .. } => {
+365                return arms
+366                    .iter()
+367                    .all(|arm| all_paths_return_or_revert(&arm.kind.body));
+368            }
+369
+370            ast::FuncStmt::Unsafe(body) => {
+371                if all_paths_return_or_revert(body) {
+372                    return true;
+373                }
+374            }
+375            _ => {}
+376        }
+377    }
+378
+379    false
+380}
+381
+382pub fn function_dependency_graph(db: &dyn AnalyzerDb, function: FunctionId) -> DepGraphWrapper {
+383    let root = Item::Function(function);
+384
+385    // Edges to direct dependencies.
+386    let mut directs = vec![];
+387
+388    let sig = function.signature(db);
+389    directs.extend(
+390        sig.return_type
+391            .clone()
+392            .into_iter()
+393            .chain(sig.params.iter().filter_map(|param| param.typ.clone().ok()))
+394            .filter_map(|id| match id.typ(db) {
+395                Type::Contract(id) => {
+396                    // Contract types that are taken as (non-self) args or returned are "external",
+397                    // meaning that they're addresses of other contracts, so we don't have direct
+398                    // access to their fields, etc.
+399                    Some((
+400                        root,
+401                        Item::Type(TypeDef::Contract(id)),
+402                        DepLocality::External,
+403                    ))
+404                }
+405                Type::Struct(id) => {
+406                    Some((root, Item::Type(TypeDef::Struct(id)), DepLocality::Local))
+407                }
+408                _ => None,
+409            }),
+410    );
+411    // A function that takes `self` depends on the type of `self`, so that any
+412    // relevant struct getters/setters are included when compiling.
+413    if !function.sig(db).is_module_fn(db) {
+414        directs.push((root, function.parent(db), DepLocality::Local));
+415    }
+416
+417    let body = function.body(db);
+418    for calltype in body.calls.values() {
+419        match calltype {
+420            CallType::Pure(function) | CallType::AssociatedFunction { function, .. } => {
+421                directs.push((root, Item::Function(*function), DepLocality::Local));
+422            }
+423            CallType::ValueMethod { method, .. } => {
+424                directs.push((root, Item::Function(*method), DepLocality::Local));
+425            }
+426            CallType::TraitValueMethod { trait_id, .. } => {
+427                directs.push((root, Item::Trait(*trait_id), DepLocality::Local));
+428            }
+429            CallType::External { contract, function } => {
+430                directs.push((root, Item::Function(*function), DepLocality::External));
+431                // Probably redundant:
+432                directs.push((
+433                    root,
+434                    Item::Type(TypeDef::Contract(*contract)),
+435                    DepLocality::External,
+436                ));
+437            }
+438            CallType::TypeConstructor(type_id) => match type_id.typ(db) {
+439                Type::Struct(id) => {
+440                    directs.push((root, Item::Type(TypeDef::Struct(id)), DepLocality::Local))
+441                }
+442                Type::Contract(id) => directs.push((
+443                    root,
+444                    Item::Type(TypeDef::Contract(id)),
+445                    DepLocality::External,
+446                )),
+447                _ => {}
+448            },
+449            CallType::EnumConstructor(variant) => directs.push((
+450                root,
+451                Item::Type(TypeDef::Enum(variant.parent(db))),
+452                DepLocality::Local,
+453            )),
+454            CallType::BuiltinAssociatedFunction { contract, .. } => {
+455                // create/create2 call. The contract type is "external" for dependency graph
+456                // purposes.
+457                directs.push((
+458                    root,
+459                    Item::Type(TypeDef::Contract(*contract)),
+460                    DepLocality::External,
+461                ));
+462            }
+463            // Builtin functions aren't part of the dependency graph yet.
+464            CallType::BuiltinFunction(_)
+465            | CallType::Intrinsic(_)
+466            | CallType::BuiltinValueMethod { .. } => {}
+467        }
+468    }
+469
+470    directs.extend(
+471        body.var_types
+472            .values()
+473            .filter_map(|typid| match typid.typ(db) {
+474                Type::Contract(id) => Some((
+475                    root,
+476                    Item::Type(TypeDef::Contract(id)),
+477                    DepLocality::External,
+478                )),
+479                Type::Struct(id) => {
+480                    Some((root, Item::Type(TypeDef::Struct(id)), DepLocality::Local))
+481                }
+482                _ => None,
+483            }),
+484    );
+485
+486    let mut graph = DepGraph::from_edges(directs.iter());
+487    for (_, item, _) in directs {
+488        if let Some(subgraph) = item.dependency_graph(db) {
+489            graph.extend(subgraph.all_edges())
+490        }
+491    }
+492    DepGraphWrapper(Rc::new(graph))
+493}
+494
+495pub fn function_dependency_graph_cycle(
+496    _db: &dyn AnalyzerDb,
+497    _cycle: &[String],
+498    _function: &FunctionId,
+499) -> DepGraphWrapper {
+500    DepGraphWrapper(Rc::new(DepGraph::new()))
+501}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/impls.rs.html b/compiler-docs/src/fe_analyzer/db/queries/impls.rs.html new file mode 100644 index 0000000000..fc5c410f87 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/impls.rs.html @@ -0,0 +1,54 @@ +impls.rs - source

fe_analyzer/db/queries/
impls.rs

1use indexmap::map::Entry;
+2use indexmap::IndexMap;
+3use smol_str::SmolStr;
+4
+5use crate::context::{Analysis, AnalyzerContext};
+6use crate::namespace::items::{Function, FunctionId, ImplId, Item};
+7use crate::namespace::scopes::ItemScope;
+8use crate::AnalyzerDb;
+9use std::rc::Rc;
+10
+11pub fn impl_all_functions(db: &dyn AnalyzerDb, impl_: ImplId) -> Rc<[FunctionId]> {
+12    let impl_data = impl_.data(db);
+13    impl_data
+14        .ast
+15        .kind
+16        .functions
+17        .iter()
+18        .map(|node| {
+19            db.intern_function(Rc::new(Function::new(
+20                db,
+21                node,
+22                Some(Item::Impl(impl_)),
+23                impl_data.module,
+24            )))
+25        })
+26        .collect()
+27}
+28
+29pub fn impl_function_map(
+30    db: &dyn AnalyzerDb,
+31    impl_: ImplId,
+32) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>> {
+33    let scope = ItemScope::new(db, impl_.module(db));
+34    let mut map = IndexMap::<SmolStr, FunctionId>::new();
+35
+36    for func in db.impl_all_functions(impl_).iter() {
+37        let def_name = func.name(db);
+38
+39        match map.entry(def_name) {
+40            Entry::Occupied(entry) => {
+41                scope.duplicate_name_error(
+42                    "duplicate function names in `impl` block",
+43                    entry.key(),
+44                    entry.get().name_span(db),
+45                    func.name_span(db),
+46                );
+47            }
+48            Entry::Vacant(entry) => {
+49                entry.insert(*func);
+50            }
+51        }
+52    }
+53    Analysis::new(Rc::new(map), scope.diagnostics.take().into())
+54}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/ingots.rs.html b/compiler-docs/src/fe_analyzer/db/queries/ingots.rs.html new file mode 100644 index 0000000000..e5e62e44bd --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/ingots.rs.html @@ -0,0 +1,83 @@ +ingots.rs - source

fe_analyzer/db/queries/
ingots.rs

1use crate::namespace::items::{IngotId, IngotMode, ModuleId, ModuleSource};
+2use crate::AnalyzerDb;
+3use fe_common::files::{SourceFileId, Utf8Path, Utf8PathBuf};
+4use indexmap::IndexSet;
+5use std::rc::Rc;
+6
+7pub fn ingot_modules(db: &dyn AnalyzerDb, ingot: IngotId) -> Rc<[ModuleId]> {
+8    let files: Vec<(SourceFileId, Rc<Utf8PathBuf>)> = db
+9        .ingot_files(ingot)
+10        .iter()
+11        .map(|f| (*f, f.path(db.upcast())))
+12        .collect();
+13
+14    // Create a module for every .fe source file.
+15    let file_mods = files
+16        .iter()
+17        .map(|(file, path)| {
+18            ModuleId::new(
+19                db,
+20                path.file_stem().unwrap(),
+21                ModuleSource::File(*file),
+22                ingot,
+23            )
+24        })
+25        .collect();
+26
+27    // We automatically build a module hierarchy that matches the directory
+28    // structure. We don't (yet?) require a .fe file for each directory like
+29    // rust does. (eg `a/b.fe` alongside `a/b/`), but we do allow it (the
+30    // module's items will be everything inside the .fe file, and the
+31    // submodules inside the dir).
+32    //
+33    // Collect the set of all directories in the file hierarchy
+34    // (after stripping the common prefix from all paths).
+35    // eg given ["src/lib.fe", "src/a/b/x.fe", "src/a/c/d/y.fe"],
+36    // the dir set is {"a", "a/b", "a/c", "a/c/d"}.
+37    let file_path_prefix = &ingot.data(db).src_dir;
+38    let dirs = files
+39        .iter()
+40        .flat_map(|(_file, path)| {
+41            path.strip_prefix(file_path_prefix.as_str())
+42                .unwrap_or(path)
+43                .ancestors()
+44                .skip(1) // first elem of .ancestors() is the path itself
+45        })
+46        .collect::<IndexSet<&Utf8Path>>();
+47
+48    let dir_mods = dirs
+49        // Skip the dirs that have an associated fe file; eg skip "a/b" if "a/b.fe" exists.
+50        .difference(
+51            &files
+52                .iter()
+53                .map(|(_file, path)| {
+54                    path.strip_prefix(file_path_prefix.as_str())
+55                        .unwrap_or(path)
+56                        .as_str()
+57                        .trim_end_matches(".fe")
+58                        .into()
+59                })
+60                .collect::<IndexSet<&Utf8Path>>(),
+61        )
+62        .filter_map(|dir| {
+63            dir.file_name()
+64                .map(|name| ModuleId::new(db, name, ModuleSource::Dir(dir.as_str().into()), ingot))
+65        })
+66        .collect::<Vec<_>>();
+67
+68    [file_mods, dir_mods].concat().into()
+69}
+70
+71pub fn ingot_root_module(db: &dyn AnalyzerDb, ingot: IngotId) -> Option<ModuleId> {
+72    let filename = match ingot.data(db).mode {
+73        IngotMode::Lib => "lib.fe",
+74        IngotMode::Main => "main.fe",
+75        IngotMode::StandaloneModule => return Some(ingot.all_modules(db)[0]),
+76    };
+77
+78    ingot
+79        .all_modules(db)
+80        .iter()
+81        .find(|modid| modid.file_path_relative_to_src_dir(db) == filename)
+82        .copied()
+83}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/module.rs.html b/compiler-docs/src/fe_analyzer/db/queries/module.rs.html new file mode 100644 index 0000000000..526c51505b --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/module.rs.html @@ -0,0 +1,762 @@ +module.rs - source

fe_analyzer/db/queries/
module.rs

1use crate::context::{Analysis, AnalyzerContext, Constant, NamedThing};
+2use crate::display::Displayable;
+3use crate::errors::{self, ConstEvalError, TypeError};
+4use crate::namespace::items::{
+5    Attribute, Contract, ContractId, Enum, Function, FunctionId, Impl, ImplId, Item,
+6    ModuleConstant, ModuleConstantId, ModuleId, ModuleSource, Struct, StructId, Trait, TraitId,
+7    TypeAlias, TypeDef,
+8};
+9use crate::namespace::scopes::ItemScope;
+10use crate::namespace::types::{self, TypeId};
+11use crate::traversal::{const_expr, expressions, types::type_desc};
+12use crate::AnalyzerDb;
+13use fe_common::diagnostics::Label;
+14use fe_common::files::Utf8Path;
+15use fe_common::Span;
+16use fe_parser::{ast, node::Node};
+17use indexmap::indexmap;
+18use indexmap::map::{Entry, IndexMap};
+19use smol_str::SmolStr;
+20use std::rc::Rc;
+21
+22pub fn module_file_path(db: &dyn AnalyzerDb, module: ModuleId) -> SmolStr {
+23    let full_path = match &module.data(db).source {
+24        ModuleSource::File(file) => file.path(db.upcast()).as_str().into(),
+25        ModuleSource::Dir(path) => path.clone(),
+26    };
+27
+28    let src_prefix = &module.ingot(db).data(db).src_dir;
+29
+30    Utf8Path::new(full_path.as_str())
+31        .strip_prefix(src_prefix.as_str())
+32        .map(|path| path.as_str().into())
+33        .unwrap_or(full_path)
+34}
+35
+36pub fn module_parse(db: &dyn AnalyzerDb, module: ModuleId) -> Analysis<Rc<ast::Module>> {
+37    let data = module.data(db);
+38    match data.source {
+39        ModuleSource::File(file) => {
+40            let (ast, diags) = fe_parser::parse_file(file, &file.content(db.upcast()));
+41            Analysis::new(ast.into(), diags.into())
+42        }
+43        ModuleSource::Dir(_) => {
+44            // Directory with no corresponding source file. Return empty ast.
+45            Analysis::new(ast::Module { body: vec![] }.into(), vec![].into())
+46        }
+47    }
+48}
+49
+50pub fn module_is_incomplete(db: &dyn AnalyzerDb, module: ModuleId) -> bool {
+51    if matches!(module.data(db).source, ModuleSource::File(_)) {
+52        let ast = module.ast(db);
+53        ast.body
+54            .last()
+55            .map(|stmt| matches!(stmt, ast::ModuleStmt::ParseError(_)))
+56            .unwrap_or(false)
+57    } else {
+58        false
+59    }
+60}
+61
+62pub fn module_all_items(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<[Item]> {
+63    let body = &module.ast(db).body;
+64    body.iter()
+65        .filter_map(|stmt| match stmt {
+66            ast::ModuleStmt::TypeAlias(node) => Some(Item::Type(TypeDef::Alias(
+67                db.intern_type_alias(Rc::new(TypeAlias {
+68                    ast: node.clone(),
+69                    module,
+70                })),
+71            ))),
+72            ast::ModuleStmt::Contract(node) => Some(Item::Type(TypeDef::Contract(
+73                db.intern_contract(Rc::new(Contract {
+74                    name: node.name().into(),
+75                    ast: node.clone(),
+76                    module,
+77                })),
+78            ))),
+79            ast::ModuleStmt::Struct(node) => Some(Item::Type(TypeDef::Struct(db.intern_struct(
+80                Rc::new(Struct {
+81                    ast: node.clone(),
+82                    module,
+83                }),
+84            )))),
+85            ast::ModuleStmt::Enum(node) => {
+86                Some(Item::Type(TypeDef::Enum(db.intern_enum(Rc::new(Enum {
+87                    ast: node.clone(),
+88                    module,
+89                })))))
+90            }
+91            ast::ModuleStmt::Constant(node) => Some(Item::Constant(db.intern_module_const(
+92                Rc::new(ModuleConstant {
+93                    ast: node.clone(),
+94                    module,
+95                }),
+96            ))),
+97            ast::ModuleStmt::Function(node) => Some(Item::Function(
+98                db.intern_function(Rc::new(Function::new(db, node, None, module))),
+99            )),
+100            ast::ModuleStmt::Trait(node) => Some(Item::Trait(db.intern_trait(Rc::new(Trait {
+101                ast: node.clone(),
+102                module,
+103            })))),
+104            ast::ModuleStmt::Attribute(node) => {
+105                Some(Item::Attribute(db.intern_attribute(Rc::new(Attribute {
+106                    ast: node.clone(),
+107                    module,
+108                }))))
+109            }
+110            ast::ModuleStmt::Pragma(_) | ast::ModuleStmt::Use(_) | ast::ModuleStmt::Impl(_) => None,
+111            ast::ModuleStmt::ParseError(_) => None,
+112        })
+113        .collect()
+114}
+115
+116pub fn module_all_impls(db: &dyn AnalyzerDb, module: ModuleId) -> Analysis<Rc<[ImplId]>> {
+117    let body = &module.ast(db).body;
+118    let mut scope = ItemScope::new(db, module);
+119    let impls = body
+120        .iter()
+121        .filter_map(|stmt| match stmt {
+122            ast::ModuleStmt::Impl(impl_node) => {
+123                let treit = module
+124                    .items(db)
+125                    .get(&impl_node.kind.impl_trait.kind)
+126                    .cloned();
+127
+128                if let Ok(receiver_type) = type_desc(&mut scope, &impl_node.kind.receiver, None) {
+129                    if let Some(Item::Trait(val)) = treit {
+130                        Some(db.intern_impl(Rc::new(Impl {
+131                            trait_id: val,
+132                            receiver: receiver_type,
+133                            ast: impl_node.clone(),
+134                            module,
+135                        })))
+136                    } else {
+137                        None
+138                    }
+139                } else {
+140                    None
+141                }
+142            }
+143            _ => None,
+144        })
+145        .collect();
+146    Analysis {
+147        value: impls,
+148        diagnostics: scope.diagnostics.take().into(),
+149    }
+150}
+151
+152pub fn module_item_map(
+153    db: &dyn AnalyzerDb,
+154    module: ModuleId,
+155) -> Analysis<Rc<IndexMap<SmolStr, Item>>> {
+156    // we must check for conflicts with global item names
+157    let global_items = module.global_items(db);
+158
+159    // sub modules and used items are included in this map
+160    let submodules = module
+161        .submodules(db)
+162        .iter()
+163        .map(|id| (id.name(db), Item::Module(*id)))
+164        .collect::<IndexMap<_, _>>();
+165    let used_items = db.module_used_item_map(module);
+166
+167    let mut diagnostics = used_items.diagnostics.to_vec();
+168    let mut map = IndexMap::<SmolStr, Item>::new();
+169
+170    for item in module.all_items(db).iter() {
+171        if matches!(item, Item::Attribute(_)) {
+172            continue;
+173        }
+174
+175        if let Item::Function(function) = item {
+176            let sig_ast = &function.data(db).ast.kind.sig.kind;
+177            if function.is_test(db) {
+178                if !sig_ast.generic_params.kind.is_empty() {
+179                    diagnostics.push(errors::fancy_error(
+180                        "generic parameters are not supported on test functions",
+181                        vec![Label::primary(
+182                            sig_ast.generic_params.span,
+183                            "invalid generic parameters",
+184                        )],
+185                        vec!["Hint: remove the generic parameters".into()],
+186                    ));
+187                }
+188
+189                if let Some(arg) = sig_ast.args.first() {
+190                    if arg.name() != "ctx" {
+191                        diagnostics.push(errors::fancy_error(
+192                            "function parameters other than `ctx` are not supported on test functions",
+193                            vec![Label::primary(arg.span, "invalid function parameter")],
+194                            vec!["Hint: remove the parameter".into()],
+195                        ));
+196                    }
+197                }
+198
+199                for arg in sig_ast.args.iter().skip(1) {
+200                    if arg.name() != "ctx" {
+201                        diagnostics.push(errors::fancy_error(
+202                            "function parameters other than `ctx` are not supported on test functions",
+203                            vec![Label::primary(arg.span, "invalid function parameter")],
+204                            vec!["Hint: remove the parameter".into()],
+205                        ));
+206                    }
+207                }
+208            }
+209        }
+210
+211        let item_name = item.name(db);
+212        if let Some(global_item) = global_items.get(&item_name) {
+213            let kind = item.item_kind_display_name();
+214            let other_kind = global_item.item_kind_display_name();
+215            diagnostics.push(errors::error(
+216                format!("{kind} name conflicts with the {other_kind} named \"{item_name}\""),
+217                item.name_span(db)
+218                    .expect("user defined item is missing a name span"),
+219                format!("`{item_name}` is already defined"),
+220            ));
+221            continue;
+222        }
+223
+224        if let Some((used_item_name_span, used_item)) = used_items.value.get(&item_name) {
+225            diagnostics.push(errors::duplicate_name_error(
+226                &format!(
+227                    "a {} with the same name has already been imported",
+228                    used_item.item_kind_display_name()
+229                ),
+230                &item.name(db),
+231                *used_item_name_span,
+232                item.name_span(db).expect("missing name span"),
+233            ));
+234            continue;
+235        }
+236
+237        match map.entry(item_name.clone()) {
+238            Entry::Occupied(entry) => {
+239                if let Some(entry_name_span) = entry.get().name_span(db) {
+240                    diagnostics.push(errors::duplicate_name_error(
+241                        &format!(
+242                            "a {} named \"{}\" has already been defined",
+243                            entry.get().item_kind_display_name(),
+244                            item_name
+245                        ),
+246                        &item_name,
+247                        entry_name_span,
+248                        item.name_span(db)
+249                            .expect("used-defined item does not have name span"),
+250                    ));
+251                } else {
+252                    diagnostics.push(errors::fancy_error(
+253                        format!(
+254                            "a {} named \"{}\" has already been defined",
+255                            entry.get().item_kind_display_name(),
+256                            item_name
+257                        ),
+258                        vec![Label::primary(
+259                            item.name_span(db)
+260                                .expect("used-defined item does not have name span"),
+261                            format!("`{}` redefined here", entry.key()),
+262                        )],
+263                        vec![],
+264                    ));
+265                }
+266            }
+267            Entry::Vacant(entry) => {
+268                entry.insert(*item);
+269            }
+270        }
+271    }
+272    Analysis::new(
+273        map.into_iter()
+274            .chain(submodules)
+275            .chain(
+276                used_items
+277                    .value
+278                    .iter()
+279                    .map(|(name, (_, item))| (name.clone(), *item)),
+280            )
+281            .collect::<IndexMap<_, _>>()
+282            .into(),
+283        diagnostics.into(),
+284    )
+285}
+286
+287pub fn module_impl_map(
+288    db: &dyn AnalyzerDb,
+289    module: ModuleId,
+290) -> Analysis<Rc<IndexMap<(TraitId, TypeId), ImplId>>> {
+291    let scope = ItemScope::new(db, module);
+292    let mut map = IndexMap::<(TraitId, TypeId), ImplId>::new();
+293
+294    let module_all_impls = db.module_all_impls(module);
+295    for impl_ in module_all_impls.value.iter() {
+296        let key = &(impl_.trait_id(db), impl_.receiver(db));
+297
+298        match map.entry(*key) {
+299            Entry::Occupied(entry) => {
+300                scope.duplicate_name_error(
+301                    &format!(
+302                        "duplicate `impl` blocks for trait `{}` for type `{}`",
+303                        key.0.name(db),
+304                        key.1.display(db)
+305                    ),
+306                    "",
+307                    entry.get().ast(db).span,
+308                    impl_.ast(db).span,
+309                );
+310            }
+311            Entry::Vacant(entry) => {
+312                entry.insert(*impl_);
+313            }
+314        }
+315    }
+316
+317    Analysis::new(
+318        Rc::new(map),
+319        [
+320            module_all_impls.diagnostics,
+321            scope.diagnostics.take().into(),
+322        ]
+323        .concat()
+324        .into(),
+325    )
+326}
+327
+328pub fn module_contracts(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<[ContractId]> {
+329    module
+330        .all_items(db)
+331        .iter()
+332        .filter_map(|item| match item {
+333            Item::Type(TypeDef::Contract(id)) => Some(*id),
+334            _ => None,
+335        })
+336        .collect()
+337}
+338
+339pub fn module_structs(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<[StructId]> {
+340    module
+341        .all_items(db)
+342        .iter()
+343        .chain(module.used_items(db).values().map(|(_, item)| item))
+344        .filter_map(|item| match item {
+345            Item::Type(TypeDef::Struct(id)) => Some(*id),
+346            _ => None,
+347        })
+348        .collect()
+349}
+350
+351pub fn module_constants(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<Vec<ModuleConstantId>> {
+352    Rc::new(
+353        module
+354            .all_items(db)
+355            .iter()
+356            .filter_map(|item| match item {
+357                Item::Constant(id) => Some(*id),
+358                _ => None,
+359            })
+360            .collect(),
+361    )
+362}
+363
+364pub fn module_constant_type(
+365    db: &dyn AnalyzerDb,
+366    constant: ModuleConstantId,
+367) -> Analysis<Result<types::TypeId, TypeError>> {
+368    let constant_data = constant.data(db);
+369    let mut scope = ItemScope::new(db, constant.data(db).module);
+370    let typ = type_desc(&mut scope, &constant_data.ast.kind.typ, None);
+371
+372    match &typ {
+373        Ok(typ) if !typ.is_primitive(db) => {
+374            scope.error(
+375                "Non-primitive types not yet supported for constants",
+376                constant.data(db).ast.kind.typ.span,
+377                &format!(
+378                    "this has type `{}`; expected a primitive type",
+379                    typ.display(db)
+380                ),
+381            );
+382        }
+383        Ok(typ) => {
+384            if let Ok(expr_attr) =
+385                expressions::expr(&mut scope, &constant_data.ast.kind.value, Some(*typ))
+386            {
+387                if typ != &expr_attr.typ {
+388                    scope.type_error(
+389                        "type mismatch",
+390                        constant_data.ast.kind.value.span,
+391                        *typ,
+392                        expr_attr.typ,
+393                    );
+394                }
+395            }
+396        }
+397        _ => {}
+398    }
+399
+400    Analysis::new(typ, scope.diagnostics.take().into())
+401}
+402
+403pub fn module_constant_type_cycle(
+404    db: &dyn AnalyzerDb,
+405    _cycle: &[String],
+406    constant: &ModuleConstantId,
+407) -> Analysis<Result<TypeId, TypeError>> {
+408    let context = ItemScope::new(db, constant.data(db).module);
+409    let err = Err(TypeError::new(context.error(
+410        "recursive constant value definition",
+411        constant.data(db).ast.span,
+412        "",
+413    )));
+414
+415    Analysis {
+416        value: err,
+417        diagnostics: context.diagnostics.take().into(),
+418    }
+419}
+420
+421pub fn module_constant_value(
+422    db: &dyn AnalyzerDb,
+423    constant: ModuleConstantId,
+424) -> Analysis<Result<Constant, ConstEvalError>> {
+425    let constant_data = constant.data(db);
+426
+427    // Create `ItemScope` to collect expression types for constant evaluation.
+428    // TODO: Consider whether it's better to run semantic analysis twice(first
+429    // analysis is already done in `module_constant_type`) or cache expression
+430    // types in salsa.
+431    let mut scope = ItemScope::new(db, constant.data(db).module);
+432    let typ = match type_desc(&mut scope, &constant_data.ast.kind.typ, None) {
+433        Ok(typ) => typ,
+434        // No need to emit diagnostics, it's already emitted in `module_constant_type`.
+435        Err(err) => {
+436            return Analysis {
+437                value: Err(err.into()),
+438                diagnostics: vec![].into(),
+439            };
+440        }
+441    };
+442
+443    if let Err(err) = expressions::expr(&mut scope, &constant_data.ast.kind.value, Some(typ)) {
+444        // No need to emit diagnostics, it's already emitted in `module_constant_type`.
+445        return Analysis {
+446            value: Err(err.into()),
+447            diagnostics: vec![].into(),
+448        };
+449    }
+450
+451    // Clear diagnostics emitted from `module_constant_type`.
+452    scope.diagnostics.borrow_mut().clear();
+453
+454    // Perform constant evaluation.
+455    let value = const_expr::eval_expr(&mut scope, &constant_data.ast.kind.value);
+456
+457    Analysis {
+458        value,
+459        diagnostics: scope.diagnostics.take().into(),
+460    }
+461}
+462
+463pub fn module_constant_value_cycle(
+464    db: &dyn AnalyzerDb,
+465    _cycle: &[String],
+466    constant: &ModuleConstantId,
+467) -> Analysis<Result<Constant, ConstEvalError>> {
+468    let context = ItemScope::new(db, constant.data(db).module);
+469    let err = Err(ConstEvalError::new(context.error(
+470        "recursive constant value definition",
+471        constant.data(db).ast.span,
+472        "",
+473    )));
+474
+475    Analysis {
+476        value: err,
+477        diagnostics: context.diagnostics.take().into(),
+478    }
+479}
+480
+481pub fn module_used_item_map(
+482    db: &dyn AnalyzerDb,
+483    module: ModuleId,
+484) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>> {
+485    // we must check for conflicts with the global items map
+486    let global_items = module.global_items(db);
+487
+488    let mut diagnostics = vec![];
+489    let body = &module.ast(db).body;
+490
+491    let mut items = body
+492        .iter()
+493        .fold(indexmap! {}, |mut accum, stmt| {
+494            if let ast::ModuleStmt::Use(use_stmt) = stmt {
+495                let items = resolve_use_tree(db, module, &use_stmt.kind.tree, true);
+496                diagnostics.extend(items.diagnostics.iter().cloned());
+497
+498                for (name, (name_span, item)) in items.value.iter() {
+499                    if !item.is_public(db) {
+500                        diagnostics.push(errors::error(
+501                            format!("{} {} is private", item.item_kind_display_name(), name,),
+502                            *name_span,
+503                            name.as_str(),
+504                        ));
+505                    }
+506
+507                    if let Some((other_name_span, other_item)) =
+508                        accum.insert(name.clone(), (*name_span, *item))
+509                    {
+510                        diagnostics.push(errors::duplicate_name_error(
+511                            &format!(
+512                                "a {} with the same name has already been imported",
+513                                other_item.item_kind_display_name()
+514                            ),
+515                            name,
+516                            other_name_span,
+517                            *name_span,
+518                        ));
+519                    }
+520                }
+521            }
+522
+523            accum
+524        })
+525        .into_iter()
+526        .filter_map(|(name, (name_span, item))| {
+527            if let Some(global_item) = global_items.get(&name) {
+528                let other_kind = global_item.item_kind_display_name();
+529
+530                diagnostics.push(errors::error(
+531                    format!("import name conflicts with the {other_kind} named \"{name}\""),
+532                    name_span,
+533                    format!("`{name}` is already defined"),
+534                ));
+535
+536                None
+537            } else {
+538                Some((name, (name_span, item)))
+539            }
+540        })
+541        .collect::<IndexMap<_, _>>();
+542
+543    // Add `use std::prelude::*` to every module not in std
+544    if !module.is_in_std(db) {
+545        let prelude_items = resolve_use_tree(
+546            db,
+547            module,
+548            &Node::new(
+549                ast::UseTree::Glob {
+550                    prefix: ast::Path {
+551                        segments: vec![
+552                            Node::new("std".into(), Span::dummy()),
+553                            Node::new("prelude".into(), Span::dummy()),
+554                        ],
+555                    },
+556                },
+557                Span::dummy(),
+558            ),
+559            true,
+560        )
+561        .value;
+562
+563        items.extend(Rc::try_unwrap(prelude_items).unwrap());
+564    }
+565
+566    Analysis::new(Rc::new(items), diagnostics.into())
+567}
+568
+569pub fn module_parent_module(db: &dyn AnalyzerDb, module: ModuleId) -> Option<ModuleId> {
+570    module
+571        .ingot(db)
+572        .all_modules(db)
+573        .iter()
+574        .find(|&&id| id != module && id.submodules(db).iter().any(|&sub| sub == module))
+575        .copied()
+576}
+577
+578pub fn module_submodules(db: &dyn AnalyzerDb, module: ModuleId) -> Rc<[ModuleId]> {
+579    // The module tree is entirely based on the file hierarchy for now.
+580
+581    let ingot = module.ingot(db);
+582    if Some(module) == ingot.root_module(db) {
+583        ingot
+584            .all_modules(db)
+585            .iter()
+586            .copied()
+587            .filter(|&module_id| {
+588                module_id != module
+589                    && Utf8Path::new(module_id.file_path_relative_to_src_dir(db).as_str())
+590                        .components()
+591                        .take(2)
+592                        .count()
+593                        == 1
+594            })
+595            .collect()
+596    } else {
+597        let dir_path = match &module.data(db).source {
+598            ModuleSource::Dir(path) => path.as_str().into(),
+599            _ => {
+600                let file_path = module.file_path_relative_to_src_dir(db);
+601                let path = Utf8Path::new(file_path.as_str());
+602                path.parent()
+603                    .unwrap_or_else(|| Utf8Path::new(""))
+604                    .join(path.file_stem().expect("source file name with no stem"))
+605            }
+606        };
+607
+608        ingot
+609            .all_modules(db)
+610            .iter()
+611            .copied()
+612            .filter(|&module_id| {
+613                module_id != module
+614                    && Utf8Path::new(module_id.file_path_relative_to_src_dir(db).as_str())
+615                        .parent()
+616                        .unwrap_or_else(|| {
+617                            panic!(
+618                                "module file in ingot does not have parent path: `{}`",
+619                                module_id.file_path_relative_to_src_dir(db)
+620                            )
+621                        })
+622                        == dir_path
+623            })
+624            .collect()
+625    }
+626}
+627
+628/// Resolve a use tree entirely. We set internal to true if the first path item
+629/// is internal.
+630///
+631/// e.g. `foo::bar::{baz::bing}`
+632///       ---        ---
+633///        ^          ^ baz is not internal
+634///        foo is internal
+635fn resolve_use_tree(
+636    db: &dyn AnalyzerDb,
+637    module: ModuleId,
+638    tree: &Node<ast::UseTree>,
+639    internal: bool,
+640) -> Analysis<Rc<IndexMap<SmolStr, (Span, Item)>>> {
+641    let mut diagnostics = vec![];
+642
+643    // Again, the path resolution method we use depends on whether or not the first
+644    // item is internal.
+645    let resolve_path = |module: ModuleId, db: &dyn AnalyzerDb, path: &ast::Path| {
+646        if internal {
+647            module.resolve_path_non_used_internal(db, path)
+648        } else {
+649            module.resolve_path(db, path)
+650        }
+651    };
+652
+653    match &tree.kind {
+654        ast::UseTree::Glob { prefix } => {
+655            let prefix_module = resolve_path(module, db, prefix);
+656            diagnostics.extend(prefix_module.diagnostics.iter().cloned());
+657
+658            let items = match prefix_module.value {
+659                Some(NamedThing::Item(Item::Module(module))) => module
+660                    .items(db)
+661                    .iter()
+662                    .map(|(name, item)| (name.clone(), (tree.span, *item)))
+663                    .collect(),
+664                Some(named_thing) => {
+665                    diagnostics.push(errors::error(
+666                        format!(
+667                            "cannot glob import from {}",
+668                            named_thing.item_kind_display_name()
+669                        ),
+670                        prefix.segments.last().expect("path is empty").span,
+671                        "prefix item must be a module",
+672                    ));
+673                    indexmap! {}
+674                }
+675                None => indexmap! {},
+676            };
+677
+678            Analysis::new(items.into(), diagnostics.into())
+679        }
+680        ast::UseTree::Nested { prefix, children } => {
+681            let prefix_module = resolve_path(module, db, prefix);
+682            diagnostics.extend(prefix_module.diagnostics.iter().cloned());
+683
+684            let items = match prefix_module.value {
+685                Some(NamedThing::Item(Item::Module(module))) => {
+686                    children.iter().fold(indexmap! {}, |mut accum, node| {
+687                        let child_items = resolve_use_tree(db, module, node, false);
+688                        diagnostics.extend(child_items.diagnostics.iter().cloned());
+689
+690                        for (name, (name_span, item)) in child_items.value.iter() {
+691                            if let Some((other_name_span, other_item)) =
+692                                accum.insert(name.clone(), (*name_span, *item))
+693                            {
+694                                diagnostics.push(errors::duplicate_name_error(
+695                                    &format!(
+696                                        "a {} with the same name has already been imported",
+697                                        other_item.item_kind_display_name()
+698                                    ),
+699                                    name,
+700                                    other_name_span,
+701                                    *name_span,
+702                                ));
+703                            }
+704                        }
+705
+706                        accum
+707                    })
+708                }
+709                Some(item) => {
+710                    diagnostics.push(errors::error(
+711                        format!("cannot glob import from {}", item.item_kind_display_name()),
+712                        prefix.segments.last().unwrap().span,
+713                        "prefix item must be a module",
+714                    ));
+715                    indexmap! {}
+716                }
+717                None => indexmap! {},
+718            };
+719
+720            Analysis::new(items.into(), diagnostics.into())
+721        }
+722        ast::UseTree::Simple { path, rename } => {
+723            let item = resolve_path(module, db, path);
+724
+725            let items = match item.value {
+726                Some(NamedThing::Item(item)) => {
+727                    let (item_name, item_name_span) = if let Some(name) = rename {
+728                        (name.kind.clone(), name.span)
+729                    } else {
+730                        let name_segment_node = path.segments.last().expect("path is empty");
+731                        (name_segment_node.kind.clone(), name_segment_node.span)
+732                    };
+733
+734                    indexmap! { item_name => (item_name_span, item) }
+735                }
+736                Some(named_thing) => {
+737                    diagnostics.push(errors::error(
+738                        format!(
+739                            "cannot import non-item {}",
+740                            named_thing.item_kind_display_name(),
+741                        ),
+742                        tree.span,
+743                        format!("{} is not an item", named_thing.item_kind_display_name()),
+744                    ));
+745                    indexmap! {}
+746                }
+747                None => indexmap! {},
+748            };
+749
+750            Analysis::new(items.into(), item.diagnostics)
+751        }
+752    }
+753}
+754
+755pub fn module_tests(db: &dyn AnalyzerDb, ingot: ModuleId) -> Vec<FunctionId> {
+756    ingot
+757        .all_functions(db)
+758        .iter()
+759        .copied()
+760        .filter(|function| function.is_test(db))
+761        .collect()
+762}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/structs.rs.html b/compiler-docs/src/fe_analyzer/db/queries/structs.rs.html new file mode 100644 index 0000000000..b746dd2b3e --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/structs.rs.html @@ -0,0 +1,279 @@ +structs.rs - source

fe_analyzer/db/queries/
structs.rs

1use crate::builtins;
+2use crate::constants::MAX_INDEXED_EVENT_FIELDS;
+3use crate::context::AnalyzerContext;
+4use crate::db::Analysis;
+5use crate::errors::TypeError;
+6use crate::namespace::items::{
+7    self, DepGraph, DepGraphWrapper, DepLocality, FunctionId, Item, StructField, StructFieldId,
+8    StructId, TypeDef,
+9};
+10use crate::namespace::scopes::ItemScope;
+11use crate::namespace::types::{Type, TypeId};
+12use crate::traversal::types::type_desc;
+13use crate::AnalyzerDb;
+14use fe_common::utils::humanize::pluralize_conditionally;
+15use fe_parser::{ast, Label};
+16use indexmap::map::{Entry, IndexMap};
+17use smol_str::SmolStr;
+18use std::rc::Rc;
+19use std::str::FromStr;
+20
+21pub fn struct_all_fields(db: &dyn AnalyzerDb, struct_: StructId) -> Rc<[StructFieldId]> {
+22    struct_
+23        .data(db)
+24        .ast
+25        .kind
+26        .fields
+27        .iter()
+28        .map(|node| {
+29            db.intern_struct_field(Rc::new(StructField {
+30                ast: node.clone(),
+31                parent: struct_,
+32            }))
+33        })
+34        .collect()
+35}
+36
+37pub fn struct_field_map(
+38    db: &dyn AnalyzerDb,
+39    struct_: StructId,
+40) -> Analysis<Rc<IndexMap<SmolStr, StructFieldId>>> {
+41    let scope = ItemScope::new(db, struct_.module(db));
+42    let mut fields = IndexMap::<SmolStr, StructFieldId>::new();
+43
+44    let mut indexed_count = 0;
+45    let struct_name = struct_.name(db);
+46    for field in db.struct_all_fields(struct_).iter() {
+47        let node = &field.data(db).ast;
+48
+49        if field.is_indexed(db) {
+50            indexed_count += 1;
+51        }
+52
+53        // Multiple attributes are currently still rejected by the parser so we only
+54        // need to check the name here
+55        if !field.attributes(db).is_empty() && !field.is_indexed(db) {
+56            let span = field.data(db).ast.kind.attributes.first().unwrap().span;
+57            scope.error(
+58                "Invalid attribute",
+59                span,
+60                "illegal name. Only `indexed` supported.",
+61            );
+62        }
+63
+64        match fields.entry(node.name().into()) {
+65            Entry::Occupied(entry) => {
+66                scope.duplicate_name_error(
+67                    &format!("duplicate field names in `struct {struct_name}`",),
+68                    entry.key(),
+69                    entry.get().data(db).ast.span,
+70                    node.span,
+71                );
+72            }
+73            Entry::Vacant(entry) => {
+74                entry.insert(*field);
+75            }
+76        }
+77    }
+78
+79    if indexed_count > MAX_INDEXED_EVENT_FIELDS {
+80        let excess_count = indexed_count - MAX_INDEXED_EVENT_FIELDS;
+81
+82        let mut labels = fields
+83            .iter()
+84            .filter(|(_, field)| field.is_indexed(db))
+85            .map(|(_, field)| Label::primary(field.span(db), String::new()))
+86            .collect::<Vec<Label>>();
+87        labels.last_mut().unwrap().message = format!("{indexed_count} indexed fields");
+88
+89        scope.fancy_error(
+90            &format!(
+91                "more than three indexed fields in `event {}`",
+92                struct_.name(db)
+93            ),
+94            labels,
+95            vec![format!(
+96                "Note: Remove the `indexed` attribute from at least {} {}.",
+97                excess_count,
+98                pluralize_conditionally("field", excess_count)
+99            )],
+100        );
+101    }
+102
+103    Analysis::new(Rc::new(fields), scope.diagnostics.take().into())
+104}
+105
+106pub fn struct_field_type(
+107    db: &dyn AnalyzerDb,
+108    field: StructFieldId,
+109) -> Analysis<Result<TypeId, TypeError>> {
+110    let field_data = field.data(db);
+111    let mut scope = ItemScope::new(db, field_data.parent.module(db));
+112
+113    let ast::Field {
+114        attributes: _,
+115        is_pub: _,
+116        is_const,
+117        name: _,
+118        typ,
+119        value,
+120    } = &field_data.ast.kind;
+121
+122    if *is_const {
+123        scope.not_yet_implemented("struct `const` fields", field_data.ast.span);
+124    }
+125    if let Some(_node) = value {
+126        scope.not_yet_implemented("struct field initial value assignment", field_data.ast.span);
+127    }
+128    let typ = match type_desc(&mut scope, typ, None) {
+129        Ok(typ) => match typ.typ(db) {
+130            Type::Contract(_) => {
+131                scope.not_yet_implemented(
+132                    "contract types aren't yet supported as struct fields",
+133                    field_data.ast.span,
+134                );
+135                Ok(typ)
+136            }
+137            t if t.has_fixed_size(db) => Ok(typ),
+138            _ => Err(TypeError::new(scope.error(
+139                "struct field type must have a fixed size",
+140                field_data.ast.span,
+141                "this can't be used as an struct field",
+142            ))),
+143        },
+144        Err(err) => Err(err),
+145    };
+146
+147    Analysis::new(typ, scope.diagnostics.take().into())
+148}
+149
+150pub fn struct_all_functions(db: &dyn AnalyzerDb, struct_: StructId) -> Rc<[FunctionId]> {
+151    let struct_data = struct_.data(db);
+152    struct_data
+153        .ast
+154        .kind
+155        .functions
+156        .iter()
+157        .map(|node| {
+158            db.intern_function(Rc::new(items::Function::new(
+159                db,
+160                node,
+161                Some(Item::Type(TypeDef::Struct(struct_))),
+162                struct_data.module,
+163            )))
+164        })
+165        .collect()
+166}
+167
+168pub fn struct_function_map(
+169    db: &dyn AnalyzerDb,
+170    struct_: StructId,
+171) -> Analysis<Rc<IndexMap<SmolStr, FunctionId>>> {
+172    let scope = ItemScope::new(db, struct_.module(db));
+173    let mut map = IndexMap::<SmolStr, FunctionId>::new();
+174
+175    for func in db.struct_all_functions(struct_).iter() {
+176        let def = &func.data(db).ast;
+177        let def_name = def.name();
+178        if def_name == "__init__" {
+179            continue;
+180        }
+181
+182        if let Ok(Some(named_item)) = scope.resolve_name(def_name, func.name_span(db)) {
+183            scope.name_conflict_error(
+184                "function",
+185                def_name,
+186                &named_item,
+187                named_item.name_span(db),
+188                func.name_span(db),
+189            );
+190            continue;
+191        }
+192
+193        if builtins::ValueMethod::from_str(def_name).is_ok() {
+194            scope.error(
+195                &format!("function name `{def_name}` conflicts with built-in function"),
+196                func.name_span(db),
+197                &format!("`{def_name}` is a built-in function"),
+198            );
+199            continue;
+200        }
+201
+202        match map.entry(def_name.into()) {
+203            Entry::Occupied(entry) => {
+204                scope.duplicate_name_error(
+205                    &format!("duplicate function names in `struct {}`", struct_.name(db)),
+206                    entry.key(),
+207                    entry.get().data(db).ast.span,
+208                    def.span,
+209                );
+210            }
+211            Entry::Vacant(entry) => {
+212                entry.insert(*func);
+213            }
+214        }
+215    }
+216    Analysis::new(Rc::new(map), scope.diagnostics.take().into())
+217}
+218
+219pub fn struct_dependency_graph(
+220    db: &dyn AnalyzerDb,
+221    struct_: StructId,
+222) -> Analysis<DepGraphWrapper> {
+223    // A struct depends on the types of its fields and on everything they depend on.
+224    // It *does not* depend on its public functions; those will only be part of
+225    // the broader dependency graph if they're in the call graph of some public
+226    // contract function.
+227
+228    let scope = ItemScope::new(db, struct_.module(db));
+229    let root = Item::Type(TypeDef::Struct(struct_));
+230    let fields = struct_
+231        .fields(db)
+232        .values()
+233        .filter_map(|field| match field.typ(db).ok()?.typ(db) {
+234            Type::Contract(id) => Some((
+235                root,
+236                Item::Type(TypeDef::Contract(id)),
+237                DepLocality::External,
+238            )),
+239            // Not possible yet, but it will be soon
+240            Type::Struct(id) => Some((root, Item::Type(TypeDef::Struct(id)), DepLocality::Local)),
+241            Type::Enum(id) => Some((root, Item::Type(TypeDef::Enum(id)), DepLocality::Local)),
+242            _ => None,
+243        })
+244        .collect::<Vec<_>>();
+245
+246    let mut graph = DepGraph::from_edges(fields.iter());
+247    for (_, item, _) in fields {
+248        if let Some(subgraph) = item.dependency_graph(db) {
+249            graph.extend(subgraph.all_edges())
+250        }
+251    }
+252
+253    Analysis::new(
+254        DepGraphWrapper(Rc::new(graph)),
+255        scope.diagnostics.take().into(),
+256    )
+257}
+258
+259pub fn struct_cycle(
+260    db: &dyn AnalyzerDb,
+261    _cycle: &[String],
+262    struct_: &StructId,
+263) -> Analysis<DepGraphWrapper> {
+264    let scope = ItemScope::new(db, struct_.module(db));
+265    let struct_data = &struct_.data(db).ast;
+266    scope.error(
+267        &format!("recursive struct `{}`", struct_data.name()),
+268        struct_data.kind.name.span,
+269        &format!(
+270            "struct `{}` has infinite size due to recursive definition",
+271            struct_data.name(),
+272        ),
+273    );
+274
+275    Analysis::new(
+276        DepGraphWrapper(Rc::new(DepGraph::new())),
+277        scope.diagnostics.take().into(),
+278    )
+279}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/traits.rs.html b/compiler-docs/src/fe_analyzer/db/queries/traits.rs.html new file mode 100644 index 0000000000..b05f5ba1b2 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/traits.rs.html @@ -0,0 +1,62 @@ +traits.rs - source

fe_analyzer/db/queries/
traits.rs

1use indexmap::map::Entry;
+2use indexmap::IndexMap;
+3use smol_str::SmolStr;
+4
+5use crate::context::{Analysis, AnalyzerContext};
+6use crate::namespace::items::{FunctionSig, FunctionSigId, Item, TraitId};
+7use crate::namespace::scopes::ItemScope;
+8use crate::namespace::types::TypeId;
+9use crate::AnalyzerDb;
+10use std::rc::Rc;
+11
+12pub fn trait_all_functions(db: &dyn AnalyzerDb, trait_: TraitId) -> Rc<[FunctionSigId]> {
+13    let trait_data = trait_.data(db);
+14    trait_data
+15        .ast
+16        .kind
+17        .functions
+18        .iter()
+19        .map(|node| {
+20            db.intern_function_sig(Rc::new(FunctionSig {
+21                ast: node.clone(),
+22                module: trait_.module(db),
+23                parent: Some(Item::Trait(trait_)),
+24            }))
+25        })
+26        .collect()
+27}
+28
+29pub fn trait_function_map(
+30    db: &dyn AnalyzerDb,
+31    trait_: TraitId,
+32) -> Analysis<Rc<IndexMap<SmolStr, FunctionSigId>>> {
+33    let scope = ItemScope::new(db, trait_.module(db));
+34    let mut map = IndexMap::<SmolStr, FunctionSigId>::new();
+35
+36    for func in db.trait_all_functions(trait_).iter() {
+37        let def_name = func.name(db);
+38
+39        match map.entry(def_name) {
+40            Entry::Occupied(entry) => {
+41                scope.duplicate_name_error(
+42                    &format!("duplicate function names in `trait {}`", trait_.name(db)),
+43                    entry.key(),
+44                    entry.get().name_span(db),
+45                    func.name_span(db),
+46                );
+47            }
+48            Entry::Vacant(entry) => {
+49                entry.insert(*func);
+50            }
+51        }
+52    }
+53    Analysis::new(Rc::new(map), scope.diagnostics.take().into())
+54}
+55
+56pub fn trait_is_implemented_for(db: &dyn AnalyzerDb, trait_: TraitId, ty: TypeId) -> bool {
+57    trait_
+58        .module(db)
+59        .all_impls(db)
+60        .iter()
+61        .any(|val| val.trait_id(db) == trait_ && val.receiver(db) == ty)
+62}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/db/queries/types.rs.html b/compiler-docs/src/fe_analyzer/db/queries/types.rs.html new file mode 100644 index 0000000000..3e2ea0de85 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/db/queries/types.rs.html @@ -0,0 +1,73 @@ +types.rs - source

fe_analyzer/db/queries/
types.rs

1use std::rc::Rc;
+2
+3use smol_str::SmolStr;
+4
+5use crate::context::{AnalyzerContext, TempContext};
+6use crate::db::Analysis;
+7use crate::errors::TypeError;
+8use crate::namespace::items::{FunctionSigId, ImplId, TraitId, TypeAliasId};
+9use crate::namespace::scopes::ItemScope;
+10use crate::namespace::types::{self, TypeId};
+11use crate::traversal::types::type_desc;
+12use crate::AnalyzerDb;
+13
+14/// Returns all `impl` for the given type from the current ingot as well as
+15/// dependency ingots
+16pub fn all_impls(db: &dyn AnalyzerDb, ty: TypeId) -> Rc<[ImplId]> {
+17    let ty = ty.deref(db);
+18
+19    let ingot_modules = db
+20        .root_ingot()
+21        .all_modules(db)
+22        .iter()
+23        .flat_map(|module_id| module_id.all_impls(db).to_vec())
+24        .collect::<Vec<_>>();
+25    db.ingot_external_ingots(db.root_ingot())
+26        .values()
+27        .flat_map(|ingot| ingot.all_modules(db).to_vec())
+28        .flat_map(|module_id| module_id.all_impls(db).to_vec())
+29        .chain(ingot_modules)
+30        .filter(|val| val.receiver(db) == ty)
+31        .collect()
+32}
+33
+34pub fn impl_for(db: &dyn AnalyzerDb, ty: TypeId, treit: TraitId) -> Option<ImplId> {
+35    db.all_impls(ty)
+36        .iter()
+37        .find(|impl_| impl_.trait_id(db) == treit)
+38        .cloned()
+39}
+40
+41pub fn function_sigs(db: &dyn AnalyzerDb, ty: TypeId, name: SmolStr) -> Rc<[FunctionSigId]> {
+42    db.all_impls(ty)
+43        .iter()
+44        .filter_map(|impl_| impl_.function(db, &name))
+45        .map(|fun| fun.sig(db))
+46        .chain(ty.function_sig(db, &name).map_or(vec![], |fun| vec![fun]))
+47        .collect()
+48}
+49
+50pub fn type_alias_type(
+51    db: &dyn AnalyzerDb,
+52    alias: TypeAliasId,
+53) -> Analysis<Result<types::TypeId, TypeError>> {
+54    let mut scope = ItemScope::new(db, alias.data(db).module);
+55    let typ = type_desc(&mut scope, &alias.data(db).ast.kind.typ, None);
+56
+57    Analysis::new(typ, scope.diagnostics.take().into())
+58}
+59
+60pub fn type_alias_type_cycle(
+61    db: &dyn AnalyzerDb,
+62    _cycle: &[String],
+63    alias: &TypeAliasId,
+64) -> Analysis<Result<types::TypeId, TypeError>> {
+65    let context = TempContext::default();
+66    let err = Err(TypeError::new(context.error(
+67        "recursive type definition",
+68        alias.data(db).ast.span,
+69        "",
+70    )));
+71
+72    Analysis::new(err, context.diagnostics.take().into())
+73}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/display.rs.html b/compiler-docs/src/fe_analyzer/display.rs.html new file mode 100644 index 0000000000..3bdbed1fde --- /dev/null +++ b/compiler-docs/src/fe_analyzer/display.rs.html @@ -0,0 +1,41 @@ +display.rs - source

fe_analyzer/
display.rs

1use crate::AnalyzerDb;
+2use std::fmt;
+3
+4pub trait Displayable: DisplayWithDb {
+5    fn display<'a, 'b>(&'a self, db: &'b dyn AnalyzerDb) -> DisplayableWrapper<'b, &'a Self> {
+6        DisplayableWrapper::new(db, self)
+7    }
+8}
+9impl<T: DisplayWithDb> Displayable for T {}
+10
+11pub trait DisplayWithDb {
+12    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result;
+13}
+14
+15impl<T: ?Sized> DisplayWithDb for &T
+16where
+17    T: DisplayWithDb,
+18{
+19    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+20        (*self).format(db, f)
+21    }
+22}
+23
+24pub struct DisplayableWrapper<'a, T> {
+25    db: &'a dyn AnalyzerDb,
+26    inner: T,
+27}
+28impl<'a, T> DisplayableWrapper<'a, T> {
+29    pub fn new(db: &'a dyn AnalyzerDb, inner: T) -> Self {
+30        Self { db, inner }
+31    }
+32    pub fn child(&self, inner: T) -> Self {
+33        Self { db: self.db, inner }
+34    }
+35}
+36
+37impl<T: DisplayWithDb> fmt::Display for DisplayableWrapper<'_, T> {
+38    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+39        self.inner.format(self.db, f)
+40    }
+41}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/errors.rs.html b/compiler-docs/src/fe_analyzer/errors.rs.html new file mode 100644 index 0000000000..8f0c52d0e9 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/errors.rs.html @@ -0,0 +1,297 @@ +errors.rs - source

fe_analyzer/
errors.rs

1//! Semantic errors.
+2
+3use crate::context::{DiagnosticVoucher, NamedThing};
+4use fe_common::diagnostics::{Diagnostic, Label, Severity};
+5use fe_common::Span;
+6use std::fmt::Display;
+7
+8/// Error indicating that a type is invalid.
+9///
+10/// Note that the "type" of a thing (eg the type of a `FunctionParam`)
+11/// in [`crate::namespace::types`] is sometimes represented as a
+12/// `Result<Type, TypeError>`.
+13///
+14/// If, for example, a function parameter has an undefined type, we emit a [`Diagnostic`] message,
+15/// give that parameter a "type" of `Err(TypeError)`, and carry on. If/when that parameter is
+16/// used in the function body, we assume that a diagnostic message about the undefined type
+17/// has already been emitted, and halt the analysis of the function body.
+18///
+19/// To ensure that that assumption is sound, a diagnostic *must* be emitted before creating
+20/// a `TypeError`. So that the rust compiler can help us enforce this rule, a `TypeError`
+21/// cannot be constructed without providing a [`DiagnosticVoucher`]. A voucher can be obtained
+22/// by calling an error function on an [`AnalyzerContext`](crate::context::AnalyzerContext).
+23/// Please don't try to work around this restriction.
+24///
+25/// Example: `TypeError::new(context.error("something is wrong", some_span, "this thing"))`
+26#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+27pub struct TypeError(DiagnosticVoucher);
+28impl TypeError {
+29    // `Clone` is required because these are stored in a salsa db.
+30    // Please don't clone these manually.
+31    pub fn new(voucher: DiagnosticVoucher) -> Self {
+32        Self(voucher)
+33    }
+34}
+35
+36impl From<FatalError> for TypeError {
+37    fn from(err: FatalError) -> Self {
+38        Self(err.0)
+39    }
+40}
+41impl From<ConstEvalError> for TypeError {
+42    fn from(err: ConstEvalError) -> Self {
+43        Self(err.0)
+44    }
+45}
+46
+47/// Error to be returned when otherwise no meaningful information can be returned.
+48/// Can't be created unless a diagnostic has been emitted, and thus a [`DiagnosticVoucher`]
+49/// has been obtained. (See comment on [`TypeError`])
+50#[derive(Debug)]
+51pub struct FatalError(DiagnosticVoucher);
+52
+53impl FatalError {
+54    /// Create a `FatalError` instance, given a "voucher"
+55    /// obtained by emitting an error via an [`AnalyzerContext`](crate::context::AnalyzerContext).
+56    pub fn new(voucher: DiagnosticVoucher) -> Self {
+57        Self(voucher)
+58    }
+59}
+60
+61impl From<ConstEvalError> for FatalError {
+62    fn from(err: ConstEvalError) -> Self {
+63        Self(err.0)
+64    }
+65}
+66
+67impl From<AlreadyDefined> for FatalError {
+68    fn from(err: AlreadyDefined) -> Self {
+69        Self(err.0)
+70    }
+71}
+72
+73/// Error indicating constant evaluation failed.
+74///
+75/// This error emitted when
+76/// 1. an expression can't be evaluated in compilation time
+77/// 2. arithmetic overflow occurred during evaluation
+78/// 3. zero division is detected during evaluation
+79///
+80/// Can't be created unless a diagnostic has been emitted, and thus a [`DiagnosticVoucher`]
+81/// has been obtained. (See comment on [`TypeError`])
+82///
+83/// NOTE: `Clone` is required because these are stored in a salsa db.
+84/// Please don't clone these manually.
+85#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+86pub struct ConstEvalError(DiagnosticVoucher);
+87
+88impl ConstEvalError {
+89    pub fn new(voucher: DiagnosticVoucher) -> Self {
+90        Self(voucher)
+91    }
+92}
+93
+94impl From<TypeError> for ConstEvalError {
+95    fn from(err: TypeError) -> Self {
+96        Self(err.0)
+97    }
+98}
+99
+100impl From<FatalError> for ConstEvalError {
+101    fn from(err: FatalError) -> Self {
+102        Self(err.0)
+103    }
+104}
+105
+106impl From<IncompleteItem> for ConstEvalError {
+107    fn from(err: IncompleteItem) -> Self {
+108        Self(err.0)
+109    }
+110}
+111
+112/// Error returned by `ModuleId::resolve_name` if the name is not found, and parsing of the module
+113/// failed. In this case, emitting an error message about failure to resolve the name might be misleading,
+114/// because the file may in fact contain an item with the given name, somewhere after the syntax error that caused
+115/// parsing to fail.
+116#[derive(Debug)]
+117pub struct IncompleteItem(DiagnosticVoucher);
+118impl IncompleteItem {
+119    #[allow(clippy::new_without_default)]
+120    pub fn new() -> Self {
+121        Self(DiagnosticVoucher::assume_the_parser_handled_it())
+122    }
+123}
+124
+125/// Error to be returned from APIs that should reject duplicate definitions
+126#[derive(Debug)]
+127pub struct AlreadyDefined(DiagnosticVoucher);
+128impl AlreadyDefined {
+129    #[allow(clippy::new_without_default)]
+130    pub fn new(voucher: DiagnosticVoucher) -> Self {
+131        Self(voucher)
+132    }
+133}
+134
+135/// Errors that can result from indexing
+136#[derive(Debug, PartialEq, Eq)]
+137pub enum IndexingError {
+138    WrongIndexType,
+139    NotSubscriptable,
+140}
+141
+142/// Errors that can result from a binary operation
+143#[derive(Debug, PartialEq, Eq)]
+144pub enum BinaryOperationError {
+145    TypesNotCompatible,
+146    TypesNotNumeric,
+147    RightTooLarge,
+148    RightIsSigned,
+149    NotEqualAndUnsigned,
+150}
+151
+152/// Errors that can result from an implicit type coercion
+153#[derive(Debug, PartialEq, Eq)]
+154pub enum TypeCoercionError {
+155    /// Value is in storage and must be explicitly moved with .to_mem()
+156    RequiresToMem,
+157    /// Value type cannot be coerced to the expected type
+158    Incompatible,
+159    /// `self` contract used where an external contract value is expected
+160    SelfContractType,
+161}
+162
+163impl From<TypeError> for FatalError {
+164    fn from(err: TypeError) -> Self {
+165        Self::new(err.0)
+166    }
+167}
+168
+169impl From<IncompleteItem> for FatalError {
+170    fn from(err: IncompleteItem) -> Self {
+171        Self::new(err.0)
+172    }
+173}
+174
+175impl From<IncompleteItem> for TypeError {
+176    fn from(err: IncompleteItem) -> Self {
+177        Self::new(err.0)
+178    }
+179}
+180
+181pub fn error(message: impl Into<String>, label_span: Span, label: impl Into<String>) -> Diagnostic {
+182    fancy_error(message, vec![Label::primary(label_span, label)], vec![])
+183}
+184
+185pub fn fancy_error(
+186    message: impl Into<String>,
+187    labels: Vec<Label>,
+188    notes: Vec<String>,
+189) -> Diagnostic {
+190    Diagnostic {
+191        severity: Severity::Error,
+192        message: message.into(),
+193        labels,
+194        notes,
+195    }
+196}
+197
+198pub fn type_error(
+199    message: impl Into<String>,
+200    span: Span,
+201    expected: impl Display,
+202    actual: impl Display,
+203) -> Diagnostic {
+204    error(
+205        message,
+206        span,
+207        format!("this has type `{actual}`; expected type `{expected}`"),
+208    )
+209}
+210
+211pub fn not_yet_implemented(feature: impl Display, span: Span) -> Diagnostic {
+212    error(
+213        format!("feature not yet implemented: {feature}"),
+214        span,
+215        "not yet implemented",
+216    )
+217}
+218
+219pub fn duplicate_name_error(
+220    message: &str,
+221    name: &str,
+222    original: Span,
+223    duplicate: Span,
+224) -> Diagnostic {
+225    fancy_error(
+226        message,
+227        vec![
+228            Label::primary(original, format!("`{name}` first defined here")),
+229            Label::secondary(duplicate, format!("`{name}` redefined here")),
+230        ],
+231        vec![],
+232    )
+233}
+234
+235pub fn name_conflict_error(
+236    name_kind: &str, // Eg "function parameter" or "variable name"
+237    name: &str,
+238    original: &NamedThing,
+239    original_span: Option<Span>,
+240    duplicate_span: Span,
+241) -> Diagnostic {
+242    if let Some(original_span) = original_span {
+243        fancy_error(
+244            format!(
+245                "{} name `{}` conflicts with previously defined {}",
+246                name_kind,
+247                name,
+248                original.item_kind_display_name()
+249            ),
+250            vec![
+251                Label::primary(original_span, format!("`{name}` first defined here")),
+252                Label::secondary(duplicate_span, format!("`{name}` redefined here")),
+253            ],
+254            vec![],
+255        )
+256    } else {
+257        fancy_error(
+258            format!(
+259                "{} name `{}` conflicts with built-in {}",
+260                name_kind,
+261                name,
+262                original.item_kind_display_name()
+263            ),
+264            vec![Label::primary(
+265                duplicate_span,
+266                format!(
+267                    "`{}` is a built-in {}",
+268                    name,
+269                    original.item_kind_display_name()
+270                ),
+271            )],
+272            vec![],
+273        )
+274    }
+275}
+276
+277pub fn to_mem_error(span: Span) -> Diagnostic {
+278    fancy_error(
+279        "value must be copied to memory",
+280        vec![Label::primary(span, "this value is in storage")],
+281        vec![
+282            "Hint: values located in storage can be copied to memory using the `to_mem` function."
+283                .into(),
+284            "Example: `self.my_array.to_mem()`".into(),
+285        ],
+286    )
+287}
+288pub fn self_contract_type_error(span: Span, typ: &dyn Display) -> Diagnostic {
+289    fancy_error(
+290        format!("`self` can't be used where a contract of type `{typ}` is expected",),
+291        vec![Label::primary(span, "cannot use `self` here")],
+292        vec![format!(
+293            "Hint: Values of type `{typ}` represent external contracts.\n\
+294             To treat `self` as an external contract, use `{typ}(ctx.self_address())`."
+295        )],
+296    )
+297}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/lib.rs.html b/compiler-docs/src/fe_analyzer/lib.rs.html new file mode 100644 index 0000000000..0deca23be3 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/lib.rs.html @@ -0,0 +1,42 @@ +lib.rs - source

fe_analyzer/
lib.rs

1//! Fe semantic analysis.
+2//!
+3//! This library is used to analyze the semantics of a given Fe AST. It detects
+4//! any semantic errors within a given AST and produces a `Context` instance
+5//! that can be used to query contextual information attributed to AST nodes.
+6
+7pub mod builtins;
+8pub mod constants;
+9pub mod context;
+10pub mod db;
+11pub mod display;
+12pub mod errors;
+13pub mod namespace;
+14
+15mod operations;
+16mod traversal;
+17
+18pub use db::{AnalyzerDb, TestDb};
+19pub use traversal::pattern_analysis;
+20
+21use fe_common::diagnostics::Diagnostic;
+22use namespace::items::{IngotId, ModuleId};
+23
+24pub fn analyze_ingot(db: &dyn AnalyzerDb, ingot_id: IngotId) -> Result<(), Vec<Diagnostic>> {
+25    let diagnostics = ingot_id.diagnostics(db);
+26
+27    if diagnostics.is_empty() {
+28        Ok(())
+29    } else {
+30        Err(diagnostics)
+31    }
+32}
+33
+34pub fn analyze_module(db: &dyn AnalyzerDb, module_id: ModuleId) -> Result<(), Vec<Diagnostic>> {
+35    let diagnostics = module_id.diagnostics(db);
+36
+37    if diagnostics.is_empty() {
+38        Ok(())
+39    } else {
+40        Err(diagnostics)
+41    }
+42}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/namespace/items.rs.html b/compiler-docs/src/fe_analyzer/namespace/items.rs.html new file mode 100644 index 0000000000..e0c5c78d3f --- /dev/null +++ b/compiler-docs/src/fe_analyzer/namespace/items.rs.html @@ -0,0 +1,2167 @@ +items.rs - source

fe_analyzer/namespace/
items.rs

1use crate::constants::{EMITTABLE_TRAIT_NAME, INDEXED};
+2use crate::context::{self, Analysis, Constant, NamedThing};
+3use crate::display::{DisplayWithDb, Displayable};
+4use crate::errors::{self, IncompleteItem, TypeError};
+5use crate::namespace::types::{self, GenericType, Type, TypeId};
+6use crate::traversal::pragma::check_pragma_version;
+7use crate::AnalyzerDb;
+8use crate::{builtins, errors::ConstEvalError};
+9use fe_common::diagnostics::Diagnostic;
+10use fe_common::diagnostics::Label;
+11use fe_common::files::{common_prefix, Utf8Path};
+12use fe_common::utils::files::{BuildFiles, ProjectMode};
+13use fe_common::{impl_intern_key, FileKind, SourceFileId};
+14use fe_parser::ast::GenericParameter;
+15use fe_parser::node::{Node, Span};
+16use fe_parser::{ast, node::NodeId};
+17use indexmap::{indexmap, IndexMap};
+18use smallvec::SmallVec;
+19use smol_str::SmolStr;
+20use std::rc::Rc;
+21use std::{fmt, ops::Deref};
+22use strum::IntoEnumIterator;
+23
+24use super::types::TraitOrType;
+25
+26/// A named item. This does not include things inside of
+27/// a function body.
+28#[derive(Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Clone, Copy)]
+29pub enum Item {
+30    Ingot(IngotId),
+31    Module(ModuleId),
+32    Type(TypeDef),
+33    // GenericType probably shouldn't be a separate category.
+34    // Any of the items inside TypeDef (struct, alias, etc)
+35    // could be optionally generic.
+36    GenericType(GenericType),
+37    Trait(TraitId),
+38    Impl(ImplId),
+39    Function(FunctionId),
+40    Constant(ModuleConstantId),
+41    // Needed until we can represent keccak256 as a FunctionId.
+42    // We can't represent keccak256's arg type yet.
+43    BuiltinFunction(builtins::GlobalFunction),
+44    Intrinsic(builtins::Intrinsic),
+45    Attribute(AttributeId),
+46}
+47
+48impl Item {
+49    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+50        match self {
+51            Item::Type(id) => id.name(db),
+52            Item::Trait(id) => id.name(db),
+53            Item::Impl(id) => id.name(db),
+54            Item::GenericType(id) => id.name(),
+55            Item::Function(id) => id.name(db),
+56            Item::BuiltinFunction(id) => id.as_ref().into(),
+57            Item::Intrinsic(id) => id.as_ref().into(),
+58            Item::Constant(id) => id.name(db),
+59            Item::Ingot(id) => id.name(db),
+60            Item::Module(id) => id.name(db),
+61            Item::Attribute(id) => id.name(db),
+62        }
+63    }
+64
+65    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+66        match self {
+67            Item::Type(id) => id.name_span(db),
+68            Item::Trait(id) => Some(id.name_span(db)),
+69            Item::GenericType(_) => None,
+70            Item::Function(id) => Some(id.name_span(db)),
+71            Item::Constant(id) => Some(id.name_span(db)),
+72            Item::BuiltinFunction(_)
+73            | Item::Intrinsic(_)
+74            | Item::Ingot(_)
+75            | Item::Module(_)
+76            | Item::Impl(_)
+77            | Item::Attribute(_) => None,
+78        }
+79    }
+80
+81    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+82        match self {
+83            // TODO: Consider whether to allow `pub module`.
+84            Self::Ingot(_)
+85            | Self::Module(_)
+86            | Self::BuiltinFunction(_)
+87            | Self::Intrinsic(_)
+88            | Self::Impl(_)
+89            | Self::GenericType(_) => true,
+90            Self::Attribute(_) => false,
+91            Self::Type(id) => id.is_public(db),
+92            Self::Trait(id) => id.is_public(db),
+93            Self::Function(id) => id.is_public(db),
+94            Self::Constant(id) => id.is_public(db),
+95        }
+96    }
+97
+98    pub fn is_builtin(&self) -> bool {
+99        match self {
+100            Item::Type(TypeDef::Primitive(_))
+101            | Item::GenericType(_)
+102            | Item::BuiltinFunction(_)
+103            | Item::Intrinsic(_) => true,
+104            Item::Type(_)
+105            | Item::Trait(_)
+106            | Item::Impl(_)
+107            | Item::Function(_)
+108            | Item::Constant(_)
+109            | Item::Ingot(_)
+110            | Item::Attribute(_)
+111            | Item::Module(_) => false,
+112        }
+113    }
+114
+115    pub fn is_struct(&self, val: &StructId) -> bool {
+116        matches!(self, Item::Type(TypeDef::Struct(current)) if current == val)
+117    }
+118
+119    pub fn is_contract(&self) -> bool {
+120        matches!(self, Item::Type(TypeDef::Contract(_)))
+121    }
+122
+123    pub fn item_kind_display_name(&self) -> &'static str {
+124        match self {
+125            Item::Type(TypeDef::Struct(_)) => "struct",
+126            Item::Type(_) | Item::GenericType(_) => "type",
+127            Item::Trait(_) => "trait",
+128            Item::Impl(_) => "impl",
+129            Item::Function(_) | Item::BuiltinFunction(_) => "function",
+130            Item::Intrinsic(_) => "intrinsic function",
+131            Item::Constant(_) => "constant",
+132            Item::Ingot(_) => "ingot",
+133            Item::Module(_) => "module",
+134            Item::Attribute(_) => "attribute",
+135        }
+136    }
+137
+138    pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+139        match self {
+140            Item::Ingot(ingot) => ingot.items(db),
+141            Item::Module(module) => module.items(db),
+142            Item::Type(val) => val.items(db),
+143            Item::GenericType(_)
+144            | Item::Trait(_)
+145            | Item::Impl(_)
+146            | Item::Function(_)
+147            | Item::Constant(_)
+148            | Item::BuiltinFunction(_)
+149            | Item::Attribute(_)
+150            | Item::Intrinsic(_) => Rc::new(indexmap! {}),
+151        }
+152    }
+153
+154    pub fn parent(&self, db: &dyn AnalyzerDb) -> Option<Item> {
+155        match self {
+156            Item::Type(id) => id.parent(db),
+157            Item::Trait(id) => Some(id.parent(db)),
+158            Item::Impl(id) => Some(id.parent(db)),
+159            Item::GenericType(_) => None,
+160            Item::Function(id) => Some(id.parent(db)),
+161            Item::Constant(id) => Some(id.parent(db)),
+162            Item::Module(id) => Some(id.parent(db)),
+163            Item::Attribute(id) => Some(id.parent(db)),
+164            Item::BuiltinFunction(_) | Item::Intrinsic(_) | Item::Ingot(_) => None,
+165        }
+166    }
+167
+168    pub fn module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId> {
+169        if let Self::Module(id) = self {
+170            return Some(*id);
+171        }
+172
+173        let mut cur_item = *self;
+174        while let Some(item) = cur_item.parent(db) {
+175            if let Self::Module(id) = item {
+176                return Some(id);
+177            }
+178            cur_item = item;
+179        }
+180
+181        None
+182    }
+183
+184    pub fn path(&self, db: &dyn AnalyzerDb) -> Rc<[SmolStr]> {
+185        // The path is used to generate a yul identifier,
+186        // eg `foo::Bar::new` becomes `$$foo$Bar$new`.
+187        // Right now, the ingot name is the os path, so it could
+188        // be "my project/src".
+189        // For now, we'll just leave the ingot out of the path,
+190        // because we can only compile a single ingot anyway.
+191        match self.parent(db) {
+192            Some(Item::Ingot(_)) | None => [self.name(db)][..].into(),
+193            Some(parent) => {
+194                let mut path = parent.path(db).to_vec();
+195                path.push(self.name(db));
+196                path.into()
+197            }
+198        }
+199    }
+200
+201    pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Option<Rc<DepGraph>> {
+202        match self {
+203            Item::Type(TypeDef::Contract(id)) => Some(id.dependency_graph(db)),
+204            Item::Type(TypeDef::Struct(id)) => Some(id.dependency_graph(db)),
+205            Item::Type(TypeDef::Enum(id)) => Some(id.dependency_graph(db)),
+206            Item::Function(id) => Some(id.dependency_graph(db)),
+207            _ => None,
+208        }
+209    }
+210
+211    pub fn resolve_path_segments(
+212        &self,
+213        db: &dyn AnalyzerDb,
+214        segments: &[Node<SmolStr>],
+215    ) -> Analysis<Option<NamedThing>> {
+216        let mut curr_item = NamedThing::Item(*self);
+217
+218        for node in segments {
+219            curr_item = match curr_item.resolve_path_segment(db, &node.kind) {
+220                Some(item) => item,
+221                None => {
+222                    return Analysis {
+223                        value: None,
+224                        diagnostics: Rc::new([errors::error(
+225                            "unresolved path item",
+226                            node.span,
+227                            "not found",
+228                        )]),
+229                    };
+230                }
+231            }
+232        }
+233
+234        Analysis {
+235            value: Some(curr_item),
+236            diagnostics: Rc::new([]),
+237        }
+238    }
+239
+240    pub fn function_sig(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId> {
+241        match self {
+242            Item::Type(TypeDef::Contract(id)) => id.function(db, name).map(|fun| fun.sig(db)),
+243            Item::Type(TypeDef::Struct(id)) => id.function(db, name).map(|fun| fun.sig(db)),
+244            Item::Impl(id) => id.function(db, name).map(|fun| fun.sig(db)),
+245            Item::Trait(id) => id.function(db, name),
+246            _ => None,
+247        }
+248    }
+249
+250    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+251        match self {
+252            Item::Type(id) => id.sink_diagnostics(db, sink),
+253            Item::Trait(id) => id.sink_diagnostics(db, sink),
+254            Item::Impl(id) => id.sink_diagnostics(db, sink),
+255            Item::Function(id) => id.sink_diagnostics(db, sink),
+256            Item::GenericType(_)
+257            | Item::BuiltinFunction(_)
+258            | Item::Intrinsic(_)
+259            | Item::Attribute(_) => {}
+260            Item::Constant(id) => id.sink_diagnostics(db, sink),
+261            Item::Ingot(id) => id.sink_diagnostics(db, sink),
+262            Item::Module(id) => id.sink_diagnostics(db, sink),
+263        }
+264    }
+265
+266    pub fn attributes(&self, db: &dyn AnalyzerDb) -> Vec<AttributeId> {
+267        if let Some(Item::Module(module)) = self.parent(db) {
+268            let mut attributes = vec![];
+269            for item in module.all_items(db).iter() {
+270                if let Item::Attribute(attribute) = item {
+271                    attributes.push(*attribute);
+272                } else if item == self {
+273                    return attributes;
+274                } else {
+275                    attributes = vec![];
+276                }
+277            }
+278        }
+279
+280        vec![]
+281    }
+282}
+283
+284pub fn builtin_items() -> IndexMap<SmolStr, Item> {
+285    let mut items = indexmap! {
+286        SmolStr::new("bool") => Item::Type(TypeDef::Primitive(types::Base::Bool)),
+287        SmolStr::new("address") => Item::Type(TypeDef::Primitive(types::Base::Address)),
+288    };
+289    items.extend(types::Integer::iter().map(|typ| {
+290        (
+291            typ.as_ref().into(),
+292            Item::Type(TypeDef::Primitive(types::Base::Numeric(typ))),
+293        )
+294    }));
+295    items.extend(types::GenericType::iter().map(|typ| (typ.name(), Item::GenericType(typ))));
+296    items.extend(
+297        builtins::GlobalFunction::iter()
+298            .map(|fun| (fun.as_ref().into(), Item::BuiltinFunction(fun))),
+299    );
+300    items
+301        .extend(builtins::Intrinsic::iter().map(|fun| (fun.as_ref().into(), Item::Intrinsic(fun))));
+302    items
+303}
+304
+305#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
+306pub enum IngotMode {
+307    /// The target of compilation. Expected to have a main.fe file.
+308    Main,
+309    /// A library; expected to have a lib.fe file.
+310    Lib,
+311    /// A fake ingot, created to hold a single module with any filename.
+312    StandaloneModule,
+313}
+314
+315/// An `Ingot` is composed of a tree of `Module`s (set via
+316/// [`AnalyzerDb::set_ingot_module_tree`]), and doesn't have direct knowledge of
+317/// files.
+318#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+319pub struct Ingot {
+320    pub name: SmolStr,
+321    // pub version: SmolStr,
+322    pub mode: IngotMode,
+323    pub src_dir: SmolStr,
+324}
+325
+326#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+327pub struct IngotId(pub(crate) u32);
+328impl_intern_key!(IngotId);
+329impl IngotId {
+330    pub fn std_lib(db: &mut dyn AnalyzerDb) -> Self {
+331        let ingot = IngotId::from_files(
+332            db,
+333            "std",
+334            IngotMode::Lib,
+335            FileKind::Std,
+336            &fe_library::std_src_files(),
+337        );
+338        db.set_ingot_external_ingots(ingot, Rc::new(indexmap! {}));
+339        ingot
+340    }
+341
+342    pub fn from_build_files(db: &mut dyn AnalyzerDb, build_files: &BuildFiles) -> Self {
+343        let ingots: IndexMap<_, _> = build_files
+344            .project_files
+345            .iter()
+346            .map(|(project_path, project_files)| {
+347                let mode = match project_files.mode {
+348                    ProjectMode::Main => IngotMode::Main,
+349                    ProjectMode::Lib => IngotMode::Lib,
+350                };
+351                (
+352                    project_path,
+353                    IngotId::from_files(
+354                        db,
+355                        &project_files.name,
+356                        mode,
+357                        FileKind::Local,
+358                        &project_files.src,
+359                    ),
+360                )
+361            })
+362            .collect();
+363
+364        for (project_path, project_files) in &build_files.project_files {
+365            let mut deps = indexmap! {
+366                "std".into() => IngotId::std_lib(db)
+367            };
+368
+369            for dependency in &project_files.dependencies {
+370                deps.insert(
+371                    dependency.name.clone(),
+372                    ingots[&dependency.canonicalized_path],
+373                );
+374            }
+375
+376            db.set_ingot_external_ingots(ingots[&project_path], Rc::new(deps));
+377        }
+378
+379        let root_ingot = ingots[&build_files.root_project_path];
+380        db.set_root_ingot(root_ingot);
+381        root_ingot
+382    }
+383
+384    pub fn from_files(
+385        db: &mut dyn AnalyzerDb,
+386        name: &str,
+387        mode: IngotMode,
+388        file_kind: FileKind,
+389        files: &[(impl AsRef<str>, impl AsRef<str>)],
+390    ) -> Self {
+391        // The common prefix of all file paths will be stored as the ingot
+392        // src dir path, and all module file paths will be considered to be
+393        // relative to this prefix.
+394        let file_path_prefix = if files.len() == 1 {
+395            // If there's only one source file, the "common prefix" is everything
+396            // before the file name.
+397            Utf8Path::new(files[0].0.as_ref())
+398                .parent()
+399                .unwrap_or_else(|| "".into())
+400                .to_path_buf()
+401        } else {
+402            files
+403                .iter()
+404                .map(|(path, _)| Utf8Path::new(path).to_path_buf())
+405                .reduce(|pref, path| common_prefix(&pref, &path))
+406                .expect("`IngotId::from_files`: empty file list")
+407        };
+408
+409        let ingot = db.intern_ingot(Rc::new(Ingot {
+410            name: name.into(),
+411            mode,
+412            src_dir: file_path_prefix.as_str().into(),
+413        }));
+414
+415        // Intern the source files
+416        let file_ids = files
+417            .iter()
+418            .map(|(path, content)| {
+419                SourceFileId::new(
+420                    db.upcast_mut(),
+421                    file_kind,
+422                    path.as_ref(),
+423                    content.as_ref().into(),
+424                )
+425            })
+426            .collect();
+427
+428        db.set_ingot_files(ingot, file_ids);
+429        ingot
+430    }
+431
+432    pub fn external_ingots(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, IngotId>> {
+433        db.ingot_external_ingots(*self)
+434    }
+435
+436    pub fn all_modules(&self, db: &dyn AnalyzerDb) -> Rc<[ModuleId]> {
+437        db.ingot_modules(*self)
+438    }
+439
+440    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Ingot> {
+441        db.lookup_intern_ingot(*self)
+442    }
+443
+444    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+445        self.data(db).name.clone()
+446    }
+447
+448    /// Returns the `main.fe`, or `lib.fe` module, depending on the ingot "mode"
+449    /// (IngotMode).
+450    pub fn root_module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId> {
+451        db.ingot_root_module(*self)
+452    }
+453
+454    pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+455        self.root_module(db).expect("missing root module").items(db)
+456    }
+457
+458    pub fn diagnostics(&self, db: &dyn AnalyzerDb) -> Vec<Diagnostic> {
+459        let mut diagnostics = vec![];
+460        self.sink_diagnostics(db, &mut diagnostics);
+461        diagnostics
+462    }
+463
+464    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+465        if self.root_module(db).is_none() {
+466            let file_name = match self.data(db).mode {
+467                IngotMode::Lib => "lib",
+468                IngotMode::Main => "main",
+469                IngotMode::StandaloneModule => unreachable!(), // always has a root module
+470            };
+471            sink.push(&Diagnostic::error(format!(
+472                "The ingot named \"{}\" is missing a `{}` module. \
+473                 \nPlease add a `src/{}.fe` file to the base directory.",
+474                self.name(db),
+475                file_name,
+476                file_name,
+477            )));
+478        }
+479        for module in self.all_modules(db).iter() {
+480            module.sink_diagnostics(db, sink)
+481        }
+482    }
+483
+484    pub fn sink_external_ingot_diagnostics(
+485        &self,
+486        db: &dyn AnalyzerDb,
+487        sink: &mut impl DiagnosticSink,
+488    ) {
+489        for ingot in self.external_ingots(db).values() {
+490            ingot.sink_diagnostics(db, sink)
+491        }
+492    }
+493}
+494
+495#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+496pub enum ModuleSource {
+497    File(SourceFileId),
+498    /// For directory modules without a corresponding source file
+499    /// (which will soon not be allowed, and this variant can go away).
+500    Dir(SmolStr),
+501}
+502
+503#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+504pub struct Module {
+505    pub name: SmolStr,
+506    pub ingot: IngotId,
+507    pub source: ModuleSource,
+508}
+509
+510/// Id of a [`Module`], which corresponds to a single Fe source file.
+511#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+512pub struct ModuleId(pub(crate) u32);
+513impl_intern_key!(ModuleId);
+514impl ModuleId {
+515    pub fn new_standalone(db: &mut dyn AnalyzerDb, path: &str, content: &str) -> Self {
+516        let std = IngotId::std_lib(db);
+517        let ingot = IngotId::from_files(
+518            db,
+519            "",
+520            IngotMode::StandaloneModule,
+521            FileKind::Local,
+522            &[(path, content)],
+523        );
+524
+525        let deps = indexmap! { "std".into() => std };
+526        db.set_ingot_external_ingots(ingot, Rc::new(deps));
+527        db.set_root_ingot(ingot);
+528
+529        ingot
+530            .root_module(db)
+531            .expect("ModuleId::new_standalone ingot has no root module")
+532    }
+533
+534    pub fn new(db: &dyn AnalyzerDb, name: &str, source: ModuleSource, ingot: IngotId) -> Self {
+535        db.intern_module(
+536            Module {
+537                name: name.into(),
+538                ingot,
+539                source,
+540            }
+541            .into(),
+542        )
+543    }
+544
+545    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Module> {
+546        db.lookup_intern_module(*self)
+547    }
+548
+549    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+550        self.data(db).name.clone()
+551    }
+552
+553    pub fn file_path_relative_to_src_dir(&self, db: &dyn AnalyzerDb) -> SmolStr {
+554        db.module_file_path(*self)
+555    }
+556
+557    pub fn ast(&self, db: &dyn AnalyzerDb) -> Rc<ast::Module> {
+558        db.module_parse(*self).value
+559    }
+560
+561    pub fn ingot(&self, db: &dyn AnalyzerDb) -> IngotId {
+562        self.data(db).ingot
+563    }
+564
+565    pub fn is_incomplete(&self, db: &dyn AnalyzerDb) -> bool {
+566        db.module_is_incomplete(*self)
+567    }
+568
+569    pub fn is_in_std(&self, db: &dyn AnalyzerDb) -> bool {
+570        self.ingot(db).name(db) == "std"
+571    }
+572
+573    /// Includes duplicate names
+574    pub fn all_items(&self, db: &dyn AnalyzerDb) -> Rc<[Item]> {
+575        db.module_all_items(*self)
+576    }
+577
+578    /// Includes duplicate names
+579    pub fn all_impls(&self, db: &dyn AnalyzerDb) -> Rc<[ImplId]> {
+580        db.module_all_impls(*self).value
+581    }
+582
+583    pub fn impls(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<(TraitId, TypeId), ImplId>> {
+584        db.module_impl_map(*self).value
+585    }
+586
+587    /// Returns a map of the named items in the module
+588    pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+589        db.module_item_map(*self).value
+590    }
+591
+592    /// Returns a `name -> (name_span, external_item)` map for all `use`
+593    /// statements in a module.
+594    pub fn used_items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, (Span, Item)>> {
+595        db.module_used_item_map(*self).value
+596    }
+597
+598    pub fn tests(&self, db: &dyn AnalyzerDb) -> Vec<FunctionId> {
+599        db.module_tests(*self)
+600    }
+601
+602    /// Returns `true` if the `item` is in scope of the module.
+603    pub fn is_in_scope(&self, db: &dyn AnalyzerDb, item: Item) -> bool {
+604        if let Some(val) = item.module(db) {
+605            if val == *self {
+606                return true;
+607            }
+608        }
+609
+610        if let Some((_, val)) = self.used_items(db).get(&item.name(db)) {
+611            if *val == item {
+612                return true;
+613            }
+614        }
+615        false
+616    }
+617
+618    /// Returns all of the internal items, except for `use`d items. This is used
+619    /// when resolving `use` statements, as it does not create a query
+620    /// cycle.
+621    pub fn non_used_internal_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item> {
+622        let global_items = self.global_items(db);
+623
+624        self.submodules(db)
+625            .iter()
+626            .map(|module| (module.name(db), Item::Module(*module)))
+627            .chain(global_items)
+628            .collect()
+629    }
+630
+631    /// Returns all of the internal items. Internal items refers to the set of
+632    /// items visible when inside of a module.
+633    pub fn internal_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item> {
+634        let global_items = self.global_items(db);
+635        let defined_items = self.items(db);
+636        self.submodules(db)
+637            .iter()
+638            .map(|module| (module.name(db), Item::Module(*module)))
+639            .chain(global_items)
+640            .chain(defined_items.deref().clone())
+641            .collect()
+642    }
+643
+644    /// Resolve a path that starts with an item defined in the module.
+645    pub fn resolve_path(
+646        &self,
+647        db: &dyn AnalyzerDb,
+648        path: &ast::Path,
+649    ) -> Analysis<Option<NamedThing>> {
+650        Item::Module(*self).resolve_path_segments(db, &path.segments)
+651    }
+652
+653    /// Resolve a path that starts with an internal item. We omit used items to
+654    /// avoid a query cycle.
+655    pub fn resolve_path_non_used_internal(
+656        &self,
+657        db: &dyn AnalyzerDb,
+658        path: &ast::Path,
+659    ) -> Analysis<Option<NamedThing>> {
+660        let segments = &path.segments;
+661        let first_segment = &segments[0];
+662
+663        if let Some(curr_item) = self.non_used_internal_items(db).get(&first_segment.kind) {
+664            curr_item.resolve_path_segments(db, &segments[1..])
+665        } else {
+666            Analysis {
+667                value: None,
+668                diagnostics: Rc::new([errors::error(
+669                    "unresolved path item",
+670                    first_segment.span,
+671                    "not found",
+672                )]),
+673            }
+674        }
+675    }
+676
+677    /// Resolve a path that starts with an internal item.
+678    pub fn resolve_path_internal(
+679        &self,
+680        db: &dyn AnalyzerDb,
+681        path: &ast::Path,
+682    ) -> Analysis<Option<NamedThing>> {
+683        let segments = &path.segments;
+684        let first_segment = &segments[0];
+685
+686        if let Some(curr_item) = self.internal_items(db).get(&first_segment.kind) {
+687            curr_item.resolve_path_segments(db, &segments[1..])
+688        } else {
+689            Analysis {
+690                value: None,
+691                diagnostics: Rc::new([errors::error(
+692                    "unresolved path item",
+693                    first_segment.span,
+694                    "not found",
+695                )]),
+696            }
+697        }
+698    }
+699
+700    /// Returns `Err(IncompleteItem)` if the name could not be resolved, and the
+701    /// module was not completely parsed (due to a syntax error).
+702    pub fn resolve_name(
+703        &self,
+704        db: &dyn AnalyzerDb,
+705        name: &str,
+706    ) -> Result<Option<NamedThing>, IncompleteItem> {
+707        if let Some(thing) = self.internal_items(db).get(name) {
+708            Ok(Some(NamedThing::Item(*thing)))
+709        } else if self.is_incomplete(db) {
+710            Err(IncompleteItem::new())
+711        } else {
+712            Ok(None)
+713        }
+714    }
+715
+716    pub fn resolve_constant(
+717        &self,
+718        db: &dyn AnalyzerDb,
+719        name: &str,
+720    ) -> Result<Option<ModuleConstantId>, IncompleteItem> {
+721        if let Some(constant) = self
+722            .all_constants(db)
+723            .iter()
+724            .find(|id| id.name(db) == name)
+725            .copied()
+726        {
+727            Ok(Some(constant))
+728        } else if self.is_incomplete(db) {
+729            Err(IncompleteItem::new())
+730        } else {
+731            Ok(None)
+732        }
+733    }
+734    pub fn submodules(&self, db: &dyn AnalyzerDb) -> Rc<[ModuleId]> {
+735        db.module_submodules(*self)
+736    }
+737
+738    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+739        self.parent_module(db)
+740            .map(Item::Module)
+741            .unwrap_or_else(|| Item::Ingot(self.ingot(db)))
+742    }
+743
+744    pub fn parent_module(&self, db: &dyn AnalyzerDb) -> Option<ModuleId> {
+745        db.module_parent_module(*self)
+746    }
+747
+748    /// All contracts, including from submodules and including duplicates
+749    pub fn all_contracts(&self, db: &dyn AnalyzerDb) -> Vec<ContractId> {
+750        self.submodules(db)
+751            .iter()
+752            .flat_map(|module| module.all_contracts(db))
+753            .chain((*db.module_contracts(*self)).to_vec())
+754            .collect::<Vec<_>>()
+755    }
+756
+757    /// All functions, including from submodules and including duplicates
+758    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Vec<FunctionId> {
+759        self.items(db)
+760            .iter()
+761            .filter_map(|(_, item)| {
+762                if let Item::Function(function) = item {
+763                    Some(*function)
+764                } else {
+765                    None
+766                }
+767            })
+768            .collect()
+769    }
+770
+771    /// Returns the map of ingot deps, built-ins, and the ingot itself as
+772    /// "ingot".
+773    pub fn global_items(&self, db: &dyn AnalyzerDb) -> IndexMap<SmolStr, Item> {
+774        let ingot = self.ingot(db);
+775        let mut items = ingot
+776            .external_ingots(db)
+777            .iter()
+778            .map(|(name, ingot)| (name.clone(), Item::Ingot(*ingot)))
+779            .chain(builtin_items())
+780            .collect::<IndexMap<_, _>>();
+781
+782        if ingot.data(db).mode != IngotMode::StandaloneModule {
+783            items.insert("ingot".into(), Item::Ingot(ingot));
+784        }
+785        items
+786    }
+787
+788    /// All module constants.
+789    pub fn all_constants(&self, db: &dyn AnalyzerDb) -> Rc<Vec<ModuleConstantId>> {
+790        db.module_constants(*self)
+791    }
+792
+793    pub fn diagnostics(&self, db: &dyn AnalyzerDb) -> Vec<Diagnostic> {
+794        let mut diagnostics = vec![];
+795        self.sink_diagnostics(db, &mut diagnostics);
+796        diagnostics
+797    }
+798
+799    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+800        let data = self.data(db);
+801        if let ModuleSource::File(_) = data.source {
+802            sink.push_all(db.module_parse(*self).diagnostics.iter())
+803        }
+804        let ast = self.ast(db);
+805        for stmt in &ast.body {
+806            if let ast::ModuleStmt::Pragma(inner) = stmt {
+807                if let Some(diag) = check_pragma_version(inner) {
+808                    sink.push(&diag)
+809                }
+810            }
+811        }
+812
+813        // duplicate item name errors
+814        sink.push_all(db.module_item_map(*self).diagnostics.iter());
+815
+816        // duplicate impl errors
+817        sink.push_all(db.module_impl_map(*self).diagnostics.iter());
+818
+819        // errors for each item
+820        self.all_items(db)
+821            .iter()
+822            .for_each(|id| id.sink_diagnostics(db, sink));
+823
+824        self.all_impls(db)
+825            .iter()
+826            .for_each(|id| id.sink_diagnostics(db, sink));
+827    }
+828
+829    #[doc(hidden)]
+830    // DO NOT USE THIS METHOD except for testing purpose.
+831    pub fn from_raw_internal(raw: u32) -> Self {
+832        Self(raw)
+833    }
+834}
+835
+836#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+837pub struct ModuleConstant {
+838    pub ast: Node<ast::ConstantDecl>,
+839    pub module: ModuleId,
+840}
+841
+842#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+843pub struct ModuleConstantId(pub(crate) u32);
+844impl_intern_key!(ModuleConstantId);
+845
+846impl ModuleConstantId {
+847    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<ModuleConstant> {
+848        db.lookup_intern_module_const(*self)
+849    }
+850    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+851        self.data(db).ast.span
+852    }
+853    pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<types::TypeId, TypeError> {
+854        db.module_constant_type(*self).value
+855    }
+856
+857    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+858        self.data(db).ast.kind.name.kind.clone()
+859    }
+860
+861    pub fn constant_value(&self, db: &dyn AnalyzerDb) -> Result<Constant, ConstEvalError> {
+862        db.module_constant_value(*self).value
+863    }
+864
+865    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+866        self.data(db).ast.kind.name.span
+867    }
+868
+869    pub fn value(&self, db: &dyn AnalyzerDb) -> ast::Expr {
+870        self.data(db).ast.kind.value.kind.clone()
+871    }
+872
+873    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+874        Item::Module(self.data(db).module)
+875    }
+876
+877    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+878        self.data(db).ast.kind.pub_qual.is_some()
+879    }
+880
+881    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+882        self.data(db).module
+883    }
+884
+885    pub fn node_id(&self, db: &dyn AnalyzerDb) -> NodeId {
+886        self.data(db).ast.id
+887    }
+888
+889    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+890        db.module_constant_type(*self)
+891            .diagnostics
+892            .iter()
+893            .for_each(|d| sink.push(d));
+894    }
+895}
+896
+897#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+898pub enum TypeDef {
+899    Alias(TypeAliasId),
+900    Struct(StructId),
+901    Enum(EnumId),
+902    Contract(ContractId),
+903    Primitive(types::Base),
+904}
+905
+906impl TypeDef {
+907    pub fn items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+908        match self {
+909            TypeDef::Struct(val) => {
+910                // In the future we probably want to resolve instance methods as well. But this
+911                // would require the caller to pass an instance as the first
+912                // argument e.g. `Rectangle::can_hold(self_instance, other)`.
+913                // This isn't yet supported so for now path access to functions is limited to
+914                // static functions only.
+915                val.pure_functions_as_items(db)
+916            }
+917            TypeDef::Enum(val) => val.pure_functions_as_items(db),
+918            TypeDef::Contract(val) => val.pure_functions_as_items(db),
+919            _ => Rc::new(indexmap! {}),
+920        }
+921    }
+922
+923    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+924        match self {
+925            TypeDef::Alias(id) => id.name(db),
+926            TypeDef::Struct(id) => id.name(db),
+927            TypeDef::Enum(id) => id.name(db),
+928            TypeDef::Contract(id) => id.name(db),
+929            TypeDef::Primitive(typ) => typ.name(),
+930        }
+931    }
+932
+933    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+934        match self {
+935            TypeDef::Alias(id) => Some(id.name_span(db)),
+936            TypeDef::Struct(id) => Some(id.name_span(db)),
+937            TypeDef::Enum(id) => Some(id.name_span(db)),
+938            TypeDef::Contract(id) => Some(id.name_span(db)),
+939            TypeDef::Primitive(_) => None,
+940        }
+941    }
+942
+943    pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<Type, TypeError> {
+944        match self {
+945            TypeDef::Alias(id) => Ok(id.type_id(db)?.typ(db)),
+946            TypeDef::Struct(id) => Ok(Type::Struct(*id)),
+947            TypeDef::Enum(id) => Ok(Type::Enum(*id)),
+948            TypeDef::Contract(id) => Ok(Type::Contract(*id)),
+949            TypeDef::Primitive(base) => Ok(Type::Base(*base)),
+950        }
+951    }
+952
+953    pub fn type_id(&self, db: &dyn AnalyzerDb) -> Result<TypeId, TypeError> {
+954        Ok(db.intern_type(self.typ(db)?))
+955    }
+956
+957    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+958        match self {
+959            Self::Alias(id) => id.is_public(db),
+960            Self::Struct(id) => id.is_public(db),
+961            Self::Enum(id) => id.is_public(db),
+962            Self::Contract(id) => id.is_public(db),
+963            Self::Primitive(_) => true,
+964        }
+965    }
+966
+967    pub fn parent(&self, db: &dyn AnalyzerDb) -> Option<Item> {
+968        match self {
+969            TypeDef::Alias(id) => Some(id.parent(db)),
+970            TypeDef::Struct(id) => Some(id.parent(db)),
+971            TypeDef::Enum(id) => Some(id.parent(db)),
+972            TypeDef::Contract(id) => Some(id.parent(db)),
+973            TypeDef::Primitive(_) => None,
+974        }
+975    }
+976
+977    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+978        match self {
+979            TypeDef::Alias(id) => id.sink_diagnostics(db, sink),
+980            TypeDef::Struct(id) => id.sink_diagnostics(db, sink),
+981            TypeDef::Enum(id) => id.sink_diagnostics(db, sink),
+982            TypeDef::Contract(id) => id.sink_diagnostics(db, sink),
+983            TypeDef::Primitive(_) => {}
+984        }
+985    }
+986}
+987
+988#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+989pub struct TypeAlias {
+990    pub ast: Node<ast::TypeAlias>,
+991    pub module: ModuleId,
+992}
+993
+994#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+995pub struct TypeAliasId(pub(crate) u32);
+996impl_intern_key!(TypeAliasId);
+997
+998impl TypeAliasId {
+999    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<TypeAlias> {
+1000        db.lookup_intern_type_alias(*self)
+1001    }
+1002    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1003        self.data(db).ast.span
+1004    }
+1005    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1006        self.data(db).ast.name().into()
+1007    }
+1008    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1009        self.data(db).ast.kind.name.span
+1010    }
+1011    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1012        self.data(db).ast.kind.pub_qual.is_some()
+1013    }
+1014    pub fn type_id(&self, db: &dyn AnalyzerDb) -> Result<types::TypeId, TypeError> {
+1015        db.type_alias_type(*self).value
+1016    }
+1017    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1018        Item::Module(self.data(db).module)
+1019    }
+1020    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1021        db.type_alias_type(*self)
+1022            .diagnostics
+1023            .iter()
+1024            .for_each(|d| sink.push(d))
+1025    }
+1026}
+1027
+1028#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1029pub struct Contract {
+1030    pub name: SmolStr,
+1031    pub ast: Node<ast::Contract>,
+1032    pub module: ModuleId,
+1033}
+1034
+1035#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1036pub struct ContractId(pub(crate) u32);
+1037impl_intern_key!(ContractId);
+1038impl ContractId {
+1039    pub fn as_type(&self, db: &dyn AnalyzerDb) -> TypeId {
+1040        db.intern_type(Type::Contract(*self))
+1041    }
+1042    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Contract> {
+1043        db.lookup_intern_contract(*self)
+1044    }
+1045    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1046        self.data(db).ast.span
+1047    }
+1048    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1049        self.data(db).ast.name().into()
+1050    }
+1051    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1052        self.data(db).ast.kind.pub_qual.is_some()
+1053    }
+1054    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1055        self.data(db).ast.kind.name.span
+1056    }
+1057
+1058    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1059        self.data(db).module
+1060    }
+1061
+1062    pub fn fields(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, ContractFieldId>> {
+1063        db.contract_field_map(*self).value
+1064    }
+1065
+1066    pub fn field_type(
+1067        &self,
+1068        db: &dyn AnalyzerDb,
+1069        name: &str,
+1070    ) -> Option<Result<types::TypeId, TypeError>> {
+1071        // Note: contract field types are wrapped in SPtr in `fn expr_attribute`
+1072        let fields = db.contract_field_map(*self).value;
+1073        Some(fields.get(name)?.typ(db))
+1074    }
+1075
+1076    pub fn resolve_name(
+1077        &self,
+1078        db: &dyn AnalyzerDb,
+1079        name: &str,
+1080    ) -> Result<Option<NamedThing>, IncompleteItem> {
+1081        if let Some(item) = self
+1082            .function(db, name)
+1083            .filter(|f| !f.takes_self(db))
+1084            .map(Item::Function)
+1085        {
+1086            Ok(Some(NamedThing::Item(item)))
+1087        } else {
+1088            self.module(db).resolve_name(db, name)
+1089        }
+1090    }
+1091
+1092    pub fn init_function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId> {
+1093        db.contract_init_function(*self).value
+1094    }
+1095
+1096    pub fn call_function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId> {
+1097        db.contract_call_function(*self).value
+1098    }
+1099
+1100    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]> {
+1101        db.contract_all_functions(*self)
+1102    }
+1103
+1104    /// User functions, public and not. Excludes `__init__` and `__call__`.
+1105    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1106        db.contract_function_map(*self).value
+1107    }
+1108
+1109    /// Lookup a function by name. Searches all user functions, private or not.
+1110    /// Excludes `__init__` and `__call__`.
+1111    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId> {
+1112        self.functions(db).get(name).copied()
+1113    }
+1114
+1115    /// Excludes `__init__` and `__call__`.
+1116    pub fn public_functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1117        db.contract_public_function_map(*self)
+1118    }
+1119
+1120    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1121        Item::Module(self.data(db).module)
+1122    }
+1123
+1124    /// Dependency graph of the contract type, which consists of the field types
+1125    /// and the dependencies of those types.
+1126    ///
+1127    /// NOTE: Contract items should *only*
+1128    pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1129        db.contract_dependency_graph(*self).0
+1130    }
+1131
+1132    /// Dependency graph of the (imaginary) `__call__` function, which
+1133    /// dispatches to the contract's public functions.
+1134    pub fn runtime_dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1135        db.contract_runtime_dependency_graph(*self).0
+1136    }
+1137
+1138    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1139        // fields
+1140        db.contract_field_map(*self).sink_diagnostics(sink);
+1141        db.contract_all_fields(*self)
+1142            .iter()
+1143            .for_each(|field| field.sink_diagnostics(db, sink));
+1144
+1145        // functions
+1146        db.contract_init_function(*self).sink_diagnostics(sink);
+1147        db.contract_call_function(*self).sink_diagnostics(sink);
+1148        db.contract_function_map(*self).sink_diagnostics(sink);
+1149        db.contract_all_functions(*self)
+1150            .iter()
+1151            .for_each(|id| id.sink_diagnostics(db, sink));
+1152    }
+1153}
+1154
+1155#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1156pub struct ContractField {
+1157    pub ast: Node<ast::Field>,
+1158    pub parent: ContractId,
+1159}
+1160
+1161#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1162pub struct ContractFieldId(pub(crate) u32);
+1163impl_intern_key!(ContractFieldId);
+1164impl ContractFieldId {
+1165    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1166        self.data(db).ast.name().into()
+1167    }
+1168    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<ContractField> {
+1169        db.lookup_intern_contract_field(*self)
+1170    }
+1171    pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<types::TypeId, TypeError> {
+1172        db.contract_field_type(*self).value
+1173    }
+1174    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1175        sink.push_all(db.contract_field_type(*self).diagnostics.iter())
+1176    }
+1177}
+1178
+1179#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1180pub struct FunctionSig {
+1181    pub ast: Node<ast::FunctionSignature>,
+1182    pub parent: Option<Item>,
+1183    pub module: ModuleId,
+1184}
+1185
+1186#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1187pub struct FunctionSigId(pub(crate) u32);
+1188impl_intern_key!(FunctionSigId);
+1189
+1190impl FunctionSigId {
+1191    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<FunctionSig> {
+1192        db.lookup_intern_function_sig(*self)
+1193    }
+1194
+1195    pub fn takes_self(&self, db: &dyn AnalyzerDb) -> bool {
+1196        self.signature(db).self_decl.is_some()
+1197    }
+1198
+1199    pub fn self_type(&self, db: &dyn AnalyzerDb) -> Option<types::TypeId> {
+1200        match self.parent(db) {
+1201            Item::Type(TypeDef::Contract(cid)) => Some(types::Type::SelfContract(cid).id(db)),
+1202            Item::Type(TypeDef::Struct(sid)) => Some(types::Type::Struct(sid).id(db)),
+1203            Item::Type(TypeDef::Enum(sid)) => Some(types::Type::Enum(sid).id(db)),
+1204            Item::Impl(id) => Some(id.receiver(db)),
+1205            Item::Type(TypeDef::Primitive(ty)) => Some(db.intern_type(Type::Base(ty))),
+1206            _ => None,
+1207        }
+1208    }
+1209    pub fn self_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1210        Some(self.signature(db).self_decl?.span)
+1211    }
+1212    pub fn signature(&self, db: &dyn AnalyzerDb) -> Rc<types::FunctionSignature> {
+1213        db.function_signature(*self).value
+1214    }
+1215
+1216    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1217        self.is_trait_fn(db) || self.is_impl_fn(db) || self.pub_span(db).is_some()
+1218    }
+1219    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1220        self.data(db).ast.kind.name.kind.clone()
+1221    }
+1222    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1223        self.data(db).ast.kind.name.span
+1224    }
+1225    pub fn unsafe_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1226        self.data(db).ast.kind.unsafe_
+1227    }
+1228    pub fn is_constructor(&self, db: &dyn AnalyzerDb) -> bool {
+1229        self.name(db) == "__init__"
+1230    }
+1231    pub fn pub_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1232        self.data(db).ast.kind.pub_
+1233    }
+1234
+1235    pub fn self_item(&self, db: &dyn AnalyzerDb) -> Option<Item> {
+1236        let data = self.data(db);
+1237        data.parent
+1238    }
+1239
+1240    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1241        self.self_item(db)
+1242            .unwrap_or_else(|| Item::Module(self.module(db)))
+1243    }
+1244
+1245    /// Looks up the `FunctionId` based on the parent of the function signature
+1246    pub fn function(&self, db: &dyn AnalyzerDb) -> Option<FunctionId> {
+1247        match self.parent(db) {
+1248            Item::Type(TypeDef::Struct(id)) => id.function(db, &self.name(db)),
+1249            Item::Type(TypeDef::Enum(id)) => id.function(db, &self.name(db)),
+1250            Item::Impl(id) => id.function(db, &self.name(db)),
+1251            Item::Type(TypeDef::Contract(id)) => id.function(db, &self.name(db)),
+1252            _ => None,
+1253        }
+1254    }
+1255
+1256    pub fn is_trait_fn(&self, db: &dyn AnalyzerDb) -> bool {
+1257        matches!(self.parent(db), Item::Trait(_))
+1258    }
+1259
+1260    pub fn is_module_fn(&self, db: &dyn AnalyzerDb) -> bool {
+1261        matches!(self.parent(db), Item::Module(_))
+1262    }
+1263
+1264    pub fn is_impl_fn(&self, db: &dyn AnalyzerDb) -> bool {
+1265        matches!(self.parent(db), Item::Impl(_))
+1266    }
+1267
+1268    pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool {
+1269        !self.data(db).ast.kind.generic_params.kind.is_empty()
+1270    }
+1271
+1272    pub fn generic_params(&self, db: &dyn AnalyzerDb) -> Vec<GenericParameter> {
+1273        self.data(db).ast.kind.generic_params.kind.clone()
+1274    }
+1275
+1276    pub fn generic_param(&self, db: &dyn AnalyzerDb, param_name: &str) -> Option<GenericParameter> {
+1277        self.generic_params(db)
+1278            .iter()
+1279            .find(|param| match param {
+1280                GenericParameter::Unbounded(name) if name.kind == param_name => true,
+1281                GenericParameter::Bounded { name, .. } if name.kind == param_name => true,
+1282                _ => false,
+1283            })
+1284            .cloned()
+1285    }
+1286
+1287    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1288        self.data(db).module
+1289    }
+1290
+1291    pub fn is_contract_func(self, db: &dyn AnalyzerDb) -> bool {
+1292        matches! {self.parent(db), Item::Type(TypeDef::Contract(_))}
+1293    }
+1294
+1295    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1296        sink.push_all(db.function_signature(*self).diagnostics.iter());
+1297    }
+1298}
+1299
+1300#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1301pub struct Function {
+1302    pub ast: Node<ast::Function>,
+1303    pub sig: FunctionSigId,
+1304}
+1305
+1306impl Function {
+1307    pub fn new(
+1308        db: &dyn AnalyzerDb,
+1309        ast: &Node<ast::Function>,
+1310        parent: Option<Item>,
+1311        module: ModuleId,
+1312    ) -> Self {
+1313        let sig = db.intern_function_sig(Rc::new(FunctionSig {
+1314            ast: ast.kind.sig.clone(),
+1315            parent,
+1316            module,
+1317        }));
+1318        Function {
+1319            sig,
+1320            ast: ast.clone(),
+1321        }
+1322    }
+1323}
+1324
+1325#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1326pub struct FunctionId(pub(crate) u32);
+1327impl_intern_key!(FunctionId);
+1328impl FunctionId {
+1329    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Function> {
+1330        db.lookup_intern_function(*self)
+1331    }
+1332    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1333        self.data(db).ast.span
+1334    }
+1335    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1336        self.sig(db).name(db)
+1337    }
+1338    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1339        self.sig(db).name_span(db)
+1340    }
+1341    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1342        self.sig(db).module(db)
+1343    }
+1344    pub fn self_type(&self, db: &dyn AnalyzerDb) -> Option<types::TypeId> {
+1345        self.sig(db).self_type(db)
+1346    }
+1347    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1348        self.sig(db).parent(db)
+1349    }
+1350
+1351    pub fn takes_self(&self, db: &dyn AnalyzerDb) -> bool {
+1352        self.sig(db).takes_self(db)
+1353    }
+1354    pub fn self_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1355        self.sig(db).self_span(db)
+1356    }
+1357    pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool {
+1358        self.sig(db).is_generic(db)
+1359    }
+1360    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1361        self.sig(db).is_public(db)
+1362    }
+1363    pub fn is_constructor(&self, db: &dyn AnalyzerDb) -> bool {
+1364        self.sig(db).is_constructor(db)
+1365    }
+1366    pub fn is_unsafe(&self, db: &dyn AnalyzerDb) -> bool {
+1367        self.unsafe_span(db).is_some()
+1368    }
+1369    pub fn unsafe_span(&self, db: &dyn AnalyzerDb) -> Option<Span> {
+1370        self.sig(db).unsafe_span(db)
+1371    }
+1372    pub fn signature(&self, db: &dyn AnalyzerDb) -> Rc<types::FunctionSignature> {
+1373        db.function_signature(self.data(db).sig).value
+1374    }
+1375    pub fn sig(&self, db: &dyn AnalyzerDb) -> FunctionSigId {
+1376        self.data(db).sig
+1377    }
+1378    pub fn body(&self, db: &dyn AnalyzerDb) -> Rc<context::FunctionBody> {
+1379        db.function_body(*self).value
+1380    }
+1381    pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1382        db.function_dependency_graph(*self).0
+1383    }
+1384    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1385        sink.push_all(db.function_signature(self.data(db).sig).diagnostics.iter());
+1386        sink.push_all(db.function_body(*self).diagnostics.iter());
+1387    }
+1388    pub fn is_contract_func(self, db: &dyn AnalyzerDb) -> bool {
+1389        self.sig(db).is_contract_func(db)
+1390    }
+1391
+1392    pub fn is_test(&self, db: &dyn AnalyzerDb) -> bool {
+1393        Item::Function(*self)
+1394            .attributes(db)
+1395            .iter()
+1396            .any(|attribute| attribute.name(db) == "test")
+1397    }
+1398}
+1399
+1400trait FunctionsAsItems {
+1401    fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>>;
+1402
+1403    fn pure_functions_as_items(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, Item>> {
+1404        Rc::new(
+1405            self.functions(db)
+1406                .iter()
+1407                .filter_map(|(name, field)| {
+1408                    if field.takes_self(db) {
+1409                        None
+1410                    } else {
+1411                        Some((name.to_owned(), Item::Function(*field)))
+1412                    }
+1413                })
+1414                .collect(),
+1415        )
+1416    }
+1417}
+1418
+1419impl FunctionsAsItems for StructId {
+1420    fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1421        self.functions(db)
+1422    }
+1423}
+1424
+1425impl FunctionsAsItems for EnumId {
+1426    fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1427        self.functions(db)
+1428    }
+1429}
+1430
+1431impl FunctionsAsItems for ContractId {
+1432    fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1433        self.functions(db)
+1434    }
+1435}
+1436
+1437#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1438pub struct Struct {
+1439    pub ast: Node<ast::Struct>,
+1440    pub module: ModuleId,
+1441}
+1442
+1443#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1444pub struct StructId(pub(crate) u32);
+1445impl_intern_key!(StructId);
+1446impl StructId {
+1447    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Struct> {
+1448        db.lookup_intern_struct(*self)
+1449    }
+1450    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1451        self.data(db).ast.span
+1452    }
+1453    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1454        self.data(db).ast.name().into()
+1455    }
+1456    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+1457        self.data(db).ast.kind.name.span
+1458    }
+1459
+1460    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1461        self.data(db).ast.kind.pub_qual.is_some()
+1462    }
+1463
+1464    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1465        self.data(db).module
+1466    }
+1467
+1468    pub fn as_type(&self, db: &dyn AnalyzerDb) -> TypeId {
+1469        db.intern_type(Type::Struct(*self))
+1470    }
+1471
+1472    pub fn has_private_field(&self, db: &dyn AnalyzerDb) -> bool {
+1473        self.fields(db).values().any(|field| !field.is_public(db))
+1474    }
+1475
+1476    pub fn field(&self, db: &dyn AnalyzerDb, name: &str) -> Option<StructFieldId> {
+1477        self.fields(db).get(name).copied()
+1478    }
+1479
+1480    pub fn fields(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, StructFieldId>> {
+1481        db.struct_field_map(*self).value
+1482    }
+1483
+1484    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]> {
+1485        db.struct_all_functions(*self)
+1486    }
+1487
+1488    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1489        db.struct_function_map(*self).value
+1490    }
+1491    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId> {
+1492        self.functions(db).get(name).copied()
+1493    }
+1494    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1495        Item::Module(self.data(db).module)
+1496    }
+1497    pub fn dependency_graph(&self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1498        db.struct_dependency_graph(*self).value.0
+1499    }
+1500    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1501        sink.push_all(db.struct_field_map(*self).diagnostics.iter());
+1502        sink.push_all(db.struct_dependency_graph(*self).diagnostics.iter());
+1503
+1504        db.struct_all_fields(*self)
+1505            .iter()
+1506            .for_each(|id| id.sink_diagnostics(db, sink));
+1507
+1508        db.struct_function_map(*self).sink_diagnostics(sink);
+1509        db.struct_all_functions(*self)
+1510            .iter()
+1511            .for_each(|id| id.sink_diagnostics(db, sink));
+1512    }
+1513}
+1514
+1515#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1516pub struct StructField {
+1517    pub ast: Node<ast::Field>,
+1518    pub parent: StructId,
+1519}
+1520
+1521#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1522pub struct StructFieldId(pub(crate) u32);
+1523impl_intern_key!(StructFieldId);
+1524impl StructFieldId {
+1525    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1526        self.data(db).ast.name().into()
+1527    }
+1528    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1529        self.data(db).ast.span
+1530    }
+1531    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<StructField> {
+1532        db.lookup_intern_struct_field(*self)
+1533    }
+1534    pub fn attributes(&self, db: &dyn AnalyzerDb) -> Vec<SmolStr> {
+1535        self.data(db)
+1536            .ast
+1537            .kind
+1538            .attributes
+1539            .iter()
+1540            .map(|node| node.kind.clone())
+1541            .collect()
+1542    }
+1543
+1544    pub fn is_indexed(&self, db: &dyn AnalyzerDb) -> bool {
+1545        self.attributes(db).contains(&INDEXED.into())
+1546    }
+1547
+1548    pub fn typ(&self, db: &dyn AnalyzerDb) -> Result<types::TypeId, TypeError> {
+1549        db.struct_field_type(*self).value
+1550    }
+1551    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+1552        self.data(db).ast.kind.is_pub
+1553    }
+1554
+1555    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1556        db.struct_field_type(*self).sink_diagnostics(sink)
+1557    }
+1558}
+1559
+1560#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1561pub struct Attribute {
+1562    pub ast: Node<SmolStr>,
+1563    pub module: ModuleId,
+1564}
+1565#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1566pub struct AttributeId(pub(crate) u32);
+1567impl_intern_key!(AttributeId);
+1568
+1569impl AttributeId {
+1570    pub fn data(self, db: &dyn AnalyzerDb) -> Rc<Attribute> {
+1571        db.lookup_intern_attribute(self)
+1572    }
+1573    pub fn span(self, db: &dyn AnalyzerDb) -> Span {
+1574        self.data(db).ast.span
+1575    }
+1576    pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr {
+1577        self.data(db).ast.kind.to_owned()
+1578    }
+1579
+1580    pub fn module(self, db: &dyn AnalyzerDb) -> ModuleId {
+1581        self.data(db).module
+1582    }
+1583
+1584    pub fn parent(self, db: &dyn AnalyzerDb) -> Item {
+1585        Item::Module(self.data(db).module)
+1586    }
+1587}
+1588
+1589#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1590pub struct Enum {
+1591    pub ast: Node<ast::Enum>,
+1592    pub module: ModuleId,
+1593}
+1594#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1595pub struct EnumId(pub(crate) u32);
+1596impl_intern_key!(EnumId);
+1597
+1598impl EnumId {
+1599    pub fn data(self, db: &dyn AnalyzerDb) -> Rc<Enum> {
+1600        db.lookup_intern_enum(self)
+1601    }
+1602    pub fn span(self, db: &dyn AnalyzerDb) -> Span {
+1603        self.data(db).ast.span
+1604    }
+1605    pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr {
+1606        self.data(db).ast.name().into()
+1607    }
+1608    pub fn name_span(self, db: &dyn AnalyzerDb) -> Span {
+1609        self.data(db).ast.kind.name.span
+1610    }
+1611
+1612    pub fn as_type(self, db: &dyn AnalyzerDb) -> TypeId {
+1613        db.intern_type(Type::Enum(self))
+1614    }
+1615
+1616    pub fn is_public(self, db: &dyn AnalyzerDb) -> bool {
+1617        self.data(db).ast.kind.pub_qual.is_some()
+1618    }
+1619
+1620    pub fn variant(self, db: &dyn AnalyzerDb, name: &str) -> Option<EnumVariantId> {
+1621        self.variants(db).get(name).copied()
+1622    }
+1623
+1624    pub fn variants(self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, EnumVariantId>> {
+1625        db.enum_variant_map(self).value
+1626    }
+1627
+1628    pub fn module(self, db: &dyn AnalyzerDb) -> ModuleId {
+1629        self.data(db).module
+1630    }
+1631
+1632    pub fn parent(self, db: &dyn AnalyzerDb) -> Item {
+1633        Item::Module(self.data(db).module)
+1634    }
+1635
+1636    pub fn dependency_graph(self, db: &dyn AnalyzerDb) -> Rc<DepGraph> {
+1637        db.enum_dependency_graph(self).value.0
+1638    }
+1639
+1640    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]> {
+1641        db.enum_all_functions(*self)
+1642    }
+1643
+1644    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1645        db.enum_function_map(*self).value
+1646    }
+1647
+1648    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId> {
+1649        self.functions(db).get(name).copied()
+1650    }
+1651
+1652    pub fn sink_diagnostics(self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1653        sink.push_all(db.enum_variant_map(self).diagnostics.iter());
+1654        sink.push_all(db.enum_dependency_graph(self).diagnostics.iter());
+1655
+1656        db.enum_all_variants(self)
+1657            .iter()
+1658            .for_each(|variant| variant.sink_diagnostics(db, sink));
+1659
+1660        db.enum_function_map(self).sink_diagnostics(sink);
+1661        db.enum_all_functions(self)
+1662            .iter()
+1663            .for_each(|id| id.sink_diagnostics(db, sink));
+1664    }
+1665}
+1666
+1667#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1668pub struct EnumVariant {
+1669    pub ast: Node<ast::Variant>,
+1670    pub tag: usize,
+1671    pub parent: EnumId,
+1672}
+1673
+1674#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1675pub struct EnumVariantId(pub(crate) u32);
+1676impl_intern_key!(EnumVariantId);
+1677impl EnumVariantId {
+1678    pub fn data(self, db: &dyn AnalyzerDb) -> Rc<EnumVariant> {
+1679        db.lookup_intern_enum_variant(self)
+1680    }
+1681    pub fn name(self, db: &dyn AnalyzerDb) -> SmolStr {
+1682        self.data(db).ast.name().into()
+1683    }
+1684    pub fn span(self, db: &dyn AnalyzerDb) -> Span {
+1685        self.data(db).ast.span
+1686    }
+1687    pub fn name_with_parent(self, db: &dyn AnalyzerDb) -> SmolStr {
+1688        let parent = self.parent(db);
+1689        format!("{}::{}", parent.name(db), self.name(db)).into()
+1690    }
+1691
+1692    pub fn kind(self, db: &dyn AnalyzerDb) -> Result<EnumVariantKind, TypeError> {
+1693        db.enum_variant_kind(self).value
+1694    }
+1695
+1696    pub fn disc(self, db: &dyn AnalyzerDb) -> usize {
+1697        self.data(db).tag
+1698    }
+1699
+1700    pub fn sink_diagnostics(self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1701        db.enum_variant_kind(self).sink_diagnostics(sink)
+1702    }
+1703
+1704    pub fn parent(self, db: &dyn AnalyzerDb) -> EnumId {
+1705        self.data(db).parent
+1706    }
+1707}
+1708
+1709#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1710pub enum EnumVariantKind {
+1711    Unit,
+1712    Tuple(SmallVec<[TypeId; 4]>),
+1713}
+1714
+1715impl EnumVariantKind {
+1716    pub fn display_name(&self) -> &'static str {
+1717        match self {
+1718            Self::Unit => "unit variant",
+1719            Self::Tuple(..) => "tuple variant",
+1720        }
+1721    }
+1722
+1723    pub fn field_len(&self) -> usize {
+1724        match self {
+1725            Self::Unit => 0,
+1726            Self::Tuple(elts) => elts.len(),
+1727        }
+1728    }
+1729
+1730    pub fn is_unit(&self) -> bool {
+1731        matches!(self, Self::Unit)
+1732    }
+1733}
+1734
+1735impl DisplayWithDb for EnumVariantKind {
+1736    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter) -> fmt::Result {
+1737        match self {
+1738            Self::Unit => write!(f, "unit"),
+1739            Self::Tuple(elts) => {
+1740                write!(f, "(")?;
+1741                let mut delim = "";
+1742                for ty in elts {
+1743                    write!(f, "{delim}")?;
+1744                    ty.format(db, f)?;
+1745                    delim = ", ";
+1746                }
+1747                write!(f, ")")
+1748            }
+1749        }
+1750    }
+1751}
+1752
+1753#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+1754pub struct Impl {
+1755    pub trait_id: TraitId,
+1756    pub receiver: TypeId,
+1757    pub module: ModuleId,
+1758    pub ast: Node<ast::Impl>,
+1759}
+1760
+1761#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+1762pub struct ImplId(pub(crate) u32);
+1763impl_intern_key!(ImplId);
+1764impl ImplId {
+1765    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Impl> {
+1766        db.lookup_intern_impl(*self)
+1767    }
+1768    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+1769        self.data(db).ast.span
+1770    }
+1771
+1772    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+1773        self.data(db).module
+1774    }
+1775
+1776    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionId]> {
+1777        db.impl_all_functions(*self)
+1778    }
+1779
+1780    pub fn trait_id(&self, db: &dyn AnalyzerDb) -> TraitId {
+1781        self.data(db).trait_id
+1782    }
+1783
+1784    pub fn receiver(&self, db: &dyn AnalyzerDb) -> TypeId {
+1785        self.data(db).receiver
+1786    }
+1787
+1788    /// Returns `true` if `other` either is `Self` or the type of the receiver
+1789    pub fn is_receiver_type(&self, other: TypeId, db: &dyn AnalyzerDb) -> bool {
+1790        other == self.receiver(db)
+1791            || other == Type::SelfType(TraitOrType::TypeId(self.receiver(db))).id(db)
+1792    }
+1793
+1794    /// Returns `true` if the `type_in_impl` can stand in for the `type_in_trait` as a type used
+1795    /// for a parameter or as a return type
+1796    pub fn can_stand_in_for(
+1797        &self,
+1798        db: &dyn AnalyzerDb,
+1799        type_in_impl: TypeId,
+1800        type_in_trait: TypeId,
+1801    ) -> bool {
+1802        if type_in_impl == type_in_trait {
+1803            true
+1804        } else {
+1805            self.is_receiver_type(type_in_impl, db)
+1806                && (type_in_trait.is_self_ty(db) || type_in_trait == self.receiver(db))
+1807        }
+1808    }
+1809
+1810    pub fn ast(&self, db: &dyn AnalyzerDb) -> Node<ast::Impl> {
+1811        self.data(db).ast.clone()
+1812    }
+1813
+1814    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionId>> {
+1815        db.impl_function_map(*self).value
+1816    }
+1817    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionId> {
+1818        self.functions(db).get(name).copied()
+1819    }
+1820    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+1821        Item::Module(self.data(db).module)
+1822    }
+1823    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+1824        format!(
+1825            "{}_{}",
+1826            self.trait_id(db).name(db),
+1827            self.receiver(db).display(db)
+1828        )
+1829        .into()
+1830    }
+1831
+1832    fn validate_type_or_trait_is_in_ingot(
+1833        &self,
+1834        db: &dyn AnalyzerDb,
+1835        sink: &mut impl DiagnosticSink,
+1836        type_ingot: Option<IngotId>,
+1837    ) {
+1838        let impl_ingot = self.data(db).module.ingot(db);
+1839        let is_allowed = match type_ingot {
+1840            None => impl_ingot == self.data(db).trait_id.module(db).ingot(db),
+1841            Some(val) => {
+1842                val == impl_ingot || self.data(db).trait_id.module(db).ingot(db) == impl_ingot
+1843            }
+1844        };
+1845
+1846        if !is_allowed {
+1847            sink.push(&errors::fancy_error(
+1848                "illegal `impl`. Either type or trait must be in the same ingot as the `impl`",
+1849                vec![Label::primary(
+1850                    self.data(db).ast.span,
+1851                    format!(
+1852                        "Neither `{}` nor `{}` are in the ingot of the `impl` block",
+1853                        self.data(db).receiver.display(db),
+1854                        self.data(db).trait_id.name(db)
+1855                    ),
+1856                )],
+1857                vec![],
+1858            ))
+1859        }
+1860    }
+1861
+1862    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+1863        match &self.data(db).receiver.typ(db) {
+1864            Type::Contract(_)
+1865            | Type::Map(_)
+1866            | Type::SelfContract(_)
+1867            | Type::Generic(_)
+1868            | Type::SelfType(_) => sink.push(&errors::fancy_error(
+1869                format!(
+1870                    "`impl` blocks aren't allowed for {}",
+1871                    self.data(db).receiver.display(db)
+1872                ),
+1873                vec![Label::primary(
+1874                    self.data(db).ast.span,
+1875                    "illegal `impl` block",
+1876                )],
+1877                vec![],
+1878            )),
+1879            Type::Struct(id) => {
+1880                self.validate_type_or_trait_is_in_ingot(db, sink, Some(id.module(db).ingot(db)))
+1881            }
+1882            Type::Enum(id) => {
+1883                self.validate_type_or_trait_is_in_ingot(db, sink, Some(id.module(db).ingot(db)))
+1884            }
+1885            Type::Base(_) | Type::Array(_) | Type::Tuple(_) | Type::String(_) => {
+1886                self.validate_type_or_trait_is_in_ingot(db, sink, None)
+1887            }
+1888            Type::SPtr(_) | Type::Mut(_) => unreachable!(),
+1889        }
+1890
+1891        if !self.trait_id(db).is_public(db) && self.trait_id(db).module(db) != self.module(db) {
+1892            let trait_module_name = self.trait_id(db).module(db).name(db);
+1893            let trait_name = self.trait_id(db).name(db);
+1894            sink.push(&errors::fancy_error(
+1895                     format!(
+1896                         "the trait `{trait_name}` is private",
+1897                     ),
+1898                     vec![
+1899                         Label::primary(self.trait_id(db).data(db).ast.kind.name.span, "this trait is not `pub`"),
+1900                     ],
+1901                     vec![
+1902                         format!("`{trait_name}` can only be used within `{trait_module_name}`"),
+1903                         format!("Hint: use `pub trait {trait_name}` to make `{trait_name}` visible from outside of `{trait_module_name}`"),
+1904                     ],
+1905                 ));
+1906        }
+1907
+1908        for impl_fn in self.all_functions(db).iter() {
+1909            impl_fn.sink_diagnostics(db, sink);
+1910
+1911            if let Some(trait_fn) = self.trait_id(db).function(db, &impl_fn.name(db)) {
+1912                for (impl_param, trait_param) in impl_fn
+1913                    .signature(db)
+1914                    .params
+1915                    .iter()
+1916                    .zip(trait_fn.signature(db).params.iter())
+1917                {
+1918                    let impl_param_ty = impl_param.typ.clone().unwrap();
+1919                    let trait_param_ty = trait_param.typ.clone().unwrap();
+1920                    if self.can_stand_in_for(db, impl_param_ty, trait_param_ty) {
+1921                        continue;
+1922                    } else {
+1923                        sink.push(&errors::fancy_error(
+1924                            format!(
+1925                                "method `{}` has incompatible parameters for `{}` of trait `{}`",
+1926                                impl_fn.name(db),
+1927                                trait_fn.name(db),
+1928                                self.trait_id(db).name(db)
+1929                            ),
+1930                            vec![
+1931                                Label::primary(
+1932                                    impl_fn.data(db).ast.kind.sig.span,
+1933                                    "signature of method in `impl` block",
+1934                                ),
+1935                                Label::primary(
+1936                                    trait_fn.data(db).ast.span,
+1937                                    format!(
+1938                                        "signature of method in trait `{}`",
+1939                                        self.trait_id(db).name(db)
+1940                                    ),
+1941                                ),
+1942                            ],
+1943                            vec![],
+1944                        ));
+1945                        break;
+1946                    }
+1947                }
+1948
+1949                let impl_fn_return_ty = impl_fn.signature(db).return_type.clone().unwrap();
+1950                let trait_fn_return_ty = trait_fn.signature(db).return_type.clone().unwrap();
+1951
+1952                if !self.can_stand_in_for(db, impl_fn_return_ty, trait_fn_return_ty) {
+1953                    // TODO: This could be a nicer, more detailed report
+1954                    sink.push(&errors::fancy_error(
+1955                        format!(
+1956                            "method `{}` has an incompatible return type for `{}` of trait `{}`",
+1957                            impl_fn.name(db),
+1958                            trait_fn.name(db),
+1959                            self.trait_id(db).name(db)
+1960                        ),
+1961                        vec![
+1962                            Label::primary(
+1963                                impl_fn.data(db).ast.kind.sig.span,
+1964                                "signature of method in `impl` block",
+1965                            ),
+1966                            Label::primary(
+1967                                trait_fn.data(db).ast.span,
+1968                                format!(
+1969                                    "signature of method in trait `{}`",
+1970                                    self.trait_id(db).name(db)
+1971                                ),
+1972                            ),
+1973                        ],
+1974                        vec![],
+1975                    ));
+1976                }
+1977
+1978                if impl_fn.takes_self(db) != trait_fn.takes_self(db) {
+1979                    let ((selfy_thing, selfy_span), (non_selfy_thing, non_selfy_span)) =
+1980                        if impl_fn.takes_self(db) {
+1981                            (
+1982                                ("impl", impl_fn.name_span(db)),
+1983                                ("trait", trait_fn.name_span(db)),
+1984                            )
+1985                        } else {
+1986                            (
+1987                                ("trait", trait_fn.name_span(db)),
+1988                                ("impl", impl_fn.name_span(db)),
+1989                            )
+1990                        };
+1991                    sink.push(&errors::fancy_error(
+1992                        format!(
+1993                            "method `{}` has a `self` declaration in the {}, but not in the `{}`",
+1994                            impl_fn.name(db),
+1995                            selfy_thing,
+1996                            non_selfy_thing
+1997                        ),
+1998                        vec![
+1999                            Label::primary(
+2000                                selfy_span,
+2001                                format!("`self` declared on the `{selfy_thing}`"),
+2002                            ),
+2003                            Label::primary(
+2004                                non_selfy_span,
+2005                                format!("no `self` declared on the `{non_selfy_thing}`"),
+2006                            ),
+2007                        ],
+2008                        vec![],
+2009                    ));
+2010                }
+2011            } else {
+2012                sink.push(&errors::fancy_error(
+2013                    format!(
+2014                        "method `{}` is not a member of trait `{}`",
+2015                        impl_fn.name(db),
+2016                        self.trait_id(db).name(db)
+2017                    ),
+2018                    vec![Label::primary(
+2019                        impl_fn.data(db).ast.span,
+2020                        format!("not a member of trait `{}`", self.trait_id(db).name(db)),
+2021                    )],
+2022                    vec![],
+2023                ))
+2024            }
+2025        }
+2026
+2027        for trait_fn in self.trait_id(db).all_functions(db).iter() {
+2028            if self.function(db, &trait_fn.name(db)).is_none() {
+2029                sink.push(&errors::fancy_error(
+2030                    format!(
+2031                        "not all members of trait `{}` implemented, missing: `{}`",
+2032                        self.trait_id(db).name(db),
+2033                        trait_fn.name(db)
+2034                    ),
+2035                    vec![Label::primary(
+2036                        trait_fn.data(db).ast.span,
+2037                        "this trait function is missing in `impl` block",
+2038                    )],
+2039                    vec![],
+2040                ))
+2041            }
+2042        }
+2043    }
+2044}
+2045
+2046#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+2047pub struct Trait {
+2048    pub ast: Node<ast::Trait>,
+2049    pub module: ModuleId,
+2050}
+2051
+2052#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+2053pub struct TraitId(pub(crate) u32);
+2054impl_intern_key!(TraitId);
+2055impl TraitId {
+2056    pub fn data(&self, db: &dyn AnalyzerDb) -> Rc<Trait> {
+2057        db.lookup_intern_trait(*self)
+2058    }
+2059    pub fn span(&self, db: &dyn AnalyzerDb) -> Span {
+2060        self.data(db).ast.span
+2061    }
+2062    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+2063        self.data(db).ast.name().into()
+2064    }
+2065    pub fn name_span(&self, db: &dyn AnalyzerDb) -> Span {
+2066        self.data(db).ast.kind.name.span
+2067    }
+2068
+2069    pub fn is_public(&self, db: &dyn AnalyzerDb) -> bool {
+2070        self.data(db).ast.kind.pub_qual.is_some()
+2071    }
+2072
+2073    pub fn module(&self, db: &dyn AnalyzerDb) -> ModuleId {
+2074        self.data(db).module
+2075    }
+2076    pub fn as_trait_or_type(&self) -> TraitOrType {
+2077        TraitOrType::TraitId(*self)
+2078    }
+2079    pub fn is_implemented_for(&self, db: &dyn AnalyzerDb, ty: TypeId) -> bool {
+2080        // All encodable structs automagically implement the Emittable trait
+2081        // TODO: Remove this when we have the `Encode / Decode` trait.
+2082        if self.is_std_trait(db, EMITTABLE_TRAIT_NAME) && ty.is_emittable(db) {
+2083            return true;
+2084        }
+2085
+2086        db.all_impls(ty).iter().any(|val| &val.trait_id(db) == self)
+2087    }
+2088
+2089    pub fn is_in_std(&self, db: &dyn AnalyzerDb) -> bool {
+2090        self.module(db).is_in_std(db)
+2091    }
+2092
+2093    pub fn is_std_trait(&self, db: &dyn AnalyzerDb, name: &str) -> bool {
+2094        self.is_in_std(db) && self.name(db).to_lowercase() == name.to_lowercase()
+2095    }
+2096
+2097    pub fn parent(&self, db: &dyn AnalyzerDb) -> Item {
+2098        Item::Module(self.data(db).module)
+2099    }
+2100    pub fn all_functions(&self, db: &dyn AnalyzerDb) -> Rc<[FunctionSigId]> {
+2101        db.trait_all_functions(*self)
+2102    }
+2103
+2104    pub fn functions(&self, db: &dyn AnalyzerDb) -> Rc<IndexMap<SmolStr, FunctionSigId>> {
+2105        db.trait_function_map(*self).value
+2106    }
+2107
+2108    pub fn function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId> {
+2109        self.functions(db).get(name).copied()
+2110    }
+2111
+2112    pub fn sink_diagnostics(&self, db: &dyn AnalyzerDb, sink: &mut impl DiagnosticSink) {
+2113        db.trait_all_functions(*self)
+2114            .iter()
+2115            .for_each(|id| id.sink_diagnostics(db, sink));
+2116    }
+2117}
+2118
+2119pub trait DiagnosticSink {
+2120    fn push(&mut self, diag: &Diagnostic);
+2121    fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>) {
+2122        iter.for_each(|diag| self.push(diag))
+2123    }
+2124}
+2125
+2126impl DiagnosticSink for Vec<Diagnostic> {
+2127    fn push(&mut self, diag: &Diagnostic) {
+2128        self.push(diag.clone())
+2129    }
+2130    fn push_all<'a>(&mut self, iter: impl Iterator<Item = &'a Diagnostic>) {
+2131        self.extend(iter.cloned())
+2132    }
+2133}
+2134
+2135pub type DepGraph = petgraph::graphmap::DiGraphMap<Item, DepLocality>;
+2136#[derive(Debug, Clone)]
+2137pub struct DepGraphWrapper(pub Rc<DepGraph>);
+2138impl PartialEq for DepGraphWrapper {
+2139    fn eq(&self, other: &DepGraphWrapper) -> bool {
+2140        self.0.all_edges().eq(other.0.all_edges()) && self.0.nodes().eq(other.0.nodes())
+2141    }
+2142}
+2143impl Eq for DepGraphWrapper {}
+2144
+2145/// [`DepGraph`] edge label. "Locality" refers to the deployed state;
+2146/// `Local` dependencies are those that will be compiled together, while
+2147/// `External` dependencies will only be reachable via an evm CALL* op.
+2148#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+2149pub enum DepLocality {
+2150    Local,
+2151    External,
+2152}
+2153
+2154pub fn walk_local_dependencies<F>(graph: &DepGraph, root: Item, mut fun: F)
+2155where
+2156    F: FnMut(Item),
+2157{
+2158    use petgraph::visit::{Bfs, EdgeFiltered};
+2159
+2160    let mut bfs = Bfs::new(
+2161        &EdgeFiltered::from_fn(graph, |(_, _, loc)| *loc == DepLocality::Local),
+2162        root,
+2163    );
+2164    while let Some(node) = bfs.next(graph) {
+2165        fun(node)
+2166    }
+2167}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/namespace/mod.rs.html b/compiler-docs/src/fe_analyzer/namespace/mod.rs.html new file mode 100644 index 0000000000..8d6d0727f3 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/namespace/mod.rs.html @@ -0,0 +1,3 @@ +mod.rs - source

fe_analyzer/namespace/
mod.rs

1pub mod items;
+2pub mod scopes;
+3pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/namespace/scopes.rs.html b/compiler-docs/src/fe_analyzer/namespace/scopes.rs.html new file mode 100644 index 0000000000..e475da40f7 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/namespace/scopes.rs.html @@ -0,0 +1,700 @@ +scopes.rs - source

fe_analyzer/namespace/
scopes.rs

1#![allow(unstable_name_collisions)] // expect_none, which ain't gonna be stabilized
+2
+3use crate::context::{
+4    AnalyzerContext, CallType, Constant, ExpressionAttributes, FunctionBody, NamedThing,
+5};
+6use crate::errors::{AlreadyDefined, FatalError, IncompleteItem, TypeError};
+7use crate::namespace::items::{FunctionId, ModuleId};
+8use crate::namespace::items::{Item, TypeDef};
+9use crate::namespace::types::{Type, TypeId};
+10use crate::pattern_analysis::PatternMatrix;
+11use crate::AnalyzerDb;
+12use fe_common::diagnostics::Diagnostic;
+13use fe_common::Span;
+14use fe_parser::{ast, node::NodeId, Label};
+15use fe_parser::{ast::Expr, node::Node};
+16use indexmap::IndexMap;
+17use std::cell::RefCell;
+18use std::collections::BTreeMap;
+19
+20pub struct ItemScope<'a> {
+21    db: &'a dyn AnalyzerDb,
+22    module: ModuleId,
+23    expressions: RefCell<IndexMap<NodeId, ExpressionAttributes>>,
+24    pub diagnostics: RefCell<Vec<Diagnostic>>,
+25}
+26impl<'a> ItemScope<'a> {
+27    pub fn new(db: &'a dyn AnalyzerDb, module: ModuleId) -> Self {
+28        Self {
+29            db,
+30            module,
+31            expressions: RefCell::new(IndexMap::default()),
+32            diagnostics: RefCell::new(vec![]),
+33        }
+34    }
+35}
+36
+37impl<'a> AnalyzerContext for ItemScope<'a> {
+38    fn db(&self) -> &dyn AnalyzerDb {
+39        self.db
+40    }
+41
+42    fn add_expression(&self, node: &Node<ast::Expr>, attributes: ExpressionAttributes) {
+43        self.expressions
+44            .borrow_mut()
+45            .insert(node.id, attributes)
+46            .expect_none("expression attributes already exist");
+47    }
+48
+49    fn update_expression(&self, node: &Node<ast::Expr>, f: &dyn Fn(&mut ExpressionAttributes)) {
+50        f(self.expressions.borrow_mut().get_mut(&node.id).unwrap())
+51    }
+52
+53    fn expr_typ(&self, expr: &Node<Expr>) -> Type {
+54        self.expressions
+55            .borrow()
+56            .get(&expr.id)
+57            .unwrap()
+58            .typ
+59            .typ(self.db())
+60    }
+61
+62    fn add_constant(
+63        &self,
+64        _name: &Node<ast::SmolStr>,
+65        _expr: &Node<ast::Expr>,
+66        _value: crate::context::Constant,
+67    ) {
+68        // We use salsa query to get constant. So no need to add constant
+69        // explicitly.
+70    }
+71
+72    fn constant_value_by_name(
+73        &self,
+74        name: &ast::SmolStr,
+75        _span: Span,
+76    ) -> Result<Option<Constant>, IncompleteItem> {
+77        if let Some(constant) = self.module.resolve_constant(self.db, name)? {
+78            // It's ok to ignore an error.
+79            // Diagnostics are already emitted when an error occurs.
+80            Ok(constant.constant_value(self.db).ok())
+81        } else {
+82            Ok(None)
+83        }
+84    }
+85
+86    fn parent(&self) -> Item {
+87        Item::Module(self.module)
+88    }
+89
+90    fn module(&self) -> ModuleId {
+91        self.module
+92    }
+93
+94    fn parent_function(&self) -> FunctionId {
+95        panic!("ItemContext has no parent function")
+96    }
+97
+98    fn add_call(&self, _node: &Node<ast::Expr>, _call_type: CallType) {
+99        unreachable!("Can't call function outside of function")
+100    }
+101    fn get_call(&self, _node: &Node<ast::Expr>) -> Option<CallType> {
+102        unreachable!("Can't call function outside of function")
+103    }
+104
+105    fn is_in_function(&self) -> bool {
+106        false
+107    }
+108
+109    fn inherits_type(&self, _typ: BlockScopeType) -> bool {
+110        false
+111    }
+112
+113    fn resolve_name(&self, name: &str, span: Span) -> Result<Option<NamedThing>, IncompleteItem> {
+114        let resolved = self.module.resolve_name(self.db, name)?;
+115
+116        if let Some(named_thing) = &resolved {
+117            check_visibility(self, named_thing, span);
+118        }
+119
+120        Ok(resolved)
+121    }
+122
+123    fn resolve_path(&self, path: &ast::Path, span: Span) -> Result<NamedThing, FatalError> {
+124        let resolved = self.module.resolve_path_internal(self.db(), path);
+125
+126        let mut err = None;
+127        for diagnostic in resolved.diagnostics.iter() {
+128            err = Some(self.register_diag(diagnostic.clone()));
+129        }
+130
+131        if let Some(err) = err {
+132            return Err(FatalError::new(err));
+133        }
+134
+135        if let Some(named_thing) = resolved.value {
+136            check_visibility(self, &named_thing, span);
+137            Ok(named_thing)
+138        } else {
+139            let err = self.error("unresolved path item", span, "not found");
+140            Err(FatalError::new(err))
+141        }
+142    }
+143
+144    fn resolve_visible_path(&self, path: &ast::Path) -> Option<NamedThing> {
+145        let resolved = self.module.resolve_path_internal(self.db(), path);
+146
+147        if resolved.diagnostics.len() > 0 {
+148            return None;
+149        }
+150
+151        let named_thing = resolved.value?;
+152        if is_visible(self, &named_thing) {
+153            Some(named_thing)
+154        } else {
+155            None
+156        }
+157    }
+158
+159    fn resolve_any_path(&self, path: &ast::Path) -> Option<NamedThing> {
+160        let resolved = self.module.resolve_path_internal(self.db(), path);
+161
+162        if resolved.diagnostics.len() > 0 {
+163            return None;
+164        }
+165
+166        resolved.value
+167    }
+168
+169    fn add_diagnostic(&self, diag: Diagnostic) {
+170        self.diagnostics.borrow_mut().push(diag)
+171    }
+172
+173    /// Gets `std::context::Context` if it exists
+174    fn get_context_type(&self) -> Option<TypeId> {
+175        if let Ok(Some(NamedThing::Item(Item::Type(TypeDef::Struct(id))))) =
+176            // `Context` is guaranteed to be public, so we can use `Span::dummy()` .
+177            self.resolve_name("Context", Span::dummy())
+178        {
+179            // we just assume that there is only one `Context` defined in `std`
+180            if id.module(self.db()).ingot(self.db()).name(self.db()) == "std" {
+181                return Some(self.db().intern_type(Type::Struct(id)));
+182            }
+183        }
+184
+185        None
+186    }
+187}
+188
+189pub struct FunctionScope<'a> {
+190    pub db: &'a dyn AnalyzerDb,
+191    pub function: FunctionId,
+192    pub body: RefCell<FunctionBody>,
+193    pub diagnostics: RefCell<Vec<Diagnostic>>,
+194}
+195
+196impl<'a> FunctionScope<'a> {
+197    pub fn new(db: &'a dyn AnalyzerDb, function: FunctionId) -> Self {
+198        Self {
+199            db,
+200            function,
+201            body: RefCell::new(FunctionBody::default()),
+202            diagnostics: RefCell::new(vec![]),
+203        }
+204    }
+205
+206    pub fn function_return_type(&self) -> Result<TypeId, TypeError> {
+207        self.function.signature(self.db).return_type.clone()
+208    }
+209
+210    pub fn map_variable_type<T>(&self, node: &Node<T>, typ: TypeId) {
+211        self.add_node(node);
+212        self.body
+213            .borrow_mut()
+214            .var_types
+215            .insert(node.id, typ)
+216            .expect_none("variable has already registered")
+217    }
+218
+219    pub fn map_pattern_matrix(&self, node: &Node<ast::FuncStmt>, matrix: PatternMatrix) {
+220        debug_assert!(matches!(node.kind, ast::FuncStmt::Match { .. }));
+221        self.body
+222            .borrow_mut()
+223            .matches
+224            .insert(node.id, matrix)
+225            .expect_none("match statement attributes already exists")
+226    }
+227
+228    fn add_node<T>(&self, node: &Node<T>) {
+229        self.body.borrow_mut().spans.insert(node.id, node.span);
+230    }
+231}
+232
+233impl<'a> AnalyzerContext for FunctionScope<'a> {
+234    fn db(&self) -> &dyn AnalyzerDb {
+235        self.db
+236    }
+237
+238    fn add_diagnostic(&self, diag: Diagnostic) {
+239        self.diagnostics.borrow_mut().push(diag)
+240    }
+241
+242    fn add_expression(&self, node: &Node<ast::Expr>, attributes: ExpressionAttributes) {
+243        self.add_node(node);
+244        self.body
+245            .borrow_mut()
+246            .expressions
+247            .insert(node.id, attributes)
+248            .expect_none("expression attributes already exist");
+249    }
+250
+251    fn update_expression(&self, node: &Node<ast::Expr>, f: &dyn Fn(&mut ExpressionAttributes)) {
+252        f(self
+253            .body
+254            .borrow_mut()
+255            .expressions
+256            .get_mut(&node.id)
+257            .unwrap())
+258    }
+259
+260    fn expr_typ(&self, expr: &Node<Expr>) -> Type {
+261        self.body
+262            .borrow()
+263            .expressions
+264            .get(&expr.id)
+265            .unwrap()
+266            .typ
+267            .typ(self.db())
+268    }
+269
+270    fn add_constant(&self, _name: &Node<ast::SmolStr>, expr: &Node<ast::Expr>, value: Constant) {
+271        self.body
+272            .borrow_mut()
+273            .expressions
+274            .get_mut(&expr.id)
+275            .expect("expression attributes must exist before adding constant value")
+276            .const_value = Some(value);
+277    }
+278
+279    fn constant_value_by_name(
+280        &self,
+281        _name: &ast::SmolStr,
+282        _span: Span,
+283    ) -> Result<Option<Constant>, IncompleteItem> {
+284        Ok(None)
+285    }
+286
+287    fn parent(&self) -> Item {
+288        self.function.parent(self.db())
+289    }
+290
+291    fn module(&self) -> ModuleId {
+292        self.function.module(self.db())
+293    }
+294
+295    fn parent_function(&self) -> FunctionId {
+296        self.function
+297    }
+298
+299    fn add_call(&self, node: &Node<ast::Expr>, call_type: CallType) {
+300        // TODO: should probably take the Expr::Call node, rather than the function node
+301        self.add_node(node);
+302        self.body
+303            .borrow_mut()
+304            .calls
+305            .insert(node.id, call_type)
+306            .expect_none("call attributes already exist");
+307    }
+308    fn get_call(&self, node: &Node<ast::Expr>) -> Option<CallType> {
+309        self.body.borrow().calls.get(&node.id).cloned()
+310    }
+311
+312    fn is_in_function(&self) -> bool {
+313        true
+314    }
+315
+316    fn inherits_type(&self, _typ: BlockScopeType) -> bool {
+317        false
+318    }
+319
+320    fn resolve_name(&self, name: &str, span: Span) -> Result<Option<NamedThing>, IncompleteItem> {
+321        let sig = self.function.signature(self.db);
+322
+323        if name == "self" {
+324            return Ok(Some(NamedThing::SelfValue {
+325                decl: sig.self_decl,
+326                parent: self.function.sig(self.db).self_item(self.db),
+327                span: self.function.self_span(self.db),
+328            }));
+329        }
+330
+331        // Getting param names and spans should be simpler
+332        let param = sig.params.iter().find_map(|param| {
+333            (param.name == name).then(|| {
+334                let span = self
+335                    .function
+336                    .data(self.db)
+337                    .ast
+338                    .kind
+339                    .sig
+340                    .kind
+341                    .args
+342                    .iter()
+343                    .find_map(|param| (param.name() == name).then(|| param.name_span()))
+344                    .expect("found param type but not span");
+345
+346                NamedThing::Variable {
+347                    name: name.into(),
+348                    typ: param.typ.clone(),
+349                    is_const: false,
+350                    span,
+351                }
+352            })
+353        });
+354
+355        if let Some(param) = param {
+356            Ok(Some(param))
+357        } else {
+358            let resolved =
+359                if let Item::Type(TypeDef::Contract(contract)) = self.function.parent(self.db) {
+360                    contract.resolve_name(self.db, name)
+361                } else {
+362                    self.function.module(self.db).resolve_name(self.db, name)
+363                }?;
+364
+365            if let Some(named_thing) = &resolved {
+366                check_visibility(self, named_thing, span);
+367            }
+368
+369            Ok(resolved)
+370        }
+371    }
+372
+373    fn resolve_path(&self, path: &ast::Path, span: Span) -> Result<NamedThing, FatalError> {
+374        let resolved = self
+375            .function
+376            .module(self.db())
+377            .resolve_path_internal(self.db(), path);
+378
+379        let mut err = None;
+380        for diagnostic in resolved.diagnostics.iter() {
+381            err = Some(self.register_diag(diagnostic.clone()));
+382        }
+383
+384        if let Some(err) = err {
+385            return Err(FatalError::new(err));
+386        }
+387
+388        if let Some(named_thing) = resolved.value {
+389            check_visibility(self, &named_thing, span);
+390            Ok(named_thing)
+391        } else {
+392            let err = self.error("unresolved path item", span, "not found");
+393            Err(FatalError::new(err))
+394        }
+395    }
+396
+397    fn resolve_visible_path(&self, path: &ast::Path) -> Option<NamedThing> {
+398        let resolved = self
+399            .function
+400            .module(self.db())
+401            .resolve_path_internal(self.db(), path);
+402
+403        if resolved.diagnostics.len() > 0 {
+404            return None;
+405        }
+406
+407        let named_thing = resolved.value?;
+408        if is_visible(self, &named_thing) {
+409            Some(named_thing)
+410        } else {
+411            None
+412        }
+413    }
+414
+415    fn resolve_any_path(&self, path: &ast::Path) -> Option<NamedThing> {
+416        let resolved = self
+417            .function
+418            .module(self.db())
+419            .resolve_path_internal(self.db(), path);
+420
+421        if resolved.diagnostics.len() > 0 {
+422            return None;
+423        }
+424
+425        resolved.value
+426    }
+427
+428    fn get_context_type(&self) -> Option<TypeId> {
+429        if let Ok(Some(NamedThing::Item(Item::Type(TypeDef::Struct(id))))) =
+430            self.resolve_name("Context", Span::dummy())
+431        {
+432            if id.module(self.db()).ingot(self.db()).name(self.db()) == "std" {
+433                return Some(self.db().intern_type(Type::Struct(id)));
+434            }
+435        }
+436
+437        None
+438    }
+439}
+440
+441pub struct BlockScope<'a, 'b> {
+442    pub root: &'a FunctionScope<'b>,
+443    pub parent: Option<&'a BlockScope<'a, 'b>>,
+444    /// Maps Name -> (Type, is_const, span)
+445    pub variable_defs: BTreeMap<String, (TypeId, bool, Span)>,
+446    pub constant_defs: RefCell<BTreeMap<String, Constant>>,
+447    pub typ: BlockScopeType,
+448}
+449
+450#[derive(Clone, Debug, PartialEq, Eq)]
+451pub enum BlockScopeType {
+452    Function,
+453    IfElse,
+454    Match,
+455    MatchArm,
+456    Loop,
+457    Unsafe,
+458}
+459
+460impl AnalyzerContext for BlockScope<'_, '_> {
+461    fn db(&self) -> &dyn AnalyzerDb {
+462        self.root.db
+463    }
+464
+465    fn resolve_name(&self, name: &str, span: Span) -> Result<Option<NamedThing>, IncompleteItem> {
+466        if let Some(var) =
+467            self.variable_defs
+468                .get(name)
+469                .map(|(typ, is_const, span)| NamedThing::Variable {
+470                    name: name.into(),
+471                    typ: Ok(*typ),
+472                    is_const: *is_const,
+473                    span: *span,
+474                })
+475        {
+476            Ok(Some(var))
+477        } else if let Some(parent) = self.parent {
+478            parent.resolve_name(name, span)
+479        } else {
+480            self.root.resolve_name(name, span)
+481        }
+482    }
+483
+484    fn add_expression(&self, node: &Node<ast::Expr>, attributes: ExpressionAttributes) {
+485        self.root.add_expression(node, attributes)
+486    }
+487
+488    fn update_expression(&self, node: &Node<ast::Expr>, f: &dyn Fn(&mut ExpressionAttributes)) {
+489        self.root.update_expression(node, f)
+490    }
+491
+492    fn expr_typ(&self, expr: &Node<Expr>) -> Type {
+493        self.root.expr_typ(expr)
+494    }
+495
+496    fn add_constant(&self, name: &Node<ast::SmolStr>, expr: &Node<ast::Expr>, value: Constant) {
+497        self.constant_defs
+498            .borrow_mut()
+499            .insert(name.kind.clone().to_string(), value.clone())
+500            .expect_none("expression attributes already exist");
+501
+502        self.root.add_constant(name, expr, value)
+503    }
+504
+505    fn constant_value_by_name(
+506        &self,
+507        name: &ast::SmolStr,
+508        span: Span,
+509    ) -> Result<Option<Constant>, IncompleteItem> {
+510        if let Some(constant) = self.constant_defs.borrow().get(name.as_str()) {
+511            Ok(Some(constant.clone()))
+512        } else if let Some(parent) = self.parent {
+513            parent.constant_value_by_name(name, span)
+514        } else {
+515            match self.resolve_name(name, span)? {
+516                Some(NamedThing::Item(Item::Constant(constant))) => {
+517                    Ok(constant.constant_value(self.db()).ok())
+518                }
+519                _ => Ok(None),
+520            }
+521        }
+522    }
+523
+524    fn parent(&self) -> Item {
+525        Item::Function(self.root.function)
+526    }
+527
+528    fn module(&self) -> ModuleId {
+529        self.root.module()
+530    }
+531
+532    fn parent_function(&self) -> FunctionId {
+533        self.root.function
+534    }
+535
+536    fn add_call(&self, node: &Node<ast::Expr>, call_type: CallType) {
+537        self.root.add_call(node, call_type)
+538    }
+539
+540    fn get_call(&self, node: &Node<ast::Expr>) -> Option<CallType> {
+541        self.root.get_call(node)
+542    }
+543
+544    fn is_in_function(&self) -> bool {
+545        true
+546    }
+547
+548    fn inherits_type(&self, typ: BlockScopeType) -> bool {
+549        self.typ == typ || self.parent.map_or(false, |scope| scope.inherits_type(typ))
+550    }
+551
+552    fn resolve_path(&self, path: &ast::Path, span: Span) -> Result<NamedThing, FatalError> {
+553        self.root.resolve_path(path, span)
+554    }
+555
+556    fn resolve_visible_path(&self, path: &ast::Path) -> Option<NamedThing> {
+557        self.root.resolve_visible_path(path)
+558    }
+559
+560    fn resolve_any_path(&self, path: &ast::Path) -> Option<NamedThing> {
+561        self.root.resolve_any_path(path)
+562    }
+563
+564    fn add_diagnostic(&self, diag: Diagnostic) {
+565        self.root.diagnostics.borrow_mut().push(diag)
+566    }
+567
+568    fn get_context_type(&self) -> Option<TypeId> {
+569        self.root.get_context_type()
+570    }
+571}
+572
+573impl<'a, 'b> BlockScope<'a, 'b> {
+574    pub fn new(root: &'a FunctionScope<'b>, typ: BlockScopeType) -> Self {
+575        BlockScope {
+576            root,
+577            parent: None,
+578            variable_defs: BTreeMap::new(),
+579            constant_defs: RefCell::new(BTreeMap::new()),
+580            typ,
+581        }
+582    }
+583
+584    pub fn new_child(&'a self, typ: BlockScopeType) -> Self {
+585        BlockScope {
+586            root: self.root,
+587            parent: Some(self),
+588            variable_defs: BTreeMap::new(),
+589            constant_defs: RefCell::new(BTreeMap::new()),
+590            typ,
+591        }
+592    }
+593
+594    /// Add a variable to the block scope.
+595    pub fn add_var(
+596        &mut self,
+597        name: &str,
+598        typ: TypeId,
+599        is_const: bool,
+600        span: Span,
+601    ) -> Result<(), AlreadyDefined> {
+602        match self.resolve_name(name, span) {
+603            Ok(Some(NamedThing::SelfValue { .. })) => {
+604                let err = self.error(
+605                    "`self` can't be used as a variable name",
+606                    span,
+607                    "expected a name, found keyword `self`",
+608                );
+609                Err(AlreadyDefined::new(err))
+610            }
+611
+612            Ok(Some(named_item)) => {
+613                if named_item.is_builtin() {
+614                    let err = self.error(
+615                        &format!(
+616                            "variable name conflicts with built-in {}",
+617                            named_item.item_kind_display_name(),
+618                        ),
+619                        span,
+620                        &format!(
+621                            "`{}` is a built-in {}",
+622                            name,
+623                            named_item.item_kind_display_name()
+624                        ),
+625                    );
+626                    Err(AlreadyDefined::new(err))
+627                } else {
+628                    // It's (currently) an error to shadow a variable in a nested scope
+629                    let err = self.duplicate_name_error(
+630                        &format!("duplicate definition of variable `{name}`"),
+631                        name,
+632                        named_item
+633                            .name_span(self.db())
+634                            .expect("missing name_span of non-builtin"),
+635                        span,
+636                    );
+637                    Err(AlreadyDefined::new(err))
+638                }
+639            }
+640            _ => {
+641                self.variable_defs
+642                    .insert(name.to_string(), (typ, is_const, span));
+643                Ok(())
+644            }
+645        }
+646    }
+647}
+648
+649/// temporary helper until `BTreeMap::try_insert` is stabilized
+650trait OptionExt {
+651    fn expect_none(self, msg: &str);
+652}
+653
+654impl<T> OptionExt for Option<T> {
+655    fn expect_none(self, msg: &str) {
+656        if self.is_some() {
+657            panic!("{}", msg)
+658        }
+659    }
+660}
+661
+662/// Check an item visibility and sink diagnostics if an item is invisible from
+663/// the scope.
+664pub fn check_visibility(context: &dyn AnalyzerContext, named_thing: &NamedThing, span: Span) {
+665    if let NamedThing::Item(item) = named_thing {
+666        let item_module = item
+667            .module(context.db())
+668            .unwrap_or_else(|| context.module());
+669        if !item.is_public(context.db()) && item_module != context.module() {
+670            let module_name = item_module.name(context.db());
+671            let item_name = item.name(context.db());
+672            let item_span = item.name_span(context.db()).unwrap_or(span);
+673            let item_kind_name = item.item_kind_display_name();
+674            context.fancy_error(
+675                &format!("the {item_kind_name} `{item_name}` is private",),
+676                vec![
+677                    Label::primary(span, format!("this {item_kind_name} is not `pub`")),
+678                    Label::secondary(item_span, format!("`{item_name}` is defined here")),
+679                ],
+680                vec![
+681                    format!("`{item_name}` can only be used within `{module_name}`"),
+682                    format!(
+683                        "Hint: use `pub` to make `{item_name}` visible from outside of `{module_name}`",
+684                    ),
+685                ],
+686            );
+687        }
+688    }
+689}
+690
+691fn is_visible(context: &dyn AnalyzerContext, named_thing: &NamedThing) -> bool {
+692    if let NamedThing::Item(item) = named_thing {
+693        let item_module = item
+694            .module(context.db())
+695            .unwrap_or_else(|| context.module());
+696        item.is_public(context.db()) || item_module == context.module()
+697    } else {
+698        true
+699    }
+700}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/namespace/types.rs.html b/compiler-docs/src/fe_analyzer/namespace/types.rs.html new file mode 100644 index 0000000000..bf82009d9c --- /dev/null +++ b/compiler-docs/src/fe_analyzer/namespace/types.rs.html @@ -0,0 +1,854 @@ +types.rs - source

fe_analyzer/namespace/
types.rs

1use crate::context::AnalyzerContext;
+2use crate::display::DisplayWithDb;
+3use crate::display::Displayable;
+4use crate::errors::TypeError;
+5use crate::namespace::items::{
+6    ContractId, EnumId, FunctionId, FunctionSigId, ImplId, Item, StructId, TraitId,
+7};
+8use crate::AnalyzerDb;
+9
+10use fe_common::impl_intern_key;
+11use fe_common::Span;
+12use num_bigint::BigInt;
+13use num_traits::ToPrimitive;
+14use smol_str::SmolStr;
+15use std::fmt;
+16use std::rc::Rc;
+17use std::str::FromStr;
+18use strum::{AsRefStr, EnumIter, EnumString};
+19
+20pub fn u256_min() -> BigInt {
+21    BigInt::from(0)
+22}
+23
+24pub fn u256_max() -> BigInt {
+25    BigInt::from(2).pow(256) - 1
+26}
+27
+28pub fn i256_max() -> BigInt {
+29    BigInt::from(2).pow(255) - 1
+30}
+31
+32pub fn i256_min() -> BigInt {
+33    BigInt::from(-2).pow(255)
+34}
+35
+36pub fn address_max() -> BigInt {
+37    BigInt::from(2).pow(160) - 1
+38}
+39
+40/// Names that can be used to build identifiers without collision.
+41pub trait SafeNames {
+42    /// Name in the lower snake format (e.g. lower_snake_case).
+43    fn lower_snake(&self) -> String;
+44}
+45
+46#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+47pub enum Type {
+48    Base(Base),
+49    Array(Array),
+50    Map(Map),
+51    Tuple(Tuple),
+52    String(FeString),
+53    /// An "external" contract. Effectively just a `newtype`d address.
+54    Contract(ContractId),
+55    /// The type of a contract while it's being executed. Ie. the type
+56    /// of `self` within a contract function.
+57    SelfContract(ContractId),
+58    // The type when `Self` is used within a trait or struct
+59    SelfType(TraitOrType),
+60    Struct(StructId),
+61    Enum(EnumId),
+62    Generic(Generic),
+63    SPtr(TypeId),
+64    Mut(TypeId),
+65}
+66
+67#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+68pub enum TraitOrType {
+69    TraitId(TraitId),
+70    TypeId(TypeId),
+71}
+72
+73type TraitFunctionLookup = (Vec<(FunctionId, ImplId)>, Vec<(FunctionId, ImplId)>);
+74
+75#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone)]
+76pub struct TypeId(pub(crate) u32);
+77impl_intern_key!(TypeId);
+78impl TypeId {
+79    pub fn unit(db: &dyn AnalyzerDb) -> Self {
+80        db.intern_type(Type::unit())
+81    }
+82    pub fn bool(db: &dyn AnalyzerDb) -> Self {
+83        db.intern_type(Type::bool())
+84    }
+85    pub fn int(db: &dyn AnalyzerDb, int: Integer) -> Self {
+86        db.intern_type(Type::int(int))
+87    }
+88    pub fn address(db: &dyn AnalyzerDb) -> Self {
+89        db.intern_type(Type::Base(Base::Address))
+90    }
+91    pub fn base(db: &dyn AnalyzerDb, t: Base) -> Self {
+92        db.intern_type(Type::Base(t))
+93    }
+94    pub fn tuple(db: &dyn AnalyzerDb, items: &[TypeId]) -> Self {
+95        db.intern_type(Type::Tuple(Tuple {
+96            items: items.into(),
+97        }))
+98    }
+99
+100    pub fn typ(&self, db: &dyn AnalyzerDb) -> Type {
+101        db.lookup_intern_type(*self)
+102    }
+103    pub fn deref_typ(&self, db: &dyn AnalyzerDb) -> Type {
+104        self.deref(db).typ(db)
+105    }
+106    pub fn deref(self, db: &dyn AnalyzerDb) -> TypeId {
+107        match self.typ(db) {
+108            Type::SPtr(inner) => inner,
+109            Type::Mut(inner) => inner.deref(db),
+110            Type::SelfType(TraitOrType::TypeId(inner)) => inner,
+111            _ => self,
+112        }
+113    }
+114    pub fn make_sptr(self, db: &dyn AnalyzerDb) -> TypeId {
+115        Type::SPtr(self).id(db)
+116    }
+117
+118    pub fn has_fixed_size(&self, db: &dyn AnalyzerDb) -> bool {
+119        self.typ(db).has_fixed_size(db)
+120    }
+121
+122    /// `true` if Type::Base or Type::Contract (which is just an Address)
+123    pub fn is_primitive(&self, db: &dyn AnalyzerDb) -> bool {
+124        matches!(self.typ(db), Type::Base(_) | Type::Contract(_))
+125    }
+126    pub fn is_bool(&self, db: &dyn AnalyzerDb) -> bool {
+127        matches!(self.typ(db), Type::Base(Base::Bool))
+128    }
+129    pub fn is_contract(&self, db: &dyn AnalyzerDb) -> bool {
+130        matches!(self.typ(db), Type::Contract(_) | Type::SelfContract(_))
+131    }
+132    pub fn is_integer(&self, db: &dyn AnalyzerDb) -> bool {
+133        matches!(self.typ(db), Type::Base(Base::Numeric(_)))
+134    }
+135    pub fn is_map(&self, db: &dyn AnalyzerDb) -> bool {
+136        matches!(self.typ(db), Type::Map(_))
+137    }
+138    pub fn is_string(&self, db: &dyn AnalyzerDb) -> bool {
+139        matches!(self.typ(db), Type::String(_))
+140    }
+141    pub fn is_self_ty(&self, db: &dyn AnalyzerDb) -> bool {
+142        matches!(self.typ(db), Type::SelfType(_))
+143    }
+144    pub fn as_struct(&self, db: &dyn AnalyzerDb) -> Option<StructId> {
+145        if let Type::Struct(id) = self.typ(db) {
+146            Some(id)
+147        } else {
+148            None
+149        }
+150    }
+151    pub fn as_trait_or_type(&self) -> TraitOrType {
+152        TraitOrType::TypeId(*self)
+153    }
+154    pub fn is_struct(&self, db: &dyn AnalyzerDb) -> bool {
+155        matches!(self.typ(db), Type::Struct(_))
+156    }
+157    pub fn is_sptr(&self, db: &dyn AnalyzerDb) -> bool {
+158        match self.typ(db) {
+159            Type::SPtr(_) => true,
+160            Type::Mut(inner) => inner.is_sptr(db),
+161            _ => false,
+162        }
+163    }
+164    pub fn is_generic(&self, db: &dyn AnalyzerDb) -> bool {
+165        matches!(self.deref(db).typ(db), Type::Generic(_))
+166    }
+167
+168    pub fn is_mut(&self, db: &dyn AnalyzerDb) -> bool {
+169        matches!(self.typ(db), Type::Mut(_))
+170    }
+171
+172    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+173        self.typ(db).name(db)
+174    }
+175
+176    pub fn kind_display_name(&self, db: &dyn AnalyzerDb) -> &str {
+177        match self.typ(db) {
+178            Type::Contract(_) | Type::SelfContract(_) => "contract",
+179            Type::Struct(_) => "struct",
+180            Type::Array(_) => "array",
+181            Type::Tuple(_) => "tuple",
+182            _ => "type",
+183        }
+184    }
+185
+186    /// Return the `impl` for the given trait. There can only ever be a single
+187    /// implementation per concrete type and trait.
+188    pub fn get_impl_for(&self, db: &dyn AnalyzerDb, trait_: TraitId) -> Option<ImplId> {
+189        db.impl_for(*self, trait_)
+190    }
+191
+192    /// Looks up all possible candidates of the given function name that are implemented via traits.
+193    /// Groups results in two lists, the first contains all theoretical possible candidates and
+194    /// the second contains only those that are actually callable because the trait is in scope.
+195    pub fn trait_function_candidates(
+196        &self,
+197        context: &mut dyn AnalyzerContext,
+198        fn_name: &str,
+199    ) -> TraitFunctionLookup {
+200        let candidates = context
+201            .db()
+202            .all_impls(*self)
+203            .iter()
+204            .cloned()
+205            .filter_map(|_impl| {
+206                _impl
+207                    .function(context.db(), fn_name)
+208                    .map(|fun| (fun, _impl))
+209            })
+210            .collect::<Vec<_>>();
+211
+212        let in_scope_candidates = candidates
+213            .iter()
+214            .cloned()
+215            .filter(|(_, _impl)| {
+216                context
+217                    .module()
+218                    .is_in_scope(context.db(), Item::Trait(_impl.trait_id(context.db())))
+219            })
+220            .collect::<Vec<_>>();
+221
+222        (candidates, in_scope_candidates)
+223    }
+224
+225    /// Signature for the function with the given name defined directly on the type.
+226    /// Does not consider trait impls.
+227    pub fn function_sig(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId> {
+228        match self.typ(db) {
+229            Type::SPtr(inner) => inner.function_sig(db, name),
+230            Type::Contract(id) => id.function(db, name).map(|fun| fun.sig(db)),
+231            Type::SelfContract(id) => id.function(db, name).map(|fun| fun.sig(db)),
+232            Type::Struct(id) => id.function(db, name).map(|fun| fun.sig(db)),
+233            Type::Enum(id) => id.function(db, name).map(|fun| fun.sig(db)),
+234            // TODO: This won't hold when we support multiple bounds
+235            Type::Generic(inner) => inner
+236                .bounds
+237                .first()
+238                .and_then(|bound| bound.function(db, name)),
+239            _ => None,
+240        }
+241    }
+242
+243    /// Like `function_sig` but returns a `Vec<FunctionSigId>` which not only
+244    /// considers functions natively implemented on the type but also those
+245    /// that are provided by implemented traits on the type.
+246    pub fn function_sigs(&self, db: &dyn AnalyzerDb, name: &str) -> Rc<[FunctionSigId]> {
+247        db.function_sigs(*self, name.into())
+248    }
+249
+250    pub fn self_function(&self, db: &dyn AnalyzerDb, name: &str) -> Option<FunctionSigId> {
+251        let fun = self.function_sig(db, name)?;
+252        fun.takes_self(db).then_some(fun)
+253    }
+254
+255    /// Returns `true` if the type qualifies to implement the `Emittable` trait
+256    /// TODO: This function should be removed when we add `Encode / Decode`
+257    /// trait
+258    pub fn is_emittable(self, db: &dyn AnalyzerDb) -> bool {
+259        matches!(self.typ(db), Type::Struct(_)) && self.is_encodable(db).unwrap_or(false)
+260    }
+261
+262    /// Returns `true` if the type is encodable in Solidity ABI.
+263    /// TODO: This function must be removed when we add `Encode`/`Decode` trait.
+264    pub fn is_encodable(self, db: &dyn AnalyzerDb) -> Result<bool, TypeError> {
+265        match self.typ(db) {
+266            Type::Base(_) | Type::String(_) | Type::Contract(_) => Ok(true),
+267            Type::Array(arr) => arr.inner.is_encodable(db),
+268            Type::Struct(sid) => {
+269                // Returns `false` if diagnostics is not empty.
+270                // The diagnostics is properly emitted in struct definition site, so there is no
+271                // need to emit the diagnostics here.
+272                if !db.struct_dependency_graph(sid).diagnostics.is_empty() {
+273                    return Ok(false);
+274                };
+275                let mut res = true;
+276                // We have to continue the iteration even if an item is NOT encodable so that we
+277                // could propagate an error which returned from `item.is_encodable()` for
+278                // keeping consistency.
+279                for (_, &fid) in sid.fields(db).iter() {
+280                    res &= fid.typ(db)?.is_encodable(db)?;
+281                }
+282                Ok(res)
+283            }
+284            Type::Tuple(tup) => {
+285                let mut res = true;
+286                // We have to continue the iteration even if an item is NOT encodable so that we
+287                // could propagate an error which returned from `item.is_encodable()` for
+288                // keeping consistency.
+289                for item in tup.items.iter() {
+290                    res &= item.is_encodable(db)?;
+291                }
+292                Ok(res)
+293            }
+294            Type::Mut(inner) => inner.is_encodable(db),
+295            Type::SelfType(id) => match id {
+296                TraitOrType::TraitId(_) => Ok(false),
+297                TraitOrType::TypeId(id) => id.is_encodable(db),
+298            },
+299            Type::Map(_)
+300            | Type::SelfContract(_)
+301            | Type::Generic(_)
+302            | Type::Enum(_)
+303            | Type::SPtr(_) => Ok(false),
+304        }
+305    }
+306}
+307
+308#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
+309pub enum Base {
+310    Numeric(Integer),
+311    Bool,
+312    Address,
+313    Unit,
+314}
+315
+316impl Base {
+317    pub fn name(&self) -> SmolStr {
+318        match self {
+319            Base::Numeric(num) => num.as_ref().into(),
+320            Base::Bool => "bool".into(),
+321            Base::Address => "address".into(),
+322            Base::Unit => "()".into(),
+323        }
+324    }
+325    pub fn u256() -> Base {
+326        Base::Numeric(Integer::U256)
+327    }
+328}
+329
+330#[derive(
+331    Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, AsRefStr, EnumString, EnumIter,
+332)]
+333#[strum(serialize_all = "snake_case")]
+334pub enum Integer {
+335    U256,
+336    U128,
+337    U64,
+338    U32,
+339    U16,
+340    U8,
+341    I256,
+342    I128,
+343    I64,
+344    I32,
+345    I16,
+346    I8,
+347}
+348
+349pub const U256: Base = Base::Numeric(Integer::U256);
+350
+351#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+352pub struct Array {
+353    pub size: usize,
+354    pub inner: TypeId,
+355}
+356
+357#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+358pub struct Map {
+359    pub key: TypeId,
+360    pub value: TypeId,
+361}
+362
+363#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
+364pub struct Generic {
+365    pub name: SmolStr,
+366    pub bounds: Rc<[TraitId]>,
+367}
+368
+369#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+370pub struct Tuple {
+371    pub items: Rc<[TypeId]>,
+372}
+373
+374#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Ord, Eq, Hash)]
+375pub struct FeString {
+376    pub max_size: usize,
+377}
+378
+379#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+380pub struct FunctionSignature {
+381    pub self_decl: Option<SelfDecl>,
+382    pub ctx_decl: Option<CtxDecl>,
+383    pub params: Vec<FunctionParam>,
+384    pub return_type: Result<TypeId, TypeError>,
+385}
+386
+387#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+388pub struct SelfDecl {
+389    pub span: Span,
+390    pub mut_: Option<Span>,
+391}
+392
+393impl SelfDecl {
+394    pub fn is_mut(&self) -> bool {
+395        self.mut_.is_some()
+396    }
+397}
+398
+399#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+400pub struct CtxDecl {
+401    pub span: Span,
+402    pub mut_: Option<Span>,
+403}
+404
+405#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+406pub struct FunctionParam {
+407    label: Option<SmolStr>,
+408    pub name: SmolStr,
+409    pub typ: Result<TypeId, TypeError>,
+410}
+411impl FunctionParam {
+412    pub fn new(label: Option<&str>, name: &str, typ: Result<TypeId, TypeError>) -> Self {
+413        Self {
+414            label: label.map(SmolStr::new),
+415            name: name.into(),
+416            typ,
+417        }
+418    }
+419    pub fn label(&self) -> Option<&str> {
+420        match &self.label {
+421            Some(label) if label == "_" => None,
+422            Some(label) => Some(label),
+423            None => Some(&self.name),
+424        }
+425    }
+426}
+427
+428#[derive(
+429    Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, EnumString, AsRefStr, EnumIter,
+430)]
+431pub enum GenericType {
+432    Array,
+433    String,
+434    Map,
+435}
+436
+437impl GenericType {
+438    pub fn name(&self) -> SmolStr {
+439        self.as_ref().into()
+440    }
+441    pub fn params(&self) -> Vec<GenericParam> {
+442        match self {
+443            GenericType::String => vec![GenericParam {
+444                name: "max size".into(),
+445                kind: GenericParamKind::Int,
+446            }],
+447            GenericType::Map => vec![
+448                GenericParam {
+449                    name: "key".into(),
+450                    kind: GenericParamKind::PrimitiveType,
+451                },
+452                GenericParam {
+453                    name: "value".into(),
+454                    kind: GenericParamKind::AnyType,
+455                },
+456            ],
+457            GenericType::Array => vec![
+458                GenericParam {
+459                    name: "element type".into(),
+460                    kind: GenericParamKind::AnyType,
+461                },
+462                GenericParam {
+463                    name: "size".into(),
+464                    kind: GenericParamKind::Int,
+465                },
+466            ],
+467        }
+468    }
+469
+470    // see traversal::types::apply_generic_type_args for error checking
+471    pub fn apply(&self, db: &dyn AnalyzerDb, args: &[GenericArg]) -> Option<TypeId> {
+472        let typ = match self {
+473            GenericType::String => match args {
+474                [GenericArg::Int(max_size)] => Some(Type::String(FeString {
+475                    max_size: *max_size,
+476                })),
+477                _ => None,
+478            },
+479            GenericType::Map => match args {
+480                [GenericArg::Type(key), GenericArg::Type(value)] => Some(Type::Map(Map {
+481                    key: *key,
+482                    value: *value,
+483                })),
+484                _ => None,
+485            },
+486            GenericType::Array => match args {
+487                [GenericArg::Type(element), GenericArg::Int(size)] => Some(Type::Array(Array {
+488                    size: *size,
+489                    inner: *element,
+490                })),
+491                _ => None,
+492            },
+493        }?;
+494        Some(db.intern_type(typ))
+495    }
+496}
+497
+498pub struct GenericParam {
+499    pub name: SmolStr,
+500    pub kind: GenericParamKind,
+501}
+502
+503#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+504pub enum GenericParamKind {
+505    Int,
+506
+507    // Ideally these would be represented as trait constraints.
+508    PrimitiveType,
+509    // FixedSizeType, // not needed yet
+510    AnyType,
+511}
+512
+513#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+514pub enum GenericArg {
+515    Int(usize),
+516    Type(TypeId),
+517}
+518
+519impl Integer {
+520    /// Returns `true` if the integer is signed, otherwise `false`
+521    pub fn is_signed(&self) -> bool {
+522        matches!(
+523            self,
+524            Integer::I256
+525                | Integer::I128
+526                | Integer::I64
+527                | Integer::I32
+528                | Integer::I16
+529                | Integer::I8
+530        )
+531    }
+532
+533    pub fn size(&self) -> usize {
+534        match self {
+535            Integer::U256 | Integer::I256 => 32,
+536            Integer::U128 | Integer::I128 => 16,
+537            Integer::U64 | Integer::I64 => 8,
+538            Integer::U32 | Integer::I32 => 4,
+539            Integer::U16 | Integer::I16 => 2,
+540            Integer::U8 | Integer::I8 => 1,
+541        }
+542    }
+543
+544    /// Returns size of integer type in bits.
+545    pub fn bits(&self) -> usize {
+546        self.size() * 8
+547    }
+548
+549    /// Returns `true` if the integer is at least the same size (or larger) than
+550    /// `other`
+551    pub fn can_hold(&self, other: Integer) -> bool {
+552        self.size() >= other.size()
+553    }
+554
+555    /// Returns `true` if `num` represents a number that fits the type
+556    pub fn fits(&self, num: BigInt) -> bool {
+557        match self {
+558            Integer::U8 => num.to_u8().is_some(),
+559            Integer::U16 => num.to_u16().is_some(),
+560            Integer::U32 => num.to_u32().is_some(),
+561            Integer::U64 => num.to_u64().is_some(),
+562            Integer::U128 => num.to_u128().is_some(),
+563            Integer::I8 => num.to_i8().is_some(),
+564            Integer::I16 => num.to_i16().is_some(),
+565            Integer::I32 => num.to_i32().is_some(),
+566            Integer::I64 => num.to_i64().is_some(),
+567            Integer::I128 => num.to_i128().is_some(),
+568            Integer::U256 => num >= u256_min() && num <= u256_max(),
+569            Integer::I256 => num >= i256_min() && num <= i256_max(),
+570        }
+571    }
+572
+573    /// Returns max value of the integer type.
+574    pub fn max_value(&self) -> BigInt {
+575        match self {
+576            Integer::U256 => u256_max(),
+577            Integer::U128 => u128::MAX.into(),
+578            Integer::U64 => u64::MAX.into(),
+579            Integer::U32 => u32::MAX.into(),
+580            Integer::U16 => u16::MAX.into(),
+581            Integer::U8 => u8::MAX.into(),
+582            Integer::I256 => i256_max(),
+583            Integer::I128 => i128::MAX.into(),
+584            Integer::I64 => i64::MAX.into(),
+585            Integer::I32 => i32::MAX.into(),
+586            Integer::I16 => i16::MAX.into(),
+587            Integer::I8 => i8::MAX.into(),
+588        }
+589    }
+590
+591    /// Returns min value of the integer type.
+592    pub fn min_value(&self) -> BigInt {
+593        match self {
+594            Integer::U256 => u256_min(),
+595            Integer::U128 => u128::MIN.into(),
+596            Integer::U64 => u64::MIN.into(),
+597            Integer::U32 => u32::MIN.into(),
+598            Integer::U16 => u16::MIN.into(),
+599            Integer::U8 => u8::MIN.into(),
+600            Integer::I256 => i256_min(),
+601            Integer::I128 => i128::MIN.into(),
+602            Integer::I64 => i64::MIN.into(),
+603            Integer::I32 => i32::MIN.into(),
+604            Integer::I16 => i16::MIN.into(),
+605            Integer::I8 => i8::MIN.into(),
+606        }
+607    }
+608}
+609
+610impl Type {
+611    pub fn id(&self, db: &dyn AnalyzerDb) -> TypeId {
+612        db.intern_type(self.clone())
+613    }
+614
+615    pub fn name(&self, db: &dyn AnalyzerDb) -> SmolStr {
+616        match self {
+617            Type::Base(inner) => inner.name(),
+618            _ => self.display(db).to_string().into(),
+619        }
+620    }
+621
+622    pub fn def_span(&self, context: &dyn AnalyzerContext) -> Option<Span> {
+623        match self {
+624            Self::Struct(id) => Some(id.span(context.db())),
+625            Self::Contract(id) | Self::SelfContract(id) => Some(id.span(context.db())),
+626            _ => None,
+627        }
+628    }
+629
+630    /// Creates an instance of bool.
+631    pub fn bool() -> Self {
+632        Type::Base(Base::Bool)
+633    }
+634
+635    /// Creates an instance of address.
+636    pub fn address() -> Self {
+637        Type::Base(Base::Address)
+638    }
+639
+640    /// Creates an instance of u256.
+641    pub fn u256() -> Self {
+642        Type::Base(Base::Numeric(Integer::U256))
+643    }
+644
+645    /// Creates an instance of u8.
+646    pub fn u8() -> Self {
+647        Type::Base(Base::Numeric(Integer::U8))
+648    }
+649
+650    /// Creates an instance of `()`.
+651    pub fn unit() -> Self {
+652        Type::Base(Base::Unit)
+653    }
+654
+655    pub fn is_unit(&self) -> bool {
+656        *self == Type::Base(Base::Unit)
+657    }
+658
+659    pub fn int(int_type: Integer) -> Self {
+660        Type::Base(Base::Numeric(int_type))
+661    }
+662
+663    pub fn has_fixed_size(&self, db: &dyn AnalyzerDb) -> bool {
+664        match self {
+665            Type::Base(_)
+666            | Type::Array(_)
+667            | Type::Tuple(_)
+668            | Type::String(_)
+669            | Type::Struct(_)
+670            | Type::Enum(_)
+671            | Type::Generic(_)
+672            | Type::Contract(_) => true,
+673            Type::Map(_) | Type::SelfContract(_) => false,
+674            Type::SelfType(inner) => match inner {
+675                TraitOrType::TraitId(_) => true,
+676                TraitOrType::TypeId(id) => id.has_fixed_size(db),
+677            },
+678            Type::SPtr(inner) | Type::Mut(inner) => inner.has_fixed_size(db),
+679        }
+680    }
+681}
+682
+683pub trait TypeDowncast {
+684    fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array>;
+685    fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple>;
+686    fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString>;
+687    fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map>;
+688    fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer>;
+689}
+690
+691impl TypeDowncast for TypeId {
+692    fn as_array(&self, db: &dyn AnalyzerDb) -> Option<Array> {
+693        match self.typ(db) {
+694            Type::Array(inner) => Some(inner),
+695            _ => None,
+696        }
+697    }
+698    fn as_tuple(&self, db: &dyn AnalyzerDb) -> Option<Tuple> {
+699        match self.typ(db) {
+700            Type::Tuple(inner) => Some(inner),
+701            _ => None,
+702        }
+703    }
+704    fn as_string(&self, db: &dyn AnalyzerDb) -> Option<FeString> {
+705        match self.typ(db) {
+706            Type::String(inner) => Some(inner),
+707            _ => None,
+708        }
+709    }
+710    fn as_map(&self, db: &dyn AnalyzerDb) -> Option<Map> {
+711        match self.typ(db) {
+712            Type::Map(inner) => Some(inner),
+713            _ => None,
+714        }
+715    }
+716    fn as_int(&self, db: &dyn AnalyzerDb) -> Option<Integer> {
+717        match self.typ(db) {
+718            Type::Base(Base::Numeric(int)) => Some(int),
+719            _ => None,
+720        }
+721    }
+722}
+723
+724impl From<Base> for Type {
+725    fn from(value: Base) -> Self {
+726        Type::Base(value)
+727    }
+728}
+729
+730impl DisplayWithDb for Type {
+731    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+732        use std::fmt::Display;
+733        match self {
+734            Type::Base(inner) => inner.fmt(f),
+735            Type::String(inner) => inner.fmt(f),
+736            Type::Array(arr) => {
+737                write!(f, "Array<{}, {}>", arr.inner.display(db), arr.size)
+738            }
+739            Type::Map(map) => {
+740                let Map { key, value } = map;
+741                write!(f, "Map<{}, {}>", key.display(db), value.display(db),)
+742            }
+743            Type::Tuple(id) => {
+744                write!(f, "(")?;
+745                let mut delim = "";
+746                for item in id.items.iter() {
+747                    write!(f, "{}{}", delim, item.display(db))?;
+748                    delim = ", ";
+749                }
+750                write!(f, ")")
+751            }
+752            Type::Contract(id) | Type::SelfContract(id) => write!(f, "{}", id.name(db)),
+753            Type::Struct(id) => write!(f, "{}", id.name(db)),
+754            Type::Enum(id) => write!(f, "{}", id.name(db)),
+755            Type::Generic(inner) => inner.fmt(f),
+756            Type::SPtr(inner) => write!(f, "SPtr<{}>", inner.display(db)),
+757            Type::Mut(inner) => write!(f, "mut {}", inner.display(db)),
+758            Type::SelfType(_) => write!(f, "Self"),
+759        }
+760    }
+761}
+762impl DisplayWithDb for TypeId {
+763    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+764        self.typ(db).format(db, f)
+765    }
+766}
+767
+768impl fmt::Display for Base {
+769    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+770        let name = match self {
+771            Base::Numeric(int) => return int.fmt(f),
+772            Base::Bool => "bool",
+773            Base::Address => "address",
+774            Base::Unit => "()",
+775        };
+776        write!(f, "{name}")
+777    }
+778}
+779
+780impl fmt::Display for Integer {
+781    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+782        let name = match self {
+783            Integer::U256 => "u256",
+784            Integer::U128 => "u128",
+785            Integer::U64 => "u64",
+786            Integer::U32 => "u32",
+787            Integer::U16 => "u16",
+788            Integer::U8 => "u8",
+789            Integer::I256 => "i256",
+790            Integer::I128 => "i128",
+791            Integer::I64 => "i64",
+792            Integer::I32 => "i32",
+793            Integer::I16 => "i16",
+794            Integer::I8 => "i8",
+795        };
+796        write!(f, "{name}")
+797    }
+798}
+799
+800impl fmt::Display for FeString {
+801    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+802        write!(f, "String<{}>", self.max_size)
+803    }
+804}
+805
+806impl DisplayWithDb for FunctionSignature {
+807    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+808        let FunctionSignature {
+809            self_decl,
+810            ctx_decl: _,
+811            params,
+812            return_type,
+813        } = self;
+814
+815        write!(f, "params: [")?;
+816        let mut delim = "";
+817        if let Some(s) = self_decl {
+818            write!(f, "{}self", if s.mut_.is_some() { "mut " } else { "" },)?;
+819            delim = ", ";
+820        }
+821
+822        for p in params {
+823            write!(
+824                f,
+825                "{}{{ label: {:?}, name: {}, typ: {} }}",
+826                delim,
+827                p.label,
+828                p.name,
+829                p.typ.as_ref().unwrap().display(db),
+830            )?;
+831            delim = ", ";
+832        }
+833        write!(f, "] -> {}", return_type.as_ref().unwrap().display(db))
+834    }
+835}
+836
+837impl fmt::Display for Generic {
+838    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+839        write!(f, "{}", self.name)
+840    }
+841}
+842
+843impl FromStr for Base {
+844    type Err = strum::ParseError;
+845
+846    fn from_str(s: &str) -> Result<Self, Self::Err> {
+847        match s {
+848            "bool" => Ok(Base::Bool),
+849            "address" => Ok(Base::Address),
+850            "()" => Ok(Base::Unit),
+851            _ => Ok(Base::Numeric(Integer::from_str(s)?)),
+852        }
+853    }
+854}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/operations.rs.html b/compiler-docs/src/fe_analyzer/operations.rs.html new file mode 100644 index 0000000000..0364a07575 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/operations.rs.html @@ -0,0 +1,179 @@ +operations.rs - source

fe_analyzer/
operations.rs

1use crate::context::AnalyzerContext;
+2use crate::errors::{BinaryOperationError, IndexingError};
+3use crate::namespace::types::{Array, Integer, Map, TraitOrType, Type, TypeDowncast, TypeId};
+4
+5use crate::traversal::types::{deref_type, try_coerce_type};
+6use fe_parser::{ast as fe, node::Node};
+7
+8/// Finds the type of an index operation and checks types.
+9///
+10/// e.g. `foo[42]`
+11pub fn index(
+12    context: &mut dyn AnalyzerContext,
+13    value: TypeId,
+14    indext: TypeId,
+15    index_expr: &Node<fe::Expr>,
+16) -> Result<TypeId, IndexingError> {
+17    match value.typ(context.db()) {
+18        Type::Array(array) => index_array(context, &array, indext, index_expr),
+19        Type::Map(map) => index_map(context, &map, indext, index_expr),
+20        Type::SPtr(inner) => {
+21            Ok(Type::SPtr(index(context, inner, indext, index_expr)?).id(context.db()))
+22        }
+23        Type::Mut(inner) => {
+24            Ok(Type::Mut(index(context, inner, indext, index_expr)?).id(context.db()))
+25        }
+26        Type::SelfType(id) => match id {
+27            TraitOrType::TypeId(inner) => index(context, inner, indext, index_expr),
+28            TraitOrType::TraitId(_) => Err(IndexingError::NotSubscriptable),
+29        },
+30        Type::Base(_)
+31        | Type::Tuple(_)
+32        | Type::String(_)
+33        | Type::Contract(_)
+34        | Type::SelfContract(_)
+35        | Type::Generic(_)
+36        | Type::Struct(_)
+37        | Type::Enum(_) => Err(IndexingError::NotSubscriptable),
+38    }
+39}
+40
+41pub fn expected_index_type(context: &mut dyn AnalyzerContext, obj: TypeId) -> Option<TypeId> {
+42    match obj.typ(context.db()) {
+43        Type::Array(_) => Some(Type::u256().id(context.db())),
+44        Type::Map(Map { key, .. }) => Some(key),
+45        Type::SPtr(inner) | Type::Mut(inner) => expected_index_type(context, inner),
+46        Type::SelfType(inner) => match inner {
+47            TraitOrType::TraitId(_) => None,
+48            TraitOrType::TypeId(id) => expected_index_type(context, id),
+49        },
+50        Type::Base(_)
+51        | Type::Tuple(_)
+52        | Type::String(_)
+53        | Type::Contract(_)
+54        | Type::SelfContract(_)
+55        | Type::Generic(_)
+56        | Type::Enum(_)
+57        | Type::Struct(_) => None,
+58    }
+59}
+60
+61fn index_array(
+62    context: &mut dyn AnalyzerContext,
+63    array: &Array,
+64    index: TypeId,
+65    index_expr: &Node<fe::Expr>,
+66) -> Result<TypeId, IndexingError> {
+67    let u256 = Type::u256().id(context.db());
+68    if try_coerce_type(context, Some(index_expr), index, u256, false).is_err() {
+69        return Err(IndexingError::WrongIndexType);
+70    }
+71
+72    Ok(array.inner)
+73}
+74
+75fn index_map(
+76    context: &mut dyn AnalyzerContext,
+77    map: &Map,
+78    index: TypeId,
+79    index_expr: &Node<fe::Expr>,
+80) -> Result<TypeId, IndexingError> {
+81    let Map { key, value } = map;
+82
+83    if try_coerce_type(context, Some(index_expr), index, *key, false).is_err() {
+84        return Err(IndexingError::WrongIndexType);
+85    }
+86    Ok(*value)
+87}
+88
+89/// Finds the type of a binary operation and checks types.
+90pub fn bin(
+91    context: &mut dyn AnalyzerContext,
+92    left: TypeId,
+93    left_expr: &Node<fe::Expr>,
+94    op: fe::BinOperator,
+95    right: TypeId,
+96    right_expr: &Node<fe::Expr>,
+97) -> Result<TypeId, BinaryOperationError> {
+98    // Add deref coercions, if necessary (this should always succeed).
+99    let left = deref_type(context, left_expr, left);
+100    let right = deref_type(context, right_expr, right);
+101
+102    if let (Some(left_int), Some(right_int)) =
+103        (left.as_int(context.db()), right.as_int(context.db()))
+104    {
+105        let int = match op {
+106            fe::BinOperator::Add
+107            | fe::BinOperator::Sub
+108            | fe::BinOperator::Mult
+109            | fe::BinOperator::Div
+110            | fe::BinOperator::Mod => {
+111                return bin_arithmetic(context, left, right, right_expr);
+112            }
+113            fe::BinOperator::Pow => bin_pow(left_int, right_int),
+114            fe::BinOperator::LShift | fe::BinOperator::RShift => bin_bit_shift(left_int, right_int),
+115            fe::BinOperator::BitOr | fe::BinOperator::BitXor | fe::BinOperator::BitAnd => {
+116                bin_bit(left_int, right_int)
+117            }
+118        }?;
+119        Ok(TypeId::int(context.db(), int))
+120    } else {
+121        Err(BinaryOperationError::TypesNotNumeric)
+122    }
+123}
+124
+125fn bin_arithmetic(
+126    context: &mut dyn AnalyzerContext,
+127    left: TypeId,
+128    right: TypeId,
+129    right_expr: &Node<fe::Expr>,
+130) -> Result<TypeId, BinaryOperationError> {
+131    // For now, we require that the types be numeric, have the same signedness,
+132    // and that left.size() >= right.size(). (The rules imposed by try_coerce_type)
+133    if try_coerce_type(context, Some(right_expr), right, left, false).is_ok() {
+134        // TODO: loosen up arightmetic type rules.
+135        // The rules should be:
+136        // - Any combination of numeric types can be operated on.
+137        // - If either number is signed, we return a signed type.
+138        // - The larger type is returned.
+139        Ok(left)
+140    } else {
+141        // The types are not equal. Again, there is no need to be this strict.
+142        Err(BinaryOperationError::TypesNotCompatible)
+143    }
+144}
+145
+146fn bin_pow(left: Integer, right: Integer) -> Result<Integer, BinaryOperationError> {
+147    // The exponent is not allowed to be a signed integer. To allow calculations
+148    // such as -2 ** 3 we allow the right hand side to be an unsigned integer
+149    // even if the left side is a signed integer. It is allowed as long as the
+150    // right side is the same size or smaller than the left side (e.g. i16 ** u16
+151    // but not i16 ** u32). The type of the result will be the type of the left
+152    // side and under/overflow checks are based on that type.
+153
+154    if right.is_signed() {
+155        Err(BinaryOperationError::RightIsSigned)
+156    } else if left.can_hold(right) {
+157        Ok(left)
+158    } else {
+159        Err(BinaryOperationError::RightTooLarge)
+160    }
+161}
+162
+163fn bin_bit_shift(left: Integer, right: Integer) -> Result<Integer, BinaryOperationError> {
+164    // The right side must be unsigned.
+165    if right.is_signed() {
+166        Err(BinaryOperationError::RightIsSigned)
+167    } else {
+168        Ok(left)
+169    }
+170}
+171
+172fn bin_bit(left: Integer, right: Integer) -> Result<Integer, BinaryOperationError> {
+173    // We require that both numbers be unsigned and equal in size.
+174    if !left.is_signed() && left == right {
+175        Ok(left)
+176    } else {
+177        Err(BinaryOperationError::NotEqualAndUnsigned)
+178    }
+179}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/assignments.rs.html b/compiler-docs/src/fe_analyzer/traversal/assignments.rs.html new file mode 100644 index 0000000000..fddc5afb45 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/assignments.rs.html @@ -0,0 +1,143 @@ +assignments.rs - source

fe_analyzer/traversal/
assignments.rs

1use crate::context::{AnalyzerContext, DiagnosticVoucher, NamedThing};
+2use crate::errors::FatalError;
+3use crate::namespace::scopes::BlockScope;
+4use crate::namespace::types::{Type, TypeId};
+5use crate::operations;
+6use crate::traversal::expressions;
+7use crate::traversal::utils::add_bin_operations_errors;
+8use fe_common::diagnostics::Label;
+9use fe_parser::ast as fe;
+10use fe_parser::node::{Node, Span};
+11use smol_str::SmolStr;
+12
+13/// Gather context information for assignments and check for type errors.
+14///
+15/// e.g. `foo[42] = "bar"`, `self.foo[42] = "bar"`, `foo = 42`
+16pub fn assign(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+17    let (target, value) = match &stmt.kind {
+18        fe::FuncStmt::Assign { target, value } => (target, value),
+19        _ => unreachable!(),
+20    };
+21    if is_valid_assign_target(scope, target)? {
+22        let lhs_type = assignment_lhs_type(scope, target)?;
+23        expressions::expect_expr_type(scope, value, lhs_type, true)?;
+24    }
+25    Ok(())
+26}
+27
+28/// Logs error if `target` type is not `Mut`.
+29/// Returns `target` type, with `Mut` stripped off.
+30fn assignment_lhs_type(
+31    scope: &mut BlockScope,
+32    target: &Node<fe::Expr>,
+33) -> Result<TypeId, FatalError> {
+34    let ty = expressions::expr_type(scope, target)?;
+35    match ty.typ(scope.db()) {
+36        Type::Mut(inner) => Ok(inner),
+37        _ => {
+38            let mut labels = vec![Label::primary(target.span, "not mutable")];
+39            if let Some((name, span)) = name_def_span(scope, target) {
+40                labels.push(Label::secondary(
+41                    span,
+42                    format!("consider changing this to be mutable: `mut {name}`"),
+43                ));
+44            }
+45            scope.fancy_error(
+46                &format!("cannot modify `{}`, as it is not mutable", &target.kind),
+47                labels,
+48                vec![],
+49            );
+50            Ok(ty)
+51        }
+52    }
+53}
+54
+55fn name_def_span(scope: &BlockScope, expr: &Node<fe::Expr>) -> Option<(SmolStr, Span)> {
+56    match &expr.kind {
+57        fe::Expr::Attribute { value, .. } | fe::Expr::Subscript { value, .. } => {
+58            name_def_span(scope, value)
+59        }
+60        fe::Expr::Name(name) => {
+61            let thing = scope.resolve_name(name, expr.span).ok()??;
+62            thing.name_span(scope.db()).map(|span| (name.clone(), span))
+63        }
+64        _ => None,
+65    }
+66}
+67
+68fn is_valid_assign_target(
+69    scope: &mut BlockScope,
+70    expr: &Node<fe::Expr>,
+71) -> Result<bool, FatalError> {
+72    use fe::Expr::*;
+73
+74    match &expr.kind {
+75        Attribute { .. } | Subscript { .. } => Ok(true),
+76        Tuple { elts } => {
+77            for elt in elts {
+78                if !is_valid_assign_target(scope, elt)? {
+79                    return Ok(false);
+80                }
+81            }
+82            Ok(true)
+83        }
+84
+85        Name(name) => match scope.resolve_name(name, expr.span) {
+86            Ok(Some(NamedThing::SelfValue { .. })) => Ok(true),
+87            Ok(Some(NamedThing::Item(_)) | Some(NamedThing::EnumVariant(_)) | None) => {
+88                bad_assign_target_error(scope, expr, "invalid assignment target");
+89                Ok(false)
+90            }
+91            Ok(Some(NamedThing::Variable { is_const, .. })) => {
+92                if is_const {
+93                    bad_assign_target_error(scope, expr, "cannot assign to a constant value");
+94                }
+95                Ok(!is_const)
+96            }
+97            Err(e) => Err(e.into()),
+98        },
+99        _ => {
+100            bad_assign_target_error(scope, expr, "invalid assignment target");
+101            Ok(false)
+102        }
+103    }
+104}
+105
+106fn bad_assign_target_error(
+107    scope: &mut BlockScope,
+108    expr: &Node<fe::Expr>,
+109    msg: &str,
+110) -> DiagnosticVoucher {
+111    scope.fancy_error(
+112        msg,
+113        vec![Label::primary(expr.span, "")],
+114        vec!["The left side of an assignment can be a variable name, attribute, subscript, or tuple.".into()]
+115    )
+116}
+117
+118/// Gather context information for assignments and check for type errors.
+119pub fn aug_assign(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+120    let (target, op, value) = match &stmt.kind {
+121        fe::FuncStmt::AugAssign { target, op, value } => (target, op, value),
+122        _ => unreachable!(),
+123    };
+124
+125    if is_valid_assign_target(scope, target)? {
+126        let lhs_ty = assignment_lhs_type(scope, target)?;
+127        let rhs = expressions::expr(scope, value, Some(lhs_ty))?;
+128
+129        if let Err(err) = operations::bin(scope, lhs_ty, target, op.kind, rhs.typ, value) {
+130            add_bin_operations_errors(
+131                scope,
+132                &op.kind,
+133                target.span,
+134                lhs_ty,
+135                value.span,
+136                rhs.typ,
+137                err,
+138            );
+139        }
+140    }
+141
+142    Ok(())
+143}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/borrowck.rs.html b/compiler-docs/src/fe_analyzer/traversal/borrowck.rs.html new file mode 100644 index 0000000000..51ef265d96 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/borrowck.rs.html @@ -0,0 +1,110 @@ +borrowck.rs - source

fe_analyzer/traversal/
borrowck.rs

1use super::call_args::LabeledParameter;
+2use crate::context::{AnalyzerContext, NamedThing};
+3use crate::namespace::types::{Type, TypeId};
+4use fe_common::diagnostics::Label;
+5use fe_parser::ast;
+6use fe_parser::node::{Node, Span};
+7use smallvec::{smallvec, SmallVec};
+8
+9// NOTE: This is a temporary solution to the only borrowing bug that's possible
+10// in the current semantics of Fe, namely passing a mutable reference to a
+11// non-primitive object into a fn call, and another reference to that same
+12// object (mutable or otherwise).
+13// This is an ugly brute force solution that will definitely not scale
+14// beyond this simple case, and doesn't do anything smart like allow
+15// disjoint partial borrows.
+16// This should be replaced with a proper borrow checker (presumably operating
+17// on MIR) when Fe gains some kind of reference/projection type.
+18pub fn check_fn_call_arg_borrows(
+19    context: &mut dyn AnalyzerContext,
+20    fn_name: &str,
+21    method_self: Option<(&Node<ast::Expr>, TypeId)>,
+22    args: &[Node<ast::CallArg>],
+23    params: &[impl LabeledParameter],
+24) {
+25    // Return early if there are no mut params.
+26    // This function doesn't attempt to be efficient.
+27    let mut_self = method_self
+28        .map(|(_, ty)| ty.is_mut(context.db()))
+29        .unwrap_or(false);
+30    if !mut_self
+31        && !params
+32            .iter()
+33            .any(|p| p.typ().map(|t| t.is_mut(context.db())).unwrap_or(false))
+34    {
+35        return;
+36    }
+37
+38    // Allocate a new Vec<(arg, ty)> including the method target (if present)
+39    let param_ty = params
+40        .iter()
+41        .map(|p| p.typ().unwrap_or_else(|_| Type::unit().id(context.db())));
+42    let mut args = args
+43        .iter()
+44        .map(|arg| &arg.kind.value)
+45        .zip(param_ty)
+46        .collect::<Vec<_>>();
+47    if let Some((target_expr, ty)) = method_self {
+48        args.insert(0, (target_expr, ty));
+49    }
+50
+51    for (idx, (arg, _)) in args
+52        .iter()
+53        .enumerate()
+54        .filter(|(_, (_, ty))| ty.is_mut(context.db()))
+55    {
+56        // Find the "root" var of the mut arg expr. Eg the root of a.b.c is `a`.
+57        // In the case of a ternary expr, there may be more than one.
+58        // Eg foo(a if x else (b if y else c))
+59        let vars = resolve_expr_root_vars(context, arg);
+60
+61        // Check all other non-primitive args for the same root var.
+62        for (_, (other, _)) in args
+63            .iter()
+64            .enumerate()
+65            .filter(|(i, (_, ty))| *i != idx && !ty.is_primitive(context.db()))
+66        {
+67            let other_vars = resolve_expr_root_vars(context, other);
+68            for (var, var_span) in &vars {
+69                if let Some((_, other_span)) = other_vars.iter().find(|(nt, _)| nt == var) {
+70                    let name = var.name(context.db());
+71                    context.fancy_error(
+72                        &format!("borrow conflict in call to fn `{fn_name}`"),
+73                        vec![
+74                            Label::primary(*var_span, format!("`{name}` is used mutably here")),
+75                            Label::secondary(*other_span, format!("`{name}` is used again here")),
+76                        ],
+77                        vec![],
+78                    );
+79                    return;
+80                }
+81            }
+82        }
+83    }
+84}
+85
+86fn resolve_expr_root_vars(
+87    context: &dyn AnalyzerContext,
+88    expr: &Node<ast::Expr>,
+89) -> SmallVec<[(NamedThing, Span); 2]> {
+90    match &expr.kind {
+91        ast::Expr::Name(name) => match context.resolve_name(name, expr.span) {
+92            Ok(
+93                Some(nt @ NamedThing::Variable { .. }) | Some(nt @ NamedThing::SelfValue { .. }),
+94            ) => smallvec![(nt, expr.span)],
+95            _ => smallvec![],
+96        },
+97
+98        ast::Expr::Attribute { value, .. } | ast::Expr::Subscript { value, .. } => {
+99            resolve_expr_root_vars(context, value)
+100        }
+101        ast::Expr::Ternary {
+102            if_expr, else_expr, ..
+103        } => {
+104            let mut left = resolve_expr_root_vars(context, if_expr);
+105            left.append(&mut resolve_expr_root_vars(context, else_expr));
+106            left
+107        }
+108        _ => smallvec![],
+109    }
+110}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/call_args.rs.html b/compiler-docs/src/fe_analyzer/traversal/call_args.rs.html new file mode 100644 index 0000000000..1761651d20 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/call_args.rs.html @@ -0,0 +1,228 @@ +call_args.rs - source

fe_analyzer/traversal/
call_args.rs

1use super::expressions::{expr, expr_type};
+2use super::types::try_coerce_type;
+3use crate::context::{AnalyzerContext, DiagnosticVoucher};
+4use crate::display::Displayable;
+5use crate::errors::{self, FatalError, TypeCoercionError, TypeError};
+6use crate::namespace::types::{FunctionParam, Generic, Type, TypeId};
+7use fe_common::{diagnostics::Label, utils::humanize::pluralize_conditionally};
+8use fe_common::{Span, Spanned};
+9use fe_parser::ast as fe;
+10use fe_parser::node::Node;
+11use smol_str::SmolStr;
+12
+13pub trait LabeledParameter {
+14    fn label(&self) -> Option<&str>;
+15    fn typ(&self) -> Result<TypeId, TypeError>;
+16    fn is_sink(&self) -> bool;
+17}
+18
+19impl LabeledParameter for FunctionParam {
+20    fn label(&self) -> Option<&str> {
+21        self.label()
+22    }
+23    fn typ(&self) -> Result<TypeId, TypeError> {
+24        self.typ.clone()
+25    }
+26    fn is_sink(&self) -> bool {
+27        false
+28    }
+29}
+30
+31impl LabeledParameter for (SmolStr, Result<TypeId, TypeError>, bool) {
+32    fn label(&self) -> Option<&str> {
+33        Some(&self.0)
+34    }
+35    fn typ(&self) -> Result<TypeId, TypeError> {
+36        self.1.clone()
+37    }
+38    fn is_sink(&self) -> bool {
+39        self.2
+40    }
+41}
+42
+43impl LabeledParameter for (Option<SmolStr>, Result<TypeId, TypeError>, bool) {
+44    fn label(&self) -> Option<&str> {
+45        self.0.as_ref().map(smol_str::SmolStr::as_str)
+46    }
+47    fn typ(&self) -> Result<TypeId, TypeError> {
+48        self.1.clone()
+49    }
+50    fn is_sink(&self) -> bool {
+51        self.2
+52    }
+53}
+54
+55pub fn validate_arg_count(
+56    context: &dyn AnalyzerContext,
+57    name: &str,
+58    name_span: Span,
+59    args: &Node<Vec<impl Spanned>>,
+60    param_count: usize,
+61    argument_word: &str,
+62) -> Option<DiagnosticVoucher> {
+63    if args.kind.len() == param_count {
+64        None
+65    } else {
+66        let mut labels = vec![Label::primary(
+67            name_span,
+68            format!(
+69                "expects {} {}",
+70                param_count,
+71                pluralize_conditionally(argument_word, param_count)
+72            ),
+73        )];
+74        if args.kind.is_empty() {
+75            labels.push(Label::secondary(args.span, "supplied 0 arguments"));
+76        } else {
+77            for arg in &args.kind {
+78                labels.push(Label::secondary(arg.span(), ""));
+79            }
+80            labels.last_mut().unwrap().message = format!(
+81                "supplied {} {}",
+82                args.kind.len(),
+83                pluralize_conditionally(argument_word, args.kind.len())
+84            );
+85        }
+86
+87        Some(context.fancy_error(
+88            &format!(
+89                "`{}` expects {} {}, but {} {} provided",
+90                name,
+91                param_count,
+92                pluralize_conditionally(argument_word, param_count),
+93                args.kind.len(),
+94                pluralize_conditionally(("was", "were"), args.kind.len())
+95            ),
+96            labels,
+97            vec![],
+98        ))
+99        // TODO: add `defined here` label (need span for definition)
+100    }
+101}
+102
+103// TODO: missing label error should suggest adding `_` to fn def
+104pub fn validate_named_args(
+105    context: &mut dyn AnalyzerContext,
+106    name: &str,
+107    name_span: Span,
+108    args: &Node<Vec<Node<fe::CallArg>>>,
+109    params: &[impl LabeledParameter],
+110) -> Result<(), FatalError> {
+111    validate_arg_count(context, name, name_span, args, params.len(), "argument");
+112    // TODO: if the first arg is missing, every other arg will get a label and type
+113    // error
+114
+115    for (index, (param, arg)) in params.iter().zip(args.kind.iter()).enumerate() {
+116        let expected_label = param.label();
+117        let arg_val = &arg.kind.value;
+118        match (expected_label, &arg.kind.label) {
+119            (Some(expected_label), Some(actual_label)) => {
+120                if expected_label != actual_label.kind {
+121                    let notes = if params
+122                        .iter()
+123                        .any(|param| param.label() == Some(actual_label.kind.as_str()))
+124                    {
+125                        vec!["Note: arguments must be provided in order.".into()]
+126                    } else {
+127                        vec![]
+128                    };
+129                    context.fancy_error(
+130                        "argument label mismatch",
+131                        vec![Label::primary(
+132                            actual_label.span,
+133                            format!("expected `{expected_label}`"),
+134                        )],
+135                        notes,
+136                    );
+137                }
+138            }
+139            (Some(expected_label), None) => match &arg_val.kind {
+140                fe::Expr::Name(var_name) if var_name == expected_label => {}
+141                _ => {
+142                    context.fancy_error(
+143                            "missing argument label",
+144                            vec![Label::primary(
+145                                Span::new(arg_val.span.file_id, arg_val.span.start, arg_val.span.start),
+146                                format!("add `{expected_label}:` here"),
+147                            )],
+148                            vec![format!(
+149                                "Note: this label is optional if the argument is a variable named `{expected_label}`."
+150                            )],
+151                        );
+152                }
+153            },
+154            (None, Some(actual_label)) => {
+155                context.error(
+156                    "argument should not be labeled",
+157                    actual_label.span,
+158                    "remove this label",
+159                );
+160            }
+161            (None, None) => {}
+162        }
+163
+164        let param_type = param.typ()?;
+165        // Check arg type
+166        let arg_type =
+167            if let Type::Generic(Generic { bounds, .. }) = param_type.deref_typ(context.db()) {
+168                let arg_type = expr_type(context, &arg.kind.value)?;
+169                for bound in bounds.iter() {
+170                    if !bound.is_implemented_for(context.db(), arg_type) {
+171                        context.error(
+172                            &format!(
+173                                "the trait bound `{}: {}` is not satisfied",
+174                                arg_type.display(context.db()),
+175                                bound.name(context.db())
+176                            ),
+177                            arg.span,
+178                            &format!(
+179                                "the trait `{}` is not implemented for `{}`",
+180                                bound.name(context.db()),
+181                                arg_type.display(context.db()),
+182                            ),
+183                        );
+184                    }
+185                }
+186                arg_type
+187            } else {
+188                let arg_attr = expr(context, &arg.kind.value, Some(param_type))?;
+189                match try_coerce_type(
+190                    context,
+191                    Some(&arg.kind.value),
+192                    arg_attr.typ,
+193                    param_type,
+194                    param.is_sink(),
+195                ) {
+196                    Err(TypeCoercionError::Incompatible) => {
+197                        let msg = if let Some(label) = param.label() {
+198                            format!("incorrect type for `{name}` argument `{label}`")
+199                        } else {
+200                            format!("incorrect type for `{name}` argument at position {index}")
+201                        };
+202                        context.type_error(&msg, arg.kind.value.span, param_type, arg_attr.typ);
+203                    }
+204                    Err(TypeCoercionError::RequiresToMem) => {
+205                        context.add_diagnostic(errors::to_mem_error(arg.span));
+206                    }
+207                    Err(TypeCoercionError::SelfContractType) => {
+208                        context.add_diagnostic(errors::self_contract_type_error(
+209                            arg.span,
+210                            &param_type.display(context.db()),
+211                        ));
+212                    }
+213                    Ok(_) => {}
+214                }
+215                arg_attr.typ
+216            };
+217
+218        if param_type.is_mut(context.db()) && !arg_type.is_mut(context.db()) {
+219            let msg = if let Some(label) = param.label() {
+220                format!("`{name}` argument `{label}` must be mutable")
+221            } else {
+222                format!("`{name}` argument at position {index} must be mutable")
+223            };
+224            context.error(&msg, arg.kind.value.span, "is not `mut`");
+225        }
+226    }
+227    Ok(())
+228}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/const_expr.rs.html b/compiler-docs/src/fe_analyzer/traversal/const_expr.rs.html new file mode 100644 index 0000000000..4ebabe1c64 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/const_expr.rs.html @@ -0,0 +1,370 @@ +const_expr.rs - source

fe_analyzer/traversal/
const_expr.rs

1//! This module provides evaluator for constant expression to resolve const
+2//! generics.
+3
+4use num_bigint::BigInt;
+5use num_traits::{One, ToPrimitive, Zero};
+6
+7use crate::{
+8    context::{AnalyzerContext, Constant},
+9    errors::ConstEvalError,
+10    namespace::types::{self, Base, Type},
+11};
+12
+13use fe_common::{numeric, Span};
+14use fe_parser::{
+15    ast::{self, BinOperator, BoolOperator, CompOperator, UnaryOperator},
+16    node::Node,
+17};
+18
+19/// Evaluate expression.
+20///
+21/// # Panics
+22///
+23/// 1. Panics if type analysis on an `expr` is not performed beforehand.
+24/// 2. Panics if an `expr` has an invalid type.
+25pub(crate) fn eval_expr(
+26    context: &mut dyn AnalyzerContext,
+27    expr: &Node<ast::Expr>,
+28) -> Result<Constant, ConstEvalError> {
+29    let typ = context.expr_typ(expr);
+30
+31    match &expr.kind {
+32        ast::Expr::Ternary {
+33            if_expr,
+34            test,
+35            else_expr,
+36        } => eval_ternary(context, if_expr, test, else_expr),
+37        ast::Expr::BoolOperation { left, op, right } => eval_bool_op(context, left, op, right),
+38        ast::Expr::BinOperation { left, op, right } => eval_bin_op(context, left, op, right, &typ),
+39        ast::Expr::UnaryOperation { op, operand } => eval_unary_op(context, op, operand),
+40        ast::Expr::CompOperation { left, op, right } => eval_comp_op(context, left, op, right),
+41        ast::Expr::Bool(val) => Ok(Constant::Bool(*val)),
+42        ast::Expr::Name(name) => match context.constant_value_by_name(name, expr.span)? {
+43            Some(const_value) => Ok(const_value),
+44            _ => Err(not_const_error(context, expr.span)),
+45        },
+46
+47        ast::Expr::Num(num) => {
+48            // We don't validate the string representing number here,
+49            // because we assume the string has been already validate in type analysis.
+50            let span = expr.span;
+51            Constant::from_num_str(context, num, &typ, span)
+52        }
+53
+54        ast::Expr::Str(s) => Ok(Constant::Str(s.clone())),
+55
+56        // TODO: Need to evaluate attribute getter, constant constructor and const fn call.
+57        ast::Expr::Subscript { .. }
+58        | ast::Expr::Path(_)
+59        | ast::Expr::Attribute { .. }
+60        | ast::Expr::Call { .. }
+61        | ast::Expr::List { .. }
+62        | ast::Expr::Repeat { .. }
+63        | ast::Expr::Tuple { .. }
+64        | ast::Expr::Unit => Err(not_const_error(context, expr.span)),
+65    }
+66}
+67
+68/// Evaluates ternary expression.
+69fn eval_ternary(
+70    context: &mut dyn AnalyzerContext,
+71    then_expr: &Node<ast::Expr>,
+72    cond: &Node<ast::Expr>,
+73    else_expr: &Node<ast::Expr>,
+74) -> Result<Constant, ConstEvalError> {
+75    // In constant evaluation, we don't apply short circuit property for safety.
+76    let then = eval_expr(context, then_expr)?;
+77    let cond = eval_expr(context, cond)?;
+78    let else_ = eval_expr(context, else_expr)?;
+79
+80    match cond {
+81        Constant::Bool(cond) => {
+82            if cond {
+83                Ok(then)
+84            } else {
+85                Ok(else_)
+86            }
+87        }
+88        _ => panic!("ternary condition is not a bool type"),
+89    }
+90}
+91
+92/// Evaluates logical expressions.
+93fn eval_bool_op(
+94    context: &mut dyn AnalyzerContext,
+95    lhs: &Node<ast::Expr>,
+96    op: &Node<ast::BoolOperator>,
+97    rhs: &Node<ast::Expr>,
+98) -> Result<Constant, ConstEvalError> {
+99    // In constant evaluation, we don't apply short circuit property for safety.
+100    let (lhs, rhs) = (eval_expr(context, lhs)?, eval_expr(context, rhs)?);
+101    let (lhs, rhs) = match (lhs, rhs) {
+102        (Constant::Bool(lhs), Constant::Bool(rhs)) => (lhs, rhs),
+103        _ => panic!("an argument of a logical expression is not bool type"),
+104    };
+105
+106    match op.kind {
+107        BoolOperator::And => Ok(Constant::Bool(lhs && rhs)),
+108        BoolOperator::Or => Ok(Constant::Bool(lhs || rhs)),
+109    }
+110}
+111
+112/// Evaluates binary expressions.
+113fn eval_bin_op(
+114    context: &mut dyn AnalyzerContext,
+115    lhs: &Node<ast::Expr>,
+116    op: &Node<ast::BinOperator>,
+117    rhs: &Node<ast::Expr>,
+118    typ: &Type,
+119) -> Result<Constant, ConstEvalError> {
+120    let span = lhs.span + rhs.span;
+121    let lhs_ty = extract_int_typ(&context.expr_typ(lhs));
+122
+123    let (lhs, rhs) = (eval_expr(context, lhs)?, eval_expr(context, rhs)?);
+124    let (lhs, rhs) = (lhs.extract_numeric(), rhs.extract_numeric());
+125
+126    let result = match op.kind {
+127        BinOperator::Add => lhs + rhs,
+128        BinOperator::Sub => lhs - rhs,
+129        BinOperator::Mult => lhs * rhs,
+130
+131        BinOperator::Div => {
+132            if rhs.is_zero() {
+133                return Err(zero_division_error(context, span));
+134            } else if lhs_ty.is_signed() && lhs == &(lhs_ty.min_value()) && rhs == &(-BigInt::one())
+135            {
+136                return Err(overflow_error(context, span));
+137            } else {
+138                lhs / rhs
+139            }
+140        }
+141
+142        BinOperator::Mod => {
+143            if rhs.is_zero() {
+144                return Err(zero_division_error(context, span));
+145            }
+146            lhs % rhs
+147        }
+148
+149        BinOperator::Pow => {
+150            // We assume `rhs` type is unsigned numeric.
+151            if let Some(exponent) = rhs.to_u32() {
+152                lhs.pow(exponent)
+153            } else if lhs.is_zero() {
+154                BigInt::zero()
+155            } else if lhs.is_one() {
+156                BigInt::one()
+157            } else {
+158                // Exponent is larger than u32::MAX and lhs is not zero nor one,
+159                // then this trivially causes overflow.
+160                return Err(overflow_error(context, span));
+161            }
+162        }
+163
+164        BinOperator::LShift => {
+165            if let Some(exponent) = rhs.to_usize() {
+166                let type_bits = lhs_ty.bits();
+167                // If rhs is larger than or equal to lhs type bits, then we emits overflow
+168                // error.
+169                if exponent >= type_bits {
+170                    return Err(overflow_error(context, span));
+171                } else {
+172                    let mask = make_mask(typ);
+173                    (lhs * BigInt::from(2_u8).pow(exponent as u32)) & mask
+174                }
+175            } else {
+176                // If exponent is larger than usize::MAX, it causes trivially overflow.
+177                return Err(overflow_error(context, span));
+178            }
+179        }
+180
+181        BinOperator::RShift => {
+182            if let Some(exponent) = rhs.to_usize() {
+183                let type_bits = lhs_ty.bits();
+184                // If rhs is larger than or equal to lhs type bits, then we emits overflow
+185                // error.
+186                if exponent >= type_bits {
+187                    return Err(overflow_error(context, span));
+188                } else {
+189                    let mask = make_mask(typ);
+190                    (lhs / BigInt::from(2_u8).pow(exponent as u32)) & mask
+191                }
+192            } else {
+193                // If exponent is larger than usize::MAX, it causes trivially overflow.
+194                return Err(overflow_error(context, span));
+195            }
+196        }
+197
+198        BinOperator::BitOr => lhs | rhs,
+199        BinOperator::BitXor => lhs ^ rhs,
+200        BinOperator::BitAnd => lhs & rhs,
+201    };
+202
+203    Constant::make_const_numeric_with_ty(context, result, typ, span)
+204}
+205
+206fn eval_unary_op(
+207    context: &mut dyn AnalyzerContext,
+208    op: &Node<ast::UnaryOperator>,
+209    arg: &Node<ast::Expr>,
+210) -> Result<Constant, ConstEvalError> {
+211    let arg = eval_expr(context, arg)?;
+212
+213    match op.kind {
+214        UnaryOperator::Invert => Ok(Constant::Int(!arg.extract_numeric())),
+215        UnaryOperator::Not => Ok(Constant::Bool(!arg.extract_bool())),
+216        UnaryOperator::USub => Ok(Constant::Int(-arg.extract_numeric())),
+217    }
+218}
+219
+220/// Evaluates comp operation.
+221fn eval_comp_op(
+222    context: &mut dyn AnalyzerContext,
+223    lhs: &Node<ast::Expr>,
+224    op: &Node<ast::CompOperator>,
+225    rhs: &Node<ast::Expr>,
+226) -> Result<Constant, ConstEvalError> {
+227    let (lhs, rhs) = (eval_expr(context, lhs)?, eval_expr(context, rhs)?);
+228
+229    let res = match (lhs, rhs) {
+230        (Constant::Int(lhs), Constant::Int(rhs)) => match op.kind {
+231            CompOperator::Eq => lhs == rhs,
+232            CompOperator::NotEq => lhs != rhs,
+233            CompOperator::Lt => lhs < rhs,
+234            CompOperator::LtE => lhs <= rhs,
+235            CompOperator::Gt => lhs > rhs,
+236            CompOperator::GtE => lhs >= rhs,
+237        },
+238
+239        (Constant::Bool(lhs), Constant::Bool(rhs)) => match op.kind {
+240            CompOperator::Eq => lhs == rhs,
+241            CompOperator::NotEq => lhs != rhs,
+242            CompOperator::Lt => !lhs & rhs,
+243            CompOperator::LtE => lhs <= rhs,
+244            CompOperator::Gt => lhs & !rhs,
+245            CompOperator::GtE => lhs >= rhs,
+246        },
+247
+248        _ => panic!("arguments of comp op have invalid type"),
+249    };
+250
+251    Ok(Constant::Bool(res))
+252}
+253
+254impl Constant {
+255    /// Returns constant from numeric literal represented by string.
+256    ///
+257    /// # Panics
+258    /// Panics if `s` is invalid string for numeric literal.
+259    pub fn from_num_str(
+260        context: &mut dyn AnalyzerContext,
+261        s: &str,
+262        typ: &Type,
+263        span: Span,
+264    ) -> Result<Self, ConstEvalError> {
+265        let literal = numeric::Literal::new(s);
+266        let num = literal.parse::<BigInt>().unwrap();
+267        match typ {
+268            Type::Base(Base::Numeric(_)) => {
+269                Self::make_const_numeric_with_ty(context, num, typ, span)
+270            }
+271            Type::Base(Base::Address) => {
+272                if num >= BigInt::zero() && num <= types::address_max() {
+273                    Ok(Constant::Address(num))
+274                } else {
+275                    Err(overflow_error(context, span))
+276                }
+277            }
+278            _ => unreachable!(),
+279        }
+280    }
+281
+282    /// Returns constant from numeric literal that fits type bits.
+283    /// If `val` doesn't fit type bits, then return `Err`.
+284    ///
+285    /// # Panics
+286    /// Panics if `typ` is invalid string for numeric literal.
+287    fn make_const_numeric_with_ty(
+288        context: &mut dyn AnalyzerContext,
+289        val: BigInt,
+290        typ: &Type,
+291        span: Span,
+292    ) -> Result<Self, ConstEvalError> {
+293        // Overflowing check.
+294        if extract_int_typ(typ).fits(val.clone()) {
+295            Ok(Constant::Int(val))
+296        } else {
+297            Err(overflow_error(context, span))
+298        }
+299    }
+300
+301    /// Extracts numeric value from a `Constant`.
+302    ///
+303    /// # Panics
+304    /// Panics if a `self` variant is not a numeric.
+305    fn extract_numeric(&self) -> &BigInt {
+306        match self {
+307            Constant::Int(val) => val,
+308            _ => panic!("can't extract numeric value from {self:?}"),
+309        }
+310    }
+311
+312    /// Extracts bool value from a `Constant`.
+313    ///
+314    /// # Panics
+315    /// Panics if a `self` variant is not a bool.
+316    fn extract_bool(&self) -> bool {
+317        match self {
+318            Constant::Bool(val) => *val,
+319            _ => panic!("can't extract bool value from {self:?}"),
+320        }
+321    }
+322}
+323
+324fn not_const_error(context: &mut dyn AnalyzerContext, span: Span) -> ConstEvalError {
+325    ConstEvalError::new(context.error(
+326        "expression is not a constant",
+327        span,
+328        "expression is required to be constant here",
+329    ))
+330}
+331
+332fn overflow_error(context: &mut dyn AnalyzerContext, span: Span) -> ConstEvalError {
+333    ConstEvalError::new(context.error(
+334        "overflow error",
+335        span,
+336        "overflow occurred during constant evaluation",
+337    ))
+338}
+339
+340fn zero_division_error(context: &mut dyn AnalyzerContext, span: Span) -> ConstEvalError {
+341    ConstEvalError::new(context.error(
+342        "zero division error",
+343        span,
+344        "zero division occurred during constant evaluation",
+345    ))
+346}
+347
+348/// Returns integer types embedded in `typ`.
+349///
+350/// # Panic
+351/// Panics if `typ` is not a numeric type.
+352fn extract_int_typ(typ: &Type) -> types::Integer {
+353    match typ {
+354        Type::Base(Base::Numeric(int_ty)) => *int_ty,
+355        _ => {
+356            panic!("invalid binop expression type")
+357        }
+358    }
+359}
+360
+361/// Returns bit mask corresponding to typ.
+362/// e.g. If type is `Type::Base(Base::Numeric(Integer::I32))`, then returns
+363/// `0xffff_ffff`.
+364///
+365/// # Panic
+366/// Panics if `typ` is not a numeric type.
+367fn make_mask(typ: &Type) -> BigInt {
+368    let bits = extract_int_typ(typ).bits();
+369    (BigInt::one() << bits) - 1
+370}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/declarations.rs.html b/compiler-docs/src/fe_analyzer/traversal/declarations.rs.html new file mode 100644 index 0000000000..614c4db1fc --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/declarations.rs.html @@ -0,0 +1,174 @@ +declarations.rs - source

fe_analyzer/traversal/
declarations.rs

1use crate::context::AnalyzerContext;
+2use crate::display::Displayable;
+3use crate::errors::{self, FatalError, TypeCoercionError};
+4use crate::namespace::scopes::BlockScope;
+5use crate::namespace::types::{Type, TypeId};
+6use crate::traversal::{const_expr, expressions, types};
+7use fe_common::{diagnostics::Label, utils::humanize::pluralize_conditionally};
+8use fe_parser::ast as fe;
+9use fe_parser::node::Node;
+10
+11/// Gather context information for var declarations and check for type errors.
+12pub fn var_decl(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+13    let (target, typ, value, mut_) = match &stmt.kind {
+14        fe::FuncStmt::VarDecl {
+15            target,
+16            typ,
+17            value,
+18            mut_,
+19        } => (target, typ, value, mut_),
+20        _ => unreachable!(),
+21    };
+22
+23    let self_ty = scope
+24        .parent_function()
+25        .clone()
+26        .self_type(scope.db())
+27        .map(|val| val.as_trait_or_type());
+28    let declared_type = types::type_desc(scope, typ, self_ty)?;
+29    if let Type::Map(_) = declared_type.typ(scope.db()) {
+30        return Err(FatalError::new(scope.error(
+31            "invalid variable type",
+32            typ.span,
+33            "`Map` type can only be used as a contract field",
+34        )));
+35    }
+36
+37    if let Some(value) = value {
+38        let rhs = expressions::expr(scope, value, Some(declared_type))?;
+39        let should_copy = mut_.is_some() || rhs.typ.is_mut(scope.db());
+40        match types::try_coerce_type(scope, Some(value), rhs.typ, declared_type, should_copy) {
+41            Err(TypeCoercionError::RequiresToMem) => {
+42                scope.add_diagnostic(errors::to_mem_error(value.span));
+43            }
+44            Err(TypeCoercionError::Incompatible) => {
+45                scope.type_error(
+46                    "type mismatch",
+47                    value.span,
+48                    declared_type,
+49                    rhs.typ.deref(scope.db()),
+50                );
+51            }
+52            Err(TypeCoercionError::SelfContractType) => {
+53                scope.add_diagnostic(errors::self_contract_type_error(
+54                    value.span,
+55                    &rhs.typ.display(scope.db()),
+56                ));
+57            }
+58            Ok(_) => {}
+59        }
+60    } else if matches!(
+61        declared_type.typ(scope.db()),
+62        Type::Array(_) | Type::Struct(_) | Type::Tuple(_)
+63    ) {
+64        scope.error(
+65            "uninitialized variable",
+66            target.span,
+67            &format!(
+68                "{} types must be initialized at declaration site",
+69                declared_type.kind_display_name(scope.db())
+70            ),
+71        );
+72    }
+73
+74    if mut_.is_some() {
+75        add_var(scope, target, Type::Mut(declared_type).id(scope.db()))?;
+76    } else {
+77        add_var(scope, target, declared_type)?;
+78    }
+79    Ok(())
+80}
+81
+82pub fn const_decl(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+83    if let fe::FuncStmt::ConstantDecl { name, typ, value } = &stmt.kind {
+84        let self_ty = scope
+85            .parent_function()
+86            .clone()
+87            .self_type(scope.db())
+88            .map(|val| val.as_trait_or_type());
+89
+90        let declared_type = match types::type_desc(scope, typ, self_ty) {
+91            Ok(typ) if typ.has_fixed_size(scope.db()) => typ,
+92            _ => {
+93                // If this conversion fails, the type must be a map (for now at least)
+94                return Err(FatalError::new(scope.error(
+95                    "invalid constant type",
+96                    typ.span,
+97                    "`Map` type can only be used as a contract field",
+98                )));
+99            }
+100        };
+101
+102        // Perform semantic analysis before const evaluation.
+103        let value_attributes = expressions::expr(scope, value, Some(declared_type))?;
+104
+105        if declared_type != value_attributes.typ {
+106            scope.type_error(
+107                "type mismatch",
+108                value.span,
+109                declared_type,
+110                value_attributes.typ,
+111            );
+112        }
+113
+114        // Perform constant evaluation.
+115        let const_value = const_expr::eval_expr(scope, value)?;
+116
+117        scope.root.map_variable_type(name, declared_type);
+118        // this logs a message on err, so it's safe to ignore here.
+119        let _ = scope.add_var(name.kind.as_str(), declared_type, true, name.span);
+120        scope.add_constant(name, value, const_value);
+121        return Ok(());
+122    }
+123
+124    unreachable!()
+125}
+126
+127/// Add declared variables to the scope.
+128fn add_var(
+129    scope: &mut BlockScope,
+130    target: &Node<fe::VarDeclTarget>,
+131    typ: TypeId,
+132) -> Result<(), FatalError> {
+133    match &target.kind {
+134        fe::VarDeclTarget::Name(name) => {
+135            scope.root.map_variable_type(target, typ);
+136            // this logs a message on err, so it's safe to ignore here.
+137            let _ = scope.add_var(name, typ, false, target.span);
+138            Ok(())
+139        }
+140        fe::VarDeclTarget::Tuple(items) => {
+141            match typ.typ(scope.db()) {
+142                Type::Tuple(items_ty) => {
+143                    let items_ty = items_ty.items;
+144                    let items_ty_len = items_ty.len();
+145                    if items.len() != items_ty_len {
+146                        return Err(FatalError::new(scope.fancy_error(
+147                            "invalid declaration",
+148                            vec![Label::primary(target.span, "")],
+149                            vec![format!(
+150                                "Tuple declaration has {} {} but the specified tuple type has {} {}",
+151                                items.len(),
+152                                pluralize_conditionally("item", items.len()),
+153                                items_ty_len,
+154                                pluralize_conditionally("item", items_ty_len),
+155                            )],
+156                        )));
+157                    }
+158                    for (item, item_ty) in items.iter().zip(items_ty.iter()) {
+159                        add_var(scope, item, *item_ty)?;
+160                    }
+161                    Ok(())
+162                }
+163                _ => Err(FatalError::new(scope.fancy_error(
+164                    "invalid declaration",
+165                    vec![Label::primary(target.span, "")],
+166                    vec![format!(
+167                        "Tuple declaration targets need to be declared with the tuple type but here the type is {}",
+168                        typ.display(scope.db())
+169                    )]
+170                )))
+171            }
+172        }
+173    }
+174}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/expressions.rs.html b/compiler-docs/src/fe_analyzer/traversal/expressions.rs.html new file mode 100644 index 0000000000..7e0f04f5d8 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/expressions.rs.html @@ -0,0 +1,2214 @@ +expressions.rs - source

fe_analyzer/traversal/
expressions.rs

1use super::borrowck;
+2use crate::builtins::{ContractTypeMethod, GlobalFunction, Intrinsic, ValueMethod};
+3use crate::context::{AnalyzerContext, CallType, Constant, ExpressionAttributes, NamedThing};
+4use crate::display::Displayable;
+5use crate::errors::{self, FatalError, IndexingError, TypeCoercionError};
+6use crate::namespace::items::{
+7    EnumVariantId, EnumVariantKind, FunctionId, FunctionSigId, ImplId, Item, StructId, TypeDef,
+8};
+9use crate::namespace::scopes::{check_visibility, BlockScopeType};
+10use crate::namespace::types::{
+11    self, Array, Base, FeString, Integer, TraitOrType, Tuple, Type, TypeDowncast, TypeId,
+12};
+13use crate::operations;
+14use crate::traversal::call_args::{validate_arg_count, validate_named_args};
+15use crate::traversal::const_expr::eval_expr;
+16use crate::traversal::types::{
+17    apply_generic_type_args, deref_type, try_cast_type, try_coerce_type,
+18};
+19use crate::traversal::utils::add_bin_operations_errors;
+20
+21use fe_common::diagnostics::Label;
+22use fe_common::{numeric, Span};
+23use fe_parser::ast as fe;
+24use fe_parser::ast::GenericArg;
+25use fe_parser::node::Node;
+26use num_bigint::BigInt;
+27use num_traits::{ToPrimitive, Zero};
+28use smol_str::SmolStr;
+29use std::ops::RangeInclusive;
+30use std::str::FromStr;
+31
+32// TODO: don't fail fatally if expected type is provided
+33
+34pub fn expr_type(
+35    context: &mut dyn AnalyzerContext,
+36    exp: &Node<fe::Expr>,
+37) -> Result<TypeId, FatalError> {
+38    expr(context, exp, None).map(|attr| attr.typ)
+39}
+40
+41pub fn expect_expr_type(
+42    context: &mut dyn AnalyzerContext,
+43    exp: &Node<fe::Expr>,
+44    expected: TypeId,
+45    sink: bool,
+46) -> Result<ExpressionAttributes, FatalError> {
+47    let attr = expr(context, exp, Some(expected))?;
+48
+49    match try_coerce_type(context, Some(exp), attr.typ, expected, sink) {
+50        Err(TypeCoercionError::RequiresToMem) => {
+51            context.add_diagnostic(errors::to_mem_error(exp.span));
+52        }
+53        Err(TypeCoercionError::Incompatible) => {
+54            context.type_error(
+55                "type mismatch",
+56                exp.span,
+57                expected.deref(context.db()),
+58                attr.typ.deref(context.db()),
+59            );
+60        }
+61        Err(TypeCoercionError::SelfContractType) => {
+62            context.add_diagnostic(errors::self_contract_type_error(
+63                exp.span,
+64                &attr.typ.display(context.db()),
+65            ));
+66        }
+67        Ok(_) => {}
+68    }
+69    Ok(attr)
+70}
+71
+72pub fn value_expr_type(
+73    context: &mut dyn AnalyzerContext,
+74    exp: &Node<fe::Expr>,
+75    expected: Option<TypeId>,
+76) -> Result<TypeId, FatalError> {
+77    let attr = expr(context, exp, expected)?;
+78    Ok(deref_type(context, exp, attr.typ))
+79}
+80
+81/// Gather context information for expressions and check for type errors.
+82pub fn expr(
+83    context: &mut dyn AnalyzerContext,
+84    exp: &Node<fe::Expr>,
+85    expected: Option<TypeId>,
+86) -> Result<ExpressionAttributes, FatalError> {
+87    let attr = match &exp.kind {
+88        fe::Expr::Name(_) => expr_name(context, exp, expected),
+89        fe::Expr::Path(_) => expr_path(context, exp, expected),
+90        fe::Expr::Num(_) => Ok(expr_num(context, exp, expected)),
+91
+92        fe::Expr::Subscript { .. } => expr_subscript(context, exp, expected),
+93        fe::Expr::Attribute { .. } => expr_attribute(context, exp, expected),
+94        fe::Expr::Ternary { .. } => expr_ternary(context, exp, expected),
+95        fe::Expr::BoolOperation { .. } => expr_bool_operation(context, exp),
+96        fe::Expr::BinOperation { .. } => expr_bin_operation(context, exp, expected),
+97        fe::Expr::UnaryOperation { .. } => expr_unary_operation(context, exp, expected),
+98        fe::Expr::CompOperation { .. } => expr_comp_operation(context, exp),
+99        fe::Expr::Call {
+100            func,
+101            generic_args,
+102            args,
+103        } => expr_call(context, func, generic_args, args, expected),
+104        fe::Expr::List { elts } => expr_list(context, elts, expected),
+105        fe::Expr::Repeat { .. } => expr_repeat(context, exp, expected),
+106        fe::Expr::Tuple { .. } => expr_tuple(context, exp, expected),
+107        fe::Expr::Str(_) => expr_str(context, exp, expected),
+108        fe::Expr::Bool(_) => Ok(ExpressionAttributes::new(TypeId::bool(context.db()))),
+109        fe::Expr::Unit => Ok(ExpressionAttributes::new(TypeId::unit(context.db()))),
+110    }?;
+111    context.add_expression(exp, attr.clone());
+112    Ok(attr)
+113}
+114
+115pub fn error_if_not_bool(
+116    context: &mut dyn AnalyzerContext,
+117    exp: &Node<fe::Expr>,
+118    msg: &str,
+119) -> Result<(), FatalError> {
+120    let bool_type = TypeId::bool(context.db());
+121    let attr = expr(context, exp, Some(bool_type))?;
+122    if try_coerce_type(context, Some(exp), attr.typ, bool_type, false).is_err() {
+123        context.type_error(msg, exp.span, bool_type, attr.typ);
+124    }
+125    Ok(())
+126}
+127
+128fn expr_list(
+129    context: &mut dyn AnalyzerContext,
+130    elts: &[Node<fe::Expr>],
+131    expected_type: Option<TypeId>,
+132) -> Result<ExpressionAttributes, FatalError> {
+133    let expected_inner = expected_type
+134        .and_then(|id| id.deref(context.db()).as_array(context.db()))
+135        .map(|arr| arr.inner);
+136
+137    if elts.is_empty() {
+138        return Ok(ExpressionAttributes::new(context.db().intern_type(
+139            Type::Array(Array {
+140                size: 0,
+141                inner: expected_inner.unwrap_or_else(|| TypeId::unit(context.db())),
+142            }),
+143        )));
+144    }
+145
+146    let inner_type = if let Some(inner) = expected_inner {
+147        for elt in elts {
+148            expect_expr_type(context, elt, inner, true)?;
+149        }
+150        inner
+151    } else {
+152        let first_attr = expr(context, &elts[0], None)?;
+153
+154        // Assuming every element attribute should match the attribute of 0th element
+155        // of list.
+156        for elt in &elts[1..] {
+157            let element_attributes = expr(context, elt, Some(first_attr.typ))?;
+158
+159            match try_coerce_type(
+160                context,
+161                Some(elt),
+162                element_attributes.typ,
+163                first_attr.typ,
+164                true,
+165            ) {
+166                Err(TypeCoercionError::RequiresToMem) => {
+167                    context.add_diagnostic(errors::to_mem_error(elt.span));
+168                }
+169                Err(TypeCoercionError::Incompatible) => {
+170                    context.fancy_error(
+171                        "array elements must have same type",
+172                        vec![
+173                            Label::primary(
+174                                elts[0].span,
+175                                format!("this has type `{}`", first_attr.typ.display(context.db())),
+176                            ),
+177                            Label::secondary(
+178                                elt.span,
+179                                format!(
+180                                    "this has type `{}`",
+181                                    element_attributes.typ.display(context.db())
+182                                ),
+183                            ),
+184                        ],
+185                        vec![],
+186                    );
+187                }
+188                Err(TypeCoercionError::SelfContractType) => {
+189                    context.add_diagnostic(errors::self_contract_type_error(
+190                        elt.span,
+191                        &first_attr.typ.display(context.db()),
+192                    ));
+193                }
+194                Ok(_) => {}
+195            }
+196        }
+197        first_attr.typ
+198    };
+199
+200    Ok(ExpressionAttributes::new(
+201        Type::Array(Array {
+202            size: elts.len(),
+203            inner: inner_type,
+204        })
+205        .id(context.db()),
+206    ))
+207}
+208
+209fn expr_repeat(
+210    context: &mut dyn AnalyzerContext,
+211    exp: &Node<fe::Expr>,
+212    expected_type: Option<TypeId>,
+213) -> Result<ExpressionAttributes, FatalError> {
+214    let (value, len) = match &exp.kind {
+215        fe::Expr::Repeat { value, len } => (value, len),
+216        _ => unreachable!(),
+217    };
+218
+219    let expected_inner = expected_type
+220        .and_then(|id| id.deref(context.db()).as_array(context.db()))
+221        .map(|arr| arr.inner);
+222
+223    let value = expr(context, value, expected_inner)?;
+224
+225    let size = match &len.kind {
+226        GenericArg::Int(size) => Ok(size.kind),
+227        GenericArg::TypeDesc(_) => Err(context.fancy_error(
+228            "expected a constant u256 value",
+229            vec![Label::primary(len.span, "Array length")],
+230            vec!["Note: Array length must be a constant u256".to_string()],
+231        )),
+232        GenericArg::ConstExpr(exp) => {
+233            expr(context, exp, None)?;
+234            if let Constant::Int(len) = eval_expr(context, exp)? {
+235                Ok(len.to_usize().unwrap())
+236            } else {
+237                Err(context.fancy_error(
+238                    "expected a constant u256 value",
+239                    vec![Label::primary(len.span, "Array length")],
+240                    vec!["Note: Array length must be a constant u256".to_string()],
+241                ))
+242            }
+243        }
+244    };
+245
+246    match size {
+247        Ok(size) => Ok(ExpressionAttributes::new(
+248            Type::Array(Array {
+249                size,
+250                inner: value.typ,
+251            })
+252            .id(context.db()),
+253        )),
+254
+255        Err(diag) => {
+256            if let Some(expected) = expected_type {
+257                Ok(ExpressionAttributes::new(expected))
+258            } else {
+259                Err(FatalError::new(diag))
+260            }
+261        }
+262    }
+263}
+264
+265fn expr_tuple(
+266    context: &mut dyn AnalyzerContext,
+267    exp: &Node<fe::Expr>,
+268    expected_type: Option<TypeId>,
+269) -> Result<ExpressionAttributes, FatalError> {
+270    let expected_items = expected_type.and_then(|id| {
+271        id.deref(context.db())
+272            .as_tuple(context.db())
+273            .map(|tup| tup.items)
+274    });
+275
+276    if let fe::Expr::Tuple { elts } = &exp.kind {
+277        let types = elts
+278            .iter()
+279            .enumerate()
+280            .map(|(idx, elt)| {
+281                let exp_type = expected_items
+282                    .as_ref()
+283                    .and_then(|items| items.get(idx).copied());
+284
+285                expr(context, elt, exp_type).map(|attributes| attributes.typ)
+286            })
+287            .collect::<Result<Vec<_>, _>>()?;
+288
+289        if !&types.iter().all(|id| id.has_fixed_size(context.db())) {
+290            // TODO: doesn't need to be fatal if expected.is_some()
+291            return Err(FatalError::new(context.error(
+292                "variable size types can not be part of tuples",
+293                exp.span,
+294                "",
+295            )));
+296        }
+297
+298        Ok(ExpressionAttributes::new(context.db().intern_type(
+299            Type::Tuple(Tuple {
+300                items: types.to_vec().into(),
+301            }),
+302        )))
+303    } else {
+304        unreachable!()
+305    }
+306}
+307
+308fn expr_name(
+309    context: &mut dyn AnalyzerContext,
+310    exp: &Node<fe::Expr>,
+311    expected_type: Option<TypeId>,
+312) -> Result<ExpressionAttributes, FatalError> {
+313    let name = match &exp.kind {
+314        fe::Expr::Name(name) => name,
+315        _ => unreachable!(),
+316    };
+317
+318    let name_thing = context.resolve_name(name, exp.span)?;
+319    expr_named_thing(context, exp, name_thing, expected_type)
+320}
+321
+322fn expr_path(
+323    context: &mut dyn AnalyzerContext,
+324    exp: &Node<fe::Expr>,
+325    expected_type: Option<TypeId>,
+326) -> Result<ExpressionAttributes, FatalError> {
+327    let path = match &exp.kind {
+328        fe::Expr::Path(path) => path,
+329        _ => unreachable!(),
+330    };
+331
+332    let named_thing = context.resolve_path(path, exp.span)?;
+333    expr_named_thing(context, exp, Some(named_thing), expected_type)
+334}
+335
+336fn expr_named_thing(
+337    context: &mut dyn AnalyzerContext,
+338    exp: &Node<fe::Expr>,
+339    named_thing: Option<NamedThing>,
+340    expected_type: Option<TypeId>,
+341) -> Result<ExpressionAttributes, FatalError> {
+342    let ty = match named_thing {
+343        Some(NamedThing::Variable { typ, .. }) => Ok(typ?),
+344        Some(NamedThing::SelfValue { decl, parent, .. }) => {
+345            if let Some(target) = parent {
+346                if decl.is_none() {
+347                    context.fancy_error(
+348                        "`self` is not defined",
+349                        vec![Label::primary(exp.span, "undefined value")],
+350                        if let Item::Function(func_id) = context.parent() {
+351                            vec![
+352                                "add `self` to the scope by including it in the function signature"
+353                                    .to_string(),
+354                                format!(
+355                                    "Example: `fn {}(self, foo: bool)`",
+356                                    func_id.name(context.db())
+357                                ),
+358                            ]
+359                        } else {
+360                            vec!["can't use `self` outside of function".to_string()]
+361                        },
+362                    );
+363                }
+364
+365                let mut self_typ = match target {
+366                    Item::Type(TypeDef::Struct(s)) => Type::Struct(s).id(context.db()),
+367                    Item::Type(TypeDef::Enum(e)) => Type::Enum(e).id(context.db()),
+368                    Item::Impl(id) => id.receiver(context.db()),
+369
+370                    // This can only happen when trait methods can implement a default body
+371                    Item::Trait(id) => {
+372                        return Err(FatalError::new(context.fancy_error(
+373                            &format!(
+374                                "`{}` is a trait, and can't be used as an expression",
+375                                exp.kind
+376                            ),
+377                            vec![
+378                                Label::primary(
+379                                    id.name_span(context.db()),
+380                                    format!("`{}` is defined here as a trait", exp.kind),
+381                                ),
+382                                Label::primary(
+383                                    exp.span,
+384                                    format!("`{}` is used here as a value", exp.kind),
+385                                ),
+386                            ],
+387                            vec![],
+388                        )))
+389                    }
+390                    Item::Type(TypeDef::Contract(c)) => Type::SelfContract(c).id(context.db()),
+391                    _ => unreachable!(),
+392                };
+393                // If there's no `self` param, let it be mut to avoid confusing errors
+394                if decl.map(|d| d.mut_.is_some()).unwrap_or(true) {
+395                    self_typ = Type::Mut(self_typ).id(context.db());
+396                }
+397                Ok(self_typ)
+398            } else {
+399                Err(context.fancy_error(
+400                    "`self` can only be used in contract, struct, trait or impl functions",
+401                    vec![Label::primary(
+402                        exp.span,
+403                        "not allowed in functions defined directly in a module",
+404                    )],
+405                    vec![],
+406                ))
+407            }
+408        }
+409        Some(NamedThing::Item(Item::Constant(id))) => {
+410            let typ = id.typ(context.db())?;
+411
+412            if !typ.has_fixed_size(context.db()) {
+413                panic!("const type must be fixed size")
+414            }
+415
+416            Ok(typ)
+417        }
+418        Some(NamedThing::EnumVariant(variant)) => {
+419            if let Ok(EnumVariantKind::Tuple(_)) = variant.kind(context.db()) {
+420                let name = variant.name_with_parent(context.db());
+421                context.fancy_error(
+422                    &format!(
+423                        "`{}` is not a unit variant",
+424                        variant.name_with_parent(context.db()),
+425                    ),
+426                    vec![
+427                        Label::primary(exp.span, format! {"`{name}` is not a unit variant"}),
+428                        Label::secondary(
+429                            variant.data(context.db()).ast.span,
+430                            format!("`{}` is defined here", variant.name(context.db())),
+431                        ),
+432                    ],
+433                    vec![],
+434                );
+435            }
+436
+437            Ok(variant.parent(context.db()).as_type(context.db()))
+438        }
+439
+440        Some(item) => {
+441            let item_kind = item.item_kind_display_name();
+442            let diag = if let Some(def_span) = item.name_span(context.db()) {
+443                context.fancy_error(
+444                    &format!(
+445                        "`{}` is a {} name, and can't be used as an expression",
+446                        exp.kind, item_kind
+447                    ),
+448                    vec![
+449                        Label::primary(
+450                            def_span,
+451                            format!("`{}` is defined here as a {}", exp.kind, item_kind),
+452                        ),
+453                        Label::primary(exp.span, format!("`{}` is used here as a value", exp.kind)),
+454                    ],
+455                    vec![],
+456                )
+457            } else {
+458                context.error(
+459                    &format!(
+460                        "`{}` is a built-in {} name, and can't be used as an expression",
+461                        exp.kind, item_kind
+462                    ),
+463                    exp.span,
+464                    &format!("`{}` is used here as a value", exp.kind),
+465                )
+466            };
+467            Err(diag)
+468        }
+469        None => Err(context.error(
+470            &format!("cannot find value `{}` in this scope", exp.kind),
+471            exp.span,
+472            "undefined",
+473        )),
+474    };
+475    match ty {
+476        Ok(ty) => Ok(ExpressionAttributes::new(ty)),
+477        Err(diag) => {
+478            if let Some(expected) = expected_type {
+479                Ok(ExpressionAttributes::new(expected))
+480            } else {
+481                Err(FatalError::new(diag))
+482            }
+483        }
+484    }
+485}
+486
+487fn expr_str(
+488    context: &mut dyn AnalyzerContext,
+489    exp: &Node<fe::Expr>,
+490    expected_type: Option<TypeId>,
+491) -> Result<ExpressionAttributes, FatalError> {
+492    if let fe::Expr::Str(string) = &exp.kind {
+493        if !is_valid_string(string) {
+494            context.error("String contains invalid byte sequence", exp.span, "");
+495        };
+496
+497        if !context.is_in_function() {
+498            context.fancy_error(
+499                "string literal can't be used outside function",
+500                vec![Label::primary(exp.span, "string type is used here")],
+501                vec!["Note: string literal can be used only inside function".into()],
+502            );
+503        }
+504
+505        let str_len = string.len();
+506        let expected_str_len = expected_type
+507            .and_then(|id| id.deref(context.db()).as_string(context.db()))
+508            .map(|s| s.max_size)
+509            .unwrap_or(str_len);
+510        // Use an expected string length if an expected length is larger than an actual
+511        // length.
+512        let max_size = if expected_str_len > str_len {
+513            expected_str_len
+514        } else {
+515            str_len
+516        };
+517
+518        return Ok(ExpressionAttributes::new(
+519            Type::String(FeString { max_size }).id(context.db()),
+520        ));
+521    }
+522
+523    unreachable!()
+524}
+525
+526fn is_valid_string(val: &str) -> bool {
+527    const ALLOWED_SPECIAL_CHARS: [u8; 3] = [
+528        9_u8,  // Tab
+529        10_u8, // Newline
+530        13_u8, // Carriage return
+531    ];
+532
+533    const PRINTABLE_ASCII: RangeInclusive<u8> = 32_u8..=126_u8;
+534
+535    for x in val.as_bytes() {
+536        if ALLOWED_SPECIAL_CHARS.contains(x) || PRINTABLE_ASCII.contains(x) {
+537            continue;
+538        } else {
+539            return false;
+540        }
+541    }
+542    true
+543}
+544
+545fn expr_num(
+546    context: &mut dyn AnalyzerContext,
+547    exp: &Node<fe::Expr>,
+548    expected_type: Option<TypeId>,
+549) -> ExpressionAttributes {
+550    let num = match &exp.kind {
+551        fe::Expr::Num(num) => num,
+552        _ => unreachable!(),
+553    };
+554
+555    let literal = numeric::Literal::new(num);
+556    let num = literal
+557        .parse::<BigInt>()
+558        .expect("the numeric literal contains a invalid digit");
+559
+560    if expected_type == Some(TypeId::address(context.db())) {
+561        if num < BigInt::zero() && num > types::address_max() {
+562            context.error(
+563                "literal out of range for `address` type",
+564                exp.span,
+565                "does not fit into type `address`",
+566            );
+567        }
+568        // TODO: error if literal.radix != Radix::Hexadecimal ?
+569        return ExpressionAttributes::new(TypeId::address(context.db()));
+570    }
+571
+572    let int_typ = expected_type
+573        .and_then(|id| id.deref(context.db()).as_int(context.db()))
+574        .unwrap_or(Integer::U256);
+575    validate_numeric_literal_fits_type(context, num, exp.span, int_typ);
+576    return ExpressionAttributes::new(TypeId::int(context.db(), int_typ));
+577}
+578
+579fn expr_subscript(
+580    context: &mut dyn AnalyzerContext,
+581    exp: &Node<fe::Expr>,
+582    expected_type: Option<TypeId>,
+583) -> Result<ExpressionAttributes, FatalError> {
+584    if let fe::Expr::Subscript { value, index } = &exp.kind {
+585        let value_ty = expr_type(context, value)?;
+586        let expected_index_ty = operations::expected_index_type(context, value_ty);
+587        let index_ty = expr(context, index, expected_index_ty)?.typ;
+588
+589        // performs type checking
+590        let typ = match operations::index(context, value_ty, index_ty, index) {
+591            Err(err) => {
+592                let diag = match err {
+593                    IndexingError::NotSubscriptable => context.fancy_error(
+594                        &format!(
+595                            "`{}` type is not subscriptable",
+596                            value_ty.display(context.db())
+597                        ),
+598                        vec![Label::primary(value.span, "unsubscriptable type")],
+599                        vec!["Note: Only arrays and maps are subscriptable".into()],
+600                    ),
+601                    IndexingError::WrongIndexType => context.fancy_error(
+602                        &format!(
+603                            "can not subscript {} with type {}",
+604                            value_ty.display(context.db()),
+605                            index_ty.display(context.db())
+606                        ),
+607                        vec![Label::primary(index.span, "wrong index type")],
+608                        vec![],
+609                    ),
+610                };
+611                if let Some(expected) = expected_type {
+612                    expected
+613                } else {
+614                    return Err(FatalError::new(diag));
+615                }
+616            }
+617            Ok(t) => t,
+618        };
+619
+620        return Ok(ExpressionAttributes::new(typ));
+621    }
+622
+623    unreachable!()
+624}
+625
+626fn expr_attribute(
+627    context: &mut dyn AnalyzerContext,
+628    exp: &Node<fe::Expr>,
+629    expected_type: Option<TypeId>,
+630) -> Result<ExpressionAttributes, FatalError> {
+631    let (target, field) = match &exp.kind {
+632        fe::Expr::Attribute { value, attr } => (value, attr),
+633        _ => unreachable!(),
+634    };
+635
+636    let attrs = expr(context, target, None)?;
+637    let typ = match field_type(context, attrs.typ, &field.kind, field.span) {
+638        Ok(t) => t,
+639        Err(err) => {
+640            if let Some(expected) = expected_type {
+641                expected
+642            } else {
+643                return Err(err);
+644            }
+645        }
+646    };
+647    Ok(ExpressionAttributes::new(typ))
+648}
+649
+650fn field_type(
+651    context: &mut dyn AnalyzerContext,
+652    obj: TypeId,
+653    field_name: &str,
+654    field_span: Span,
+655) -> Result<TypeId, FatalError> {
+656    match obj.typ(context.db()) {
+657        Type::Mut(inner) => {
+658            Ok(Type::Mut(field_type(context, inner, field_name, field_span)?).id(context.db()))
+659        }
+660        Type::SPtr(inner) => {
+661            Ok(Type::SPtr(field_type(context, inner, field_name, field_span)?).id(context.db()))
+662        }
+663        Type::SelfType(TraitOrType::TypeId(inner)) => Ok(Type::SelfType(TraitOrType::TypeId(
+664            field_type(context, inner, field_name, field_span)?,
+665        ))
+666        .id(context.db())),
+667        Type::SelfContract(id) => match id.field_type(context.db(), field_name) {
+668            Some(typ) => Ok(typ?.make_sptr(context.db())),
+669            None => Err(FatalError::new(context.fancy_error(
+670                &format!("No field `{field_name}` exists on this contract"),
+671                vec![Label::primary(field_span, "undefined field")],
+672                vec![],
+673            ))),
+674        },
+675
+676        Type::Struct(struct_) => {
+677            if let Some(struct_field) = struct_.field(context.db(), field_name) {
+678                if !context.root_item().is_struct(&struct_) && !struct_field.is_public(context.db())
+679                {
+680                    context.fancy_error(
+681                        &format!(
+682                            "Can not access private field `{}` on struct `{}`",
+683                            field_name,
+684                            struct_.name(context.db())
+685                        ),
+686                        vec![Label::primary(field_span, "private field")],
+687                        vec![],
+688                    );
+689                }
+690                Ok(struct_field.typ(context.db())?)
+691            } else {
+692                Err(FatalError::new(context.fancy_error(
+693                    &format!(
+694                        "No field `{}` exists on struct `{}`",
+695                        field_name,
+696                        struct_.name(context.db())
+697                    ),
+698                    vec![Label::primary(field_span, "undefined field")],
+699                    vec![],
+700                )))
+701            }
+702        }
+703        Type::Tuple(tuple) => {
+704            let item_index = tuple_item_index(field_name).ok_or_else(||
+705                    FatalError::new(context.fancy_error(
+706                        &format!("No field `{field_name}` exists on this tuple"),
+707                        vec![
+708                            Label::primary(
+709                                field_span,
+710                                "undefined field",
+711                            )
+712                        ],
+713                        vec!["Note: Tuple values are accessed via `itemN` properties such as `item0` or `item1`".into()],
+714                    )))?;
+715
+716            tuple.items.get(item_index).copied().ok_or_else(|| {
+717                FatalError::new(context.fancy_error(
+718                    &format!("No field `item{item_index}` exists on this tuple"),
+719                    vec![Label::primary(field_span, "unknown field")],
+720                    vec![format!(
+721                        "Note: The highest possible field for this tuple is `item{}`",
+722                        tuple.items.len() - 1
+723                    )],
+724                ))
+725            })
+726        }
+727        _ => Err(FatalError::new(context.fancy_error(
+728            &format!(
+729                "No field `{}` exists on type {}",
+730                field_name,
+731                obj.display(context.db())
+732            ),
+733            vec![Label::primary(field_span, "unknown field")],
+734            vec![],
+735        ))),
+736    }
+737}
+738
+739/// Pull the item index from the attribute string (e.g. "item4" -> "4").
+740fn tuple_item_index(item: &str) -> Option<usize> {
+741    if item.len() < 5 || &item[..4] != "item" || (item.len() > 5 && &item[4..5] == "0") {
+742        None
+743    } else {
+744        item[4..].parse::<usize>().ok()
+745    }
+746}
+747
+748fn expr_bin_operation(
+749    context: &mut dyn AnalyzerContext,
+750    exp: &Node<fe::Expr>,
+751    expected_type: Option<TypeId>,
+752) -> Result<ExpressionAttributes, FatalError> {
+753    let (left, op, right) = match &exp.kind {
+754        fe::Expr::BinOperation { left, op, right } => (left, op, right),
+755        _ => unreachable!(),
+756    };
+757
+758    let (left_expected, right_expected) = match &op.kind {
+759        // In shift operations, the right hand side may have a different type than the left hand
+760        // side because the right hand side needs to be unsigned. The type of the
+761        // entire expression is determined by the left hand side anyway so we don't
+762        // try to coerce the right hand side in this case.
+763        fe::BinOperator::LShift | fe::BinOperator::RShift => (expected_type, None),
+764        _ => (expected_type, expected_type),
+765    };
+766
+767    let left_attributes = expr(context, left, left_expected)?;
+768    let right_attributes = expr(context, right, right_expected)?;
+769
+770    match operations::bin(
+771        context,
+772        left_attributes.typ,
+773        left,
+774        op.kind,
+775        right_attributes.typ,
+776        right,
+777    ) {
+778        Err(err) => {
+779            let diag = add_bin_operations_errors(
+780                context,
+781                &op.kind,
+782                left.span,
+783                left_attributes.typ,
+784                right.span,
+785                right_attributes.typ,
+786                err,
+787            );
+788            if let Some(expected) = expected_type {
+789                Ok(ExpressionAttributes::new(expected))
+790            } else {
+791                Err(FatalError::new(diag))
+792            }
+793        }
+794        Ok(typ) => Ok(ExpressionAttributes::new(typ)),
+795    }
+796}
+797
+798fn expr_unary_operation(
+799    context: &mut dyn AnalyzerContext,
+800    exp: &Node<fe::Expr>,
+801    expected_type: Option<TypeId>,
+802) -> Result<ExpressionAttributes, FatalError> {
+803    let (op, operand) = match &exp.kind {
+804        fe::Expr::UnaryOperation { op, operand } => (op, operand),
+805        _ => unreachable!(),
+806    };
+807
+808    let operand_ty = value_expr_type(context, operand, None)?;
+809
+810    let emit_err = |context: &mut dyn AnalyzerContext, expected| {
+811        context.error(
+812            &format!(
+813                "cannot apply unary operator `{}` to type `{}`",
+814                op.kind,
+815                operand_ty.display(context.db())
+816            ),
+817            operand.span,
+818            &format!(
+819                "this has type `{}`; expected {}",
+820                operand_ty.display(context.db()),
+821                expected
+822            ),
+823        );
+824    };
+825
+826    return match op.kind {
+827        fe::UnaryOperator::USub => {
+828            let expected_int_type = expected_type
+829                .and_then(|id| id.as_int(context.db()))
+830                .unwrap_or(Integer::I256);
+831
+832            if operand_ty.is_integer(context.db()) {
+833                if let fe::Expr::Num(num_str) = &operand.kind {
+834                    let num = -to_bigint(num_str);
+835                    validate_numeric_literal_fits_type(context, num, exp.span, expected_int_type);
+836                }
+837                if !expected_int_type.is_signed() {
+838                    context.error(
+839                        "Can not apply unary operator",
+840                        op.span + operand.span,
+841                        &format!(
+842                            "Expected unsigned type `{expected_int_type}`. Unary operator `-` can not be used here.",
+843                        ),
+844                    );
+845                }
+846            } else {
+847                emit_err(context, "a numeric type")
+848            }
+849            Ok(ExpressionAttributes::new(TypeId::int(
+850                context.db(),
+851                expected_int_type,
+852            )))
+853        }
+854        fe::UnaryOperator::Not => {
+855            if !operand_ty.is_bool(context.db()) {
+856                emit_err(context, "type `bool`");
+857            }
+858            Ok(ExpressionAttributes::new(TypeId::bool(context.db())))
+859        }
+860        fe::UnaryOperator::Invert => {
+861            if !operand_ty.is_integer(context.db()) {
+862                emit_err(context, "a numeric type")
+863            }
+864
+865            Ok(ExpressionAttributes::new(operand_ty))
+866        }
+867    };
+868}
+869
+870fn expr_call(
+871    context: &mut dyn AnalyzerContext,
+872    func: &Node<fe::Expr>,
+873    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+874    args: &Node<Vec<Node<fe::CallArg>>>,
+875    expected_type: Option<TypeId>,
+876) -> Result<ExpressionAttributes, FatalError> {
+877    let (attributes, call_type) = match &func.kind {
+878        fe::Expr::Name(name) => expr_call_name(context, name, func, generic_args, args)?,
+879        fe::Expr::Path(path) => expr_call_path(context, path, func, generic_args, args)?,
+880        fe::Expr::Attribute { value, attr } => {
+881            // TODO: err if there are generic args
+882            expr_call_method(context, value, attr, generic_args, args)?
+883        }
+884        _ => {
+885            let expression = expr(context, func, None)?;
+886            let diag = context.fancy_error(
+887                &format!(
+888                    "`{}` type is not callable",
+889                    expression.typ.display(context.db())
+890                ),
+891                vec![Label::primary(
+892                    func.span,
+893                    format!("this has type `{}`", expression.typ.display(context.db())),
+894                )],
+895                vec![],
+896            );
+897            return if let Some(expected) = expected_type {
+898                Ok(ExpressionAttributes::new(expected))
+899            } else {
+900                Err(FatalError::new(diag))
+901            };
+902        }
+903    };
+904
+905    if !context.inherits_type(BlockScopeType::Unsafe) && call_type.is_unsafe(context.db()) {
+906        let mut labels = vec![Label::primary(func.span, "call to unsafe function")];
+907        let fn_name = call_type.function_name(context.db());
+908        if let Some(function) = call_type.function() {
+909            let def_name_span = function.name_span(context.db());
+910            let unsafe_span = function.unsafe_span(context.db());
+911            labels.push(Label::secondary(
+912                def_name_span + unsafe_span,
+913                format!("`{}` is defined here as unsafe", &fn_name),
+914            ))
+915        }
+916        context.fancy_error(
+917            &format!("unsafe function `{}` can only be called in an unsafe function or block",
+918                     &fn_name),
+919            labels,
+920            vec!["Hint: put this call in an `unsafe` block if you're confident that it's safe to use here".into()],
+921        );
+922    }
+923
+924    if context.is_in_function() {
+925        context.add_call(func, call_type);
+926    } else {
+927        context.error(
+928            "calling function outside function",
+929            func.span,
+930            "function can only be called inside function",
+931        );
+932    }
+933
+934    Ok(attributes)
+935}
+936
+937fn expr_call_name<T: std::fmt::Display>(
+938    context: &mut dyn AnalyzerContext,
+939    name: &str,
+940    func: &Node<T>,
+941    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+942    args: &Node<Vec<Node<fe::CallArg>>>,
+943) -> Result<(ExpressionAttributes, CallType), FatalError> {
+944    check_for_call_to_special_fns(context, name, func.span)?;
+945
+946    let named_thing = context.resolve_name(name, func.span)?.ok_or_else(|| {
+947        // Check for call to a fn in the current class that takes self.
+948        if context.is_in_function() {
+949            let func_id = context.parent_function();
+950            if let Some(function) = func_id
+951                .sig(context.db())
+952                .self_item(context.db())
+953                .and_then(|target| target.function_sig(context.db(), name))
+954                .filter(|fun| fun.takes_self(context.db()))
+955            {
+956                // TODO: this doesn't have to be fatal
+957                FatalError::new(context.fancy_error(
+958                    &format!("`{name}` must be called via `self`"),
+959                    vec![
+960                        Label::primary(
+961                            function.name_span(context.db()),
+962                            format!("`{name}` is defined here as a function that takes `self`"),
+963                        ),
+964                        Label::primary(
+965                            func.span,
+966                            format!("`{name}` is called here as a standalone function"),
+967                        ),
+968                    ],
+969                    vec![format!(
+970                        "Suggestion: use `self.{name}(...)` instead of `{name}(...)`"
+971                    )],
+972                ))
+973            } else {
+974                FatalError::new(context.error(
+975                    &format!("`{name}` is not defined"),
+976                    func.span,
+977                    &format!("`{name}` has not been defined in this context"),
+978                ))
+979            }
+980        } else {
+981            FatalError::new(context.error(
+982                "calling function outside function",
+983                func.span,
+984                "function can only be called inside function",
+985            ))
+986        }
+987    })?;
+988
+989    expr_call_named_thing(context, named_thing, func, generic_args, args)
+990}
+991
+992fn expr_call_path<T: std::fmt::Display>(
+993    context: &mut dyn AnalyzerContext,
+994    path: &fe::Path,
+995    func: &Node<T>,
+996    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+997    args: &Node<Vec<Node<fe::CallArg>>>,
+998) -> Result<(ExpressionAttributes, CallType), FatalError> {
+999    match context.resolve_visible_path(path) {
+1000        Some(named_thing) => {
+1001            check_visibility(context, &named_thing, func.span);
+1002            validate_has_no_conflicting_trait_in_scope(context, &named_thing, path, func)?;
+1003            expr_call_named_thing(context, named_thing, func, generic_args, args)
+1004        }
+1005        // If we we can't resolve a call to a path e.g. `foo::Bar::do_thing()` there is a chance that `do_thing`
+1006        // still exists as as a trait associated function for `foo::Bar`.
+1007        None => expr_call_trait_associated_function(context, path, func, generic_args, args),
+1008    }
+1009}
+1010
+1011fn validate_has_no_conflicting_trait_in_scope<T: std::fmt::Display>(
+1012    context: &mut dyn AnalyzerContext,
+1013    named_thing: &NamedThing,
+1014    path: &fe::Path,
+1015    func: &Node<T>,
+1016) -> Result<(), FatalError> {
+1017    let fn_name = &path.segments.last().unwrap().kind;
+1018    let parent_path = path.remove_last();
+1019    let parent_thing = context.resolve_path(&parent_path, func.span)?;
+1020
+1021    if let NamedThing::Item(Item::Type(val)) = parent_thing {
+1022        let type_id = val.type_id(context.db())?;
+1023        let (_, in_scope_candidates) = type_id.trait_function_candidates(context, fn_name);
+1024
+1025        if !in_scope_candidates.is_empty() {
+1026            let labels = vec![Label::primary(
+1027                named_thing.name_span(context.db()).unwrap(),
+1028                format!(
+1029                    "candidate 1 is defined here on the {}",
+1030                    parent_thing.item_kind_display_name(),
+1031                ),
+1032            )]
+1033            .into_iter()
+1034            .chain(
+1035                in_scope_candidates
+1036                    .iter()
+1037                    .enumerate()
+1038                    .map(|(idx, (fun, _impl))| {
+1039                        Label::primary(
+1040                            fun.name_span(context.db()),
+1041                            format!(
+1042                                "candidate #{} is defined here on trait `{}`",
+1043                                idx + 2,
+1044                                _impl.trait_id(context.db()).name(context.db())
+1045                            ),
+1046                        )
+1047                    }),
+1048            )
+1049            .collect::<Vec<_>>();
+1050
+1051            return Err(FatalError::new(context.fancy_error(
+1052                "multiple applicable items in scope",
+1053                labels,
+1054                vec![
+1055                    "Hint: Rename one of the methods or make sure only one of them is in scope"
+1056                        .into(),
+1057                ],
+1058            )));
+1059        }
+1060    }
+1061
+1062    Ok(())
+1063}
+1064
+1065fn expr_call_trait_associated_function<T: std::fmt::Display>(
+1066    context: &mut dyn AnalyzerContext,
+1067    path: &fe::Path,
+1068    func: &Node<T>,
+1069    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1070    args: &Node<Vec<Node<fe::CallArg>>>,
+1071) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1072    let fn_name = &path.segments.last().unwrap().kind;
+1073    let parent_path = path.remove_last();
+1074    let parent_thing = context.resolve_path(&parent_path, func.span)?;
+1075
+1076    if let NamedThing::Item(Item::Type(val)) = parent_thing {
+1077        let type_id = val.type_id(context.db())?;
+1078
+1079        let (candidates, in_scope_candidates) = type_id.trait_function_candidates(context, fn_name);
+1080
+1081        if in_scope_candidates.len() > 1 {
+1082            context.fancy_error(
+1083                "multiple applicable items in scope",
+1084                in_scope_candidates
+1085                    .iter()
+1086                    .enumerate()
+1087                    .map(|(idx, (fun, _impl))| {
+1088                        Label::primary(
+1089                            fun.name_span(context.db()),
+1090                            format!(
+1091                                "candidate #{} is defined here on trait `{}`",
+1092                                idx + 1,
+1093                                _impl.trait_id(context.db()).name(context.db())
+1094                            ),
+1095                        )
+1096                    })
+1097                    .collect(),
+1098                vec![
+1099                    "Hint: Rename one of the methods or make sure only one of them is in scope"
+1100                        .into(),
+1101                ],
+1102            );
+1103            // We arbitrarily carry on with the first candidate since the error doesn't need to be fatal
+1104            let (fun, _) = in_scope_candidates[0];
+1105            return expr_call_pure(context, fun, func.span, generic_args, args);
+1106        } else if in_scope_candidates.is_empty() && !candidates.is_empty() {
+1107            context.fancy_error(
+1108                "Applicable items exist but are not in scope",
+1109                candidates.iter().enumerate().map(|(idx, (fun, _impl ))| {
+1110                    Label::primary(fun.name_span(context.db()), format!(
+1111                        "candidate #{} is defined here on trait `{}`",
+1112                        idx + 1,
+1113                        _impl.trait_id(context.db()).name(context.db())
+1114                    ))
+1115                }).collect(),
+1116                vec!["Hint: Bring one of these candidates in scope via `use module_name::trait_name`".into()],
+1117            );
+1118            // We arbitrarily carry on with an applicable candidate since the error doesn't need to be fatal
+1119            let (fun, _) = candidates[0];
+1120            return expr_call_pure(context, fun, func.span, generic_args, args);
+1121        } else if in_scope_candidates.len() == 1 {
+1122            let (fun, _) = in_scope_candidates[0];
+1123            return expr_call_pure(context, fun, func.span, generic_args, args);
+1124        }
+1125    }
+1126
+1127    // At this point, we will have an error so we run `resolve_path` to register any errors that we
+1128    // did not report yet
+1129    context.resolve_path(path, func.span)?;
+1130
+1131    Err(FatalError::new(context.error(
+1132        "unresolved path item",
+1133        func.span,
+1134        "not found",
+1135    )))
+1136}
+1137
+1138fn expr_call_named_thing<T: std::fmt::Display>(
+1139    context: &mut dyn AnalyzerContext,
+1140    named_thing: NamedThing,
+1141    func: &Node<T>,
+1142    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1143    args: &Node<Vec<Node<fe::CallArg>>>,
+1144) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1145    match named_thing {
+1146        NamedThing::Item(Item::BuiltinFunction(function)) => {
+1147            expr_call_builtin_function(context, function, func.span, generic_args, args)
+1148        }
+1149        NamedThing::Item(Item::Intrinsic(function)) => {
+1150            expr_call_intrinsic(context, function, func.span, generic_args, args)
+1151        }
+1152        NamedThing::Item(Item::Function(function)) => {
+1153            expr_call_pure(context, function, func.span, generic_args, args)
+1154        }
+1155        NamedThing::Item(Item::Type(def)) => {
+1156            if let Some(args) = generic_args {
+1157                context.fancy_error(
+1158                    &format!("`{}` type is not generic", func.kind),
+1159                    vec![Label::primary(
+1160                        args.span,
+1161                        "unexpected generic argument list",
+1162                    )],
+1163                    vec![],
+1164                );
+1165            }
+1166            let typ = def.type_id(context.db())?;
+1167            expr_call_type_constructor(context, typ, func.span, args)
+1168        }
+1169        NamedThing::Item(Item::GenericType(generic)) => {
+1170            let concrete_type =
+1171                apply_generic_type_args(context, generic, func.span, generic_args.as_ref())?;
+1172            expr_call_type_constructor(context, concrete_type, func.span, args)
+1173        }
+1174        NamedThing::Item(Item::Constant(id)) => Err(FatalError::new(context.error(
+1175            &format!("`{}` is not callable", func.kind),
+1176            func.span,
+1177            &format!(
+1178                "`{}` is a constant of type `{}`, and can't be used as a function",
+1179                func.kind,
+1180                id.typ(context.db())?.display(context.db()),
+1181            ),
+1182        ))),
+1183        NamedThing::Item(Item::Trait(_)) => Err(FatalError::new(context.error(
+1184            &format!("`{}` is not callable", func.kind),
+1185            func.span,
+1186            &format!(
+1187                "`{}` is a trait, and can't be used as a function",
+1188                func.kind
+1189            ),
+1190        ))),
+1191        NamedThing::Item(Item::Impl(_)) => unreachable!(),
+1192        NamedThing::Item(Item::Attribute(_)) => unreachable!(),
+1193        NamedThing::Item(Item::Ingot(_)) => Err(FatalError::new(context.error(
+1194            &format!("`{}` is not callable", func.kind),
+1195            func.span,
+1196            &format!(
+1197                "`{}` is an ingot, and can't be used as a function",
+1198                func.kind
+1199            ),
+1200        ))),
+1201        NamedThing::Item(Item::Module(_)) => Err(FatalError::new(context.error(
+1202            &format!("`{}` is not callable", func.kind),
+1203            func.span,
+1204            &format!(
+1205                "`{}` is a module, and can't be used as a function",
+1206                func.kind
+1207            ),
+1208        ))),
+1209
+1210        NamedThing::EnumVariant(variant) => {
+1211            expr_call_enum_constructor(context, func.span, variant, args)
+1212        }
+1213
+1214        // Nothing else is callable (for now at least)
+1215        NamedThing::SelfValue { .. } => Err(FatalError::new(context.error(
+1216            "`self` is not callable",
+1217            func.span,
+1218            "can't be used as a function",
+1219        ))),
+1220
+1221        NamedThing::Variable { typ, span, .. } => Err(FatalError::new(context.fancy_error(
+1222            &format!("`{}` is not callable", func.kind),
+1223            vec![
+1224                Label::secondary(
+1225                    span,
+1226                    format!("`{}` has type `{}`", func.kind, typ?.display(context.db())),
+1227                ),
+1228                Label::primary(
+1229                    func.span,
+1230                    format!("`{}` can't be used as a function", func.kind),
+1231                ),
+1232            ],
+1233            vec![],
+1234        ))),
+1235    }
+1236}
+1237
+1238fn expr_call_builtin_function(
+1239    context: &mut dyn AnalyzerContext,
+1240    function: GlobalFunction,
+1241    name_span: Span,
+1242    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1243    args: &Node<Vec<Node<fe::CallArg>>>,
+1244) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1245    if let Some(args) = generic_args {
+1246        context.error(
+1247            &format!(
+1248                "`{}` function does not expect generic arguments",
+1249                function.as_ref()
+1250            ),
+1251            args.span,
+1252            "unexpected generic argument list",
+1253        );
+1254    }
+1255
+1256    let argument_attributes = expr_call_args(context, args)?;
+1257
+1258    let attrs = match function {
+1259        GlobalFunction::Keccak256 => {
+1260            validate_arg_count(context, function.as_ref(), name_span, args, 1, "argument");
+1261            expect_no_label_on_arg(context, args, 0);
+1262
+1263            if let Some(arg_typ) = argument_attributes.first().map(|attr| &attr.typ) {
+1264                match arg_typ.typ(context.db()) {
+1265                    Type::Array(Array { inner, .. }) if inner.typ(context.db()) == Type::u8() => {}
+1266                    _ => {
+1267                        context.fancy_error(
+1268                            &format!(
+1269                                "`{}` can not be used as an argument to `{}`",
+1270                                arg_typ.display(context.db()),
+1271                                function.as_ref(),
+1272                            ),
+1273                            vec![Label::primary(args.span, "wrong type")],
+1274                            vec![format!(
+1275                                "Note: `{}` expects a byte array argument",
+1276                                function.as_ref()
+1277                            )],
+1278                        );
+1279                    }
+1280                }
+1281            };
+1282            ExpressionAttributes::new(TypeId::int(context.db(), Integer::U256))
+1283        }
+1284    };
+1285    Ok((attrs, CallType::BuiltinFunction(function)))
+1286}
+1287
+1288fn expr_call_intrinsic(
+1289    context: &mut dyn AnalyzerContext,
+1290    function: Intrinsic,
+1291    name_span: Span,
+1292    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1293    args: &Node<Vec<Node<fe::CallArg>>>,
+1294) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1295    if let Some(args) = generic_args {
+1296        context.error(
+1297            &format!(
+1298                "`{}` function does not expect generic arguments",
+1299                function.as_ref()
+1300            ),
+1301            args.span,
+1302            "unexpected generic argument list",
+1303        );
+1304    }
+1305
+1306    let argument_attributes = expr_call_args(context, args)?;
+1307
+1308    validate_arg_count(
+1309        context,
+1310        function.as_ref(),
+1311        name_span,
+1312        args,
+1313        function.arg_count(),
+1314        "arguments",
+1315    );
+1316    for (idx, arg_attr) in argument_attributes.iter().enumerate() {
+1317        if arg_attr.typ.typ(context.db()) != Type::Base(Base::Numeric(Integer::U256)) {
+1318            context.type_error(
+1319                "arguments to intrinsic functions must be u256",
+1320                args.kind[idx].kind.value.span,
+1321                TypeId::int(context.db(), Integer::U256),
+1322                arg_attr.typ,
+1323            );
+1324        }
+1325    }
+1326
+1327    Ok((
+1328        ExpressionAttributes::new(TypeId::base(context.db(), function.return_type())),
+1329        CallType::Intrinsic(function),
+1330    ))
+1331}
+1332
+1333fn validate_visibility_of_called_fn(
+1334    context: &mut dyn AnalyzerContext,
+1335    call_span: Span,
+1336    called_fn: FunctionSigId,
+1337) {
+1338    let fn_parent = called_fn.parent(context.db());
+1339
+1340    // We don't need to validate `pub` if the called function is a module function
+1341    if let Item::Module(_) = fn_parent {
+1342        return;
+1343    }
+1344
+1345    let name = called_fn.name(context.db());
+1346    let parent_name = fn_parent.name(context.db());
+1347
+1348    let is_called_from_same_item = fn_parent == context.parent_function().parent(context.db());
+1349    if !called_fn.is_public(context.db()) && !is_called_from_same_item {
+1350        context.fancy_error(
+1351            &format!(
+1352                "the function `{}` on `{} {}` is private",
+1353                name,
+1354                fn_parent.item_kind_display_name(),
+1355                fn_parent.name(context.db())
+1356            ),
+1357            vec![
+1358                Label::primary(call_span, "this function is not `pub`"),
+1359                Label::secondary(
+1360                    called_fn.name_span(context.db()),
+1361                    format!("`{name}` is defined here"),
+1362                ),
+1363            ],
+1364            vec![
+1365                format!(
+1366                    "`{name}` can only be called from other functions within `{parent_name}`"
+1367                ),
+1368                format!(
+1369                    "Hint: use `pub fn {name}(..)` to make `{name}` callable from outside of `{parent_name}`"
+1370                ),
+1371            ],
+1372        );
+1373    }
+1374}
+1375
+1376fn expr_call_pure(
+1377    context: &mut dyn AnalyzerContext,
+1378    function: FunctionId,
+1379    call_span: Span,
+1380    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1381    args: &Node<Vec<Node<fe::CallArg>>>,
+1382) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1383    let sig = function.sig(context.db());
+1384    validate_visibility_of_called_fn(context, call_span, sig);
+1385
+1386    let fn_name = function.name(context.db());
+1387    if let Some(args) = generic_args {
+1388        context.fancy_error(
+1389            &format!("`{fn_name}` function is not generic"),
+1390            vec![Label::primary(
+1391                args.span,
+1392                "unexpected generic argument list",
+1393            )],
+1394            vec![],
+1395        );
+1396    }
+1397
+1398    if function.is_test(context.db()) {
+1399        context.fancy_error(
+1400            &format!("`{fn_name}` is a test function"),
+1401            vec![Label::primary(call_span, "test functions are not callable")],
+1402            vec![],
+1403        );
+1404    }
+1405
+1406    let sig = function.signature(context.db());
+1407    let name_span = function.name_span(context.db());
+1408    validate_named_args(context, &fn_name, name_span, args, &sig.params)?;
+1409    borrowck::check_fn_call_arg_borrows(context, &fn_name, None, &args.kind, &sig.params);
+1410
+1411    let return_type = sig.return_type.clone()?;
+1412    Ok((
+1413        ExpressionAttributes::new(return_type),
+1414        CallType::Pure(function),
+1415    ))
+1416}
+1417
+1418fn expr_call_type_constructor(
+1419    context: &mut dyn AnalyzerContext,
+1420    into_type: TypeId,
+1421    into_span: Span,
+1422    args: &Node<Vec<Node<fe::CallArg>>>,
+1423) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1424    let typ = into_type.typ(context.db());
+1425    match typ {
+1426        Type::Struct(struct_type) => {
+1427            return expr_call_struct_constructor(context, into_span, struct_type, args)
+1428        }
+1429        Type::Base(Base::Bool)
+1430        | Type::Enum(_)
+1431        | Type::Array(_)
+1432        | Type::Map(_)
+1433        | Type::Generic(_) => {
+1434            return Err(FatalError::new(context.error(
+1435                &format!("`{}` type is not callable", typ.display(context.db())),
+1436                into_span,
+1437                "",
+1438            )))
+1439        }
+1440        Type::SPtr(_) => unreachable!(), // unnameable
+1441        _ => {}
+1442    }
+1443
+1444    // These all expect 1 arg, for now.
+1445    let type_name = typ.name(context.db());
+1446    validate_arg_count(context, &type_name, into_span, args, 1, "argument");
+1447    expect_no_label_on_arg(context, args, 0);
+1448
+1449    if let Some(arg) = args.kind.first() {
+1450        let expected = into_type.is_integer(context.db()).then_some(into_type);
+1451        let from_type = expr(context, &arg.kind.value, expected)?.typ;
+1452        try_cast_type(context, from_type, &arg.kind.value, into_type, into_span);
+1453    }
+1454    Ok((
+1455        ExpressionAttributes::new(into_type),
+1456        CallType::TypeConstructor(into_type),
+1457    ))
+1458}
+1459
+1460fn expr_call_struct_constructor(
+1461    context: &mut dyn AnalyzerContext,
+1462    name_span: Span,
+1463    struct_: StructId,
+1464    args: &Node<Vec<Node<fe::CallArg>>>,
+1465) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1466    let name = &struct_.name(context.db());
+1467    // Check visibility of struct.
+1468
+1469    if struct_.has_private_field(context.db()) && !context.root_item().is_struct(&struct_) {
+1470        let labels = struct_
+1471            .fields(context.db())
+1472            .iter()
+1473            .filter_map(|(name, field)| {
+1474                if !field.is_public(context.db()) {
+1475                    Some(Label::primary(
+1476                        field.span(context.db()),
+1477                        format!("Field `{name}` is private"),
+1478                    ))
+1479                } else {
+1480                    None
+1481                }
+1482            })
+1483            .collect();
+1484
+1485        context.fancy_error(
+1486            &format!(
+1487                "Can not call private constructor of struct `{name}` "
+1488            ),
+1489            labels,
+1490            vec![format!(
+1491                "Suggestion: implement a method `new(...)` on struct `{name}` to call the constructor and return the struct"
+1492            )],
+1493        );
+1494    }
+1495
+1496    let db = context.db();
+1497    let fields = struct_
+1498        .fields(db)
+1499        .iter()
+1500        .map(|(name, field)| (name.clone(), field.typ(db), true))
+1501        .collect::<Vec<_>>();
+1502
+1503    validate_named_args(context, name, name_span, args, &fields)?;
+1504
+1505    let struct_type = struct_.as_type(context.db());
+1506    Ok((
+1507        ExpressionAttributes::new(struct_type),
+1508        CallType::TypeConstructor(struct_type),
+1509    ))
+1510}
+1511
+1512fn expr_call_enum_constructor(
+1513    context: &mut dyn AnalyzerContext,
+1514    name_span: Span,
+1515    variant: EnumVariantId,
+1516    args: &Node<Vec<Node<fe::CallArg>>>,
+1517) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1518    let name = &variant.name_with_parent(context.db());
+1519    match variant.kind(context.db())? {
+1520        EnumVariantKind::Unit => {
+1521            let name = variant.name_with_parent(context.db());
+1522            let label = Label::primary(name_span, format! {"`{name}` is a unit variant"});
+1523            context.fancy_error(
+1524                &format!("Can not call a unit variant `{name}`",),
+1525                vec![label],
+1526                vec![format!(
+1527                    "Suggestion: remove the parentheses to construct the unit variant `{name}`",
+1528                )],
+1529            );
+1530        }
+1531        EnumVariantKind::Tuple(elts) => {
+1532            let params: Vec<_> = elts.iter().map(|ty| (None, Ok(*ty), true)).collect();
+1533            validate_named_args(context, name, name_span, args, &params)?;
+1534        }
+1535    }
+1536
+1537    Ok((
+1538        ExpressionAttributes::new(variant.parent(context.db()).as_type(context.db())),
+1539        CallType::EnumConstructor(variant),
+1540    ))
+1541}
+1542
+1543fn expr_call_method(
+1544    context: &mut dyn AnalyzerContext,
+1545    target: &Node<fe::Expr>,
+1546    field: &Node<SmolStr>,
+1547    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1548    args: &Node<Vec<Node<fe::CallArg>>>,
+1549) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1550    // We need to check if the target is a type or a global object before calling
+1551    // `expr()`. When the type method call syntax is changed to `MyType::foo()`
+1552    // and the global objects are replaced by `Context`, we can remove this.
+1553    // All other `NamedThing`s will be handled correctly by `expr()`.
+1554    if let fe::Expr::Name(name) = &target.kind {
+1555        if let Ok(Some(NamedThing::Item(Item::Type(def)))) = context.resolve_name(name, target.span)
+1556        {
+1557            let typ = def.typ(context.db())?;
+1558            return expr_call_type_attribute(context, typ, target.span, field, generic_args, args);
+1559        }
+1560    }
+1561
+1562    let target_attributes = expr(context, target, None)?;
+1563
+1564    // Check built-in methods.
+1565    if let Ok(method) = ValueMethod::from_str(&field.kind) {
+1566        return expr_call_builtin_value_method(
+1567            context,
+1568            target_attributes,
+1569            target,
+1570            method,
+1571            field,
+1572            args,
+1573        );
+1574    }
+1575
+1576    let obj_type = target_attributes.typ.deref(context.db());
+1577    if obj_type.is_contract(context.db()) {
+1578        check_for_call_to_special_fns(context, &field.kind, field.span)?;
+1579    }
+1580
+1581    match obj_type.function_sigs(context.db(), &field.kind).as_ref() {
+1582        [] => Err(FatalError::new(context.fancy_error(
+1583            &format!(
+1584                "No function `{}` exists on type `{}`",
+1585                &field.kind,
+1586                obj_type.display(context.db())
+1587            ),
+1588            vec![Label::primary(field.span, "undefined function")],
+1589            vec![],
+1590        ))),
+1591        [method] => {
+1592            validate_visibility_of_called_fn(context, field.span, *method);
+1593
+1594            if !method.takes_self(context.db()) {
+1595                let prefix = if method.is_module_fn(context.db())
+1596                    && context.module() == method.module(context.db())
+1597                {
+1598                    "".into()
+1599                } else {
+1600                    format!("{}::", method.parent(context.db()).name(context.db()))
+1601                };
+1602
+1603                context.fancy_error(
+1604                    &format!("`{}` must be called without `self`", &field.kind),
+1605                    vec![Label::primary(field.span, "function does not take self")],
+1606                    vec![format!(
+1607                        "Suggestion: try `{}{}(...)` instead of `self.{}(...)`",
+1608                        prefix, &field.kind, &field.kind
+1609                    )],
+1610                );
+1611            }
+1612
+1613            let sig = method.signature(context.db());
+1614            let mut_self = matches!(sig.self_decl.map(|d| d.is_mut()), Some(true));
+1615            if mut_self && !target_attributes.typ.is_mut(context.db()) {
+1616                context.error(
+1617                    &format!("`{}` takes `mut self`", &field.kind),
+1618                    target.span,
+1619                    "this is not mutable",
+1620                );
+1621            }
+1622
+1623            validate_named_args(context, &field.kind, field.span, args, &sig.params)?;
+1624            borrowck::check_fn_call_arg_borrows(
+1625                context,
+1626                &field.kind,
+1627                Some((target, target_attributes.typ)),
+1628                &args.kind,
+1629                &sig.params,
+1630            );
+1631
+1632            let calltype = match obj_type.typ(context.db()) {
+1633                Type::Contract(contract) | Type::SelfContract(contract) => {
+1634                    let method = contract
+1635                        .function(context.db(), &method.name(context.db()))
+1636                        .unwrap();
+1637
+1638                    if is_self_value(target) {
+1639                        CallType::ValueMethod {
+1640                            typ: obj_type,
+1641                            method,
+1642                        }
+1643                    } else {
+1644                        // Contract address needs to be on the stack
+1645                        deref_type(context, target, target_attributes.typ);
+1646                        CallType::External {
+1647                            contract,
+1648                            function: method,
+1649                        }
+1650                    }
+1651                }
+1652                Type::Generic(inner) => CallType::TraitValueMethod {
+1653                    trait_id: *inner.bounds.first().expect("expected trait bound"),
+1654                    method: *method,
+1655                    generic_type: inner,
+1656                },
+1657                _ => {
+1658                    let method = method.function(context.db()).unwrap();
+1659                    if let Type::SPtr(inner) = target_attributes.typ.typ(context.db()) {
+1660                        if matches!(
+1661                            inner.typ(context.db()),
+1662                            Type::Struct(_) | Type::Tuple(_) | Type::Array(_)
+1663                        ) {
+1664                            let kind = obj_type.kind_display_name(context.db());
+1665                            context.fancy_error(
+1666                                &format!("{kind} functions can only be called on {kind} in memory"),
+1667                                vec![
+1668                                    Label::primary(target.span, "this value is in storage"),
+1669                                    Label::secondary(
+1670                                        field.span,
+1671                                        format!("hint: copy the {kind} to memory with `.to_mem()`"),
+1672                                    ),
+1673                                ],
+1674                                vec![],
+1675                            );
+1676                        }
+1677                    }
+1678
+1679                    if let Item::Impl(id) = method.parent(context.db()) {
+1680                        validate_trait_in_scope(context, field.span, method, id);
+1681                    }
+1682
+1683                    CallType::ValueMethod {
+1684                        typ: obj_type,
+1685                        method,
+1686                    }
+1687                }
+1688            };
+1689
+1690            let return_type = sig.return_type.clone()?;
+1691            Ok((ExpressionAttributes::new(return_type), calltype))
+1692        }
+1693        [first, second, ..] => {
+1694            context.fancy_error(
+1695                "multiple applicable items in scope",
+1696                vec![
+1697                    Label::primary(
+1698                        first.name_span(context.db()),
+1699                        format!(
+1700                            "candidate #1 is defined here on the `{}`",
+1701                            first.parent(context.db()).item_kind_display_name()
+1702                        ),
+1703                    ),
+1704                    Label::primary(
+1705                        second.name_span(context.db()),
+1706                        format!(
+1707                            "candidate #2 is defined here on the `{}`",
+1708                            second.parent(context.db()).item_kind_display_name()
+1709                        ),
+1710                    ),
+1711                ],
+1712                vec!["Hint: rename one of the methods to disambiguate".into()],
+1713            );
+1714            let return_type = first.signature(context.db()).return_type.clone()?;
+1715            return Ok((
+1716                ExpressionAttributes::new(return_type),
+1717                CallType::ValueMethod {
+1718                    typ: obj_type,
+1719                    method: first.function(context.db()).unwrap(),
+1720                },
+1721            ));
+1722        }
+1723    }
+1724}
+1725
+1726fn validate_trait_in_scope(
+1727    context: &mut dyn AnalyzerContext,
+1728    name_span: Span,
+1729    called_fn: FunctionId,
+1730    impl_: ImplId,
+1731) {
+1732    let treit = impl_.trait_id(context.db());
+1733    let type_name = impl_.receiver(context.db()).name(context.db());
+1734
+1735    if !context
+1736        .module()
+1737        .is_in_scope(context.db(), Item::Trait(treit))
+1738    {
+1739        context.fancy_error(
+1740            &format!(
+1741                "No method named `{}` found for type `{}` in the current scope",
+1742                called_fn.name(context.db()),
+1743                type_name
+1744            ),
+1745            vec![
+1746                Label::primary(name_span, format!("method not found in `{type_name}`")),
+1747                Label::secondary(called_fn.name_span(context.db()), format!("the method is available for `{type_name}` here"))
+1748            ],
+1749            vec![
+1750                "Hint: items from traits can only be used if the trait is in scope".into(),
+1751                format!("Hint: the following trait is implemented but not in scope; perhaps add a `use` for it: `trait {}`", treit.name(context.db()))
+1752            ],
+1753        );
+1754    }
+1755}
+1756
+1757fn expr_call_builtin_value_method(
+1758    context: &mut dyn AnalyzerContext,
+1759    mut value_attrs: ExpressionAttributes,
+1760    value: &Node<fe::Expr>,
+1761    method: ValueMethod,
+1762    method_name: &Node<SmolStr>,
+1763    args: &Node<Vec<Node<fe::CallArg>>>,
+1764) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1765    // for now all of these functions expect 0 arguments
+1766    validate_arg_count(
+1767        context,
+1768        &method_name.kind,
+1769        method_name.span,
+1770        args,
+1771        0,
+1772        "argument",
+1773    );
+1774
+1775    let ty = value_attrs.typ;
+1776    let calltype = CallType::BuiltinValueMethod {
+1777        method,
+1778        typ: value_attrs.typ,
+1779    };
+1780    match method {
+1781        ValueMethod::ToMem => {
+1782            if ty.is_sptr(context.db()) {
+1783                let inner = ty.deref(context.db());
+1784                if inner.is_primitive(context.db()) {
+1785                    context.fancy_error(
+1786                        "`to_mem()` called on primitive type",
+1787                        vec![
+1788                            Label::primary(
+1789                                value.span,
+1790                                "this value does not need to be explicitly copied to memory",
+1791                            ),
+1792                            Label::secondary(method_name.span, "hint: remove `.to_mem()`"),
+1793                        ],
+1794                        vec![],
+1795                    );
+1796                } else if inner.is_map(context.db()) {
+1797                    context.fancy_error(
+1798                        "`to_mem()` called on a Map",
+1799                        vec![
+1800                            Label::primary(value.span, "Maps can not be copied to memory"),
+1801                            Label::secondary(method_name.span, "hint: remove `.to_mem()`"),
+1802                        ],
+1803                        vec![],
+1804                    );
+1805
+1806                    // TODO: this restriction should be removed
+1807                } else if ty.is_generic(context.db()) {
+1808                    context.fancy_error(
+1809                        "`to_mem()` called on generic type",
+1810                        vec![
+1811                            Label::primary(value.span, "this value can not be copied to memory"),
+1812                            Label::secondary(method_name.span, "hint: remove `.to_mem()`"),
+1813                        ],
+1814                        vec![],
+1815                    );
+1816                }
+1817
+1818                value_attrs.typ = inner;
+1819                return Ok((value_attrs, calltype));
+1820            } else {
+1821                context.fancy_error(
+1822                    "`to_mem()` called on value in memory",
+1823                    vec![
+1824                        Label::primary(value.span, "this value is already in memory"),
+1825                        Label::secondary(
+1826                            method_name.span,
+1827                            "hint: to make a copy, use `.clone()` here",
+1828                        ),
+1829                    ],
+1830                    vec![],
+1831                );
+1832            }
+1833            Ok((value_attrs, calltype))
+1834        }
+1835        ValueMethod::AbiEncode => {
+1836            abi_encoded_type(context, value_attrs.typ, value.span).map(|attr| (attr, calltype))
+1837        }
+1838    }
+1839}
+1840
+1841fn abi_encoded_type(
+1842    context: &mut dyn AnalyzerContext,
+1843    ty: TypeId,
+1844    span: Span,
+1845) -> Result<ExpressionAttributes, FatalError> {
+1846    match ty.typ(context.db()) {
+1847        Type::SPtr(inner) => {
+1848            let res = abi_encoded_type(context, inner, span);
+1849            if res.is_ok() {
+1850                context.add_diagnostic(errors::to_mem_error(span));
+1851            }
+1852            res
+1853        }
+1854        Type::Struct(struct_) => Ok(ExpressionAttributes::new(
+1855            Type::Array(Array {
+1856                inner: Type::u8().id(context.db()),
+1857                size: struct_.fields(context.db()).len() * 32,
+1858            })
+1859            .id(context.db()),
+1860        )),
+1861        Type::Tuple(tuple) => Ok(ExpressionAttributes::new(
+1862            Type::Array(Array {
+1863                inner: context.db().intern_type(Type::u8()),
+1864                size: tuple.items.len() * 32,
+1865            })
+1866            .id(context.db()),
+1867        )),
+1868        _ => Err(FatalError::new(context.fancy_error(
+1869            &format!(
+1870                "value of type `{}` does not support `abi_encode()`",
+1871                ty.display(context.db())
+1872            ),
+1873            vec![Label::primary(
+1874                span,
+1875                "this value cannot be encoded using `abi_encode()`",
+1876            )],
+1877            vec![
+1878                "Hint: struct and tuple values can be encoded.".into(),
+1879                "Example: `(42,).abi_encode()`".into(),
+1880            ],
+1881        ))),
+1882    }
+1883}
+1884
+1885fn expr_call_type_attribute(
+1886    context: &mut dyn AnalyzerContext,
+1887    typ: Type,
+1888    target_span: Span,
+1889    field: &Node<SmolStr>,
+1890    generic_args: &Option<Node<Vec<fe::GenericArg>>>,
+1891    args: &Node<Vec<Node<fe::CallArg>>>,
+1892) -> Result<(ExpressionAttributes, CallType), FatalError> {
+1893    if let Some(generic_args) = generic_args {
+1894        context.error(
+1895            "unexpected generic argument list",
+1896            generic_args.span,
+1897            "unexpected",
+1898        );
+1899    }
+1900
+1901    let arg_attributes = expr_call_args(context, args)?;
+1902
+1903    let target_type = typ.id(context.db());
+1904    let target_name = typ.name(context.db());
+1905
+1906    if let Type::Contract(contract) = typ {
+1907        // Check for Foo.create/create2 (this will go away when the context object is
+1908        // ready)
+1909        if let Ok(function) = ContractTypeMethod::from_str(&field.kind) {
+1910            if context.root_item() == Item::Type(TypeDef::Contract(contract)) {
+1911                context.fancy_error(
+1912                        &format!("`{contract}.{}(...)` called within `{contract}` creates an illegal circular dependency", function.as_ref(), contract=&target_name),
+1913                        vec![Label::primary(field.span, "Contract creation")],
+1914                        vec![format!("Note: Consider using a dedicated factory contract to create instances of `{}`", &target_name)]);
+1915            }
+1916            let arg_count = function.arg_count();
+1917            validate_arg_count(
+1918                context,
+1919                &field.kind,
+1920                field.span,
+1921                args,
+1922                arg_count,
+1923                "argument",
+1924            );
+1925
+1926            for i in 0..arg_count {
+1927                if let Some(attrs) = arg_attributes.get(i) {
+1928                    if i == 0 {
+1929                        if let Some(ctx_type) = context.get_context_type() {
+1930                            if attrs.typ != Type::Mut(ctx_type).id(context.db()) {
+1931                                context.fancy_error(
+1932                                    &format!(
+1933                                        "incorrect type for argument to `{}.{}`",
+1934                                        &target_name,
+1935                                        function.as_ref()
+1936                                    ),
+1937                                    vec![Label::primary(
+1938                                        args.kind[i].span,
+1939                                        format!(
+1940                                            "this has type `{}`; expected `mut Context`",
+1941                                            &attrs.typ.display(context.db())
+1942                                        ),
+1943                                    )],
+1944                                    vec![],
+1945                                );
+1946                            }
+1947                        } else {
+1948                            context.fancy_error(
+1949                                "`Context` is not defined",
+1950                                vec![
+1951                                    Label::primary(
+1952                                        args.span,
+1953                                        "`ctx` must be passed into the function",
+1954                                    ),
+1955                                    Label::secondary(
+1956                                        context.parent_function().name_span(context.db()),
+1957                                        "Note: declare `ctx` in this function signature",
+1958                                    ),
+1959                                    Label::secondary(
+1960                                        context.parent_function().name_span(context.db()),
+1961                                        "Example: `pub fn foo(ctx: Context, ...)`",
+1962                                    ),
+1963                                ],
+1964                                vec!["Example: `MyContract.create(ctx, 0)`".into()],
+1965                            );
+1966                        }
+1967                    } else if !attrs.typ.is_integer(context.db()) {
+1968                        context.fancy_error(
+1969                            &format!(
+1970                                "incorrect type for argument to `{}.{}`",
+1971                                &target_name,
+1972                                function.as_ref()
+1973                            ),
+1974                            vec![Label::primary(
+1975                                args.kind[i].span,
+1976                                format!(
+1977                                    "this has type `{}`; expected a number",
+1978                                    &attrs.typ.display(context.db())
+1979                                ),
+1980                            )],
+1981                            vec![],
+1982                        );
+1983                    }
+1984                }
+1985            }
+1986            return Ok((
+1987                ExpressionAttributes::new(context.db().intern_type(typ)),
+1988                CallType::BuiltinAssociatedFunction { contract, function },
+1989            ));
+1990        }
+1991    }
+1992
+1993    if let Some(sig) = target_type.function_sig(context.db(), &field.kind) {
+1994        if sig.takes_self(context.db()) {
+1995            return Err(FatalError::new(context.fancy_error(
+1996                &format!(
+1997                    "`{}` function `{}` must be called on an instance of `{}`",
+1998                    &target_name, &field.kind, &target_name,
+1999                ),
+2000                vec![Label::primary(
+2001                    target_span,
+2002                    format!(
+2003                        "expected a value of type `{}`, found type name",
+2004                        &target_name
+2005                    ),
+2006                )],
+2007                vec![],
+2008            )));
+2009        } else {
+2010            context.fancy_error(
+2011                "Static functions need to be called with `::` not `.`",
+2012                vec![Label::primary(
+2013                    field.span,
+2014                    "This is a static function (doesn't take a `self` parameter)",
+2015                )],
+2016                vec![format!(
+2017                    "Try `{}::{}(...)` instead",
+2018                    &target_name, &field.kind
+2019                )],
+2020            );
+2021        }
+2022
+2023        validate_visibility_of_called_fn(context, field.span, sig);
+2024
+2025        let ret_type = sig.signature(context.db()).return_type.clone()?;
+2026
+2027        return Ok((
+2028            ExpressionAttributes::new(ret_type),
+2029            CallType::AssociatedFunction {
+2030                typ: target_type,
+2031                function: sig
+2032                    .function(context.db())
+2033                    .expect("expected function signature to have body"),
+2034            },
+2035        ));
+2036    }
+2037
+2038    Err(FatalError::new(context.fancy_error(
+2039        &format!(
+2040            "No function `{}` exists on type `{}`",
+2041            &field.kind,
+2042            typ.display(context.db())
+2043        ),
+2044        vec![Label::primary(field.span, "undefined function")],
+2045        vec![],
+2046    )))
+2047}
+2048
+2049fn expr_call_args(
+2050    context: &mut dyn AnalyzerContext,
+2051    args: &Node<Vec<Node<fe::CallArg>>>,
+2052) -> Result<Vec<ExpressionAttributes>, FatalError> {
+2053    args.kind
+2054        .iter()
+2055        .map(|arg| expr(context, &arg.kind.value, None))
+2056        .collect::<Result<Vec<_>, _>>()
+2057}
+2058
+2059fn expect_no_label_on_arg(
+2060    context: &mut dyn AnalyzerContext,
+2061    args: &Node<Vec<Node<fe::CallArg>>>,
+2062    arg_index: usize,
+2063) {
+2064    if let Some(label) = args
+2065        .kind
+2066        .get(arg_index)
+2067        .and_then(|arg| arg.kind.label.as_ref())
+2068    {
+2069        context.error(
+2070            "argument should not be labeled",
+2071            label.span,
+2072            "remove this label",
+2073        );
+2074    }
+2075}
+2076
+2077fn check_for_call_to_special_fns(
+2078    context: &mut dyn AnalyzerContext,
+2079    name: &str,
+2080    span: Span,
+2081) -> Result<(), FatalError> {
+2082    if name == "__init__" || name == "__call__" {
+2083        let label = if name == "__init__" {
+2084            "Note: `__init__` is the constructor function, and can't be called at runtime."
+2085        } else {
+2086            // TODO: add a hint label explaining how to call contracts directly
+2087            // with `Context` (not yet supported).
+2088            "Note: `__call__` is not part of the contract's interface, and can't be called."
+2089        };
+2090        Err(FatalError::new(context.fancy_error(
+2091            &format!("`{name}()` is not directly callable"),
+2092            vec![Label::primary(span, "")],
+2093            vec![label.into()],
+2094        )))
+2095    } else {
+2096        Ok(())
+2097    }
+2098}
+2099
+2100fn validate_numeric_literal_fits_type(
+2101    context: &mut dyn AnalyzerContext,
+2102    num: BigInt,
+2103    span: Span,
+2104    int_type: Integer,
+2105) {
+2106    if !int_type.fits(num) {
+2107        context.error(
+2108            &format!("literal out of range for `{int_type}`"),
+2109            span,
+2110            &format!("does not fit into type `{int_type}`"),
+2111        );
+2112    }
+2113}
+2114
+2115fn expr_comp_operation(
+2116    context: &mut dyn AnalyzerContext,
+2117    exp: &Node<fe::Expr>,
+2118) -> Result<ExpressionAttributes, FatalError> {
+2119    if let fe::Expr::CompOperation { left, op, right } = &exp.kind {
+2120        // comparison operands should be moved to the stack
+2121        let left_ty = value_expr_type(context, left, None)?;
+2122        if left_ty.is_primitive(context.db()) {
+2123            expect_expr_type(context, right, left_ty, false)?;
+2124        } else {
+2125            context.error(
+2126                &format!(
+2127                    "`{}` type can't be compared with the `{}` operator",
+2128                    left_ty.display(context.db()),
+2129                    op.kind
+2130                ),
+2131                exp.span,
+2132                "invalid comparison",
+2133            );
+2134        }
+2135        return Ok(ExpressionAttributes::new(TypeId::bool(context.db())));
+2136    }
+2137
+2138    unreachable!()
+2139}
+2140
+2141fn expr_ternary(
+2142    context: &mut dyn AnalyzerContext,
+2143    exp: &Node<fe::Expr>,
+2144    expected_type: Option<TypeId>,
+2145) -> Result<ExpressionAttributes, FatalError> {
+2146    if let fe::Expr::Ternary {
+2147        if_expr,
+2148        test,
+2149        else_expr,
+2150    } = &exp.kind
+2151    {
+2152        error_if_not_bool(context, test, "`if` test expression must be a `bool`")?;
+2153        let if_attr = expr(context, if_expr, expected_type)?;
+2154        let else_attr = expr(context, else_expr, expected_type.or(Some(if_attr.typ)))?;
+2155
+2156        // Should have the same return Type
+2157        if if_attr.typ != else_attr.typ {
+2158            let if_expr_ty = deref_type(context, exp, if_attr.typ);
+2159
+2160            if try_coerce_type(context, Some(else_expr), else_attr.typ, if_expr_ty, false).is_err()
+2161            {
+2162                context.fancy_error(
+2163                    "`if` and `else` values must have same type",
+2164                    vec![
+2165                        Label::primary(
+2166                            if_expr.span,
+2167                            format!("this has type `{}`", if_attr.typ.display(context.db())),
+2168                        ),
+2169                        Label::secondary(
+2170                            else_expr.span,
+2171                            format!("this has type `{}`", else_attr.typ.display(context.db())),
+2172                        ),
+2173                    ],
+2174                    vec![],
+2175                );
+2176            }
+2177        }
+2178
+2179        return Ok(ExpressionAttributes::new(if_attr.typ));
+2180    }
+2181    unreachable!()
+2182}
+2183
+2184fn expr_bool_operation(
+2185    context: &mut dyn AnalyzerContext,
+2186    exp: &Node<fe::Expr>,
+2187) -> Result<ExpressionAttributes, FatalError> {
+2188    if let fe::Expr::BoolOperation { left, op: _, right } = &exp.kind {
+2189        let bool_ty = TypeId::bool(context.db());
+2190        expect_expr_type(context, left, bool_ty, false)?;
+2191        expect_expr_type(context, right, bool_ty, false)?;
+2192        return Ok(ExpressionAttributes::new(bool_ty));
+2193    }
+2194
+2195    unreachable!()
+2196}
+2197
+2198/// Converts a input string to `BigInt`.
+2199///
+2200/// # Panics
+2201/// Panics if `num` contains invalid digit.
+2202fn to_bigint(num: &str) -> BigInt {
+2203    numeric::Literal::new(num)
+2204        .parse::<BigInt>()
+2205        .expect("the numeric literal contains a invalid digit")
+2206}
+2207
+2208fn is_self_value(expr: &Node<fe::Expr>) -> bool {
+2209    if let fe::Expr::Name(name) = &expr.kind {
+2210        name == "self"
+2211    } else {
+2212        false
+2213    }
+2214}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/functions.rs.html b/compiler-docs/src/fe_analyzer/traversal/functions.rs.html new file mode 100644 index 0000000000..1496c8e86d --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/functions.rs.html @@ -0,0 +1,753 @@ +functions.rs - source

fe_analyzer/traversal/
functions.rs

1use crate::context::{AnalyzerContext, ExpressionAttributes, NamedThing};
+2use crate::display::Displayable;
+3use crate::errors::{self, FatalError, TypeCoercionError};
+4use crate::namespace::items::{EnumVariantId, EnumVariantKind, Item, StructId, TypeDef};
+5use crate::namespace::scopes::{BlockScope, BlockScopeType};
+6use crate::namespace::types::{Type, TypeId};
+7use crate::pattern_analysis::PatternMatrix;
+8use crate::traversal::{assignments, declarations, expressions, types};
+9use fe_common::diagnostics::Label;
+10use fe_parser::ast::{self as fe, LiteralPattern, Pattern};
+11use fe_parser::node::{Node, Span};
+12use indexmap::map::Entry;
+13use indexmap::{IndexMap, IndexSet};
+14use smol_str::SmolStr;
+15
+16use super::matching_anomaly;
+17
+18pub fn traverse_statements(
+19    scope: &mut BlockScope,
+20    body: &[Node<fe::FuncStmt>],
+21) -> Result<(), FatalError> {
+22    for stmt in body.iter() {
+23        func_stmt(scope, stmt)?
+24    }
+25    Ok(())
+26}
+27
+28fn func_stmt(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+29    use fe::FuncStmt::*;
+30    match &stmt.kind {
+31        Return { .. } => func_return(scope, stmt),
+32        VarDecl { .. } => declarations::var_decl(scope, stmt),
+33        ConstantDecl { .. } => declarations::const_decl(scope, stmt),
+34        Assign { .. } => assignments::assign(scope, stmt),
+35        AugAssign { .. } => assignments::aug_assign(scope, stmt),
+36        For { .. } => for_loop(scope, stmt),
+37        While { .. } => while_loop(scope, stmt),
+38        If { .. } => if_statement(scope, stmt),
+39        Match { .. } => match_statement(scope, stmt),
+40        Unsafe { .. } => unsafe_block(scope, stmt),
+41        Assert { .. } => assert(scope, stmt),
+42        Expr { value } => expressions::expr(scope, value, None).map(|_| ()),
+43        Revert { .. } => revert(scope, stmt),
+44        Break | Continue => {
+45            loop_flow_statement(scope, stmt);
+46            Ok(())
+47        }
+48    }
+49}
+50
+51fn for_loop(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+52    match &stmt.kind {
+53        fe::FuncStmt::For { target, iter, body } => {
+54            // Make sure iter is in the function scope & it should be an array.
+55            let iter_type = expressions::expr(scope, iter, None)?.typ;
+56
+57            let target_type = match iter_type.deref(scope.db()).typ(scope.db()) {
+58                Type::Array(array) => {
+59                    if iter_type.is_sptr(scope.db()) {
+60                        scope.add_diagnostic(errors::to_mem_error(iter.span));
+61                    }
+62                    array.inner
+63                }
+64                _ => {
+65                    return Err(FatalError::new(scope.register_diag(errors::type_error(
+66                        "invalid `for` loop iterator type",
+67                        iter.span,
+68                        "array",
+69                        iter_type.display(scope.db()),
+70                    ))))
+71                }
+72            };
+73            scope.root.map_variable_type(target, target_type);
+74
+75            let mut body_scope = scope.new_child(BlockScopeType::Loop);
+76            // add_var emits a msg on err; we can ignore the Result.
+77            let _ = body_scope.add_var(&target.kind, target_type, false, target.span);
+78
+79            // Traverse the statements within the `for loop` body scope.
+80            traverse_statements(&mut body_scope, body)
+81        }
+82        _ => unreachable!(),
+83    }
+84}
+85
+86fn loop_flow_statement(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) {
+87    if !scope.inherits_type(BlockScopeType::Loop) {
+88        let stmt_name = match stmt.kind {
+89            fe::FuncStmt::Continue => "continue",
+90            fe::FuncStmt::Break => "break",
+91            _ => unreachable!(),
+92        };
+93        scope.error(
+94            &format!("`{stmt_name}` outside of a loop"),
+95            stmt.span,
+96            &format!("`{stmt_name}` can only be used inside of a `for` or `while` loop"),
+97        );
+98    }
+99}
+100
+101fn if_statement(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+102    match &stmt.kind {
+103        fe::FuncStmt::If {
+104            test,
+105            body,
+106            or_else,
+107        } => {
+108            expressions::error_if_not_bool(scope, test, "`if` statement condition is not bool")?;
+109            traverse_statements(&mut scope.new_child(BlockScopeType::IfElse), body)?;
+110            traverse_statements(&mut scope.new_child(BlockScopeType::IfElse), or_else)?;
+111            Ok(())
+112        }
+113        _ => unreachable!(),
+114    }
+115}
+116
+117fn match_statement(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+118    match &stmt.kind {
+119        fe::FuncStmt::Match { expr, arms } => {
+120            let expr_type = expressions::expr(scope, expr, None)?.typ.deref(scope.db());
+121
+122            let match_scope = scope.new_child(BlockScopeType::Match);
+123
+124            // Do type check on pattern, then do analysis on arm body.
+125            let mut err_in_pat_check = Ok(());
+126            for arm in arms {
+127                let mut arm_scope = match_scope.new_child(BlockScopeType::MatchArm);
+128
+129                // Collect binds in the pattern.
+130                let binds = match match_pattern(&mut arm_scope, &arm.kind.pat, expr_type) {
+131                    Ok(binds) => binds,
+132                    Err(err) => {
+133                        err_in_pat_check = Err(err);
+134                        continue;
+135                    }
+136                };
+137
+138                // Introduce binds into arm body scope.
+139                let mut is_add_var_ok = true;
+140                for (name, bind) in binds {
+141                    // We use a first bind span in `add_var` here if multiple binds appear in the
+142                    // same pattern.
+143                    is_add_var_ok &= arm_scope
+144                        .add_var(&name, bind.ty, false, bind.spans[0])
+145                        .is_ok();
+146                }
+147
+148                if is_add_var_ok {
+149                    traverse_statements(&mut arm_scope, &arm.kind.body).ok();
+150                }
+151            }
+152
+153            err_in_pat_check?;
+154            matching_anomaly::check_match_exhaustiveness(scope, arms, stmt.span, expr_type)?;
+155            matching_anomaly::check_unreachable_pattern(scope, arms, stmt.span, expr_type)?;
+156            let pattern_matrix = PatternMatrix::from_arms(scope, arms, expr_type);
+157            scope.root.map_pattern_matrix(stmt, pattern_matrix);
+158            Ok(())
+159        }
+160        _ => unreachable!(),
+161    }
+162}
+163
+164fn match_pattern(
+165    scope: &mut BlockScope,
+166    pat: &Node<Pattern>,
+167    expected_type: TypeId,
+168) -> Result<IndexMap<SmolStr, Bind>, FatalError> {
+169    match &pat.kind {
+170        Pattern::WildCard => Ok(IndexMap::new()),
+171
+172        Pattern::Rest => Err(FatalError::new(scope.error(
+173            "`..` is not allowed here",
+174            pat.span,
+175            "rest pattern is only allowed in tuple pattern",
+176        ))),
+177
+178        Pattern::Literal(lit_pat) => {
+179            let lit_ty = match lit_pat.kind {
+180                LiteralPattern::Bool(_) => TypeId::bool(scope.db()),
+181            };
+182            if expected_type == lit_ty {
+183                Ok(IndexMap::new())
+184            } else {
+185                let err = scope.type_error("", pat.span, expected_type, lit_ty);
+186                Err(FatalError::new(err))
+187            }
+188        }
+189
+190        Pattern::Tuple(elts) => {
+191            let expected_elts = if let Type::Tuple(tup) = expected_type.typ(scope.db()) {
+192                tup.items
+193            } else {
+194                let label_msg = format!(
+195                    "expected {}, but found tuple`",
+196                    expected_type.display(scope.db())
+197                );
+198                return Err(FatalError::new(scope.fancy_error(
+199                    "mismatched types",
+200                    vec![Label::primary(pat.span, label_msg)],
+201                    vec![],
+202                )));
+203            };
+204
+205            tuple_pattern(scope, elts, &expected_elts, pat.span, None)
+206        }
+207
+208        Pattern::Path(path) => match scope.resolve_visible_path(&path.kind) {
+209            Some(NamedThing::EnumVariant(variant)) => {
+210                let db = scope.db();
+211                let parent_type = variant.parent(db).as_type(db);
+212                let kind = variant.kind(db)?;
+213                if kind != EnumVariantKind::Unit {
+214                    let variant_kind_name = kind.display_name();
+215                    let err = scope.fancy_error(
+216                        "expected an unit variant",
+217                        vec![
+218                            Label::primary(
+219                                path.span,
+220                                format!("the variant is defined as {variant_kind_name}"),
+221                            ),
+222                            Label::secondary(
+223                                variant.span(scope.db()),
+224                                format! {"{} is defined here", variant.name(scope.db())},
+225                            ),
+226                        ],
+227                        vec![],
+228                    );
+229                    return Err(FatalError::new(err));
+230                }
+231
+232                if parent_type != expected_type {
+233                    let err = scope.type_error("", pat.span, expected_type, parent_type);
+234                    Err(FatalError::new(err))
+235                } else {
+236                    Ok(IndexMap::new())
+237                }
+238            }
+239
+240            Some(NamedThing::Variable { name, span, .. }) => {
+241                let err = scope.duplicate_name_error(
+242                    &format!("`{name}` is already defined"),
+243                    &name,
+244                    span,
+245                    pat.span,
+246                );
+247                Err(FatalError::new(err))
+248            }
+249
+250            None if path.kind.segments.len() == 1 => {
+251                let name = path.kind.segments[0].kind.clone();
+252                let bind = Bind::new(name.clone(), expected_type, pat.span);
+253                let mut binds = IndexMap::new();
+254                binds.insert(name, bind);
+255                Ok(binds)
+256            }
+257
+258            None => {
+259                let path = &path.kind;
+260                let err = scope.fancy_error(
+261                    &format! {"failed to resolve `{path}`"},
+262                    vec![Label::primary(
+263                        pat.span,
+264                        format!("use of undeclared type `{path}`"),
+265                    )],
+266                    vec![],
+267                );
+268                Err(FatalError::new(err))
+269            }
+270
+271            _ => {
+272                let err = scope.fancy_error(
+273                    "expected enum variant or variable",
+274                    vec![Label::primary(
+275                        pat.span,
+276                        format!("`{}` is not a enum variant or variable", path.kind),
+277                    )],
+278                    vec![],
+279                );
+280                Err(FatalError::new(err))
+281            }
+282        },
+283
+284        Pattern::PathTuple(path, pat_elts) => {
+285            let variant = match scope.resolve_path(&path.kind, path.span)? {
+286                NamedThing::EnumVariant(variant) => variant,
+287                _ => {
+288                    let err = scope.fancy_error(
+289                        "expected enum variant",
+290                        vec![Label::primary(path.span, "expected enum variant here")],
+291                        vec![],
+292                    );
+293                    return Err(FatalError::new(err));
+294                }
+295            };
+296
+297            let parent_type = variant.parent(scope.db()).as_type(scope.db());
+298            if parent_type != expected_type {
+299                let err = scope.type_error("", pat.span, expected_type, parent_type);
+300                return Err(FatalError::new(err));
+301            }
+302
+303            let variant_kind = variant.kind(scope.db())?;
+304            let ty_elts = match variant_kind {
+305                EnumVariantKind::Tuple(types) => types,
+306                EnumVariantKind::Unit => {
+307                    let variant_kind_name = variant_kind.display_name();
+308                    let err = scope.fancy_error(
+309                        "expected a tuple variant",
+310                        vec![
+311                            Label::primary(
+312                                path.span,
+313                                format!("the variant is defined as {variant_kind_name}"),
+314                            ),
+315                            Label::secondary(
+316                                variant.span(scope.db()),
+317                                format! {"{} is defined here", variant.name(scope.db())},
+318                            ),
+319                        ],
+320                        vec![],
+321                    );
+322                    return Err(FatalError::new(err));
+323                }
+324            };
+325
+326            tuple_pattern(scope, pat_elts, &ty_elts, pat.span, Some(variant))
+327        }
+328
+329        Pattern::PathStruct {
+330            path,
+331            fields,
+332            has_rest,
+333        } => {
+334            let (sid, ty) = match scope.resolve_path(&path.kind, path.span)? {
+335                NamedThing::Item(Item::Type(TypeDef::Struct(sid))) => {
+336                    (sid, sid.as_type(scope.db()))
+337                }
+338                _ => {
+339                    let err = scope.fancy_error(
+340                        "expected struct type",
+341                        vec![Label::primary(
+342                            pat.span,
+343                            format!("`{}` is not a struct name", path.kind),
+344                        )],
+345                        vec![],
+346                    );
+347                    return Err(FatalError::new(err));
+348                }
+349            };
+350
+351            if ty != expected_type {
+352                let err = scope.type_error("", pat.span, expected_type, ty);
+353                return Err(FatalError::new(err));
+354            }
+355
+356            struct_pattern(scope, fields, *has_rest, sid, pat.span)
+357        }
+358
+359        Pattern::Or(sub_pats) => {
+360            let mut subpat_binds = vec![];
+361            let mut all_variables = IndexSet::new();
+362
+363            // Collect binds and variable names in the all sub patterns.
+364            for sub_pat in sub_pats {
+365                let pattern = match_pattern(scope, sub_pat, expected_type)?;
+366                for var in pattern.keys() {
+367                    all_variables.insert(var.clone());
+368                }
+369
+370                subpat_binds.push((sub_pat, pattern));
+371            }
+372
+373            // Check all variables are defined in the all sub patterns.
+374            let mut err = None;
+375            for var in all_variables.iter() {
+376                for (subpat, binds) in subpat_binds.iter() {
+377                    if !binds.contains_key(var) {
+378                        err = Some(scope.fancy_error(
+379                            &format!("variable `{var}` is not bound in all sub patterns"),
+380                            vec![Label::primary(
+381                                subpat.span,
+382                                format!("variable `{var}` is not bound here"),
+383                            )],
+384                            vec![],
+385                        ));
+386                    }
+387                }
+388            }
+389            if let Some(err) = err {
+390                return Err(FatalError::new(err));
+391            }
+392
+393            // Check all variables has the same type.
+394            err = None;
+395            for var in all_variables.iter() {
+396                let first_bind = &subpat_binds.first().unwrap().1[var];
+397                let ty = first_bind.ty;
+398                for (_, binds) in subpat_binds.iter().skip(1) {
+399                    let bind = &binds[var];
+400                    if bind.ty != ty {
+401                        bind.spans.iter().for_each(|span| {
+402                            err = Some(scope.type_error(
+403                                &format! {"mismatched type for `{var}` between sub patterns"},
+404                                *span,
+405                                ty,
+406                                bind.ty,
+407                            ));
+408                        });
+409                    }
+410                }
+411            }
+412            if let Some(err) = err {
+413                return Err(FatalError::new(err));
+414            }
+415
+416            // Merge subpat binds.
+417            let mut result: IndexMap<SmolStr, Bind> = IndexMap::new();
+418            for (_, binds) in subpat_binds {
+419                for (name, bind) in binds {
+420                    result
+421                        .entry(name)
+422                        .and_modify(|entry| entry.spans.extend_from_slice(&bind.spans))
+423                        .or_insert(bind);
+424                }
+425            }
+426            Ok(result)
+427        }
+428    }
+429}
+430
+431fn struct_pattern(
+432    scope: &mut BlockScope,
+433    fields: &[(Node<SmolStr>, Node<Pattern>)],
+434    has_rest: bool,
+435    sid: StructId,
+436    pat_span: Span,
+437) -> Result<IndexMap<SmolStr, Bind>, FatalError> {
+438    let mut pat_fields: IndexMap<SmolStr, (Node<Pattern>, Span)> = IndexMap::new();
+439    let mut maybe_err = Ok(());
+440    for (name, pat) in fields.iter() {
+441        match pat_fields.entry(name.kind.clone()) {
+442            Entry::Occupied(entry) => {
+443                let err = scope.fancy_error(
+444                    &format!("duplicate field `{}` bound in the pattern", name.kind),
+445                    vec![
+446                        Label::primary(name.span, "multiple uses here"),
+447                        Label::secondary(entry.get().1, "first binding of the field"),
+448                    ],
+449                    vec![],
+450                );
+451                maybe_err = Err(FatalError::new(err));
+452            }
+453            Entry::Vacant(entry) => {
+454                entry.insert((pat.clone(), name.span));
+455            }
+456        }
+457    }
+458
+459    maybe_err?;
+460    let mut maybe_err = Ok(());
+461
+462    let fields_def = sid.fields(scope.db());
+463    let mut ordered_patterns = Vec::with_capacity(fields_def.len());
+464    let mut expected_types = Vec::with_capacity(fields_def.len());
+465
+466    for (f_name, field) in sid.fields(scope.db()).iter() {
+467        let ty = match field.typ(scope.db()) {
+468            Ok(ty) => ty,
+469            Err(err) => {
+470                maybe_err = Err(err.into());
+471                continue;
+472            }
+473        };
+474
+475        let pat = match pat_fields.remove(f_name) {
+476            Some((_, span)) if !field.is_public(scope.db()) => {
+477                let err = scope.fancy_error(
+478                    &format!("field `{f_name}` is not public field"),
+479                    vec![
+480                        Label::primary(span, format!("`{f_name}` is not public")),
+481                        Label::secondary(field.span(scope.db()), "field is defined here"),
+482                    ],
+483                    vec![],
+484                );
+485                maybe_err = Err(FatalError::new(err));
+486                continue;
+487            }
+488            Some((pat, _)) => pat,
+489            None => {
+490                if has_rest {
+491                    let dummy_span = Span::dummy();
+492                    Node::new(Pattern::WildCard, dummy_span)
+493                } else {
+494                    let err = scope.fancy_error(
+495                        &format!("missing field `{f_name}` in the pattern"),
+496                        vec![Label::primary(pat_span, "missing field")],
+497                        vec![],
+498                    );
+499                    maybe_err = Err(FatalError::new(err));
+500                    continue;
+501                }
+502            }
+503        };
+504
+505        ordered_patterns.push(pat);
+506        expected_types.push(ty);
+507    }
+508
+509    maybe_err?;
+510
+511    collect_binds_from_pat_vec(scope, &ordered_patterns, &expected_types)
+512}
+513
+514fn tuple_pattern(
+515    scope: &mut BlockScope,
+516    tuple_elts: &[Node<Pattern>],
+517    expected_tys: &[TypeId],
+518    pat_span: Span,
+519    variant: Option<EnumVariantId>,
+520) -> Result<IndexMap<SmolStr, Bind>, FatalError> {
+521    let mut rest_pat_pos: Option<(usize, Span)> = None;
+522    for (i, pat) in tuple_elts.iter().enumerate() {
+523        if pat.kind.is_rest() {
+524            if rest_pat_pos.is_some() {
+525                let err = scope.fancy_error(
+526                    "multiple rest patterns are not allowed",
+527                    vec![
+528                        Label::primary(pat.span, "multiple rest patterns are not allowed"),
+529                        Label::secondary(rest_pat_pos.unwrap().1, "first rest pattern is here"),
+530                    ],
+531                    vec![],
+532                );
+533                return Err(FatalError::new(err));
+534            } else {
+535                rest_pat_pos = Some((i, pat.span));
+536            }
+537        }
+538    }
+539
+540    let emit_len_error = |actual, expected| {
+541        let mut labels = vec![Label::primary(
+542            pat_span,
+543            format! {"expected {expected} elements, but {actual}"},
+544        )];
+545        if let Some(variant) = variant {
+546            labels.push(Label::secondary(
+547                variant.span(scope.db()),
+548                format! {"{} is defined here", variant.name(scope.db())},
+549            ));
+550        }
+551
+552        let err = scope.fancy_error("the number of tuple variant mismatch", labels, vec![]);
+553        Err(FatalError::new(err))
+554    };
+555
+556    if rest_pat_pos.is_some() && tuple_elts.len() - 1 > expected_tys.len() {
+557        return emit_len_error(tuple_elts.len() - 1, expected_tys.len());
+558    } else if rest_pat_pos.is_none() && tuple_elts.len() != expected_tys.len() {
+559        return emit_len_error(tuple_elts.len(), expected_tys.len());
+560    };
+561
+562    collect_binds_from_pat_vec(scope, tuple_elts, expected_tys)
+563}
+564
+565fn collect_binds_from_pat_vec(
+566    scope: &mut BlockScope,
+567    pats: &[Node<Pattern>],
+568    expected_types: &[TypeId],
+569) -> Result<IndexMap<SmolStr, Bind>, FatalError> {
+570    let mut binds: IndexMap<SmolStr, Bind> = IndexMap::new();
+571    let mut types_iter = expected_types.iter();
+572    for pat in pats.iter() {
+573        if pat.kind.is_rest() {
+574            let pat_num_in_rest = expected_types.len() - (pats.len() - 1);
+575            for _ in 0..pat_num_in_rest {
+576                types_iter.next();
+577            }
+578            continue;
+579        }
+580
+581        for (name, bind) in match_pattern(scope, pat, *types_iter.next().unwrap())?.into_iter() {
+582            match binds.entry(name) {
+583                Entry::Occupied(entry) => {
+584                    let original = entry.get();
+585                    let err = scope.fancy_error(
+586                        "same variable appears in the same pattern",
+587                        vec![
+588                            Label::primary(
+589                                bind.spans[0],
+590                                format! {"{} is already defined", bind.name },
+591                            ),
+592                            Label::secondary(
+593                                original.spans[0],
+594                                format! {"{} is originally defined here", original.name },
+595                            ),
+596                        ],
+597                        vec![],
+598                    );
+599                    return Err(FatalError::new(err));
+600                }
+601                Entry::Vacant(entry) => {
+602                    entry.insert(bind);
+603                }
+604            }
+605        }
+606    }
+607
+608    Ok(binds)
+609}
+610
+611#[derive(Clone, PartialEq, Eq, Hash)]
+612struct Bind {
+613    name: SmolStr,
+614    ty: TypeId,
+615    spans: Vec<Span>,
+616}
+617
+618impl Bind {
+619    fn new(name: SmolStr, ty: TypeId, span: Span) -> Self {
+620        Self {
+621            name,
+622            ty,
+623            spans: vec![span],
+624        }
+625    }
+626}
+627
+628fn unsafe_block(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+629    match &stmt.kind {
+630        fe::FuncStmt::Unsafe(body) => {
+631            if scope.inherits_type(BlockScopeType::Unsafe) {
+632                scope.error(
+633                    "unnecessary `unsafe` block",
+634                    stmt.span,
+635                    "this `unsafe` block is nested inside another `unsafe` context",
+636                );
+637            }
+638            traverse_statements(&mut scope.new_child(BlockScopeType::Unsafe), body)
+639        }
+640        _ => unreachable!(),
+641    }
+642}
+643
+644fn while_loop(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+645    match &stmt.kind {
+646        fe::FuncStmt::While { test, body } => {
+647            expressions::error_if_not_bool(scope, test, "`while` loop condition is not bool")?;
+648            traverse_statements(&mut scope.new_child(BlockScopeType::Loop), body)?;
+649            Ok(())
+650        }
+651        _ => unreachable!(),
+652    }
+653}
+654
+655fn assert(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+656    if let fe::FuncStmt::Assert { test, msg } = &stmt.kind {
+657        expressions::error_if_not_bool(scope, test, "`assert` condition is not bool")?;
+658
+659        if let Some(msg) = msg {
+660            let msg_attributes = expressions::expr(scope, msg, None)?;
+661            match msg_attributes.typ.typ(scope.db()) {
+662                Type::String(_) => {}
+663                Type::SPtr(inner) if matches!(inner.typ(scope.db()), Type::String(_)) => {
+664                    scope.add_diagnostic(errors::to_mem_error(msg.span));
+665                }
+666                _ => {
+667                    scope.error(
+668                        "`assert` reason must be a string",
+669                        msg.span,
+670                        &format!(
+671                            "this has type `{}`; expected a string",
+672                            msg_attributes.typ.display(scope.db())
+673                        ),
+674                    );
+675                }
+676            }
+677        }
+678
+679        return Ok(());
+680    }
+681
+682    unreachable!()
+683}
+684
+685fn revert(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+686    if let fe::FuncStmt::Revert { error } = &stmt.kind {
+687        if let Some(error_expr) = error {
+688            let error_attr = expressions::expr(scope, error_expr, None)?;
+689            if !error_attr.typ.deref(scope.db()).is_struct(scope.db()) {
+690                scope.error(
+691                    "`revert` error must be a struct",
+692                    error_expr.span,
+693                    &format!(
+694                        "this has type `{}`; expected a struct",
+695                        error_attr.typ.deref(scope.db()).display(scope.db())
+696                    ),
+697                );
+698            } else if error_attr.typ.is_sptr(scope.db()) {
+699                scope.fancy_error(
+700                    "`revert` value must be copied to memory",
+701                    vec![Label::primary(error_expr.span, "this value is in storage")],
+702                    vec!["Hint: values located in storage can be copied to memory using the `to_mem` function.".into(),
+703                         format!("Example: `{}.to_mem()`", error_expr.kind),
+704                    ],
+705                );
+706            }
+707        }
+708
+709        return Ok(());
+710    }
+711
+712    unreachable!()
+713}
+714
+715fn func_return(scope: &mut BlockScope, stmt: &Node<fe::FuncStmt>) -> Result<(), FatalError> {
+716    if let fe::FuncStmt::Return { value } = &stmt.kind {
+717        let expected_type = scope.root.function_return_type()?.deref(scope.db());
+718
+719        let value_attr = match value {
+720            Some(val) => expressions::expr(scope, val, Some(expected_type))?,
+721            None => ExpressionAttributes::new(TypeId::unit(scope.db())),
+722        };
+723
+724        match types::try_coerce_type(scope, value.as_ref(), value_attr.typ, expected_type, true) {
+725            Err(TypeCoercionError::RequiresToMem) => {
+726                let value = value.clone().expect("to_mem required on unit type?");
+727                scope.add_diagnostic(errors::to_mem_error(value.span));
+728            }
+729            Err(TypeCoercionError::Incompatible) => {
+730                scope.error(
+731                    &format!(
+732                        "expected function to return `{}` but was `{}`",
+733                        expected_type.display(scope.db()),
+734                        value_attr.typ.deref(scope.db()).display(scope.db())
+735                    ),
+736                    stmt.span,
+737                    "",
+738                );
+739            }
+740            Err(TypeCoercionError::SelfContractType) => {
+741                scope.add_diagnostic(errors::self_contract_type_error(
+742                    value.as_ref().unwrap().span,
+743                    &expected_type.display(scope.db()),
+744                ));
+745            }
+746            Ok(_) => {}
+747        }
+748
+749        return Ok(());
+750    }
+751
+752    unreachable!()
+753}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/matching_anomaly.rs.html b/compiler-docs/src/fe_analyzer/traversal/matching_anomaly.rs.html new file mode 100644 index 0000000000..5a280b16d0 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/matching_anomaly.rs.html @@ -0,0 +1,101 @@ +matching_anomaly.rs - source

fe_analyzer/traversal/
matching_anomaly.rs

1use std::fmt::Write;
+2
+3use fe_common::Span;
+4use fe_parser::{ast::MatchArm, node::Node, Label};
+5
+6use crate::{
+7    context::AnalyzerContext,
+8    display::Displayable,
+9    errors::FatalError,
+10    namespace::{scopes::BlockScope, types::TypeId},
+11    AnalyzerDb,
+12};
+13
+14use super::pattern_analysis::{PatternMatrix, SimplifiedPattern};
+15
+16pub(super) fn check_match_exhaustiveness(
+17    scope: &mut BlockScope,
+18    arms: &[Node<MatchArm>],
+19    match_span: Span,
+20    ty: TypeId,
+21) -> Result<(), FatalError> {
+22    if arms.is_empty() {
+23        let err = scope.fancy_error(
+24            "patterns is not exhaustive",
+25            vec![Label::primary(
+26                match_span,
+27                "expected at least one match arm here",
+28            )],
+29            vec![],
+30        );
+31        return Err(FatalError::new(err));
+32    }
+33
+34    let pattern_matrix = PatternMatrix::from_arms(scope, arms, ty);
+35    match pattern_matrix.find_non_exhaustiveness(scope.db()) {
+36        Some(pats) => {
+37            let err = scope.fancy_error(
+38                "patterns is not exhaustive",
+39                vec![Label::primary(
+40                    match_span,
+41                    format! {"`{}` not covered", display_non_exhaustive_patterns(scope.db(), &pats)},
+42                )],
+43                vec![],
+44            );
+45            Err(FatalError::new(err))
+46        }
+47        None => Ok(()),
+48    }
+49}
+50
+51pub(super) fn check_unreachable_pattern(
+52    scope: &mut BlockScope,
+53    arms: &[Node<MatchArm>],
+54    match_span: Span,
+55    ty: TypeId,
+56) -> Result<(), FatalError> {
+57    if arms.is_empty() {
+58        let err = scope.fancy_error(
+59            "patterns is not exhaustive",
+60            vec![Label::primary(
+61                match_span,
+62                "expected at least one match arm here",
+63            )],
+64            vec![],
+65        );
+66        return Err(FatalError::new(err));
+67    }
+68
+69    let pattern_matrix = PatternMatrix::from_arms(scope, arms, ty);
+70    let mut res = Ok(());
+71    for (i, arms) in arms.iter().enumerate() {
+72        if !pattern_matrix.is_row_useful(scope.db(), i) {
+73            let err = scope.fancy_error(
+74                "unreachable pattern ",
+75                vec![Label::primary(
+76                    arms.kind.pat.span,
+77                    "this arm is unreachable",
+78                )],
+79                vec![],
+80            );
+81            res = Err(FatalError::new(err));
+82        }
+83    }
+84    res
+85}
+86
+87fn display_non_exhaustive_patterns(db: &dyn AnalyzerDb, pats: &[SimplifiedPattern]) -> String {
+88    if pats.len() == 1 {
+89        format!("{}", pats[0].display(db))
+90    } else {
+91        let mut s = "(".to_string();
+92        let mut delim = "";
+93        for pat in pats {
+94            let pat = pat.display(db);
+95            write!(s, "{delim}{pat}").unwrap();
+96            delim = ", ";
+97        }
+98        s.push(')');
+99        s
+100    }
+101}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/mod.rs.html b/compiler-docs/src/fe_analyzer/traversal/mod.rs.html new file mode 100644 index 0000000000..440379c090 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/mod.rs.html @@ -0,0 +1,14 @@ +mod.rs - source

fe_analyzer/traversal/
mod.rs

1pub mod functions;
+2pub mod pattern_analysis;
+3pub mod pragma;
+4pub mod types;
+5
+6pub(crate) mod const_expr;
+7pub(crate) mod expressions;
+8
+9mod assignments;
+10mod borrowck;
+11mod call_args;
+12mod declarations;
+13mod matching_anomaly;
+14mod utils;
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/pattern_analysis.rs.html b/compiler-docs/src/fe_analyzer/traversal/pattern_analysis.rs.html new file mode 100644 index 0000000000..842bce7c47 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/pattern_analysis.rs.html @@ -0,0 +1,753 @@ +pattern_analysis.rs - source

fe_analyzer/traversal/
pattern_analysis.rs

1//! This module includes utility structs and its functions for pattern matching
+2//! analysis. The algorithm here is based on [Warnings for pattern matching](https://www.cambridge.org/core/journals/journal-of-functional-programming/article/warnings-for-pattern-matching/3165B75113781E2431E3856972940347)
+3//!
+4//! In this module, we assume all types are well-typed, so we can rely on the
+5//! type information without checking it.
+6
+7use std::fmt;
+8
+9use fe_parser::{
+10    ast::{LiteralPattern, MatchArm, Pattern},
+11    node::Node,
+12};
+13use indexmap::{IndexMap, IndexSet};
+14use smol_str::SmolStr;
+15
+16use crate::{
+17    context::{AnalyzerContext, NamedThing},
+18    display::{DisplayWithDb, Displayable},
+19    namespace::{
+20        items::{EnumVariantId, EnumVariantKind, Item, StructId, TypeDef},
+21        scopes::BlockScope,
+22        types::{Base, Type, TypeId},
+23    },
+24    AnalyzerDb,
+25};
+26
+27#[derive(Clone, Debug, PartialEq, Eq)]
+28pub struct PatternMatrix {
+29    rows: Vec<PatternRowVec>,
+30}
+31
+32impl PatternMatrix {
+33    pub fn new(rows: Vec<PatternRowVec>) -> Self {
+34        Self { rows }
+35    }
+36
+37    pub fn from_arms<'db>(
+38        scope: &'db BlockScope<'db, 'db>,
+39        arms: &[Node<MatchArm>],
+40        ty: TypeId,
+41    ) -> Self {
+42        let mut rows = Vec::with_capacity(arms.len());
+43        for (i, arm) in arms.iter().enumerate() {
+44            rows.push(PatternRowVec::new(vec![simplify_pattern(
+45                scope,
+46                &arm.kind.pat.kind,
+47                ty,
+48                i,
+49            )]));
+50        }
+51
+52        Self { rows }
+53    }
+54
+55    pub fn rows(&self) -> &[PatternRowVec] {
+56        &self.rows
+57    }
+58
+59    pub fn into_rows(self) -> Vec<PatternRowVec> {
+60        self.rows
+61    }
+62
+63    pub fn find_non_exhaustiveness(&self, db: &dyn AnalyzerDb) -> Option<Vec<SimplifiedPattern>> {
+64        if self.nrows() == 0 {
+65            // Non Exhaustive!
+66            return Some(vec![]);
+67        }
+68        if self.ncols() == 0 {
+69            return None;
+70        }
+71
+72        let ty = self.first_column_ty();
+73        let sigma_set = self.sigma_set();
+74        if sigma_set.is_complete(db) {
+75            for ctor in sigma_set.into_iter() {
+76                match self.phi_specialize(db, ctor).find_non_exhaustiveness(db) {
+77                    Some(vec) if vec.is_empty() => {
+78                        let pat_kind = SimplifiedPatternKind::Constructor {
+79                            kind: ctor,
+80                            fields: vec![],
+81                        };
+82                        let pat = SimplifiedPattern::new(pat_kind, ty);
+83
+84                        return Some(vec![pat]);
+85                    }
+86
+87                    Some(mut vec) => {
+88                        let field_num = ctor.arity(db);
+89                        debug_assert!(vec.len() >= field_num);
+90                        let rem = vec.split_off(field_num);
+91                        let pat_kind = SimplifiedPatternKind::Constructor {
+92                            kind: ctor,
+93                            fields: vec,
+94                        };
+95                        let pat = SimplifiedPattern::new(pat_kind, ty);
+96
+97                        let mut result = vec![pat];
+98                        result.extend_from_slice(&rem);
+99                        return Some(result);
+100                    }
+101
+102                    None => {}
+103                }
+104            }
+105
+106            None
+107        } else {
+108            self.d_specialize(db)
+109                .find_non_exhaustiveness(db)
+110                .map(|vec| {
+111                    let sigma_set = self.sigma_set();
+112                    let kind = if sigma_set.is_empty() {
+113                        SimplifiedPatternKind::WildCard(None)
+114                    } else {
+115                        let complete_sigma = SigmaSet::complete_sigma(db, ty);
+116                        SimplifiedPatternKind::Or(
+117                            complete_sigma
+118                                .difference(&sigma_set)
+119                                .into_iter()
+120                                .map(|ctor| {
+121                                    let kind =
+122                                        SimplifiedPatternKind::ctor_with_wild_card_fields(db, ctor);
+123                                    SimplifiedPattern::new(kind, ty)
+124                                })
+125                                .collect(),
+126                        )
+127                    };
+128
+129                    let mut result = vec![SimplifiedPattern::new(kind, ty)];
+130                    result.extend_from_slice(&vec);
+131
+132                    result
+133                })
+134        }
+135    }
+136
+137    pub fn is_row_useful(&self, db: &dyn AnalyzerDb, row: usize) -> bool {
+138        debug_assert!(self.nrows() > row);
+139
+140        Self {
+141            rows: self.rows[0..row].to_vec(),
+142        }
+143        .is_pattern_useful(db, &self.rows[row])
+144    }
+145
+146    pub fn nrows(&self) -> usize {
+147        self.rows.len()
+148    }
+149
+150    pub fn ncols(&self) -> usize {
+151        debug_assert_ne!(self.nrows(), 0);
+152        let ncols = self.rows[0].len();
+153        debug_assert!(self.rows.iter().all(|row| row.len() == ncols));
+154        ncols
+155    }
+156
+157    pub fn swap_col(&mut self, col1: usize, col2: usize) {
+158        for row in &mut self.rows {
+159            row.swap(col1, col2);
+160        }
+161    }
+162
+163    pub fn sigma_set(&self) -> SigmaSet {
+164        SigmaSet::from_rows(self.rows.iter(), 0)
+165    }
+166
+167    pub fn phi_specialize(&self, db: &dyn AnalyzerDb, ctor: ConstructorKind) -> Self {
+168        let mut new_cols = Vec::new();
+169        for col in &self.rows {
+170            new_cols.extend_from_slice(&col.phi_specialize(db, ctor));
+171        }
+172        Self { rows: new_cols }
+173    }
+174
+175    pub fn d_specialize(&self, db: &dyn AnalyzerDb) -> Self {
+176        let mut new_cols = Vec::new();
+177        for col in &self.rows {
+178            new_cols.extend_from_slice(&col.d_specialize(db));
+179        }
+180        Self { rows: new_cols }
+181    }
+182
+183    fn first_column_ty(&self) -> TypeId {
+184        debug_assert_ne!(self.ncols(), 0);
+185        self.rows[0].first_column_ty()
+186    }
+187
+188    fn is_pattern_useful(&self, db: &dyn AnalyzerDb, pat_vec: &PatternRowVec) -> bool {
+189        if self.nrows() == 0 {
+190            return true;
+191        }
+192
+193        if self.ncols() == 0 {
+194            return false;
+195        }
+196
+197        match &pat_vec.head().unwrap().kind {
+198            SimplifiedPatternKind::WildCard(_) => self
+199                .d_specialize(db)
+200                .is_pattern_useful(db, &pat_vec.d_specialize(db)[0]),
+201
+202            SimplifiedPatternKind::Constructor { kind, .. } => self
+203                .phi_specialize(db, *kind)
+204                .is_pattern_useful(db, &pat_vec.phi_specialize(db, *kind)[0]),
+205
+206            SimplifiedPatternKind::Or(pats) => {
+207                for pat in pats {
+208                    if self.is_pattern_useful(db, &PatternRowVec::new(vec![pat.clone()])) {
+209                        return true;
+210                    }
+211                }
+212                false
+213            }
+214        }
+215    }
+216}
+217
+218#[derive(Clone, Debug, PartialEq, Eq)]
+219pub struct SimplifiedPattern {
+220    pub kind: SimplifiedPatternKind,
+221    pub ty: TypeId,
+222}
+223
+224impl SimplifiedPattern {
+225    pub fn new(kind: SimplifiedPatternKind, ty: TypeId) -> Self {
+226        Self { kind, ty }
+227    }
+228
+229    pub fn wildcard(bind: Option<(SmolStr, usize)>, ty: TypeId) -> Self {
+230        Self::new(SimplifiedPatternKind::WildCard(bind), ty)
+231    }
+232
+233    pub fn is_wildcard(&self) -> bool {
+234        matches!(self.kind, SimplifiedPatternKind::WildCard(_))
+235    }
+236}
+237
+238impl DisplayWithDb for SimplifiedPattern {
+239    fn format(&self, db: &dyn AnalyzerDb, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+240        match &self.kind {
+241            SimplifiedPatternKind::WildCard(None) => write!(f, "_"),
+242            SimplifiedPatternKind::WildCard(Some((name, _))) => write!(f, "{name}"),
+243
+244            SimplifiedPatternKind::Constructor {
+245                kind: ConstructorKind::Enum(id),
+246                fields,
+247            } => {
+248                let ctor_name = id.name_with_parent(db);
+249                write!(f, "{ctor_name}")?;
+250                if !id.kind(db).unwrap().is_unit() {
+251                    write!(f, "(")?;
+252                    let mut delim = "";
+253                    for field in fields {
+254                        let displayable = field.display(db);
+255                        write!(f, "{delim}{displayable}")?;
+256                        delim = ", ";
+257                    }
+258                    write!(f, ")")
+259                } else {
+260                    Ok(())
+261                }
+262            }
+263
+264            SimplifiedPatternKind::Constructor {
+265                kind: ConstructorKind::Tuple(_),
+266                fields,
+267            } => {
+268                write!(f, "(")?;
+269                let mut delim = "";
+270                for field in fields {
+271                    let displayable = field.display(db);
+272                    write!(f, "{delim}{displayable}")?;
+273                    delim = ", ";
+274                }
+275                write!(f, ")")
+276            }
+277
+278            SimplifiedPatternKind::Constructor {
+279                kind: ConstructorKind::Struct(sid),
+280                fields,
+281            } => {
+282                let struct_name = sid.name(db);
+283                write!(f, "{struct_name} {{ ")?;
+284                let mut delim = "";
+285
+286                for (field_name, field_pat) in sid
+287                    .fields(db)
+288                    .iter()
+289                    .map(|(field_name, _)| field_name)
+290                    .zip(fields.iter())
+291                {
+292                    let displayable = field_pat.display(db);
+293                    write!(f, "{delim}{field_name}: {displayable}")?;
+294                    delim = ", ";
+295                }
+296                write!(f, "}}")
+297            }
+298
+299            SimplifiedPatternKind::Constructor {
+300                kind: ConstructorKind::Literal((lit, _)),
+301                ..
+302            } => {
+303                write!(f, "{lit}")
+304            }
+305
+306            SimplifiedPatternKind::Or(pats) => {
+307                let mut delim = "";
+308                for pat in pats {
+309                    let pat = pat.display(db);
+310                    write!(f, "{delim}{pat}")?;
+311                    delim = " | ";
+312                }
+313                Ok(())
+314            }
+315        }
+316    }
+317}
+318
+319#[derive(Clone, Debug, PartialEq, Eq)]
+320pub enum SimplifiedPatternKind {
+321    WildCard(Option<(SmolStr, usize)>),
+322    Constructor {
+323        kind: ConstructorKind,
+324        fields: Vec<SimplifiedPattern>,
+325    },
+326    Or(Vec<SimplifiedPattern>),
+327}
+328
+329impl SimplifiedPatternKind {
+330    pub fn collect_ctors(&self) -> Vec<ConstructorKind> {
+331        match self {
+332            Self::WildCard(_) => vec![],
+333            Self::Constructor { kind, .. } => vec![*kind],
+334            Self::Or(pats) => {
+335                let mut ctors = vec![];
+336                for pat in pats {
+337                    ctors.extend_from_slice(&pat.kind.collect_ctors());
+338                }
+339                ctors
+340            }
+341        }
+342    }
+343
+344    pub fn ctor_with_wild_card_fields(db: &dyn AnalyzerDb, kind: ConstructorKind) -> Self {
+345        let fields = kind
+346            .field_types(db)
+347            .into_iter()
+348            .map(|ty| SimplifiedPattern::wildcard(None, ty))
+349            .collect();
+350        Self::Constructor { kind, fields }
+351    }
+352}
+353
+354#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+355pub enum ConstructorKind {
+356    Enum(EnumVariantId),
+357    Tuple(TypeId),
+358    Struct(StructId),
+359    Literal((LiteralPattern, TypeId)),
+360}
+361
+362#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+363pub enum LiteralConstructor {
+364    Bool(bool),
+365}
+366
+367impl ConstructorKind {
+368    pub fn field_types(&self, db: &dyn AnalyzerDb) -> Vec<TypeId> {
+369        match self {
+370            Self::Enum(id) => match id.kind(db).unwrap() {
+371                EnumVariantKind::Unit => vec![],
+372                EnumVariantKind::Tuple(types) => types.to_vec(),
+373            },
+374            Self::Tuple(ty) => ty.tuple_elts(db),
+375            Self::Struct(sid) => sid
+376                .fields(db)
+377                .iter()
+378                .map(|(_, fid)| fid.typ(db).unwrap())
+379                .collect(),
+380            Self::Literal(_) => vec![],
+381        }
+382    }
+383
+384    pub fn arity(&self, db: &dyn AnalyzerDb) -> usize {
+385        match self {
+386            Self::Enum(id) => match id.kind(db).unwrap() {
+387                EnumVariantKind::Unit => 0,
+388                EnumVariantKind::Tuple(types) => types.len(),
+389            },
+390            Self::Tuple(ty) => ty.tuple_elts(db).len(),
+391            Self::Struct(sid) => sid.fields(db).len(),
+392            Self::Literal(_) => 0,
+393        }
+394    }
+395
+396    pub fn ty(&self, db: &dyn AnalyzerDb) -> TypeId {
+397        match self {
+398            Self::Enum(id) => id.parent(db).as_type(db),
+399            Self::Tuple(ty) => *ty,
+400            Self::Struct(sid) => sid.as_type(db),
+401            Self::Literal((_, ty)) => *ty,
+402        }
+403    }
+404}
+405
+406#[derive(Clone, Debug, PartialEq, Eq)]
+407pub struct SigmaSet(IndexSet<ConstructorKind>);
+408
+409impl SigmaSet {
+410    pub fn from_rows<'a>(rows: impl Iterator<Item = &'a PatternRowVec>, column: usize) -> Self {
+411        let mut ctor_set = IndexSet::new();
+412        for row in rows {
+413            for ctor in row.collect_column_ctors(column) {
+414                ctor_set.insert(ctor);
+415            }
+416        }
+417        Self(ctor_set)
+418    }
+419
+420    pub fn complete_sigma(db: &dyn AnalyzerDb, ty: TypeId) -> Self {
+421        let inner = match ty.typ(db) {
+422            Type::Enum(id) => id
+423                .variants(db)
+424                .values()
+425                .map(|id| ConstructorKind::Enum(*id))
+426                .collect(),
+427
+428            Type::Tuple(_) => [ConstructorKind::Tuple(ty)].into_iter().collect(),
+429
+430            Type::Base(Base::Bool) => [
+431                ConstructorKind::Literal((LiteralPattern::Bool(true), ty)),
+432                ConstructorKind::Literal((LiteralPattern::Bool(false), ty)),
+433            ]
+434            .into_iter()
+435            .collect(),
+436
+437            _ => {
+438                unimplemented!()
+439            }
+440        };
+441
+442        Self(inner)
+443    }
+444
+445    pub fn is_complete(&self, db: &dyn AnalyzerDb) -> bool {
+446        match self.0.first() {
+447            Some(ctor) => {
+448                let expected = ctor_variant_num(db, *ctor);
+449                debug_assert!(self.len() <= expected);
+450                self.len() == expected
+451            }
+452            None => false,
+453        }
+454    }
+455
+456    pub fn len(&self) -> usize {
+457        self.0.len()
+458    }
+459
+460    pub fn is_empty(&self) -> bool {
+461        self.0.is_empty()
+462    }
+463
+464    pub fn iter(&self) -> impl Iterator<Item = &ConstructorKind> {
+465        self.0.iter()
+466    }
+467
+468    pub fn difference(&self, other: &Self) -> Self {
+469        Self(self.0.difference(&other.0).cloned().collect())
+470    }
+471}
+472
+473impl IntoIterator for SigmaSet {
+474    type Item = ConstructorKind;
+475    type IntoIter = <IndexSet<ConstructorKind> as IntoIterator>::IntoIter;
+476
+477    fn into_iter(self) -> Self::IntoIter {
+478        self.0.into_iter()
+479    }
+480}
+481
+482#[derive(Clone, Debug, PartialEq, Eq)]
+483pub struct PatternRowVec {
+484    pub inner: Vec<SimplifiedPattern>,
+485}
+486
+487impl PatternRowVec {
+488    pub fn new(inner: Vec<SimplifiedPattern>) -> Self {
+489        Self { inner }
+490    }
+491
+492    pub fn len(&self) -> usize {
+493        self.inner.len()
+494    }
+495
+496    pub fn is_empty(&self) -> bool {
+497        self.inner.is_empty()
+498    }
+499
+500    pub fn pats(&self) -> &[SimplifiedPattern] {
+501        &self.inner
+502    }
+503
+504    pub fn head(&self) -> Option<&SimplifiedPattern> {
+505        self.inner.first()
+506    }
+507
+508    pub fn phi_specialize(&self, db: &dyn AnalyzerDb, ctor: ConstructorKind) -> Vec<Self> {
+509        debug_assert!(!self.inner.is_empty());
+510
+511        let first_pat = &self.inner[0];
+512        let ctor_fields = ctor.field_types(db);
+513        match &first_pat.kind {
+514            SimplifiedPatternKind::WildCard(bind) => {
+515                let mut inner = Vec::with_capacity(self.inner.len() + ctor_fields.len() - 1);
+516                for field_ty in ctor_fields {
+517                    inner.push(SimplifiedPattern::wildcard(bind.clone(), field_ty));
+518                }
+519                inner.extend_from_slice(&self.inner[1..]);
+520                vec![Self::new(inner)]
+521            }
+522
+523            SimplifiedPatternKind::Constructor { kind, fields } => {
+524                if *kind == ctor {
+525                    let mut inner = Vec::with_capacity(self.inner.len() + ctor_fields.len() - 1);
+526                    inner.extend_from_slice(fields);
+527                    inner.extend_from_slice(&self.inner[1..]);
+528                    vec![Self::new(inner)]
+529                } else {
+530                    vec![]
+531                }
+532            }
+533
+534            SimplifiedPatternKind::Or(pats) => {
+535                let mut result = vec![];
+536                for pat in pats {
+537                    let mut tmp_inner = Vec::with_capacity(self.inner.len());
+538                    tmp_inner.push(pat.clone());
+539                    tmp_inner.extend_from_slice(&self.inner[1..]);
+540                    let tmp = PatternRowVec::new(tmp_inner);
+541                    for v in tmp.phi_specialize(db, ctor) {
+542                        result.push(v);
+543                    }
+544                }
+545                result
+546            }
+547        }
+548    }
+549
+550    pub fn swap(&mut self, a: usize, b: usize) {
+551        self.inner.swap(a, b);
+552    }
+553
+554    pub fn d_specialize(&self, _db: &dyn AnalyzerDb) -> Vec<Self> {
+555        debug_assert!(!self.inner.is_empty());
+556
+557        let first_pat = &self.inner[0];
+558        match &first_pat.kind {
+559            SimplifiedPatternKind::WildCard(_) => {
+560                let inner = self.inner[1..].to_vec();
+561                vec![Self::new(inner)]
+562            }
+563
+564            SimplifiedPatternKind::Constructor { .. } => {
+565                vec![]
+566            }
+567
+568            SimplifiedPatternKind::Or(pats) => {
+569                let mut result = vec![];
+570                for pat in pats {
+571                    let mut tmp_inner = Vec::with_capacity(self.inner.len());
+572                    tmp_inner.push(pat.clone());
+573                    tmp_inner.extend_from_slice(&self.inner[1..]);
+574                    let tmp = PatternRowVec::new(tmp_inner);
+575                    for v in tmp.d_specialize(_db) {
+576                        result.push(v);
+577                    }
+578                }
+579                result
+580            }
+581        }
+582    }
+583
+584    pub fn collect_column_ctors(&self, column: usize) -> Vec<ConstructorKind> {
+585        debug_assert!(!self.inner.is_empty());
+586
+587        let first_pat = &self.inner[column];
+588        first_pat.kind.collect_ctors()
+589    }
+590
+591    fn first_column_ty(&self) -> TypeId {
+592        debug_assert!(!self.inner.is_empty());
+593
+594        self.inner[0].ty
+595    }
+596}
+597
+598fn ctor_variant_num(db: &dyn AnalyzerDb, ctor: ConstructorKind) -> usize {
+599    match ctor {
+600        ConstructorKind::Enum(variant) => {
+601            let enum_id = variant.parent(db);
+602            enum_id.variants(db).len()
+603        }
+604        ConstructorKind::Tuple(_) | ConstructorKind::Struct(_) => 1,
+605        ConstructorKind::Literal((LiteralPattern::Bool(_), _)) => 2,
+606    }
+607}
+608
+609fn simplify_pattern(
+610    scope: &BlockScope,
+611    pat: &Pattern,
+612    ty: TypeId,
+613    arm_idx: usize,
+614) -> SimplifiedPattern {
+615    let kind = match pat {
+616        Pattern::WildCard => SimplifiedPatternKind::WildCard(None),
+617
+618        Pattern::Rest => {
+619            // Rest is only allowed in the tuple pattern.
+620            unreachable!()
+621        }
+622
+623        Pattern::Literal(lit) => {
+624            let ctor_kind = ConstructorKind::Literal((lit.kind, ty));
+625            SimplifiedPatternKind::Constructor {
+626                kind: ctor_kind,
+627                fields: vec![],
+628            }
+629        }
+630
+631        Pattern::Tuple(elts) => {
+632            let ctor_kind = ConstructorKind::Tuple(ty);
+633            let elts_tys = ty.tuple_elts(scope.db());
+634
+635            SimplifiedPatternKind::Constructor {
+636                kind: ctor_kind,
+637                fields: simplify_tuple_pattern(scope, elts, &elts_tys, arm_idx),
+638            }
+639        }
+640
+641        Pattern::Path(path) => match scope.resolve_visible_path(&path.kind) {
+642            Some(NamedThing::EnumVariant(variant)) => SimplifiedPatternKind::Constructor {
+643                kind: ConstructorKind::Enum(variant),
+644                fields: vec![],
+645            },
+646            _ => {
+647                debug_assert!(path.kind.segments.len() == 1);
+648                SimplifiedPatternKind::WildCard(Some((path.kind.segments[0].kind.clone(), arm_idx)))
+649            }
+650        },
+651
+652        Pattern::PathTuple(path, elts) => {
+653            let variant = match scope.resolve_visible_path(&path.kind).unwrap() {
+654                NamedThing::EnumVariant(variant) => variant,
+655                _ => unreachable!(),
+656            };
+657            let ctor_kind = ConstructorKind::Enum(variant);
+658            let elts_tys = ctor_kind.field_types(scope.db());
+659
+660            SimplifiedPatternKind::Constructor {
+661                kind: ctor_kind,
+662                fields: simplify_tuple_pattern(scope, elts, &elts_tys, arm_idx),
+663            }
+664        }
+665
+666        Pattern::PathStruct {
+667            path,
+668            fields: pat_fields,
+669            ..
+670        } => {
+671            let (sid, ctor_kind) = match scope.resolve_visible_path(&path.kind).unwrap() {
+672                NamedThing::Item(Item::Type(TypeDef::Struct(sid))) => {
+673                    (sid, ConstructorKind::Struct(sid))
+674                }
+675                // Implement this when struct variant is supported.
+676                NamedThing::EnumVariant(_) => todo!(),
+677                _ => unreachable!(),
+678            };
+679
+680            // Canonicalize the fields order so that the order is the same as the
+681            // struct fields.
+682            let pat_fields: IndexMap<_, _> = pat_fields
+683                .iter()
+684                .map(|field_pat| (field_pat.0.kind.clone(), field_pat.1.clone()))
+685                .collect();
+686            let fields_def = sid.fields(scope.db());
+687            let mut canonicalized_fields = Vec::with_capacity(fields_def.len());
+688            for (field_name, fid) in fields_def.iter() {
+689                let field_ty = fid.typ(scope.db()).unwrap();
+690                if let Some(pat) = pat_fields.get(field_name) {
+691                    let pat = simplify_pattern(scope, &pat.kind, field_ty, arm_idx);
+692                    canonicalized_fields.push(pat);
+693                } else {
+694                    canonicalized_fields.push(SimplifiedPattern::wildcard(None, field_ty));
+695                }
+696            }
+697
+698            SimplifiedPatternKind::Constructor {
+699                kind: ctor_kind,
+700                fields: canonicalized_fields,
+701            }
+702        }
+703
+704        Pattern::Or(pats) => SimplifiedPatternKind::Or(
+705            pats.iter()
+706                .map(|pat| simplify_pattern(scope, &pat.kind, ty, arm_idx))
+707                .collect(),
+708        ),
+709    };
+710
+711    SimplifiedPattern::new(kind, ty)
+712}
+713
+714fn simplify_tuple_pattern(
+715    scope: &BlockScope,
+716    elts: &[Node<Pattern>],
+717    elts_tys: &[TypeId],
+718    arm_idx: usize,
+719) -> Vec<SimplifiedPattern> {
+720    let mut simplified_elts = vec![];
+721    let mut tys_iter = elts_tys.iter();
+722
+723    for pat in elts {
+724        if pat.kind.is_rest() {
+725            for _ in 0..(elts_tys.len() - (elts.len() - 1)) {
+726                let ty = tys_iter.next().unwrap();
+727                simplified_elts.push(SimplifiedPattern::new(
+728                    SimplifiedPatternKind::WildCard(None),
+729                    *ty,
+730                ));
+731            }
+732        } else {
+733            simplified_elts.push(simplify_pattern(
+734                scope,
+735                &pat.kind,
+736                *tys_iter.next().unwrap(),
+737                arm_idx,
+738            ));
+739        }
+740    }
+741
+742    debug_assert!(tys_iter.next().is_none());
+743    simplified_elts
+744}
+745
+746impl TypeId {
+747    fn tuple_elts(self, db: &dyn AnalyzerDb) -> Vec<TypeId> {
+748        match self.typ(db) {
+749            Type::Tuple(tup) => tup.items.to_vec(),
+750            _ => unreachable!(),
+751        }
+752    }
+753}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/pragma.rs.html b/compiler-docs/src/fe_analyzer/traversal/pragma.rs.html new file mode 100644 index 0000000000..989a7fd3c5 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/pragma.rs.html @@ -0,0 +1,31 @@ +pragma.rs - source

fe_analyzer/traversal/
pragma.rs

1use crate::errors;
+2use fe_common::diagnostics::{Diagnostic, Label};
+3use fe_parser::ast;
+4use fe_parser::node::Node;
+5use semver::{Version, VersionReq};
+6
+7pub fn check_pragma_version(stmt: &Node<ast::Pragma>) -> Option<Diagnostic> {
+8    let version_requirement = &stmt.kind.version_requirement;
+9    // This can't fail because the parser already validated it
+10    let requirement =
+11        VersionReq::parse(&version_requirement.kind).expect("Invalid version requirement");
+12    let actual_version =
+13        Version::parse(env!("CARGO_PKG_VERSION")).expect("Missing package version");
+14
+15    if requirement.matches(&actual_version) {
+16        None
+17    } else {
+18        Some(errors::fancy_error(
+19            format!(
+20                "The current compiler version {actual_version} doesn't match the specified requirement"
+21            ),
+22            vec![Label::primary(
+23                version_requirement.span,
+24                "The specified version requirement",
+25            )],
+26            vec![format!(
+27                "Note: Use `pragma {actual_version}` to make the code compile"
+28            )],
+29        ))
+30    }
+31}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/types.rs.html b/compiler-docs/src/fe_analyzer/traversal/types.rs.html new file mode 100644 index 0000000000..dd9d147804 --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/types.rs.html @@ -0,0 +1,654 @@ +types.rs - source

fe_analyzer/traversal/
types.rs

1use crate::builtins::ValueMethod;
+2use crate::context::{
+3    Adjustment, AdjustmentKind, AnalyzerContext, CallType, Constant, ExpressionAttributes,
+4    NamedThing,
+5};
+6use crate::display::Displayable;
+7use crate::errors::{TypeCoercionError, TypeError};
+8use crate::namespace::items::{Item, TraitId};
+9use crate::namespace::types::{
+10    Base, FeString, GenericArg, GenericParamKind, GenericType, Integer, TraitOrType, Tuple, Type,
+11    TypeId,
+12};
+13use crate::traversal::call_args::validate_arg_count;
+14use fe_common::diagnostics::Label;
+15use fe_common::utils::humanize::pluralize_conditionally;
+16use fe_common::Spanned;
+17use fe_parser::ast;
+18use fe_parser::node::{Node, Span};
+19use std::cmp::Ordering;
+20
+21/// Try to perform an explicit type cast, eg `u256(my_address)` or `address(my_contract)`.
+22/// Returns nothing. Emits an error if the cast fails; explicit cast failures are not fatal.
+23pub fn try_cast_type(
+24    context: &mut dyn AnalyzerContext,
+25    from: TypeId,
+26    from_expr: &Node<ast::Expr>,
+27    into: TypeId,
+28    into_span: Span,
+29) {
+30    if into == from {
+31        return;
+32    }
+33    match (from.typ(context.db()), into.typ(context.db())) {
+34        (Type::SPtr(inner), _) => {
+35            adjust_type(context, from_expr, inner, AdjustmentKind::Load);
+36            try_cast_type(context, inner, from_expr, into, into_span)
+37        }
+38
+39        (Type::Mut(inner), _) => try_cast_type(context, inner, from_expr, into, into_span),
+40        (Type::SelfType(TraitOrType::TypeId(inner)), _) => {
+41            try_cast_type(context, inner, from_expr, into, into_span)
+42        }
+43
+44        (Type::String(from_str), Type::String(into_str)) => {
+45            if from_str.max_size > into_str.max_size {
+46                context.error(
+47                    "string capacity exceeded",
+48                    from_expr.span,
+49                    &format!(
+50                        "this string has length {}; expected length <= {}",
+51                        from_str.max_size, into_str.max_size
+52                    ),
+53                );
+54            } else {
+55                adjust_type(context, from_expr, into, AdjustmentKind::StringSizeIncrease);
+56            }
+57        }
+58
+59        (Type::Base(Base::Address), Type::Contract(_)) => {}
+60        (Type::Contract(_), Type::Base(Base::Address)) => {}
+61
+62        (Type::Base(Base::Numeric(from_int)), Type::Base(Base::Numeric(into_int))) => {
+63            let sign_differs = from_int.is_signed() != into_int.is_signed();
+64            let size_differs = from_int.size() != into_int.size();
+65
+66            if sign_differs && size_differs {
+67                context.error(
+68                        "Casting between numeric values can change the sign or size but not both at once",
+69                        from_expr.span,
+70                        &format!("can not cast from `{}` to `{}` in a single step",
+71                                 from.display(context.db()),
+72                                 into.display(context.db())));
+73            }
+74        }
+75        (Type::Base(Base::Numeric(_)), Type::Base(Base::Address)) => {}
+76        (Type::Base(Base::Address), Type::Base(Base::Numeric(into))) => {
+77            if into != Integer::U256 {
+78                context.error(
+79                    &format!("can't cast `address` to `{into}`"),
+80                    into_span,
+81                    "try `u256` here",
+82                );
+83            }
+84        }
+85        (Type::SelfContract(_), Type::Base(Base::Address)) => {
+86            context.error(
+87                "`self` address must be retrieved via `Context` object",
+88                into_span + from_expr.span,
+89                "use `ctx.self_address()` here",
+90            );
+91        }
+92
+93        (_, Type::Base(Base::Unit)) => unreachable!(), // rejected in expr_call_type
+94        (_, Type::Base(Base::Bool)) => unreachable!(), // handled in expr_call_type_constructor
+95        (_, Type::Tuple(_)) => unreachable!(),         // rejected in expr_call_type
+96        (_, Type::Struct(_)) => unreachable!(),        // handled in expr_call_type_constructor
+97        (_, Type::Map(_)) => unreachable!(),           // handled in expr_call_type_constructor
+98        (_, Type::Array(_)) => unreachable!(),         // handled in expr_call_type_constructor
+99        (_, Type::Generic(_)) => unreachable!(),       // handled in expr_call_type_constructor
+100        (_, Type::SelfContract(_)) => unreachable!(),  // contract names become Contract
+101
+102        _ => {
+103            context.error(
+104                &format!(
+105                    "incorrect type for argument to `{}`",
+106                    into.display(context.db())
+107                ),
+108                from_expr.span,
+109                &format!(
+110                    "cannot cast type `{}` to type `{}`",
+111                    from.display(context.db()),
+112                    into.display(context.db()),
+113                ),
+114            );
+115        }
+116    };
+117}
+118
+119pub fn deref_type(context: &mut dyn AnalyzerContext, expr: &Node<ast::Expr>, ty: TypeId) -> TypeId {
+120    match ty.typ(context.db()) {
+121        Type::SPtr(inner) => adjust_type(context, expr, inner, AdjustmentKind::Load),
+122        Type::Mut(inner) => deref_type(context, expr, inner),
+123        Type::SelfType(TraitOrType::TypeId(inner)) => deref_type(context, expr, inner),
+124        _ => ty,
+125    }
+126}
+127
+128pub fn adjust_type(
+129    context: &mut dyn AnalyzerContext,
+130    expr: &Node<ast::Expr>,
+131    into: TypeId,
+132    kind: AdjustmentKind,
+133) -> TypeId {
+134    context.update_expression(expr, &|attr: &mut ExpressionAttributes| {
+135        attr.type_adjustments.push(Adjustment { into, kind });
+136    });
+137    into
+138}
+139
+140pub fn try_coerce_type(
+141    context: &mut dyn AnalyzerContext,
+142    from_expr: Option<&Node<ast::Expr>>,
+143    from: TypeId,
+144    into: TypeId,
+145    should_copy: bool,
+146) -> Result<TypeId, TypeCoercionError> {
+147    let chain = coerce(context, from_expr, from, into, should_copy, vec![])?;
+148    if let Some(expr) = from_expr {
+149        context.update_expression(expr, &|attr: &mut ExpressionAttributes| {
+150            attr.type_adjustments.extend(chain.iter())
+151        });
+152    }
+153    Ok(into)
+154}
+155
+156fn coerce(
+157    context: &mut dyn AnalyzerContext,
+158    from_expr: Option<&Node<ast::Expr>>,
+159    from: TypeId,
+160    into: TypeId,
+161    should_copy: bool,
+162    chain: Vec<Adjustment>,
+163) -> Result<Vec<Adjustment>, TypeCoercionError> {
+164    // Cut down on some obviously unnecessary copy operations,
+165    // because we don't currently optimize MIR.
+166    let should_copy = should_copy
+167        && !into.is_sptr(context.db())
+168        && !into.deref(context.db()).is_primitive(context.db())
+169        && !from_expr.map(|e| is_temporary(context, e)).unwrap_or(false);
+170
+171    if from == into {
+172        let chain = add_adjustment_if(
+173            should_copy,
+174            chain,
+175            from.deref(context.db()),
+176            AdjustmentKind::Copy,
+177        );
+178        return Ok(chain);
+179    }
+180
+181    match (from.typ(context.db()), into.typ(context.db())) {
+182        (Type::SPtr(from), Type::SPtr(into)) => {
+183            coerce(context, from_expr, from, into, false, chain)
+184        }
+185        // Strip off any `mut`s.
+186        // Fn call `mut` is checked in `fn validate_arg_type`.
+187        (Type::Mut(from), Type::Mut(into)) => {
+188            let chain = add_adjustment_if(should_copy, chain, into, AdjustmentKind::Copy);
+189            coerce(context, from_expr, from, into, false, chain)
+190        }
+191        (Type::Mut(from), _) => {
+192            let chain = add_adjustment_if(should_copy, chain, from, AdjustmentKind::Copy);
+193            coerce(context, from_expr, from, into, false, chain)
+194        }
+195        (_, Type::Mut(into)) => {
+196            let chain = add_adjustment_if(should_copy, chain, from, AdjustmentKind::Copy);
+197            coerce(context, from_expr, from, into, false, chain)
+198        }
+199        (Type::SelfType(TraitOrType::TypeId(from)), _) => {
+200            let chain = add_adjustment_if(should_copy, chain, from, AdjustmentKind::Copy);
+201            coerce(context, from_expr, from, into, false, chain)
+202        }
+203        (_, Type::SelfType(TraitOrType::TypeId(into))) => {
+204            let chain = add_adjustment_if(should_copy, chain, from, AdjustmentKind::Copy);
+205            coerce(context, from_expr, from, into, false, chain)
+206        }
+207
+208        // Primitive types can be moved from storage implicitly.
+209        // Contract type is also a primitive.
+210        (Type::SPtr(from_inner), Type::Base(_) | Type::Contract(_)) => coerce(
+211            context,
+212            from_expr,
+213            from_inner,
+214            into,
+215            false,
+216            add_adjustment(chain, from_inner, AdjustmentKind::Load),
+217        ),
+218
+219        // complex types require .to_mem()
+220        (Type::SPtr(from), _) => {
+221            // If the inner types are incompatible, report that error instead
+222            try_coerce_type(context, from_expr, from, into, false)?;
+223            Err(TypeCoercionError::RequiresToMem)
+224        }
+225
+226        // All types can be moved into storage implicitly.
+227        // Note that no `Adjustment` is added here.
+228        (_, Type::SPtr(into)) => coerce(context, from_expr, from, into, false, chain),
+229
+230        (
+231            Type::String(FeString { max_size: from_sz }),
+232            Type::String(FeString { max_size: into_sz }),
+233        ) => match into_sz.cmp(&from_sz) {
+234            Ordering::Equal => Ok(chain),
+235            Ordering::Greater => Ok(add_adjustment(
+236                chain,
+237                into,
+238                AdjustmentKind::StringSizeIncrease,
+239            )),
+240            Ordering::Less => Err(TypeCoercionError::Incompatible),
+241        },
+242        (Type::SelfContract(from), Type::Contract(into)) => {
+243            if from == into {
+244                Err(TypeCoercionError::SelfContractType)
+245            } else {
+246                Err(TypeCoercionError::Incompatible)
+247            }
+248        }
+249
+250        (Type::Tuple(ftup), Type::Tuple(itup)) => {
+251            // If the rhs is a tuple expr, each element gets its own coercion chain.
+252            // Else, we don't allow coercion (for now, at least).
+253            if let Some(Node {
+254                kind: ast::Expr::Tuple { elts },
+255                ..
+256            }) = &from_expr
+257            {
+258                if ftup.items.len() == itup.items.len()
+259                    && elts
+260                        .iter()
+261                        .zip(ftup.items.iter().zip(itup.items.iter()))
+262                        .map(|(elt, (from, into))| {
+263                            try_coerce_type(context, Some(elt), *from, *into, should_copy).is_ok()
+264                        })
+265                        .all(|x| x)
+266                {
+267                    // Update the type of the rhs tuple, because its elements
+268                    // have been coerced into the lhs element types.
+269                    context.update_expression(from_expr.unwrap(), &|attr| attr.typ = into);
+270                    return Ok(chain);
+271                }
+272            }
+273            Err(TypeCoercionError::Incompatible)
+274        }
+275
+276        (Type::Base(Base::Numeric(f)), Type::Base(Base::Numeric(i))) => {
+277            if f.is_signed() == i.is_signed() && i.size() > f.size() {
+278                Ok(add_adjustment(chain, into, AdjustmentKind::IntSizeIncrease))
+279            } else {
+280                Err(TypeCoercionError::Incompatible)
+281            }
+282        }
+283        (_, _) => Err(TypeCoercionError::Incompatible),
+284    }
+285}
+286
+287#[must_use]
+288fn add_adjustment(
+289    mut chain: Vec<Adjustment>,
+290    into: TypeId,
+291    kind: AdjustmentKind,
+292) -> Vec<Adjustment> {
+293    chain.push(Adjustment { into, kind });
+294    chain
+295}
+296
+297#[must_use]
+298fn add_adjustment_if(
+299    test: bool,
+300    mut chain: Vec<Adjustment>,
+301    into: TypeId,
+302    kind: AdjustmentKind,
+303) -> Vec<Adjustment> {
+304    if test {
+305        chain.push(Adjustment { into, kind });
+306    }
+307    chain
+308}
+309
+310fn is_temporary(context: &dyn AnalyzerContext, expr: &Node<ast::Expr>) -> bool {
+311    match &expr.kind {
+312        ast::Expr::Tuple { .. } | ast::Expr::List { .. } | ast::Expr::Repeat { .. } => true,
+313        ast::Expr::Path(path) => {
+314            matches!(
+315                context.resolve_path(path, expr.span),
+316                Ok(NamedThing::EnumVariant(_))
+317            )
+318        }
+319        ast::Expr::Call { func, .. } => matches!(
+320            context.get_call(func),
+321            Some(CallType::TypeConstructor(_))
+322                | Some(CallType::EnumConstructor(_))
+323                | Some(CallType::BuiltinValueMethod {
+324                    method: ValueMethod::ToMem | ValueMethod::AbiEncode,
+325                    ..
+326                })
+327        ),
+328        _ => false,
+329    }
+330}
+331
+332pub fn apply_generic_type_args(
+333    context: &mut dyn AnalyzerContext,
+334    generic: GenericType,
+335    name_span: Span,
+336    args: Option<&Node<Vec<ast::GenericArg>>>,
+337) -> Result<TypeId, TypeError> {
+338    let params = generic.params();
+339
+340    let args = args.ok_or_else(|| {
+341        TypeError::new(context.fancy_error(
+342            &format!(
+343                "missing generic {} for type `{}`",
+344                pluralize_conditionally("argument", params.len()),
+345                generic.name()
+346            ),
+347            vec![Label::primary(
+348                name_span,
+349                format!(
+350                    "expected {} generic {}",
+351                    params.len(),
+352                    pluralize_conditionally("argument", params.len())
+353                ),
+354            )],
+355            vec![friendly_generic_arg_example_string(generic)],
+356        ))
+357    })?;
+358
+359    if let Some(diag) = validate_arg_count(
+360        context,
+361        &generic.name(),
+362        name_span,
+363        args,
+364        params.len(),
+365        "generic argument",
+366    ) {
+367        return Err(TypeError::new(diag));
+368    }
+369
+370    let concrete_args = params
+371        .iter()
+372        .zip(args.kind.iter())
+373        .map(|(param, arg)| match (param.kind, arg) {
+374            (GenericParamKind::Int, ast::GenericArg::Int(int_node)) => {
+375                Ok(GenericArg::Int(int_node.kind))
+376            }
+377
+378            (GenericParamKind::Int, ast::GenericArg::TypeDesc(_)) => {
+379                Err(TypeError::new(context.fancy_error(
+380                    &format!("`{}` {} must be an integer", generic.name(), param.name),
+381                    vec![Label::primary(arg.span(), "expected an integer")],
+382                    vec![],
+383                )))
+384            }
+385
+386            (GenericParamKind::Int, ast::GenericArg::ConstExpr(expr)) => {
+387                // Performs semantic analysis on `expr`.
+388                super::expressions::expr(context, expr, None)?;
+389
+390                // Evaluates expression.
+391                let const_value = super::const_expr::eval_expr(context, expr)?;
+392
+393                // TODO: Fix me when `GenericArg` can represent literals not only `Int`.
+394                match const_value {
+395                    Constant::Int(val) => Ok(GenericArg::Int(val.try_into().unwrap())),
+396                    Constant::Address(_) | Constant::Bool(_) | Constant::Str(_) => {
+397                        Err(TypeError::new(context.not_yet_implemented(
+398                            "non numeric type const generics",
+399                            expr.span,
+400                        )))
+401                    }
+402                }
+403            }
+404
+405            (GenericParamKind::PrimitiveType, ast::GenericArg::TypeDesc(type_node)) => {
+406                let typ = type_desc(context, type_node, None)?;
+407                if typ.is_primitive(context.db()) {
+408                    Ok(GenericArg::Type(typ))
+409                } else {
+410                    Err(TypeError::new(context.error(
+411                        &format!(
+412                            "`{}` {} must be a primitive type",
+413                            generic.name(),
+414                            param.name
+415                        ),
+416                        type_node.span,
+417                        &format!(
+418                            "this has type `{}`; expected a primitive type",
+419                            typ.display(context.db())
+420                        ),
+421                    )))
+422                }
+423            }
+424
+425            (GenericParamKind::AnyType, ast::GenericArg::TypeDesc(type_node)) => {
+426                Ok(GenericArg::Type(type_desc(context, type_node, None)?))
+427            }
+428
+429            (
+430                GenericParamKind::PrimitiveType | GenericParamKind::AnyType,
+431                ast::GenericArg::Int(_) | ast::GenericArg::ConstExpr(_),
+432            ) => Err(TypeError::new(context.fancy_error(
+433                &format!("`{}` {} must be a type", generic.name(), param.name),
+434                vec![Label::primary(arg.span(), "expected a type name")],
+435                vec![],
+436            ))),
+437        })
+438        .collect::<Result<Vec<_>, _>>()?;
+439    Ok(generic
+440        .apply(context.db(), &concrete_args)
+441        .expect("failed to construct generic type after checking args"))
+442}
+443
+444fn friendly_generic_arg_example_string(generic: GenericType) -> String {
+445    let example_args = generic
+446        .params()
+447        .iter()
+448        .map(|param| match param.kind {
+449            GenericParamKind::Int => "32",
+450            GenericParamKind::PrimitiveType => "u64",
+451            GenericParamKind::AnyType => "String<32>",
+452        })
+453        .collect::<Vec<&'static str>>();
+454
+455    format!("Example: `{}<{}>`", generic.name(), example_args.join(", "))
+456}
+457
+458pub fn resolve_concrete_type_name<T: std::fmt::Display>(
+459    context: &mut dyn AnalyzerContext,
+460    name: &str,
+461    base_desc: &Node<T>,
+462    generic_args: Option<&Node<Vec<ast::GenericArg>>>,
+463) -> Result<TypeId, TypeError> {
+464    let named_thing = context.resolve_name(name, base_desc.span)?;
+465    resolve_concrete_type_named_thing(context, named_thing, base_desc, generic_args)
+466}
+467
+468pub fn resolve_concrete_type_path<T: std::fmt::Display>(
+469    context: &mut dyn AnalyzerContext,
+470    path: &ast::Path,
+471    base_desc: &Node<T>,
+472    generic_args: Option<&Node<Vec<ast::GenericArg>>>,
+473) -> Result<TypeId, TypeError> {
+474    let named_thing = context.resolve_path(path, base_desc.span)?;
+475    resolve_concrete_type_named_thing(context, Some(named_thing), base_desc, generic_args)
+476}
+477
+478pub fn resolve_concrete_type_named_thing<T: std::fmt::Display>(
+479    context: &mut dyn AnalyzerContext,
+480    named_thing: Option<NamedThing>,
+481    base_desc: &Node<T>,
+482    generic_args: Option<&Node<Vec<ast::GenericArg>>>,
+483) -> Result<TypeId, TypeError> {
+484    match named_thing {
+485        Some(NamedThing::Item(Item::Type(id))) => {
+486            if let Some(args) = generic_args {
+487                context.fancy_error(
+488                    &format!("`{}` type is not generic", base_desc.kind),
+489                    vec![Label::primary(
+490                        args.span,
+491                        "unexpected generic argument list",
+492                    )],
+493                    vec![],
+494                );
+495            }
+496            id.type_id(context.db())
+497        }
+498        Some(NamedThing::Item(Item::GenericType(generic))) => {
+499            apply_generic_type_args(context, generic, base_desc.span, generic_args)
+500        }
+501        Some(named_thing) => Err(TypeError::new(context.fancy_error(
+502            &format!("`{}` is not a type name", base_desc.kind),
+503            if let Some(def_span) = named_thing.name_span(context.db()) {
+504                vec![
+505                    Label::primary(
+506                        def_span,
+507                        format!(
+508                            "`{}` is defined here as a {}",
+509                            base_desc.kind,
+510                            named_thing.item_kind_display_name()
+511                        ),
+512                    ),
+513                    Label::primary(
+514                        base_desc.span,
+515                        format!("`{}` is used here as a type", base_desc.kind),
+516                    ),
+517                ]
+518            } else {
+519                vec![Label::primary(
+520                    base_desc.span,
+521                    format!(
+522                        "`{}` is a {}",
+523                        base_desc.kind,
+524                        named_thing.item_kind_display_name()
+525                    ),
+526                )]
+527            },
+528            vec![],
+529        ))),
+530        None => Err(TypeError::new(context.error(
+531            "undefined type",
+532            base_desc.span,
+533            &format!("`{}` has not been defined", base_desc.kind),
+534        ))),
+535    }
+536}
+537
+538/// Maps a type description node to an enum type.
+539pub fn type_desc(
+540    context: &mut dyn AnalyzerContext,
+541    desc: &Node<ast::TypeDesc>,
+542    self_type: Option<TraitOrType>,
+543) -> Result<TypeId, TypeError> {
+544    match &desc.kind {
+545        ast::TypeDesc::Base { base } => resolve_concrete_type_name(context, base, desc, None),
+546        ast::TypeDesc::Path(path) => resolve_concrete_type_path(context, path, desc, None),
+547        // generic will need to allow for paths too
+548        ast::TypeDesc::Generic { base, args } => {
+549            resolve_concrete_type_name(context, &base.kind, base, Some(args))
+550        }
+551        ast::TypeDesc::Tuple { items } => {
+552            let types = items
+553                .iter()
+554                .map(|typ| match type_desc(context, typ, self_type.clone()) {
+555                    Ok(typ) if typ.has_fixed_size(context.db()) => Ok(typ),
+556                    Err(e) => Err(e),
+557                    _ => Err(TypeError::new(context.error(
+558                        "tuple elements must have fixed size",
+559                        typ.span,
+560                        "this can't be stored in a tuple",
+561                    ))),
+562                })
+563                .collect::<Result<Vec<_>, _>>()?;
+564            Ok(context.db().intern_type(Type::Tuple(Tuple {
+565                items: types.into(),
+566            })))
+567        }
+568        ast::TypeDesc::Unit => Ok(TypeId::unit(context.db())),
+569        ast::TypeDesc::SelfType => {
+570            if let Some(val) = self_type {
+571                Ok(Type::SelfType(val).id(context.db()))
+572            } else {
+573                dbg!("Reporting error");
+574                Err(TypeError::new(context.error(
+575                    "`Self` can not be used here",
+576                    desc.span,
+577                    "",
+578                )))
+579            }
+580        }
+581    }
+582}
+583
+584/// Maps a type description node to a `TraitId`.
+585pub fn type_desc_to_trait(
+586    context: &mut dyn AnalyzerContext,
+587    desc: &Node<ast::TypeDesc>,
+588) -> Result<TraitId, TypeError> {
+589    match &desc.kind {
+590        ast::TypeDesc::Base { base } => {
+591            let named_thing = context.resolve_name(base, desc.span)?;
+592            resolve_concrete_trait_named_thing(context, named_thing, desc)
+593        }
+594        ast::TypeDesc::Path(path) => {
+595            let named_thing = context.resolve_path(path, desc.span)?;
+596            resolve_concrete_trait_named_thing(context, Some(named_thing), desc)
+597        }
+598        // generic will need to allow for paths too
+599        ast::TypeDesc::Generic { base, .. } => {
+600            let named_thing = context.resolve_name(&base.kind, desc.span)?;
+601            resolve_concrete_trait_named_thing(context, named_thing, desc)
+602        }
+603        _ => panic!("Should be rejected by parser"),
+604    }
+605}
+606
+607pub fn resolve_concrete_trait_named_thing<T: std::fmt::Display>(
+608    context: &mut dyn AnalyzerContext,
+609    val: Option<NamedThing>,
+610    base_desc: &Node<T>,
+611) -> Result<TraitId, TypeError> {
+612    match val {
+613        Some(NamedThing::Item(Item::Trait(treit))) => Ok(treit),
+614        Some(NamedThing::Item(Item::Type(ty))) => Err(TypeError::new(context.error(
+615            &format!("expected trait, found type `{}`", ty.name(context.db())),
+616            base_desc.span,
+617            "not a trait",
+618        ))),
+619        Some(named_thing) => Err(TypeError::new(context.fancy_error(
+620            &format!("`{}` is not a trait name", base_desc.kind),
+621            if let Some(def_span) = named_thing.name_span(context.db()) {
+622                vec![
+623                    Label::primary(
+624                        def_span,
+625                        format!(
+626                            "`{}` is defined here as a {}",
+627                            base_desc.kind,
+628                            named_thing.item_kind_display_name()
+629                        ),
+630                    ),
+631                    Label::primary(
+632                        base_desc.span,
+633                        format!("`{}` is used here as a trait", base_desc.kind),
+634                    ),
+635                ]
+636            } else {
+637                vec![Label::primary(
+638                    base_desc.span,
+639                    format!(
+640                        "`{}` is a {}",
+641                        base_desc.kind,
+642                        named_thing.item_kind_display_name()
+643                    ),
+644                )]
+645            },
+646            vec![],
+647        ))),
+648        None => Err(TypeError::new(context.error(
+649            "undefined trait",
+650            base_desc.span,
+651            &format!("`{}` has not been defined", base_desc.kind),
+652        ))),
+653    }
+654}
\ No newline at end of file diff --git a/compiler-docs/src/fe_analyzer/traversal/utils.rs.html b/compiler-docs/src/fe_analyzer/traversal/utils.rs.html new file mode 100644 index 0000000000..dbb8bcd78b --- /dev/null +++ b/compiler-docs/src/fe_analyzer/traversal/utils.rs.html @@ -0,0 +1,61 @@ +utils.rs - source

fe_analyzer/traversal/
utils.rs

1use fe_common::diagnostics::Label;
+2use fe_common::Span;
+3
+4use crate::context::{AnalyzerContext, DiagnosticVoucher};
+5use crate::display::Displayable;
+6use crate::errors::BinaryOperationError;
+7use crate::namespace::types::TypeId;
+8use crate::AnalyzerDb;
+9use std::fmt::Display;
+10
+11fn type_label(db: &dyn AnalyzerDb, span: Span, typ: TypeId) -> Label {
+12    Label::primary(span, format!("this has type `{}`", typ.display(db)))
+13}
+14
+15pub fn add_bin_operations_errors(
+16    context: &dyn AnalyzerContext,
+17    op: &dyn Display,
+18    lspan: Span,
+19    ltype: TypeId,
+20    rspan: Span,
+21    rtype: TypeId,
+22    error: BinaryOperationError,
+23) -> DiagnosticVoucher {
+24    let db = context.db();
+25    let ltype = ltype.deref(db);
+26    let rtype = rtype.deref(db);
+27
+28    match error {
+29        BinaryOperationError::NotEqualAndUnsigned => context.fancy_error(
+30            &format!("`{op}` operand types must be equal and unsigned"),
+31            vec![type_label(db, lspan, ltype), type_label(db, rspan, rtype)],
+32            vec![],
+33        ),
+34        BinaryOperationError::RightIsSigned => context.fancy_error(
+35            &format!("The right hand side of the `{op}` operation must be unsigned"),
+36            vec![Label::primary(
+37                rspan,
+38                format!("this has signed type `{}`", rtype.display(db)),
+39            )],
+40            vec![],
+41        ),
+42        BinaryOperationError::RightTooLarge => context.fancy_error(
+43            &format!("incompatible `{op}` operand types"),
+44            vec![type_label(db, lspan, ltype), type_label(db, rspan, rtype)],
+45            vec![format!(
+46                "The type of the right hand side cannot be larger than the left (`{}`)",
+47                ltype.display(db)
+48            )],
+49        ),
+50        BinaryOperationError::TypesNotCompatible => context.fancy_error(
+51            &format!("`{op}` operand types are not compatible"),
+52            vec![type_label(db, lspan, ltype), type_label(db, rspan, rtype)],
+53            vec![],
+54        ),
+55        BinaryOperationError::TypesNotNumeric => context.fancy_error(
+56            &format!("`{op}` operands must be numeric"),
+57            vec![type_label(db, lspan, ltype), type_label(db, rspan, rtype)],
+58            vec![],
+59        ),
+60    }
+61}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db.rs.html b/compiler-docs/src/fe_codegen/db.rs.html new file mode 100644 index 0000000000..5c047a48f0 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db.rs.html @@ -0,0 +1,100 @@ +db.rs - source

fe_codegen/
db.rs

1#![allow(clippy::arc_with_non_send_sync)]
+2use std::rc::Rc;
+3
+4use fe_abi::{contract::AbiContract, event::AbiEvent, function::AbiFunction, types::AbiType};
+5use fe_analyzer::{
+6    db::AnalyzerDbStorage,
+7    namespace::items::{ContractId, ModuleId},
+8    AnalyzerDb,
+9};
+10use fe_common::db::{SourceDb, SourceDbStorage, Upcast, UpcastMut};
+11use fe_mir::{
+12    db::{MirDb, MirDbStorage},
+13    ir::{FunctionBody, FunctionId, FunctionSignature, TypeId},
+14};
+15
+16mod queries;
+17
+18#[salsa::query_group(CodegenDbStorage)]
+19pub trait CodegenDb: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> {
+20    #[salsa::invoke(queries::function::legalized_signature)]
+21    fn codegen_legalized_signature(&self, function_id: FunctionId) -> Rc<FunctionSignature>;
+22    #[salsa::invoke(queries::function::legalized_body)]
+23    fn codegen_legalized_body(&self, function_id: FunctionId) -> Rc<FunctionBody>;
+24    #[salsa::invoke(queries::function::symbol_name)]
+25    fn codegen_function_symbol_name(&self, function_id: FunctionId) -> Rc<String>;
+26
+27    #[salsa::invoke(queries::types::legalized_type)]
+28    fn codegen_legalized_type(&self, ty: TypeId) -> TypeId;
+29
+30    #[salsa::invoke(queries::abi::abi_type)]
+31    fn codegen_abi_type(&self, ty: TypeId) -> AbiType;
+32    #[salsa::invoke(queries::abi::abi_function)]
+33    fn codegen_abi_function(&self, function_id: FunctionId) -> AbiFunction;
+34    #[salsa::invoke(queries::abi::abi_event)]
+35    fn codegen_abi_event(&self, ty: TypeId) -> AbiEvent;
+36    #[salsa::invoke(queries::abi::abi_contract)]
+37    fn codegen_abi_contract(&self, contract: ContractId) -> AbiContract;
+38    #[salsa::invoke(queries::abi::abi_module_events)]
+39    fn codegen_abi_module_events(&self, module: ModuleId) -> Vec<AbiEvent>;
+40    #[salsa::invoke(queries::abi::abi_type_maximum_size)]
+41    fn codegen_abi_type_maximum_size(&self, ty: TypeId) -> usize;
+42    #[salsa::invoke(queries::abi::abi_type_minimum_size)]
+43    fn codegen_abi_type_minimum_size(&self, ty: TypeId) -> usize;
+44    #[salsa::invoke(queries::abi::abi_function_argument_maximum_size)]
+45    fn codegen_abi_function_argument_maximum_size(&self, contract: FunctionId) -> usize;
+46    #[salsa::invoke(queries::abi::abi_function_return_maximum_size)]
+47    fn codegen_abi_function_return_maximum_size(&self, function: FunctionId) -> usize;
+48
+49    #[salsa::invoke(queries::contract::symbol_name)]
+50    fn codegen_contract_symbol_name(&self, contract: ContractId) -> Rc<String>;
+51    #[salsa::invoke(queries::contract::deployer_symbol_name)]
+52    fn codegen_contract_deployer_symbol_name(&self, contract: ContractId) -> Rc<String>;
+53
+54    #[salsa::invoke(queries::constant::string_symbol_name)]
+55    fn codegen_constant_string_symbol_name(&self, data: String) -> Rc<String>;
+56}
+57
+58// TODO: Move this to driver.
+59#[salsa::database(SourceDbStorage, AnalyzerDbStorage, MirDbStorage, CodegenDbStorage)]
+60#[derive(Default)]
+61pub struct Db {
+62    storage: salsa::Storage<Db>,
+63}
+64impl salsa::Database for Db {}
+65
+66impl Upcast<dyn MirDb> for Db {
+67    fn upcast(&self) -> &(dyn MirDb + 'static) {
+68        self
+69    }
+70}
+71
+72impl UpcastMut<dyn MirDb> for Db {
+73    fn upcast_mut(&mut self) -> &mut (dyn MirDb + 'static) {
+74        &mut *self
+75    }
+76}
+77
+78impl Upcast<dyn SourceDb> for Db {
+79    fn upcast(&self) -> &(dyn SourceDb + 'static) {
+80        self
+81    }
+82}
+83
+84impl UpcastMut<dyn SourceDb> for Db {
+85    fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static) {
+86        &mut *self
+87    }
+88}
+89
+90impl Upcast<dyn AnalyzerDb> for Db {
+91    fn upcast(&self) -> &(dyn AnalyzerDb + 'static) {
+92        self
+93    }
+94}
+95
+96impl UpcastMut<dyn AnalyzerDb> for Db {
+97    fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static) {
+98        &mut *self
+99    }
+100}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries.rs.html b/compiler-docs/src/fe_codegen/db/queries.rs.html new file mode 100644 index 0000000000..9406ddeca4 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries.rs.html @@ -0,0 +1,5 @@ +queries.rs - source

fe_codegen/db/
queries.rs

1pub mod abi;
+2pub mod constant;
+3pub mod contract;
+4pub mod function;
+5pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/abi.rs.html b/compiler-docs/src/fe_codegen/db/queries/abi.rs.html new file mode 100644 index 0000000000..d23d5ee235 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/abi.rs.html @@ -0,0 +1,279 @@ +abi.rs - source

fe_codegen/db/queries/
abi.rs

1use fe_abi::{
+2    contract::AbiContract,
+3    event::{AbiEvent, AbiEventField},
+4    function::{AbiFunction, AbiFunctionType, CtxParam, SelfParam, StateMutability},
+5    types::{AbiTupleField, AbiType},
+6};
+7use fe_analyzer::{
+8    constants::INDEXED,
+9    namespace::{
+10        items::{ContractId, ModuleId},
+11        types::{CtxDecl, SelfDecl},
+12    },
+13};
+14use fe_mir::ir::{self, FunctionId, TypeId};
+15
+16use crate::db::CodegenDb;
+17
+18pub fn abi_contract(db: &dyn CodegenDb, contract: ContractId) -> AbiContract {
+19    let mut funcs = vec![];
+20
+21    if let Some(init) = contract.init_function(db.upcast()) {
+22        let init_func = db.mir_lowered_func_signature(init);
+23        let init_abi = db.codegen_abi_function(init_func);
+24        funcs.push(init_abi);
+25    }
+26
+27    for &func in contract.all_functions(db.upcast()).as_ref() {
+28        let mir_func = db.mir_lowered_func_signature(func);
+29        if mir_func.linkage(db.upcast()).is_exported() {
+30            let func_abi = db.codegen_abi_function(mir_func);
+31            funcs.push(func_abi);
+32        }
+33    }
+34
+35    let events = abi_module_events(db, contract.module(db.upcast()));
+36
+37    AbiContract::new(funcs, events)
+38}
+39
+40pub fn abi_module_events(db: &dyn CodegenDb, module: ModuleId) -> Vec<AbiEvent> {
+41    let mut events = vec![];
+42    for &s in db.module_structs(module).as_ref() {
+43        let struct_ty = s.as_type(db.upcast());
+44        // TODO: This is a hack to avoid generating an ABI for non-`emittable` structs.
+45        if struct_ty.is_emittable(db.upcast()) {
+46            let mir_event = db.mir_lowered_type(struct_ty);
+47            let event = db.codegen_abi_event(mir_event);
+48            events.push(event);
+49        }
+50    }
+51
+52    events
+53}
+54
+55pub fn abi_function(db: &dyn CodegenDb, function: FunctionId) -> AbiFunction {
+56    // We use a legalized signature.
+57    let sig = db.codegen_legalized_signature(function);
+58
+59    let name = function.name(db.upcast());
+60    let args = sig
+61        .params
+62        .iter()
+63        .map(|param| (param.name.to_string(), db.codegen_abi_type(param.ty)))
+64        .collect();
+65    let ret_ty = sig.return_type.map(|ty| db.codegen_abi_type(ty));
+66
+67    let func_type = if function.is_contract_init(db.upcast()) {
+68        AbiFunctionType::Constructor
+69    } else {
+70        AbiFunctionType::Function
+71    };
+72
+73    // The "stateMutability" field is derived from the presence & mutability of
+74    // `self` and `ctx` params in the analyzer fn sig.
+75    let analyzer_sig = sig.analyzer_func_id.signature(db.upcast());
+76    let self_param = match analyzer_sig.self_decl {
+77        None => SelfParam::None,
+78        Some(SelfDecl { mut_: None, .. }) => SelfParam::Imm,
+79        Some(SelfDecl { mut_: Some(_), .. }) => SelfParam::Mut,
+80    };
+81    let ctx_param = match analyzer_sig.ctx_decl {
+82        None => CtxParam::None,
+83        Some(CtxDecl { mut_: None, .. }) => CtxParam::Imm,
+84        Some(CtxDecl { mut_: Some(_), .. }) => CtxParam::Mut,
+85    };
+86
+87    let state_mutability = if name == "__init__" {
+88        StateMutability::Payable
+89    } else {
+90        StateMutability::from_self_and_ctx_params(self_param, ctx_param)
+91    };
+92
+93    AbiFunction::new(func_type, name.to_string(), args, ret_ty, state_mutability)
+94}
+95
+96pub fn abi_function_argument_maximum_size(db: &dyn CodegenDb, function: FunctionId) -> usize {
+97    let sig = db.codegen_legalized_signature(function);
+98    sig.params.iter().fold(0, |acc, param| {
+99        acc + db.codegen_abi_type_maximum_size(param.ty)
+100    })
+101}
+102
+103pub fn abi_function_return_maximum_size(db: &dyn CodegenDb, function: FunctionId) -> usize {
+104    let sig = db.codegen_legalized_signature(function);
+105    sig.return_type
+106        .map(|ty| db.codegen_abi_type_maximum_size(ty))
+107        .unwrap_or_default()
+108}
+109
+110pub fn abi_type_maximum_size(db: &dyn CodegenDb, ty: TypeId) -> usize {
+111    let abi_type = db.codegen_abi_type(ty);
+112    if abi_type.is_static() {
+113        abi_type.header_size()
+114    } else {
+115        match &ty.data(db.upcast()).kind {
+116            ir::TypeKind::Array(def) if def.elem_ty.data(db.upcast()).kind == ir::TypeKind::U8 => {
+117                debug_assert_eq!(abi_type, AbiType::Bytes);
+118                64 + ceil_32(def.len)
+119            }
+120
+121            ir::TypeKind::Array(def) => {
+122                db.codegen_abi_type_maximum_size(def.elem_ty) * def.len + 32
+123            }
+124
+125            ir::TypeKind::String(len) => abi_type.header_size() + 32 + ceil_32(*len),
+126            _ if ty.is_aggregate(db.upcast()) => {
+127                let mut maximum = 0;
+128                for i in 0..ty.aggregate_field_num(db.upcast()) {
+129                    let field_ty = ty.projection_ty_imm(db.upcast(), i);
+130                    maximum += db.codegen_abi_type_maximum_size(field_ty)
+131                }
+132                maximum + 32
+133            }
+134            ir::TypeKind::MPtr(ty) => abi_type_maximum_size(db, ty.deref(db.upcast())),
+135
+136            _ => unreachable!(),
+137        }
+138    }
+139}
+140
+141pub fn abi_type_minimum_size(db: &dyn CodegenDb, ty: TypeId) -> usize {
+142    let abi_type = db.codegen_abi_type(ty);
+143    if abi_type.is_static() {
+144        abi_type.header_size()
+145    } else {
+146        match &ty.data(db.upcast()).kind {
+147            ir::TypeKind::Array(def) if def.elem_ty.data(db.upcast()).kind == ir::TypeKind::U8 => {
+148                debug_assert_eq!(abi_type, AbiType::Bytes);
+149                64
+150            }
+151            ir::TypeKind::Array(def) => {
+152                db.codegen_abi_type_minimum_size(def.elem_ty) * def.len + 32
+153            }
+154
+155            ir::TypeKind::String(_) => abi_type.header_size() + 32,
+156
+157            _ if ty.is_aggregate(db.upcast()) => {
+158                let mut minimum = 0;
+159                for i in 0..ty.aggregate_field_num(db.upcast()) {
+160                    let field_ty = ty.projection_ty_imm(db.upcast(), i);
+161                    minimum += db.codegen_abi_type_minimum_size(field_ty)
+162                }
+163                minimum + 32
+164            }
+165            ir::TypeKind::MPtr(ty) => abi_type_minimum_size(db, ty.deref(db.upcast())),
+166            _ => unreachable!(),
+167        }
+168    }
+169}
+170
+171pub fn abi_type(db: &dyn CodegenDb, ty: TypeId) -> AbiType {
+172    let legalized_ty = db.codegen_legalized_type(ty);
+173
+174    if legalized_ty.is_zero_sized(db.upcast()) {
+175        unreachable!("zero-sized type must be removed in legalization");
+176    }
+177
+178    let ty_data = legalized_ty.data(db.upcast());
+179
+180    match &ty_data.kind {
+181        ir::TypeKind::I8 => AbiType::Int(8),
+182        ir::TypeKind::I16 => AbiType::Int(16),
+183        ir::TypeKind::I32 => AbiType::Int(32),
+184        ir::TypeKind::I64 => AbiType::Int(64),
+185        ir::TypeKind::I128 => AbiType::Int(128),
+186        ir::TypeKind::I256 => AbiType::Int(256),
+187        ir::TypeKind::U8 => AbiType::UInt(8),
+188        ir::TypeKind::U16 => AbiType::UInt(16),
+189        ir::TypeKind::U32 => AbiType::UInt(32),
+190        ir::TypeKind::U64 => AbiType::UInt(64),
+191        ir::TypeKind::U128 => AbiType::UInt(128),
+192        ir::TypeKind::U256 => AbiType::UInt(256),
+193        ir::TypeKind::Bool => AbiType::Bool,
+194        ir::TypeKind::Address => AbiType::Address,
+195        ir::TypeKind::String(_) => AbiType::String,
+196        ir::TypeKind::Unit => unreachable!("zero-sized type must be removed in legalization"),
+197        ir::TypeKind::Array(def) => {
+198            let elem_ty_data = &def.elem_ty.data(db.upcast());
+199            match &elem_ty_data.kind {
+200                ir::TypeKind::U8 => AbiType::Bytes,
+201                _ => {
+202                    let elem_ty = db.codegen_abi_type(def.elem_ty);
+203                    let len = def.len;
+204                    AbiType::Array {
+205                        elem_ty: elem_ty.into(),
+206                        len,
+207                    }
+208                }
+209            }
+210        }
+211        ir::TypeKind::Tuple(def) => {
+212            let fields = def
+213                .items
+214                .iter()
+215                .enumerate()
+216                .map(|(i, item)| {
+217                    let field_ty = db.codegen_abi_type(*item);
+218                    AbiTupleField::new(format!("{i}"), field_ty)
+219                })
+220                .collect();
+221
+222            AbiType::Tuple(fields)
+223        }
+224        ir::TypeKind::Struct(def) => {
+225            let fields = def
+226                .fields
+227                .iter()
+228                .map(|(name, ty)| {
+229                    let ty = db.codegen_abi_type(*ty);
+230                    AbiTupleField::new(name.to_string(), ty)
+231                })
+232                .collect();
+233
+234            AbiType::Tuple(fields)
+235        }
+236        ir::TypeKind::MPtr(inner) => db.codegen_abi_type(*inner),
+237
+238        ir::TypeKind::Contract(_)
+239        | ir::TypeKind::Map(_)
+240        | ir::TypeKind::Enum(_)
+241        | ir::TypeKind::SPtr(_) => unreachable!(),
+242    }
+243}
+244
+245pub fn abi_event(db: &dyn CodegenDb, ty: TypeId) -> AbiEvent {
+246    debug_assert!(ty.is_struct(db.upcast()));
+247
+248    let legalized_ty = db.codegen_legalized_type(ty);
+249    let analyzer_struct = ty
+250        .analyzer_ty(db.upcast())
+251        .and_then(|val| val.as_struct(db.upcast()))
+252        .unwrap();
+253    let legalized_ty_data = legalized_ty.data(db.upcast());
+254    let event_def = match &legalized_ty_data.kind {
+255        ir::TypeKind::Struct(def) => def,
+256        _ => unreachable!(),
+257    };
+258
+259    let fields = event_def
+260        .fields
+261        .iter()
+262        .map(|(name, ty)| {
+263            let attr = analyzer_struct
+264                .field(db.upcast(), name)
+265                .unwrap()
+266                .attributes(db.upcast());
+267
+268            let ty = db.codegen_abi_type(*ty);
+269            let indexed = attr.iter().any(|attr| attr == INDEXED);
+270            AbiEventField::new(name.to_string(), ty, indexed)
+271        })
+272        .collect();
+273
+274    AbiEvent::new(event_def.name.to_string(), fields, false)
+275}
+276
+277fn ceil_32(value: usize) -> usize {
+278    ((value + 31) / 32) * 32
+279}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/constant.rs.html b/compiler-docs/src/fe_codegen/db/queries/constant.rs.html new file mode 100644 index 0000000000..f07a8f835a --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/constant.rs.html @@ -0,0 +1,12 @@ +constant.rs - source

fe_codegen/db/queries/
constant.rs

1use crate::db::CodegenDb;
+2use std::{
+3    collections::hash_map::DefaultHasher,
+4    hash::{Hash, Hasher},
+5    rc::Rc,
+6};
+7
+8pub fn string_symbol_name(_db: &dyn CodegenDb, data: String) -> Rc<String> {
+9    let mut hasher = DefaultHasher::new();
+10    data.hash(&mut hasher);
+11    format! {"{}", hasher.finish()}.into()
+12}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/contract.rs.html b/compiler-docs/src/fe_codegen/db/queries/contract.rs.html new file mode 100644 index 0000000000..519e580a1a --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/contract.rs.html @@ -0,0 +1,20 @@ +contract.rs - source

fe_codegen/db/queries/
contract.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::ContractId;
+4
+5use crate::db::CodegenDb;
+6
+7pub fn symbol_name(db: &dyn CodegenDb, contract: ContractId) -> Rc<String> {
+8    let module = contract.module(db.upcast());
+9
+10    format!(
+11        "{}${}",
+12        module.name(db.upcast()),
+13        contract.name(db.upcast())
+14    )
+15    .into()
+16}
+17
+18pub fn deployer_symbol_name(db: &dyn CodegenDb, contract: ContractId) -> Rc<String> {
+19    format!("deploy_{}", symbol_name(db, contract).as_ref()).into()
+20}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/function.rs.html b/compiler-docs/src/fe_codegen/db/queries/function.rs.html new file mode 100644 index 0000000000..8b55aa2b74 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/function.rs.html @@ -0,0 +1,76 @@ +function.rs - source

fe_codegen/db/queries/
function.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::{
+4    display::Displayable,
+5    namespace::{
+6        items::Item,
+7        types::{Type, TypeId},
+8    },
+9};
+10use fe_mir::ir::{FunctionBody, FunctionId, FunctionSignature};
+11use salsa::InternKey;
+12use smol_str::SmolStr;
+13
+14use crate::{db::CodegenDb, yul::legalize};
+15
+16pub fn legalized_signature(db: &dyn CodegenDb, function: FunctionId) -> Rc<FunctionSignature> {
+17    let mut sig = function.signature(db.upcast()).as_ref().clone();
+18    legalize::legalize_func_signature(db, &mut sig);
+19    sig.into()
+20}
+21
+22pub fn legalized_body(db: &dyn CodegenDb, function: FunctionId) -> Rc<FunctionBody> {
+23    let mut body = function.body(db.upcast()).as_ref().clone();
+24    legalize::legalize_func_body(db, &mut body);
+25    body.into()
+26}
+27
+28pub fn symbol_name(db: &dyn CodegenDb, function: FunctionId) -> Rc<String> {
+29    let module = function.signature(db.upcast()).module_id;
+30    let module_name = module.name(db.upcast());
+31
+32    let analyzer_func = function.analyzer_func(db.upcast());
+33    let func_name = format!(
+34        "{}{}",
+35        analyzer_func.name(db.upcast()),
+36        type_suffix(function, db)
+37    );
+38
+39    let func_name = match analyzer_func.sig(db.upcast()).self_item(db.upcast()) {
+40        Some(Item::Impl(id)) => {
+41            let class_name = format!(
+42                "{}${}",
+43                id.trait_id(db.upcast()).name(db.upcast()),
+44                safe_name(db, id.receiver(db.upcast()))
+45            );
+46            format!("{class_name}${func_name}")
+47        }
+48        Some(class) => {
+49            let class_name = class.name(db.upcast());
+50            format!("{class_name}${func_name}")
+51        }
+52        _ => func_name,
+53    };
+54
+55    format!("{module_name}${func_name}").into()
+56}
+57
+58fn type_suffix(function: FunctionId, db: &dyn CodegenDb) -> SmolStr {
+59    function
+60        .signature(db.upcast())
+61        .resolved_generics
+62        .values()
+63        .fold(String::new(), |acc, param| {
+64            format!("{}_{}", acc, safe_name(db, *param))
+65        })
+66        .into()
+67}
+68
+69fn safe_name(db: &dyn CodegenDb, ty: TypeId) -> SmolStr {
+70    match ty.typ(db.upcast()) {
+71        // TODO: Would be nice to get more human friendly names here
+72        Type::Array(_) => format!("array_{:?}", ty.as_intern_id()).into(),
+73        Type::Tuple(_) => format!("tuple_{:?}", ty.as_intern_id()).into(),
+74        _ => format!("{}", ty.display(db.upcast())).into(),
+75    }
+76}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/db/queries/types.rs.html b/compiler-docs/src/fe_codegen/db/queries/types.rs.html new file mode 100644 index 0000000000..6061ee1af9 --- /dev/null +++ b/compiler-docs/src/fe_codegen/db/queries/types.rs.html @@ -0,0 +1,102 @@ +types.rs - source

fe_codegen/db/queries/
types.rs

1use fe_mir::ir::{
+2    types::{ArrayDef, MapDef, StructDef, TupleDef},
+3    Type, TypeId, TypeKind,
+4};
+5
+6use crate::db::CodegenDb;
+7
+8pub fn legalized_type(db: &dyn CodegenDb, ty: TypeId) -> TypeId {
+9    let ty_data = ty.data(db.upcast());
+10    let ty_kind = match &ty.data(db.upcast()).kind {
+11        TypeKind::Tuple(def) => {
+12            let items = def
+13                .items
+14                .iter()
+15                .filter_map(|item| {
+16                    if item.is_zero_sized(db.upcast()) {
+17                        None
+18                    } else {
+19                        Some(legalized_type(db, *item))
+20                    }
+21                })
+22                .collect();
+23            let new_def = TupleDef { items };
+24            TypeKind::Tuple(new_def)
+25        }
+26
+27        TypeKind::Array(def) => {
+28            let new_def = ArrayDef {
+29                elem_ty: legalized_type(db, def.elem_ty),
+30                len: def.len,
+31            };
+32            TypeKind::Array(new_def)
+33        }
+34
+35        TypeKind::Struct(def) => {
+36            let fields = def
+37                .fields
+38                .iter()
+39                .cloned()
+40                .filter_map(|(name, ty)| {
+41                    if ty.is_zero_sized(db.upcast()) {
+42                        None
+43                    } else {
+44                        Some((name, legalized_type(db, ty)))
+45                    }
+46                })
+47                .collect();
+48            let new_def = StructDef {
+49                name: def.name.clone(),
+50                fields,
+51                span: def.span,
+52                module_id: def.module_id,
+53            };
+54            TypeKind::Struct(new_def)
+55        }
+56
+57        TypeKind::Contract(def) => {
+58            let fields = def
+59                .fields
+60                .iter()
+61                .cloned()
+62                .filter_map(|(name, ty)| {
+63                    if ty.is_zero_sized(db.upcast()) {
+64                        None
+65                    } else {
+66                        Some((name, legalized_type(db, ty)))
+67                    }
+68                })
+69                .collect();
+70            let new_def = StructDef {
+71                name: def.name.clone(),
+72                fields,
+73                span: def.span,
+74                module_id: def.module_id,
+75            };
+76            TypeKind::Contract(new_def)
+77        }
+78
+79        TypeKind::Map(def) => {
+80            let new_def = MapDef {
+81                key_ty: legalized_type(db, def.key_ty),
+82                value_ty: legalized_type(db, def.value_ty),
+83            };
+84            TypeKind::Map(new_def)
+85        }
+86
+87        TypeKind::MPtr(ty) => {
+88            let new_ty = legalized_type(db, *ty);
+89            TypeKind::MPtr(new_ty)
+90        }
+91
+92        TypeKind::SPtr(ty) => {
+93            let new_ty = legalized_type(db, *ty);
+94            TypeKind::SPtr(new_ty)
+95        }
+96
+97        _ => return ty,
+98    };
+99
+100    let analyzer_ty = ty_data.analyzer_ty;
+101    db.mir_intern_type(Type::new(ty_kind, analyzer_ty).into())
+102}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/lib.rs.html b/compiler-docs/src/fe_codegen/lib.rs.html new file mode 100644 index 0000000000..c599377b64 --- /dev/null +++ b/compiler-docs/src/fe_codegen/lib.rs.html @@ -0,0 +1,2 @@ +lib.rs - source

fe_codegen/
lib.rs

1pub mod db;
+2pub mod yul;
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/context.rs.html b/compiler-docs/src/fe_codegen/yul/isel/context.rs.html new file mode 100644 index 0000000000..794413bc91 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/context.rs.html @@ -0,0 +1,81 @@ +context.rs - source

fe_codegen/yul/isel/
context.rs

1use indexmap::IndexSet;
+2
+3use fe_analyzer::namespace::items::ContractId;
+4use fe_mir::ir::FunctionId;
+5use fxhash::FxHashSet;
+6use yultsur::yul;
+7
+8use crate::{
+9    db::CodegenDb,
+10    yul::runtime::{DefaultRuntimeProvider, RuntimeProvider},
+11};
+12
+13use super::{lower_contract_deployable, lower_function};
+14
+15pub struct Context {
+16    pub runtime: Box<dyn RuntimeProvider>,
+17    pub(super) contract_dependency: IndexSet<ContractId>,
+18    pub(super) function_dependency: IndexSet<FunctionId>,
+19    pub(super) string_constants: IndexSet<String>,
+20    pub(super) lowered_functions: FxHashSet<FunctionId>,
+21}
+22
+23// Currently, `clippy::derivable_impls` causes false positive result,
+24// see https://github.com/rust-lang/rust-clippy/issues/10158 for more details.
+25#[allow(clippy::derivable_impls)]
+26impl Default for Context {
+27    fn default() -> Self {
+28        Self {
+29            runtime: Box::<DefaultRuntimeProvider>::default(),
+30            contract_dependency: IndexSet::default(),
+31            function_dependency: IndexSet::default(),
+32            string_constants: IndexSet::default(),
+33            lowered_functions: FxHashSet::default(),
+34        }
+35    }
+36}
+37
+38impl Context {
+39    pub(super) fn resolve_function_dependency(
+40        &mut self,
+41        db: &dyn CodegenDb,
+42    ) -> Vec<yul::FunctionDefinition> {
+43        let mut funcs = vec![];
+44        loop {
+45            let dependencies = std::mem::take(&mut self.function_dependency);
+46            if dependencies.is_empty() {
+47                break;
+48            }
+49            for dependency in dependencies {
+50                if self.lowered_functions.contains(&dependency) {
+51                    // Ignore dependency if it's already lowered.
+52                    continue;
+53                } else {
+54                    funcs.push(lower_function(db, self, dependency))
+55                }
+56            }
+57        }
+58
+59        funcs
+60    }
+61
+62    pub(super) fn resolve_constant_dependency(&self, db: &dyn CodegenDb) -> Vec<yul::Data> {
+63        self.string_constants
+64            .iter()
+65            .map(|s| {
+66                let symbol = db.codegen_constant_string_symbol_name(s.to_string());
+67                yul::Data {
+68                    name: symbol.as_ref().clone(),
+69                    value: s.to_string(),
+70                }
+71            })
+72            .collect()
+73    }
+74
+75    pub(super) fn resolve_contract_dependency(&self, db: &dyn CodegenDb) -> Vec<yul::Object> {
+76        self.contract_dependency
+77            .iter()
+78            .map(|cid| lower_contract_deployable(db, *cid))
+79            .collect()
+80    }
+81}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/contract.rs.html b/compiler-docs/src/fe_codegen/yul/isel/contract.rs.html new file mode 100644 index 0000000000..e10292650a --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/contract.rs.html @@ -0,0 +1,289 @@ +contract.rs - source

fe_codegen/yul/isel/
contract.rs

1use fe_analyzer::namespace::items::ContractId;
+2use fe_mir::ir::{function::Linkage, FunctionId};
+3use yultsur::{yul, *};
+4
+5use crate::{
+6    db::CodegenDb,
+7    yul::{runtime::AbiSrcLocation, YulVariable},
+8};
+9
+10use super::context::Context;
+11
+12pub fn lower_contract_deployable(db: &dyn CodegenDb, contract: ContractId) -> yul::Object {
+13    let mut context = Context::default();
+14
+15    let constructor = if let Some(init) = contract.init_function(db.upcast()) {
+16        let init = db.mir_lowered_func_signature(init);
+17        make_init(db, &mut context, contract, init)
+18    } else {
+19        statements! {}
+20    };
+21
+22    let deploy_code = make_deploy(db, contract);
+23
+24    let dep_functions: Vec<_> = context
+25        .resolve_function_dependency(db)
+26        .into_iter()
+27        .map(yul::Statement::FunctionDefinition)
+28        .collect();
+29    let runtime_funcs: Vec<_> = context
+30        .runtime
+31        .collect_definitions()
+32        .into_iter()
+33        .map(yul::Statement::FunctionDefinition)
+34        .collect();
+35
+36    let deploy_block = block_statement! {
+37        [constructor...]
+38        [deploy_code...]
+39    };
+40
+41    let code = code! {
+42        [deploy_block]
+43        [dep_functions...]
+44        [runtime_funcs...]
+45    };
+46
+47    let mut dep_contracts = context.resolve_contract_dependency(db);
+48    dep_contracts.push(lower_contract(db, contract));
+49    let dep_constants = context.resolve_constant_dependency(db);
+50
+51    let name = identifier! {(
+52        db.codegen_contract_deployer_symbol_name(contract).as_ref()
+53    )};
+54    let object = yul::Object {
+55        name,
+56        code,
+57        objects: dep_contracts,
+58        data: dep_constants,
+59    };
+60
+61    normalize_object(object)
+62}
+63
+64pub fn lower_contract(db: &dyn CodegenDb, contract: ContractId) -> yul::Object {
+65    let exported_funcs: Vec<_> = db
+66        .mir_lower_contract_all_functions(contract)
+67        .iter()
+68        .filter_map(|fid| {
+69            if fid.signature(db.upcast()).linkage == Linkage::Export {
+70                Some(*fid)
+71            } else {
+72                None
+73            }
+74        })
+75        .collect();
+76
+77    let mut context = Context::default();
+78    let dispatcher = if let Some(call_fn) = contract.call_function(db.upcast()) {
+79        let call_fn = db.mir_lowered_func_signature(call_fn);
+80        context.function_dependency.insert(call_fn);
+81        let call_symbol = identifier! { (db.codegen_function_symbol_name(call_fn)) };
+82        statement! {
+83            ([call_symbol]())
+84        }
+85    } else {
+86        make_dispatcher(db, &mut context, &exported_funcs)
+87    };
+88
+89    let dep_functions: Vec<_> = context
+90        .resolve_function_dependency(db)
+91        .into_iter()
+92        .map(yul::Statement::FunctionDefinition)
+93        .collect();
+94    let runtime_funcs: Vec<_> = context
+95        .runtime
+96        .collect_definitions()
+97        .into_iter()
+98        .map(yul::Statement::FunctionDefinition)
+99        .collect();
+100
+101    let code = code! {
+102        ([dispatcher])
+103        [dep_functions...]
+104        [runtime_funcs...]
+105    };
+106
+107    // Lower dependant contracts.
+108    let dep_contracts = context.resolve_contract_dependency(db);
+109
+110    // Collect string constants.
+111    let dep_constants = context.resolve_constant_dependency(db);
+112    let contract_symbol = identifier! { (db.codegen_contract_symbol_name(contract)) };
+113
+114    yul::Object {
+115        name: contract_symbol,
+116        code,
+117        objects: dep_contracts,
+118        data: dep_constants,
+119    }
+120}
+121
+122fn make_dispatcher(
+123    db: &dyn CodegenDb,
+124    context: &mut Context,
+125    funcs: &[FunctionId],
+126) -> yul::Statement {
+127    let arms = funcs
+128        .iter()
+129        .map(|func| dispatch_arm(db, context, *func))
+130        .collect::<Vec<_>>();
+131
+132    if arms.is_empty() {
+133        statement! { return(0, 0) }
+134    } else {
+135        let selector = expression! {
+136            and((shr((sub(256, 32)), (calldataload(0)))), 0xffffffff)
+137        };
+138        switch! {
+139            switch ([selector])
+140            [arms...]
+141            (default { (return(0, 0)) })
+142        }
+143    }
+144}
+145
+146fn dispatch_arm(db: &dyn CodegenDb, context: &mut Context, func: FunctionId) -> yul::Case {
+147    context.function_dependency.insert(func);
+148    let func_sig = db.codegen_legalized_signature(func);
+149    let mut param_vars = Vec::with_capacity(func_sig.params.len());
+150    let mut param_tys = Vec::with_capacity(func_sig.params.len());
+151    func_sig.params.iter().for_each(|param| {
+152        param_vars.push(YulVariable::new(param.name.as_str()));
+153        param_tys.push(param.ty);
+154    });
+155
+156    let decode_params = if func_sig.params.is_empty() {
+157        statements! {}
+158    } else {
+159        let ident_params: Vec<_> = param_vars.iter().map(YulVariable::ident).collect();
+160        let param_size = YulVariable::new("param_size");
+161        statements! {
+162            (let [param_size.ident()] := sub((calldatasize()), 4))
+163            (let [ident_params...] := [context.runtime.abi_decode(db, expression! { 4 }, param_size.expr(), &param_tys, AbiSrcLocation::CallData)])
+164        }
+165    };
+166
+167    let call_and_encode_return = {
+168        let name = identifier! { (db.codegen_function_symbol_name(func)) };
+169        // we pass in a `0` for the expected `Context` argument
+170        let call = expression! {[name]([(param_vars.iter().map(YulVariable::expr).collect::<Vec<_>>())...])};
+171        if let Some(mut return_type) = func_sig.return_type {
+172            if return_type.is_aggregate(db.upcast()) {
+173                return_type = return_type.make_mptr(db.upcast());
+174            }
+175
+176            let ret = YulVariable::new("ret");
+177            let enc_start = YulVariable::new("enc_start");
+178            let enc_size = YulVariable::new("enc_size");
+179            let abi_encode = context.runtime.abi_encode_seq(
+180                db,
+181                &[ret.expr()],
+182                enc_start.expr(),
+183                &[return_type],
+184                false,
+185            );
+186            statements! {
+187                (let [ret.ident()] := [call])
+188                (let [enc_start.ident()] := [context.runtime.avail(db)])
+189                (let [enc_size.ident()] := [abi_encode])
+190                (return([enc_start.expr()], [enc_size.expr()]))
+191            }
+192        } else {
+193            statements! {
+194                ([yul::Statement::Expression(call)])
+195                (return(0, 0))
+196            }
+197        }
+198    };
+199
+200    let abi_sig = db.codegen_abi_function(func);
+201    let selector = literal! { (format!("0x{}", abi_sig.selector().hex())) };
+202    case! {
+203        case [selector] {
+204            [decode_params...]
+205            [call_and_encode_return...]
+206        }
+207    }
+208}
+209
+210fn make_init(
+211    db: &dyn CodegenDb,
+212    context: &mut Context,
+213    contract: ContractId,
+214    init: FunctionId,
+215) -> Vec<yul::Statement> {
+216    context.function_dependency.insert(init);
+217    let init_func_name = identifier! { (db.codegen_function_symbol_name(init)) };
+218    let contract_name = identifier_expression! { (format!{r#""{}""#, db.codegen_contract_deployer_symbol_name(contract)}) };
+219
+220    let func_sig = db.codegen_legalized_signature(init);
+221    let mut param_vars = Vec::with_capacity(func_sig.params.len());
+222    let mut param_tys = Vec::with_capacity(func_sig.params.len());
+223    let program_size = YulVariable::new("$program_size");
+224    let arg_size = YulVariable::new("$arg_size");
+225    let code_size = YulVariable::new("$code_size");
+226    let memory_data_offset = YulVariable::new("$memory_data_offset");
+227    func_sig.params.iter().for_each(|param| {
+228        param_vars.push(YulVariable::new(param.name.as_str()));
+229        param_tys.push(param.ty);
+230    });
+231
+232    let decode_params = if func_sig.params.is_empty() {
+233        statements! {}
+234    } else {
+235        let ident_params: Vec<_> = param_vars.iter().map(YulVariable::ident).collect();
+236        statements! {
+237            (let [ident_params...] := [context.runtime.abi_decode(db, memory_data_offset.expr(), arg_size.expr(), &param_tys, AbiSrcLocation::Memory)])
+238        }
+239    };
+240
+241    let call = expression! {[init_func_name]([(param_vars.iter().map(YulVariable::expr).collect::<Vec<_>>())...])};
+242    statements! {
+243        (let [program_size.ident()] := datasize([contract_name]))
+244        (let [code_size.ident()] := codesize())
+245        (let [arg_size.ident()] := sub([code_size.expr()], [program_size.expr()]))
+246        (let [memory_data_offset.ident()] := [context.runtime.alloc(db, arg_size.expr())])
+247        (codecopy([memory_data_offset.expr()], [program_size.expr()], [arg_size.expr()]))
+248        [decode_params...]
+249        ([yul::Statement::Expression(call)])
+250    }
+251}
+252
+253fn make_deploy(db: &dyn CodegenDb, contract: ContractId) -> Vec<yul::Statement> {
+254    let contract_symbol =
+255        identifier_expression! { (format!{r#""{}""#, db.codegen_contract_symbol_name(contract)}) };
+256    let size = YulVariable::new("$$size");
+257    statements! {
+258       (let [size.ident()] := (datasize([contract_symbol.clone()])))
+259       (datacopy(0, (dataoffset([contract_symbol])), [size.expr()]))
+260       (return (0, [size.expr()]))
+261    }
+262}
+263
+264fn normalize_object(obj: yul::Object) -> yul::Object {
+265    let data = obj
+266        .data
+267        .into_iter()
+268        .map(|data| yul::Data {
+269            name: data.name,
+270            value: data
+271                .value
+272                .replace('\\', "\\\\\\\\")
+273                .replace('\n', "\\\\n")
+274                .replace('"', "\\\\\"")
+275                .replace('\r', "\\\\r")
+276                .replace('\t', "\\\\t"),
+277        })
+278        .collect::<Vec<_>>();
+279    yul::Object {
+280        name: obj.name,
+281        code: obj.code,
+282        objects: obj
+283            .objects
+284            .into_iter()
+285            .map(normalize_object)
+286            .collect::<Vec<_>>(),
+287        data,
+288    }
+289}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/function.rs.html b/compiler-docs/src/fe_codegen/yul/isel/function.rs.html new file mode 100644 index 0000000000..c6ca45427f --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/function.rs.html @@ -0,0 +1,978 @@ +function.rs - source

fe_codegen/yul/isel/
function.rs

1#![allow(unused)]
+2use std::thread::Scope;
+3
+4use super::{context::Context, inst_order::InstSerializer};
+5use fe_common::numeric::to_hex_str;
+6
+7use fe_abi::function::{AbiFunction, AbiFunctionType};
+8use fe_common::db::Upcast;
+9use fe_mir::{
+10    ir::{
+11        self,
+12        constant::ConstantValue,
+13        inst::{BinOp, CallType, CastKind, InstKind, UnOp},
+14        value::AssignableValue,
+15        Constant, FunctionBody, FunctionId, FunctionSignature, InstId, Type, TypeId, TypeKind,
+16        Value, ValueId,
+17    },
+18    pretty_print::PrettyPrint,
+19};
+20use fxhash::FxHashMap;
+21use smol_str::SmolStr;
+22use yultsur::{
+23    yul::{self, Statement},
+24    *,
+25};
+26
+27use crate::{
+28    db::CodegenDb,
+29    yul::isel::inst_order::StructuralInst,
+30    yul::slot_size::{function_hash_type, yul_primitive_type, SLOT_SIZE},
+31    yul::{
+32        runtime::{self, RuntimeProvider},
+33        YulVariable,
+34    },
+35};
+36
+37pub fn lower_function(
+38    db: &dyn CodegenDb,
+39    ctx: &mut Context,
+40    function: FunctionId,
+41) -> yul::FunctionDefinition {
+42    debug_assert!(!ctx.lowered_functions.contains(&function));
+43    ctx.lowered_functions.insert(function);
+44    let sig = &db.codegen_legalized_signature(function);
+45    let body = &db.codegen_legalized_body(function);
+46    FuncLowerHelper::new(db, ctx, function, sig, body).lower_func()
+47}
+48
+49struct FuncLowerHelper<'db, 'a> {
+50    db: &'db dyn CodegenDb,
+51    ctx: &'a mut Context,
+52    value_map: ScopedValueMap,
+53    func: FunctionId,
+54    sig: &'a FunctionSignature,
+55    body: &'a FunctionBody,
+56    ret_value: Option<yul::Identifier>,
+57    sink: Vec<yul::Statement>,
+58}
+59
+60impl<'db, 'a> FuncLowerHelper<'db, 'a> {
+61    fn new(
+62        db: &'db dyn CodegenDb,
+63        ctx: &'a mut Context,
+64        func: FunctionId,
+65        sig: &'a FunctionSignature,
+66        body: &'a FunctionBody,
+67    ) -> Self {
+68        let mut value_map = ScopedValueMap::default();
+69        // Register arguments to value_map.
+70        for &value in body.store.locals() {
+71            match body.store.value_data(value) {
+72                Value::Local(local) if local.is_arg => {
+73                    let ident = YulVariable::new(local.name.as_str()).ident();
+74                    value_map.insert(value, ident);
+75                }
+76                _ => {}
+77            }
+78        }
+79
+80        let ret_value = if sig.return_type.is_some() {
+81            Some(YulVariable::new("$ret").ident())
+82        } else {
+83            None
+84        };
+85
+86        Self {
+87            db,
+88            ctx,
+89            value_map,
+90            func,
+91            sig,
+92            body,
+93            ret_value,
+94            sink: Vec::new(),
+95        }
+96    }
+97
+98    fn lower_func(mut self) -> yul::FunctionDefinition {
+99        let name = identifier! { (self.db.codegen_function_symbol_name(self.func)) };
+100
+101        let parameters = self
+102            .sig
+103            .params
+104            .iter()
+105            .map(|param| YulVariable::new(param.name.as_str()).ident())
+106            .collect();
+107
+108        let ret = self
+109            .ret_value
+110            .clone()
+111            .map(|value| vec![value])
+112            .unwrap_or_default();
+113
+114        let body = self.lower_body();
+115
+116        yul::FunctionDefinition {
+117            name,
+118            parameters,
+119            returns: ret,
+120            block: body,
+121        }
+122    }
+123
+124    fn lower_body(mut self) -> yul::Block {
+125        let inst_order = InstSerializer::new(self.body).serialize();
+126
+127        for inst in inst_order {
+128            self.lower_structural_inst(inst)
+129        }
+130
+131        yul::Block {
+132            statements: self.sink,
+133        }
+134    }
+135
+136    fn lower_structural_inst(&mut self, inst: StructuralInst) {
+137        match inst {
+138            StructuralInst::Inst(inst) => self.lower_inst(inst),
+139            StructuralInst::If { cond, then, else_ } => {
+140                let if_block = self.lower_if(cond, then, else_);
+141                self.sink.push(if_block)
+142            }
+143            StructuralInst::Switch {
+144                scrutinee,
+145                table,
+146                default,
+147            } => {
+148                let switch_block = self.lower_switch(scrutinee, table, default);
+149                self.sink.push(switch_block)
+150            }
+151            StructuralInst::For { body } => {
+152                let for_block = self.lower_for(body);
+153                self.sink.push(for_block)
+154            }
+155            StructuralInst::Break => self.sink.push(yul::Statement::Break),
+156            StructuralInst::Continue => self.sink.push(yul::Statement::Continue),
+157        };
+158    }
+159
+160    fn lower_inst(&mut self, inst: InstId) {
+161        if let Some(lhs) = self.body.store.inst_result(inst) {
+162            self.declare_assignable_value(lhs)
+163        }
+164
+165        match &self.body.store.inst_data(inst).kind {
+166            InstKind::Declare { local } => self.declare_value(*local),
+167
+168            InstKind::Unary { op, value } => {
+169                let inst_result = self.body.store.inst_result(inst).unwrap();
+170                let inst_result_ty = inst_result.ty(self.db.upcast(), &self.body.store);
+171                let result = self.lower_unary(*op, *value);
+172                self.assign_inst_result(inst, result, inst_result_ty.deref(self.db.upcast()))
+173            }
+174
+175            InstKind::Binary { op, lhs, rhs } => {
+176                let inst_result = self.body.store.inst_result(inst).unwrap();
+177                let inst_result_ty = inst_result.ty(self.db.upcast(), &self.body.store);
+178                let result = self.lower_binary(*op, *lhs, *rhs, inst);
+179                self.assign_inst_result(inst, result, inst_result_ty.deref(self.db.upcast()))
+180            }
+181
+182            InstKind::Cast { kind, value, to } => {
+183                let from_ty = self.body.store.value_ty(*value);
+184                let result = match kind {
+185                    CastKind::Primitive => {
+186                        debug_assert!(
+187                            from_ty.is_primitive(self.db.upcast())
+188                                && to.is_primitive(self.db.upcast())
+189                        );
+190                        let value = self.value_expr(*value);
+191                        self.ctx.runtime.primitive_cast(self.db, value, from_ty)
+192                    }
+193                    CastKind::Untag => {
+194                        let from_ty = from_ty.deref(self.db.upcast());
+195                        debug_assert!(from_ty.is_enum(self.db.upcast()));
+196                        let value = self.value_expr(*value);
+197                        let offset = literal_expression! {(from_ty.enum_data_offset(self.db.upcast(), SLOT_SIZE))};
+198                        expression! {add([value], [offset])}
+199                    }
+200                };
+201
+202                self.assign_inst_result(inst, result, *to)
+203            }
+204
+205            InstKind::AggregateConstruct { ty, args } => {
+206                let lhs = self.body.store.inst_result(inst).unwrap();
+207                let ptr = self.lower_assignable_value(lhs);
+208                let ptr_ty = lhs.ty(self.db.upcast(), &self.body.store);
+209                let arg_values = args.iter().map(|arg| self.value_expr(*arg)).collect();
+210                let arg_tys = args
+211                    .iter()
+212                    .map(|arg| self.body.store.value_ty(*arg))
+213                    .collect();
+214                self.sink.push(yul::Statement::Expression(
+215                    self.ctx
+216                        .runtime
+217                        .aggregate_init(self.db, ptr, arg_values, ptr_ty, arg_tys),
+218                ))
+219            }
+220
+221            InstKind::Bind { src } => {
+222                match self.body.store.value_data(*src) {
+223                    Value::Constant { constant, .. } => {
+224                        // Need special handling when rhs is the string literal because it needs ptr
+225                        // copy.
+226                        if let ConstantValue::Str(s) = &constant.data(self.db.upcast()).value {
+227                            self.ctx.string_constants.insert(s.to_string());
+228                            let size = self.value_ty_size_deref(*src);
+229                            let lhs = self.body.store.inst_result(inst).unwrap();
+230                            let ptr = self.lower_assignable_value(lhs);
+231                            let inst_result_ty = lhs.ty(self.db.upcast(), &self.body.store);
+232                            self.sink.push(yul::Statement::Expression(
+233                                self.ctx.runtime.string_copy(
+234                                    self.db,
+235                                    ptr,
+236                                    s,
+237                                    inst_result_ty.is_sptr(self.db.upcast()),
+238                                ),
+239                            ))
+240                        } else {
+241                            let src_ty = self.body.store.value_ty(*src);
+242                            let src = self.value_expr(*src);
+243                            self.assign_inst_result(inst, src, src_ty)
+244                        }
+245                    }
+246                    _ => {
+247                        let src_ty = self.body.store.value_ty(*src);
+248                        let src = self.value_expr(*src);
+249                        self.assign_inst_result(inst, src, src_ty)
+250                    }
+251                }
+252            }
+253
+254            InstKind::MemCopy { src } => {
+255                let lhs = self.body.store.inst_result(inst).unwrap();
+256                let dst_ptr = self.lower_assignable_value(lhs);
+257                let dst_ptr_ty = lhs.ty(self.db.upcast(), &self.body.store);
+258                let src_ptr = self.value_expr(*src);
+259                let src_ptr_ty = self.body.store.value_ty(*src);
+260                let ty_size = literal_expression! { (self.value_ty_size_deref(*src)) };
+261                self.sink
+262                    .push(yul::Statement::Expression(self.ctx.runtime.ptr_copy(
+263                        self.db,
+264                        src_ptr,
+265                        dst_ptr,
+266                        ty_size,
+267                        src_ptr_ty.is_sptr(self.db.upcast()),
+268                        dst_ptr_ty.is_sptr(self.db.upcast()),
+269                    )))
+270            }
+271
+272            InstKind::Load { src } => {
+273                let src_ty = self.body.store.value_ty(*src);
+274                let src = self.value_expr(*src);
+275                debug_assert!(src_ty.is_ptr(self.db.upcast()));
+276
+277                let result = self.body.store.inst_result(inst).unwrap();
+278                debug_assert!(!result
+279                    .ty(self.db.upcast(), &self.body.store)
+280                    .is_ptr(self.db.upcast()));
+281                self.assign_inst_result(inst, src, src_ty)
+282            }
+283
+284            InstKind::AggregateAccess { value, indices } => {
+285                let base = self.value_expr(*value);
+286                let mut ptr = base;
+287                let mut inner_ty = self.body.store.value_ty(*value);
+288                for &idx in indices {
+289                    ptr = self.aggregate_elem_ptr(ptr, idx, inner_ty.deref(self.db.upcast()));
+290                    inner_ty =
+291                        inner_ty.projection_ty(self.db.upcast(), self.body.store.value_data(idx));
+292                }
+293
+294                let result = self.body.store.inst_result(inst).unwrap();
+295                self.assign_inst_result(inst, ptr, inner_ty)
+296            }
+297
+298            InstKind::MapAccess { value, key } => {
+299                let map_ty = self.body.store.value_ty(*value).deref(self.db.upcast());
+300                let value_expr = self.value_expr(*value);
+301                let key_expr = self.value_expr(*key);
+302                let key_ty = self.body.store.value_ty(*key);
+303                let ptr = self
+304                    .ctx
+305                    .runtime
+306                    .map_value_ptr(self.db, value_expr, key_expr, key_ty);
+307                let value_ty = match &map_ty.data(self.db.upcast()).kind {
+308                    TypeKind::Map(def) => def.value_ty,
+309                    _ => unreachable!(),
+310                };
+311
+312                self.assign_inst_result(inst, ptr, value_ty.make_sptr(self.db.upcast()));
+313            }
+314
+315            InstKind::Call {
+316                func,
+317                args,
+318                call_type,
+319            } => {
+320                let args: Vec<_> = args.iter().map(|arg| self.value_expr(*arg)).collect();
+321                let result = match call_type {
+322                    CallType::Internal => {
+323                        self.ctx.function_dependency.insert(*func);
+324                        let func_name = identifier! {(self.db.codegen_function_symbol_name(*func))};
+325                        expression! {[func_name]([args...])}
+326                    }
+327                    CallType::External => self.ctx.runtime.external_call(self.db, *func, args),
+328                };
+329                match self.db.codegen_legalized_signature(*func).return_type {
+330                    Some(mut result_ty) => {
+331                        if result_ty.is_aggregate(self.db.upcast())
+332                            | result_ty.is_string(self.db.upcast())
+333                        {
+334                            result_ty = result_ty.make_mptr(self.db.upcast());
+335                        }
+336                        self.assign_inst_result(inst, result, result_ty)
+337                    }
+338                    _ => self.sink.push(Statement::Expression(result)),
+339                }
+340            }
+341
+342            InstKind::Revert { arg } => match arg {
+343                Some(arg) => {
+344                    let arg_ty = self.body.store.value_ty(*arg);
+345                    let deref_ty = arg_ty.deref(self.db.upcast());
+346                    let ty_data = deref_ty.data(self.db.upcast());
+347                    let arg_expr = if deref_ty.is_zero_sized(self.db.upcast()) {
+348                        None
+349                    } else {
+350                        Some(self.value_expr(*arg))
+351                    };
+352                    let name = match &ty_data.kind {
+353                        ir::TypeKind::Struct(def) => &def.name,
+354                        ir::TypeKind::String(def) => "Error",
+355                        _ => "Panic",
+356                    };
+357                    self.sink.push(yul::Statement::Expression(
+358                        self.ctx.runtime.revert(self.db, arg_expr, name, arg_ty),
+359                    ));
+360                }
+361                None => self.sink.push(statement! {revert(0, 0)}),
+362            },
+363
+364            InstKind::Emit { arg } => {
+365                let event = self.value_expr(*arg);
+366                let event_ty = self.body.store.value_ty(*arg);
+367                let result = self.ctx.runtime.emit(self.db, event, event_ty);
+368                let u256_ty = yul_primitive_type(self.db);
+369                self.assign_inst_result(inst, result, u256_ty);
+370            }
+371
+372            InstKind::Return { arg } => {
+373                if let Some(arg) = arg {
+374                    let arg = self.value_expr(*arg);
+375                    let ret_value = self.ret_value.clone().unwrap();
+376                    self.sink.push(statement! {[ret_value] := [arg]});
+377                }
+378                self.sink.push(yul::Statement::Leave)
+379            }
+380
+381            InstKind::Keccak256 { arg } => {
+382                let result = self.keccak256(*arg);
+383                let u256_ty = yul_primitive_type(self.db);
+384                self.assign_inst_result(inst, result, u256_ty);
+385            }
+386
+387            InstKind::AbiEncode { arg } => {
+388                let lhs = self.body.store.inst_result(inst).unwrap();
+389                let ptr = self.lower_assignable_value(lhs);
+390                let ptr_ty = lhs.ty(self.db.upcast(), &self.body.store);
+391                let src_expr = self.value_expr(*arg);
+392                let src_ty = self.body.store.value_ty(*arg);
+393
+394                let abi_encode = self.ctx.runtime.abi_encode(
+395                    self.db,
+396                    src_expr,
+397                    ptr,
+398                    src_ty,
+399                    ptr_ty.is_sptr(self.db.upcast()),
+400                );
+401                self.sink.push(statement! {
+402                    pop([abi_encode])
+403                });
+404            }
+405
+406            InstKind::Create { value, contract } => {
+407                self.ctx.contract_dependency.insert(*contract);
+408
+409                let value_expr = self.value_expr(*value);
+410                let result = self.ctx.runtime.create(self.db, *contract, value_expr);
+411                let u256_ty = yul_primitive_type(self.db);
+412                self.assign_inst_result(inst, result, u256_ty)
+413            }
+414
+415            InstKind::Create2 {
+416                value,
+417                salt,
+418                contract,
+419            } => {
+420                self.ctx.contract_dependency.insert(*contract);
+421
+422                let value_expr = self.value_expr(*value);
+423                let salt_expr = self.value_expr(*salt);
+424                let result = self
+425                    .ctx
+426                    .runtime
+427                    .create2(self.db, *contract, value_expr, salt_expr);
+428                let u256_ty = yul_primitive_type(self.db);
+429                self.assign_inst_result(inst, result, u256_ty)
+430            }
+431
+432            InstKind::YulIntrinsic { op, args } => {
+433                let args: Vec<_> = args.iter().map(|arg| self.value_expr(*arg)).collect();
+434                let op_name = identifier! { (format!("{op}").strip_prefix("__").unwrap()) };
+435                let result = expression! { [op_name]([args...]) };
+436                // Intrinsic operation never returns ptr type, so we can use u256_ty as a dummy
+437                // type for the result.
+438                let u256_ty = yul_primitive_type(self.db);
+439                self.assign_inst_result(inst, result, u256_ty)
+440            }
+441
+442            InstKind::Nop => {}
+443
+444            // These flow control instructions are already legalized.
+445            InstKind::Jump { .. } | InstKind::Branch { .. } | InstKind::Switch { .. } => {
+446                unreachable!()
+447            }
+448        }
+449    }
+450
+451    fn lower_if(
+452        &mut self,
+453        cond: ValueId,
+454        then: Vec<StructuralInst>,
+455        else_: Vec<StructuralInst>,
+456    ) -> yul::Statement {
+457        let cond = self.value_expr(cond);
+458
+459        self.enter_scope();
+460        let then_body = self.lower_branch_body(then);
+461        self.leave_scope();
+462
+463        self.enter_scope();
+464        let else_body = self.lower_branch_body(else_);
+465        self.leave_scope();
+466
+467        switch! {
+468            switch ([cond])
+469            (case 1 {[then_body...]})
+470            (case 0 {[else_body...]})
+471        }
+472    }
+473
+474    fn lower_switch(
+475        &mut self,
+476        scrutinee: ValueId,
+477        table: Vec<(ValueId, Vec<StructuralInst>)>,
+478        default: Option<Vec<StructuralInst>>,
+479    ) -> yul::Statement {
+480        let scrutinee = self.value_expr(scrutinee);
+481
+482        let mut cases = vec![];
+483        for (value, insts) in table {
+484            let value = self.value_expr(value);
+485            let value = match value {
+486                yul::Expression::Literal(lit) => lit,
+487                _ => panic!("switch table values must be literal"),
+488            };
+489
+490            self.enter_scope();
+491            let body = self.lower_branch_body(insts);
+492            self.leave_scope();
+493            cases.push(yul::Case {
+494                literal: Some(value),
+495                block: block! { [body...] },
+496            })
+497        }
+498
+499        if let Some(insts) = default {
+500            let block = self.lower_branch_body(insts);
+501            cases.push(case! {
+502                default {[block...]}
+503            });
+504        }
+505
+506        switch! {
+507            switch ([scrutinee])
+508            [cases...]
+509        }
+510    }
+511
+512    fn lower_branch_body(&mut self, insts: Vec<StructuralInst>) -> Vec<yul::Statement> {
+513        let mut body = vec![];
+514        std::mem::swap(&mut self.sink, &mut body);
+515        for inst in insts {
+516            self.lower_structural_inst(inst);
+517        }
+518        std::mem::swap(&mut self.sink, &mut body);
+519        body
+520    }
+521
+522    fn lower_for(&mut self, body: Vec<StructuralInst>) -> yul::Statement {
+523        let mut body_stmts = vec![];
+524        std::mem::swap(&mut self.sink, &mut body_stmts);
+525        for inst in body {
+526            self.lower_structural_inst(inst);
+527        }
+528        std::mem::swap(&mut self.sink, &mut body_stmts);
+529
+530        block_statement! {(
+531            for {} (1) {}
+532            {
+533                [body_stmts...]
+534            }
+535        )}
+536    }
+537
+538    fn lower_assign(&mut self, lhs: &AssignableValue, rhs: ValueId) -> yul::Statement {
+539        match lhs {
+540            AssignableValue::Value(value) => {
+541                let lhs = self.value_ident(*value);
+542                let rhs = self.value_expr(rhs);
+543                statement! { [lhs] := [rhs] }
+544            }
+545            AssignableValue::Aggregate { .. } | AssignableValue::Map { .. } => {
+546                let dst_ty = lhs.ty(self.db.upcast(), &self.body.store);
+547                let src_ty = self.body.store.value_ty(rhs);
+548                debug_assert_eq!(
+549                    dst_ty.deref(self.db.upcast()),
+550                    src_ty.deref(self.db.upcast())
+551                );
+552
+553                let dst = self.lower_assignable_value(lhs);
+554                let src = self.value_expr(rhs);
+555
+556                if src_ty.is_ptr(self.db.upcast()) {
+557                    let ty_size = literal_expression! { (self.value_ty_size_deref(rhs)) };
+558
+559                    let expr = self.ctx.runtime.ptr_copy(
+560                        self.db,
+561                        src,
+562                        dst,
+563                        ty_size,
+564                        src_ty.is_sptr(self.db.upcast()),
+565                        dst_ty.is_sptr(self.db.upcast()),
+566                    );
+567                    yul::Statement::Expression(expr)
+568                } else {
+569                    let expr = self.ctx.runtime.ptr_store(self.db, dst, src, dst_ty);
+570                    yul::Statement::Expression(expr)
+571                }
+572            }
+573        }
+574    }
+575
+576    fn lower_unary(&mut self, op: UnOp, value: ValueId) -> yul::Expression {
+577        let value_expr = self.value_expr(value);
+578        match op {
+579            UnOp::Not => expression! { iszero([value_expr])},
+580            UnOp::Neg => {
+581                let zero = literal_expression! {0};
+582                if self.body.store.value_data(value).is_imm() {
+583                    // Literals are checked at compile time (e.g. -128) so there's no point
+584                    // in adding a runtime check.
+585                    expression! {sub([zero], [value_expr])}
+586                } else {
+587                    let value_ty = self.body.store.value_ty(value);
+588                    self.ctx
+589                        .runtime
+590                        .safe_sub(self.db, zero, value_expr, value_ty)
+591                }
+592            }
+593            UnOp::Inv => expression! { not([value_expr])},
+594        }
+595    }
+596
+597    fn lower_binary(
+598        &mut self,
+599        op: BinOp,
+600        lhs: ValueId,
+601        rhs: ValueId,
+602        inst: InstId,
+603    ) -> yul::Expression {
+604        let lhs_expr = self.value_expr(lhs);
+605        let rhs_expr = self.value_expr(rhs);
+606        let is_result_signed = self
+607            .body
+608            .store
+609            .inst_result(inst)
+610            .map(|val| {
+611                let ty = val.ty(self.db.upcast(), &self.body.store);
+612                ty.is_signed(self.db.upcast())
+613            })
+614            .unwrap_or(false);
+615        let is_lhs_signed = self.body.store.value_ty(lhs).is_signed(self.db.upcast());
+616
+617        let inst_result = self.body.store.inst_result(inst).unwrap();
+618        let inst_result_ty = inst_result
+619            .ty(self.db.upcast(), &self.body.store)
+620            .deref(self.db.upcast());
+621        match op {
+622            BinOp::Add => self
+623                .ctx
+624                .runtime
+625                .safe_add(self.db, lhs_expr, rhs_expr, inst_result_ty),
+626            BinOp::Sub => self
+627                .ctx
+628                .runtime
+629                .safe_sub(self.db, lhs_expr, rhs_expr, inst_result_ty),
+630            BinOp::Mul => self
+631                .ctx
+632                .runtime
+633                .safe_mul(self.db, lhs_expr, rhs_expr, inst_result_ty),
+634            BinOp::Div => self
+635                .ctx
+636                .runtime
+637                .safe_div(self.db, lhs_expr, rhs_expr, inst_result_ty),
+638            BinOp::Mod => self
+639                .ctx
+640                .runtime
+641                .safe_mod(self.db, lhs_expr, rhs_expr, inst_result_ty),
+642            BinOp::Pow => self
+643                .ctx
+644                .runtime
+645                .safe_pow(self.db, lhs_expr, rhs_expr, inst_result_ty),
+646            BinOp::Shl => expression! {shl([rhs_expr], [lhs_expr])},
+647            BinOp::Shr if is_result_signed => expression! {sar([rhs_expr], [lhs_expr])},
+648            BinOp::Shr => expression! {shr([rhs_expr], [lhs_expr])},
+649            BinOp::BitOr | BinOp::LogicalOr => expression! {or([lhs_expr], [rhs_expr])},
+650            BinOp::BitXor => expression! {xor([lhs_expr], [rhs_expr])},
+651            BinOp::BitAnd | BinOp::LogicalAnd => expression! {and([lhs_expr], [rhs_expr])},
+652            BinOp::Eq => expression! {eq([lhs_expr], [rhs_expr])},
+653            BinOp::Ne => expression! {iszero((eq([lhs_expr], [rhs_expr])))},
+654            BinOp::Ge if is_lhs_signed => expression! {iszero((slt([lhs_expr], [rhs_expr])))},
+655            BinOp::Ge => expression! {iszero((lt([lhs_expr], [rhs_expr])))},
+656            BinOp::Gt if is_lhs_signed => expression! {sgt([lhs_expr], [rhs_expr])},
+657            BinOp::Gt => expression! {gt([lhs_expr], [rhs_expr])},
+658            BinOp::Le if is_lhs_signed => expression! {iszero((sgt([lhs_expr], [rhs_expr])))},
+659            BinOp::Le => expression! {iszero((gt([lhs_expr], [rhs_expr])))},
+660            BinOp::Lt if is_lhs_signed => expression! {slt([lhs_expr], [rhs_expr])},
+661            BinOp::Lt => expression! {lt([lhs_expr], [rhs_expr])},
+662        }
+663    }
+664
+665    fn lower_cast(&mut self, value: ValueId, to: TypeId) -> yul::Expression {
+666        let from_ty = self.body.store.value_ty(value);
+667        debug_assert!(from_ty.is_primitive(self.db.upcast()));
+668        debug_assert!(to.is_primitive(self.db.upcast()));
+669
+670        let value = self.value_expr(value);
+671        self.ctx.runtime.primitive_cast(self.db, value, from_ty)
+672    }
+673
+674    fn assign_inst_result(&mut self, inst: InstId, rhs: yul::Expression, rhs_ty: TypeId) {
+675        // NOTE: We don't have `deref` feature yet, so need a heuristics for an
+676        // assignment.
+677        let stmt = if let Some(result) = self.body.store.inst_result(inst) {
+678            let lhs = self.lower_assignable_value(result);
+679            let lhs_ty = result.ty(self.db.upcast(), &self.body.store);
+680            match result {
+681                AssignableValue::Value(value) => {
+682                    match (
+683                        lhs_ty.is_ptr(self.db.upcast()),
+684                        rhs_ty.is_ptr(self.db.upcast()),
+685                    ) {
+686                        (true, true) => {
+687                            if lhs_ty.is_mptr(self.db.upcast()) == rhs_ty.is_mptr(self.db.upcast())
+688                            {
+689                                let rhs = self.extend_value(rhs, lhs_ty);
+690                                let lhs_ident = self.value_ident(*value);
+691                                statement! { [lhs_ident] := [rhs] }
+692                            } else {
+693                                let ty_size = rhs_ty
+694                                    .deref(self.db.upcast())
+695                                    .size_of(self.db.upcast(), SLOT_SIZE);
+696                                yul::Statement::Expression(self.ctx.runtime.ptr_copy(
+697                                    self.db,
+698                                    rhs,
+699                                    lhs,
+700                                    literal_expression! { (ty_size) },
+701                                    rhs_ty.is_sptr(self.db.upcast()),
+702                                    lhs_ty.is_sptr(self.db.upcast()),
+703                                ))
+704                            }
+705                        }
+706                        (true, false) => yul::Statement::Expression(
+707                            self.ctx.runtime.ptr_store(self.db, lhs, rhs, lhs_ty),
+708                        ),
+709
+710                        (false, true) => {
+711                            let rhs = self.ctx.runtime.ptr_load(self.db, rhs, rhs_ty);
+712                            let rhs = self.extend_value(rhs, lhs_ty);
+713                            let lhs_ident = self.value_ident(*value);
+714                            statement! { [lhs_ident] := [rhs] }
+715                        }
+716                        (false, false) => {
+717                            let rhs = self.extend_value(rhs, lhs_ty);
+718                            let lhs_ident = self.value_ident(*value);
+719                            statement! { [lhs_ident] := [rhs] }
+720                        }
+721                    }
+722                }
+723                AssignableValue::Aggregate { .. } | AssignableValue::Map { .. } => {
+724                    let expr = if rhs_ty.is_ptr(self.db.upcast()) {
+725                        let ty_size = rhs_ty
+726                            .deref(self.db.upcast())
+727                            .size_of(self.db.upcast(), SLOT_SIZE);
+728                        self.ctx.runtime.ptr_copy(
+729                            self.db,
+730                            rhs,
+731                            lhs,
+732                            literal_expression! { (ty_size) },
+733                            rhs_ty.is_sptr(self.db.upcast()),
+734                            lhs_ty.is_sptr(self.db.upcast()),
+735                        )
+736                    } else {
+737                        self.ctx.runtime.ptr_store(self.db, lhs, rhs, lhs_ty)
+738                    };
+739                    yul::Statement::Expression(expr)
+740                }
+741            }
+742        } else {
+743            yul::Statement::Expression(rhs)
+744        };
+745
+746        self.sink.push(stmt);
+747    }
+748
+749    /// Extend a value to 256 bits.
+750    fn extend_value(&mut self, value: yul::Expression, ty: TypeId) -> yul::Expression {
+751        if ty.is_primitive(self.db.upcast()) {
+752            self.ctx.runtime.primitive_cast(self.db, value, ty)
+753        } else {
+754            value
+755        }
+756    }
+757
+758    fn declare_assignable_value(&mut self, value: &AssignableValue) {
+759        match value {
+760            AssignableValue::Value(value) if !self.value_map.contains(*value) => {
+761                self.declare_value(*value);
+762            }
+763            _ => {}
+764        }
+765    }
+766
+767    fn declare_value(&mut self, value: ValueId) {
+768        let var = YulVariable::new(format!("$tmp_{}", value.index()));
+769        self.value_map.insert(value, var.ident());
+770        let value_ty = self.body.store.value_ty(value);
+771
+772        // Allocate memory for a value if a value is a pointer type.
+773        let init = if value_ty.is_mptr(self.db.upcast()) {
+774            let deref_ty = value_ty.deref(self.db.upcast());
+775            let ty_size = deref_ty.size_of(self.db.upcast(), SLOT_SIZE);
+776            let size = literal_expression! { (ty_size) };
+777            Some(self.ctx.runtime.alloc(self.db, size))
+778        } else {
+779            None
+780        };
+781
+782        self.sink.push(yul::Statement::VariableDeclaration(
+783            yul::VariableDeclaration {
+784                identifiers: vec![var.ident()],
+785                expression: init,
+786            },
+787        ))
+788    }
+789
+790    fn value_expr(&mut self, value: ValueId) -> yul::Expression {
+791        match self.body.store.value_data(value) {
+792            Value::Local(_) | Value::Temporary { .. } => {
+793                let ident = self.value_map.lookup(value).unwrap();
+794                literal_expression! {(ident)}
+795            }
+796            Value::Immediate { imm, .. } => {
+797                literal_expression! {(imm)}
+798            }
+799            Value::Constant { constant, .. } => match &constant.data(self.db.upcast()).value {
+800                ConstantValue::Immediate(imm) => {
+801                    // YUL does not support representing negative integers with leading minus (e.g.
+802                    // `-1` in YUL would lead to an ICE). To mitigate that we
+803                    // convert all numeric values into hexadecimal representation.
+804                    literal_expression! {(to_hex_str(imm))}
+805                }
+806                ConstantValue::Str(s) => {
+807                    self.ctx.string_constants.insert(s.to_string());
+808                    self.ctx.runtime.string_construct(self.db, s, s.len())
+809                }
+810                ConstantValue::Bool(true) => {
+811                    literal_expression! {1}
+812                }
+813                ConstantValue::Bool(false) => {
+814                    literal_expression! {0}
+815                }
+816            },
+817            Value::Unit { .. } => unreachable!(),
+818        }
+819    }
+820
+821    fn value_ident(&self, value: ValueId) -> yul::Identifier {
+822        self.value_map.lookup(value).unwrap().clone()
+823    }
+824
+825    fn make_tmp(&mut self, tmp: ValueId) -> yul::Identifier {
+826        let ident = YulVariable::new(format! {"$tmp_{}", tmp.index()}).ident();
+827        self.value_map.insert(tmp, ident.clone());
+828        ident
+829    }
+830
+831    fn keccak256(&mut self, value: ValueId) -> yul::Expression {
+832        let value_ty = self.body.store.value_ty(value);
+833        debug_assert!(value_ty.is_mptr(self.db.upcast()));
+834
+835        let value_size = value_ty
+836            .deref(self.db.upcast())
+837            .size_of(self.db.upcast(), SLOT_SIZE);
+838        let value_size_expr = literal_expression! {(value_size)};
+839        let value_expr = self.value_expr(value);
+840        expression! {keccak256([value_expr], [value_size_expr])}
+841    }
+842
+843    fn lower_assignable_value(&mut self, value: &AssignableValue) -> yul::Expression {
+844        match value {
+845            AssignableValue::Value(value) => self.value_expr(*value),
+846
+847            AssignableValue::Aggregate { lhs, idx } => {
+848                let base_ptr = self.lower_assignable_value(lhs);
+849                let ty = lhs
+850                    .ty(self.db.upcast(), &self.body.store)
+851                    .deref(self.db.upcast());
+852                self.aggregate_elem_ptr(base_ptr, *idx, ty)
+853            }
+854            AssignableValue::Map { lhs, key } => {
+855                let map_ptr = self.lower_assignable_value(lhs);
+856                let key_ty = self.body.store.value_ty(*key);
+857                let key = self.value_expr(*key);
+858                self.ctx
+859                    .runtime
+860                    .map_value_ptr(self.db, map_ptr, key, key_ty)
+861            }
+862        }
+863    }
+864
+865    fn aggregate_elem_ptr(
+866        &mut self,
+867        base_ptr: yul::Expression,
+868        idx: ValueId,
+869        base_ty: TypeId,
+870    ) -> yul::Expression {
+871        debug_assert!(base_ty.is_aggregate(self.db.upcast()));
+872
+873        match &base_ty.data(self.db.upcast()).kind {
+874            TypeKind::Array(def) => {
+875                let elem_size =
+876                    literal_expression! {(base_ty.array_elem_size(self.db.upcast(), SLOT_SIZE))};
+877                self.validate_array_indexing(def.len, idx);
+878                let idx = self.value_expr(idx);
+879                let offset = expression! {mul([elem_size], [idx])};
+880                expression! { add([base_ptr], [offset]) }
+881            }
+882            _ => {
+883                let elem_idx = match self.body.store.value_data(idx) {
+884                    Value::Immediate { imm, .. } => imm,
+885                    _ => panic!("only array type can use dynamic value indexing"),
+886                };
+887                let offset = literal_expression! {(base_ty.aggregate_elem_offset(self.db.upcast(), elem_idx.clone(), SLOT_SIZE))};
+888                expression! {add([base_ptr], [offset])}
+889            }
+890        }
+891    }
+892
+893    fn validate_array_indexing(&mut self, array_len: usize, idx: ValueId) {
+894        const PANIC_OUT_OF_BOUNDS: usize = 0x32;
+895
+896        if let Value::Immediate { .. } = self.body.store.value_data(idx) {
+897            return;
+898        }
+899
+900        let idx = self.value_expr(idx);
+901        let max_idx = literal_expression! {(array_len - 1)};
+902        self.sink.push(statement!(if (gt([idx], [max_idx])) {
+903            ([runtime::panic_revert_numeric(
+904                self.ctx.runtime.as_mut(),
+905                self.db,
+906                literal_expression! {(PANIC_OUT_OF_BOUNDS)},
+907            )])
+908        }));
+909    }
+910
+911    fn value_ty_size(&self, value: ValueId) -> usize {
+912        self.body
+913            .store
+914            .value_ty(value)
+915            .size_of(self.db.upcast(), SLOT_SIZE)
+916    }
+917
+918    fn value_ty_size_deref(&self, value: ValueId) -> usize {
+919        self.body
+920            .store
+921            .value_ty(value)
+922            .deref(self.db.upcast())
+923            .size_of(self.db.upcast(), SLOT_SIZE)
+924    }
+925
+926    fn enter_scope(&mut self) {
+927        let value_map = std::mem::take(&mut self.value_map);
+928        self.value_map = ScopedValueMap::with_parent(value_map);
+929    }
+930
+931    fn leave_scope(&mut self) {
+932        let value_map = std::mem::take(&mut self.value_map);
+933        self.value_map = value_map.into_parent();
+934    }
+935}
+936
+937#[derive(Debug, Default)]
+938struct ScopedValueMap {
+939    parent: Option<Box<ScopedValueMap>>,
+940    map: FxHashMap<ValueId, yul::Identifier>,
+941}
+942
+943impl ScopedValueMap {
+944    fn lookup(&self, value: ValueId) -> Option<&yul::Identifier> {
+945        match self.map.get(&value) {
+946            Some(ident) => Some(ident),
+947            None => self.parent.as_ref().and_then(|p| p.lookup(value)),
+948        }
+949    }
+950
+951    fn with_parent(parent: ScopedValueMap) -> Self {
+952        Self {
+953            parent: Some(parent.into()),
+954            ..Self::default()
+955        }
+956    }
+957
+958    fn into_parent(self) -> Self {
+959        *self.parent.unwrap()
+960    }
+961
+962    fn insert(&mut self, value: ValueId, ident: yul::Identifier) {
+963        self.map.insert(value, ident);
+964    }
+965
+966    fn contains(&self, value: ValueId) -> bool {
+967        self.lookup(value).is_some()
+968    }
+969}
+970
+971fn bit_mask(byte_size: usize) -> usize {
+972    (1 << (byte_size * 8)) - 1
+973}
+974
+975fn bit_mask_expr(byte_size: usize) -> yul::Expression {
+976    let mask = format!("{:#x}", bit_mask(byte_size));
+977    literal_expression! {(mask)}
+978}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/inst_order.rs.html b/compiler-docs/src/fe_codegen/yul/isel/inst_order.rs.html new file mode 100644 index 0000000000..0dec08eae0 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/inst_order.rs.html @@ -0,0 +1,1368 @@ +inst_order.rs - source

fe_codegen/yul/isel/
inst_order.rs

1use fe_mir::{
+2    analysis::{
+3        domtree::DFSet, loop_tree::LoopId, post_domtree::PostIDom, ControlFlowGraph, DomTree,
+4        LoopTree, PostDomTree,
+5    },
+6    ir::{
+7        inst::{BranchInfo, SwitchTable},
+8        BasicBlockId, FunctionBody, InstId, ValueId,
+9    },
+10};
+11use indexmap::{IndexMap, IndexSet};
+12
+13#[derive(Debug, Clone)]
+14pub(super) enum StructuralInst {
+15    Inst(InstId),
+16    If {
+17        cond: ValueId,
+18        then: Vec<StructuralInst>,
+19        else_: Vec<StructuralInst>,
+20    },
+21
+22    Switch {
+23        scrutinee: ValueId,
+24        table: Vec<(ValueId, Vec<StructuralInst>)>,
+25        default: Option<Vec<StructuralInst>>,
+26    },
+27
+28    For {
+29        body: Vec<StructuralInst>,
+30    },
+31
+32    Break,
+33
+34    Continue,
+35}
+36
+37pub(super) struct InstSerializer<'a> {
+38    body: &'a FunctionBody,
+39    cfg: ControlFlowGraph,
+40    loop_tree: LoopTree,
+41    df: DFSet,
+42    domtree: DomTree,
+43    pd_tree: PostDomTree,
+44    scope: Option<Scope>,
+45}
+46
+47impl<'a> InstSerializer<'a> {
+48    pub(super) fn new(body: &'a FunctionBody) -> Self {
+49        let cfg = ControlFlowGraph::compute(body);
+50        let domtree = DomTree::compute(&cfg);
+51        let df = domtree.compute_df(&cfg);
+52        let pd_tree = PostDomTree::compute(body);
+53        let loop_tree = LoopTree::compute(&cfg, &domtree);
+54
+55        Self {
+56            body,
+57            cfg,
+58            loop_tree,
+59            df,
+60            domtree,
+61            pd_tree,
+62            scope: None,
+63        }
+64    }
+65
+66    pub(super) fn serialize(&mut self) -> Vec<StructuralInst> {
+67        self.scope = None;
+68        let entry = self.cfg.entry();
+69        let mut order = vec![];
+70        self.serialize_block(entry, &mut order);
+71        order
+72    }
+73
+74    fn serialize_block(&mut self, block: BasicBlockId, order: &mut Vec<StructuralInst>) {
+75        match self.loop_tree.loop_of_block(block) {
+76            Some(lp)
+77                if block == self.loop_tree.loop_header(lp)
+78                    && Some(block) != self.scope.as_ref().and_then(Scope::loop_header) =>
+79            {
+80                let loop_exit = self.find_loop_exit(lp);
+81                self.enter_loop_scope(lp, block, loop_exit);
+82                let mut body = vec![];
+83                self.serialize_block(block, &mut body);
+84                self.exit_scope();
+85                order.push(StructuralInst::For { body });
+86
+87                match loop_exit {
+88                    Some(exit)
+89                        if self
+90                            .scope
+91                            .as_ref()
+92                            .map(|scope| scope.branch_merge_block() != Some(exit))
+93                            .unwrap_or(true) =>
+94                    {
+95                        self.serialize_block(exit, order);
+96                    }
+97                    _ => {}
+98                }
+99
+100                return;
+101            }
+102            _ => {}
+103        };
+104
+105        for inst in self.body.order.iter_inst(block) {
+106            if self.body.store.is_terminator(inst) {
+107                break;
+108            }
+109            if !self.body.store.is_nop(inst) {
+110                order.push(StructuralInst::Inst(inst));
+111            }
+112        }
+113
+114        let terminator = self.body.order.terminator(&self.body.store, block).unwrap();
+115        match self.analyze_terminator(terminator) {
+116            TerminatorInfo::If {
+117                cond,
+118                then,
+119                else_,
+120                merge_block,
+121            } => self.serialize_if_terminator(cond, *then, *else_, merge_block, order),
+122
+123            TerminatorInfo::Switch {
+124                scrutinee,
+125                table,
+126                default,
+127                merge_block,
+128            } => self.serialize_switch_terminator(
+129                scrutinee,
+130                table,
+131                default.map(|value| *value),
+132                merge_block,
+133                order,
+134            ),
+135
+136            TerminatorInfo::ToMergeBlock => {}
+137            TerminatorInfo::Continue => order.push(StructuralInst::Continue),
+138            TerminatorInfo::Break => order.push(StructuralInst::Break),
+139            TerminatorInfo::FallThrough(next) => self.serialize_block(next, order),
+140            TerminatorInfo::NormalInst(inst) => order.push(StructuralInst::Inst(inst)),
+141        }
+142    }
+143
+144    fn serialize_if_terminator(
+145        &mut self,
+146        cond: ValueId,
+147        then: TerminatorInfo,
+148        else_: TerminatorInfo,
+149        merge_block: Option<BasicBlockId>,
+150        order: &mut Vec<StructuralInst>,
+151    ) {
+152        let mut then_body = vec![];
+153        let mut else_body = vec![];
+154
+155        self.enter_branch_scope(merge_block);
+156        self.serialize_branch_dest(then, &mut then_body, merge_block);
+157        self.serialize_branch_dest(else_, &mut else_body, merge_block);
+158        self.exit_scope();
+159
+160        order.push(StructuralInst::If {
+161            cond,
+162            then: then_body,
+163            else_: else_body,
+164        });
+165        if let Some(merge_block) = merge_block {
+166            self.serialize_block(merge_block, order);
+167        }
+168    }
+169
+170    fn serialize_switch_terminator(
+171        &mut self,
+172        scrutinee: ValueId,
+173        table: Vec<(ValueId, TerminatorInfo)>,
+174        default: Option<TerminatorInfo>,
+175        merge_block: Option<BasicBlockId>,
+176        order: &mut Vec<StructuralInst>,
+177    ) {
+178        self.enter_branch_scope(merge_block);
+179
+180        let mut serialized_table = Vec::with_capacity(table.len());
+181        for (value, dest) in table {
+182            let mut body = vec![];
+183            self.serialize_branch_dest(dest, &mut body, merge_block);
+184            serialized_table.push((value, body));
+185        }
+186
+187        let serialized_default = default.map(|dest| {
+188            let mut body = vec![];
+189            self.serialize_branch_dest(dest, &mut body, merge_block);
+190            body
+191        });
+192
+193        order.push(StructuralInst::Switch {
+194            scrutinee,
+195            table: serialized_table,
+196            default: serialized_default,
+197        });
+198
+199        self.exit_scope();
+200
+201        if let Some(merge_block) = merge_block {
+202            self.serialize_block(merge_block, order);
+203        }
+204    }
+205
+206    fn serialize_branch_dest(
+207        &mut self,
+208        dest: TerminatorInfo,
+209        body: &mut Vec<StructuralInst>,
+210        merge_block: Option<BasicBlockId>,
+211    ) {
+212        match dest {
+213            TerminatorInfo::Break => body.push(StructuralInst::Break),
+214            TerminatorInfo::Continue => body.push(StructuralInst::Continue),
+215            TerminatorInfo::ToMergeBlock => {}
+216            TerminatorInfo::FallThrough(dest) => {
+217                if Some(dest) != merge_block {
+218                    self.serialize_block(dest, body);
+219                }
+220            }
+221            _ => unreachable!(),
+222        };
+223    }
+224
+225    fn enter_loop_scope(&mut self, lp: LoopId, header: BasicBlockId, exit: Option<BasicBlockId>) {
+226        let kind = ScopeKind::Loop { lp, header, exit };
+227        let current_scope = std::mem::take(&mut self.scope);
+228        self.scope = Some(Scope {
+229            kind,
+230            parent: current_scope.map(Into::into),
+231        });
+232    }
+233
+234    fn enter_branch_scope(&mut self, merge_block: Option<BasicBlockId>) {
+235        let kind = ScopeKind::Branch { merge_block };
+236        let current_scope = std::mem::take(&mut self.scope);
+237        self.scope = Some(Scope {
+238            kind,
+239            parent: current_scope.map(Into::into),
+240        });
+241    }
+242
+243    fn exit_scope(&mut self) {
+244        let current_scope = std::mem::take(&mut self.scope);
+245        self.scope = current_scope.unwrap().parent.map(|parent| *parent);
+246    }
+247
+248    // NOTE: We assume loop has at most one canonical loop exit.
+249    fn find_loop_exit(&self, lp: LoopId) -> Option<BasicBlockId> {
+250        let mut exit_candidates = vec![];
+251        for block_in_loop in self.loop_tree.iter_blocks_post_order(&self.cfg, lp) {
+252            for &succ in self.cfg.succs(block_in_loop) {
+253                if !self.loop_tree.is_block_in_loop(succ, lp) {
+254                    exit_candidates.push(succ);
+255                }
+256            }
+257        }
+258
+259        if exit_candidates.is_empty() {
+260            return None;
+261        }
+262
+263        if exit_candidates.len() == 1 {
+264            let candidate = exit_candidates[0];
+265            let exit = if let Some(mut df) = self.df.frontiers(candidate) {
+266                debug_assert_eq!(self.df.frontier_num(candidate), 1);
+267                df.next()
+268            } else {
+269                Some(candidate)
+270            };
+271            return exit;
+272        }
+273
+274        // If a candidate is a dominance frontier of all other nodes, then the candidate
+275        // is a loop exit.
+276        for &cand in &exit_candidates {
+277            if exit_candidates.iter().all(|&block| {
+278                if block == cand {
+279                    true
+280                } else if let Some(mut df) = self.df.frontiers(block) {
+281                    df.any(|frontier| frontier == cand)
+282                } else {
+283                    true
+284                }
+285            }) {
+286                return Some(cand);
+287            }
+288        }
+289
+290        // If all candidates have the same dominance frontier, then the frontier block
+291        // is the canonicalized loop exit.
+292        let mut frontier: IndexSet<_> = self
+293            .df
+294            .frontiers(exit_candidates.pop().unwrap())
+295            .map(std::iter::Iterator::collect)
+296            .unwrap_or_default();
+297        for cand in exit_candidates {
+298            for cand_frontier in self.df.frontiers(cand).unwrap() {
+299                if !frontier.contains(&cand_frontier) {
+300                    frontier.remove(&cand_frontier);
+301                }
+302            }
+303        }
+304        debug_assert!(frontier.len() < 2);
+305        frontier.iter().next().copied()
+306    }
+307
+308    fn analyze_terminator(&self, inst: InstId) -> TerminatorInfo {
+309        debug_assert!(self.body.store.is_terminator(inst));
+310
+311        let inst_block = self.body.order.inst_block(inst);
+312        match self.body.store.branch_info(inst) {
+313            BranchInfo::Jump(dest) => self.analyze_jump(dest),
+314
+315            BranchInfo::Branch(cond, then, else_) => self.analyze_if(inst_block, cond, then, else_),
+316
+317            BranchInfo::Switch(scrutinee, table, default) => {
+318                self.analyze_switch(inst_block, scrutinee, table, default)
+319            }
+320
+321            BranchInfo::NotBranch => TerminatorInfo::NormalInst(inst),
+322        }
+323    }
+324
+325    fn analyze_if(
+326        &self,
+327        block: BasicBlockId,
+328        cond: ValueId,
+329        then_bb: BasicBlockId,
+330        else_bb: BasicBlockId,
+331    ) -> TerminatorInfo {
+332        let then = Box::new(self.analyze_dest(then_bb));
+333        let else_ = Box::new(self.analyze_dest(else_bb));
+334
+335        let then_cands = self.find_merge_block_candidates(block, then_bb);
+336        let else_cands = self.find_merge_block_candidates(block, else_bb);
+337        debug_assert!(then_cands.len() < 2);
+338        debug_assert!(else_cands.len() < 2);
+339
+340        let merge_block = match (then_cands.as_slice(), else_cands.as_slice()) {
+341            (&[then_cand], &[else_cand]) => {
+342                if then_cand == else_cand {
+343                    Some(then_cand)
+344                } else {
+345                    None
+346                }
+347            }
+348
+349            (&[cand], []) => {
+350                if cand == else_bb {
+351                    Some(cand)
+352                } else {
+353                    None
+354                }
+355            }
+356
+357            ([], &[cand]) => {
+358                if cand == then_bb {
+359                    Some(cand)
+360                } else {
+361                    None
+362                }
+363            }
+364
+365            ([], []) => match self.pd_tree.post_idom(block) {
+366                PostIDom::Block(block) => {
+367                    if let Some(lp) = self.scope.as_ref().and_then(Scope::loop_recursive) {
+368                        if self.loop_tree.is_block_in_loop(block, lp) {
+369                            Some(block)
+370                        } else {
+371                            None
+372                        }
+373                    } else {
+374                        Some(block)
+375                    }
+376                }
+377                _ => None,
+378            },
+379
+380            (_, _) => unreachable!(),
+381        };
+382
+383        TerminatorInfo::If {
+384            cond,
+385            then,
+386            else_,
+387            merge_block,
+388        }
+389    }
+390
+391    fn analyze_switch(
+392        &self,
+393        block: BasicBlockId,
+394        scrutinee: ValueId,
+395        table: &SwitchTable,
+396        default: Option<BasicBlockId>,
+397    ) -> TerminatorInfo {
+398        let mut analyzed_table = Vec::with_capacity(table.len());
+399
+400        let mut merge_block_cands = IndexSet::default();
+401        for (value, dest) in table.iter() {
+402            analyzed_table.push((value, self.analyze_dest(dest)));
+403            merge_block_cands.extend(self.find_merge_block_candidates(block, dest));
+404        }
+405
+406        let analyzed_default = default.map(|dest| {
+407            merge_block_cands.extend(self.find_merge_block_candidates(block, dest));
+408            Box::new(self.analyze_dest(dest))
+409        });
+410
+411        TerminatorInfo::Switch {
+412            scrutinee,
+413            table: analyzed_table,
+414            default: analyzed_default,
+415            merge_block: self.select_switch_merge_block(
+416                &merge_block_cands,
+417                table.iter().map(|(_, d)| d).chain(default),
+418            ),
+419        }
+420    }
+421
+422    fn find_merge_block_candidates(
+423        &self,
+424        branch_inst_bb: BasicBlockId,
+425        branch_dest_bb: BasicBlockId,
+426    ) -> Vec<BasicBlockId> {
+427        if self.domtree.dominates(branch_dest_bb, branch_inst_bb) {
+428            return vec![];
+429        }
+430
+431        // a block `cand` can be a candidate of a `merge` block iff
+432        // 1. `cand` is a dominance frontier of `branch_dest_bb`.
+433        // 2. `cand` is NOT a dominator of `branch_dest_bb`.
+434        // 3. `cand` is NOT a "merge" block of parent `if` or `switch`.
+435        // 4. `cand` is NOT a "loop_exit" block of parent `loop`.
+436        match self.df.frontiers(branch_dest_bb) {
+437            Some(cands) => cands
+438                .filter(|cand| {
+439                    !self.domtree.dominates(*cand, branch_dest_bb)
+440                        && Some(*cand)
+441                            != self
+442                                .scope
+443                                .as_ref()
+444                                .and_then(Scope::branch_merge_block_recursive)
+445                        && Some(*cand) != self.scope.as_ref().and_then(Scope::loop_exit_recursive)
+446                })
+447                .collect(),
+448            None => vec![],
+449        }
+450    }
+451
+452    /// Each destination block of `switch` instruction could have multiple
+453    /// candidates for the merge block because arm bodies can have multiple
+454    /// predecessors, e.g., `default` arm.
+455    /// So we need a heuristic to select the merge block from candidates.
+456    ///
+457    /// First, if one of the dominance frontiers of switch dests is a parent
+458    /// merge block, then we stop searching the merge block because the parent
+459    /// merge block should be the subsequent codes after the switch in terms of
+460    /// high-level flow structure like Fe or yul.
+461    ///
+462    /// If no parent merge block is found, we start scoring the candidates by
+463    /// the following function.
+464    ///
+465    /// The scoring function `F` is defined as follows:
+466    /// 1. The initial score of each candidate('cand_bb`) is number of
+467    /// predecessors of the candidate.
+468    ///
+469    /// 2. Find the `top_cand` of each `cand_bb`. `top_cand` can be found by
+470    /// [`Self::try_find_top_cand`] method, see the method for details.
+471    ///
+472    /// 3. If `top_cand` is found, then add the `cand_bb` score to the
+473    /// `top_cand` score, then set 0 to the `cand_bb` score.
+474    ///
+475    /// After the scoring, the candidates with the highest score will be
+476    /// selected.
+477    fn select_switch_merge_block(
+478        &self,
+479        cands: &IndexSet<BasicBlockId>,
+480        dests: impl Iterator<Item = BasicBlockId>,
+481    ) -> Option<BasicBlockId> {
+482        let parent_merge = self
+483            .scope
+484            .as_ref()
+485            .and_then(Scope::branch_merge_block_recursive);
+486        for dest in dests {
+487            if self
+488                .df
+489                .frontiers(dest)
+490                .map(|mut frontieres| frontieres.any(|frontier| Some(frontier) == parent_merge))
+491                .unwrap_or_default()
+492            {
+493                return None;
+494            }
+495        }
+496
+497        let mut cands_with_score = cands
+498            .iter()
+499            .map(|cand| (*cand, self.cfg.preds(*cand).len()))
+500            .collect::<IndexMap<_, _>>();
+501
+502        for cand_bb in cands_with_score.keys().copied().collect::<Vec<_>>() {
+503            if let Some(top_cand) = self.try_find_top_cand(&cands_with_score, cand_bb) {
+504                let score = std::mem::take(cands_with_score.get_mut(&cand_bb).unwrap());
+505                *cands_with_score.get_mut(&top_cand).unwrap() += score;
+506            }
+507        }
+508
+509        cands_with_score
+510            .iter()
+511            .max_by_key(|(_, score)| *score)
+512            .map(|(&cand, _)| cand)
+513    }
+514
+515    /// Try to find the `top_cand` of the `cand_bb`.
+516    /// A `top_cand` can be found by the following rules:
+517    ///
+518    /// 1. Find the block which is contained in DF of `cand_bb` and in
+519    /// `cands_with_score`.
+520    ///
+521    /// 2. If a block is found in 1., and the score of the block is positive,
+522    /// then the block is `top_cand`.
+523    ///
+524    /// 2'. If a block is found in 1., and the score of the block is 0, then the
+525    /// `top_cand` of the block is `top_cand` of `cand_bb`.
+526    ///
+527    /// 2''. If a block is NOT found in 1., then there is no `top_cand` for
+528    /// `cand_bb`.
+529    fn try_find_top_cand(
+530        &self,
+531        cands_with_score: &IndexMap<BasicBlockId, usize>,
+532        cand_bb: BasicBlockId,
+533    ) -> Option<BasicBlockId> {
+534        let mut frontiers = match self.df.frontiers(cand_bb) {
+535            Some(frontiers) => frontiers,
+536            _ => return None,
+537        };
+538
+539        while let Some(frontier_bb) = frontiers.next() {
+540            if cands_with_score.contains_key(&frontier_bb) {
+541                debug_assert!(frontiers.all(|bb| !cands_with_score.contains_key(&bb)));
+542                if cands_with_score[&frontier_bb] != 0 {
+543                    return Some(frontier_bb);
+544                } else {
+545                    return self.try_find_top_cand(cands_with_score, frontier_bb);
+546                }
+547            }
+548        }
+549
+550        None
+551    }
+552
+553    fn analyze_jump(&self, dest: BasicBlockId) -> TerminatorInfo {
+554        self.analyze_dest(dest)
+555    }
+556
+557    fn analyze_dest(&self, dest: BasicBlockId) -> TerminatorInfo {
+558        match &self.scope {
+559            Some(scope) => {
+560                if Some(dest) == scope.loop_header_recursive() {
+561                    TerminatorInfo::Continue
+562                } else if Some(dest) == scope.loop_exit_recursive() {
+563                    TerminatorInfo::Break
+564                } else if Some(dest) == scope.branch_merge_block_recursive() {
+565                    TerminatorInfo::ToMergeBlock
+566                } else {
+567                    TerminatorInfo::FallThrough(dest)
+568                }
+569            }
+570
+571            None => TerminatorInfo::FallThrough(dest),
+572        }
+573    }
+574}
+575
+576struct Scope {
+577    kind: ScopeKind,
+578    parent: Option<Box<Scope>>,
+579}
+580
+581#[derive(Debug, Clone, Copy)]
+582enum ScopeKind {
+583    Loop {
+584        lp: LoopId,
+585        header: BasicBlockId,
+586        exit: Option<BasicBlockId>,
+587    },
+588    Branch {
+589        merge_block: Option<BasicBlockId>,
+590    },
+591}
+592
+593impl Scope {
+594    fn loop_recursive(&self) -> Option<LoopId> {
+595        match self.kind {
+596            ScopeKind::Loop { lp, .. } => Some(lp),
+597            _ => self.parent.as_ref()?.loop_recursive(),
+598        }
+599    }
+600
+601    fn loop_header(&self) -> Option<BasicBlockId> {
+602        match self.kind {
+603            ScopeKind::Loop { header, .. } => Some(header),
+604            _ => None,
+605        }
+606    }
+607
+608    fn loop_header_recursive(&self) -> Option<BasicBlockId> {
+609        match self.kind {
+610            ScopeKind::Loop { header, .. } => Some(header),
+611            _ => self.parent.as_ref()?.loop_header_recursive(),
+612        }
+613    }
+614
+615    fn loop_exit_recursive(&self) -> Option<BasicBlockId> {
+616        match self.kind {
+617            ScopeKind::Loop { exit, .. } => exit,
+618            _ => self.parent.as_ref()?.loop_exit_recursive(),
+619        }
+620    }
+621
+622    fn branch_merge_block(&self) -> Option<BasicBlockId> {
+623        match self.kind {
+624            ScopeKind::Branch { merge_block } => merge_block,
+625            _ => None,
+626        }
+627    }
+628
+629    fn branch_merge_block_recursive(&self) -> Option<BasicBlockId> {
+630        match self.kind {
+631            ScopeKind::Branch {
+632                merge_block: Some(merge_block),
+633            } => Some(merge_block),
+634            _ => self.parent.as_ref()?.branch_merge_block_recursive(),
+635        }
+636    }
+637}
+638
+639#[derive(Debug, Clone)]
+640enum TerminatorInfo {
+641    If {
+642        cond: ValueId,
+643        then: Box<TerminatorInfo>,
+644        else_: Box<TerminatorInfo>,
+645        merge_block: Option<BasicBlockId>,
+646    },
+647
+648    Switch {
+649        scrutinee: ValueId,
+650        table: Vec<(ValueId, TerminatorInfo)>,
+651        default: Option<Box<TerminatorInfo>>,
+652        merge_block: Option<BasicBlockId>,
+653    },
+654
+655    ToMergeBlock,
+656    Continue,
+657    Break,
+658    FallThrough(BasicBlockId),
+659    NormalInst(InstId),
+660}
+661
+662#[cfg(test)]
+663mod tests {
+664    use fe_mir::ir::{body_builder::BodyBuilder, inst::InstKind, FunctionId, SourceInfo, TypeId};
+665
+666    use super::*;
+667
+668    fn body_builder() -> BodyBuilder {
+669        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+670    }
+671
+672    fn serialize_func_body(func: &mut FunctionBody) -> impl Iterator<Item = StructuralInst> {
+673        InstSerializer::new(func).serialize().into_iter()
+674    }
+675
+676    fn expect_if(
+677        insts: &mut impl Iterator<Item = StructuralInst>,
+678    ) -> (
+679        impl Iterator<Item = StructuralInst>,
+680        impl Iterator<Item = StructuralInst>,
+681    ) {
+682        match insts.next().unwrap() {
+683            StructuralInst::If { then, else_, .. } => (then.into_iter(), else_.into_iter()),
+684            _ => panic!("expect if inst"),
+685        }
+686    }
+687
+688    fn expect_switch(
+689        insts: &mut impl Iterator<Item = StructuralInst>,
+690    ) -> Vec<impl Iterator<Item = StructuralInst>> {
+691        match insts.next().unwrap() {
+692            StructuralInst::Switch { table, default, .. } => {
+693                let mut arms: Vec<_> = table
+694                    .into_iter()
+695                    .map(|(_, insts)| insts.into_iter())
+696                    .collect();
+697                if let Some(default) = default {
+698                    arms.push(default.into_iter());
+699                }
+700
+701                arms
+702            }
+703
+704            _ => panic!("expect if inst"),
+705        }
+706    }
+707
+708    fn expect_for(
+709        insts: &mut impl Iterator<Item = StructuralInst>,
+710    ) -> impl Iterator<Item = StructuralInst> {
+711        match insts.next().unwrap() {
+712            StructuralInst::For { body } => body.into_iter(),
+713            _ => panic!("expect if inst"),
+714        }
+715    }
+716
+717    fn expect_break(insts: &mut impl Iterator<Item = StructuralInst>) {
+718        assert!(matches!(insts.next().unwrap(), StructuralInst::Break))
+719    }
+720
+721    fn expect_continue(insts: &mut impl Iterator<Item = StructuralInst>) {
+722        assert!(matches!(insts.next().unwrap(), StructuralInst::Continue))
+723    }
+724
+725    fn expect_return(func: &FunctionBody, insts: &mut impl Iterator<Item = StructuralInst>) {
+726        let inst = insts.next().unwrap();
+727        match inst {
+728            StructuralInst::Inst(inst) => {
+729                assert!(matches!(
+730                    func.store.inst_data(inst).kind,
+731                    InstKind::Return { .. }
+732                ))
+733            }
+734            _ => panic!("expect return"),
+735        }
+736    }
+737
+738    fn expect_end(insts: &mut impl Iterator<Item = StructuralInst>) {
+739        assert!(insts.next().is_none())
+740    }
+741
+742    #[test]
+743    fn if_non_merge() {
+744        // +------+     +-------+
+745        // | then | <-- |  bb0  |
+746        // +------+     +-------+
+747        //                |
+748        //                |
+749        //                v
+750        //              +-------+
+751        //              | else_ |
+752        //              +-------+
+753        let mut builder = body_builder();
+754
+755        let then = builder.make_block();
+756        let else_ = builder.make_block();
+757
+758        let dummy_ty = TypeId(0);
+759        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+760        let unit = builder.make_unit(dummy_ty);
+761
+762        builder.branch(v0, then, else_, SourceInfo::dummy());
+763
+764        builder.move_to_block(then);
+765        builder.ret(unit, SourceInfo::dummy());
+766
+767        builder.move_to_block(else_);
+768        builder.ret(unit, SourceInfo::dummy());
+769
+770        let mut func = builder.build();
+771        let mut order = serialize_func_body(&mut func);
+772
+773        let (mut then, mut else_) = expect_if(&mut order);
+774        expect_return(&func, &mut then);
+775        expect_end(&mut then);
+776        expect_return(&func, &mut else_);
+777        expect_end(&mut else_);
+778
+779        expect_end(&mut order);
+780    }
+781
+782    #[test]
+783    fn if_merge() {
+784        // +------+     +-------+
+785        // | then | <-- |  bb0  |
+786        // +------+     +-------+
+787        //   |            |
+788        //   |            |
+789        //   |            v
+790        //   |          +-------+
+791        //   |          | else_ |
+792        //   |          +-------+
+793        //   |            |
+794        //   |            |
+795        //   |            v
+796        //   |          +-------+
+797        //   +--------> | merge |
+798        //              +-------+
+799        let mut builder = body_builder();
+800
+801        let then = builder.make_block();
+802        let else_ = builder.make_block();
+803        let merge = builder.make_block();
+804
+805        let dummy_ty = TypeId(0);
+806        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+807        let unit = builder.make_unit(dummy_ty);
+808
+809        builder.branch(v0, then, else_, SourceInfo::dummy());
+810
+811        builder.move_to_block(then);
+812        builder.jump(merge, SourceInfo::dummy());
+813
+814        builder.move_to_block(else_);
+815        builder.jump(merge, SourceInfo::dummy());
+816
+817        builder.move_to_block(merge);
+818        builder.ret(unit, SourceInfo::dummy());
+819
+820        let mut func = builder.build();
+821        let mut order = serialize_func_body(&mut func);
+822
+823        let (mut then, mut else_) = expect_if(&mut order);
+824        expect_end(&mut then);
+825        expect_end(&mut else_);
+826
+827        expect_return(&func, &mut order);
+828        expect_end(&mut order);
+829    }
+830
+831    #[test]
+832    fn nested_if() {
+833        //             +-----+
+834        //             | bb0 | -+
+835        //             +-----+  |
+836        //               |      |
+837        //               |      |
+838        //               v      |
+839        // +-----+     +-----+  |
+840        // | bb3 | <-- | bb1 |  |
+841        // +-----+     +-----+  |
+842        //               |      |
+843        //               |      |
+844        //               v      |
+845        //             +-----+  |
+846        //             | bb4 |  |
+847        //             +-----+  |
+848        //               |      |
+849        //               |      |
+850        //               v      |
+851        //             +-----+  |
+852        //             | bb2 | <+
+853        //             +-----+
+854        let mut builder = body_builder();
+855
+856        let bb1 = builder.make_block();
+857        let bb2 = builder.make_block();
+858        let bb3 = builder.make_block();
+859        let bb4 = builder.make_block();
+860
+861        let dummy_ty = TypeId(0);
+862        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+863        let unit = builder.make_unit(dummy_ty);
+864
+865        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+866
+867        builder.move_to_block(bb1);
+868        builder.branch(v0, bb3, bb4, SourceInfo::dummy());
+869
+870        builder.move_to_block(bb3);
+871        builder.ret(unit, SourceInfo::dummy());
+872
+873        builder.move_to_block(bb4);
+874        builder.jump(bb2, SourceInfo::dummy());
+875
+876        builder.move_to_block(bb2);
+877        builder.ret(unit, SourceInfo::dummy());
+878
+879        let mut func = builder.build();
+880        let mut order = serialize_func_body(&mut func);
+881
+882        let (mut then1, mut else2) = expect_if(&mut order);
+883        expect_end(&mut else2);
+884
+885        let (mut then3, mut else4) = expect_if(&mut then1);
+886        expect_end(&mut then1);
+887        expect_return(&func, &mut then3);
+888        expect_end(&mut then3);
+889        expect_end(&mut else4);
+890
+891        expect_return(&func, &mut order);
+892        expect_end(&mut order);
+893    }
+894
+895    #[test]
+896    fn simple_loop() {
+897        //    +--------+
+898        //    |  bb0   | -+
+899        //    +--------+  |
+900        //      |         |
+901        //      |         |
+902        //      v         |
+903        //    +--------+  |
+904        // +> | header |  |
+905        // |  +--------+  |
+906        // |    |         |
+907        // |    |         |
+908        // |    v         |
+909        // |  +--------+  |
+910        // +- | latch  |  |
+911        //    +--------+  |
+912        //      |         |
+913        //      |         |
+914        //      v         |
+915        //    +--------+  |
+916        //    |  exit  | <+
+917        //    +--------+
+918        let mut builder = body_builder();
+919
+920        let header = builder.make_block();
+921        let latch = builder.make_block();
+922        let exit = builder.make_block();
+923
+924        let dummy_ty = TypeId(0);
+925        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+926        let unit = builder.make_unit(dummy_ty);
+927
+928        builder.branch(v0, header, exit, SourceInfo::dummy());
+929
+930        builder.move_to_block(header);
+931        builder.jump(latch, SourceInfo::dummy());
+932
+933        builder.move_to_block(latch);
+934        builder.branch(v0, header, exit, SourceInfo::dummy());
+935
+936        builder.move_to_block(exit);
+937        builder.ret(unit, SourceInfo::dummy());
+938
+939        let mut func = builder.build();
+940        let mut order = serialize_func_body(&mut func);
+941
+942        let (mut lp, mut empty) = expect_if(&mut order);
+943
+944        let mut body = expect_for(&mut lp);
+945        let (mut continue_, mut break_) = expect_if(&mut body);
+946        expect_end(&mut body);
+947
+948        expect_continue(&mut continue_);
+949        expect_end(&mut continue_);
+950
+951        expect_break(&mut break_);
+952        expect_end(&mut break_);
+953
+954        expect_end(&mut empty);
+955
+956        expect_return(&func, &mut order);
+957        expect_end(&mut order);
+958    }
+959
+960    #[test]
+961    fn loop_with_continue() {
+962        //    +-----+
+963        // +- | bb0 |
+964        // |  +-----+
+965        // |    |
+966        // |    |
+967        // |    v
+968        // |  +---------------+     +-----+
+969        // |  |      bb1      | --> | bb3 |
+970        // |  +---------------+     +-----+
+971        // |    |      ^    ^         |
+972        // |    |      |    +---------+
+973        // |    v      |
+974        // |  +-----+  |
+975        // |  | bb4 | -+
+976        // |  +-----+
+977        // |    |
+978        // |    |
+979        // |    v
+980        // |  +-----+
+981        // +> | bb2 |
+982        //    +-----+
+983        let mut builder = body_builder();
+984
+985        let bb1 = builder.make_block();
+986        let bb2 = builder.make_block();
+987        let bb3 = builder.make_block();
+988        let bb4 = builder.make_block();
+989
+990        let dummy_ty = TypeId(0);
+991        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+992        let unit = builder.make_unit(dummy_ty);
+993
+994        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+995
+996        builder.move_to_block(bb1);
+997        builder.branch(v0, bb3, bb4, SourceInfo::dummy());
+998
+999        builder.move_to_block(bb3);
+1000        builder.jump(bb1, SourceInfo::dummy());
+1001
+1002        builder.move_to_block(bb4);
+1003        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+1004
+1005        builder.move_to_block(bb2);
+1006        builder.ret(unit, SourceInfo::dummy());
+1007
+1008        let mut func = builder.build();
+1009        let mut order = serialize_func_body(&mut func);
+1010
+1011        let (mut lp, mut empty) = expect_if(&mut order);
+1012        expect_end(&mut empty);
+1013
+1014        let mut body = expect_for(&mut lp);
+1015
+1016        let (mut continue_, mut empty) = expect_if(&mut body);
+1017        expect_continue(&mut continue_);
+1018        expect_end(&mut continue_);
+1019        expect_end(&mut empty);
+1020
+1021        let (mut continue_, mut break_) = expect_if(&mut body);
+1022        expect_continue(&mut continue_);
+1023        expect_end(&mut continue_);
+1024        expect_break(&mut break_);
+1025        expect_end(&mut break_);
+1026
+1027        expect_end(&mut body);
+1028        expect_end(&mut lp);
+1029
+1030        expect_return(&func, &mut order);
+1031        expect_end(&mut order);
+1032    }
+1033
+1034    #[test]
+1035    fn loop_with_break() {
+1036        //    +-----+
+1037        // +- | bb0 |
+1038        // |  +-----+
+1039        // |    |
+1040        // |    |           +---------+
+1041        // |    v           v         |
+1042        // |  +---------------+     +-----+
+1043        // |  |      bb1      | --> | bb4 |
+1044        // |  +---------------+     +-----+
+1045        // |    |                     |
+1046        // |    |                     |
+1047        // |    v                     |
+1048        // |  +-----+                 |
+1049        // |  | bb3 |                 |
+1050        // |  +-----+                 |
+1051        // |    |                     |
+1052        // |    |                     |
+1053        // |    v                     |
+1054        // |  +-----+                 |
+1055        // +> | bb2 | <---------------+
+1056        //    +-----+
+1057        let mut builder = body_builder();
+1058
+1059        let bb1 = builder.make_block();
+1060        let bb2 = builder.make_block();
+1061        let bb3 = builder.make_block();
+1062        let bb4 = builder.make_block();
+1063
+1064        let dummy_ty = TypeId(0);
+1065        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+1066        let unit = builder.make_unit(dummy_ty);
+1067
+1068        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+1069
+1070        builder.move_to_block(bb1);
+1071        builder.branch(v0, bb3, bb4, SourceInfo::dummy());
+1072
+1073        builder.move_to_block(bb3);
+1074        builder.jump(bb2, SourceInfo::dummy());
+1075
+1076        builder.move_to_block(bb4);
+1077        builder.branch(v0, bb1, bb2, SourceInfo::dummy());
+1078
+1079        builder.move_to_block(bb2);
+1080        builder.ret(unit, SourceInfo::dummy());
+1081
+1082        let mut func = builder.build();
+1083        let mut order = serialize_func_body(&mut func);
+1084
+1085        let (mut lp, mut empty) = expect_if(&mut order);
+1086        expect_end(&mut empty);
+1087
+1088        let mut body = expect_for(&mut lp);
+1089
+1090        let (mut break_, mut latch) = expect_if(&mut body);
+1091        expect_break(&mut break_);
+1092        expect_end(&mut break_);
+1093
+1094        let (mut continue_, mut break_) = expect_if(&mut latch);
+1095        expect_end(&mut latch);
+1096        expect_continue(&mut continue_);
+1097        expect_end(&mut continue_);
+1098        expect_break(&mut break_);
+1099        expect_end(&mut break_);
+1100
+1101        expect_end(&mut body);
+1102        expect_end(&mut lp);
+1103
+1104        expect_return(&func, &mut order);
+1105        expect_end(&mut order);
+1106    }
+1107
+1108    #[test]
+1109    fn loop_no_guard() {
+1110        // +-----+
+1111        // | bb0 |
+1112        // +-----+
+1113        //   |
+1114        //   |
+1115        //   v
+1116        // +-----+
+1117        // | bb1 | <+
+1118        // +-----+  |
+1119        //   |      |
+1120        //   |      |
+1121        //   v      |
+1122        // +-----+  |
+1123        // | bb2 | -+
+1124        // +-----+
+1125        //   |
+1126        //   |
+1127        //   v
+1128        // +-----+
+1129        // | bb3 |
+1130        // +-----+
+1131        let mut builder = body_builder();
+1132
+1133        let bb1 = builder.make_block();
+1134        let bb2 = builder.make_block();
+1135        let bb3 = builder.make_block();
+1136
+1137        let dummy_ty = TypeId(0);
+1138        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+1139        let unit = builder.make_unit(dummy_ty);
+1140
+1141        builder.jump(bb1, SourceInfo::dummy());
+1142
+1143        builder.move_to_block(bb1);
+1144        builder.jump(bb2, SourceInfo::dummy());
+1145
+1146        builder.move_to_block(bb2);
+1147        builder.branch(v0, bb1, bb3, SourceInfo::dummy());
+1148
+1149        builder.move_to_block(bb3);
+1150        builder.ret(unit, SourceInfo::dummy());
+1151
+1152        let mut func = builder.build();
+1153        let mut order = serialize_func_body(&mut func);
+1154
+1155        let mut body = expect_for(&mut order);
+1156        let (mut continue_, mut break_) = expect_if(&mut body);
+1157        expect_end(&mut body);
+1158
+1159        expect_continue(&mut continue_);
+1160        expect_end(&mut continue_);
+1161
+1162        expect_break(&mut break_);
+1163        expect_end(&mut break_);
+1164
+1165        expect_return(&func, &mut order);
+1166        expect_end(&mut order);
+1167    }
+1168
+1169    #[test]
+1170    fn infinite_loop() {
+1171        // +-----+
+1172        // | bb0 |
+1173        // +-----+
+1174        //   |
+1175        //   |
+1176        //   v
+1177        // +-----+
+1178        // | bb1 | <+
+1179        // +-----+  |
+1180        //   |      |
+1181        //   |      |
+1182        //   v      |
+1183        // +-----+  |
+1184        // | bb2 | -+
+1185        // +-----+
+1186        let mut builder = body_builder();
+1187
+1188        let bb1 = builder.make_block();
+1189        let bb2 = builder.make_block();
+1190
+1191        builder.jump(bb1, SourceInfo::dummy());
+1192
+1193        builder.move_to_block(bb1);
+1194        builder.jump(bb2, SourceInfo::dummy());
+1195
+1196        builder.move_to_block(bb2);
+1197        builder.jump(bb1, SourceInfo::dummy());
+1198
+1199        let mut func = builder.build();
+1200        let mut order = serialize_func_body(&mut func);
+1201
+1202        let mut body = expect_for(&mut order);
+1203        expect_continue(&mut body);
+1204        expect_end(&mut body);
+1205
+1206        expect_end(&mut order);
+1207    }
+1208
+1209    #[test]
+1210    fn switch_basic() {
+1211        // +-----+     +-------+     +-----+
+1212        // | bb2 | <-- |  bb0  | --> | bb3 |
+1213        // +-----+     +-------+     +-----+
+1214        //   |           |             |
+1215        //   |           |             |
+1216        //   |           v             |
+1217        //   |         +-------+       |
+1218        //   |         |  bb1  |       |
+1219        //   |         +-------+       |
+1220        //   |           |             |
+1221        //   |           |             |
+1222        //   |           v             |
+1223        //   |         +-------+       |
+1224        //   +-------> | merge | <-----+
+1225        //             +-------+
+1226        let mut builder = body_builder();
+1227        let dummy_ty = TypeId(0);
+1228        let dummy_value = builder.make_unit(dummy_ty);
+1229
+1230        let bb1 = builder.make_block();
+1231        let bb2 = builder.make_block();
+1232        let bb3 = builder.make_block();
+1233        let merge = builder.make_block();
+1234
+1235        let mut table = SwitchTable::default();
+1236        table.add_arm(dummy_value, bb1);
+1237        table.add_arm(dummy_value, bb2);
+1238        table.add_arm(dummy_value, bb3);
+1239        builder.switch(dummy_value, table, None, SourceInfo::dummy());
+1240
+1241        builder.move_to_block(bb1);
+1242        builder.jump(merge, SourceInfo::dummy());
+1243
+1244        builder.move_to_block(bb2);
+1245        builder.jump(merge, SourceInfo::dummy());
+1246        builder.move_to_block(bb3);
+1247        builder.jump(merge, SourceInfo::dummy());
+1248
+1249        builder.move_to_block(merge);
+1250        builder.ret(dummy_value, SourceInfo::dummy());
+1251
+1252        let mut func = builder.build();
+1253        let mut order = serialize_func_body(&mut func);
+1254
+1255        let arms = expect_switch(&mut order);
+1256        assert_eq!(arms.len(), 3);
+1257        for mut arm in arms {
+1258            expect_end(&mut arm);
+1259        }
+1260
+1261        expect_return(&func, &mut order);
+1262        expect_end(&mut order);
+1263    }
+1264
+1265    #[test]
+1266    fn switch_default() {
+1267        //      +-----------+
+1268        //      |           |
+1269        //      |           |
+1270        //      |      +----+--------+
+1271        //      v      |    |        |
+1272        //    +-----+  |  +-------+  |  +---------+
+1273        //    | bb2 | -+  |  bb0  | -+> |   bb3   |
+1274        //    +-----+     +-------+  |  +---------+
+1275        //      |           |        |    |
+1276        //      |           |        |    |
+1277        //      v           v        |    v
+1278        //    +-----+     +-------+  |  +---------+
+1279        //    | bb5 |  +- |  bb1  |  +> | default | <+
+1280        //    +-----+  |  +-------+     +---------+  |
+1281        //      |      |    |             |          |
+1282        //      |      |    |             |          |
+1283        //      |      |    v             |          |
+1284        //      |      |  +-------+       |          |
+1285        //      |      |  |  bb4  |       |          |
+1286        //      |      |  +-------+       |          |
+1287        //      |      |    |             |          |
+1288        // +----+------+    |             |          |
+1289        // |    |           v             |          |
+1290        // |    |         +-------+       |          |
+1291        // |    +-------> | merge | <-----+          |
+1292        // |              +-------+                  |
+1293        // |                                         |
+1294        // +-----------------------------------------+
+1295        let mut builder = body_builder();
+1296        let dummy_ty = TypeId(0);
+1297        let dummy_value = builder.make_unit(dummy_ty);
+1298
+1299        let bb1 = builder.make_block();
+1300        let bb2 = builder.make_block();
+1301        let bb3 = builder.make_block();
+1302        let bb4 = builder.make_block();
+1303        let bb5 = builder.make_block();
+1304        let default = builder.make_block();
+1305        let merge = builder.make_block();
+1306
+1307        let mut table = SwitchTable::default();
+1308        table.add_arm(dummy_value, bb1);
+1309        table.add_arm(dummy_value, bb2);
+1310        table.add_arm(dummy_value, bb3);
+1311        builder.switch(dummy_value, table, None, SourceInfo::dummy());
+1312
+1313        builder.move_to_block(bb1);
+1314        let mut table = SwitchTable::default();
+1315        table.add_arm(dummy_value, bb4);
+1316        table.add_arm(dummy_value, default);
+1317        builder.switch(dummy_value, table, None, SourceInfo::dummy());
+1318
+1319        builder.move_to_block(bb2);
+1320        let mut table = SwitchTable::default();
+1321        table.add_arm(dummy_value, bb5);
+1322        table.add_arm(dummy_value, default);
+1323        builder.switch(dummy_value, table, None, SourceInfo::dummy());
+1324
+1325        builder.move_to_block(bb3);
+1326        builder.jump(default, SourceInfo::dummy());
+1327
+1328        builder.move_to_block(bb4);
+1329        builder.jump(merge, SourceInfo::dummy());
+1330
+1331        builder.move_to_block(bb5);
+1332        builder.jump(merge, SourceInfo::dummy());
+1333
+1334        builder.move_to_block(default);
+1335        builder.jump(merge, SourceInfo::dummy());
+1336
+1337        builder.move_to_block(merge);
+1338        builder.ret(dummy_value, SourceInfo::dummy());
+1339
+1340        let mut func = builder.build();
+1341        let mut order = serialize_func_body(&mut func);
+1342
+1343        let mut arms = expect_switch(&mut order);
+1344        assert_eq!(arms.len(), 3);
+1345
+1346        let mut bb3_jump = arms.pop().unwrap();
+1347        expect_end(&mut bb3_jump);
+1348
+1349        let mut bb2_switch = arms.pop().unwrap();
+1350        let bb2_switch_arms = expect_switch(&mut bb2_switch);
+1351        assert_eq!(bb2_switch_arms.len(), 2);
+1352        for mut bb2_switch_arm in bb2_switch_arms {
+1353            expect_end(&mut bb2_switch_arm);
+1354        }
+1355        expect_end(&mut bb2_switch);
+1356
+1357        let mut bb1_switch = arms.pop().unwrap();
+1358        let bb1_switch_arms = expect_switch(&mut bb1_switch);
+1359        assert_eq!(bb1_switch_arms.len(), 2);
+1360        for mut bb1_switch_arm in bb1_switch_arms {
+1361            expect_end(&mut bb1_switch_arm);
+1362        }
+1363        expect_end(&mut bb1_switch);
+1364
+1365        expect_return(&func, &mut order);
+1366        expect_end(&mut order);
+1367    }
+1368}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/mod.rs.html b/compiler-docs/src/fe_codegen/yul/isel/mod.rs.html new file mode 100644 index 0000000000..57b5bae43b --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/mod.rs.html @@ -0,0 +1,9 @@ +mod.rs - source

fe_codegen/yul/isel/
mod.rs

1pub mod context;
+2mod contract;
+3mod function;
+4mod inst_order;
+5mod test;
+6
+7pub use contract::{lower_contract, lower_contract_deployable};
+8pub use function::lower_function;
+9pub use test::lower_test;
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/isel/test.rs.html b/compiler-docs/src/fe_codegen/yul/isel/test.rs.html new file mode 100644 index 0000000000..9149ae7844 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/isel/test.rs.html @@ -0,0 +1,70 @@ +test.rs - source

fe_codegen/yul/isel/
test.rs

1use super::context::Context;
+2use crate::db::CodegenDb;
+3use fe_analyzer::namespace::items::FunctionId;
+4use yultsur::{yul, *};
+5
+6pub fn lower_test(db: &dyn CodegenDb, test: FunctionId) -> yul::Object {
+7    let mut context = Context::default();
+8    let test = db.mir_lowered_func_signature(test);
+9    context.function_dependency.insert(test);
+10
+11    let dep_functions: Vec<_> = context
+12        .resolve_function_dependency(db)
+13        .into_iter()
+14        .map(yul::Statement::FunctionDefinition)
+15        .collect();
+16    let dep_constants = context.resolve_constant_dependency(db);
+17    let dep_contracts = context.resolve_contract_dependency(db);
+18    let runtime_funcs: Vec<_> = context
+19        .runtime
+20        .collect_definitions()
+21        .into_iter()
+22        .map(yul::Statement::FunctionDefinition)
+23        .collect();
+24    let test_func_name = identifier! { (db.codegen_function_symbol_name(test)) };
+25    let call = function_call_statement! {[test_func_name]()};
+26
+27    let code = code! {
+28        [dep_functions...]
+29        [runtime_funcs...]
+30        [call]
+31        (stop())
+32    };
+33
+34    let name = identifier! { test };
+35    let object = yul::Object {
+36        name,
+37        code,
+38        objects: dep_contracts,
+39        data: dep_constants,
+40    };
+41
+42    normalize_object(object)
+43}
+44
+45fn normalize_object(obj: yul::Object) -> yul::Object {
+46    let data = obj
+47        .data
+48        .into_iter()
+49        .map(|data| yul::Data {
+50            name: data.name,
+51            value: data
+52                .value
+53                .replace('\\', "\\\\\\\\")
+54                .replace('\n', "\\\\n")
+55                .replace('"', "\\\\\"")
+56                .replace('\r', "\\\\r")
+57                .replace('\t', "\\\\t"),
+58        })
+59        .collect::<Vec<_>>();
+60    yul::Object {
+61        name: obj.name,
+62        code: obj.code,
+63        objects: obj
+64            .objects
+65            .into_iter()
+66            .map(normalize_object)
+67            .collect::<Vec<_>>(),
+68        data,
+69    }
+70}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/legalize/body.rs.html b/compiler-docs/src/fe_codegen/yul/legalize/body.rs.html new file mode 100644 index 0000000000..5e7d94a1e8 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/legalize/body.rs.html @@ -0,0 +1,219 @@ +body.rs - source

fe_codegen/yul/legalize/
body.rs

1use fe_mir::ir::{
+2    body_cursor::{BodyCursor, CursorLocation},
+3    inst::InstKind,
+4    value::AssignableValue,
+5    FunctionBody, Inst, InstId, TypeId, TypeKind, Value, ValueId,
+6};
+7
+8use crate::db::CodegenDb;
+9
+10use super::critical_edge::CriticalEdgeSplitter;
+11
+12pub fn legalize_func_body(db: &dyn CodegenDb, body: &mut FunctionBody) {
+13    CriticalEdgeSplitter::new().run(body);
+14    legalize_func_arg(db, body);
+15
+16    let mut cursor = BodyCursor::new_at_entry(body);
+17    loop {
+18        match cursor.loc() {
+19            CursorLocation::BlockTop(_) | CursorLocation::BlockBottom(_) => cursor.proceed(),
+20            CursorLocation::Inst(inst) => {
+21                legalize_inst(db, &mut cursor, inst);
+22            }
+23            CursorLocation::NoWhere => break,
+24        }
+25    }
+26}
+27
+28fn legalize_func_arg(db: &dyn CodegenDb, body: &mut FunctionBody) {
+29    for value in body.store.func_args_mut() {
+30        let ty = value.ty();
+31        if ty.is_contract(db.upcast()) {
+32            let slot_ptr = make_storage_ptr(db, ty);
+33            *value = slot_ptr;
+34        } else if (ty.is_aggregate(db.upcast()) || ty.is_string(db.upcast()))
+35            && !ty.is_zero_sized(db.upcast())
+36        {
+37            change_ty(value, ty.make_mptr(db.upcast()))
+38        }
+39    }
+40}
+41
+42fn legalize_inst(db: &dyn CodegenDb, cursor: &mut BodyCursor, inst: InstId) {
+43    if legalize_unit_construct(db, cursor, inst) {
+44        return;
+45    }
+46    legalize_declared_ty(db, cursor.body_mut(), inst);
+47    legalize_inst_arg(db, cursor.body_mut(), inst);
+48    legalize_inst_result(db, cursor.body_mut(), inst);
+49    cursor.proceed();
+50}
+51
+52fn legalize_unit_construct(db: &dyn CodegenDb, cursor: &mut BodyCursor, inst: InstId) -> bool {
+53    let should_remove = match &cursor.body().store.inst_data(inst).kind {
+54        InstKind::Declare { local } => is_value_zst(db, cursor.body(), *local),
+55        InstKind::AggregateConstruct { ty, .. } => ty.deref(db.upcast()).is_zero_sized(db.upcast()),
+56        InstKind::AggregateAccess { .. } | InstKind::MapAccess { .. } | InstKind::Cast { .. } => {
+57            let result_value = cursor.body().store.inst_result(inst).unwrap();
+58            is_lvalue_zst(db, cursor.body(), result_value)
+59        }
+60
+61        _ => false,
+62    };
+63
+64    if should_remove {
+65        cursor.remove_inst()
+66    }
+67
+68    should_remove
+69}
+70
+71fn legalize_declared_ty(db: &dyn CodegenDb, body: &mut FunctionBody, inst_id: InstId) {
+72    let value = match &body.store.inst_data(inst_id).kind {
+73        InstKind::Declare { local } => *local,
+74        _ => return,
+75    };
+76
+77    let value_ty = body.store.value_ty(value);
+78    if value_ty.is_aggregate(db.upcast()) {
+79        let new_ty = value_ty.make_mptr(db.upcast());
+80        let value_data = body.store.value_data_mut(value);
+81        change_ty(value_data, new_ty)
+82    }
+83}
+84
+85fn legalize_inst_arg(db: &dyn CodegenDb, body: &mut FunctionBody, inst_id: InstId) {
+86    // Replace inst with dummy inst to avoid borrow checker complaining.
+87    let dummy_inst = Inst::nop();
+88    let mut inst = body.store.replace_inst(inst_id, dummy_inst);
+89
+90    for arg in inst.args() {
+91        let ty = body.store.value_ty(arg);
+92        if ty.is_string(db.upcast()) {
+93            let string_ptr = ty.make_mptr(db.upcast());
+94            change_ty(body.store.value_data_mut(arg), string_ptr)
+95        }
+96    }
+97
+98    match &mut inst.kind {
+99        InstKind::AggregateConstruct { args, .. } => {
+100            args.retain(|arg| !is_value_zst(db, body, *arg));
+101        }
+102
+103        InstKind::Call { args, .. } => {
+104            args.retain(|arg| !is_value_zst(db, body, *arg) && !is_value_contract(db, body, *arg))
+105        }
+106
+107        InstKind::Return { arg } => {
+108            if arg.map(|arg| is_value_zst(db, body, arg)).unwrap_or(false) {
+109                *arg = None;
+110            }
+111        }
+112
+113        InstKind::MapAccess { key: arg, .. } | InstKind::Emit { arg } => {
+114            let arg_ty = body.store.value_ty(*arg);
+115            if arg_ty.is_zero_sized(db.upcast()) {
+116                *arg = body.store.store_value(make_zst_ptr(db, arg_ty));
+117            }
+118        }
+119
+120        InstKind::Cast { value, to, .. } => {
+121            if to.is_aggregate(db.upcast()) && !to.is_zero_sized(db.upcast()) {
+122                let value_ty = body.store.value_ty(*value);
+123                if value_ty.is_mptr(db.upcast()) {
+124                    *to = to.make_mptr(db.upcast());
+125                } else if value_ty.is_sptr(db.upcast()) {
+126                    *to = to.make_sptr(db.upcast());
+127                } else {
+128                    unreachable!()
+129                }
+130            }
+131        }
+132
+133        _ => {}
+134    }
+135
+136    body.store.replace_inst(inst_id, inst);
+137}
+138
+139fn legalize_inst_result(db: &dyn CodegenDb, body: &mut FunctionBody, inst_id: InstId) {
+140    let result_value = if let Some(result) = body.store.inst_result(inst_id) {
+141        result
+142    } else {
+143        return;
+144    };
+145
+146    if is_lvalue_zst(db, body, result_value) {
+147        body.store.remove_inst_result(inst_id);
+148        return;
+149    };
+150
+151    let value_id = if let Some(value_id) = result_value.value_id() {
+152        value_id
+153    } else {
+154        return;
+155    };
+156    let result_ty = body.store.value_ty(value_id);
+157    let new_ty = if result_ty.is_aggregate(db.upcast()) || result_ty.is_string(db.upcast()) {
+158        match &body.store.inst_data(inst_id).kind {
+159            InstKind::AggregateAccess { value, .. } => {
+160                let value_ty = body.store.value_ty(*value);
+161                match &value_ty.data(db.upcast()).kind {
+162                    TypeKind::MPtr(..) => result_ty.make_mptr(db.upcast()),
+163                    // Note: All SPtr aggregate access results should be SPtr already
+164                    _ => unreachable!(),
+165                }
+166            }
+167            _ => result_ty.make_mptr(db.upcast()),
+168        }
+169    } else {
+170        return;
+171    };
+172
+173    let value = body.store.value_data_mut(value_id);
+174    change_ty(value, new_ty);
+175}
+176
+177fn change_ty(value: &mut Value, new_ty: TypeId) {
+178    match value {
+179        Value::Local(val) => val.ty = new_ty,
+180        Value::Immediate { ty, .. }
+181        | Value::Temporary { ty, .. }
+182        | Value::Unit { ty }
+183        | Value::Constant { ty, .. } => *ty = new_ty,
+184    }
+185}
+186
+187fn make_storage_ptr(db: &dyn CodegenDb, ty: TypeId) -> Value {
+188    debug_assert!(ty.is_contract(db.upcast()));
+189    let ty = ty.make_sptr(db.upcast());
+190
+191    Value::Immediate { imm: 0.into(), ty }
+192}
+193
+194fn make_zst_ptr(db: &dyn CodegenDb, ty: TypeId) -> Value {
+195    debug_assert!(ty.is_zero_sized(db.upcast()));
+196    let ty = ty.make_mptr(db.upcast());
+197
+198    Value::Immediate { imm: 0.into(), ty }
+199}
+200
+201/// Returns `true` if a value has a zero sized type.
+202fn is_value_zst(db: &dyn CodegenDb, body: &FunctionBody, value: ValueId) -> bool {
+203    body.store
+204        .value_ty(value)
+205        .deref(db.upcast())
+206        .is_zero_sized(db.upcast())
+207}
+208
+209fn is_value_contract(db: &dyn CodegenDb, body: &FunctionBody, value: ValueId) -> bool {
+210    let ty = body.store.value_ty(value);
+211    ty.deref(db.upcast()).is_contract(db.upcast())
+212}
+213
+214fn is_lvalue_zst(db: &dyn CodegenDb, body: &FunctionBody, lvalue: &AssignableValue) -> bool {
+215    lvalue
+216        .ty(db.upcast(), &body.store)
+217        .deref(db.upcast())
+218        .is_zero_sized(db.upcast())
+219}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/legalize/critical_edge.rs.html b/compiler-docs/src/fe_codegen/yul/legalize/critical_edge.rs.html new file mode 100644 index 0000000000..06f40680ec --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/legalize/critical_edge.rs.html @@ -0,0 +1,121 @@ +critical_edge.rs - source

fe_codegen/yul/legalize/
critical_edge.rs

1use fe_mir::{
+2    analysis::ControlFlowGraph,
+3    ir::{
+4        body_cursor::{BodyCursor, CursorLocation},
+5        inst::InstKind,
+6        BasicBlock, BasicBlockId, FunctionBody, Inst, InstId, SourceInfo,
+7    },
+8};
+9
+10#[derive(Debug)]
+11pub struct CriticalEdgeSplitter {
+12    critical_edges: Vec<CriticalEdge>,
+13}
+14
+15impl CriticalEdgeSplitter {
+16    pub fn new() -> Self {
+17        Self {
+18            critical_edges: Vec::default(),
+19        }
+20    }
+21
+22    pub fn run(&mut self, func: &mut FunctionBody) {
+23        let cfg = ControlFlowGraph::compute(func);
+24
+25        for block in cfg.post_order() {
+26            let terminator = func.order.terminator(&func.store, block).unwrap();
+27            self.add_critical_edges(terminator, func, &cfg);
+28        }
+29
+30        self.split_edges(func);
+31    }
+32
+33    fn add_critical_edges(
+34        &mut self,
+35        terminator: InstId,
+36        func: &FunctionBody,
+37        cfg: &ControlFlowGraph,
+38    ) {
+39        for to in func.store.branch_info(terminator).block_iter() {
+40            if cfg.preds(to).len() > 1 {
+41                self.critical_edges.push(CriticalEdge { terminator, to });
+42            }
+43        }
+44    }
+45
+46    fn split_edges(&mut self, func: &mut FunctionBody) {
+47        for edge in std::mem::take(&mut self.critical_edges) {
+48            let terminator = edge.terminator;
+49            let source_block = func.order.inst_block(terminator);
+50            let original_dest = edge.to;
+51
+52            // Create new block that contains only jump inst.
+53            let new_dest = func.store.store_block(BasicBlock {});
+54            let mut cursor = BodyCursor::new(func, CursorLocation::BlockTop(source_block));
+55            cursor.insert_block(new_dest);
+56            cursor.set_loc(CursorLocation::BlockTop(new_dest));
+57            cursor.store_and_insert_inst(Inst::new(
+58                InstKind::Jump {
+59                    dest: original_dest,
+60                },
+61                SourceInfo::dummy(),
+62            ));
+63
+64            // Rewrite branch destination to the new dest.
+65            func.store
+66                .rewrite_branch_dest(terminator, original_dest, new_dest);
+67        }
+68    }
+69}
+70
+71#[derive(Debug)]
+72struct CriticalEdge {
+73    terminator: InstId,
+74    to: BasicBlockId,
+75}
+76
+77#[cfg(test)]
+78mod tests {
+79    use fe_mir::ir::{body_builder::BodyBuilder, FunctionId, TypeId};
+80
+81    use super::*;
+82
+83    fn body_builder() -> BodyBuilder {
+84        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+85    }
+86
+87    #[test]
+88    fn critical_edge_remove() {
+89        let mut builder = body_builder();
+90        let lp_header = builder.make_block();
+91        let lp_body = builder.make_block();
+92        let exit = builder.make_block();
+93
+94        let dummy_ty = TypeId(0);
+95        let v0 = builder.make_imm_from_bool(false, dummy_ty);
+96        builder.branch(v0, lp_header, exit, SourceInfo::dummy());
+97
+98        builder.move_to_block(lp_header);
+99        builder.jump(lp_body, SourceInfo::dummy());
+100
+101        builder.move_to_block(lp_body);
+102        builder.branch(v0, lp_header, exit, SourceInfo::dummy());
+103
+104        builder.move_to_block(exit);
+105        builder.ret(v0, SourceInfo::dummy());
+106
+107        let mut func = builder.build();
+108        CriticalEdgeSplitter::new().run(&mut func);
+109        let cfg = ControlFlowGraph::compute(&func);
+110
+111        for &header_pred in cfg.preds(lp_header) {
+112            debug_assert_eq!(cfg.succs(header_pred).len(), 1);
+113            debug_assert_eq!(cfg.succs(header_pred)[0], lp_header);
+114        }
+115
+116        for &exit_pred in cfg.preds(exit) {
+117            debug_assert_eq!(cfg.succs(exit_pred).len(), 1);
+118            debug_assert_eq!(cfg.succs(exit_pred)[0], exit);
+119        }
+120    }
+121}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/legalize/mod.rs.html b/compiler-docs/src/fe_codegen/yul/legalize/mod.rs.html new file mode 100644 index 0000000000..d2cd3954fa --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/legalize/mod.rs.html @@ -0,0 +1,6 @@ +mod.rs - source

fe_codegen/yul/legalize/
mod.rs

1mod body;
+2mod critical_edge;
+3mod signature;
+4
+5pub use body::legalize_func_body;
+6pub use signature::legalize_func_signature;
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/legalize/signature.rs.html b/compiler-docs/src/fe_codegen/yul/legalize/signature.rs.html new file mode 100644 index 0000000000..f905aaeb5b --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/legalize/signature.rs.html @@ -0,0 +1,27 @@ +signature.rs - source

fe_codegen/yul/legalize/
signature.rs

1use fe_mir::ir::{FunctionSignature, TypeKind};
+2
+3use crate::db::CodegenDb;
+4
+5pub fn legalize_func_signature(db: &dyn CodegenDb, sig: &mut FunctionSignature) {
+6    // Remove param if the type is contract or zero-sized.
+7    let params = &mut sig.params;
+8    params.retain(|param| match param.ty.data(db.upcast()).kind {
+9        TypeKind::Contract(_) => false,
+10        _ => !param.ty.deref(db.upcast()).is_zero_sized(db.upcast()),
+11    });
+12
+13    // Legalize param types.
+14    for param in params.iter_mut() {
+15        param.ty = db.codegen_legalized_type(param.ty);
+16    }
+17
+18    if let Some(ret_ty) = sig.return_type {
+19        // Remove return type  if the type is contract or zero-sized.
+20        if ret_ty.is_contract(db.upcast()) || ret_ty.deref(db.upcast()).is_zero_sized(db.upcast()) {
+21            sig.return_type = None;
+22        } else {
+23            // Legalize param types.
+24            sig.return_type = Some(db.codegen_legalized_type(ret_ty));
+25        }
+26    }
+27}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/mod.rs.html b/compiler-docs/src/fe_codegen/yul/mod.rs.html new file mode 100644 index 0000000000..b2de24120a --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/mod.rs.html @@ -0,0 +1,26 @@ +mod.rs - source

fe_codegen/yul/
mod.rs

1use std::borrow::Cow;
+2
+3pub mod isel;
+4pub mod legalize;
+5pub mod runtime;
+6
+7mod slot_size;
+8
+9use yultsur::*;
+10
+11/// A helper struct to abstract ident and expr.
+12struct YulVariable<'a>(Cow<'a, str>);
+13
+14impl<'a> YulVariable<'a> {
+15    fn expr(&self) -> yul::Expression {
+16        identifier_expression! {(format!{"${}", self.0})}
+17    }
+18
+19    fn ident(&self) -> yul::Identifier {
+20        identifier! {(format!{"${}", self.0})}
+21    }
+22
+23    fn new(name: impl Into<Cow<'a, str>>) -> Self {
+24        Self(name.into())
+25    }
+26}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/abi.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/abi.rs.html new file mode 100644 index 0000000000..8955094478 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/abi.rs.html @@ -0,0 +1,950 @@ +abi.rs - source

fe_codegen/yul/runtime/
abi.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{
+4        runtime::{error_revert_numeric, make_ptr},
+5        slot_size::{yul_primitive_type, SLOT_SIZE},
+6        YulVariable,
+7    },
+8};
+9
+10use super::{AbiSrcLocation, DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+11
+12use fe_abi::types::AbiType;
+13use fe_mir::ir::{self, types::ArrayDef, TypeId, TypeKind};
+14use yultsur::*;
+15
+16pub(super) fn make_abi_encode_primitive_type(
+17    provider: &mut DefaultRuntimeProvider,
+18    db: &dyn CodegenDb,
+19    func_name: &str,
+20    legalized_ty: TypeId,
+21    is_dst_storage: bool,
+22) -> RuntimeFunction {
+23    let func_name = YulVariable::new(func_name);
+24    let src = YulVariable::new("src");
+25    let dst = YulVariable::new("dst");
+26    let enc_size = YulVariable::new("enc_size");
+27    let func_def = function_definition! {
+28        function [func_name.ident()]([src.ident()], [dst.ident()]) ->  [enc_size.ident()] {
+29            ([src.ident()] := [provider.primitive_cast(db, src.expr(), legalized_ty)])
+30            ([yul::Statement::Expression(provider.ptr_store(
+31                db,
+32                dst.expr(),
+33                src.expr(),
+34                make_ptr(db, yul_primitive_type(db), is_dst_storage),
+35            ))])
+36            ([enc_size.ident()] := 32)
+37        }
+38    };
+39
+40    RuntimeFunction::from_statement(func_def)
+41}
+42
+43pub(super) fn make_abi_encode_static_array_type(
+44    provider: &mut DefaultRuntimeProvider,
+45    db: &dyn CodegenDb,
+46    func_name: &str,
+47    legalized_ty: TypeId,
+48) -> RuntimeFunction {
+49    let is_dst_storage = legalized_ty.is_sptr(db.upcast());
+50    let deref_ty = legalized_ty.deref(db.upcast());
+51    let (elem_ty, len) = match &deref_ty.data(db.upcast()).kind {
+52        ir::TypeKind::Array(def) => (def.elem_ty, def.len),
+53        _ => unreachable!(),
+54    };
+55    let elem_abi_ty = db.codegen_abi_type(elem_ty);
+56    let elem_ptr_ty = make_ptr(db, elem_ty, false);
+57    let elem_ty_size = deref_ty.array_elem_size(db.upcast(), SLOT_SIZE);
+58
+59    let func_name = YulVariable::new(func_name);
+60    let src = YulVariable::new("src");
+61    let dst = YulVariable::new("dst");
+62    let enc_size = YulVariable::new("enc_size");
+63    let header_size = elem_abi_ty.header_size();
+64    let iter_count = literal_expression! {(len)};
+65
+66    let func = function_definition! {
+67         function [func_name.ident()]([src.ident()], [dst.ident()]) -> [enc_size.ident()] {
+68             (for {(let i := 0)} (lt(i, [iter_count])) {(i := (add(i, 1)))}
+69             {
+70
+71                 (pop([provider.abi_encode(db, src.expr(), dst.expr(), elem_ptr_ty, is_dst_storage)]))
+72                 ([src.ident()] := add([src.expr()], [literal_expression!{(elem_ty_size)}]))
+73                 ([dst.ident()] := add([dst.expr()], [literal_expression!{(header_size)}]))
+74             })
+75             ([enc_size.ident()] := [literal_expression! {(header_size * len)}])
+76         }
+77    };
+78
+79    RuntimeFunction::from_statement(func)
+80}
+81
+82pub(super) fn make_abi_encode_dynamic_array_type(
+83    provider: &mut DefaultRuntimeProvider,
+84    db: &dyn CodegenDb,
+85    func_name: &str,
+86    legalized_ty: TypeId,
+87) -> RuntimeFunction {
+88    let is_dst_storage = legalized_ty.is_sptr(db.upcast());
+89    let deref_ty = legalized_ty.deref(db.upcast());
+90    let (elem_ty, len) = match &deref_ty.data(db.upcast()).kind {
+91        ir::TypeKind::Array(def) => (def.elem_ty, def.len),
+92        _ => unreachable!(),
+93    };
+94    let elem_header_size = 32;
+95    let total_header_size = elem_header_size * len;
+96    let elem_ptr_ty = make_ptr(db, elem_ty, false);
+97    let elem_ty_size = deref_ty.array_elem_size(db.upcast(), SLOT_SIZE);
+98    let header_ty = make_ptr(db, yul_primitive_type(db), is_dst_storage);
+99
+100    let func_name = YulVariable::new(func_name);
+101    let src = YulVariable::new("src");
+102    let dst = YulVariable::new("dst");
+103    let header_ptr = YulVariable::new("header_ptr");
+104    let data_ptr = YulVariable::new("data_ptr");
+105    let enc_size = YulVariable::new("enc_size");
+106    let iter_count = literal_expression! {(len)};
+107
+108    let func = function_definition! {
+109         function [func_name.ident()]([src.ident()], [dst.ident()]) -> [enc_size.ident()] {
+110             (let [header_ptr.ident()] := [dst.expr()])
+111             (let [data_ptr.ident()] := add([dst.expr()], [literal_expression!{(total_header_size)}]))
+112             ([enc_size.ident()] := [literal_expression!{(total_header_size)}])
+113             (for {(let i := 0)} (lt(i, [iter_count])) {(i := (add(i, 1)))}
+114             {
+115
+116                ([yul::Statement::Expression(provider.ptr_store(db, header_ptr.expr(), enc_size.expr(), header_ty))])
+117                ([enc_size.ident()] := add([provider.abi_encode(db, src.expr(), data_ptr.expr(), elem_ptr_ty, is_dst_storage)], [enc_size.expr()]))
+118                ([header_ptr.ident()] := add([header_ptr.expr()], [literal_expression!{(elem_header_size)}]))
+119                ([data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+120                ([src.ident()] := add([src.expr()], [literal_expression!{(elem_ty_size)}]))
+121             })
+122         }
+123    };
+124
+125    RuntimeFunction::from_statement(func)
+126}
+127
+128pub(super) fn make_abi_encode_static_aggregate_type(
+129    provider: &mut DefaultRuntimeProvider,
+130    db: &dyn CodegenDb,
+131    func_name: &str,
+132    legalized_ty: TypeId,
+133    is_dst_storage: bool,
+134) -> RuntimeFunction {
+135    let func_name = YulVariable::new(func_name);
+136    let deref_ty = legalized_ty.deref(db.upcast());
+137    let src = YulVariable::new("src");
+138    let dst = YulVariable::new("dst");
+139    let enc_size = YulVariable::new("enc_size");
+140    let field_enc_size = YulVariable::new("field_enc_size");
+141    let mut body = vec![
+142        statement! {[enc_size.ident()] := 0 },
+143        statement! {let [field_enc_size.ident()] := 0 },
+144    ];
+145    let field_num = deref_ty.aggregate_field_num(db.upcast());
+146
+147    for idx in 0..field_num {
+148        let field_ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+149        let field_ty_ptr = make_ptr(db, field_ty, false);
+150        let field_offset = deref_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE);
+151        let src_offset = expression! { add([src.expr()], [literal_expression!{(field_offset)}]) };
+152        body.push(statement!{
+153            [field_enc_size.ident()] := [provider.abi_encode(db, src_offset, dst.expr(), field_ty_ptr, is_dst_storage)]
+154        });
+155        body.push(statement! {
+156            [enc_size.ident()] := add([enc_size.expr()], [field_enc_size.expr()])
+157        });
+158
+159        if idx < field_num - 1 {
+160            body.push(assignment! {[dst.ident()] :=  add([dst.expr()], [field_enc_size.expr()])});
+161        }
+162    }
+163
+164    let func_def = yul::FunctionDefinition {
+165        name: func_name.ident(),
+166        parameters: vec![src.ident(), dst.ident()],
+167        returns: vec![enc_size.ident()],
+168        block: yul::Block { statements: body },
+169    };
+170
+171    RuntimeFunction(func_def)
+172}
+173
+174pub(super) fn make_abi_encode_dynamic_aggregate_type(
+175    provider: &mut DefaultRuntimeProvider,
+176    db: &dyn CodegenDb,
+177    func_name: &str,
+178    legalized_ty: TypeId,
+179    is_dst_storage: bool,
+180) -> RuntimeFunction {
+181    let func_name = YulVariable::new(func_name);
+182    let is_src_storage = legalized_ty.is_sptr(db.upcast());
+183    let deref_ty = legalized_ty.deref(db.upcast());
+184    let field_num = deref_ty.aggregate_field_num(db.upcast());
+185
+186    let src = YulVariable::new("src");
+187    let dst = YulVariable::new("dst");
+188    let header_ptr = YulVariable::new("header_ptr");
+189    let enc_size = YulVariable::new("enc_size");
+190    let data_ptr = YulVariable::new("data_ptr");
+191
+192    let total_header_size = literal_expression! { ((0..field_num).fold(0, |acc, idx| {
+193        let ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+194        acc + db.codegen_abi_type(ty).header_size()
+195    })) };
+196    let mut body = statements! {
+197        (let [header_ptr.ident()] := [dst.expr()])
+198        ([enc_size.ident()] := [total_header_size])
+199        (let [data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+200    };
+201
+202    for idx in 0..field_num {
+203        let field_ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+204        let field_abi_ty = db.codegen_abi_type(field_ty);
+205        let field_offset =
+206            literal_expression! { (deref_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE)) };
+207        let field_ptr = expression! { add([src.expr()], [field_offset]) };
+208        let field_ptr_ty = make_ptr(db, field_ty, is_src_storage);
+209
+210        let stmts = if field_abi_ty.is_static() {
+211            statements! {
+212                (pop([provider.abi_encode(db, field_ptr, header_ptr.expr(), field_ptr_ty, is_dst_storage)]))
+213                ([header_ptr.ident()] := add([header_ptr.expr()], [literal_expression! {(field_abi_ty.header_size())}]))
+214            }
+215        } else {
+216            let header_ty = make_ptr(db, yul_primitive_type(db), is_dst_storage);
+217            statements! {
+218               ([yul::Statement::Expression(provider.ptr_store(db, header_ptr.expr(), enc_size.expr(), header_ty))])
+219               ([enc_size.ident()] := add([provider.abi_encode(db, field_ptr, data_ptr.expr(), field_ptr_ty, is_dst_storage)], [enc_size.expr()]))
+220               ([header_ptr.ident()] := add([header_ptr.expr()], 32))
+221               ([data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+222            }
+223        };
+224        body.extend_from_slice(&stmts);
+225    }
+226
+227    let func_def = yul::FunctionDefinition {
+228        name: func_name.ident(),
+229        parameters: vec![src.ident(), dst.ident()],
+230        returns: vec![enc_size.ident()],
+231        block: yul::Block { statements: body },
+232    };
+233
+234    RuntimeFunction(func_def)
+235}
+236
+237pub(super) fn make_abi_encode_string_type(
+238    provider: &mut DefaultRuntimeProvider,
+239    db: &dyn CodegenDb,
+240    func_name: &str,
+241    is_dst_storage: bool,
+242) -> RuntimeFunction {
+243    let func_name = YulVariable::new(func_name);
+244    let src = YulVariable::new("src");
+245    let dst = YulVariable::new("dst");
+246    let string_len = YulVariable::new("string_len");
+247    let enc_size = YulVariable::new("enc_size");
+248
+249    let func_def = function_definition! {
+250        function [func_name.ident()]([src.ident()], [dst.ident()]) -> [enc_size.ident()] {
+251            (let [string_len.ident()] := mload([src.expr()]))
+252            (let data_size := add(32, [string_len.expr()]))
+253            ([enc_size.ident()] := mul((div((add(data_size, 31)), 32)), 32))
+254            (let padding_word_ptr := add([dst.expr()], (sub([enc_size.expr()], 32))))
+255            (mstore(padding_word_ptr, 0))
+256            ([yul::Statement::Expression(provider.ptr_copy(db, src.expr(), dst.expr(), literal_expression!{data_size}, false, is_dst_storage))])
+257        }
+258    };
+259    RuntimeFunction::from_statement(func_def)
+260}
+261
+262pub(super) fn make_abi_encode_bytes_type(
+263    provider: &mut DefaultRuntimeProvider,
+264    db: &dyn CodegenDb,
+265    func_name: &str,
+266    len: usize,
+267    is_dst_storage: bool,
+268) -> RuntimeFunction {
+269    let func_name = YulVariable::new(func_name);
+270    let src = YulVariable::new("src");
+271    let dst = YulVariable::new("dst");
+272    let enc_size = YulVariable::new("enc_size");
+273    let dst_len_ty = make_ptr(db, yul_primitive_type(db), is_dst_storage);
+274
+275    let func_def = function_definition! {
+276        function [func_name.ident()]([src.ident()], [dst.ident()]) -> [enc_size.ident()] {
+277            ([enc_size.ident()] := [literal_expression!{ (ceil_32(32 + len)) }])
+278            (if (gt([enc_size.expr()], 0)) {
+279                (let padding_word_ptr := add([dst.expr()], (sub([enc_size.expr()], 32))))
+280                (mstore(padding_word_ptr, 0))
+281            })
+282            ([yul::Statement::Expression(provider.ptr_store(db, dst.expr(), literal_expression!{ (len) }, dst_len_ty))])
+283            ([dst.ident()] := add(32, [dst.expr()]))
+284            ([yul::Statement::Expression(provider.ptr_copy(db, src.expr(), dst.expr(), literal_expression!{(len)}, false, is_dst_storage))])
+285        }
+286    };
+287    RuntimeFunction::from_statement(func_def)
+288}
+289
+290pub(super) fn make_abi_encode_seq(
+291    provider: &mut DefaultRuntimeProvider,
+292    db: &dyn CodegenDb,
+293    func_name: &str,
+294    value_tys: &[TypeId],
+295    is_dst_storage: bool,
+296) -> RuntimeFunction {
+297    let func_name = YulVariable::new(func_name);
+298    let value_num = value_tys.len();
+299    let abi_tys: Vec<_> = value_tys
+300        .iter()
+301        .map(|ty| db.codegen_abi_type(ty.deref(db.upcast())))
+302        .collect();
+303    let dst = YulVariable::new("dst");
+304    let header_ptr = YulVariable::new("header_ptr");
+305    let enc_size = YulVariable::new("enc_size");
+306    let data_ptr = YulVariable::new("data_ptr");
+307    let values: Vec<_> = (0..value_num)
+308        .map(|idx| YulVariable::new(format!("value{idx}")))
+309        .collect();
+310
+311    let total_header_size =
+312        literal_expression! { (abi_tys.iter().fold(0, |acc, ty| acc + ty.header_size())) };
+313    let mut body = statements! {
+314        (let [header_ptr.ident()] := [dst.expr()])
+315        ([enc_size.ident()] := [total_header_size])
+316        (let [data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+317    };
+318
+319    for i in 0..value_num {
+320        let ty = value_tys[i];
+321        let abi_ty = &abi_tys[i];
+322        let value = &values[i];
+323        let stmts = if abi_ty.is_static() {
+324            statements! {
+325                (pop([provider.abi_encode(db, value.expr(), header_ptr.expr(), ty, is_dst_storage)]))
+326                ([header_ptr.ident()] := add([header_ptr.expr()], [literal_expression!{ (abi_ty.header_size()) }]))
+327            }
+328        } else {
+329            let header_ty = make_ptr(db, yul_primitive_type(db), is_dst_storage);
+330            statements! {
+331               ([yul::Statement::Expression(provider.ptr_store(db, header_ptr.expr(), enc_size.expr(), header_ty))])
+332               ([enc_size.ident()] := add([provider.abi_encode(db, value.expr(), data_ptr.expr(), ty, is_dst_storage)], [enc_size.expr()]))
+333               ([header_ptr.ident()] := add([header_ptr.expr()], 32))
+334               ([data_ptr.ident()] := add([dst.expr()], [enc_size.expr()]))
+335            }
+336        };
+337        body.extend_from_slice(&stmts);
+338    }
+339
+340    let mut parameters = vec![dst.ident()];
+341    for value in values {
+342        parameters.push(value.ident());
+343    }
+344
+345    let func_def = yul::FunctionDefinition {
+346        name: func_name.ident(),
+347        parameters,
+348        returns: vec![enc_size.ident()],
+349        block: yul::Block { statements: body },
+350    };
+351
+352    RuntimeFunction(func_def)
+353}
+354
+355pub(super) fn make_abi_decode(
+356    provider: &mut DefaultRuntimeProvider,
+357    db: &dyn CodegenDb,
+358    func_name: &str,
+359    types: &[TypeId],
+360    abi_loc: AbiSrcLocation,
+361) -> RuntimeFunction {
+362    let func_name = YulVariable::new(func_name);
+363    let header_size = types
+364        .iter()
+365        .fold(0, |acc, ty| acc + db.codegen_abi_type(*ty).header_size());
+366    let src = YulVariable::new("$src");
+367    let enc_size = YulVariable::new("$enc_size");
+368    let header_ptr = YulVariable::new("header_ptr");
+369    let data_offset = YulVariable::new("data_offset");
+370    let tmp_offset = YulVariable::new("tmp_offset");
+371    let returns: Vec<_> = (0..types.len())
+372        .map(|i| YulVariable::new(format!("$ret{i}")))
+373        .collect();
+374
+375    let abi_enc_size = abi_enc_size(db, types);
+376    let size_check = match abi_enc_size {
+377        AbiEncodingSize::Static(size) => statements! {
+378                (if (iszero((eq([enc_size.expr()], [literal_expression!{(size)}]))))
+379        {             [revert_with_invalid_abi_data(provider, db)]
+380                })
+381            },
+382        AbiEncodingSize::Bounded { min, max } => statements! {
+383            (if (or(
+384                (lt([enc_size.expr()], [literal_expression!{(min)}])),
+385                (gt([enc_size.expr()], [literal_expression!{(max)}]))
+386            )) {
+387                [revert_with_invalid_abi_data(provider, db)]
+388            })
+389        },
+390    };
+391
+392    let mut body = statements! {
+393        (let [header_ptr.ident()] := [src.expr()])
+394        (let [data_offset.ident()] :=  [literal_expression!{ (header_size) }])
+395        (let [tmp_offset.ident()] := 0)
+396    };
+397    for i in 0..returns.len() {
+398        let ret_value = &returns[i];
+399        let field_ty = types[i];
+400        let field_abi_ty = db.codegen_abi_type(field_ty.deref(db.upcast()));
+401        if field_abi_ty.is_static() {
+402            body.push(statement!{ [ret_value.ident()] := [provider.abi_decode_static(db, header_ptr.expr(), field_ty, abi_loc)] });
+403        } else {
+404            let identifiers = identifiers! {
+405                [ret_value.ident()]
+406                [tmp_offset.ident()]
+407            };
+408            body.push(yul::Statement::Assignment(yul::Assignment {
+409                identifiers,
+410                expression: provider.abi_decode_dynamic(
+411                    db,
+412                    expression! {add([src.expr()], [data_offset.expr()])},
+413                    field_ty,
+414                    abi_loc,
+415                ),
+416            }));
+417            body.push(statement! { ([data_offset.ident()] := add([data_offset.expr()], [tmp_offset.expr()])) });
+418        };
+419
+420        let field_header_size = literal_expression! { (field_abi_ty.header_size()) };
+421        body.push(
+422            statement! { [header_ptr.ident()] := add([header_ptr.expr()], [field_header_size]) },
+423        );
+424    }
+425
+426    let offset_check = match abi_enc_size {
+427        AbiEncodingSize::Static(_) => vec![],
+428        AbiEncodingSize::Bounded { .. } => statements! {
+429            (if (iszero((eq([enc_size.expr()], [data_offset.expr()])))) { [revert_with_invalid_abi_data(provider, db)] })
+430        },
+431    };
+432
+433    let returns: Vec<_> = returns.iter().map(YulVariable::ident).collect();
+434    let func_def = function_definition! {
+435        function [func_name.ident()]([src.ident()], [enc_size.ident()]) -> [returns...] {
+436            [size_check...]
+437            [body...]
+438            [offset_check...]
+439        }
+440    };
+441    RuntimeFunction::from_statement(func_def)
+442}
+443
+444impl DefaultRuntimeProvider {
+445    fn abi_decode_static(
+446        &mut self,
+447        db: &dyn CodegenDb,
+448        src: yul::Expression,
+449        ty: TypeId,
+450        abi_loc: AbiSrcLocation,
+451    ) -> yul::Expression {
+452        let ty = db.codegen_legalized_type(ty).deref(db.upcast());
+453        let abi_ty = db.codegen_abi_type(ty.deref(db.upcast()));
+454        debug_assert!(abi_ty.is_static());
+455
+456        let func_name_postfix = match abi_loc {
+457            AbiSrcLocation::CallData => "calldata",
+458            AbiSrcLocation::Memory => "memory",
+459        };
+460
+461        let args = vec![src];
+462        if ty.is_primitive(db.upcast()) {
+463            let name = format! {
+464                "$abi_decode_primitive_type_{}_from_{}",
+465                ty.0, func_name_postfix,
+466            };
+467            return self.create_then_call(&name, args, |provider| {
+468                make_abi_decode_primitive_type(provider, db, &name, ty, abi_loc)
+469            });
+470        }
+471
+472        let name = format! {
+473            "$abi_decode_static_aggregate_type_{}_from_{}",
+474            ty.0, func_name_postfix,
+475        };
+476        self.create_then_call(&name, args, |provider| {
+477            make_abi_decode_static_aggregate_type(provider, db, &name, ty, abi_loc)
+478        })
+479    }
+480
+481    fn abi_decode_dynamic(
+482        &mut self,
+483        db: &dyn CodegenDb,
+484        src: yul::Expression,
+485        ty: TypeId,
+486        abi_loc: AbiSrcLocation,
+487    ) -> yul::Expression {
+488        let ty = db.codegen_legalized_type(ty).deref(db.upcast());
+489        let abi_ty = db.codegen_abi_type(ty.deref(db.upcast()));
+490        debug_assert!(!abi_ty.is_static());
+491
+492        let func_name_postfix = match abi_loc {
+493            AbiSrcLocation::CallData => "calldata",
+494            AbiSrcLocation::Memory => "memory",
+495        };
+496
+497        let mut args = vec![src];
+498        match abi_ty {
+499            AbiType::String => {
+500                let len = match &ty.data(db.upcast()).kind {
+501                    TypeKind::String(len) => *len,
+502                    _ => unreachable!(),
+503                };
+504                args.push(literal_expression! {(len)});
+505                let name = format! {"$abi_decode_string_from_{func_name_postfix}"};
+506                self.create_then_call(&name, args, |provider| {
+507                    make_abi_decode_string_type(provider, db, &name, abi_loc)
+508                })
+509            }
+510
+511            AbiType::Bytes => {
+512                let len = match &ty.data(db.upcast()).kind {
+513                    TypeKind::Array(ArrayDef { len, .. }) => *len,
+514                    _ => unreachable!(),
+515                };
+516                args.push(literal_expression! {(len)});
+517                let name = format! {"$abi_decode_bytes_from_{func_name_postfix}"};
+518                self.create_then_call(&name, args, |provider| {
+519                    make_abi_decode_bytes_type(provider, db, &name, abi_loc)
+520                })
+521            }
+522
+523            AbiType::Array { .. } => {
+524                let name =
+525                    format! {"$abi_decode_dynamic_array_{}_from_{}", ty.0, func_name_postfix};
+526                self.create_then_call(&name, args, |provider| {
+527                    make_abi_decode_dynamic_elem_array_type(provider, db, &name, ty, abi_loc)
+528                })
+529            }
+530
+531            AbiType::Tuple(_) => {
+532                let name =
+533                    format! {"$abi_decode_dynamic_aggregate_{}_from_{}", ty.0, func_name_postfix};
+534                self.create_then_call(&name, args, |provider| {
+535                    make_abi_decode_dynamic_aggregate_type(provider, db, &name, ty, abi_loc)
+536                })
+537            }
+538
+539            _ => unreachable!(),
+540        }
+541    }
+542}
+543
+544fn make_abi_decode_primitive_type(
+545    provider: &mut DefaultRuntimeProvider,
+546    db: &dyn CodegenDb,
+547    func_name: &str,
+548    ty: TypeId,
+549    abi_loc: AbiSrcLocation,
+550) -> RuntimeFunction {
+551    debug_assert! {ty.is_primitive(db.upcast())}
+552    let func_name = YulVariable::new(func_name);
+553    let src = YulVariable::new("src");
+554    let ret = YulVariable::new("ret");
+555
+556    let decode = match abi_loc {
+557        AbiSrcLocation::CallData => {
+558            statement! { [ret.ident()] := calldataload([src.expr()]) }
+559        }
+560        AbiSrcLocation::Memory => {
+561            statement! { [ret.ident()] := mload([src.expr()]) }
+562        }
+563    };
+564
+565    let ty_size_bits = ty.size_of(db.upcast(), SLOT_SIZE) * 8;
+566    let validation = if ty_size_bits == 256 {
+567        statements! {}
+568    } else if ty.is_signed(db.upcast()) {
+569        let shift_num = literal_expression! { ( ty_size_bits - 1) };
+570        let tmp1 = YulVariable::new("tmp1");
+571        let tmp2 = YulVariable::new("tmp2");
+572        statements! {
+573            (let [tmp1.ident()] := iszero((shr([shift_num.clone()], [ret.expr()]))))
+574            (let [tmp2.ident()] := iszero((shr([shift_num], (not([ret.expr()]))))))
+575            (if (iszero((or([tmp1.expr()], [tmp2.expr()])))) {
+576                [revert_with_invalid_abi_data(provider, db)]
+577            })
+578        }
+579    } else {
+580        let shift_num = literal_expression! { ( ty_size_bits) };
+581        let tmp = YulVariable::new("tmp");
+582        statements! {
+583            (let [tmp.ident()] := iszero((shr([shift_num], [ret.expr()]))))
+584            (if (iszero([tmp.expr()])) {
+585                [revert_with_invalid_abi_data(provider, db)]
+586            })
+587        }
+588    };
+589
+590    let func = function_definition! {
+591            function [func_name.ident()]([src.ident()]) -> [ret.ident()] {
+592                ([decode])
+593                [validation...]
+594        }
+595    };
+596
+597    RuntimeFunction::from_statement(func)
+598}
+599
+600fn make_abi_decode_static_aggregate_type(
+601    provider: &mut DefaultRuntimeProvider,
+602    db: &dyn CodegenDb,
+603    func_name: &str,
+604    ty: TypeId,
+605    abi_loc: AbiSrcLocation,
+606) -> RuntimeFunction {
+607    debug_assert!(ty.is_aggregate(db.upcast()));
+608
+609    let func_name = YulVariable::new(func_name);
+610    let src = YulVariable::new("src");
+611    let ret = YulVariable::new("ret");
+612    let field_data = YulVariable::new("field_data");
+613    let type_size = literal_expression! { (ty.size_of(db.upcast(), SLOT_SIZE)) };
+614
+615    let mut body = statements! {
+616        (let [field_data.ident()] := 0)
+617        ([ret.ident()] := [provider.alloc(db, type_size)])
+618    };
+619
+620    let field_num = ty.aggregate_field_num(db.upcast());
+621    for idx in 0..field_num {
+622        let field_ty = ty.projection_ty_imm(db.upcast(), idx);
+623        let field_ty_size = field_ty.size_of(db.upcast(), SLOT_SIZE);
+624        body.push(statement! { [field_data.ident()] := [provider.abi_decode_static(db, src.expr(), field_ty, abi_loc)] });
+625
+626        let dst_offset =
+627            literal_expression! { (ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE)) };
+628        let field_ty_ptr = make_ptr(db, field_ty, false);
+629        if field_ty.is_primitive(db.upcast()) {
+630            body.push(yul::Statement::Expression(provider.ptr_store(
+631                db,
+632                expression! {add([ret.expr()], [dst_offset])},
+633                field_data.expr(),
+634                field_ty_ptr,
+635            )));
+636        } else {
+637            body.push(yul::Statement::Expression(provider.ptr_copy(
+638                db,
+639                field_data.expr(),
+640                expression! {add([ret.expr()], [dst_offset])},
+641                literal_expression! { (field_ty_size) },
+642                false,
+643                false,
+644            )));
+645        }
+646
+647        if idx < field_num - 1 {
+648            let abi_field_ty = db.codegen_abi_type(field_ty);
+649            let field_abi_ty_size = literal_expression! { (abi_field_ty.header_size()) };
+650            body.push(assignment! {[src.ident()] :=  add([src.expr()], [field_abi_ty_size])});
+651        }
+652    }
+653
+654    let func_def = yul::FunctionDefinition {
+655        name: func_name.ident(),
+656        parameters: vec![src.ident()],
+657        returns: vec![ret.ident()],
+658        block: yul::Block { statements: body },
+659    };
+660
+661    RuntimeFunction(func_def)
+662}
+663
+664fn make_abi_decode_string_type(
+665    provider: &mut DefaultRuntimeProvider,
+666    db: &dyn CodegenDb,
+667    func_name: &str,
+668    abi_loc: AbiSrcLocation,
+669) -> RuntimeFunction {
+670    let func_name = YulVariable::new(func_name);
+671    let src = YulVariable::new("src");
+672    let decoded_data = YulVariable::new("decoded_data");
+673    let decoded_size = YulVariable::new("decoded_size");
+674    let max_len = YulVariable::new("max_len");
+675    let string_size = YulVariable::new("string_size");
+676    let dst_size = YulVariable::new("dst_size");
+677    let end_word = YulVariable::new("end_word");
+678    let end_word_ptr = YulVariable::new("end_word_ptr");
+679    let padding_size_bits = YulVariable::new("padding_size_bits");
+680    let primitive_ty_ptr = make_ptr(db, yul_primitive_type(db), false);
+681
+682    let func = function_definition! {
+683        function [func_name.ident()]([src.ident()], [max_len.ident()]) -> [(vec![decoded_data.ident(), decoded_size.ident()])...] {
+684            (let string_len := [provider.abi_decode_static(db, src.expr(), primitive_ty_ptr, abi_loc)])
+685            (if (gt(string_len, [max_len.expr()])) { [revert_with_invalid_abi_data(provider, db)] } )
+686            (let [string_size.ident()] := add(string_len, 32))
+687            ([decoded_size.ident()] := mul((div((add([string_size.expr()], 31)), 32)), 32))
+688            (let [end_word_ptr.ident()] := sub((add([src.expr()], [decoded_size.expr()])), 32))
+689            (let [end_word.ident()] := [provider.abi_decode_static(db, end_word_ptr.expr(), primitive_ty_ptr, abi_loc)])
+690            (let [padding_size_bits.ident()] := mul((sub([decoded_size.expr()], [string_size.expr()])), 8))
+691            [(check_right_padding(provider, db, end_word.expr(), padding_size_bits.expr()))...]
+692            (let [dst_size.ident()] := add([max_len.expr()], 32))
+693            ([decoded_data.ident()] := [provider.alloc(db, dst_size.expr())])
+694            ([ptr_copy_decode(provider, db, src.expr(), decoded_data.expr(), string_size.expr(), abi_loc)])
+695        }
+696    };
+697
+698    RuntimeFunction::from_statement(func)
+699}
+700
+701fn make_abi_decode_bytes_type(
+702    provider: &mut DefaultRuntimeProvider,
+703    db: &dyn CodegenDb,
+704    func_name: &str,
+705    abi_loc: AbiSrcLocation,
+706) -> RuntimeFunction {
+707    let func_name = YulVariable::new(func_name);
+708    let src = YulVariable::new("src");
+709    let decoded_data = YulVariable::new("decoded_data");
+710    let decoded_size = YulVariable::new("decoded_size");
+711    let max_len = YulVariable::new("max_len");
+712    let bytes_size = YulVariable::new("bytes_size");
+713    let end_word = YulVariable::new("end_word");
+714    let end_word_ptr = YulVariable::new("end_word_ptr");
+715    let padding_size_bits = YulVariable::new("padding_size_bits");
+716    let primitive_ty_ptr = make_ptr(db, yul_primitive_type(db), false);
+717
+718    let func = function_definition! {
+719        function [func_name.ident()]([src.ident()], [max_len.ident()]) -> [(vec![decoded_data.ident(),decoded_size.ident()])...] {
+720            (let [bytes_size.ident()] := [provider.abi_decode_static(db, src.expr(), primitive_ty_ptr, abi_loc)])
+721            (if (iszero((eq([bytes_size.expr()], [max_len.expr()])))) { [revert_with_invalid_abi_data(provider, db)] } )
+722            ([src.ident()] := add([src.expr()], 32))
+723            (let padded_data_size := mul((div((add([bytes_size.expr()], 31)), 32)), 32))
+724            ([decoded_size.ident()] := add(padded_data_size, 32))
+725            (let [end_word_ptr.ident()] := sub((add([src.expr()], padded_data_size)), 32))
+726            (let [end_word.ident()] := [provider.abi_decode_static(db, end_word_ptr.expr(), primitive_ty_ptr, abi_loc)])
+727            (let [padding_size_bits.ident()] := mul((sub(padded_data_size, [bytes_size.expr()])), 8))
+728            [(check_right_padding(provider, db, end_word.expr(), padding_size_bits.expr()))...]
+729            ([decoded_data.ident()] := [provider.alloc(db, max_len.expr())])
+730            ([ptr_copy_decode(provider, db, src.expr(), decoded_data.expr(), bytes_size.expr(), abi_loc)])
+731        }
+732    };
+733
+734    RuntimeFunction::from_statement(func)
+735}
+736
+737fn make_abi_decode_dynamic_elem_array_type(
+738    provider: &mut DefaultRuntimeProvider,
+739    db: &dyn CodegenDb,
+740    func_name: &str,
+741    legalized_ty: TypeId,
+742    abi_loc: AbiSrcLocation,
+743) -> RuntimeFunction {
+744    let deref_ty = legalized_ty.deref(db.upcast());
+745    let (elem_ty, len) = match &deref_ty.data(db.upcast()).kind {
+746        ir::TypeKind::Array(def) => (def.elem_ty, def.len),
+747        _ => unreachable!(),
+748    };
+749    let elem_ty_size = literal_expression! { (deref_ty.array_elem_size(db.upcast(), SLOT_SIZE)) };
+750    let total_header_size = literal_expression! { (32 * len) };
+751    let iter_count = literal_expression! { (len) };
+752    let ret_size = literal_expression! { (deref_ty.size_of(db.upcast(), SLOT_SIZE)) };
+753
+754    let func_name = YulVariable::new(func_name);
+755    let src = YulVariable::new("src");
+756    let header_ptr = YulVariable::new("header_ptr");
+757    let data_ptr = YulVariable::new("data_ptr");
+758    let decoded_data = YulVariable::new("decoded_data");
+759    let decoded_size = YulVariable::new("decoded_size");
+760    let decoded_size_tmp = YulVariable::new("decoded_size_tmp");
+761    let ret_elem_ptr = YulVariable::new("ret_elem_ptr");
+762    let elem_data = YulVariable::new("elem_data");
+763
+764    let func = function_definition! {
+765        function [func_name.ident()]([src.ident()]) -> [decoded_data.ident()], [decoded_size.ident()] {
+766            ([decoded_data.ident()] := [provider.alloc(db, ret_size)])
+767            ([decoded_size.ident()] := [total_header_size])
+768            (let [decoded_size_tmp.ident()] := 0)
+769            (let [header_ptr.ident()] := [src.expr()])
+770            (let [data_ptr.ident()] := 0)
+771            (let [elem_data.ident()] := 0)
+772            (let [ret_elem_ptr.ident()] := [decoded_data.expr()])
+773
+774            (for {(let i := 0)} (lt(i, [iter_count])) {(i := (add(i, 1)))}
+775             {
+776                 ([data_ptr.ident()] := add([src.expr()], [provider.abi_decode_static(db, header_ptr.expr(), yul_primitive_type(db), abi_loc)]))
+777                 ([assignment! {[elem_data.ident()], [decoded_size_tmp.ident()] := [provider.abi_decode_dynamic(db, data_ptr.expr(), elem_ty, abi_loc)] }])
+778                 ([decoded_size.ident()] := add([decoded_size.expr()], [decoded_size_tmp.expr()]))
+779                 ([yul::Statement::Expression(provider.ptr_copy(db, elem_data.expr(), ret_elem_ptr.expr(), elem_ty_size.clone(), false, false))])
+780                 ([header_ptr.ident()] := add([header_ptr.expr()], 32))
+781                 ([ret_elem_ptr.ident()] := add([ret_elem_ptr.expr()], [elem_ty_size]))
+782             })
+783        }
+784    };
+785
+786    RuntimeFunction::from_statement(func)
+787}
+788
+789fn make_abi_decode_dynamic_aggregate_type(
+790    provider: &mut DefaultRuntimeProvider,
+791    db: &dyn CodegenDb,
+792    func_name: &str,
+793    legalized_ty: TypeId,
+794    abi_loc: AbiSrcLocation,
+795) -> RuntimeFunction {
+796    let deref_ty = legalized_ty.deref(db.upcast());
+797    let type_size = literal_expression! { (deref_ty.size_of(db.upcast(), SLOT_SIZE)) };
+798
+799    let func_name = YulVariable::new(func_name);
+800    let src = YulVariable::new("src");
+801    let header_ptr = YulVariable::new("header_ptr");
+802    let data_offset = YulVariable::new("data_offset");
+803    let decoded_data = YulVariable::new("decoded_data");
+804    let decoded_size = YulVariable::new("decoded_size");
+805    let decoded_size_tmp = YulVariable::new("decoded_size_tmp");
+806    let ret_field_ptr = YulVariable::new("ret_field_ptr");
+807    let field_data = YulVariable::new("field_data");
+808
+809    let mut body = statements! {
+810            ([decoded_data.ident()] := [provider.alloc(db, type_size)])
+811            ([decoded_size.ident()] := 0)
+812            (let [decoded_size_tmp.ident()] := 0)
+813            (let [header_ptr.ident()] := [src.expr()])
+814            (let [data_offset.ident()] := 0)
+815            (let [field_data.ident()] := 0)
+816            (let [ret_field_ptr.ident()] := 0)
+817    };
+818
+819    for i in 0..deref_ty.aggregate_field_num(db.upcast()) {
+820        let field_ty = deref_ty.projection_ty_imm(db.upcast(), i);
+821        let field_size = field_ty.size_of(db.upcast(), SLOT_SIZE);
+822        let field_abi_ty = db.codegen_abi_type(field_ty);
+823        let field_offset = deref_ty.aggregate_elem_offset(db.upcast(), i, SLOT_SIZE);
+824
+825        let decode_data = if field_abi_ty.is_static() {
+826            statements! {
+827                ([field_data.ident()] := [provider.abi_decode_static(db, header_ptr.expr(), field_ty, abi_loc)])
+828                ([decoded_size_tmp.ident()] := [literal_expression!{ (field_abi_ty.header_size()) }])
+829            }
+830        } else {
+831            statements! {
+832                ([data_offset.ident()] := [provider.abi_decode_static(db, header_ptr.expr(), yul_primitive_type(db), abi_loc)])
+833                ([assignment! {
+834                    [field_data.ident()], [decoded_size_tmp.ident()] :=
+835                    [provider.abi_decode_dynamic(
+836                        db,
+837                        expression!{ add([src.expr()], [data_offset.expr()]) },
+838                        field_ty,
+839                        abi_loc
+840                    )]
+841                }])
+842                ([decoded_size_tmp.ident()] := add([decoded_size_tmp.expr()], 32))
+843            }
+844        };
+845        body.extend_from_slice(&decode_data);
+846        body.push(assignment!{ [decoded_size.ident()] := add([decoded_size.expr()], [decoded_size_tmp.expr()]) });
+847
+848        body.push(assignment! { [ret_field_ptr.ident()] := add([decoded_data.expr()], [literal_expression!{ (field_offset) }])});
+849        let copy_to_ret = if field_ty.is_primitive(db.upcast()) {
+850            let field_ptr_ty = make_ptr(db, field_ty, false);
+851            yul::Statement::Expression(provider.ptr_store(
+852                db,
+853                ret_field_ptr.expr(),
+854                field_data.expr(),
+855                field_ptr_ty,
+856            ))
+857        } else {
+858            yul::Statement::Expression(provider.ptr_copy(
+859                db,
+860                field_data.expr(),
+861                ret_field_ptr.expr(),
+862                literal_expression! { (field_size) },
+863                false,
+864                false,
+865            ))
+866        };
+867        body.push(copy_to_ret);
+868
+869        let header_size = literal_expression! { (field_abi_ty.header_size()) };
+870        body.push(statement! {
+871            [header_ptr.ident()] := add([header_ptr.expr()], [header_size])
+872        });
+873    }
+874
+875    let func_def = yul::FunctionDefinition {
+876        name: func_name.ident(),
+877        parameters: vec![src.ident()],
+878        returns: vec![decoded_data.ident(), decoded_size.ident()],
+879        block: yul::Block { statements: body },
+880    };
+881
+882    RuntimeFunction(func_def)
+883}
+884
+885enum AbiEncodingSize {
+886    Static(usize),
+887    Bounded { min: usize, max: usize },
+888}
+889
+890fn abi_enc_size(db: &dyn CodegenDb, types: &[TypeId]) -> AbiEncodingSize {
+891    let mut min = 0;
+892    let mut max = 0;
+893    for &ty in types {
+894        let legalized_ty = db.codegen_legalized_type(ty);
+895        min += db.codegen_abi_type_minimum_size(legalized_ty);
+896        max += db.codegen_abi_type_maximum_size(legalized_ty);
+897    }
+898
+899    if min == max {
+900        AbiEncodingSize::Static(min)
+901    } else {
+902        AbiEncodingSize::Bounded { min, max }
+903    }
+904}
+905
+906fn revert_with_invalid_abi_data(
+907    provider: &mut dyn RuntimeProvider,
+908    db: &dyn CodegenDb,
+909) -> yul::Statement {
+910    const ERROR_INVALID_ABI_DATA: usize = 0x103;
+911    let error_code = literal_expression! { (ERROR_INVALID_ABI_DATA) };
+912    error_revert_numeric(provider, db, error_code)
+913}
+914
+915fn check_right_padding(
+916    provider: &mut dyn RuntimeProvider,
+917    db: &dyn CodegenDb,
+918    val: yul::Expression,
+919    size_bits: yul::Expression,
+920) -> Vec<yul::Statement> {
+921    statements! {
+922        (let bits_shifted := sub(256, [size_bits]))
+923        (let is_ok := iszero((shl(bits_shifted, [val]))))
+924        (if (iszero((is_ok))) {
+925            [revert_with_invalid_abi_data(provider, db)]
+926        })
+927    }
+928}
+929
+930fn ptr_copy_decode(
+931    provider: &mut DefaultRuntimeProvider,
+932    db: &dyn CodegenDb,
+933    src: yul::Expression,
+934    dst: yul::Expression,
+935    len: yul::Expression,
+936    loc: AbiSrcLocation,
+937) -> yul::Statement {
+938    match loc {
+939        AbiSrcLocation::CallData => {
+940            statement! { calldatacopy([dst], [src], [len]) }
+941        }
+942        AbiSrcLocation::Memory => {
+943            yul::Statement::Expression(provider.ptr_copy(db, src, dst, len, false, false))
+944        }
+945    }
+946}
+947
+948fn ceil_32(len: usize) -> usize {
+949    ((len + 31) / 32) * 32
+950}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/contract.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/contract.rs.html new file mode 100644 index 0000000000..c46f011fb8 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/contract.rs.html @@ -0,0 +1,127 @@ +contract.rs - source

fe_codegen/yul/runtime/
contract.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{runtime::AbiSrcLocation, YulVariable},
+4};
+5
+6use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+7
+8use fe_analyzer::namespace::items::ContractId;
+9use fe_mir::ir::{FunctionId, Type, TypeKind};
+10
+11use yultsur::*;
+12
+13pub(super) fn make_create(
+14    provider: &mut DefaultRuntimeProvider,
+15    db: &dyn CodegenDb,
+16    func_name: &str,
+17    contract: ContractId,
+18) -> RuntimeFunction {
+19    let func_name = YulVariable::new(func_name);
+20    let contract_symbol = literal_expression! {
+21        (format!(r#""{}""#, db.codegen_contract_deployer_symbol_name(contract)))
+22    };
+23
+24    let size = YulVariable::new("size");
+25    let value = YulVariable::new("value");
+26    let func = function_definition! {
+27        function [func_name.ident()]([value.ident()]) -> addr {
+28            (let [size.ident()] := datasize([contract_symbol.clone()]))
+29            (let mem_ptr := [provider.avail(db)])
+30            (let contract_ptr := dataoffset([contract_symbol]))
+31            (datacopy(mem_ptr, contract_ptr, [size.expr()]))
+32            (addr := create([value.expr()], mem_ptr, [size.expr()]))
+33        }
+34    };
+35
+36    RuntimeFunction::from_statement(func)
+37}
+38
+39pub(super) fn make_create2(
+40    provider: &mut DefaultRuntimeProvider,
+41    db: &dyn CodegenDb,
+42    func_name: &str,
+43    contract: ContractId,
+44) -> RuntimeFunction {
+45    let func_name = YulVariable::new(func_name);
+46    let contract_symbol = literal_expression! {
+47        (format!(r#""{}""#, db.codegen_contract_deployer_symbol_name(contract)))
+48    };
+49
+50    let size = YulVariable::new("size");
+51    let value = YulVariable::new("value");
+52    let func = function_definition! {
+53        function [func_name.ident()]([value.ident()], salt) -> addr {
+54            (let [size.ident()] := datasize([contract_symbol.clone()]))
+55            (let mem_ptr := [provider.avail(db)])
+56            (let contract_ptr := dataoffset([contract_symbol]))
+57            (datacopy(mem_ptr, contract_ptr, [size.expr()]))
+58            (addr := create2([value.expr()], mem_ptr, [size.expr()], salt))
+59        }
+60    };
+61
+62    RuntimeFunction::from_statement(func)
+63}
+64
+65pub(super) fn make_external_call(
+66    provider: &mut DefaultRuntimeProvider,
+67    db: &dyn CodegenDb,
+68    func_name: &str,
+69    function: FunctionId,
+70) -> RuntimeFunction {
+71    let func_name = YulVariable::new(func_name);
+72    let sig = db.codegen_legalized_signature(function);
+73    let param_num = sig.params.len();
+74
+75    let mut args = Vec::with_capacity(param_num);
+76    let mut arg_tys = Vec::with_capacity(param_num);
+77    for param in &sig.params {
+78        args.push(YulVariable::new(param.name.as_str()));
+79        arg_tys.push(param.ty);
+80    }
+81    let ret_ty = sig.return_type;
+82
+83    let func_addr = YulVariable::new("func_addr");
+84    let params: Vec<_> = args.iter().map(YulVariable::ident).collect();
+85    let params_expr: Vec<_> = args.iter().map(YulVariable::expr).collect();
+86    let input = YulVariable::new("input");
+87    let input_size = YulVariable::new("input_size");
+88    let output_size = YulVariable::new("output_size");
+89    let output = YulVariable::new("output");
+90
+91    let func_selector = literal_expression! { (format!{"0x{}", db.codegen_abi_function(function).selector().hex()}) };
+92    let selector_ty = db.mir_intern_type(Type::new(TypeKind::U32, None).into());
+93
+94    let mut body = statements! {
+95            (let [input.ident()] := [provider.avail(db)])
+96            [yul::Statement::Expression(provider.ptr_store(db, input.expr(), func_selector, selector_ty.make_mptr(db.upcast())))]
+97            (let [input_size.ident()] := add(4, [provider.abi_encode_seq(db, &params_expr, expression!{ add([input.expr()], 4) }, &arg_tys, false)]))
+98            (let [output.ident()] := add([provider.avail(db)], [input_size.expr()]))
+99            (let success := call((gas()), [func_addr.expr()], 0, [input.expr()], [input_size.expr()], 0, 0))
+100            (let [output_size.ident()] := returndatasize())
+101            (returndatacopy([output.expr()], 0, [output_size.expr()]))
+102            (if (iszero(success)) {
+103                (revert([output.expr()], [output_size.expr()]))
+104            })
+105    };
+106    let func = if let Some(ret_ty) = ret_ty {
+107        let ret = YulVariable::new("$ret");
+108        body.push(
+109            statement!{
+110                [ret.ident()] := [provider.abi_decode(db, output.expr(), output_size.expr(), &[ret_ty], AbiSrcLocation::Memory)]
+111            }
+112        );
+113        function_definition! {
+114            function [func_name.ident()]([func_addr.ident()], [params...]) -> [ret.ident()] {
+115                [body...]
+116            }
+117        }
+118    } else {
+119        function_definition! {
+120            function [func_name.ident()]([func_addr.ident()], [params...]) {
+121                [body...]
+122            }
+123        }
+124    };
+125
+126    RuntimeFunction::from_statement(func)
+127}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/data.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/data.rs.html new file mode 100644 index 0000000000..655e203b2a --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/data.rs.html @@ -0,0 +1,461 @@ +data.rs - source

fe_codegen/yul/runtime/
data.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{
+4        runtime::{make_ptr, BitMask},
+5        slot_size::{yul_primitive_type, SLOT_SIZE},
+6        YulVariable,
+7    },
+8};
+9
+10use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+11
+12use fe_mir::ir::{types::TupleDef, Type, TypeId, TypeKind};
+13
+14use yultsur::*;
+15
+16const HASH_SCRATCH_SPACE_START: usize = 0x00;
+17const HASH_SCRATCH_SPACE_SIZE: usize = 64;
+18const FREE_MEMORY_ADDRESS_STORE: usize = HASH_SCRATCH_SPACE_START + HASH_SCRATCH_SPACE_SIZE;
+19const FREE_MEMORY_START: usize = FREE_MEMORY_ADDRESS_STORE + 32;
+20
+21pub(super) fn make_alloc(func_name: &str) -> RuntimeFunction {
+22    let func_name = YulVariable::new(func_name);
+23    let free_address_ptr = literal_expression! {(FREE_MEMORY_ADDRESS_STORE)};
+24    let free_memory_start = literal_expression! {(FREE_MEMORY_START)};
+25    let func = function_definition! {
+26        function [func_name.ident()](size) -> ptr {
+27            (ptr := mload([free_address_ptr.clone()]))
+28            (if (eq(ptr, 0x00)) { (ptr := [free_memory_start]) })
+29            (mstore([free_address_ptr], (add(ptr, size))))
+30        }
+31    };
+32
+33    RuntimeFunction::from_statement(func)
+34}
+35
+36pub(super) fn make_avail(func_name: &str) -> RuntimeFunction {
+37    let func_name = YulVariable::new(func_name);
+38    let free_address_ptr = literal_expression! {(FREE_MEMORY_ADDRESS_STORE)};
+39    let free_memory_start = literal_expression! {(FREE_MEMORY_START)};
+40    let func = function_definition! {
+41        function [func_name.ident()]() -> ptr {
+42            (ptr := mload([free_address_ptr]))
+43            (if (eq(ptr, 0x00)) { (ptr := [free_memory_start]) })
+44        }
+45    };
+46
+47    RuntimeFunction::from_statement(func)
+48}
+49
+50pub(super) fn make_mcopym(func_name: &str) -> RuntimeFunction {
+51    let func_name = YulVariable::new(func_name);
+52    let src = YulVariable::new("src");
+53    let dst = YulVariable::new("dst");
+54    let size = YulVariable::new("size");
+55
+56    let func = function_definition! {
+57        function [func_name.ident()]([src.ident()], [dst.ident()], [size.ident()]) {
+58            (let iter_count := div([size.expr()], 32))
+59            (let original_src := [src.expr()])
+60            (for {(let i := 0)} (lt(i, iter_count)) {(i := (add(i, 1)))}
+61            {
+62                (mstore([dst.expr()], (mload([src.expr()]))))
+63                ([src.ident()] := add([src.expr()], 32))
+64                ([dst.ident()] := add([dst.expr()], 32))
+65            })
+66
+67            (let rem := sub([size.expr()], (sub([src.expr()], original_src))))
+68            (if (gt(rem, 0)) {
+69                (let rem_bits := mul(rem, 8))
+70                (let dst_mask := sub((shl((sub(256, rem_bits)), 1)), 1))
+71                (let src_mask := not(dst_mask))
+72                (let src_value := and((mload([src.expr()])), src_mask))
+73                (let dst_value := and((mload([dst.expr()])), dst_mask))
+74                (mstore([dst.expr()], (or(src_value, dst_value))))
+75            })
+76        }
+77    };
+78
+79    RuntimeFunction::from_statement(func)
+80}
+81
+82pub(super) fn make_mcopys(func_name: &str) -> RuntimeFunction {
+83    let func_name = YulVariable::new(func_name);
+84    let src = YulVariable::new("src");
+85    let dst = YulVariable::new("dst");
+86    let size = YulVariable::new("size");
+87
+88    let func = function_definition! {
+89        function [func_name.ident()]([src.ident()], [dst.ident()], [size.ident()]) {
+90            ([dst.ident()] := div([dst.expr()], 32))
+91            (let iter_count := div([size.expr()], 32))
+92            (let original_src := [src.expr()])
+93            (for {(let i := 0)} (lt(i, iter_count)) {(i := (add(i, 1)))}
+94            {
+95                (sstore([dst.expr()], (mload([src.expr()]))))
+96                ([src.ident()] := add([src.expr()], 32))
+97                ([dst.ident()] := add([dst.expr()], 1))
+98            })
+99
+100            (let rem := sub([size.expr()], (sub([src.expr()], original_src))))
+101            (if (gt(rem, 0)) {
+102                (let rem_bits := mul(rem, 8))
+103                (let dst_mask := sub((shl((sub(256, rem_bits)), 1)), 1))
+104                (let src_mask := not(dst_mask))
+105                (let src_value := and((mload([src.expr()])), src_mask))
+106                (let dst_value := and((sload([dst.expr()])), dst_mask))
+107                (sstore([dst.expr()], (or(src_value, dst_value))))
+108            })
+109        }
+110    };
+111
+112    RuntimeFunction::from_statement(func)
+113}
+114
+115pub(super) fn make_scopym(func_name: &str) -> RuntimeFunction {
+116    let func_name = YulVariable::new(func_name);
+117    let src = YulVariable::new("src");
+118    let dst = YulVariable::new("dst");
+119    let size = YulVariable::new("size");
+120
+121    let func = function_definition! {
+122        function [func_name.ident()]([src.ident()], [dst.ident()], [size.ident()]) {
+123            ([src.ident()] := div([src.expr()], 32))
+124            (let iter_count := div([size.expr()], 32))
+125            (let original_dst := [dst.expr()])
+126            (for {(let i := 0)} (lt(i, iter_count)) {(i := (add(i, 1)))}
+127            {
+128                (mstore([dst.expr()], (sload([src.expr()]))))
+129                ([src.ident()] := add([src.expr()], 1))
+130                ([dst.ident()] := add([dst.expr()], 32))
+131            })
+132
+133            (let rem := sub([size.expr()], (sub([dst.expr()], original_dst))))
+134            (if (gt(rem, 0)) {
+135                (let rem_bits := mul(rem, 8))
+136                (let dst_mask := sub((shl((sub(256, rem_bits)), 1)), 1))
+137                (let src_mask := not(dst_mask))
+138                (let src_value := and((sload([src.expr()])), src_mask))
+139                (let dst_value := and((mload([dst.expr()])), dst_mask))
+140                (mstore([dst.expr()], (or(src_value, dst_value))))
+141            })
+142        }
+143    };
+144
+145    RuntimeFunction::from_statement(func)
+146}
+147
+148pub(super) fn make_scopys(func_name: &str) -> RuntimeFunction {
+149    let func_name = YulVariable::new(func_name);
+150    let src = YulVariable::new("src");
+151    let dst = YulVariable::new("dst");
+152    let size = YulVariable::new("size");
+153    let func = function_definition! {
+154        function [func_name.ident()]([src.ident()], [dst.ident()], [size.ident()]) {
+155            ([src.ident()] := div([src.expr()], 32))
+156            ([dst.ident()] := div([dst.expr()], 32))
+157            (let iter_count := div((add([size.expr()], 31)), 32))
+158            (for {(let i := 0)} (lt(i, iter_count)) {(i := (add(i, 1)))}
+159            {
+160                (sstore([dst.expr()], (sload([src.expr()]))))
+161                ([src.ident()] := add([src.expr()], 1))
+162                ([dst.ident()] := add([dst.expr()], 1))
+163            })
+164        }
+165    };
+166
+167    RuntimeFunction::from_statement(func)
+168}
+169
+170pub(super) fn make_sptr_store(func_name: &str) -> RuntimeFunction {
+171    let func_name = YulVariable::new(func_name);
+172    let func = function_definition! {
+173        function [func_name.ident()](ptr, value, size_bits) {
+174            (let rem_bits := mul((mod(ptr, 32)), 8))
+175            (let shift_bits := sub(256, (add(rem_bits, size_bits))))
+176            (let mask := (shl(shift_bits, (sub((shl(size_bits, 1)), 1)))))
+177            (let inv_mask := not(mask))
+178            (let slot := div(ptr, 32))
+179            (let new_value := or((and((sload(slot)), inv_mask)), (and((shl(shift_bits, value)), mask))))
+180            (sstore(slot, new_value))
+181        }
+182    };
+183
+184    RuntimeFunction::from_statement(func)
+185}
+186
+187pub(super) fn make_mptr_store(func_name: &str) -> RuntimeFunction {
+188    let func_name = YulVariable::new(func_name);
+189    let func = function_definition! {
+190        function [func_name.ident()](ptr, value, shift_num, mask) {
+191            (value := shl(shift_num, value))
+192            (let ptr_value := and((mload(ptr)), mask))
+193            (value := or(value, ptr_value))
+194            (mstore(ptr, value))
+195        }
+196    };
+197
+198    RuntimeFunction::from_statement(func)
+199}
+200
+201pub(super) fn make_sptr_load(func_name: &str) -> RuntimeFunction {
+202    let func_name = YulVariable::new(func_name);
+203    let func = function_definition! {
+204        function [func_name.ident()](ptr, size_bits) -> ret {
+205            (let rem_bits := mul((mod(ptr, 32)), 8))
+206            (let shift_num := sub(256, (add(rem_bits, size_bits))))
+207            (let slot := div(ptr, 32))
+208            (ret := shr(shift_num, (sload(slot))))
+209        }
+210    };
+211
+212    RuntimeFunction::from_statement(func)
+213}
+214
+215pub(super) fn make_mptr_load(func_name: &str) -> RuntimeFunction {
+216    let func_name = YulVariable::new(func_name);
+217    let func = function_definition! {
+218        function [func_name.ident()](ptr, shift_num) -> ret {
+219            (ret := shr(shift_num, (mload(ptr))))
+220        }
+221    };
+222
+223    RuntimeFunction::from_statement(func)
+224}
+225
+226// TODO: We can optimize aggregate initialization by combining multiple
+227// `ptr_store` operations into single `ptr_store` operation.
+228pub(super) fn make_aggregate_init(
+229    provider: &mut DefaultRuntimeProvider,
+230    db: &dyn CodegenDb,
+231    func_name: &str,
+232    legalized_ty: TypeId,
+233    arg_tys: Vec<TypeId>,
+234) -> RuntimeFunction {
+235    debug_assert!(legalized_ty.is_ptr(db.upcast()));
+236    let is_sptr = legalized_ty.is_sptr(db.upcast());
+237    let inner_ty = legalized_ty.deref(db.upcast());
+238    let ptr = YulVariable::new("ptr");
+239    let field_num = inner_ty.aggregate_field_num(db.upcast());
+240
+241    let iter_field_args = || (0..field_num).map(|i| YulVariable::new(format! {"arg{i}"}));
+242
+243    let mut body = vec![];
+244    for (idx, field_arg) in iter_field_args().enumerate() {
+245        let field_arg_ty = arg_tys[idx];
+246        let field_ty = inner_ty
+247            .projection_ty_imm(db.upcast(), idx)
+248            .deref(db.upcast());
+249        let field_ty_size = field_ty.size_of(db.upcast(), SLOT_SIZE);
+250        let field_ptr_ty = make_ptr(db, field_ty, is_sptr);
+251        let field_offset =
+252            literal_expression! {(inner_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE))};
+253
+254        let field_ptr = expression! { add([ptr.expr()], [field_offset] )};
+255        let copy_expr = if field_ty.is_aggregate(db.upcast()) || field_ty.is_string(db.upcast()) {
+256            // Call ptr copy function if field type is aggregate.
+257            debug_assert!(field_arg_ty.is_ptr(db.upcast()));
+258            provider.ptr_copy(
+259                db,
+260                field_arg.expr(),
+261                field_ptr,
+262                literal_expression! {(field_ty_size)},
+263                field_arg_ty.is_sptr(db.upcast()),
+264                is_sptr,
+265            )
+266        } else {
+267            // Call store function if field type is not aggregate.
+268            provider.ptr_store(db, field_ptr, field_arg.expr(), field_ptr_ty)
+269        };
+270        body.push(yul::Statement::Expression(copy_expr));
+271    }
+272
+273    let func_name = identifier! {(func_name)};
+274    let parameters = std::iter::once(ptr)
+275        .chain(iter_field_args())
+276        .map(|var| var.ident())
+277        .collect();
+278    let func_def = yul::FunctionDefinition {
+279        name: func_name,
+280        parameters,
+281        returns: vec![],
+282        block: yul::Block { statements: body },
+283    };
+284
+285    RuntimeFunction(func_def)
+286}
+287
+288pub(super) fn make_enum_init(
+289    provider: &mut DefaultRuntimeProvider,
+290    db: &dyn CodegenDb,
+291    func_name: &str,
+292    legalized_ty: TypeId,
+293    arg_tys: Vec<TypeId>,
+294) -> RuntimeFunction {
+295    debug_assert!(arg_tys.len() > 1);
+296
+297    let func_name = YulVariable::new(func_name);
+298    let is_sptr = legalized_ty.is_sptr(db.upcast());
+299    let ptr = YulVariable::new("ptr");
+300    let disc = YulVariable::new("disc");
+301    let disc_ty = arg_tys[0];
+302    let enum_data = || (0..arg_tys.len() - 1).map(|i| YulVariable::new(format! {"arg{i}"}));
+303
+304    let tuple_def = TupleDef {
+305        items: arg_tys
+306            .iter()
+307            .map(|ty| ty.deref(db.upcast()))
+308            .skip(1)
+309            .collect(),
+310    };
+311    let tuple_ty = db.mir_intern_type(
+312        Type {
+313            kind: TypeKind::Tuple(tuple_def),
+314            analyzer_ty: None,
+315        }
+316        .into(),
+317    );
+318    let data_ptr_ty = make_ptr(db, tuple_ty, is_sptr);
+319    let data_offset = legalized_ty
+320        .deref(db.upcast())
+321        .enum_data_offset(db.upcast(), SLOT_SIZE);
+322    let enum_data_init = statements! {
+323        [statement! {[ptr.ident()] := add([ptr.expr()], [literal_expression!{(data_offset)}])}]
+324        [yul::Statement::Expression(provider.aggregate_init(
+325        db,
+326        ptr.expr(),
+327        enum_data().map(|arg| arg.expr()).collect(),
+328        data_ptr_ty, arg_tys.iter().skip(1).copied().collect()))]
+329    };
+330
+331    let enum_data_args: Vec<_> = enum_data().map(|var| var.ident()).collect();
+332    let func_def = function_definition! {
+333        function [func_name.ident()]([ptr.ident()], [disc.ident()], [enum_data_args...]) {
+334            [yul::Statement::Expression(provider.ptr_store(db, ptr.expr(), disc.expr(), make_ptr(db, disc_ty, is_sptr)))]
+335            [enum_data_init...]
+336        }
+337    };
+338    RuntimeFunction::from_statement(func_def)
+339}
+340
+341pub(super) fn make_string_copy(
+342    provider: &mut DefaultRuntimeProvider,
+343    db: &dyn CodegenDb,
+344    func_name: &str,
+345    data: &str,
+346    is_dst_storage: bool,
+347) -> RuntimeFunction {
+348    let func_name = YulVariable::new(func_name);
+349    let dst_ptr = YulVariable::new("dst_ptr");
+350    let symbol_name = literal_expression! { (format!(r#""{}""#, db.codegen_constant_string_symbol_name(data.to_string()))) };
+351
+352    let func = if is_dst_storage {
+353        let tmp_ptr = YulVariable::new("tmp_ptr");
+354        let data_size = YulVariable::new("data_size");
+355        function_definition! {
+356            function [func_name.ident()]([dst_ptr.ident()]) {
+357                (let [tmp_ptr.ident()] := [provider.avail(db)])
+358                (let data_offset := dataoffset([symbol_name.clone()]))
+359                (let [data_size.ident()] := datasize([symbol_name]))
+360                (let len_slot := div([dst_ptr.expr()], 32))
+361                (sstore(len_slot, [data_size.expr()]))
+362                (datacopy([tmp_ptr.expr()], data_offset, [data_size.expr()]))
+363                ([dst_ptr.ident()] := add([dst_ptr.expr()], 32))
+364                ([yul::Statement::Expression(
+365                    provider.ptr_copy(db, tmp_ptr.expr(), dst_ptr.expr(), data_size.expr(), false, true))
+366                ])
+367            }
+368        }
+369    } else {
+370        function_definition! {
+371            function [func_name.ident()]([dst_ptr.ident()]) {
+372                (let data_offset := dataoffset([symbol_name.clone()]))
+373                (let data_size := datasize([symbol_name]))
+374                (mstore([dst_ptr.expr()], data_size))
+375                ([dst_ptr.ident()] := add([dst_ptr.expr()], 32))
+376                (datacopy([dst_ptr.expr()], data_offset, data_size))
+377            }
+378        }
+379    };
+380
+381    RuntimeFunction::from_statement(func)
+382}
+383
+384pub(super) fn make_string_construct(
+385    provider: &mut DefaultRuntimeProvider,
+386    db: &dyn CodegenDb,
+387    func_name: &str,
+388    data: &str,
+389) -> RuntimeFunction {
+390    let func_name = YulVariable::new(func_name);
+391    let ptr_size = YulVariable::new("ptr_size");
+392    let string_ptr = YulVariable::new("string_ptr");
+393
+394    let func = function_definition! {
+395        function [func_name.ident()]([ptr_size.ident()]) -> [string_ptr.ident()] {
+396            ([string_ptr.ident()] := [provider.alloc(db, ptr_size.expr())])
+397            ([yul::Statement::Expression(provider.string_copy(db, string_ptr.expr(), data, false))])
+398        }
+399    };
+400
+401    RuntimeFunction::from_statement(func)
+402}
+403
+404pub(super) fn make_map_value_ptr_with_primitive_key(
+405    provider: &mut DefaultRuntimeProvider,
+406    db: &dyn CodegenDb,
+407    func_name: &str,
+408    key_ty: TypeId,
+409) -> RuntimeFunction {
+410    debug_assert!(key_ty.is_primitive(db.upcast()));
+411    let scratch_space = literal_expression! {(HASH_SCRATCH_SPACE_START)};
+412    let scratch_size = literal_expression! {(HASH_SCRATCH_SPACE_SIZE)};
+413    let func_name = YulVariable::new(func_name);
+414    let map_ptr = YulVariable::new("map_ptr");
+415    let key = YulVariable::new("key");
+416    let yul_primitive_type = yul_primitive_type(db);
+417
+418    let mask = BitMask::new(1).not();
+419
+420    let func = function_definition! {
+421        function [func_name.ident()]([map_ptr.ident()], [key.ident()]) -> ret {
+422        ([yul::Statement::Expression(provider.ptr_store(
+423            db,
+424            scratch_space.clone(),
+425            key.expr(),
+426            yul_primitive_type.make_mptr(db.upcast()),
+427        ))])
+428        ([yul::Statement::Expression(provider.ptr_store(
+429            db,
+430            expression!(add([scratch_space.clone()], 32)),
+431            map_ptr.expr(),
+432            yul_primitive_type.make_mptr(db.upcast()),
+433        ))])
+434        (ret := and([mask.as_expr()], (keccak256([scratch_space], [scratch_size]))))
+435    }};
+436
+437    RuntimeFunction::from_statement(func)
+438}
+439
+440pub(super) fn make_map_value_ptr_with_ptr_key(
+441    provider: &mut DefaultRuntimeProvider,
+442    db: &dyn CodegenDb,
+443    func_name: &str,
+444    key_ty: TypeId,
+445) -> RuntimeFunction {
+446    debug_assert!(key_ty.is_ptr(db.upcast()));
+447
+448    let func_name = YulVariable::new(func_name);
+449    let size = literal_expression! {(key_ty.deref(db.upcast()).size_of(db.upcast(), SLOT_SIZE))};
+450    let map_ptr = YulVariable::new("map_ptr");
+451    let key = YulVariable::new("key");
+452
+453    let key_hash = expression! { keccak256([key.expr()], [size]) };
+454    let u256_ty = yul_primitive_type(db);
+455    let def = function_definition! {
+456        function [func_name.ident()]([map_ptr.ident()], [key.ident()]) -> ret {
+457            (ret := [provider.map_value_ptr(db, map_ptr.expr(), key_hash, u256_ty)])
+458        }
+459    };
+460    RuntimeFunction::from_statement(def)
+461}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/emit.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/emit.rs.html new file mode 100644 index 0000000000..5ba832877c --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/emit.rs.html @@ -0,0 +1,74 @@ +emit.rs - source

fe_codegen/yul/runtime/
emit.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{runtime::make_ptr, slot_size::SLOT_SIZE, YulVariable},
+4};
+5
+6use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+7
+8use fe_mir::ir::TypeId;
+9
+10use yultsur::*;
+11
+12pub(super) fn make_emit(
+13    provider: &mut DefaultRuntimeProvider,
+14    db: &dyn CodegenDb,
+15    func_name: &str,
+16    legalized_ty: TypeId,
+17) -> RuntimeFunction {
+18    let func_name = YulVariable::new(func_name);
+19    let event_ptr = YulVariable::new("event_ptr");
+20    let deref_ty = legalized_ty.deref(db.upcast());
+21
+22    let abi = db.codegen_abi_event(deref_ty);
+23    let mut topics = vec![literal_expression! {(format!("0x{}", abi.signature().hash_hex()))}];
+24    for (idx, field) in abi.inputs.iter().enumerate() {
+25        if !field.indexed {
+26            continue;
+27        }
+28        let field_ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+29        let offset =
+30            literal_expression! {(deref_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE))};
+31        let elem_ptr = expression! { add([event_ptr.expr()], [offset]) };
+32        let topic = if field_ty.is_aggregate(db.upcast()) {
+33            todo!()
+34        } else {
+35            let topic = provider.ptr_load(
+36                db,
+37                elem_ptr,
+38                make_ptr(db, field_ty, legalized_ty.is_sptr(db.upcast())),
+39            );
+40            provider.primitive_cast(db, topic, field_ty)
+41        };
+42
+43        topics.push(topic)
+44    }
+45
+46    let mut event_data_tys = vec![];
+47    let mut event_data_values = vec![];
+48    for (idx, field) in abi.inputs.iter().enumerate() {
+49        if field.indexed {
+50            continue;
+51        }
+52
+53        let field_ty = deref_ty.projection_ty_imm(db.upcast(), idx);
+54        let field_offset =
+55            literal_expression! { (deref_ty.aggregate_elem_offset(db.upcast(), idx, SLOT_SIZE)) };
+56        event_data_tys.push(make_ptr(db, field_ty, legalized_ty.is_sptr(db.upcast())));
+57        event_data_values.push(expression! { add([event_ptr.expr()], [field_offset]) });
+58    }
+59
+60    debug_assert!(topics.len() < 5);
+61    let log_func = identifier! { (format!("log{}", topics.len()))};
+62
+63    let event_data_ptr = YulVariable::new("event_data_ptr");
+64    let event_enc_size = YulVariable::new("event_enc_size");
+65    let func = function_definition! {
+66        function [func_name.ident()]([event_ptr.ident()]) {
+67            (let [event_data_ptr.ident()] := [provider.avail(db)])
+68            (let [event_enc_size.ident()] := [provider.abi_encode_seq(db, &event_data_values, event_data_ptr.expr(), &event_data_tys, false )])
+69            ([log_func]([event_data_ptr.expr()], [event_enc_size.expr()], [topics...]))
+70        }
+71    };
+72
+73    RuntimeFunction::from_statement(func)
+74}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/mod.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/mod.rs.html new file mode 100644 index 0000000000..3a3916b292 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/mod.rs.html @@ -0,0 +1,828 @@ +mod.rs - source

fe_codegen/yul/runtime/
mod.rs

1mod abi;
+2mod contract;
+3mod data;
+4mod emit;
+5mod revert;
+6mod safe_math;
+7
+8use std::fmt::Write;
+9
+10use fe_abi::types::AbiType;
+11use fe_analyzer::namespace::items::ContractId;
+12use fe_mir::ir::{types::ArrayDef, FunctionId, TypeId, TypeKind};
+13use indexmap::IndexMap;
+14use yultsur::*;
+15
+16use num_bigint::BigInt;
+17
+18use crate::{db::CodegenDb, yul::slot_size::SLOT_SIZE};
+19
+20use super::slot_size::yul_primitive_type;
+21
+22pub trait RuntimeProvider {
+23    fn collect_definitions(&self) -> Vec<yul::FunctionDefinition>;
+24
+25    fn alloc(&mut self, db: &dyn CodegenDb, size: yul::Expression) -> yul::Expression;
+26
+27    fn avail(&mut self, db: &dyn CodegenDb) -> yul::Expression;
+28
+29    fn create(
+30        &mut self,
+31        db: &dyn CodegenDb,
+32        contract: ContractId,
+33        value: yul::Expression,
+34    ) -> yul::Expression;
+35
+36    fn create2(
+37        &mut self,
+38        db: &dyn CodegenDb,
+39        contract: ContractId,
+40        value: yul::Expression,
+41        salt: yul::Expression,
+42    ) -> yul::Expression;
+43
+44    fn emit(
+45        &mut self,
+46        db: &dyn CodegenDb,
+47        event: yul::Expression,
+48        event_ty: TypeId,
+49    ) -> yul::Expression;
+50
+51    fn revert(
+52        &mut self,
+53        db: &dyn CodegenDb,
+54        arg: Option<yul::Expression>,
+55        arg_name: &str,
+56        arg_ty: TypeId,
+57    ) -> yul::Expression;
+58
+59    fn external_call(
+60        &mut self,
+61        db: &dyn CodegenDb,
+62        function: FunctionId,
+63        args: Vec<yul::Expression>,
+64    ) -> yul::Expression;
+65
+66    fn map_value_ptr(
+67        &mut self,
+68        db: &dyn CodegenDb,
+69        map_ptr: yul::Expression,
+70        key: yul::Expression,
+71        key_ty: TypeId,
+72    ) -> yul::Expression;
+73
+74    fn aggregate_init(
+75        &mut self,
+76        db: &dyn CodegenDb,
+77        ptr: yul::Expression,
+78        args: Vec<yul::Expression>,
+79        ptr_ty: TypeId,
+80        arg_tys: Vec<TypeId>,
+81    ) -> yul::Expression;
+82
+83    fn string_copy(
+84        &mut self,
+85        db: &dyn CodegenDb,
+86        dst: yul::Expression,
+87        data: &str,
+88        is_dst_storage: bool,
+89    ) -> yul::Expression;
+90
+91    fn string_construct(
+92        &mut self,
+93        db: &dyn CodegenDb,
+94        data: &str,
+95        string_len: usize,
+96    ) -> yul::Expression;
+97
+98    /// Copy data from `src` to `dst`.
+99    /// NOTE: src and dst must be aligned by 32 when a ptr is storage ptr.
+100    fn ptr_copy(
+101        &mut self,
+102        db: &dyn CodegenDb,
+103        src: yul::Expression,
+104        dst: yul::Expression,
+105        size: yul::Expression,
+106        is_src_storage: bool,
+107        is_dst_storage: bool,
+108    ) -> yul::Expression;
+109
+110    fn ptr_store(
+111        &mut self,
+112        db: &dyn CodegenDb,
+113        ptr: yul::Expression,
+114        imm: yul::Expression,
+115        ptr_ty: TypeId,
+116    ) -> yul::Expression;
+117
+118    fn ptr_load(
+119        &mut self,
+120        db: &dyn CodegenDb,
+121        ptr: yul::Expression,
+122        ptr_ty: TypeId,
+123    ) -> yul::Expression;
+124
+125    fn abi_encode(
+126        &mut self,
+127        db: &dyn CodegenDb,
+128        src: yul::Expression,
+129        dst: yul::Expression,
+130        src_ty: TypeId,
+131        is_dst_storage: bool,
+132    ) -> yul::Expression;
+133
+134    fn abi_encode_seq(
+135        &mut self,
+136        db: &dyn CodegenDb,
+137        src: &[yul::Expression],
+138        dst: yul::Expression,
+139        src_tys: &[TypeId],
+140        is_dst_storage: bool,
+141    ) -> yul::Expression;
+142
+143    fn abi_decode(
+144        &mut self,
+145        db: &dyn CodegenDb,
+146        src: yul::Expression,
+147        size: yul::Expression,
+148        types: &[TypeId],
+149        abi_loc: AbiSrcLocation,
+150    ) -> yul::Expression;
+151
+152    fn primitive_cast(
+153        &mut self,
+154        db: &dyn CodegenDb,
+155        value: yul::Expression,
+156        from_ty: TypeId,
+157    ) -> yul::Expression {
+158        debug_assert!(from_ty.is_primitive(db.upcast()));
+159        let from_size = from_ty.size_of(db.upcast(), SLOT_SIZE);
+160
+161        if from_ty.is_signed(db.upcast()) {
+162            let significant = literal_expression! {(from_size-1)};
+163            expression! { signextend([significant], [value]) }
+164        } else {
+165            let mask = BitMask::new(from_size);
+166            expression! { and([value], [mask.as_expr()]) }
+167        }
+168    }
+169
+170    // TODO: The all functions below will be reimplemented in `std`.
+171    fn safe_add(
+172        &mut self,
+173        db: &dyn CodegenDb,
+174        lhs: yul::Expression,
+175        rhs: yul::Expression,
+176        ty: TypeId,
+177    ) -> yul::Expression;
+178
+179    fn safe_sub(
+180        &mut self,
+181        db: &dyn CodegenDb,
+182        lhs: yul::Expression,
+183        rhs: yul::Expression,
+184        ty: TypeId,
+185    ) -> yul::Expression;
+186
+187    fn safe_mul(
+188        &mut self,
+189        db: &dyn CodegenDb,
+190        lhs: yul::Expression,
+191        rhs: yul::Expression,
+192        ty: TypeId,
+193    ) -> yul::Expression;
+194
+195    fn safe_div(
+196        &mut self,
+197        db: &dyn CodegenDb,
+198        lhs: yul::Expression,
+199        rhs: yul::Expression,
+200        ty: TypeId,
+201    ) -> yul::Expression;
+202
+203    fn safe_mod(
+204        &mut self,
+205        db: &dyn CodegenDb,
+206        lhs: yul::Expression,
+207        rhs: yul::Expression,
+208        ty: TypeId,
+209    ) -> yul::Expression;
+210
+211    fn safe_pow(
+212        &mut self,
+213        db: &dyn CodegenDb,
+214        lhs: yul::Expression,
+215        rhs: yul::Expression,
+216        ty: TypeId,
+217    ) -> yul::Expression;
+218}
+219
+220#[derive(Clone, Copy, Debug)]
+221pub enum AbiSrcLocation {
+222    CallData,
+223    Memory,
+224}
+225
+226#[derive(Debug, Default)]
+227pub struct DefaultRuntimeProvider {
+228    functions: IndexMap<String, RuntimeFunction>,
+229}
+230
+231impl DefaultRuntimeProvider {
+232    fn create_then_call<F>(
+233        &mut self,
+234        name: &str,
+235        args: Vec<yul::Expression>,
+236        func_builder: F,
+237    ) -> yul::Expression
+238    where
+239        F: FnOnce(&mut Self) -> RuntimeFunction,
+240    {
+241        if let Some(func) = self.functions.get(name) {
+242            func.call(args)
+243        } else {
+244            let func = func_builder(self);
+245            let result = func.call(args);
+246            self.functions.insert(name.to_string(), func);
+247            result
+248        }
+249    }
+250}
+251
+252impl RuntimeProvider for DefaultRuntimeProvider {
+253    fn collect_definitions(&self) -> Vec<yul::FunctionDefinition> {
+254        self.functions
+255            .values()
+256            .map(RuntimeFunction::definition)
+257            .collect()
+258    }
+259
+260    fn alloc(&mut self, _db: &dyn CodegenDb, bytes: yul::Expression) -> yul::Expression {
+261        let name = "$alloc";
+262        let arg = vec![bytes];
+263        self.create_then_call(name, arg, |_| data::make_alloc(name))
+264    }
+265
+266    fn avail(&mut self, _db: &dyn CodegenDb) -> yul::Expression {
+267        let name = "$avail";
+268        let arg = vec![];
+269        self.create_then_call(name, arg, |_| data::make_avail(name))
+270    }
+271
+272    fn create(
+273        &mut self,
+274        db: &dyn CodegenDb,
+275        contract: ContractId,
+276        value: yul::Expression,
+277    ) -> yul::Expression {
+278        let name = format!("$create_{}", db.codegen_contract_symbol_name(contract));
+279        let arg = vec![value];
+280        self.create_then_call(&name, arg, |provider| {
+281            contract::make_create(provider, db, &name, contract)
+282        })
+283    }
+284
+285    fn create2(
+286        &mut self,
+287        db: &dyn CodegenDb,
+288        contract: ContractId,
+289        value: yul::Expression,
+290        salt: yul::Expression,
+291    ) -> yul::Expression {
+292        let name = format!("$create2_{}", db.codegen_contract_symbol_name(contract));
+293        let arg = vec![value, salt];
+294        self.create_then_call(&name, arg, |provider| {
+295            contract::make_create2(provider, db, &name, contract)
+296        })
+297    }
+298
+299    fn emit(
+300        &mut self,
+301        db: &dyn CodegenDb,
+302        event: yul::Expression,
+303        event_ty: TypeId,
+304    ) -> yul::Expression {
+305        let name = format!("$emit_{}", event_ty.0);
+306        let legalized_ty = db.codegen_legalized_type(event_ty);
+307        self.create_then_call(&name, vec![event], |provider| {
+308            emit::make_emit(provider, db, &name, legalized_ty)
+309        })
+310    }
+311
+312    fn revert(
+313        &mut self,
+314        db: &dyn CodegenDb,
+315        arg: Option<yul::Expression>,
+316        arg_name: &str,
+317        arg_ty: TypeId,
+318    ) -> yul::Expression {
+319        let func_name = format! {"$revert_{}_{}", arg_name, arg_ty.0};
+320        let args = match arg {
+321            Some(arg) => vec![arg],
+322            None => vec![],
+323        };
+324        self.create_then_call(&func_name, args, |provider| {
+325            revert::make_revert(provider, db, &func_name, arg_name, arg_ty)
+326        })
+327    }
+328
+329    fn external_call(
+330        &mut self,
+331        db: &dyn CodegenDb,
+332        function: FunctionId,
+333        args: Vec<yul::Expression>,
+334    ) -> yul::Expression {
+335        let name = format!(
+336            "$call_external__{}",
+337            db.codegen_function_symbol_name(function)
+338        );
+339        self.create_then_call(&name, args, |provider| {
+340            contract::make_external_call(provider, db, &name, function)
+341        })
+342    }
+343
+344    fn map_value_ptr(
+345        &mut self,
+346        db: &dyn CodegenDb,
+347        map_ptr: yul::Expression,
+348        key: yul::Expression,
+349        key_ty: TypeId,
+350    ) -> yul::Expression {
+351        if key_ty.is_primitive(db.upcast()) {
+352            let name = "$map_value_ptr_with_primitive_key";
+353            self.create_then_call(name, vec![map_ptr, key], |provider| {
+354                data::make_map_value_ptr_with_primitive_key(provider, db, name, key_ty)
+355            })
+356        } else if key_ty.is_mptr(db.upcast()) {
+357            let name = "$map_value_ptr_with_ptr_key";
+358            self.create_then_call(name, vec![map_ptr, key], |provider| {
+359                data::make_map_value_ptr_with_ptr_key(provider, db, name, key_ty)
+360            })
+361        } else {
+362            unreachable!()
+363        }
+364    }
+365
+366    fn aggregate_init(
+367        &mut self,
+368        db: &dyn CodegenDb,
+369        ptr: yul::Expression,
+370        mut args: Vec<yul::Expression>,
+371        ptr_ty: TypeId,
+372        arg_tys: Vec<TypeId>,
+373    ) -> yul::Expression {
+374        debug_assert!(ptr_ty.is_ptr(db.upcast()));
+375        let deref_ty = ptr_ty.deref(db.upcast());
+376
+377        // Handle unit enum variant.
+378        if args.len() == 1 && deref_ty.is_enum(db.upcast()) {
+379            let tag = args.pop().unwrap();
+380            let tag_ty = arg_tys[0];
+381            let is_sptr = ptr_ty.is_sptr(db.upcast());
+382            return self.ptr_store(db, ptr, tag, make_ptr(db, tag_ty, is_sptr));
+383        }
+384
+385        let deref_ty = ptr_ty.deref(db.upcast());
+386        let args = std::iter::once(ptr).chain(args).collect();
+387        let legalized_ty = db.codegen_legalized_type(ptr_ty);
+388        if deref_ty.is_enum(db.upcast()) {
+389            let mut name = format!("enum_init_{}", ptr_ty.0);
+390            for ty in &arg_tys {
+391                write!(&mut name, "_{}", ty.0).unwrap();
+392            }
+393            self.create_then_call(&name, args, |provider| {
+394                data::make_enum_init(provider, db, &name, legalized_ty, arg_tys)
+395            })
+396        } else {
+397            let name = format!("$aggregate_init_{}", ptr_ty.0);
+398            self.create_then_call(&name, args, |provider| {
+399                data::make_aggregate_init(provider, db, &name, legalized_ty, arg_tys)
+400            })
+401        }
+402    }
+403
+404    fn string_copy(
+405        &mut self,
+406        db: &dyn CodegenDb,
+407        dst: yul::Expression,
+408        data: &str,
+409        is_dst_storage: bool,
+410    ) -> yul::Expression {
+411        debug_assert!(data.is_ascii());
+412        let symbol_name = db.codegen_constant_string_symbol_name(data.to_string());
+413
+414        let name = if is_dst_storage {
+415            format!("$string_copy_{symbol_name}_storage")
+416        } else {
+417            format!("$string_copy_{symbol_name}_memory")
+418        };
+419
+420        self.create_then_call(&name, vec![dst], |provider| {
+421            data::make_string_copy(provider, db, &name, data, is_dst_storage)
+422        })
+423    }
+424
+425    fn string_construct(
+426        &mut self,
+427        db: &dyn CodegenDb,
+428        data: &str,
+429        string_len: usize,
+430    ) -> yul::Expression {
+431        debug_assert!(data.is_ascii());
+432        debug_assert!(string_len >= data.len());
+433        let symbol_name = db.codegen_constant_string_symbol_name(data.to_string());
+434
+435        let name = format!("$string_construct_{symbol_name}");
+436        let arg = literal_expression!((32 + string_len));
+437        self.create_then_call(&name, vec![arg], |provider| {
+438            data::make_string_construct(provider, db, &name, data)
+439        })
+440    }
+441
+442    fn ptr_copy(
+443        &mut self,
+444        _db: &dyn CodegenDb,
+445        src: yul::Expression,
+446        dst: yul::Expression,
+447        size: yul::Expression,
+448        is_src_storage: bool,
+449        is_dst_storage: bool,
+450    ) -> yul::Expression {
+451        let args = vec![src, dst, size];
+452        match (is_src_storage, is_dst_storage) {
+453            (true, true) => {
+454                let name = "scopys";
+455                self.create_then_call(name, args, |_| data::make_scopys(name))
+456            }
+457            (true, false) => {
+458                let name = "scopym";
+459                self.create_then_call(name, args, |_| data::make_scopym(name))
+460            }
+461            (false, true) => {
+462                let name = "mcopys";
+463                self.create_then_call(name, args, |_| data::make_mcopys(name))
+464            }
+465            (false, false) => {
+466                let name = "mcopym";
+467                self.create_then_call(name, args, |_| data::make_mcopym(name))
+468            }
+469        }
+470    }
+471
+472    fn ptr_store(
+473        &mut self,
+474        db: &dyn CodegenDb,
+475        ptr: yul::Expression,
+476        imm: yul::Expression,
+477        ptr_ty: TypeId,
+478    ) -> yul::Expression {
+479        debug_assert!(ptr_ty.is_ptr(db.upcast()));
+480        let size = ptr_ty.deref(db.upcast()).size_of(db.upcast(), SLOT_SIZE);
+481        debug_assert!(size <= 32);
+482
+483        let size_bits = size * 8;
+484        if ptr_ty.is_sptr(db.upcast()) {
+485            let name = "$sptr_store";
+486            let args = vec![ptr, imm, literal_expression! {(size_bits)}];
+487            self.create_then_call(name, args, |_| data::make_sptr_store(name))
+488        } else if ptr_ty.is_mptr(db.upcast()) {
+489            let name = "$mptr_store";
+490            let shift_num = literal_expression! {(256 - size_bits)};
+491            let mask = BitMask::new(32 - size);
+492            let args = vec![ptr, imm, shift_num, mask.as_expr()];
+493            self.create_then_call(name, args, |_| data::make_mptr_store(name))
+494        } else {
+495            unreachable!()
+496        }
+497    }
+498
+499    fn ptr_load(
+500        &mut self,
+501        db: &dyn CodegenDb,
+502        ptr: yul::Expression,
+503        ptr_ty: TypeId,
+504    ) -> yul::Expression {
+505        debug_assert!(ptr_ty.is_ptr(db.upcast()));
+506        let size = ptr_ty.deref(db.upcast()).size_of(db.upcast(), SLOT_SIZE);
+507        debug_assert!(size <= 32);
+508
+509        let size_bits = size * 8;
+510        if ptr_ty.is_sptr(db.upcast()) {
+511            let name = "$sptr_load";
+512            let args = vec![ptr, literal_expression! {(size_bits)}];
+513            self.create_then_call(name, args, |_| data::make_sptr_load(name))
+514        } else if ptr_ty.is_mptr(db.upcast()) {
+515            let name = "$mptr_load";
+516            let shift_num = literal_expression! {(256 - size_bits)};
+517            let args = vec![ptr, shift_num];
+518            self.create_then_call(name, args, |_| data::make_mptr_load(name))
+519        } else {
+520            unreachable!()
+521        }
+522    }
+523
+524    fn abi_encode(
+525        &mut self,
+526        db: &dyn CodegenDb,
+527        src: yul::Expression,
+528        dst: yul::Expression,
+529        src_ty: TypeId,
+530        is_dst_storage: bool,
+531    ) -> yul::Expression {
+532        let legalized_ty = db.codegen_legalized_type(src_ty);
+533        let args = vec![src.clone(), dst.clone()];
+534
+535        let func_name_postfix = if is_dst_storage { "storage" } else { "memory" };
+536
+537        if legalized_ty.is_primitive(db.upcast()) {
+538            let name = format!(
+539                "$abi_encode_primitive_type_{}_to_{}",
+540                src_ty.0, func_name_postfix
+541            );
+542            return self.create_then_call(&name, args, |provider| {
+543                abi::make_abi_encode_primitive_type(
+544                    provider,
+545                    db,
+546                    &name,
+547                    legalized_ty,
+548                    is_dst_storage,
+549                )
+550            });
+551        }
+552
+553        let deref_ty = legalized_ty.deref(db.upcast());
+554        let abi_ty = db.codegen_abi_type(deref_ty);
+555        match abi_ty {
+556            AbiType::UInt(_) | AbiType::Int(_) | AbiType::Bool | AbiType::Address => {
+557                let value = self.ptr_load(db, src, src_ty);
+558                let extended_value = self.primitive_cast(db, value, deref_ty);
+559                self.abi_encode(db, extended_value, dst, deref_ty, is_dst_storage)
+560            }
+561            AbiType::Array { elem_ty, .. } => {
+562                if elem_ty.is_static() {
+563                    let name = format!(
+564                        "$abi_encode_static_array_type_{}_to_{}",
+565                        src_ty.0, func_name_postfix
+566                    );
+567                    self.create_then_call(&name, args, |provider| {
+568                        abi::make_abi_encode_static_array_type(provider, db, &name, legalized_ty)
+569                    })
+570                } else {
+571                    let name = format! {
+572                       "$abi_encode_dynamic_array_type{}_to_{}", src_ty.0, func_name_postfix
+573                    };
+574                    self.create_then_call(&name, args, |provider| {
+575                        abi::make_abi_encode_dynamic_array_type(provider, db, &name, legalized_ty)
+576                    })
+577                }
+578            }
+579            AbiType::Tuple(_) => {
+580                if abi_ty.is_static() {
+581                    let name = format!(
+582                        "$abi_encode_static_aggregate_type_{}_to_{}",
+583                        src_ty.0, func_name_postfix
+584                    );
+585                    self.create_then_call(&name, args, |provider| {
+586                        abi::make_abi_encode_static_aggregate_type(
+587                            provider,
+588                            db,
+589                            &name,
+590                            legalized_ty,
+591                            is_dst_storage,
+592                        )
+593                    })
+594                } else {
+595                    let name = format!(
+596                        "$abi_encode_dynamic_aggregate_type_{}_to_{}",
+597                        src_ty.0, func_name_postfix
+598                    );
+599                    self.create_then_call(&name, args, |provider| {
+600                        abi::make_abi_encode_dynamic_aggregate_type(
+601                            provider,
+602                            db,
+603                            &name,
+604                            legalized_ty,
+605                            is_dst_storage,
+606                        )
+607                    })
+608                }
+609            }
+610            AbiType::Bytes => {
+611                let len = match &deref_ty.data(db.upcast()).kind {
+612                    TypeKind::Array(ArrayDef { len, .. }) => *len,
+613                    _ => unreachable!(),
+614                };
+615                let name = format! {"$abi_encode_bytes{len}_type_to_{func_name_postfix}"};
+616                self.create_then_call(&name, args, |provider| {
+617                    abi::make_abi_encode_bytes_type(provider, db, &name, len, is_dst_storage)
+618                })
+619            }
+620            AbiType::String => {
+621                let name = format! {"$abi_encode_string_type_to_{func_name_postfix}"};
+622                self.create_then_call(&name, args, |provider| {
+623                    abi::make_abi_encode_string_type(provider, db, &name, is_dst_storage)
+624                })
+625            }
+626            AbiType::Function => unreachable!(),
+627        }
+628    }
+629
+630    fn abi_encode_seq(
+631        &mut self,
+632        db: &dyn CodegenDb,
+633        src: &[yul::Expression],
+634        dst: yul::Expression,
+635        src_tys: &[TypeId],
+636        is_dst_storage: bool,
+637    ) -> yul::Expression {
+638        let mut name = "$abi_encode_value_seq".to_string();
+639        for ty in src_tys {
+640            write!(&mut name, "_{}", ty.0).unwrap();
+641        }
+642
+643        let mut args = vec![dst];
+644        args.extend(src.iter().cloned());
+645        self.create_then_call(&name, args, |provider| {
+646            abi::make_abi_encode_seq(provider, db, &name, src_tys, is_dst_storage)
+647        })
+648    }
+649
+650    fn abi_decode(
+651        &mut self,
+652        db: &dyn CodegenDb,
+653        src: yul::Expression,
+654        size: yul::Expression,
+655        types: &[TypeId],
+656        abi_loc: AbiSrcLocation,
+657    ) -> yul::Expression {
+658        let mut name = "$abi_decode".to_string();
+659        for ty in types {
+660            write!(name, "_{}", ty.0).unwrap();
+661        }
+662
+663        match abi_loc {
+664            AbiSrcLocation::CallData => write!(name, "_from_calldata").unwrap(),
+665            AbiSrcLocation::Memory => write!(name, "_from_memory").unwrap(),
+666        };
+667
+668        self.create_then_call(&name, vec![src, size], |provider| {
+669            abi::make_abi_decode(provider, db, &name, types, abi_loc)
+670        })
+671    }
+672
+673    fn safe_add(
+674        &mut self,
+675        db: &dyn CodegenDb,
+676        lhs: yul::Expression,
+677        rhs: yul::Expression,
+678        ty: TypeId,
+679    ) -> yul::Expression {
+680        debug_assert!(ty.is_integral(db.upcast()));
+681        safe_math::dispatch_safe_add(self, db, lhs, rhs, ty)
+682    }
+683
+684    fn safe_sub(
+685        &mut self,
+686        db: &dyn CodegenDb,
+687        lhs: yul::Expression,
+688        rhs: yul::Expression,
+689        ty: TypeId,
+690    ) -> yul::Expression {
+691        debug_assert!(ty.is_integral(db.upcast()));
+692        safe_math::dispatch_safe_sub(self, db, lhs, rhs, ty)
+693    }
+694
+695    fn safe_mul(
+696        &mut self,
+697        db: &dyn CodegenDb,
+698        lhs: yul::Expression,
+699        rhs: yul::Expression,
+700        ty: TypeId,
+701    ) -> yul::Expression {
+702        debug_assert!(ty.is_integral(db.upcast()));
+703        safe_math::dispatch_safe_mul(self, db, lhs, rhs, ty)
+704    }
+705
+706    fn safe_div(
+707        &mut self,
+708        db: &dyn CodegenDb,
+709        lhs: yul::Expression,
+710        rhs: yul::Expression,
+711        ty: TypeId,
+712    ) -> yul::Expression {
+713        debug_assert!(ty.is_integral(db.upcast()));
+714        safe_math::dispatch_safe_div(self, db, lhs, rhs, ty)
+715    }
+716
+717    fn safe_mod(
+718        &mut self,
+719        db: &dyn CodegenDb,
+720        lhs: yul::Expression,
+721        rhs: yul::Expression,
+722        ty: TypeId,
+723    ) -> yul::Expression {
+724        debug_assert!(ty.is_integral(db.upcast()));
+725        safe_math::dispatch_safe_mod(self, db, lhs, rhs, ty)
+726    }
+727
+728    fn safe_pow(
+729        &mut self,
+730        db: &dyn CodegenDb,
+731        lhs: yul::Expression,
+732        rhs: yul::Expression,
+733        ty: TypeId,
+734    ) -> yul::Expression {
+735        debug_assert!(ty.is_integral(db.upcast()));
+736        safe_math::dispatch_safe_pow(self, db, lhs, rhs, ty)
+737    }
+738}
+739
+740#[derive(Debug)]
+741struct RuntimeFunction(yul::FunctionDefinition);
+742
+743impl RuntimeFunction {
+744    fn arg_num(&self) -> usize {
+745        self.0.parameters.len()
+746    }
+747
+748    fn definition(&self) -> yul::FunctionDefinition {
+749        self.0.clone()
+750    }
+751
+752    /// # Panics
+753    /// Panics if a number of arguments doesn't match the definition.
+754    fn call(&self, args: Vec<yul::Expression>) -> yul::Expression {
+755        debug_assert_eq!(self.arg_num(), args.len());
+756
+757        yul::Expression::FunctionCall(yul::FunctionCall {
+758            identifier: self.0.name.clone(),
+759            arguments: args,
+760        })
+761    }
+762
+763    /// Remove this when `yultsur::function_definition!` becomes to return
+764    /// `FunctionDefinition`.
+765    fn from_statement(func: yul::Statement) -> Self {
+766        match func {
+767            yul::Statement::FunctionDefinition(def) => Self(def),
+768            _ => unreachable!(),
+769        }
+770    }
+771}
+772
+773fn make_ptr(db: &dyn CodegenDb, inner: TypeId, is_sptr: bool) -> TypeId {
+774    if is_sptr {
+775        inner.make_sptr(db.upcast())
+776    } else {
+777        inner.make_mptr(db.upcast())
+778    }
+779}
+780
+781struct BitMask(BigInt);
+782
+783impl BitMask {
+784    fn new(byte_size: usize) -> Self {
+785        debug_assert!(byte_size <= 32);
+786        let one: BigInt = 1usize.into();
+787        Self((one << (byte_size * 8)) - 1)
+788    }
+789
+790    fn not(&self) -> Self {
+791        // Bigint is variable length integer, so we need special handling for `not`
+792        // operation.
+793        let one: BigInt = 1usize.into();
+794        let u256_max = (one << 256) - 1;
+795        Self(u256_max ^ &self.0)
+796    }
+797
+798    fn as_expr(&self) -> yul::Expression {
+799        let mask = format!("{:#x}", self.0);
+800        literal_expression! {(mask)}
+801    }
+802}
+803
+804pub(super) fn error_revert_numeric(
+805    provider: &mut dyn RuntimeProvider,
+806    db: &dyn CodegenDb,
+807    error_code: yul::Expression,
+808) -> yul::Statement {
+809    yul::Statement::Expression(provider.revert(
+810        db,
+811        Some(error_code),
+812        "Error",
+813        yul_primitive_type(db),
+814    ))
+815}
+816
+817pub(super) fn panic_revert_numeric(
+818    provider: &mut dyn RuntimeProvider,
+819    db: &dyn CodegenDb,
+820    error_code: yul::Expression,
+821) -> yul::Statement {
+822    yul::Statement::Expression(provider.revert(
+823        db,
+824        Some(error_code),
+825        "Panic",
+826        yul_primitive_type(db),
+827    ))
+828}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/revert.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/revert.rs.html new file mode 100644 index 0000000000..999eacab98 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/revert.rs.html @@ -0,0 +1,90 @@ +revert.rs - source

fe_codegen/yul/runtime/
revert.rs

1use crate::{
+2    db::CodegenDb,
+3    yul::{slot_size::function_hash_type, YulVariable},
+4};
+5
+6use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+7
+8use fe_abi::function::{AbiFunction, AbiFunctionType, StateMutability};
+9use fe_mir::ir::{self, TypeId};
+10use yultsur::*;
+11
+12pub(super) fn make_revert(
+13    provider: &mut DefaultRuntimeProvider,
+14    db: &dyn CodegenDb,
+15    func_name: &str,
+16    arg_name: &str,
+17    arg_ty: TypeId,
+18) -> RuntimeFunction {
+19    let func_name = YulVariable::new(func_name);
+20    let arg = YulVariable::new("arg");
+21
+22    let abi_size = YulVariable::new("abi_size");
+23    let abi_tmp_ptr = YulVariable::new("$abi_tmp_ptr");
+24    let signature = type_signature_for_revert(db, arg_name, arg_ty);
+25
+26    let signature_store = yul::Statement::Expression(provider.ptr_store(
+27        db,
+28        abi_tmp_ptr.expr(),
+29        signature,
+30        function_hash_type(db).make_mptr(db.upcast()),
+31    ));
+32
+33    let func = if arg_ty.deref(db.upcast()).is_zero_sized(db.upcast()) {
+34        function_definition! {
+35            function [func_name.ident()]() {
+36                (let [abi_tmp_ptr.ident()] := [provider.avail(db)])
+37                ([signature_store])
+38                (revert([abi_tmp_ptr.expr()], [literal_expression!{4}]))
+39            }
+40        }
+41    } else {
+42        let encode = provider.abi_encode_seq(
+43            db,
+44            &[arg.expr()],
+45            expression! { add([abi_tmp_ptr.expr()], 4) },
+46            &[arg_ty],
+47            false,
+48        );
+49
+50        function_definition! {
+51            function [func_name.ident()]([arg.ident()]) {
+52                (let [abi_tmp_ptr.ident()] := [provider.avail(db)])
+53                ([signature_store])
+54                (let [abi_size.ident()] := add([encode], 4))
+55                (revert([abi_tmp_ptr.expr()], [abi_size.expr()]))
+56            }
+57        }
+58    };
+59
+60    RuntimeFunction::from_statement(func)
+61}
+62
+63/// Returns signature hash of the type.
+64fn type_signature_for_revert(db: &dyn CodegenDb, name: &str, ty: TypeId) -> yul::Expression {
+65    let deref_ty = ty.deref(db.upcast());
+66    let ty_data = deref_ty.data(db.upcast());
+67    let args = match &ty_data.kind {
+68        ir::TypeKind::Struct(def) => def
+69            .fields
+70            .iter()
+71            .map(|(_, ty)| ("".to_string(), db.codegen_abi_type(*ty)))
+72            .collect(),
+73        _ => {
+74            let abi_ty = db.codegen_abi_type(deref_ty);
+75            vec![("_".to_string(), abi_ty)]
+76        }
+77    };
+78
+79    // selector and state mutability is independent we can set has_self and has_ctx any value.
+80    let selector = AbiFunction::new(
+81        AbiFunctionType::Function,
+82        name.to_string(),
+83        args,
+84        None,
+85        StateMutability::Pure,
+86    )
+87    .selector();
+88    let type_sig = selector.hex();
+89    literal_expression! {(format!{"0x{type_sig}" })}
+90}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/runtime/safe_math.rs.html b/compiler-docs/src/fe_codegen/yul/runtime/safe_math.rs.html new file mode 100644 index 0000000000..790e1eab49 --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/runtime/safe_math.rs.html @@ -0,0 +1,628 @@ +safe_math.rs - source

fe_codegen/yul/runtime/
safe_math.rs

1use crate::{db::CodegenDb, yul::YulVariable};
+2
+3use super::{DefaultRuntimeProvider, RuntimeFunction, RuntimeProvider};
+4
+5use fe_mir::ir::{TypeId, TypeKind};
+6
+7use yultsur::*;
+8
+9pub(super) fn dispatch_safe_add(
+10    provider: &mut DefaultRuntimeProvider,
+11    db: &dyn CodegenDb,
+12    lhs: yul::Expression,
+13    rhs: yul::Expression,
+14    ty: TypeId,
+15) -> yul::Expression {
+16    debug_assert!(ty.is_integral(db.upcast()));
+17    let min_value = get_min_value(db, ty);
+18    let max_value = get_max_value(db, ty);
+19
+20    if ty.is_signed(db.upcast()) {
+21        let name = "$safe_add_signed";
+22        let args = vec![lhs, rhs, min_value, max_value];
+23        provider.create_then_call(name, args, |provider| {
+24            make_safe_add_signed(provider, db, name)
+25        })
+26    } else {
+27        let name = "$safe_add_unsigned";
+28        let args = vec![lhs, rhs, max_value];
+29        provider.create_then_call(name, args, |provider| {
+30            make_safe_add_unsigned(provider, db, name)
+31        })
+32    }
+33}
+34
+35pub(super) fn dispatch_safe_sub(
+36    provider: &mut DefaultRuntimeProvider,
+37    db: &dyn CodegenDb,
+38    lhs: yul::Expression,
+39    rhs: yul::Expression,
+40    ty: TypeId,
+41) -> yul::Expression {
+42    debug_assert!(ty.is_integral(db.upcast()));
+43    let min_value = get_min_value(db, ty);
+44    let max_value = get_max_value(db, ty);
+45
+46    if ty.is_signed(db.upcast()) {
+47        let name = "$safe_sub_signed";
+48        let args = vec![lhs, rhs, min_value, max_value];
+49        provider.create_then_call(name, args, |provider| {
+50            make_safe_sub_signed(provider, db, name)
+51        })
+52    } else {
+53        let name = "$safe_sub_unsigned";
+54        let args = vec![lhs, rhs];
+55        provider.create_then_call(name, args, |provider| {
+56            make_safe_sub_unsigned(provider, db, name)
+57        })
+58    }
+59}
+60
+61pub(super) fn dispatch_safe_mul(
+62    provider: &mut DefaultRuntimeProvider,
+63    db: &dyn CodegenDb,
+64    lhs: yul::Expression,
+65    rhs: yul::Expression,
+66    ty: TypeId,
+67) -> yul::Expression {
+68    debug_assert!(ty.is_integral(db.upcast()));
+69    let min_value = get_min_value(db, ty);
+70    let max_value = get_max_value(db, ty);
+71
+72    if ty.is_signed(db.upcast()) {
+73        let name = "$safe_mul_signed";
+74        let args = vec![lhs, rhs, min_value, max_value];
+75        provider.create_then_call(name, args, |provider| {
+76            make_safe_mul_signed(provider, db, name)
+77        })
+78    } else {
+79        let name = "$safe_mul_unsigned";
+80        let args = vec![lhs, rhs, max_value];
+81        provider.create_then_call(name, args, |provider| {
+82            make_safe_mul_unsigned(provider, db, name)
+83        })
+84    }
+85}
+86
+87pub(super) fn dispatch_safe_div(
+88    provider: &mut DefaultRuntimeProvider,
+89    db: &dyn CodegenDb,
+90    lhs: yul::Expression,
+91    rhs: yul::Expression,
+92    ty: TypeId,
+93) -> yul::Expression {
+94    debug_assert!(ty.is_integral(db.upcast()));
+95    let min_value = get_min_value(db, ty);
+96
+97    if ty.is_signed(db.upcast()) {
+98        let name = "$safe_div_signed";
+99        let args = vec![lhs, rhs, min_value];
+100        provider.create_then_call(name, args, |provider| {
+101            make_safe_div_signed(provider, db, name)
+102        })
+103    } else {
+104        let name = "$safe_div_unsigned";
+105        let args = vec![lhs, rhs];
+106        provider.create_then_call(name, args, |provider| {
+107            make_safe_div_unsigned(provider, db, name)
+108        })
+109    }
+110}
+111
+112pub(super) fn dispatch_safe_mod(
+113    provider: &mut DefaultRuntimeProvider,
+114    db: &dyn CodegenDb,
+115    lhs: yul::Expression,
+116    rhs: yul::Expression,
+117    ty: TypeId,
+118) -> yul::Expression {
+119    debug_assert!(ty.is_integral(db.upcast()));
+120    if ty.is_signed(db.upcast()) {
+121        let name = "$safe_mod_signed";
+122        let args = vec![lhs, rhs];
+123        provider.create_then_call(name, args, |provider| {
+124            make_safe_mod_signed(provider, db, name)
+125        })
+126    } else {
+127        let name = "$safe_mod_unsigned";
+128        let args = vec![lhs, rhs];
+129        provider.create_then_call(name, args, |provider| {
+130            make_safe_mod_unsigned(provider, db, name)
+131        })
+132    }
+133}
+134
+135pub(super) fn dispatch_safe_pow(
+136    provider: &mut DefaultRuntimeProvider,
+137    db: &dyn CodegenDb,
+138    lhs: yul::Expression,
+139    rhs: yul::Expression,
+140    ty: TypeId,
+141) -> yul::Expression {
+142    debug_assert!(ty.is_integral(db.upcast()));
+143    let min_value = get_min_value(db, ty);
+144    let max_value = get_max_value(db, ty);
+145
+146    if ty.is_signed(db.upcast()) {
+147        let name = "$safe_pow_signed";
+148        let args = vec![lhs, rhs, min_value, max_value];
+149        provider.create_then_call(name, args, |provider| {
+150            make_safe_pow_signed(provider, db, name)
+151        })
+152    } else {
+153        let name = "$safe_pow_unsigned";
+154        let args = vec![lhs, rhs, max_value];
+155        provider.create_then_call(name, args, |provider| {
+156            make_safe_pow_unsigned(provider, db, name)
+157        })
+158    }
+159}
+160
+161fn make_safe_add_signed(
+162    provider: &mut DefaultRuntimeProvider,
+163    db: &dyn CodegenDb,
+164    func_name: &str,
+165) -> RuntimeFunction {
+166    let func_name = YulVariable::new(func_name);
+167    let lhs = YulVariable::new("$lhs");
+168    let rhs = YulVariable::new("$rhs");
+169    let min_value = YulVariable::new("$min_value");
+170    let max_value = YulVariable::new("$max_value");
+171    let ret = YulVariable::new("$ret");
+172
+173    let func = function_definition! {
+174        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [min_value.ident()], [max_value.ident()]) -> [ret.ident()] {
+175            (if (and((iszero((slt([lhs.expr()], 0)))), (sgt([rhs.expr()], (sub([max_value.expr()], [lhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+176            (if (and((slt([lhs.expr()], 0)), (slt([rhs.expr()], (sub([min_value.expr()], [lhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+177            ([ret.ident()] := add([lhs.expr()], [rhs.expr()]))
+178        }
+179    };
+180    RuntimeFunction::from_statement(func)
+181}
+182
+183fn make_safe_add_unsigned(
+184    provider: &mut DefaultRuntimeProvider,
+185    db: &dyn CodegenDb,
+186    func_name: &str,
+187) -> RuntimeFunction {
+188    let func_name = YulVariable::new(func_name);
+189    let lhs = YulVariable::new("$lhs");
+190    let rhs = YulVariable::new("$rhs");
+191    let max_value = YulVariable::new("$max_value");
+192    let ret = YulVariable::new("$ret");
+193
+194    let func = function_definition! {
+195        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [max_value.ident()]) -> [ret.ident()] {
+196            (if (gt([lhs.expr()], (sub([max_value.expr()], [rhs.expr()])))) { [revert_with_overflow(provider, db)] })
+197            ([ret.ident()] := add([lhs.expr()], [rhs.expr()]))
+198        }
+199    };
+200    RuntimeFunction::from_statement(func)
+201}
+202
+203fn make_safe_sub_signed(
+204    provider: &mut DefaultRuntimeProvider,
+205    db: &dyn CodegenDb,
+206    func_name: &str,
+207) -> RuntimeFunction {
+208    let func_name = YulVariable::new(func_name);
+209    let lhs = YulVariable::new("$lhs");
+210    let rhs = YulVariable::new("$rhs");
+211    let min_value = YulVariable::new("$min_value");
+212    let max_value = YulVariable::new("$max_value");
+213    let ret = YulVariable::new("$ret");
+214
+215    let func = function_definition! {
+216        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [min_value.ident()], [max_value.ident()]) -> [ret.ident()] {
+217            (if (and((iszero((slt([rhs.expr()], 0)))), (slt([lhs.expr()], (add([min_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+218            (if (and((slt([rhs.expr()], 0)), (sgt([lhs.expr()], (add([max_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+219            ([ret.ident()] := sub([lhs.expr()], [rhs.expr()]))
+220        }
+221    };
+222    RuntimeFunction::from_statement(func)
+223}
+224
+225fn make_safe_sub_unsigned(
+226    provider: &mut DefaultRuntimeProvider,
+227    db: &dyn CodegenDb,
+228    func_name: &str,
+229) -> RuntimeFunction {
+230    let func_name = YulVariable::new(func_name);
+231    let lhs = YulVariable::new("$lhs");
+232    let rhs = YulVariable::new("$rhs");
+233    let ret = YulVariable::new("$ret");
+234
+235    let func = function_definition! {
+236        function [func_name.ident()]([lhs.ident()], [rhs.ident()]) -> [ret.ident()] {
+237            (if (lt([lhs.expr()], [rhs.expr()])) { [revert_with_overflow(provider, db)] })
+238            ([ret.ident()] := sub([lhs.expr()], [rhs.expr()]))
+239        }
+240    };
+241    RuntimeFunction::from_statement(func)
+242}
+243
+244fn make_safe_mul_signed(
+245    provider: &mut DefaultRuntimeProvider,
+246    db: &dyn CodegenDb,
+247    func_name: &str,
+248) -> RuntimeFunction {
+249    let func_name = YulVariable::new(func_name);
+250    let lhs = YulVariable::new("$lhs");
+251    let rhs = YulVariable::new("$rhs");
+252    let min_value = YulVariable::new("$min_value");
+253    let max_value = YulVariable::new("$max_value");
+254    let ret = YulVariable::new("$ret");
+255
+256    let func = function_definition! {
+257        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [min_value.ident()], [max_value.ident()]) -> [ret.ident()] {
+258            // overflow, if lhs > 0, rhs > 0 and lhs > (max_value / rhs)
+259            (if (and((and((sgt([lhs.expr()], 0)), (sgt([rhs.expr()], 0)))), (gt([lhs.expr()], (div([max_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+260            // underflow, if lhs > 0, rhs < 0 and rhs < (min_value / lhs)
+261            (if (and((and((sgt([lhs.expr()], 0)), (slt([rhs.expr()], 0)))), (slt([rhs.expr()], (sdiv([min_value.expr()], [lhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+262            // underflow, if lhs < 0, rhs > 0 and lhs < (min_value / rhs)
+263            (if (and((and((slt([lhs.expr()], 0)), (sgt([rhs.expr()], 0)))), (slt([lhs.expr()], (sdiv([min_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+264            // overflow, if lhs < 0, rhs < 0 and lhs < (max_value / rhs)
+265            (if (and((and((slt([lhs.expr()], 0)), (slt([rhs.expr()], 0)))), (slt([lhs.expr()], (sdiv([max_value.expr()], [rhs.expr()])))))) { [revert_with_overflow(provider, db)] })
+266            ([ret.ident()] := mul([lhs.expr()], [rhs.expr()]))
+267        }
+268    };
+269    RuntimeFunction::from_statement(func)
+270}
+271
+272fn make_safe_mul_unsigned(
+273    provider: &mut DefaultRuntimeProvider,
+274    db: &dyn CodegenDb,
+275    func_name: &str,
+276) -> RuntimeFunction {
+277    let func_name = YulVariable::new(func_name);
+278    let lhs = YulVariable::new("$lhs");
+279    let rhs = YulVariable::new("$rhs");
+280    let max_value = YulVariable::new("$max_value");
+281    let ret = YulVariable::new("$ret");
+282
+283    let func = function_definition! {
+284        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [max_value.ident()]) -> [ret.ident()] {
+285            // overflow, if lhs != 0 and rhs > (max_value / lhs)
+286            (if (and((iszero((iszero([lhs.expr()])))), (gt([rhs.expr()], (div([max_value.expr()], [lhs.expr()])))))) { [revert_with_overflow(provider ,db)] })
+287            ([ret.ident()] := mul([lhs.expr()], [rhs.expr()]))
+288        }
+289    };
+290    RuntimeFunction::from_statement(func)
+291}
+292
+293fn make_safe_div_signed(
+294    provider: &mut DefaultRuntimeProvider,
+295    db: &dyn CodegenDb,
+296    func_name: &str,
+297) -> RuntimeFunction {
+298    let func_name = YulVariable::new(func_name);
+299    let lhs = YulVariable::new("$lhs");
+300    let rhs = YulVariable::new("$rhs");
+301    let min_value = YulVariable::new("$min_value");
+302    let ret = YulVariable::new("$ret");
+303
+304    let func = function_definition! {
+305        function [func_name.ident()]([lhs.ident()], [rhs.ident()], [min_value.ident()]) -> [ret.ident()] {
+306            (if (iszero([rhs.expr()])) { [revert_with_zero_division(provider, db)] })
+307            (if (and( (eq([lhs.expr()], [min_value.expr()])), (eq([rhs.expr()], (sub(0, 1))))) ) { [revert_with_overflow(provider, db)] })
+308            ([ret.ident()] := sdiv([lhs.expr()], [rhs.expr()]))
+309        }
+310    };
+311    RuntimeFunction::from_statement(func)
+312}
+313
+314fn make_safe_div_unsigned(
+315    provider: &mut DefaultRuntimeProvider,
+316    db: &dyn CodegenDb,
+317    func_name: &str,
+318) -> RuntimeFunction {
+319    let func_name = YulVariable::new(func_name);
+320    let lhs = YulVariable::new("$lhs");
+321    let rhs = YulVariable::new("$rhs");
+322    let ret = YulVariable::new("$ret");
+323
+324    let func = function_definition! {
+325        function [func_name.ident()]([lhs.ident()], [rhs.ident()]) -> [ret.ident()] {
+326            (if (iszero([rhs.expr()])) { [revert_with_zero_division(provider, db)] })
+327            ([ret.ident()] := div([lhs.expr()], [rhs.expr()]))
+328        }
+329    };
+330    RuntimeFunction::from_statement(func)
+331}
+332
+333fn make_safe_mod_signed(
+334    provider: &mut DefaultRuntimeProvider,
+335    db: &dyn CodegenDb,
+336    func_name: &str,
+337) -> RuntimeFunction {
+338    let func_name = YulVariable::new(func_name);
+339    let lhs = YulVariable::new("$lhs");
+340    let rhs = YulVariable::new("$rhs");
+341    let ret = YulVariable::new("$ret");
+342
+343    let func = function_definition! {
+344        function [func_name.ident()]([lhs.ident()], [rhs.ident()]) -> [ret.ident()] {
+345            (if (iszero([rhs.expr()])) { [revert_with_zero_division(provider, db)] })
+346            ([ret.ident()] := smod([lhs.expr()], [rhs.expr()]))
+347        }
+348    };
+349    RuntimeFunction::from_statement(func)
+350}
+351
+352fn make_safe_mod_unsigned(
+353    provider: &mut DefaultRuntimeProvider,
+354    db: &dyn CodegenDb,
+355    func_name: &str,
+356) -> RuntimeFunction {
+357    let func_name = YulVariable::new(func_name);
+358    let lhs = YulVariable::new("$lhs");
+359    let rhs = YulVariable::new("$rhs");
+360    let ret = YulVariable::new("$ret");
+361
+362    let func = function_definition! {
+363        function [func_name.ident()]([lhs.ident()], [rhs.ident()]) -> [ret.ident()] {
+364            (if (iszero([rhs.expr()])) { [revert_with_zero_division(provider, db)] })
+365            ([ret.ident()] := mod([lhs.expr()], [rhs.expr()]))
+366        }
+367    };
+368    RuntimeFunction::from_statement(func)
+369}
+370
+371const SAFE_POW_HELPER_NAME: &str = "safe_pow_helper";
+372
+373fn make_safe_pow_unsigned(
+374    provider: &mut DefaultRuntimeProvider,
+375    db: &dyn CodegenDb,
+376    func_name: &str,
+377) -> RuntimeFunction {
+378    let func_name = YulVariable::new(func_name);
+379    let base = YulVariable::new("base");
+380    let exponent = YulVariable::new("exponent");
+381    let max_value = YulVariable::new("max_value");
+382    let power = YulVariable::new("power");
+383
+384    let safe_pow_helper_call = yul::Statement::Assignment(yul::Assignment {
+385        identifiers: vec![base.ident(), power.ident()],
+386        expression: {
+387            let args = vec![
+388                base.expr(),
+389                exponent.expr(),
+390                literal_expression! {1},
+391                max_value.expr(),
+392            ];
+393            provider.create_then_call(SAFE_POW_HELPER_NAME, args, |provider| {
+394                make_safe_exp_helper(provider, db, SAFE_POW_HELPER_NAME)
+395            })
+396        },
+397    });
+398
+399    let func = function_definition! {
+400        function [func_name.ident()]([base.ident()], [exponent.ident()], [max_value.ident()]) -> [power.ident()] {
+401            // Currently, `leave` avoids this function being inlined.
+402            // YUL team is working on optimizer improvements to fix that.
+403
+404            // Note that 0**0 == 1
+405            (if (iszero([exponent.expr()])) {
+406                ([power.ident()] := 1 )
+407                (leave)
+408            })
+409            (if (iszero([base.expr()])) {
+410                ([power.ident()] := 0 )
+411                (leave)
+412            })
+413            // Specializations for small bases
+414            ([switch! {
+415                switch [base.expr()]
+416                // 0 is handled above
+417                (case 1 {
+418                    ([power.ident()] := 1 )
+419                    (leave)
+420                })
+421                (case 2 {
+422                    (if (gt([exponent.expr()], 255)) {
+423                        [revert_with_overflow(provider, db)]
+424                    })
+425                    ([power.ident()] := (exp(2, [exponent.expr()])))
+426                    (if (gt([power.expr()], [max_value.expr()])) {
+427                        [revert_with_overflow(provider, db)]
+428                    })
+429                    (leave)
+430                })
+431            }])
+432            (if (and((sgt([power.expr()], 0)), (gt([power.expr()], (div([max_value.expr()], [base.expr()])))))) { [revert_with_overflow(provider, db)] })
+433
+434            (if (or((and((lt([base.expr()], 11)), (lt([exponent.expr()], 78)))), (and((lt([base.expr()], 307)), (lt([exponent.expr()], 32)))))) {
+435                ([power.ident()] := (exp([base.expr()], [exponent.expr()])))
+436                (if (gt([power.expr()], [max_value.expr()])) {
+437                    [revert_with_overflow(provider, db)]
+438                })
+439                (leave)
+440            })
+441
+442            ([safe_pow_helper_call])
+443            (if (gt([power.expr()], (div([max_value.expr()], [base.expr()])))) {
+444                [revert_with_overflow(provider, db)]
+445            })
+446            ([power.ident()] := (mul([power.expr()], [base.expr()])))
+447        }
+448    };
+449    RuntimeFunction::from_statement(func)
+450}
+451
+452fn make_safe_pow_signed(
+453    provider: &mut DefaultRuntimeProvider,
+454    db: &dyn CodegenDb,
+455    func_name: &str,
+456) -> RuntimeFunction {
+457    let func_name = YulVariable::new(func_name);
+458    let base = YulVariable::new("base");
+459    let exponent = YulVariable::new("exponent");
+460    let min_value = YulVariable::new("min_value");
+461    let max_value = YulVariable::new("max_value");
+462    let power = YulVariable::new("power");
+463
+464    let safe_pow_helper_call = yul::Statement::Assignment(yul::Assignment {
+465        identifiers: vec![base.ident(), power.ident()],
+466        expression: {
+467            let args = vec![base.expr(), exponent.expr(), power.expr(), max_value.expr()];
+468            provider.create_then_call(SAFE_POW_HELPER_NAME, args, |provider| {
+469                make_safe_exp_helper(provider, db, SAFE_POW_HELPER_NAME)
+470            })
+471        },
+472    });
+473
+474    let func = function_definition! {
+475        function [func_name.ident()]([base.ident()], [exponent.ident()], [min_value.ident()], [max_value.ident()]) -> [power.ident()] {
+476            // Currently, `leave` avoids this function being inlined.
+477            // YUL team is working on optimizer improvements to fix that.
+478
+479            // Note that 0**0 == 1
+480            ([switch! {
+481                switch [exponent.expr()]
+482                (case 0 {
+483                    ([power.ident()] := 1 )
+484                    (leave)
+485                })
+486                (case 1 {
+487                    ([power.ident()] := [base.expr()] )
+488                    (leave)
+489                })
+490            }])
+491            (if (iszero([base.expr()])) {
+492                ([power.ident()] := 0 )
+493                (leave)
+494            })
+495            ([power.ident()] := 1 )
+496            // We pull out the first iteration because it is the only one in which
+497            // base can be negative.
+498            // Exponent is at least 2 here.
+499            // overflow check for base * base
+500            ([switch! {
+501                switch (sgt([base.expr()], 0))
+502                (case 1 {
+503                    (if (gt([base.expr()], (div([max_value.expr()], [base.expr()])))) {
+504                        [revert_with_overflow(provider, db)]
+505                    })
+506                })
+507                (case 0 {
+508                    (if (slt([base.expr()], (sdiv([max_value.expr()], [base.expr()])))) {
+509                        [revert_with_overflow(provider, db)]
+510                    })
+511                })
+512            }])
+513            (if (and([exponent.expr()], 1)) {
+514                ([power.ident()] := [base.expr()] )
+515            })
+516            ([base.ident()] := (mul([base.expr()], [base.expr()])))
+517            ([exponent.ident()] := shr(1, [exponent.expr()]))
+518            // // Below this point, base is always positive.
+519            ([safe_pow_helper_call]) // power = 1, base = 16 which is wrong
+520            (if (and((sgt([power.expr()], 0)), (gt([power.expr()], (div([max_value.expr()], [base.expr()])))))) { [revert_with_overflow(provider , db)] })
+521            (if (and((slt([power.expr()], 0)), (slt([power.expr()], (sdiv([min_value.expr()], [base.expr()])))))) { [revert_with_overflow(provider, db)] })
+522            ([power.ident()] := (mul([power.expr()], [base.expr()])))
+523        }
+524    };
+525    RuntimeFunction::from_statement(func)
+526}
+527
+528fn make_safe_exp_helper(
+529    provider: &mut DefaultRuntimeProvider,
+530    db: &dyn CodegenDb,
+531    func_name: &str,
+532) -> RuntimeFunction {
+533    let func_name = YulVariable::new(func_name);
+534    let base = YulVariable::new("base");
+535    let exponent = YulVariable::new("exponent");
+536    let power = YulVariable::new("power");
+537    let max_value = YulVariable::new("max_value");
+538    let ret_power = YulVariable::new("ret_power");
+539    let ret_base = YulVariable::new("ret_base");
+540
+541    let func = function_definition! {
+542        function [func_name.ident()]([base.ident()], [exponent.ident()], [power.ident()], [max_value.ident()])
+543            -> [(vec![ret_base.ident(), ret_power.ident()])...] {
+544            ([ret_base.ident()] := [base.expr()])
+545            ([ret_power.ident()] := [power.expr()])
+546            (for {} (gt([exponent.expr()], 1)) {}
+547                {
+548                    // overflow check for base * base
+549                    (if (gt([ret_base.expr()], (div([max_value.expr()], [ret_base.expr()])))) { [revert_with_overflow(provider, db)] })
+550                    (if (and([exponent.expr()], 1)) {
+551                        // No checks for power := mul(power, base) needed, because the check
+552                        // for base * base above is sufficient, since:
+553                        // |power| <= base (proof by induction) and thus:
+554                        // |power * base| <= base * base <= max <= |min| (for signed)
+555                        // (this is equally true for signed and unsigned exp)
+556                        ([ret_power.ident()] := (mul([ret_power.expr()], [ret_base.expr()])))
+557                    })
+558                    ([ret_base.ident()] := mul([ret_base.expr()], [ret_base.expr()]))
+559                    ([exponent.ident()] := shr(1, [exponent.expr()]))
+560                })
+561        }
+562    };
+563    RuntimeFunction::from_statement(func)
+564}
+565
+566fn revert_with_overflow(provider: &mut dyn RuntimeProvider, db: &dyn CodegenDb) -> yul::Statement {
+567    const PANIC_OVERFLOW: usize = 0x11;
+568
+569    super::panic_revert_numeric(provider, db, literal_expression! {(PANIC_OVERFLOW)})
+570}
+571
+572fn revert_with_zero_division(
+573    provider: &mut dyn RuntimeProvider,
+574    db: &dyn CodegenDb,
+575) -> yul::Statement {
+576    pub const PANIC_ZERO_DIVISION: usize = 0x12;
+577
+578    super::panic_revert_numeric(provider, db, literal_expression! {(PANIC_ZERO_DIVISION)})
+579}
+580
+581fn get_max_value(db: &dyn CodegenDb, ty: TypeId) -> yul::Expression {
+582    match &ty.data(db.upcast()).kind {
+583        TypeKind::I8 => literal_expression! {0x7f},
+584        TypeKind::I16 => literal_expression! {0x7fff},
+585        TypeKind::I32 => literal_expression! {0x7fffffff},
+586        TypeKind::I64 => literal_expression! {0x7fffffffffffffff},
+587        TypeKind::I128 => literal_expression! {0x7fffffffffffffffffffffffffffffff},
+588        TypeKind::I256 => {
+589            literal_expression! {0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff}
+590        }
+591        TypeKind::U8 => literal_expression! {0xff},
+592        TypeKind::U16 => literal_expression! {0xffff},
+593        TypeKind::U32 => literal_expression! {0xffffffff},
+594        TypeKind::U64 => literal_expression! {0xffffffffffffffff},
+595        TypeKind::U128 => literal_expression! {0xffffffffffffffffffffffffffffffff},
+596        TypeKind::U256 => {
+597            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff}
+598        }
+599        _ => unreachable!(),
+600    }
+601}
+602
+603fn get_min_value(db: &dyn CodegenDb, ty: TypeId) -> yul::Expression {
+604    debug_assert! {ty.is_integral(db.upcast())};
+605
+606    match &ty.data(db.upcast()).kind {
+607        TypeKind::I8 => {
+608            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80}
+609        }
+610        TypeKind::I16 => {
+611            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000}
+612        }
+613        TypeKind::I32 => {
+614            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000}
+615        }
+616        TypeKind::I64 => {
+617            literal_expression! {0xffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000}
+618        }
+619        TypeKind::I128 => {
+620            literal_expression! {0xffffffffffffffffffffffffffffffff80000000000000000000000000000000}
+621        }
+622        TypeKind::I256 => {
+623            literal_expression! {0x8000000000000000000000000000000000000000000000000000000000000000}
+624        }
+625
+626        _ => literal_expression! {0x0},
+627    }
+628}
\ No newline at end of file diff --git a/compiler-docs/src/fe_codegen/yul/slot_size.rs.html b/compiler-docs/src/fe_codegen/yul/slot_size.rs.html new file mode 100644 index 0000000000..907c4b0a6a --- /dev/null +++ b/compiler-docs/src/fe_codegen/yul/slot_size.rs.html @@ -0,0 +1,16 @@ +slot_size.rs - source

fe_codegen/yul/
slot_size.rs

1use fe_mir::ir::{Type, TypeId, TypeKind};
+2
+3use crate::db::CodegenDb;
+4
+5// We use the same slot size between memory and storage to simplify the
+6// implementation and minimize gas consumption in memory <-> storage copy
+7// instructions.
+8pub(crate) const SLOT_SIZE: usize = 32;
+9
+10pub(crate) fn yul_primitive_type(db: &dyn CodegenDb) -> TypeId {
+11    db.mir_intern_type(Type::new(TypeKind::U256, None).into())
+12}
+13
+14pub(crate) fn function_hash_type(db: &dyn CodegenDb) -> TypeId {
+15    db.mir_intern_type(Type::new(TypeKind::U32, None).into())
+16}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/db.rs.html b/compiler-docs/src/fe_common/db.rs.html new file mode 100644 index 0000000000..df2391a346 --- /dev/null +++ b/compiler-docs/src/fe_common/db.rs.html @@ -0,0 +1,49 @@ +db.rs - source

fe_common/
db.rs

1#![allow(clippy::arc_with_non_send_sync)]
+2use crate::files::{File, SourceFileId, Utf8Path};
+3use codespan_reporting as cs;
+4use salsa;
+5use smol_str::SmolStr;
+6use std::rc::Rc;
+7
+8pub trait Upcast<T: ?Sized> {
+9    fn upcast(&self) -> &T;
+10}
+11
+12pub trait UpcastMut<T: ?Sized> {
+13    fn upcast_mut(&mut self) -> &mut T;
+14}
+15
+16#[salsa::query_group(SourceDbStorage)]
+17pub trait SourceDb {
+18    #[salsa::interned]
+19    fn intern_file(&self, file: File) -> SourceFileId;
+20
+21    /// Set with `fn set_file_content(&mut self, file: SourceFileId, content: Rc<str>)
+22    #[salsa::input]
+23    fn file_content(&self, file: SourceFileId) -> Rc<str>;
+24
+25    #[salsa::invoke(file_line_starts_query)]
+26    fn file_line_starts(&self, file: SourceFileId) -> Rc<[usize]>;
+27
+28    #[salsa::invoke(file_name_query)]
+29    fn file_name(&self, file: SourceFileId) -> SmolStr;
+30}
+31
+32fn file_line_starts_query(db: &dyn SourceDb, file: SourceFileId) -> Rc<[usize]> {
+33    cs::files::line_starts(&file.content(db)).collect()
+34}
+35
+36fn file_name_query(db: &dyn SourceDb, file: SourceFileId) -> SmolStr {
+37    let path = db.lookup_intern_file(file).path;
+38    Utf8Path::new(path.as_str())
+39        .file_name()
+40        .expect("path lacks file name")
+41        .into()
+42}
+43
+44#[salsa::database(SourceDbStorage)]
+45#[derive(Default)]
+46pub struct TestDb {
+47    storage: salsa::Storage<TestDb>,
+48}
+49impl salsa::Database for TestDb {}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/diagnostics.rs.html b/compiler-docs/src/fe_common/diagnostics.rs.html new file mode 100644 index 0000000000..02d0bbeead --- /dev/null +++ b/compiler-docs/src/fe_common/diagnostics.rs.html @@ -0,0 +1,145 @@ +diagnostics.rs - source

fe_common/
diagnostics.rs

1use crate::db::SourceDb;
+2use crate::files::{SourceFileId, Utf8PathBuf};
+3use crate::Span;
+4pub use codespan_reporting::diagnostic as cs;
+5use codespan_reporting::files::Error as CsError;
+6use codespan_reporting::term;
+7pub use cs::Severity;
+8use std::ops::Range;
+9use std::rc::Rc;
+10use term::termcolor::{BufferWriter, ColorChoice};
+11
+12#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+13pub struct Diagnostic {
+14    pub severity: Severity,
+15    pub message: String,
+16    pub labels: Vec<Label>,
+17    pub notes: Vec<String>,
+18}
+19impl Diagnostic {
+20    pub fn into_cs(self) -> cs::Diagnostic<SourceFileId> {
+21        cs::Diagnostic {
+22            severity: self.severity,
+23            code: None,
+24            message: self.message,
+25            labels: self.labels.into_iter().map(Label::into_cs_label).collect(),
+26            notes: self.notes,
+27        }
+28    }
+29    pub fn error(message: String) -> Self {
+30        Self {
+31            severity: Severity::Error,
+32            message,
+33            labels: vec![],
+34            notes: vec![],
+35        }
+36    }
+37}
+38
+39#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
+40pub enum LabelStyle {
+41    Primary,
+42    Secondary,
+43}
+44impl From<LabelStyle> for cs::LabelStyle {
+45    fn from(other: LabelStyle) -> cs::LabelStyle {
+46        match other {
+47            LabelStyle::Primary => cs::LabelStyle::Primary,
+48            LabelStyle::Secondary => cs::LabelStyle::Secondary,
+49        }
+50    }
+51}
+52
+53#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+54pub struct Label {
+55    pub style: LabelStyle,
+56    pub span: Span,
+57    pub message: String,
+58}
+59impl Label {
+60    /// Create a primary label with the given message. This will underline the
+61    /// given span with carets (`^^^^`).
+62    pub fn primary<S: Into<String>>(span: Span, message: S) -> Self {
+63        Label {
+64            style: LabelStyle::Primary,
+65            span,
+66            message: message.into(),
+67        }
+68    }
+69
+70    /// Create a secondary label with the given message. This will underline the
+71    /// given span with hyphens (`----`).
+72    pub fn secondary<S: Into<String>>(span: Span, message: S) -> Self {
+73        Label {
+74            style: LabelStyle::Secondary,
+75            span,
+76            message: message.into(),
+77        }
+78    }
+79
+80    /// Convert into a [`codespan_reporting::Diagnostic::Label`]
+81    pub fn into_cs_label(self) -> cs::Label<SourceFileId> {
+82        cs::Label {
+83            style: self.style.into(),
+84            file_id: self.span.file_id,
+85            range: self.span.into(),
+86            message: self.message,
+87        }
+88    }
+89}
+90
+91/// Print the given diagnostics to stderr.
+92pub fn print_diagnostics(db: &dyn SourceDb, diagnostics: &[Diagnostic]) {
+93    let writer = BufferWriter::stderr(ColorChoice::Auto);
+94    let mut buffer = writer.buffer();
+95    let config = term::Config::default();
+96    let files = SourceDbWrapper(db);
+97
+98    for diag in diagnostics {
+99        term::emit(&mut buffer, &config, &files, &diag.clone().into_cs()).unwrap();
+100    }
+101    // If we use `writer` here, the output won't be captured by rust's test system.
+102    eprintln!("{}", std::str::from_utf8(buffer.as_slice()).unwrap());
+103}
+104
+105/// Format the given diagnostics as a string.
+106pub fn diagnostics_string(db: &dyn SourceDb, diagnostics: &[Diagnostic]) -> String {
+107    let writer = BufferWriter::stderr(ColorChoice::Never);
+108    let mut buffer = writer.buffer();
+109    let config = term::Config::default();
+110    let files = SourceDbWrapper(db);
+111
+112    for diag in diagnostics {
+113        term::emit(&mut buffer, &config, &files, &diag.clone().into_cs())
+114            .expect("failed to emit diagnostic");
+115    }
+116    std::str::from_utf8(buffer.as_slice()).unwrap().to_string()
+117}
+118
+119struct SourceDbWrapper<'a>(pub &'a dyn SourceDb);
+120
+121impl<'a> codespan_reporting::files::Files<'_> for SourceDbWrapper<'a> {
+122    type FileId = SourceFileId;
+123    type Name = Rc<Utf8PathBuf>;
+124    type Source = Rc<str>;
+125
+126    fn name(&self, file: SourceFileId) -> Result<Self::Name, CsError> {
+127        Ok(file.path(self.0))
+128    }
+129
+130    fn source(&self, file: SourceFileId) -> Result<Self::Source, CsError> {
+131        Ok(file.content(self.0))
+132    }
+133
+134    fn line_index(&self, file: SourceFileId, byte_index: usize) -> Result<usize, CsError> {
+135        Ok(file.line_index(self.0, byte_index))
+136    }
+137
+138    fn line_range(&self, file: SourceFileId, line_index: usize) -> Result<Range<usize>, CsError> {
+139        file.line_range(self.0, line_index)
+140            .ok_or(CsError::LineTooLarge {
+141                given: line_index,
+142                max: self.0.file_line_starts(file).len() - 1,
+143            })
+144    }
+145}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/files.rs.html b/compiler-docs/src/fe_common/files.rs.html new file mode 100644 index 0000000000..d523d087d8 --- /dev/null +++ b/compiler-docs/src/fe_common/files.rs.html @@ -0,0 +1,132 @@ +files.rs - source

fe_common/
files.rs

1use crate::db::SourceDb;
+2pub use camino::{Utf8Component, Utf8Path, Utf8PathBuf};
+3pub use fe_library::include_dir;
+4use std::ops::Range;
+5use std::rc::Rc;
+6
+7// NOTE: all file paths are stored as utf8 strings.
+8//  Non-utf8 paths (for user code) should be reported
+9//  as an error.
+10//  If include_dir paths aren't utf8, we panic and fix
+11//  our stdlib/test-file path names.
+12
+13#[derive(Debug, PartialEq, Eq, Hash, Clone)]
+14pub struct File {
+15    /// Differentiates between local source files and fe std lib
+16    /// files, which may have the same path (for salsa's sake).
+17    pub kind: FileKind,
+18
+19    /// Path of the file. May include `src/` dir or longer prefix;
+20    /// this prefix will be stored in the `Ingot::src_path`, and stripped
+21    /// off as needed.
+22    pub path: Rc<Utf8PathBuf>,
+23}
+24
+25#[derive(Debug, PartialEq, Eq, Hash, Copy, Clone)]
+26pub enum FileKind {
+27    /// User file; either part of the target project or an imported ingot
+28    Local,
+29    /// File is part of the fe standard library
+30    Std,
+31}
+32
+33/// Returns the common *prefix* of two paths. If the paths are identical,
+34/// returns the path parent.
+35pub fn common_prefix(left: &Utf8Path, right: &Utf8Path) -> Utf8PathBuf {
+36    left.components()
+37        .zip(right.components())
+38        .take_while(|(l, r)| l == r)
+39        .map(|(l, _)| l)
+40        .collect()
+41}
+42
+43// from rust-analyzer {
+44#[macro_export]
+45macro_rules! impl_intern_key {
+46    ($name:ident) => {
+47        impl salsa::InternKey for $name {
+48            fn from_intern_id(v: salsa::InternId) -> Self {
+49                $name(v.as_u32())
+50            }
+51            fn as_intern_id(&self) -> salsa::InternId {
+52                salsa::InternId::from(self.0)
+53            }
+54        }
+55    };
+56}
+57// } from rust-analyzer
+58
+59// TODO: rename to FileId
+60#[derive(Debug, serde::Deserialize, PartialEq, Eq, Hash, Copy, Clone)]
+61pub struct SourceFileId(pub(crate) u32);
+62impl_intern_key!(SourceFileId);
+63
+64impl SourceFileId {
+65    pub fn new_local(db: &mut dyn SourceDb, path: &str, content: Rc<str>) -> Self {
+66        Self::new(db, FileKind::Std, path, content)
+67    }
+68
+69    pub fn new_std(db: &mut dyn SourceDb, path: &str, content: Rc<str>) -> Self {
+70        Self::new(db, FileKind::Std, path, content)
+71    }
+72
+73    pub fn new(db: &mut dyn SourceDb, kind: FileKind, path: &str, content: Rc<str>) -> Self {
+74        let id = db.intern_file(File {
+75            kind,
+76            path: Rc::new(path.into()),
+77        });
+78        db.set_file_content(id, content);
+79        id
+80    }
+81
+82    pub fn path(&self, db: &dyn SourceDb) -> Rc<Utf8PathBuf> {
+83        db.lookup_intern_file(*self).path
+84    }
+85
+86    pub fn content(&self, db: &dyn SourceDb) -> Rc<str> {
+87        db.file_content(*self)
+88    }
+89
+90    pub fn line_index(&self, db: &dyn SourceDb, byte_index: usize) -> usize {
+91        db.file_line_starts(*self)
+92            .binary_search(&byte_index)
+93            .unwrap_or_else(|next_line| next_line - 1)
+94    }
+95
+96    pub fn line_range(&self, db: &dyn SourceDb, line_index: usize) -> Option<Range<usize>> {
+97        let line_starts = db.file_line_starts(*self);
+98        let end = if line_index == line_starts.len() - 1 {
+99            self.content(db).len()
+100        } else {
+101            *line_starts.get(line_index + 1)?
+102        };
+103        Some(Range {
+104            start: *line_starts.get(line_index)?,
+105            end,
+106        })
+107    }
+108
+109    pub fn dummy_file() -> Self {
+110        // Used by unit tests and benchmarks
+111        Self(u32::MAX)
+112    }
+113    pub fn is_dummy(self) -> bool {
+114        self == Self::dummy_file()
+115    }
+116}
+117
+118#[test]
+119fn test_common_prefix() {
+120    assert_eq!(
+121        common_prefix(Utf8Path::new("a/b/c/d/e"), Utf8Path::new("a/b/d/e")),
+122        Utf8Path::new("a/b")
+123    );
+124    assert_eq!(
+125        common_prefix(Utf8Path::new("src/foo.x"), Utf8Path::new("tests/bar.fe")),
+126        Utf8Path::new("")
+127    );
+128    assert_eq!(
+129        common_prefix(Utf8Path::new("/src/foo.x"), Utf8Path::new("src/bar.fe")),
+130        Utf8Path::new("")
+131    );
+132}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/lib.rs.html b/compiler-docs/src/fe_common/lib.rs.html new file mode 100644 index 0000000000..5c599c8fd1 --- /dev/null +++ b/compiler-docs/src/fe_common/lib.rs.html @@ -0,0 +1,26 @@ +lib.rs - source

fe_common/
lib.rs

1pub mod db;
+2pub mod diagnostics;
+3pub mod files;
+4pub mod numeric;
+5pub mod panic;
+6mod span;
+7pub mod utils;
+8
+9pub use files::{File, FileKind, SourceFileId};
+10pub use span::{Span, Spanned};
+11
+12#[macro_export]
+13#[cfg(target_arch = "wasm32")]
+14macro_rules! assert_snapshot_wasm {
+15    ($path:expr, $actual:expr) => {
+16        let snap = include_str!($path);
+17        let expected = snap.splitn(3, "---\n").last().unwrap();
+18        pretty_assertions::assert_eq!($actual.trim(), expected.trim());
+19    };
+20}
+21
+22#[macro_export]
+23#[cfg(not(target_arch = "wasm32"))]
+24macro_rules! assert_snapshot_wasm {
+25    ($path:expr, $actual:expr) => {};
+26}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/numeric.rs.html b/compiler-docs/src/fe_common/numeric.rs.html new file mode 100644 index 0000000000..40d94a6aac --- /dev/null +++ b/compiler-docs/src/fe_common/numeric.rs.html @@ -0,0 +1,98 @@ +numeric.rs - source

fe_common/
numeric.rs

1use num_bigint::{BigInt, Sign};
+2
+3/// A type that represents the radix of a numeric literal.
+4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+5pub enum Radix {
+6    Hexadecimal,
+7    Decimal,
+8    Octal,
+9    Binary,
+10}
+11
+12impl Radix {
+13    /// Returns number representation of the radix.
+14    pub fn as_num(self) -> u32 {
+15        match self {
+16            Self::Hexadecimal => 16,
+17            Self::Decimal => 10,
+18            Self::Octal => 8,
+19            Self::Binary => 2,
+20        }
+21    }
+22}
+23
+24/// A helper type to interpret a numeric literal represented by string.
+25#[derive(Debug, Clone)]
+26pub struct Literal<'a> {
+27    /// The number part of the string.
+28    num: &'a str,
+29    /// The radix of the literal.
+30    radix: Radix,
+31}
+32
+33impl<'a> Literal<'a> {
+34    pub fn new(src: &'a str) -> Self {
+35        debug_assert!(!src.is_empty());
+36        debug_assert_ne!(src.chars().next(), Some('-'));
+37        let (radix, prefix) = if src.len() < 2 {
+38            (Radix::Decimal, None)
+39        } else {
+40            match &src[0..2] {
+41                "0x" | "0X" => (Radix::Hexadecimal, Some(&src[..2])),
+42                "0o" | "0O" => (Radix::Octal, Some(&src[..2])),
+43                "0b" | "0B" => (Radix::Binary, Some(&src[..2])),
+44                _ => (Radix::Decimal, None),
+45            }
+46        };
+47
+48        Self {
+49            num: &src[prefix.map_or(0, str::len)..],
+50            radix,
+51        }
+52    }
+53
+54    /// Parse the numeric literal to `T`.
+55    pub fn parse<T: num_traits::Num>(&self) -> Result<T, T::FromStrRadixErr> {
+56        T::from_str_radix(self.num, self.radix.as_num())
+57    }
+58
+59    /// Returns radix of the numeric literal.
+60    pub fn radix(&self) -> Radix {
+61        self.radix
+62    }
+63}
+64
+65// Converts any positive or negative `BigInt` into a hex str using 2s complement representation for negative values.
+66pub fn to_hex_str(val: &BigInt) -> String {
+67    format!(
+68        "0x{}",
+69        BigInt::from_bytes_be(Sign::Plus, &val.to_signed_bytes_be()).to_str_radix(16)
+70    )
+71}
+72
+73#[cfg(test)]
+74mod tests {
+75    use super::*;
+76
+77    #[test]
+78    fn test_radix() {
+79        assert_eq!(Literal::new("0XFF").radix(), Radix::Hexadecimal);
+80        assert_eq!(Literal::new("0xFF").radix(), Radix::Hexadecimal);
+81        assert_eq!(Literal::new("0O77").radix(), Radix::Octal);
+82        assert_eq!(Literal::new("0o77").radix(), Radix::Octal);
+83        assert_eq!(Literal::new("0B77").radix(), Radix::Binary);
+84        assert_eq!(Literal::new("0b77").radix(), Radix::Binary);
+85        assert_eq!(Literal::new("1").radix(), Radix::Decimal);
+86
+87        // Invalid radix is treated as `Decimal`.
+88        assert_eq!(Literal::new("0D15").radix(), Radix::Decimal);
+89    }
+90
+91    #[test]
+92    fn test_to_hex_str() {
+93        assert_eq!(to_hex_str(&BigInt::from(-1i8)), "0xff");
+94        assert_eq!(to_hex_str(&BigInt::from(-2i8)), "0xfe");
+95        assert_eq!(to_hex_str(&BigInt::from(1i8)), "0x1");
+96        assert_eq!(to_hex_str(&BigInt::from(2i8)), "0x2");
+97    }
+98}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/panic.rs.html b/compiler-docs/src/fe_common/panic.rs.html new file mode 100644 index 0000000000..58309e27fc --- /dev/null +++ b/compiler-docs/src/fe_common/panic.rs.html @@ -0,0 +1,24 @@ +panic.rs - source

fe_common/
panic.rs

1use once_cell::sync::Lazy;
+2use std::panic;
+3
+4const BUG_REPORT_URL: &str = "https://github.com/ethereum/fe/issues/new";
+5type PanicCallback = dyn Fn(&panic::PanicInfo<'_>) + Sync + Send + 'static;
+6static DEFAULT_PANIC_HOOK: Lazy<Box<PanicCallback>> = Lazy::new(|| {
+7    let hook = panic::take_hook();
+8    panic::set_hook(Box::new(report_ice));
+9    hook
+10});
+11
+12pub fn install_panic_hook() {
+13    Lazy::force(&DEFAULT_PANIC_HOOK);
+14}
+15fn report_ice(info: &panic::PanicInfo) {
+16    (*DEFAULT_PANIC_HOOK)(info);
+17
+18    eprintln!();
+19    eprintln!("You've hit an internal compiler error. This is a bug in the Fe compiler.");
+20    eprintln!("Fe is still under heavy development, and isn't yet ready for production use.");
+21    eprintln!();
+22    eprintln!("If you would, please report this bug at the following URL:");
+23    eprintln!("  {BUG_REPORT_URL}");
+24}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/span.rs.html b/compiler-docs/src/fe_common/span.rs.html new file mode 100644 index 0000000000..8d80a6fc9e --- /dev/null +++ b/compiler-docs/src/fe_common/span.rs.html @@ -0,0 +1,153 @@ +span.rs - source

fe_common/
span.rs

1use crate::files::SourceFileId;
+2use serde::{Deserialize, Serialize};
+3use std::cmp;
+4use std::fmt::{Debug, Formatter};
+5use std::ops::{Add, AddAssign, Range};
+6
+7/// An exclusive span of byte offsets in a source file.
+8#[derive(Serialize, Deserialize, PartialEq, Copy, Clone, Hash, Eq)]
+9pub struct Span {
+10    #[serde(skip_serializing)]
+11    pub file_id: SourceFileId,
+12    /// A byte offset specifying the inclusive start of a span.
+13    pub start: usize,
+14    /// A byte offset specifying the exclusive end of a span.
+15    pub end: usize,
+16}
+17
+18impl Span {
+19    pub fn new(file_id: SourceFileId, start: usize, end: usize) -> Self {
+20        Span {
+21            file_id,
+22            start: cmp::min(start, end),
+23            end: cmp::max(start, end),
+24        }
+25    }
+26
+27    pub fn zero(file_id: SourceFileId) -> Self {
+28        Span {
+29            file_id,
+30            start: 0,
+31            end: 0,
+32        }
+33    }
+34
+35    pub fn dummy() -> Self {
+36        Self {
+37            file_id: SourceFileId::dummy_file(),
+38            start: usize::MAX,
+39            end: usize::MAX,
+40        }
+41    }
+42
+43    pub fn is_dummy(&self) -> bool {
+44        self == &Self::dummy()
+45    }
+46
+47    pub fn from_pair<S, E>(start_elem: S, end_elem: E) -> Self
+48    where
+49        S: Into<Span>,
+50        E: Into<Span>,
+51    {
+52        let start_span: Span = start_elem.into();
+53        let end_span: Span = end_elem.into();
+54
+55        let file_id = if start_span.file_id == end_span.file_id {
+56            start_span.file_id
+57        } else {
+58            panic!("file ids are not equal")
+59        };
+60
+61        Self {
+62            file_id,
+63            start: start_span.start,
+64            end: end_span.end,
+65        }
+66    }
+67}
+68
+69impl Debug for Span {
+70    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+71        write!(f, "{:?}", Range::from(*self))
+72    }
+73}
+74
+75pub trait Spanned {
+76    fn span(&self) -> Span;
+77}
+78
+79impl Add for Span {
+80    type Output = Self;
+81
+82    fn add(self, other: Self) -> Self {
+83        use std::cmp::{max, min};
+84
+85        let file_id = if self.file_id == other.file_id {
+86            self.file_id
+87        } else {
+88            panic!("file ids are not equal")
+89        };
+90
+91        Self {
+92            file_id,
+93            start: min(self.start, other.start),
+94            end: max(self.end, other.end),
+95        }
+96    }
+97}
+98
+99impl Add<Option<Span>> for Span {
+100    type Output = Self;
+101
+102    fn add(self, other: Option<Span>) -> Self {
+103        if let Some(other) = other {
+104            self + other
+105        } else {
+106            self
+107        }
+108    }
+109}
+110
+111impl<'a, T> Add<Option<&'a T>> for Span
+112where
+113    Span: Add<&'a T, Output = Self>,
+114{
+115    type Output = Self;
+116
+117    fn add(self, other: Option<&'a T>) -> Self {
+118        if let Some(other) = other {
+119            self + other
+120        } else {
+121            self
+122        }
+123    }
+124}
+125
+126impl<'a, T> Add<&'a T> for Span
+127where
+128    T: Spanned,
+129{
+130    type Output = Self;
+131
+132    fn add(self, other: &'a T) -> Self {
+133        self + other.span()
+134    }
+135}
+136
+137impl<T> AddAssign<T> for Span
+138where
+139    Span: Add<T, Output = Self>,
+140{
+141    fn add_assign(&mut self, other: T) {
+142        *self = *self + other
+143    }
+144}
+145
+146impl From<Span> for Range<usize> {
+147    fn from(span: Span) -> Self {
+148        Range {
+149            start: span.start,
+150            end: span.end,
+151        }
+152    }
+153}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/dirs.rs.html b/compiler-docs/src/fe_common/utils/dirs.rs.html new file mode 100644 index 0000000000..f25601b2bc --- /dev/null +++ b/compiler-docs/src/fe_common/utils/dirs.rs.html @@ -0,0 +1,26 @@ +dirs.rs - source

fe_common/utils/
dirs.rs

1use std::path::PathBuf;
+2
+3pub fn get_fe_home() -> PathBuf {
+4    let fe_home = std::env::var("FE_HOME")
+5        .map(PathBuf::from)
+6        .unwrap_or_else(|_| {
+7            dirs::home_dir()
+8                .expect("Failed to get home dir")
+9                .join(".fe")
+10        });
+11
+12    if !fe_home.exists() {
+13        std::fs::create_dir_all(&fe_home).expect("Failed to create FE_HOME");
+14    }
+15
+16    fe_home
+17}
+18
+19pub fn get_fe_deps() -> PathBuf {
+20    let fe_deps = get_fe_home().join("deps");
+21
+22    if !fe_deps.exists() {
+23        std::fs::create_dir_all(&fe_deps).expect("Failed to create FE_DEPS");
+24    }
+25    fe_deps
+26}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/files.rs.html b/compiler-docs/src/fe_common/utils/files.rs.html new file mode 100644 index 0000000000..47bbeec3aa --- /dev/null +++ b/compiler-docs/src/fe_common/utils/files.rs.html @@ -0,0 +1,416 @@ +files.rs - source

fe_common/utils/
files.rs

1use serde::Deserialize;
+2use std::{fs, path::Path};
+3use toml::Table;
+4
+5use indexmap::{indexmap, IndexMap};
+6use path_clean::PathClean;
+7use smol_str::SmolStr;
+8use walkdir::WalkDir;
+9
+10use crate::utils::dirs::get_fe_deps;
+11use crate::utils::git;
+12
+13const FE_TOML: &str = "fe.toml";
+14
+15pub enum FileLoader {
+16    Static(Vec<(&'static str, &'static str)>),
+17    Fs,
+18}
+19
+20impl FileLoader {
+21    pub fn canonicalize_path(&self, path: &str) -> Result<SmolStr, String> {
+22        match self {
+23            FileLoader::Static(_) => Ok(SmolStr::new(
+24                Path::new(path).clean().to_str().expect("path clean failed"),
+25            )),
+26            FileLoader::Fs => Ok(SmolStr::new(
+27                fs::canonicalize(path)
+28                    .map_err(|err| {
+29                        format!("unable to canonicalize root project path {path}.\n{err}")
+30                    })?
+31                    .to_str()
+32                    .expect("could not convert path to string"),
+33            )),
+34        }
+35    }
+36
+37    pub fn fe_files(&self, path: &str) -> Result<Vec<(String, String)>, String> {
+38        match self {
+39            FileLoader::Static(files) => Ok(files
+40                .iter()
+41                .filter_map(|(file_path, content)| {
+42                    if file_path.starts_with(path) && file_path.ends_with(".fe") {
+43                        Some((file_path.to_string(), content.to_string()))
+44                    } else {
+45                        None
+46                    }
+47                })
+48                .collect()),
+49            FileLoader::Fs => {
+50                let entries = WalkDir::new(path);
+51                let mut files = vec![];
+52
+53                for entry in entries.into_iter() {
+54                    let entry =
+55                        entry.map_err(|err| format!("Error loading source files.\n{err}"))?;
+56                    let path = entry.path();
+57
+58                    if path.is_file()
+59                        && path.extension().and_then(std::ffi::OsStr::to_str) == Some("fe")
+60                    {
+61                        let content = std::fs::read_to_string(path)
+62                            .map_err(|err| format!("Unable to read src file.\n{err}"))?;
+63                        files.push((path.to_string_lossy().to_string(), content));
+64                    }
+65                }
+66
+67                Ok(files)
+68            }
+69        }
+70    }
+71
+72    pub fn file_content(&self, path: &str) -> Result<String, String> {
+73        match self {
+74            FileLoader::Static(files) => {
+75                match files.iter().find(|(file_path, _)| file_path == &path) {
+76                    Some((_, content)) => Ok(content.to_string()),
+77                    None => Err(format!("could not load static file {}", path)),
+78                }
+79            }
+80            FileLoader::Fs => {
+81                std::fs::read_to_string(path).map_err(|err| format!("Unable to read file.\n{err}"))
+82            }
+83        }
+84    }
+85}
+86
+87pub struct BuildFiles {
+88    pub root_project_path: SmolStr,
+89    pub project_files: IndexMap<SmolStr, ProjectFiles>,
+90}
+91
+92impl BuildFiles {
+93    pub fn root_project_mode(&self) -> ProjectMode {
+94        self.project_files[&self.root_project_path].mode
+95    }
+96
+97    /// Build files are loaded from the file system.
+98    pub fn load_fs(root_path: &str) -> Result<Self, String> {
+99        Self::load(&FileLoader::Fs, root_path)
+100    }
+101
+102    /// Build files are loaded from static file vector.
+103    pub fn load_static(
+104        files: Vec<(&'static str, &'static str)>,
+105        root_path: &str,
+106    ) -> Result<Self, String> {
+107        Self::load(&FileLoader::Static(files), root_path)
+108    }
+109
+110    fn load(loader: &FileLoader, root_project_path: &str) -> Result<Self, String> {
+111        let root_project_path = loader.canonicalize_path(root_project_path)?;
+112
+113        // Map containing canonicalized project paths and their files.
+114        let mut project_files = indexmap! {
+115            root_project_path.clone() => ProjectFiles::load(loader, &root_project_path)?
+116        };
+117
+118        // The root project is the first project to have unresolved dependencies.
+119        let mut unresolved_projects = vec![root_project_path.clone()];
+120
+121        while let Some(unresolved_project_path) = unresolved_projects.pop() {
+122            // Iterate over each of `unresolved_projects` dependencies.
+123            for dependency in project_files[&unresolved_project_path].dependencies.clone() {
+124                if !project_files.contains_key(&dependency.canonicalized_path) {
+125                    // The dependency is being encountered for the first time.
+126                    let dep_project = dependency.resolve(loader)?;
+127                    project_files.insert(dependency.canonicalized_path.clone(), dep_project);
+128                    unresolved_projects.push(dependency.canonicalized_path);
+129                };
+130            }
+131        }
+132
+133        Ok(Self {
+134            root_project_path,
+135            project_files,
+136        })
+137    }
+138}
+139
+140pub struct ProjectFiles {
+141    pub name: SmolStr,
+142    pub version: SmolStr,
+143    pub mode: ProjectMode,
+144    pub dependencies: Vec<Dependency>,
+145    pub src: Vec<(String, String)>,
+146}
+147
+148impl ProjectFiles {
+149    fn load(loader: &FileLoader, path: &str) -> Result<Self, String> {
+150        let manifest_path = Path::new(path)
+151            .join(FE_TOML)
+152            .to_str()
+153            .expect("unable to convert path to &str")
+154            .to_owned();
+155        let manifest = Manifest::load(loader, &manifest_path)?;
+156        let name = manifest.name;
+157        let version = manifest.version;
+158
+159        let mut dependencies = vec![];
+160        let mut errors = vec![];
+161
+162        if let Some(deps) = &manifest.dependencies {
+163            for (name, value) in deps {
+164                match Dependency::new(loader, name, path, value) {
+165                    Ok(dep) => dependencies.push(dep),
+166                    Err(dep_err) => {
+167                        errors.push(format!("Misconfigured dependency {name}:\n{dep_err}"))
+168                    }
+169                }
+170            }
+171        }
+172
+173        if !errors.is_empty() {
+174            return Err(errors.join("\n"));
+175        }
+176
+177        let src_path = Path::new(path)
+178            .join("src")
+179            .to_str()
+180            .expect("unable to convert path to &str")
+181            .to_owned();
+182        let src = loader.fe_files(&src_path)?;
+183
+184        let mode = if src
+185            .iter()
+186            .any(|(file_path, _)| file_path.ends_with("main.fe"))
+187        {
+188            ProjectMode::Main
+189        } else if src
+190            .iter()
+191            .any(|(file_path, _)| file_path.ends_with("lib.fe"))
+192        {
+193            ProjectMode::Lib
+194        } else {
+195            return Err(format!("Unable to determine mode of {}. Consider adding src/main.fe or src/lib.fe file to the project.", name));
+196        };
+197
+198        Ok(Self {
+199            name,
+200            version,
+201            mode,
+202            dependencies,
+203            src,
+204        })
+205    }
+206}
+207
+208#[derive(Clone, Copy, PartialEq, Eq)]
+209pub enum ProjectMode {
+210    Main,
+211    Lib,
+212}
+213
+214#[derive(Clone)]
+215pub struct Dependency {
+216    pub name: SmolStr,
+217    pub version: Option<SmolStr>,
+218    pub canonicalized_path: SmolStr,
+219    pub kind: DependencyKind,
+220}
+221
+222pub trait DependencyResolver {
+223    fn resolve(dep: &Dependency, loader: &FileLoader) -> Result<ProjectFiles, String>;
+224}
+225
+226#[derive(Clone)]
+227pub struct LocalDependency;
+228
+229impl DependencyResolver for LocalDependency {
+230    fn resolve(dep: &Dependency, loader: &FileLoader) -> Result<ProjectFiles, String> {
+231        let project = ProjectFiles::load(loader, &dep.canonicalized_path)?;
+232
+233        let mut errors = vec![];
+234
+235        if project.mode == ProjectMode::Main {
+236            errors.push(format!("{} is not a library", project.name));
+237        }
+238
+239        if project.name != dep.name {
+240            errors.push(format!("Name mismatch: {} =/= {}", project.name, dep.name));
+241        }
+242
+243        if let Some(version) = &dep.version {
+244            if version != &project.version {
+245                errors.push(format!(
+246                    "Version mismatch: {} =/= {}",
+247                    project.version, version
+248                ));
+249            }
+250        }
+251
+252        if errors.is_empty() {
+253            Ok(project)
+254        } else {
+255            Err(format!(
+256                "Unable to resolve {} at {} due to the following errors.\n{}",
+257                dep.name,
+258                dep.canonicalized_path,
+259                errors.join("\n")
+260            ))
+261        }
+262    }
+263}
+264
+265#[derive(Clone)]
+266pub struct GitDependency {
+267    source: String,
+268    rev: String,
+269}
+270
+271impl DependencyResolver for GitDependency {
+272    fn resolve(dep: &Dependency, loader: &FileLoader) -> Result<ProjectFiles, String> {
+273        if let DependencyKind::Git(GitDependency { source, rev }) = &dep.kind {
+274            if let Err(e) = git::fetch_and_checkout(source, dep.canonicalized_path.as_str(), rev) {
+275                return Err(format!(
+276                    "Unable to clone git dependency {}.\n{}",
+277                    dep.name, e
+278                ));
+279            }
+280
+281            // Load it like any local dependency which will include additional checks.
+282            return LocalDependency::resolve(dep, loader);
+283        }
+284        Err(format!("Could not resolve git dependency {}", dep.name))
+285    }
+286}
+287
+288#[derive(Clone)]
+289pub enum DependencyKind {
+290    Local(LocalDependency),
+291    Git(GitDependency),
+292}
+293
+294impl Dependency {
+295    fn new(
+296        loader: &FileLoader,
+297        name: &str,
+298        orig_path: &str,
+299        value: &toml::Value,
+300    ) -> Result<Self, String> {
+301        let join_path = |path: &str| {
+302            loader.canonicalize_path(
+303                Path::new(orig_path)
+304                    .join(path)
+305                    .to_str()
+306                    .expect("unable to convert path to &str"),
+307            )
+308        };
+309
+310        match value {
+311            toml::Value::String(dep_path) => Ok(Dependency {
+312                name: name.into(),
+313                version: None,
+314                kind: DependencyKind::Local(LocalDependency),
+315                canonicalized_path: join_path(dep_path)?,
+316            }),
+317            toml::Value::Table(table) => {
+318                let version = table
+319                    .get("version")
+320                    .map(|version| version.as_str().unwrap().into());
+321
+322                let return_local_dep = |path| {
+323                    Ok::<Dependency, String>(Dependency {
+324                        name: name.into(),
+325                        version: version.clone(),
+326                        canonicalized_path: join_path(path)?,
+327
+328                        kind: DependencyKind::Local(LocalDependency),
+329                    })
+330                };
+331
+332                match (table.get("source"), table.get("rev"), table.get("path")) {
+333                    (Some(toml::Value::String(source)), Some(toml::Value::String(rev)), None) => {
+334                        let dep_path = get_fe_deps().join(format!("{}-{}", name, rev));
+335                        if dep_path.exists() {
+336                            // Should we at least perform some kind of integrity check here? We currently treat an
+337                            // existing directory as a valid dependency no matter what.
+338                            return_local_dep(dep_path.to_str().unwrap())
+339                        } else {
+340                            fs::create_dir_all(&dep_path).unwrap();
+341                            Ok(Dependency {
+342                                name: name.into(),
+343                                version: version.clone(),
+344                                canonicalized_path: loader.canonicalize_path(
+345                                    Path::new(orig_path)
+346                                        .join(dep_path)
+347                                        .to_str()
+348                                        .expect("unable to convert path to &str"),
+349                                )?,
+350                                kind: DependencyKind::Git(GitDependency {
+351                                    source: source.into(),
+352                                    rev: rev.into(),
+353                                }),
+354                            })
+355                        }
+356                    }
+357                    (Some(_), Some(_), Some(_)) => {
+358                        Err("`path` can not be used together with `rev` and `source`".into())
+359                    }
+360                    (Some(_), None, _) => Err("`source` specified but no `rev` given".into()),
+361                    (None, Some(_), _) => Err("`rev` specified but no `source` given".into()),
+362                    (None, None, Some(toml::Value::String(path))) => return_local_dep(path),
+363                    _ => Err("Dependency isn't well formed".into()),
+364                }
+365            }
+366            _ => Err("unsupported toml type".into()),
+367        }
+368    }
+369
+370    fn resolve(&self, loader: &FileLoader) -> Result<ProjectFiles, String> {
+371        match &self.kind {
+372            DependencyKind::Local(_) => LocalDependency::resolve(self, loader),
+373            DependencyKind::Git(_) => GitDependency::resolve(self, loader),
+374        }
+375    }
+376}
+377
+378#[derive(Deserialize)]
+379struct Manifest {
+380    pub name: SmolStr,
+381    pub version: SmolStr,
+382    dependencies: Option<Table>,
+383}
+384
+385impl Manifest {
+386    pub fn load(loader: &FileLoader, path: &str) -> Result<Self, String> {
+387        let content = loader
+388            .file_content(path)
+389            .map_err(|err| format!("Failed to load manifest content from {path}.\n{err}"))?;
+390        let manifest: Manifest = toml::from_str(&content)
+391            .map_err(|err| format!("Failed to parse the content of {path}.\n{err}"))?;
+392
+393        Ok(manifest)
+394    }
+395}
+396
+397/// Returns the root path of the current Fe project
+398pub fn get_project_root() -> Option<String> {
+399    let current_dir = std::env::current_dir().expect("Unable to get current directory");
+400
+401    let mut current_path = current_dir.clone();
+402    loop {
+403        let fe_toml_path = current_path.join(FE_TOML);
+404        if fe_toml_path.is_file() {
+405            return fe_toml_path
+406                .parent()
+407                .map(|val| val.to_string_lossy().to_string());
+408        }
+409
+410        if !current_path.pop() {
+411            break;
+412        }
+413    }
+414
+415    None
+416}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/git.rs.html b/compiler-docs/src/fe_common/utils/git.rs.html new file mode 100644 index 0000000000..b2b8b513da --- /dev/null +++ b/compiler-docs/src/fe_common/utils/git.rs.html @@ -0,0 +1,68 @@ +git.rs - source

fe_common/utils/
git.rs

1#[cfg(not(target_arch = "wasm32"))]
+2use git2::{FetchOptions, Oid, Repository};
+3use std::error::Error;
+4#[cfg(not(target_arch = "wasm32"))]
+5use std::path::Path;
+6
+7/// Fetch and checkout the specified refspec from the remote repository without
+8/// fetching any additional history.
+9#[cfg(not(target_arch = "wasm32"))]
+10pub fn fetch_and_checkout<P: AsRef<Path>>(
+11    remote: &str,
+12    target_directory: P,
+13    refspec: &str,
+14) -> Result<(), Box<dyn Error>> {
+15    // We initialize the repo here so that we can be sure that we created a directory that
+16    // needs to be clean up in case of an error. If the init fails, there won't be anything
+17    // to clean up.
+18    let repo = Repository::init(&target_directory)?;
+19    let res = _fetch_and_checkout(remote, repo, refspec);
+20    if res.is_err() {
+21        std::fs::remove_dir_all(target_directory).expect("Failed to clean up directory");
+22    }
+23
+24    res
+25}
+26
+27#[cfg(not(target_arch = "wasm32"))]
+28fn _fetch_and_checkout(
+29    remote: &str,
+30    repo: Repository,
+31    refspec: &str,
+32) -> Result<(), Box<dyn Error>> {
+33    let mut remote = repo.remote("origin", remote)?;
+34
+35    let mut fetch_options = FetchOptions::new();
+36
+37    fetch_options.depth(1);
+38
+39    // Fetch the specified SHA1 with depth 1
+40    if let Err(e) = remote.fetch(&[refspec], Some(&mut fetch_options), None) {
+41        if let (git2::ErrorClass::Net, git2::ErrorCode::GenericError) = (e.class(), e.code()) {
+42            // That's a pretty cryptic error for the common case of the refspec not existing.
+43            // We keep the cryptic error (because it might have other causes) but add a hint.
+44            return Err(format!("{}\nMake sure revision {} exists in remote", e, refspec).into());
+45        } else {
+46            return Err(e.into());
+47        }
+48    }
+49
+50    // Find the fetched commit by SHA1
+51    let oid = Oid::from_str(refspec)?;
+52    let commit = repo.find_commit(oid)?;
+53
+54    // Checkout the commit
+55    repo.checkout_tree(commit.as_object(), None)?;
+56    repo.set_head_detached(oid)?;
+57
+58    Ok(())
+59}
+60
+61#[cfg(target_arch = "wasm32")]
+62pub fn fetch_and_checkout(
+63    _remote: &str,
+64    _target_directory: &str,
+65    _refspec: &str,
+66) -> Result<(), Box<dyn Error>> {
+67    Err("Not supported on WASM".into())
+68}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/humanize.rs.html b/compiler-docs/src/fe_common/utils/humanize.rs.html new file mode 100644 index 0000000000..d58160e8d5 --- /dev/null +++ b/compiler-docs/src/fe_common/utils/humanize.rs.html @@ -0,0 +1,44 @@ +humanize.rs - source

fe_common/utils/
humanize.rs

1/// A trait to derive plural or singular representations from
+2pub trait Pluralizable {
+3    fn to_plural(&self) -> String;
+4
+5    fn to_singular(&self) -> String;
+6}
+7
+8impl Pluralizable for &str {
+9    fn to_plural(&self) -> String {
+10        if self.ends_with('s') {
+11            self.to_string()
+12        } else {
+13            format!("{self}s")
+14        }
+15    }
+16
+17    fn to_singular(&self) -> String {
+18        if self.ends_with('s') {
+19            self[0..self.len() - 1].to_string()
+20        } else {
+21            self.to_string()
+22        }
+23    }
+24}
+25
+26// Impl Pluralizable for (singular, plural)
+27impl Pluralizable for (&str, &str) {
+28    fn to_plural(&self) -> String {
+29        self.1.to_string()
+30    }
+31
+32    fn to_singular(&self) -> String {
+33        self.0.to_string()
+34    }
+35}
+36
+37// Pluralize the given pluralizable if the `count` is greater than one.
+38pub fn pluralize_conditionally(pluralizable: impl Pluralizable, count: usize) -> String {
+39    if count == 1 {
+40        pluralizable.to_singular()
+41    } else {
+42        pluralizable.to_plural()
+43    }
+44}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/keccak.rs.html b/compiler-docs/src/fe_common/utils/keccak.rs.html new file mode 100644 index 0000000000..89e4b26d8e --- /dev/null +++ b/compiler-docs/src/fe_common/utils/keccak.rs.html @@ -0,0 +1,36 @@ +keccak.rs - source

fe_common/utils/
keccak.rs

1use tiny_keccak::{Hasher, Keccak};
+2
+3/// Get the full 32 byte hash of the content.
+4pub fn full(content: &[u8]) -> String {
+5    partial(content, 32)
+6}
+7
+8/// Take the first `size` number of bytes of the hash and pad the right side
+9/// with zeros to 32 bytes.
+10pub fn partial_right_padded(content: &[u8], size: usize) -> String {
+11    let result = full_as_bytes(content);
+12    let padded_output: Vec<u8> = result
+13        .iter()
+14        .enumerate()
+15        .map(|(index, byte)| if index >= size { 0 } else { *byte })
+16        .collect();
+17
+18    hex::encode(padded_output)
+19}
+20
+21/// Take the first `size` number of bytes of the hash with no padding.
+22pub fn partial(content: &[u8], size: usize) -> String {
+23    let result = full_as_bytes(content);
+24    hex::encode(&result[0..size])
+25}
+26
+27/// Get the full 32 byte hash of the content as a byte array.
+28pub fn full_as_bytes(content: &[u8]) -> [u8; 32] {
+29    let mut keccak = Keccak::v256();
+30    let mut selector = [0_u8; 32];
+31
+32    keccak.update(content);
+33    keccak.finalize(&mut selector);
+34
+35    selector
+36}
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/mod.rs.html b/compiler-docs/src/fe_common/utils/mod.rs.html new file mode 100644 index 0000000000..c74ae8e097 --- /dev/null +++ b/compiler-docs/src/fe_common/utils/mod.rs.html @@ -0,0 +1,6 @@ +mod.rs - source

fe_common/utils/
mod.rs

1pub mod dirs;
+2pub mod files;
+3pub mod git;
+4pub mod humanize;
+5pub mod keccak;
+6pub mod ron;
\ No newline at end of file diff --git a/compiler-docs/src/fe_common/utils/ron.rs.html b/compiler-docs/src/fe_common/utils/ron.rs.html new file mode 100644 index 0000000000..502912c337 --- /dev/null +++ b/compiler-docs/src/fe_common/utils/ron.rs.html @@ -0,0 +1,92 @@ +ron.rs - source

fe_common/utils/
ron.rs

1use difference::{Changeset, Difference};
+2use serde::Serialize;
+3use std::fmt;
+4
+5/// Return the lines of text in the string `lines` prefixed with the prefix in
+6/// the string `prefix`.
+7fn prefix_lines(prefix: &str, lines: &str) -> String {
+8    lines
+9        .lines()
+10        .map(|i| [prefix, i].concat())
+11        .collect::<Vec<String>>()
+12        .join("\n")
+13}
+14
+15/// Wrapper struct for formatting changesets from the `difference` package.
+16pub struct Diff(Changeset);
+17
+18impl Diff {
+19    pub fn new(left: &str, right: &str) -> Self {
+20        Self(Changeset::new(left, right, "\n"))
+21    }
+22}
+23
+24impl fmt::Display for Diff {
+25    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+26        for d in &self.0.diffs {
+27            match *d {
+28                Difference::Same(ref x) => {
+29                    write!(f, "{}{}", prefix_lines(" ", x), self.0.split)?;
+30                }
+31                Difference::Add(ref x) => {
+32                    write!(f, "\x1b[92m{}\x1b[0m{}", prefix_lines("+", x), self.0.split)?;
+33                }
+34                Difference::Rem(ref x) => {
+35                    write!(f, "\x1b[91m{}\x1b[0m{}", prefix_lines("-", x), self.0.split)?;
+36                }
+37            }
+38        }
+39        Ok(())
+40    }
+41}
+42
+43/// Compare the given strings and panic when not equal with a colorized line
+44/// diff.
+45#[macro_export]
+46macro_rules! assert_strings_eq {
+47    ($left:expr, $right:expr,) => {{
+48        assert_strings_eq!($left, $right)
+49    }};
+50    ($left:expr, $right:expr) => {{
+51        match (&($left), &($right)) {
+52            (left_val, right_val) => {
+53                if *left_val != *right_val {
+54                    panic!(
+55                        "assertion failed: `(left == right)`\ndiff:\n{}",
+56                        Diff::new(left_val, right_val),
+57                    )
+58                }
+59            }
+60        }
+61    }};
+62    ($left:expr, $right:expr, $($args:tt)*) => {{
+63        match (&($left), &($right)) {
+64            (left_val, right_val) => {
+65                if *left_val != *right_val {
+66                    panic!(
+67                        "assertion failed: `(left == right)`: {}\ndiff:\n{}",
+68                        format_args!($($args)*),
+69                        Diff::new(left_val, right_val),
+70                    )
+71                }
+72            }
+73        }
+74    }};
+75}
+76
+77/// Convenience function to serialize objects in RON format with custom pretty
+78/// printing config and struct names.
+79pub fn to_ron_string_pretty<T>(value: &T) -> ron::ser::Result<String>
+80where
+81    T: Serialize,
+82{
+83    let config = ron::ser::PrettyConfig {
+84        indentor: "  ".to_string(),
+85        ..Default::default()
+86    };
+87
+88    let mut serializer = ron::ser::Serializer::new(Some(config), true);
+89    value.serialize(&mut serializer)?;
+90
+91    Ok(serializer.into_output_string())
+92}
\ No newline at end of file diff --git a/compiler-docs/src/fe_compiler_test_utils/lib.rs.html b/compiler-docs/src/fe_compiler_test_utils/lib.rs.html new file mode 100644 index 0000000000..49a5dbd212 --- /dev/null +++ b/compiler-docs/src/fe_compiler_test_utils/lib.rs.html @@ -0,0 +1,901 @@ +lib.rs - source

fe_compiler_test_utils/
lib.rs

1use evm_runtime::{ExitReason, Handler};
+2use fe_common::diagnostics::print_diagnostics;
+3use fe_common::utils::keccak;
+4use fe_driver as driver;
+5use primitive_types::{H160, U256};
+6use std::cell::RefCell;
+7use std::collections::BTreeMap;
+8use std::fmt::{Display, Formatter};
+9use std::str::FromStr;
+10use yultsur::*;
+11
+12#[macro_export]
+13macro_rules! assert_harness_gas_report {
+14    ($harness: expr) => {
+15        assert_snapshot!(format!("{}", $harness.gas_reporter));
+16    };
+17
+18    ($harness: expr, $($expr:expr),*) => {
+19        let mut settings = insta::Settings::clone_current();
+20        let suffix = format!("{:?}", $($expr,)*).replace("\"", "");
+21        settings.set_snapshot_suffix(suffix);
+22        let _guard = settings.bind_to_scope();
+23        assert_snapshot!(format!("{}", $harness.gas_reporter));
+24    }
+25}
+26
+27#[derive(Default, Debug)]
+28pub struct GasReporter {
+29    records: RefCell<Vec<GasRecord>>,
+30}
+31
+32impl GasReporter {
+33    pub fn add_record(&self, description: &str, gas_used: u64) {
+34        self.records.borrow_mut().push(GasRecord {
+35            description: description.to_string(),
+36            gas_used,
+37        })
+38    }
+39
+40    pub fn add_func_call_record(&self, function: &str, input: &[ethabi::Token], gas_used: u64) {
+41        let description = format!("{function}({input:?})");
+42        self.add_record(&description, gas_used)
+43    }
+44}
+45
+46impl Display for GasReporter {
+47    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+48        for record in self.records.borrow().iter() {
+49            writeln!(f, "{} used {} gas", record.description, record.gas_used)?;
+50        }
+51
+52        Ok(())
+53    }
+54}
+55
+56#[derive(Debug)]
+57pub struct GasRecord {
+58    pub description: String,
+59    pub gas_used: u64,
+60}
+61
+62pub trait ToBeBytes {
+63    fn to_be_bytes(&self) -> [u8; 32];
+64}
+65
+66impl ToBeBytes for U256 {
+67    fn to_be_bytes(&self) -> [u8; 32] {
+68        let mut input_bytes: [u8; 32] = [0; 32];
+69        self.to_big_endian(&mut input_bytes);
+70        input_bytes
+71    }
+72}
+73
+74#[allow(dead_code)]
+75pub type Backend<'a> = evm::backend::MemoryBackend<'a>;
+76
+77#[allow(dead_code)]
+78pub type StackState<'a> = evm::executor::stack::MemoryStackState<'a, 'a, Backend<'a>>;
+79
+80#[allow(dead_code)]
+81pub type Executor<'a, 'b> = evm::executor::stack::StackExecutor<'a, 'b, StackState<'a>, ()>;
+82
+83#[allow(dead_code)]
+84pub const DEFAULT_CALLER: &str = "1000000000000000000000000000000000000001";
+85
+86#[allow(dead_code)]
+87pub struct ContractHarness {
+88    pub gas_reporter: GasReporter,
+89    pub address: H160,
+90    pub abi: ethabi::Contract,
+91    pub caller: H160,
+92    pub value: U256,
+93}
+94
+95#[allow(dead_code)]
+96impl ContractHarness {
+97    fn new(contract_address: H160, abi: ethabi::Contract) -> Self {
+98        let caller = address(DEFAULT_CALLER);
+99
+100        ContractHarness {
+101            gas_reporter: GasReporter::default(),
+102            address: contract_address,
+103            abi,
+104            caller,
+105            value: U256::zero(),
+106        }
+107    }
+108
+109    pub fn capture_call(
+110        &self,
+111        executor: &mut Executor,
+112        name: &str,
+113        input: &[ethabi::Token],
+114    ) -> evm::Capture<(evm::ExitReason, Vec<u8>), std::convert::Infallible> {
+115        let input = self.build_calldata(name, input);
+116        self.capture_call_raw_bytes(executor, input)
+117    }
+118
+119    pub fn build_calldata(&self, name: &str, input: &[ethabi::Token]) -> Vec<u8> {
+120        let function = &self.abi.functions[name][0];
+121        function
+122            .encode_input(input)
+123            .unwrap_or_else(|reason| panic!("Unable to encode input for {name}: {reason:?}"))
+124    }
+125
+126    pub fn capture_call_raw_bytes(
+127        &self,
+128        executor: &mut Executor,
+129        input: Vec<u8>,
+130    ) -> evm::Capture<(evm::ExitReason, Vec<u8>), std::convert::Infallible> {
+131        let context = evm::Context {
+132            address: self.address,
+133            caller: self.caller,
+134            apparent_value: self.value,
+135        };
+136
+137        executor.call(self.address, None, input, None, false, context)
+138    }
+139
+140    pub fn test_function(
+141        &self,
+142        executor: &mut Executor,
+143        name: &str,
+144        input: &[ethabi::Token],
+145        output: Option<&ethabi::Token>,
+146    ) {
+147        let actual_output = self.call_function(executor, name, input);
+148
+149        assert_eq!(
+150            output.map(ToOwned::to_owned),
+151            actual_output,
+152            "unexpected output from `fn {name}`"
+153        )
+154    }
+155
+156    pub fn call_function(
+157        &self,
+158        executor: &mut Executor,
+159        name: &str,
+160        input: &[ethabi::Token],
+161    ) -> Option<ethabi::Token> {
+162        let function = &self.abi.functions[name][0];
+163        let start_gas = executor.used_gas();
+164        let capture = self.capture_call(executor, name, input);
+165        let gas_used = executor.used_gas() - start_gas;
+166        self.gas_reporter
+167            .add_func_call_record(name, input, gas_used);
+168
+169        match capture {
+170            evm::Capture::Exit((ExitReason::Succeed(_), output)) => function
+171                .decode_output(&output)
+172                .unwrap_or_else(|_| panic!("unable to decode output of {}: {:?}", name, &output))
+173                .pop(),
+174            evm::Capture::Exit((reason, _)) => panic!("failed to run \"{name}\": {reason:?}"),
+175            evm::Capture::Trap(_) => panic!("trap"),
+176        }
+177    }
+178
+179    pub fn test_function_reverts(
+180        &self,
+181        executor: &mut Executor,
+182        name: &str,
+183        input: &[ethabi::Token],
+184        revert_data: &[u8],
+185    ) {
+186        validate_revert(self.capture_call(executor, name, input), revert_data)
+187    }
+188
+189    pub fn test_call_reverts(&self, executor: &mut Executor, input: Vec<u8>, revert_data: &[u8]) {
+190        validate_revert(self.capture_call_raw_bytes(executor, input), revert_data)
+191    }
+192
+193    pub fn test_function_returns(
+194        &self,
+195        executor: &mut Executor,
+196        name: &str,
+197        input: &[ethabi::Token],
+198        return_data: &[u8],
+199    ) {
+200        validate_return(self.capture_call(executor, name, input), return_data)
+201    }
+202
+203    pub fn test_call_returns(&self, executor: &mut Executor, input: Vec<u8>, return_data: &[u8]) {
+204        validate_return(self.capture_call_raw_bytes(executor, input), return_data)
+205    }
+206
+207    // Executor must be passed by value to get emitted events.
+208    pub fn events_emitted(&self, executor: Executor, events: &[(&str, &[ethabi::Token])]) {
+209        let raw_logs = executor
+210            .into_state()
+211            .deconstruct()
+212            .1
+213            .into_iter()
+214            .map(|log| ethabi::RawLog::from((log.topics, log.data)))
+215            .collect::<Vec<ethabi::RawLog>>();
+216
+217        for (name, expected_output) in events {
+218            let event = self
+219                .abi
+220                .events()
+221                .find(|event| event.name.eq(name))
+222                .expect("unable to find event for name");
+223
+224            let outputs_for_event = raw_logs
+225                .iter()
+226                .filter_map(|raw_log| event.parse_log(raw_log.clone()).ok())
+227                .map(|event_log| {
+228                    event_log
+229                        .params
+230                        .into_iter()
+231                        .map(|param| param.value)
+232                        .collect::<Vec<_>>()
+233                })
+234                .collect::<Vec<_>>();
+235
+236            if !outputs_for_event.iter().any(|v| v == expected_output) {
+237                println!("raw logs dump: {raw_logs:?}");
+238                panic!(
+239                    "no \"{name}\" logs matching: {expected_output:?}\nfound: {outputs_for_event:?}"
+240                )
+241            }
+242        }
+243    }
+244
+245    pub fn set_caller(&mut self, caller: H160) {
+246        self.caller = caller;
+247    }
+248}
+249
+250#[allow(dead_code)]
+251pub fn with_executor(test: &dyn Fn(Executor)) {
+252    let vicinity = evm::backend::MemoryVicinity {
+253        gas_price: U256::zero(),
+254        origin: H160::zero(),
+255        chain_id: U256::zero(),
+256        block_hashes: Vec::new(),
+257        block_number: U256::zero(),
+258        block_coinbase: H160::zero(),
+259        block_timestamp: U256::zero(),
+260        block_difficulty: U256::zero(),
+261        block_gas_limit: primitive_types::U256::MAX,
+262        block_base_fee_per_gas: U256::zero(),
+263    };
+264    let state: BTreeMap<primitive_types::H160, evm::backend::MemoryAccount> = BTreeMap::new();
+265    let backend = evm::backend::MemoryBackend::new(&vicinity, state);
+266
+267    with_executor_backend(backend, test)
+268}
+269
+270#[allow(dead_code)]
+271pub fn with_executor_backend(backend: Backend, test: &dyn Fn(Executor)) {
+272    let config = evm::Config::london();
+273    let stack_state = StackState::new(
+274        evm::executor::stack::StackSubstateMetadata::new(u64::MAX, &config),
+275        &backend,
+276    );
+277    let executor = Executor::new_with_precompiles(stack_state, &config, &());
+278
+279    test(executor)
+280}
+281
+282pub fn validate_revert(
+283    capture: evm::Capture<(evm::ExitReason, Vec<u8>), std::convert::Infallible>,
+284    expected_data: &[u8],
+285) {
+286    if let evm::Capture::Exit((evm::ExitReason::Revert(_), output)) = capture {
+287        assert_eq!(
+288            format!("0x{}", hex::encode(output)),
+289            format!("0x{}", hex::encode(expected_data))
+290        );
+291    } else {
+292        panic!("Method was expected to revert but didn't")
+293    };
+294}
+295
+296pub fn validate_return(
+297    capture: evm::Capture<(evm::ExitReason, Vec<u8>), std::convert::Infallible>,
+298    expected_data: &[u8],
+299) {
+300    if let evm::Capture::Exit((evm::ExitReason::Succeed(_), output)) = capture {
+301        assert_eq!(
+302            format!("0x{}", hex::encode(output)),
+303            format!("0x{}", hex::encode(expected_data))
+304        );
+305    } else {
+306        panic!("Method was expected to return but didn't")
+307    };
+308}
+309
+310pub fn encoded_panic_assert() -> Vec<u8> {
+311    encode_revert("Panic(uint256)", &[uint_token(0x01)])
+312}
+313
+314pub fn encoded_over_or_underflow() -> Vec<u8> {
+315    encode_revert("Panic(uint256)", &[uint_token(0x11)])
+316}
+317
+318pub fn encoded_panic_out_of_bounds() -> Vec<u8> {
+319    encode_revert("Panic(uint256)", &[uint_token(0x32)])
+320}
+321
+322pub fn encoded_div_or_mod_by_zero() -> Vec<u8> {
+323    encode_revert("Panic(uint256)", &[uint_token(0x12)])
+324}
+325
+326pub fn encoded_invalid_abi_data() -> Vec<u8> {
+327    encode_revert("Error(uint256)", &[uint_token(0x103)])
+328}
+329
+330#[allow(dead_code)]
+331#[cfg(feature = "solc-backend")]
+332pub fn deploy_contract(
+333    executor: &mut Executor,
+334    fixture: &str,
+335    contract_name: &str,
+336    init_params: &[ethabi::Token],
+337) -> ContractHarness {
+338    let mut db = driver::Db::default();
+339    let compiled_module = match driver::compile_single_file(
+340        &mut db,
+341        fixture,
+342        test_files::fixture(fixture),
+343        true,
+344        false,
+345        true,
+346    ) {
+347        Ok(module) => module,
+348        Err(error) => {
+349            fe_common::diagnostics::print_diagnostics(&db, &error.0);
+350            panic!("failed to compile module: {fixture}")
+351        }
+352    };
+353
+354    let compiled_contract = compiled_module
+355        .contracts
+356        .get(contract_name)
+357        .expect("could not find contract in fixture");
+358
+359    _deploy_contract(
+360        executor,
+361        &compiled_contract.bytecode,
+362        &compiled_contract.json_abi,
+363        init_params,
+364    )
+365}
+366
+367#[allow(dead_code)]
+368#[cfg(feature = "solc-backend")]
+369pub fn deploy_contract_from_ingot(
+370    executor: &mut Executor,
+371    path: &str,
+372    contract_name: &str,
+373    init_params: &[ethabi::Token],
+374) -> ContractHarness {
+375    use fe_common::utils::files::BuildFiles;
+376
+377    let files = test_files::fixture_dir_files("ingots");
+378    let build_files = BuildFiles::load_static(files, path).expect("failed to load build files");
+379    let mut db = driver::Db::default();
+380    let compiled_module = match driver::compile_ingot(&mut db, &build_files, true, false, true) {
+381        Ok(module) => module,
+382        Err(error) => {
+383            fe_common::diagnostics::print_diagnostics(&db, &error.0);
+384            panic!("failed to compile ingot: {path}")
+385        }
+386    };
+387
+388    let compiled_contract = compiled_module
+389        .contracts
+390        .get(contract_name)
+391        .expect("could not find contract in fixture");
+392
+393    _deploy_contract(
+394        executor,
+395        &compiled_contract.bytecode,
+396        &compiled_contract.json_abi,
+397        init_params,
+398    )
+399}
+400
+401#[allow(dead_code)]
+402#[cfg(feature = "solc-backend")]
+403pub fn deploy_solidity_contract(
+404    executor: &mut Executor,
+405    fixture: &str,
+406    contract_name: &str,
+407    init_params: &[ethabi::Token],
+408    optimized: bool,
+409) -> ContractHarness {
+410    let src = test_files::fixture(fixture)
+411        .replace('\n', "")
+412        .replace('"', "\\\"");
+413
+414    let (bytecode, abi) = compile_solidity_contract(contract_name, &src, optimized)
+415        .expect("Could not compile contract");
+416
+417    _deploy_contract(executor, &bytecode, &abi, init_params)
+418}
+419
+420#[allow(dead_code)]
+421pub fn encode_error_reason(reason: &str) -> Vec<u8> {
+422    encode_revert("Error(string)", &[string_token(reason)])
+423}
+424
+425#[allow(dead_code)]
+426pub fn encode_revert(selector: &str, input: &[ethabi::Token]) -> Vec<u8> {
+427    let mut data = String::new();
+428    for param in input {
+429        let encoded = match param {
+430            ethabi::Token::Uint(val) | ethabi::Token::Int(val) => {
+431                format!("{:0>64}", format!("{val:x}"))
+432            }
+433            ethabi::Token::Bool(val) => format!("{:0>64x}", *val as i32),
+434            ethabi::Token::String(val) => {
+435                const DATA_OFFSET: &str =
+436                    "0000000000000000000000000000000000000000000000000000000000000020";
+437
+438                // Length of the string padded to 32 bit hex
+439                let string_len = format!("{:0>64x}", val.len());
+440
+441                let mut string_bytes = val.as_bytes().to_vec();
+442                while string_bytes.len() % 32 != 0 {
+443                    string_bytes.push(0)
+444                }
+445                // The bytes of the string itself, right padded to consume a multiple of 32
+446                // bytes
+447                let string_bytes = hex::encode(&string_bytes);
+448
+449                format!("{DATA_OFFSET}{string_len}{string_bytes}")
+450            }
+451            _ => todo!("Other ABI types not supported yet"),
+452        };
+453        data.push_str(&encoded);
+454    }
+455
+456    let all = format!("{}{}", get_function_selector(selector), data);
+457    hex::decode(&all).unwrap_or_else(|_| panic!("No valid hex: {}", &all))
+458}
+459
+460fn get_function_selector(signature: &str) -> String {
+461    // Function selector (e.g first 4 bytes of keccak("Error(string)")
+462    hex::encode(&keccak::full_as_bytes(signature.as_bytes())[..4])
+463}
+464
+465fn _deploy_contract(
+466    executor: &mut Executor,
+467    bytecode: &str,
+468    abi: &str,
+469    init_params: &[ethabi::Token],
+470) -> ContractHarness {
+471    let abi = ethabi::Contract::load(abi.as_bytes()).expect("unable to load the ABI");
+472
+473    let mut bytecode = hex::decode(bytecode).expect("failed to decode bytecode");
+474
+475    if let Some(constructor) = &abi.constructor {
+476        bytecode = constructor.encode_input(bytecode, init_params).unwrap()
+477    }
+478
+479    if let evm::Capture::Exit(exit) = executor.create(
+480        address(DEFAULT_CALLER),
+481        evm_runtime::CreateScheme::Legacy {
+482            caller: address(DEFAULT_CALLER),
+483        },
+484        U256::zero(),
+485        bytecode,
+486        None,
+487    ) {
+488        return ContractHarness::new(
+489            exit.1
+490                .unwrap_or_else(|| panic!("Unable to retrieve contract address: {:?}", exit.0)),
+491            abi,
+492        );
+493    }
+494
+495    panic!("Failed to create contract")
+496}
+497
+498#[derive(Debug)]
+499pub struct SolidityCompileError(Vec<serde_json::Value>);
+500
+501impl std::fmt::Display for SolidityCompileError {
+502    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+503        write!(f, "{:?}", &self.0[..])
+504    }
+505}
+506
+507impl std::error::Error for SolidityCompileError {}
+508
+509#[cfg(feature = "solc-backend")]
+510pub fn compile_solidity_contract(
+511    name: &str,
+512    solidity_src: &str,
+513    optimized: bool,
+514) -> Result<(String, String), SolidityCompileError> {
+515    let solc_config = r#"
+516    {
+517        "language": "Solidity",
+518        "sources": { "input.sol": { "content": "{src}" } },
+519        "settings": {
+520          "optimizer": { "enabled": {optimizer_enabled} },
+521          "outputSelection": { "*": { "*": ["*"], "": [ "*" ] } }
+522        }
+523      }
+524    "#;
+525    let solc_config = solc_config
+526        .replace("{src}", solidity_src)
+527        .replace("{optimizer_enabled}", &optimized.to_string());
+528
+529    let raw_output = solc::compile(&solc_config);
+530
+531    let output: serde_json::Value =
+532        serde_json::from_str(&raw_output).expect("Unable to compile contract");
+533
+534    if output["errors"].is_array() {
+535        let severity: serde_json::Value =
+536            serde_json::to_value("error").expect("Unable to convert into serde value type");
+537        let errors: serde_json::Value = output["errors"]
+538            .as_array()
+539            .unwrap()
+540            .iter()
+541            .cloned()
+542            .filter_map(|err| {
+543                if err["severity"] == severity {
+544                    Some(err["formattedMessage"].clone())
+545                } else {
+546                    None
+547                }
+548            })
+549            .collect();
+550
+551        let errors_list = errors
+552            .as_array()
+553            .unwrap_or_else(|| panic!("Unable to parse error properly"));
+554        if !errors_list.is_empty() {
+555            return Err(SolidityCompileError(errors_list.clone()));
+556        }
+557    }
+558
+559    let bytecode = output["contracts"]["input.sol"][name]["evm"]["bytecode"]["object"]
+560        .to_string()
+561        .replace('"', "");
+562
+563    let abi = if let serde_json::Value::Array(data) = &output["contracts"]["input.sol"][name]["abi"]
+564    {
+565        data.iter()
+566            .filter(|val| {
+567                // ethabi doesn't yet support error types so we just filter them out for now
+568                // https://github.com/rust-ethereum/ethabi/issues/225
+569                val["type"] != "error"
+570            })
+571            .cloned()
+572            .collect::<Vec<_>>()
+573    } else {
+574        vec![]
+575    };
+576
+577    let abi = serde_json::Value::Array(abi).to_string();
+578
+579    if [&bytecode, &abi].iter().any(|val| val == &"null") {
+580        return Err(SolidityCompileError(vec![serde_json::Value::String(
+581            String::from("Bytecode not found"),
+582        )]));
+583    }
+584
+585    Ok((bytecode, abi))
+586}
+587
+588#[allow(dead_code)]
+589pub fn load_contract(address: H160, fixture: &str, contract_name: &str) -> ContractHarness {
+590    let mut db = driver::Db::default();
+591    let compiled_module = driver::compile_single_file(
+592        &mut db,
+593        fixture,
+594        test_files::fixture(fixture),
+595        true,
+596        false,
+597        true,
+598    )
+599    .unwrap_or_else(|err| {
+600        print_diagnostics(&db, &err.0);
+601        panic!("failed to compile fixture: {fixture}");
+602    });
+603    let compiled_contract = compiled_module
+604        .contracts
+605        .get(contract_name)
+606        .expect("could not find contract in fixture");
+607    let abi = ethabi::Contract::load(compiled_contract.json_abi.as_bytes())
+608        .expect("unable to load the ABI");
+609
+610    ContractHarness::new(address, abi)
+611}
+612pub struct Runtime {
+613    functions: Vec<yul::Statement>,
+614    test_statements: Vec<yul::Statement>,
+615    data: Vec<yul::Data>,
+616}
+617
+618impl Default for Runtime {
+619    fn default() -> Self {
+620        Self::new()
+621    }
+622}
+623
+624pub struct ExecutionOutput {
+625    exit_reason: ExitReason,
+626    data: Vec<u8>,
+627}
+628
+629#[allow(dead_code)]
+630impl Runtime {
+631    /// Create a new `Runtime` instance.
+632    pub fn new() -> Runtime {
+633        Runtime {
+634            functions: vec![],
+635            test_statements: vec![],
+636            data: vec![],
+637        }
+638    }
+639
+640    /// Add the given set of functions
+641    pub fn with_functions(self, fns: Vec<yul::Statement>) -> Runtime {
+642        Runtime {
+643            functions: fns,
+644            ..self
+645        }
+646    }
+647
+648    /// Add the given set of test statements
+649    pub fn with_test_statements(self, statements: Vec<yul::Statement>) -> Runtime {
+650        Runtime {
+651            test_statements: statements,
+652            ..self
+653        }
+654    }
+655
+656    // Add the given set of data
+657    pub fn with_data(self, data: Vec<yul::Data>) -> Runtime {
+658        Runtime { data, ..self }
+659    }
+660
+661    /// Generate the top level YUL object
+662    pub fn to_yul(&self) -> yul::Object {
+663        let all_statements = [self.functions.clone(), self.test_statements.clone()].concat();
+664        yul::Object {
+665            name: identifier! { Contract },
+666            code: code! { [all_statements...] },
+667            objects: vec![],
+668            data: self.data.clone(),
+669        }
+670    }
+671
+672    #[cfg(feature = "solc-backend")]
+673    pub fn execute(&self, executor: &mut Executor) -> ExecutionOutput {
+674        let (exit_reason, data) = execute_runtime_functions(executor, self);
+675        ExecutionOutput::new(exit_reason, data)
+676    }
+677}
+678
+679#[allow(dead_code)]
+680impl ExecutionOutput {
+681    /// Create an `ExecutionOutput` instance
+682    pub fn new(exit_reason: ExitReason, data: Vec<u8>) -> ExecutionOutput {
+683        ExecutionOutput { exit_reason, data }
+684    }
+685
+686    /// Panic if the execution did not succeed.
+687    pub fn expect_success(self) -> ExecutionOutput {
+688        if let ExecutionOutput {
+689            exit_reason: ExitReason::Succeed(_),
+690            ..
+691        } = &self
+692        {
+693            self
+694        } else {
+695            panic!("Execution did not succeed: {:?}", &self.exit_reason)
+696        }
+697    }
+698
+699    /// Panic if the execution did not revert.
+700    pub fn expect_revert(self) -> ExecutionOutput {
+701        if let ExecutionOutput {
+702            exit_reason: ExitReason::Revert(_),
+703            ..
+704        } = &self
+705        {
+706            self
+707        } else {
+708            panic!("Execution did not revert: {:?}", &self.exit_reason)
+709        }
+710    }
+711
+712    /// Panic if the output is not an encoded error reason of the given string.
+713    pub fn expect_revert_reason(self, reason: &str) -> ExecutionOutput {
+714        assert_eq!(self.data, encode_error_reason(reason));
+715        self
+716    }
+717}
+718
+719#[cfg(feature = "solc-backend")]
+720fn execute_runtime_functions(executor: &mut Executor, runtime: &Runtime) -> (ExitReason, Vec<u8>) {
+721    let yul_code = runtime.to_yul().to_string().replace('"', "\\\"");
+722    let contract_bytecode = fe_yulc::compile_single_contract("Contract", &yul_code, false, false)
+723        .expect("failed to compile Yul");
+724    let bytecode = hex::decode(contract_bytecode.bytecode).expect("failed to decode bytecode");
+725
+726    if let evm::Capture::Exit((reason, _, output)) = executor.create(
+727        address(DEFAULT_CALLER),
+728        evm_runtime::CreateScheme::Legacy {
+729            caller: address(DEFAULT_CALLER),
+730        },
+731        U256::zero(),
+732        bytecode,
+733        None,
+734    ) {
+735        (reason, output)
+736    } else {
+737        panic!("EVM trap during test")
+738    }
+739}
+740
+741#[allow(dead_code)]
+742pub fn uint_token(n: u64) -> ethabi::Token {
+743    ethabi::Token::Uint(U256::from(n))
+744}
+745
+746#[allow(dead_code)]
+747pub fn uint_token_from_dec_str(val: &str) -> ethabi::Token {
+748    ethabi::Token::Uint(U256::from_dec_str(val).expect("Not a valid dec string"))
+749}
+750
+751#[allow(dead_code)]
+752pub fn int_token(val: i64) -> ethabi::Token {
+753    ethabi::Token::Int(to_2s_complement(val))
+754}
+755
+756#[allow(dead_code)]
+757pub fn string_token(s: &str) -> ethabi::Token {
+758    ethabi::Token::String(s.to_string())
+759}
+760
+761#[allow(dead_code)]
+762pub fn address(s: &str) -> H160 {
+763    H160::from_str(s).unwrap_or_else(|_| panic!("couldn't create address from: {s}"))
+764}
+765
+766#[allow(dead_code)]
+767pub fn address_token(s: &str) -> ethabi::Token {
+768    // left pads to 40 characters
+769    ethabi::Token::Address(address(&format!("{s:0>40}")))
+770}
+771
+772#[allow(dead_code)]
+773pub fn bool_token(val: bool) -> ethabi::Token {
+774    ethabi::Token::Bool(val)
+775}
+776
+777#[allow(dead_code)]
+778pub fn bytes_token(s: &str) -> ethabi::Token {
+779    ethabi::Token::Bytes(ethabi::Bytes::from(s))
+780}
+781
+782#[allow(dead_code)]
+783pub fn uint_array_token(v: &[u64]) -> ethabi::Token {
+784    ethabi::Token::FixedArray(v.iter().map(|n| uint_token(*n)).collect())
+785}
+786
+787#[allow(dead_code)]
+788pub fn int_array_token(v: &[i64]) -> ethabi::Token {
+789    ethabi::Token::FixedArray(v.iter().map(|n| int_token(*n)).collect())
+790}
+791
+792#[allow(dead_code)]
+793pub fn address_array_token(v: &[&str]) -> ethabi::Token {
+794    ethabi::Token::FixedArray(v.iter().map(|s| address_token(s)).collect())
+795}
+796
+797#[allow(dead_code)]
+798pub fn tuple_token(tokens: &[ethabi::Token]) -> ethabi::Token {
+799    ethabi::Token::Tuple(tokens.to_owned())
+800}
+801
+802#[allow(dead_code)]
+803pub fn to_2s_complement(val: i64) -> U256 {
+804    // Since this API takes an `i64` we can be sure that the min and max values
+805    // will never be above what fits the `I256` type which has the same capacity
+806    // as U256 but splits it so that one half covers numbers above 0 and the
+807    // other half covers the numbers below 0.
+808
+809    // Conversion to Two's Complement: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
+810
+811    if val >= 0 {
+812        U256::from(val)
+813    } else {
+814        let positive_val = -val;
+815        get_2s_complement_for_negative(U256::from(positive_val))
+816    }
+817}
+818
+819/// To get the 2s complement value for e.g. -128 call
+820/// get_2s_complement_for_negative(128)
+821#[allow(dead_code)]
+822pub fn get_2s_complement_for_negative(assume_negative: U256) -> U256 {
+823    assume_negative.overflowing_neg().0
+824}
+825
+826#[allow(dead_code)]
+827pub struct NumericAbiTokenBounds {
+828    pub size: u64,
+829    pub u_min: ethabi::Token,
+830    pub i_min: ethabi::Token,
+831    pub u_max: ethabi::Token,
+832    pub i_max: ethabi::Token,
+833}
+834
+835impl NumericAbiTokenBounds {
+836    #[allow(dead_code)]
+837    pub fn get_all() -> [NumericAbiTokenBounds; 6] {
+838        let zero = uint_token(0);
+839        let u64_max = ethabi::Token::Uint(U256::from(2).pow(U256::from(64)) - 1);
+840        let i64_min = ethabi::Token::Int(get_2s_complement_for_negative(
+841            U256::from(2).pow(U256::from(63)),
+842        ));
+843
+844        let u128_max = ethabi::Token::Uint(U256::from(2).pow(U256::from(128)) - 1);
+845        let i128_max = ethabi::Token::Int(U256::from(2).pow(U256::from(127)) - 1);
+846        let i128_min = ethabi::Token::Int(get_2s_complement_for_negative(
+847            U256::from(2).pow(U256::from(127)),
+848        ));
+849
+850        let u256_max = ethabi::Token::Uint(U256::MAX);
+851        let i256_max = ethabi::Token::Int(U256::from(2).pow(U256::from(255)) - 1);
+852        let i256_min = ethabi::Token::Int(get_2s_complement_for_negative(
+853            U256::from(2).pow(U256::from(255)),
+854        ));
+855
+856        [
+857            NumericAbiTokenBounds {
+858                size: 8,
+859                u_min: zero.clone(),
+860                i_min: int_token(-128),
+861                u_max: uint_token(255),
+862                i_max: int_token(127),
+863            },
+864            NumericAbiTokenBounds {
+865                size: 16,
+866                u_min: zero.clone(),
+867                i_min: int_token(-32768),
+868                u_max: uint_token(65535),
+869                i_max: int_token(32767),
+870            },
+871            NumericAbiTokenBounds {
+872                size: 32,
+873                u_min: zero.clone(),
+874                i_min: int_token(-2147483648),
+875                u_max: uint_token(4294967295),
+876                i_max: int_token(2147483647),
+877            },
+878            NumericAbiTokenBounds {
+879                size: 64,
+880                u_min: zero.clone(),
+881                i_min: i64_min,
+882                u_max: u64_max,
+883                i_max: int_token(9223372036854775807),
+884            },
+885            NumericAbiTokenBounds {
+886                size: 128,
+887                u_min: zero.clone(),
+888                i_min: i128_min,
+889                u_max: u128_max,
+890                i_max: i128_max,
+891            },
+892            NumericAbiTokenBounds {
+893                size: 256,
+894                u_min: zero,
+895                i_min: i256_min,
+896                u_max: u256_max,
+897                i_max: i256_max,
+898            },
+899        ]
+900    }
+901}
\ No newline at end of file diff --git a/compiler-docs/src/fe_compiler_tests/lib.rs.html b/compiler-docs/src/fe_compiler_tests/lib.rs.html new file mode 100644 index 0000000000..053ff65cb3 --- /dev/null +++ b/compiler-docs/src/fe_compiler_tests/lib.rs.html @@ -0,0 +1,68 @@ +lib.rs - source

fe_compiler_tests/
lib.rs

1#![cfg(feature = "solc-backend")]
+2#![allow(dead_code)]
+3use std::path::Path;
+4
+5use dir_test::{dir_test, Fixture};
+6use fe_common::diagnostics::print_diagnostics;
+7use fe_common::utils::files::BuildFiles;
+8use fe_test_runner::TestSink;
+9
+10#[dir_test(dir: "$CARGO_MANIFEST_DIR/fixtures/files", glob: "*.fe")]
+11fn single_file_test_run(fixture: Fixture<&str>) {
+12    let mut db = fe_driver::Db::default();
+13    let tests = match fe_driver::compile_single_file_tests(
+14        &mut db,
+15        fixture.path(),
+16        fixture.content(),
+17        true,
+18    ) {
+19        Ok((_, tests)) => tests,
+20        Err(error) => {
+21            eprintln!("Unable to compile {}.", fixture.path());
+22            print_diagnostics(&db, &error.0);
+23            panic!("failed to compile tests")
+24        }
+25    };
+26
+27    let mut test_sink = TestSink::new(true);
+28
+29    for test in tests {
+30        test.execute(&mut test_sink);
+31    }
+32
+33    if test_sink.failure_count() != 0 {
+34        panic!("{}", test_sink)
+35    }
+36}
+37
+38#[dir_test(dir: "$CARGO_MANIFEST_DIR/fixtures/ingots/", glob: "**/fe.toml")]
+39fn ingot_test_run(fixture: Fixture<&str>) {
+40    let input_path = fixture.path().trim_end_matches("/fe.toml");
+41    let optimize = true;
+42
+43    if !Path::new(input_path).exists() {
+44        panic!("Input directory does not exist: `{input_path}`.");
+45    }
+46
+47    let build_files =
+48        BuildFiles::load_fs(input_path).expect("failed to load build files from file system");
+49
+50    let mut db = fe_driver::Db::default();
+51    match fe_driver::compile_ingot_tests(&mut db, &build_files, optimize) {
+52        Ok(test_batches) => {
+53            let mut sink = TestSink::new(true);
+54            for (_, tests) in test_batches {
+55                for test in tests {
+56                    test.execute(&mut sink);
+57                }
+58                if sink.failure_count() != 0 {
+59                    panic!("{}", sink)
+60                }
+61            }
+62        }
+63        Err(error) => {
+64            print_diagnostics(&db, &error.0);
+65            panic!("Unable to compile {input_path}.");
+66        }
+67    }
+68}
\ No newline at end of file diff --git a/compiler-docs/src/fe_compiler_tests_legacy/lib.rs.html b/compiler-docs/src/fe_compiler_tests_legacy/lib.rs.html new file mode 100644 index 0000000000..a595a4c002 --- /dev/null +++ b/compiler-docs/src/fe_compiler_tests_legacy/lib.rs.html @@ -0,0 +1,18 @@ +lib.rs - source

fe_compiler_tests_legacy/
lib.rs

1#[cfg(test)]
+2mod crashes;
+3#[cfg(test)]
+4mod demo_erc20;
+5#[cfg(test)]
+6mod demo_guestbook;
+7#[cfg(test)]
+8mod demo_simple_open_auction;
+9#[cfg(test)]
+10mod demo_uniswap;
+11#[cfg(test)]
+12mod differential;
+13#[cfg(test)]
+14mod features;
+15#[cfg(test)]
+16mod solidity;
+17#[cfg(test)]
+18mod stress;
\ No newline at end of file diff --git a/compiler-docs/src/fe_driver/lib.rs.html b/compiler-docs/src/fe_driver/lib.rs.html new file mode 100644 index 0000000000..daa1bf6785 --- /dev/null +++ b/compiler-docs/src/fe_driver/lib.rs.html @@ -0,0 +1,359 @@ +lib.rs - source

fe_driver/
lib.rs

1#![allow(unused_imports, dead_code)]
+2
+3use fe_abi::event::AbiEvent;
+4use fe_abi::types::{AbiTupleField, AbiType};
+5pub use fe_codegen::db::{CodegenDb, Db};
+6
+7use fe_analyzer::namespace::items::{ContractId, FunctionId, IngotId, IngotMode, ModuleId};
+8use fe_common::diagnostics::Diagnostic;
+9use fe_common::files::FileKind;
+10use fe_common::{db::Upcast, utils::files::BuildFiles};
+11use fe_parser::ast::SmolStr;
+12use fe_test_runner::ethabi::{Event, EventParam, ParamType};
+13use fe_test_runner::TestSink;
+14use indexmap::{indexmap, IndexMap};
+15use serde_json::Value;
+16use std::fmt::Display;
+17
+18/// The artifacts of a compiled module.
+19pub struct CompiledModule {
+20    pub src_ast: String,
+21    pub lowered_ast: String,
+22    pub contracts: IndexMap<String, CompiledContract>,
+23}
+24
+25/// The artifacts of a compiled contract.
+26pub struct CompiledContract {
+27    pub json_abi: String,
+28    pub yul: String,
+29    pub origin: ContractId,
+30    #[cfg(feature = "solc-backend")]
+31    pub bytecode: String,
+32    #[cfg(feature = "solc-backend")]
+33    pub runtime_bytecode: String,
+34}
+35
+36#[cfg(feature = "solc-backend")]
+37#[derive(Debug, Clone, PartialEq, Eq)]
+38pub struct CompiledTest {
+39    pub name: SmolStr,
+40    events: Vec<AbiEvent>,
+41    bytecode: String,
+42}
+43
+44#[cfg(feature = "solc-backend")]
+45impl CompiledTest {
+46    pub fn new(name: SmolStr, events: Vec<AbiEvent>, bytecode: String) -> Self {
+47        Self {
+48            name,
+49            events,
+50            bytecode,
+51        }
+52    }
+53
+54    pub fn execute(&self, sink: &mut TestSink) -> bool {
+55        let events = map_abi_events(&self.events);
+56        fe_test_runner::execute(&self.name, &events, &self.bytecode, sink)
+57    }
+58}
+59
+60fn map_abi_events(events: &[AbiEvent]) -> Vec<Event> {
+61    events.iter().map(map_abi_event).collect()
+62}
+63
+64fn map_abi_event(event: &AbiEvent) -> Event {
+65    let inputs = event
+66        .inputs
+67        .iter()
+68        .map(|input| {
+69            let kind = map_abi_type(&input.ty);
+70            EventParam {
+71                name: input.name.to_owned(),
+72                kind,
+73                indexed: input.indexed,
+74            }
+75        })
+76        .collect();
+77    Event {
+78        name: event.name.to_owned(),
+79        inputs,
+80        anonymous: event.anonymous,
+81    }
+82}
+83
+84fn map_abi_type(typ: &AbiType) -> ParamType {
+85    match typ {
+86        AbiType::UInt(value) => ParamType::Uint(*value),
+87        AbiType::Int(value) => ParamType::Int(*value),
+88        AbiType::Address => ParamType::Address,
+89        AbiType::Bool => ParamType::Bool,
+90        AbiType::Function => panic!("function cannot be mapped to an actual ABI value type"),
+91        AbiType::Array { elem_ty, len } => {
+92            ParamType::FixedArray(Box::new(map_abi_type(elem_ty)), *len)
+93        }
+94        AbiType::Tuple(params) => ParamType::Tuple(map_abi_types(params)),
+95        AbiType::Bytes => ParamType::Bytes,
+96        AbiType::String => ParamType::String,
+97    }
+98}
+99
+100fn map_abi_types(fields: &[AbiTupleField]) -> Vec<ParamType> {
+101    fields.iter().map(|field| map_abi_type(&field.ty)).collect()
+102}
+103
+104#[derive(Debug)]
+105pub struct CompileError(pub Vec<Diagnostic>);
+106
+107pub fn check_single_file(db: &mut Db, path: &str, src: &str) -> Vec<Diagnostic> {
+108    let module = ModuleId::new_standalone(db, path, src);
+109    module.diagnostics(db)
+110}
+111
+112pub fn compile_single_file(
+113    db: &mut Db,
+114    path: &str,
+115    src: &str,
+116    with_bytecode: bool,
+117    with_runtime_bytecode: bool,
+118    optimize: bool,
+119) -> Result<CompiledModule, CompileError> {
+120    let module = ModuleId::new_standalone(db, path, src);
+121    let diags = module.diagnostics(db);
+122
+123    if diags.is_empty() {
+124        compile_module(db, module, with_bytecode, with_runtime_bytecode, optimize)
+125    } else {
+126        Err(CompileError(diags))
+127    }
+128}
+129
+130#[cfg(feature = "solc-backend")]
+131pub fn compile_single_file_tests(
+132    db: &mut Db,
+133    path: &str,
+134    src: &str,
+135    optimize: bool,
+136) -> Result<(SmolStr, Vec<CompiledTest>), CompileError> {
+137    let module = ModuleId::new_standalone(db, path, src);
+138    let diags = module.diagnostics(db);
+139
+140    if diags.is_empty() {
+141        Ok((module.name(db), compile_module_tests(db, module, optimize)))
+142    } else {
+143        Err(CompileError(diags))
+144    }
+145}
+146
+147// Run analysis with ingot
+148// Return vector error,waring...
+149pub fn check_ingot(db: &mut Db, build_files: &BuildFiles) -> Vec<Diagnostic> {
+150    let ingot = IngotId::from_build_files(db, build_files);
+151
+152    let mut diags = ingot.diagnostics(db);
+153    ingot.sink_external_ingot_diagnostics(db, &mut diags);
+154    diags
+155}
+156
+157/// Compiles the main module of a project.
+158///
+159/// If `with_bytecode` is set to false, the compiler will skip the final Yul ->
+160/// Bytecode pass. This is useful when debugging invalid Yul code.
+161pub fn compile_ingot(
+162    db: &mut Db,
+163    build_files: &BuildFiles,
+164    with_bytecode: bool,
+165    with_runtime_bytecode: bool,
+166    optimize: bool,
+167) -> Result<CompiledModule, CompileError> {
+168    let ingot = IngotId::from_build_files(db, build_files);
+169
+170    let mut diags = ingot.diagnostics(db);
+171    ingot.sink_external_ingot_diagnostics(db, &mut diags);
+172    if !diags.is_empty() {
+173        return Err(CompileError(diags));
+174    }
+175    let main_module = ingot
+176        .root_module(db)
+177        .expect("missing root module, with no diagnostic");
+178    compile_module(
+179        db,
+180        main_module,
+181        with_bytecode,
+182        with_runtime_bytecode,
+183        optimize,
+184    )
+185}
+186
+187#[cfg(feature = "solc-backend")]
+188pub fn compile_ingot_tests(
+189    db: &mut Db,
+190    build_files: &BuildFiles,
+191    optimize: bool,
+192) -> Result<Vec<(SmolStr, Vec<CompiledTest>)>, CompileError> {
+193    let ingot = IngotId::from_build_files(db, build_files);
+194
+195    let mut diags = ingot.diagnostics(db);
+196    ingot.sink_external_ingot_diagnostics(db, &mut diags);
+197    if !diags.is_empty() {
+198        return Err(CompileError(diags));
+199    }
+200
+201    if diags.is_empty() {
+202        Ok(ingot
+203            .all_modules(db)
+204            .iter()
+205            .fold(vec![], |mut accum, module| {
+206                accum.push((module.name(db), compile_module_tests(db, *module, optimize)));
+207                accum
+208            }))
+209    } else {
+210        Err(CompileError(diags))
+211    }
+212}
+213
+214/// Returns graphviz string.
+215// TODO: This is temporary function for debugging.
+216pub fn dump_mir_single_file(db: &mut Db, path: &str, src: &str) -> Result<String, CompileError> {
+217    let module = ModuleId::new_standalone(db, path, src);
+218
+219    let diags = module.diagnostics(db);
+220    if !diags.is_empty() {
+221        return Err(CompileError(diags));
+222    }
+223
+224    let mut text = vec![];
+225    fe_mir::graphviz::write_mir_graphs(db, module, &mut text).unwrap();
+226    Ok(String::from_utf8(text).unwrap())
+227}
+228
+229#[cfg(feature = "solc-backend")]
+230fn compile_test(db: &mut Db, test: FunctionId, optimize: bool) -> CompiledTest {
+231    let yul_test = fe_codegen::yul::isel::lower_test(db, test)
+232        .to_string()
+233        .replace('"', "\\\"");
+234    let bytecode = compile_to_evm("test", &yul_test, optimize, false).bytecode;
+235    let events = db.codegen_abi_module_events(test.module(db));
+236    CompiledTest::new(test.name(db), events, bytecode)
+237}
+238
+239#[cfg(feature = "solc-backend")]
+240fn compile_module_tests(db: &mut Db, module_id: ModuleId, optimize: bool) -> Vec<CompiledTest> {
+241    module_id
+242        .tests(db)
+243        .iter()
+244        .map(|test| compile_test(db, *test, optimize))
+245        .collect()
+246}
+247
+248#[cfg(feature = "solc-backend")]
+249fn compile_module(
+250    db: &mut Db,
+251    module_id: ModuleId,
+252    with_bytecode: bool,
+253    with_runtime_bytecode: bool,
+254    optimize: bool,
+255) -> Result<CompiledModule, CompileError> {
+256    let mut contracts = IndexMap::default();
+257
+258    for contract in module_id.all_contracts(db.upcast()) {
+259        let name = &contract.data(db.upcast()).name;
+260        let abi = db.codegen_abi_contract(contract);
+261        let yul_contract = compile_to_yul(db, contract);
+262
+263        let (bytecode, runtime_bytecode) = if with_bytecode || with_runtime_bytecode {
+264            let deployable_name = db.codegen_contract_deployer_symbol_name(contract);
+265            let bytecode = compile_to_evm(
+266                deployable_name.as_str(),
+267                &yul_contract,
+268                optimize,
+269                with_runtime_bytecode,
+270            );
+271            (bytecode.bytecode, bytecode.runtime_bytecode)
+272        } else {
+273            ("".to_string(), "".to_string())
+274        };
+275
+276        contracts.insert(
+277            name.to_string(),
+278            // Maybe put the ContractID here so we can trace it back to the source file
+279            CompiledContract {
+280                json_abi: serde_json::to_string_pretty(&abi).unwrap(),
+281                yul: yul_contract,
+282                origin: contract,
+283                bytecode,
+284                runtime_bytecode,
+285            },
+286        );
+287    }
+288
+289    Ok(CompiledModule {
+290        src_ast: format!("{:#?}", module_id.ast(db)),
+291        lowered_ast: format!("{:#?}", module_id.ast(db)),
+292        contracts,
+293    })
+294}
+295
+296#[cfg(not(feature = "solc-backend"))]
+297fn compile_module(
+298    db: &mut Db,
+299    module_id: ModuleId,
+300    _with_bytecode: bool,
+301    _with_runtime_bytecode: bool,
+302    _optimize: bool,
+303) -> Result<CompiledModule, CompileError> {
+304    let mut contracts = IndexMap::default();
+305    for contract in module_id.all_contracts(db.upcast()) {
+306        let name = &contract.data(db.upcast()).name;
+307        let abi = db.codegen_abi_contract(contract);
+308        let yul_contract = compile_to_yul(db, contract);
+309
+310        contracts.insert(
+311            name.to_string(),
+312            CompiledContract {
+313                json_abi: serde_json::to_string_pretty(&abi).unwrap(),
+314                yul: yul_contract,
+315                origin: contract,
+316            },
+317        );
+318    }
+319
+320    Ok(CompiledModule {
+321        src_ast: format!("{:#?}", module_id.ast(db)),
+322        lowered_ast: format!("{:#?}", module_id.ast(db)),
+323        contracts,
+324    })
+325}
+326
+327fn compile_to_yul(db: &mut Db, contract: ContractId) -> String {
+328    let yul_contract = fe_codegen::yul::isel::lower_contract_deployable(db, contract);
+329    yul_contract.to_string().replace('"', "\\\"")
+330}
+331
+332#[cfg(feature = "solc-backend")]
+333fn compile_to_evm(
+334    name: &str,
+335    yul_object: &str,
+336    optimize: bool,
+337    verify_runtime_bytecode: bool,
+338) -> fe_yulc::ContractBytecode {
+339    match fe_yulc::compile_single_contract(name, yul_object, optimize, verify_runtime_bytecode) {
+340        Ok(bytecode) => bytecode,
+341
+342        Err(error) => {
+343            for error in serde_json::from_str::<Value>(&error.0)
+344                .expect("unable to deserialize json output")["errors"]
+345                .as_array()
+346                .expect("errors not an array")
+347            {
+348                eprintln!(
+349                    "Error: {}",
+350                    error["formattedMessage"]
+351                        .as_str()
+352                        .expect("error value not a string")
+353                        .replace("\\\n", "\n")
+354                )
+355            }
+356            panic!("Yul compilation failed with the above errors")
+357        }
+358    }
+359}
\ No newline at end of file diff --git a/compiler-docs/src/fe_library/lib.rs.html b/compiler-docs/src/fe_library/lib.rs.html new file mode 100644 index 0000000000..fa40b5592d --- /dev/null +++ b/compiler-docs/src/fe_library/lib.rs.html @@ -0,0 +1,27 @@ +lib.rs - source

fe_library/
lib.rs

1pub use ::include_dir;
+2use include_dir::{include_dir, Dir};
+3
+4pub const STD: Dir = include_dir!("$CARGO_MANIFEST_DIR/std");
+5
+6pub fn std_src_files() -> Vec<(&'static str, &'static str)> {
+7    static_dir_files(STD.get_dir("src").unwrap())
+8}
+9
+10pub fn static_dir_files(dir: &'static Dir) -> Vec<(&'static str, &'static str)> {
+11    fn add_files(dir: &'static Dir, accum: &mut Vec<(&'static str, &'static str)>) {
+12        accum.extend(dir.files().map(|file| {
+13            (
+14                file.path().to_str().unwrap(),
+15                file.contents_utf8().expect("non-utf8 static file"),
+16            )
+17        }));
+18
+19        for sub_dir in dir.dirs() {
+20            add_files(sub_dir, accum)
+21        }
+22    }
+23
+24    let mut files = vec![];
+25    add_files(dir, &mut files);
+26    files
+27}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/cfg.rs.html b/compiler-docs/src/fe_mir/analysis/cfg.rs.html new file mode 100644 index 0000000000..b40d1bb0ff --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/cfg.rs.html @@ -0,0 +1,164 @@ +cfg.rs - source

fe_mir/analysis/
cfg.rs

1use fxhash::FxHashMap;
+2
+3use crate::ir::{BasicBlockId, FunctionBody, InstId};
+4
+5#[derive(Debug, Clone, PartialEq, Eq)]
+6pub struct ControlFlowGraph {
+7    entry: BasicBlockId,
+8    blocks: FxHashMap<BasicBlockId, BlockNode>,
+9    pub(super) exits: Vec<BasicBlockId>,
+10}
+11
+12impl ControlFlowGraph {
+13    pub fn compute(func: &FunctionBody) -> Self {
+14        let entry = func.order.entry();
+15        let mut cfg = Self {
+16            entry,
+17            blocks: FxHashMap::default(),
+18            exits: vec![],
+19        };
+20
+21        for block in func.order.iter_block() {
+22            let terminator = func
+23                .order
+24                .terminator(&func.store, block)
+25                .expect("a block must have terminator");
+26            cfg.analyze_terminator(func, terminator);
+27        }
+28
+29        cfg
+30    }
+31
+32    pub fn entry(&self) -> BasicBlockId {
+33        self.entry
+34    }
+35
+36    pub fn preds(&self, block: BasicBlockId) -> &[BasicBlockId] {
+37        self.blocks[&block].preds()
+38    }
+39
+40    pub fn succs(&self, block: BasicBlockId) -> &[BasicBlockId] {
+41        self.blocks[&block].succs()
+42    }
+43
+44    pub fn post_order(&self) -> CfgPostOrder {
+45        CfgPostOrder::new(self)
+46    }
+47
+48    pub(super) fn add_edge(&mut self, from: BasicBlockId, to: BasicBlockId) {
+49        self.node_mut(to).push_pred(from);
+50        self.node_mut(from).push_succ(to);
+51    }
+52
+53    pub(super) fn reverse_edge(&mut self, new_entry: BasicBlockId, new_exits: Vec<BasicBlockId>) {
+54        for (_, block) in self.blocks.iter_mut() {
+55            block.reverse_edge()
+56        }
+57
+58        self.entry = new_entry;
+59        self.exits = new_exits;
+60    }
+61
+62    fn analyze_terminator(&mut self, func: &FunctionBody, terminator: InstId) {
+63        let block = func.order.inst_block(terminator);
+64        let branch_info = func.store.branch_info(terminator);
+65        if branch_info.is_not_a_branch() {
+66            self.node_mut(block);
+67            self.exits.push(block)
+68        } else {
+69            for dest in branch_info.block_iter() {
+70                self.add_edge(block, dest)
+71            }
+72        }
+73    }
+74
+75    fn node_mut(&mut self, block: BasicBlockId) -> &mut BlockNode {
+76        self.blocks.entry(block).or_default()
+77    }
+78}
+79
+80#[derive(Default, Clone, Debug, PartialEq, Eq)]
+81struct BlockNode {
+82    preds: Vec<BasicBlockId>,
+83    succs: Vec<BasicBlockId>,
+84}
+85
+86impl BlockNode {
+87    fn push_pred(&mut self, pred: BasicBlockId) {
+88        self.preds.push(pred);
+89    }
+90
+91    fn push_succ(&mut self, succ: BasicBlockId) {
+92        self.succs.push(succ);
+93    }
+94
+95    fn preds(&self) -> &[BasicBlockId] {
+96        &self.preds
+97    }
+98
+99    fn succs(&self) -> &[BasicBlockId] {
+100        &self.succs
+101    }
+102
+103    fn reverse_edge(&mut self) {
+104        std::mem::swap(&mut self.preds, &mut self.succs)
+105    }
+106}
+107
+108pub struct CfgPostOrder<'a> {
+109    cfg: &'a ControlFlowGraph,
+110    node_state: FxHashMap<BasicBlockId, NodeState>,
+111    stack: Vec<BasicBlockId>,
+112}
+113
+114impl<'a> CfgPostOrder<'a> {
+115    fn new(cfg: &'a ControlFlowGraph) -> Self {
+116        let stack = vec![cfg.entry()];
+117
+118        Self {
+119            cfg,
+120            node_state: FxHashMap::default(),
+121            stack,
+122        }
+123    }
+124}
+125
+126impl<'a> Iterator for CfgPostOrder<'a> {
+127    type Item = BasicBlockId;
+128
+129    fn next(&mut self) -> Option<BasicBlockId> {
+130        while let Some(&block) = self.stack.last() {
+131            let node_state = self.node_state.entry(block).or_default();
+132            if *node_state == NodeState::Unvisited {
+133                *node_state = NodeState::Visited;
+134                for &succ in self.cfg.succs(block) {
+135                    let pred_state = self.node_state.entry(succ).or_default();
+136                    if *pred_state == NodeState::Unvisited {
+137                        self.stack.push(succ);
+138                    }
+139                }
+140            } else {
+141                self.stack.pop().unwrap();
+142                if *node_state != NodeState::Finished {
+143                    *node_state = NodeState::Finished;
+144                    return Some(block);
+145                }
+146            }
+147        }
+148
+149        None
+150    }
+151}
+152
+153#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+154enum NodeState {
+155    Unvisited,
+156    Visited,
+157    Finished,
+158}
+159
+160impl Default for NodeState {
+161    fn default() -> Self {
+162        Self::Unvisited
+163    }
+164}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/domtree.rs.html b/compiler-docs/src/fe_mir/analysis/domtree.rs.html new file mode 100644 index 0000000000..ea703ff3c9 --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/domtree.rs.html @@ -0,0 +1,343 @@ +domtree.rs - source

fe_mir/analysis/
domtree.rs

1//! This module contains dominator tree related structs.
+2//!
+3//! The algorithm is based on Keith D. Cooper., Timothy J. Harvey., and Ken
+4//! Kennedy.: A Simple, Fast Dominance Algorithm: <https://www.cs.rice.edu/~keith/EMBED/dom.pdf>
+5
+6use std::collections::BTreeSet;
+7
+8use fxhash::FxHashMap;
+9
+10use crate::ir::BasicBlockId;
+11
+12use super::cfg::ControlFlowGraph;
+13
+14#[derive(Debug, Clone)]
+15pub struct DomTree {
+16    doms: FxHashMap<BasicBlockId, BasicBlockId>,
+17    /// CFG sorted in reverse post order.
+18    rpo: Vec<BasicBlockId>,
+19}
+20
+21impl DomTree {
+22    pub fn compute(cfg: &ControlFlowGraph) -> Self {
+23        let mut doms = FxHashMap::default();
+24        doms.insert(cfg.entry(), cfg.entry());
+25        let mut rpo: Vec<_> = cfg.post_order().collect();
+26        rpo.reverse();
+27
+28        let mut domtree = Self { doms, rpo };
+29
+30        let block_num = domtree.rpo.len();
+31
+32        let mut rpo_nums = FxHashMap::default();
+33        for (i, &block) in domtree.rpo.iter().enumerate() {
+34            rpo_nums.insert(block, (block_num - i) as u32);
+35        }
+36
+37        let mut changed = true;
+38        while changed {
+39            changed = false;
+40            for &block in domtree.rpo.iter().skip(1) {
+41                let processed_pred = match cfg
+42                    .preds(block)
+43                    .iter()
+44                    .find(|pred| domtree.doms.contains_key(pred))
+45                {
+46                    Some(pred) => *pred,
+47                    _ => continue,
+48                };
+49                let mut new_dom = processed_pred;
+50
+51                for &pred in cfg.preds(block) {
+52                    if pred != processed_pred && domtree.doms.contains_key(&pred) {
+53                        new_dom = domtree.intersect(new_dom, pred, &rpo_nums);
+54                    }
+55                }
+56                if Some(new_dom) != domtree.doms.get(&block).copied() {
+57                    changed = true;
+58                    domtree.doms.insert(block, new_dom);
+59                }
+60            }
+61        }
+62
+63        domtree
+64    }
+65
+66    /// Returns the immediate dominator of the `block`.
+67    /// Returns None if the `block` is unreachable from the entry block, or the
+68    /// `block` is the entry block itself.
+69    pub fn idom(&self, block: BasicBlockId) -> Option<BasicBlockId> {
+70        if self.rpo[0] == block {
+71            return None;
+72        }
+73        self.doms.get(&block).copied()
+74    }
+75
+76    /// Returns `true` if block1 strictly dominates block2.
+77    pub fn strictly_dominates(&self, block1: BasicBlockId, block2: BasicBlockId) -> bool {
+78        let mut current_block = block2;
+79        while let Some(block) = self.idom(current_block) {
+80            if block == block1 {
+81                return true;
+82            }
+83            current_block = block;
+84        }
+85
+86        false
+87    }
+88
+89    /// Returns `true` if block1 dominates block2.
+90    pub fn dominates(&self, block1: BasicBlockId, block2: BasicBlockId) -> bool {
+91        if block1 == block2 {
+92            return true;
+93        }
+94
+95        self.strictly_dominates(block1, block2)
+96    }
+97
+98    /// Returns `true` if block is reachable from the entry block.
+99    pub fn is_reachable(&self, block: BasicBlockId) -> bool {
+100        self.idom(block).is_some()
+101    }
+102
+103    /// Returns blocks in RPO.
+104    pub fn rpo(&self) -> &[BasicBlockId] {
+105        &self.rpo
+106    }
+107
+108    fn intersect(
+109        &self,
+110        mut b1: BasicBlockId,
+111        mut b2: BasicBlockId,
+112        rpo_nums: &FxHashMap<BasicBlockId, u32>,
+113    ) -> BasicBlockId {
+114        while b1 != b2 {
+115            while rpo_nums[&b1] < rpo_nums[&b2] {
+116                b1 = self.doms[&b1];
+117            }
+118            while rpo_nums[&b2] < rpo_nums[&b1] {
+119                b2 = self.doms[&b2]
+120            }
+121        }
+122
+123        b1
+124    }
+125
+126    /// Compute dominance frontiers of each blocks.
+127    pub fn compute_df(&self, cfg: &ControlFlowGraph) -> DFSet {
+128        let mut df = DFSet::default();
+129
+130        for &block in &self.rpo {
+131            let preds = cfg.preds(block);
+132            if preds.len() < 2 {
+133                continue;
+134            }
+135
+136            for pred in preds {
+137                let mut runner = *pred;
+138                while self.doms.get(&block) != Some(&runner) && self.is_reachable(runner) {
+139                    df.0.entry(runner).or_default().insert(block);
+140                    runner = self.doms[&runner];
+141                }
+142            }
+143        }
+144
+145        df
+146    }
+147}
+148
+149/// Dominance frontiers of each blocks.
+150#[derive(Default, Debug)]
+151pub struct DFSet(FxHashMap<BasicBlockId, BTreeSet<BasicBlockId>>);
+152
+153impl DFSet {
+154    /// Returns all dominance frontieres of a `block`.
+155    pub fn frontiers(
+156        &self,
+157        block: BasicBlockId,
+158    ) -> Option<impl Iterator<Item = BasicBlockId> + '_> {
+159        self.0.get(&block).map(|set| set.iter().copied())
+160    }
+161
+162    /// Returns number of frontier blocks of a `block`.
+163    pub fn frontier_num(&self, block: BasicBlockId) -> usize {
+164        self.0.get(&block).map(BTreeSet::len).unwrap_or(0)
+165    }
+166}
+167
+168#[cfg(test)]
+169mod tests {
+170    use super::*;
+171
+172    use crate::ir::{body_builder::BodyBuilder, FunctionBody, FunctionId, SourceInfo, TypeId};
+173
+174    fn calc_dom(func: &FunctionBody) -> (DomTree, DFSet) {
+175        let cfg = ControlFlowGraph::compute(func);
+176        let domtree = DomTree::compute(&cfg);
+177        let df = domtree.compute_df(&cfg);
+178        (domtree, df)
+179    }
+180
+181    fn body_builder() -> BodyBuilder {
+182        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+183    }
+184
+185    #[test]
+186    fn dom_tree_if_else() {
+187        let mut builder = body_builder();
+188
+189        let then_block = builder.make_block();
+190        let else_block = builder.make_block();
+191        let merge_block = builder.make_block();
+192
+193        let dummy_ty = TypeId(0);
+194        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+195        builder.branch(v0, then_block, else_block, SourceInfo::dummy());
+196
+197        builder.move_to_block(then_block);
+198        builder.jump(merge_block, SourceInfo::dummy());
+199
+200        builder.move_to_block(else_block);
+201        builder.jump(merge_block, SourceInfo::dummy());
+202
+203        builder.move_to_block(merge_block);
+204        let dummy_value = builder.make_unit(dummy_ty);
+205        builder.ret(dummy_value, SourceInfo::dummy());
+206
+207        let func = builder.build();
+208
+209        let (dom_tree, df) = calc_dom(&func);
+210        let entry_block = func.order.entry();
+211        assert_eq!(dom_tree.idom(entry_block), None);
+212        assert_eq!(dom_tree.idom(then_block), Some(entry_block));
+213        assert_eq!(dom_tree.idom(else_block), Some(entry_block));
+214        assert_eq!(dom_tree.idom(merge_block), Some(entry_block));
+215
+216        assert_eq!(df.frontier_num(entry_block), 0);
+217        assert_eq!(df.frontier_num(then_block), 1);
+218        assert_eq!(
+219            df.frontiers(then_block).unwrap().next().unwrap(),
+220            merge_block
+221        );
+222        assert_eq!(
+223            df.frontiers(else_block).unwrap().next().unwrap(),
+224            merge_block
+225        );
+226        assert_eq!(df.frontier_num(merge_block), 0);
+227    }
+228
+229    #[test]
+230    fn unreachable_edge() {
+231        let mut builder = body_builder();
+232
+233        let block1 = builder.make_block();
+234        let block2 = builder.make_block();
+235        let block3 = builder.make_block();
+236        let block4 = builder.make_block();
+237
+238        let dummy_ty = TypeId(0);
+239        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+240        builder.branch(v0, block1, block2, SourceInfo::dummy());
+241
+242        builder.move_to_block(block1);
+243        builder.jump(block4, SourceInfo::dummy());
+244
+245        builder.move_to_block(block2);
+246        builder.jump(block4, SourceInfo::dummy());
+247
+248        builder.move_to_block(block3);
+249        builder.jump(block4, SourceInfo::dummy());
+250
+251        builder.move_to_block(block4);
+252        let dummy_value = builder.make_unit(dummy_ty);
+253        builder.ret(dummy_value, SourceInfo::dummy());
+254
+255        let func = builder.build();
+256
+257        let (dom_tree, _) = calc_dom(&func);
+258        let entry_block = func.order.entry();
+259        assert_eq!(dom_tree.idom(entry_block), None);
+260        assert_eq!(dom_tree.idom(block1), Some(entry_block));
+261        assert_eq!(dom_tree.idom(block2), Some(entry_block));
+262        assert_eq!(dom_tree.idom(block3), None);
+263        assert!(!dom_tree.is_reachable(block3));
+264        assert_eq!(dom_tree.idom(block4), Some(entry_block));
+265    }
+266
+267    #[test]
+268    fn dom_tree_complex() {
+269        let mut builder = body_builder();
+270
+271        let block1 = builder.make_block();
+272        let block2 = builder.make_block();
+273        let block3 = builder.make_block();
+274        let block4 = builder.make_block();
+275        let block5 = builder.make_block();
+276        let block6 = builder.make_block();
+277        let block7 = builder.make_block();
+278        let block8 = builder.make_block();
+279        let block9 = builder.make_block();
+280        let block10 = builder.make_block();
+281        let block11 = builder.make_block();
+282        let block12 = builder.make_block();
+283
+284        let dummy_ty = TypeId(0);
+285        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+286        builder.branch(v0, block2, block1, SourceInfo::dummy());
+287
+288        builder.move_to_block(block1);
+289        builder.branch(v0, block6, block3, SourceInfo::dummy());
+290
+291        builder.move_to_block(block2);
+292        builder.branch(v0, block7, block4, SourceInfo::dummy());
+293
+294        builder.move_to_block(block3);
+295        builder.branch(v0, block6, block5, SourceInfo::dummy());
+296
+297        builder.move_to_block(block4);
+298        builder.branch(v0, block7, block2, SourceInfo::dummy());
+299
+300        builder.move_to_block(block5);
+301        builder.branch(v0, block10, block8, SourceInfo::dummy());
+302
+303        builder.move_to_block(block6);
+304        builder.jump(block9, SourceInfo::dummy());
+305
+306        builder.move_to_block(block7);
+307        builder.jump(block12, SourceInfo::dummy());
+308
+309        builder.move_to_block(block8);
+310        builder.jump(block11, SourceInfo::dummy());
+311
+312        builder.move_to_block(block9);
+313        builder.jump(block8, SourceInfo::dummy());
+314
+315        builder.move_to_block(block10);
+316        builder.jump(block11, SourceInfo::dummy());
+317
+318        builder.move_to_block(block11);
+319        builder.branch(v0, block12, block2, SourceInfo::dummy());
+320
+321        builder.move_to_block(block12);
+322        let dummy_value = builder.make_unit(dummy_ty);
+323        builder.ret(dummy_value, SourceInfo::dummy());
+324
+325        let func = builder.build();
+326
+327        let (dom_tree, _) = calc_dom(&func);
+328        let entry_block = func.order.entry();
+329        assert_eq!(dom_tree.idom(entry_block), None);
+330        assert_eq!(dom_tree.idom(block1), Some(entry_block));
+331        assert_eq!(dom_tree.idom(block2), Some(entry_block));
+332        assert_eq!(dom_tree.idom(block3), Some(block1));
+333        assert_eq!(dom_tree.idom(block4), Some(block2));
+334        assert_eq!(dom_tree.idom(block5), Some(block3));
+335        assert_eq!(dom_tree.idom(block6), Some(block1));
+336        assert_eq!(dom_tree.idom(block7), Some(block2));
+337        assert_eq!(dom_tree.idom(block8), Some(block1));
+338        assert_eq!(dom_tree.idom(block9), Some(block6));
+339        assert_eq!(dom_tree.idom(block10), Some(block5));
+340        assert_eq!(dom_tree.idom(block11), Some(block1));
+341        assert_eq!(dom_tree.idom(block12), Some(entry_block));
+342    }
+343}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/loop_tree.rs.html b/compiler-docs/src/fe_mir/analysis/loop_tree.rs.html new file mode 100644 index 0000000000..85cb217bad --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/loop_tree.rs.html @@ -0,0 +1,347 @@ +loop_tree.rs - source

fe_mir/analysis/
loop_tree.rs

1use id_arena::{Arena, Id};
+2
+3use fxhash::FxHashMap;
+4
+5use super::{cfg::ControlFlowGraph, domtree::DomTree};
+6
+7use crate::ir::BasicBlockId;
+8
+9#[derive(Debug, Default, Clone)]
+10pub struct LoopTree {
+11    /// Stores loops.
+12    /// The index of an outer loops is guaranteed to be lower than its inner
+13    /// loops because loops are found in RPO.
+14    loops: Arena<Loop>,
+15
+16    /// Maps blocks to its contained loop.
+17    /// If the block is contained by multiple nested loops, then the block is
+18    /// mapped to the innermost loop.
+19    block_to_loop: FxHashMap<BasicBlockId, LoopId>,
+20}
+21
+22pub type LoopId = Id<Loop>;
+23
+24#[derive(Debug, Clone, PartialEq, Eq)]
+25pub struct Loop {
+26    /// A header of the loop.
+27    pub header: BasicBlockId,
+28
+29    /// A parent loop that includes the loop.
+30    pub parent: Option<LoopId>,
+31
+32    /// Child loops that the loop includes.
+33    pub children: Vec<LoopId>,
+34}
+35
+36impl LoopTree {
+37    pub fn compute(cfg: &ControlFlowGraph, domtree: &DomTree) -> Self {
+38        let mut tree = LoopTree::default();
+39
+40        // Find loop headers in RPO, this means outer loops are guaranteed to be
+41        // inserted first, then its inner loops are inserted.
+42        for &block in domtree.rpo() {
+43            for &pred in cfg.preds(block) {
+44                if domtree.dominates(block, pred) {
+45                    let loop_data = Loop {
+46                        header: block,
+47                        parent: None,
+48                        children: Vec::new(),
+49                    };
+50
+51                    tree.loops.alloc(loop_data);
+52                    break;
+53                }
+54            }
+55        }
+56
+57        tree.analyze_loops(cfg, domtree);
+58
+59        tree
+60    }
+61
+62    /// Returns all blocks in the loop.
+63    pub fn iter_blocks_post_order<'a, 'b>(
+64        &'a self,
+65        cfg: &'b ControlFlowGraph,
+66        lp: LoopId,
+67    ) -> BlocksInLoopPostOrder<'a, 'b> {
+68        BlocksInLoopPostOrder::new(self, cfg, lp)
+69    }
+70
+71    /// Returns all loops in a function body.
+72    /// An outer loop is guaranteed to be iterated before its inner loops.
+73    pub fn loops(&self) -> impl Iterator<Item = LoopId> + '_ {
+74        self.loops.iter().map(|(id, _)| id)
+75    }
+76
+77    /// Returns number of loops found.
+78    pub fn loop_num(&self) -> usize {
+79        self.loops.len()
+80    }
+81
+82    /// Returns `true` if the `block` is in the `lp`.
+83    pub fn is_block_in_loop(&self, block: BasicBlockId, lp: LoopId) -> bool {
+84        let mut loop_of_block = self.loop_of_block(block);
+85        while let Some(cur_lp) = loop_of_block {
+86            if lp == cur_lp {
+87                return true;
+88            }
+89            loop_of_block = self.parent_loop(cur_lp);
+90        }
+91        false
+92    }
+93
+94    /// Returns header block of the `lp`.
+95    pub fn loop_header(&self, lp: LoopId) -> BasicBlockId {
+96        self.loops[lp].header
+97    }
+98
+99    /// Get parent loop of the `lp` if exists.
+100    pub fn parent_loop(&self, lp: LoopId) -> Option<LoopId> {
+101        self.loops[lp].parent
+102    }
+103
+104    /// Returns the loop that the `block` belongs to.
+105    /// If the `block` belongs to multiple loops, then returns the innermost
+106    /// loop.
+107    pub fn loop_of_block(&self, block: BasicBlockId) -> Option<LoopId> {
+108        self.block_to_loop.get(&block).copied()
+109    }
+110
+111    /// Analyze loops. This method does
+112    /// 1. Mapping each blocks to its contained loop.
+113    /// 2. Setting parent and child of the loops.
+114    fn analyze_loops(&mut self, cfg: &ControlFlowGraph, domtree: &DomTree) {
+115        let mut worklist = vec![];
+116
+117        // Iterate loops reversely to ensure analyze inner loops first.
+118        let loops_rev: Vec<_> = self.loops.iter().rev().map(|(id, _)| id).collect();
+119        for cur_lp in loops_rev {
+120            let cur_lp_header = self.loop_header(cur_lp);
+121
+122            // Add predecessors of the loop header to worklist.
+123            for &block in cfg.preds(cur_lp_header) {
+124                if domtree.dominates(cur_lp_header, block) {
+125                    worklist.push(block);
+126                }
+127            }
+128
+129            while let Some(block) = worklist.pop() {
+130                match self.block_to_loop.get(&block).copied() {
+131                    Some(lp_of_block) => {
+132                        let outermost_parent = self.outermost_parent(lp_of_block);
+133
+134                        // If outermost parent is current loop, then the block is already visited.
+135                        if outermost_parent == cur_lp {
+136                            continue;
+137                        } else {
+138                            self.loops[cur_lp].children.push(outermost_parent);
+139                            self.loops[outermost_parent].parent = cur_lp.into();
+140
+141                            let lp_header_of_block = self.loop_header(lp_of_block);
+142                            worklist.extend(cfg.preds(lp_header_of_block));
+143                        }
+144                    }
+145
+146                    // If the block is not mapped to any loops, then map it to the loop.
+147                    None => {
+148                        self.map_block(block, cur_lp);
+149                        // If block is not loop header, then add its predecessors to the worklist.
+150                        if block != cur_lp_header {
+151                            worklist.extend(cfg.preds(block));
+152                        }
+153                    }
+154                }
+155            }
+156        }
+157    }
+158
+159    /// Returns the outermost parent loop of `lp`. If `lp` doesn't have any
+160    /// parent, then returns `lp` itself.
+161    fn outermost_parent(&self, mut lp: LoopId) -> LoopId {
+162        while let Some(parent) = self.parent_loop(lp) {
+163            lp = parent;
+164        }
+165        lp
+166    }
+167
+168    /// Map `block` to `lp`.
+169    fn map_block(&mut self, block: BasicBlockId, lp: LoopId) {
+170        self.block_to_loop.insert(block, lp);
+171    }
+172}
+173
+174pub struct BlocksInLoopPostOrder<'a, 'b> {
+175    lpt: &'a LoopTree,
+176    cfg: &'b ControlFlowGraph,
+177    lp: LoopId,
+178    stack: Vec<BasicBlockId>,
+179    block_state: FxHashMap<BasicBlockId, BlockState>,
+180}
+181
+182impl<'a, 'b> BlocksInLoopPostOrder<'a, 'b> {
+183    fn new(lpt: &'a LoopTree, cfg: &'b ControlFlowGraph, lp: LoopId) -> Self {
+184        let loop_header = lpt.loop_header(lp);
+185
+186        Self {
+187            lpt,
+188            cfg,
+189            lp,
+190            stack: vec![loop_header],
+191            block_state: FxHashMap::default(),
+192        }
+193    }
+194}
+195
+196impl<'a, 'b> Iterator for BlocksInLoopPostOrder<'a, 'b> {
+197    type Item = BasicBlockId;
+198
+199    fn next(&mut self) -> Option<Self::Item> {
+200        while let Some(&block) = self.stack.last() {
+201            match self.block_state.get(&block) {
+202                // The block is already visited, but not returned from the iterator,
+203                // so mark the block as `Finished` and return the block.
+204                Some(BlockState::Visited) => {
+205                    let block = self.stack.pop().unwrap();
+206                    self.block_state.insert(block, BlockState::Finished);
+207                    return Some(block);
+208                }
+209
+210                // The block is already returned, so just remove the block from the stack.
+211                Some(BlockState::Finished) => {
+212                    self.stack.pop().unwrap();
+213                }
+214
+215                // The block is not visited yet, so push its unvisited in-loop successors to the
+216                // stack and mark the block as `Visited`.
+217                None => {
+218                    self.block_state.insert(block, BlockState::Visited);
+219                    for &succ in self.cfg.succs(block) {
+220                        if !self.block_state.contains_key(&succ)
+221                            && self.lpt.is_block_in_loop(succ, self.lp)
+222                        {
+223                            self.stack.push(succ);
+224                        }
+225                    }
+226                }
+227            }
+228        }
+229
+230        None
+231    }
+232}
+233
+234enum BlockState {
+235    Visited,
+236    Finished,
+237}
+238
+239#[cfg(test)]
+240mod tests {
+241    use super::*;
+242
+243    use crate::ir::{body_builder::BodyBuilder, FunctionBody, FunctionId, SourceInfo, TypeId};
+244
+245    fn compute_loop(func: &FunctionBody) -> LoopTree {
+246        let cfg = ControlFlowGraph::compute(func);
+247        let domtree = DomTree::compute(&cfg);
+248        LoopTree::compute(&cfg, &domtree)
+249    }
+250
+251    fn body_builder() -> BodyBuilder {
+252        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+253    }
+254
+255    #[test]
+256    fn simple_loop() {
+257        let mut builder = body_builder();
+258
+259        let entry = builder.current_block();
+260        let block1 = builder.make_block();
+261        let block2 = builder.make_block();
+262
+263        let dummy_ty = TypeId(0);
+264        let v0 = builder.make_imm_from_bool(false, dummy_ty);
+265        builder.branch(v0, block1, block2, SourceInfo::dummy());
+266
+267        builder.move_to_block(block1);
+268        builder.jump(entry, SourceInfo::dummy());
+269
+270        builder.move_to_block(block2);
+271        let dummy_value = builder.make_unit(dummy_ty);
+272        builder.ret(dummy_value, SourceInfo::dummy());
+273
+274        let func = builder.build();
+275
+276        let lpt = compute_loop(&func);
+277
+278        assert_eq!(lpt.loop_num(), 1);
+279        let lp = lpt.loops().next().unwrap();
+280
+281        assert!(lpt.is_block_in_loop(entry, lp));
+282        assert_eq!(lpt.loop_of_block(entry), Some(lp));
+283
+284        assert!(lpt.is_block_in_loop(block1, lp));
+285        assert_eq!(lpt.loop_of_block(block1), Some(lp));
+286
+287        assert!(!lpt.is_block_in_loop(block2, lp));
+288        assert!(lpt.loop_of_block(block2).is_none());
+289
+290        assert_eq!(lpt.loop_header(lp), entry);
+291    }
+292
+293    #[test]
+294    fn nested_loop() {
+295        let mut builder = body_builder();
+296
+297        let entry = builder.current_block();
+298        let block1 = builder.make_block();
+299        let block2 = builder.make_block();
+300        let block3 = builder.make_block();
+301
+302        let dummy_ty = TypeId(0);
+303        let v0 = builder.make_imm_from_bool(false, dummy_ty);
+304        builder.branch(v0, block1, block3, SourceInfo::dummy());
+305
+306        builder.move_to_block(block1);
+307        builder.branch(v0, entry, block2, SourceInfo::dummy());
+308
+309        builder.move_to_block(block2);
+310        builder.jump(block1, SourceInfo::dummy());
+311
+312        builder.move_to_block(block3);
+313        let dummy_value = builder.make_unit(dummy_ty);
+314        builder.ret(dummy_value, SourceInfo::dummy());
+315
+316        let func = builder.build();
+317
+318        let lpt = compute_loop(&func);
+319
+320        assert_eq!(lpt.loop_num(), 2);
+321        let mut loops = lpt.loops();
+322        let outer_lp = loops.next().unwrap();
+323        let inner_lp = loops.next().unwrap();
+324
+325        assert!(lpt.is_block_in_loop(entry, outer_lp));
+326        assert!(!lpt.is_block_in_loop(entry, inner_lp));
+327        assert_eq!(lpt.loop_of_block(entry), Some(outer_lp));
+328
+329        assert!(lpt.is_block_in_loop(block1, outer_lp));
+330        assert!(lpt.is_block_in_loop(block1, inner_lp));
+331        assert_eq!(lpt.loop_of_block(block1), Some(inner_lp));
+332
+333        assert!(lpt.is_block_in_loop(block2, outer_lp));
+334        assert!(lpt.is_block_in_loop(block2, inner_lp));
+335        assert_eq!(lpt.loop_of_block(block2), Some(inner_lp));
+336
+337        assert!(!lpt.is_block_in_loop(block3, outer_lp));
+338        assert!(!lpt.is_block_in_loop(block3, inner_lp));
+339        assert!(lpt.loop_of_block(block3).is_none());
+340
+341        assert!(lpt.parent_loop(outer_lp).is_none());
+342        assert_eq!(lpt.parent_loop(inner_lp), Some(outer_lp));
+343
+344        assert_eq!(lpt.loop_header(outer_lp), entry);
+345        assert_eq!(lpt.loop_header(inner_lp), block1);
+346    }
+347}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/mod.rs.html b/compiler-docs/src/fe_mir/analysis/mod.rs.html new file mode 100644 index 0000000000..dfa9ab367a --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/mod.rs.html @@ -0,0 +1,9 @@ +mod.rs - source

fe_mir/analysis/
mod.rs

1pub mod cfg;
+2pub mod domtree;
+3pub mod loop_tree;
+4pub mod post_domtree;
+5
+6pub use cfg::ControlFlowGraph;
+7pub use domtree::DomTree;
+8pub use loop_tree::LoopTree;
+9pub use post_domtree::PostDomTree;
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/analysis/post_domtree.rs.html b/compiler-docs/src/fe_mir/analysis/post_domtree.rs.html new file mode 100644 index 0000000000..d474ddd993 --- /dev/null +++ b/compiler-docs/src/fe_mir/analysis/post_domtree.rs.html @@ -0,0 +1,284 @@ +post_domtree.rs - source

fe_mir/analysis/
post_domtree.rs

1//! This module contains implementation of `Post Dominator Tree`.
+2
+3use id_arena::{ArenaBehavior, DefaultArenaBehavior};
+4
+5use super::{cfg::ControlFlowGraph, domtree::DomTree};
+6
+7use crate::ir::{BasicBlock, BasicBlockId, FunctionBody};
+8
+9#[derive(Debug)]
+10pub struct PostDomTree {
+11    /// Dummy entry block to calculate post dom tree.
+12    dummy_entry: BasicBlockId,
+13    /// Canonical dummy exit block to calculate post dom tree. All blocks ends
+14    /// with `return` has an edge to this block.
+15    dummy_exit: BasicBlockId,
+16
+17    /// Dominator tree of reverse control flow graph.
+18    domtree: DomTree,
+19}
+20
+21impl PostDomTree {
+22    pub fn compute(func: &FunctionBody) -> Self {
+23        let mut rcfg = ControlFlowGraph::compute(func);
+24
+25        let real_entry = rcfg.entry();
+26
+27        let dummy_entry = Self::make_dummy_block();
+28        let dummy_exit = Self::make_dummy_block();
+29        // Add edges from dummy entry block to real entry block and dummy exit block.
+30        rcfg.add_edge(dummy_entry, real_entry);
+31        rcfg.add_edge(dummy_entry, dummy_exit);
+32
+33        // Add edges from real exit blocks to dummy exit block.
+34        for exit in std::mem::take(&mut rcfg.exits) {
+35            rcfg.add_edge(exit, dummy_exit);
+36        }
+37
+38        rcfg.reverse_edge(dummy_exit, vec![dummy_entry]);
+39        let domtree = DomTree::compute(&rcfg);
+40
+41        Self {
+42            dummy_entry,
+43            dummy_exit,
+44            domtree,
+45        }
+46    }
+47
+48    pub fn post_idom(&self, block: BasicBlockId) -> PostIDom {
+49        match self.domtree.idom(block).unwrap() {
+50            block if block == self.dummy_entry => PostIDom::DummyEntry,
+51            block if block == self.dummy_exit => PostIDom::DummyExit,
+52            other => PostIDom::Block(other),
+53        }
+54    }
+55
+56    /// Returns `true` if block is reachable from the exit blocks.
+57    pub fn is_reachable(&self, block: BasicBlockId) -> bool {
+58        self.domtree.is_reachable(block)
+59    }
+60
+61    fn make_dummy_block() -> BasicBlockId {
+62        let arena_id = DefaultArenaBehavior::<BasicBlock>::new_arena_id();
+63        DefaultArenaBehavior::new_id(arena_id, 0)
+64    }
+65}
+66
+67#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+68pub enum PostIDom {
+69    DummyEntry,
+70    DummyExit,
+71    Block(BasicBlockId),
+72}
+73
+74#[cfg(test)]
+75mod tests {
+76    use super::*;
+77
+78    use crate::ir::{body_builder::BodyBuilder, FunctionId, SourceInfo, TypeId};
+79
+80    fn body_builder() -> BodyBuilder {
+81        BodyBuilder::new(FunctionId(0), SourceInfo::dummy())
+82    }
+83
+84    #[test]
+85    fn test_if_else_merge() {
+86        let mut builder = body_builder();
+87        let then_block = builder.make_block();
+88        let else_block = builder.make_block();
+89        let merge_block = builder.make_block();
+90
+91        let dummy_ty = TypeId(0);
+92        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+93        builder.branch(v0, then_block, else_block, SourceInfo::dummy());
+94
+95        builder.move_to_block(then_block);
+96        builder.jump(merge_block, SourceInfo::dummy());
+97
+98        builder.move_to_block(else_block);
+99        builder.jump(merge_block, SourceInfo::dummy());
+100
+101        builder.move_to_block(merge_block);
+102        let dummy_value = builder.make_unit(dummy_ty);
+103        builder.ret(dummy_value, SourceInfo::dummy());
+104
+105        let func = builder.build();
+106
+107        let post_dom_tree = PostDomTree::compute(&func);
+108        let entry_block = func.order.entry();
+109        assert_eq!(
+110            post_dom_tree.post_idom(entry_block),
+111            PostIDom::Block(merge_block)
+112        );
+113        assert_eq!(
+114            post_dom_tree.post_idom(then_block),
+115            PostIDom::Block(merge_block)
+116        );
+117        assert_eq!(
+118            post_dom_tree.post_idom(else_block),
+119            PostIDom::Block(merge_block)
+120        );
+121        assert_eq!(post_dom_tree.post_idom(merge_block), PostIDom::DummyExit);
+122    }
+123
+124    #[test]
+125    fn test_if_else_return() {
+126        let mut builder = body_builder();
+127        let then_block = builder.make_block();
+128        let else_block = builder.make_block();
+129        let merge_block = builder.make_block();
+130
+131        let dummy_ty = TypeId(0);
+132        let dummy_value = builder.make_unit(dummy_ty);
+133        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+134        builder.branch(v0, then_block, else_block, SourceInfo::dummy());
+135
+136        builder.move_to_block(then_block);
+137        builder.jump(merge_block, SourceInfo::dummy());
+138
+139        builder.move_to_block(else_block);
+140        builder.ret(dummy_value, SourceInfo::dummy());
+141
+142        builder.move_to_block(merge_block);
+143        builder.ret(dummy_value, SourceInfo::dummy());
+144
+145        let func = builder.build();
+146
+147        let post_dom_tree = PostDomTree::compute(&func);
+148        let entry_block = func.order.entry();
+149        assert_eq!(post_dom_tree.post_idom(entry_block), PostIDom::DummyExit,);
+150        assert_eq!(
+151            post_dom_tree.post_idom(then_block),
+152            PostIDom::Block(merge_block),
+153        );
+154        assert_eq!(post_dom_tree.post_idom(else_block), PostIDom::DummyExit);
+155        assert_eq!(post_dom_tree.post_idom(merge_block), PostIDom::DummyExit);
+156    }
+157
+158    #[test]
+159    fn test_if_non_else() {
+160        let mut builder = body_builder();
+161        let then_block = builder.make_block();
+162        let merge_block = builder.make_block();
+163
+164        let dummy_ty = TypeId(0);
+165        let dummy_value = builder.make_unit(dummy_ty);
+166        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+167        builder.branch(v0, then_block, merge_block, SourceInfo::dummy());
+168
+169        builder.move_to_block(then_block);
+170        builder.jump(merge_block, SourceInfo::dummy());
+171
+172        builder.move_to_block(merge_block);
+173        builder.ret(dummy_value, SourceInfo::dummy());
+174
+175        let func = builder.build();
+176
+177        let post_dom_tree = PostDomTree::compute(&func);
+178        let entry_block = func.order.entry();
+179        assert_eq!(
+180            post_dom_tree.post_idom(entry_block),
+181            PostIDom::Block(merge_block),
+182        );
+183        assert_eq!(
+184            post_dom_tree.post_idom(then_block),
+185            PostIDom::Block(merge_block),
+186        );
+187        assert_eq!(post_dom_tree.post_idom(merge_block), PostIDom::DummyExit);
+188    }
+189
+190    #[test]
+191    fn test_loop() {
+192        let mut builder = body_builder();
+193        let block1 = builder.make_block();
+194        let block2 = builder.make_block();
+195        let block3 = builder.make_block();
+196        let block4 = builder.make_block();
+197
+198        let dummy_ty = TypeId(0);
+199        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+200
+201        builder.branch(v0, block1, block2, SourceInfo::dummy());
+202
+203        builder.move_to_block(block1);
+204        builder.jump(block3, SourceInfo::dummy());
+205
+206        builder.move_to_block(block2);
+207        builder.branch(v0, block3, block4, SourceInfo::dummy());
+208
+209        builder.move_to_block(block3);
+210        let dummy_value = builder.make_unit(dummy_ty);
+211        builder.ret(dummy_value, SourceInfo::dummy());
+212
+213        builder.move_to_block(block4);
+214        builder.jump(block2, SourceInfo::dummy());
+215
+216        let func = builder.build();
+217
+218        let post_dom_tree = PostDomTree::compute(&func);
+219        let entry_block = func.order.entry();
+220        assert_eq!(
+221            post_dom_tree.post_idom(entry_block),
+222            PostIDom::Block(block3),
+223        );
+224        assert_eq!(post_dom_tree.post_idom(block1), PostIDom::Block(block3));
+225        assert_eq!(post_dom_tree.post_idom(block2), PostIDom::Block(block3));
+226        assert_eq!(post_dom_tree.post_idom(block3), PostIDom::DummyExit);
+227        assert_eq!(post_dom_tree.post_idom(block4), PostIDom::Block(block2));
+228    }
+229
+230    #[test]
+231    fn test_pd_complex() {
+232        let mut builder = body_builder();
+233        let block1 = builder.make_block();
+234        let block2 = builder.make_block();
+235        let block3 = builder.make_block();
+236        let block4 = builder.make_block();
+237        let block5 = builder.make_block();
+238        let block6 = builder.make_block();
+239        let block7 = builder.make_block();
+240
+241        let dummy_ty = TypeId(0);
+242        let v0 = builder.make_imm_from_bool(true, dummy_ty);
+243
+244        builder.branch(v0, block1, block2, SourceInfo::dummy());
+245
+246        builder.move_to_block(block1);
+247        builder.jump(block6, SourceInfo::dummy());
+248
+249        builder.move_to_block(block2);
+250        builder.branch(v0, block3, block4, SourceInfo::dummy());
+251
+252        builder.move_to_block(block3);
+253        builder.jump(block5, SourceInfo::dummy());
+254
+255        builder.move_to_block(block4);
+256        builder.jump(block5, SourceInfo::dummy());
+257
+258        builder.move_to_block(block5);
+259        builder.jump(block6, SourceInfo::dummy());
+260
+261        builder.move_to_block(block6);
+262        builder.jump(block7, SourceInfo::dummy());
+263
+264        builder.move_to_block(block7);
+265        let dummy_value = builder.make_unit(dummy_ty);
+266        builder.ret(dummy_value, SourceInfo::dummy());
+267
+268        let func = builder.build();
+269
+270        let post_dom_tree = PostDomTree::compute(&func);
+271        let entry_block = func.order.entry();
+272        assert_eq!(
+273            post_dom_tree.post_idom(entry_block),
+274            PostIDom::Block(block6),
+275        );
+276        assert_eq!(post_dom_tree.post_idom(block1), PostIDom::Block(block6));
+277        assert_eq!(post_dom_tree.post_idom(block2), PostIDom::Block(block5));
+278        assert_eq!(post_dom_tree.post_idom(block3), PostIDom::Block(block5));
+279        assert_eq!(post_dom_tree.post_idom(block4), PostIDom::Block(block5));
+280        assert_eq!(post_dom_tree.post_idom(block5), PostIDom::Block(block6));
+281        assert_eq!(post_dom_tree.post_idom(block6), PostIDom::Block(block7));
+282        assert_eq!(post_dom_tree.post_idom(block7), PostIDom::DummyExit);
+283    }
+284}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db.rs.html b/compiler-docs/src/fe_mir/db.rs.html new file mode 100644 index 0000000000..5b06ba49d6 --- /dev/null +++ b/compiler-docs/src/fe_mir/db.rs.html @@ -0,0 +1,104 @@ +db.rs - source

fe_mir/
db.rs

1#![allow(clippy::arc_with_non_send_sync)]
+2use std::{collections::BTreeMap, rc::Rc};
+3
+4use fe_analyzer::{
+5    db::AnalyzerDbStorage,
+6    namespace::{items as analyzer_items, types as analyzer_types},
+7    AnalyzerDb,
+8};
+9use fe_common::db::{SourceDb, SourceDbStorage, Upcast, UpcastMut};
+10use smol_str::SmolStr;
+11
+12use crate::ir::{self, ConstantId, TypeId};
+13
+14mod queries;
+15
+16#[salsa::query_group(MirDbStorage)]
+17pub trait MirDb: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> {
+18    #[salsa::interned]
+19    fn mir_intern_const(&self, data: Rc<ir::Constant>) -> ir::ConstantId;
+20    #[salsa::interned]
+21    fn mir_intern_type(&self, data: Rc<ir::Type>) -> ir::TypeId;
+22    #[salsa::interned]
+23    fn mir_intern_function(&self, data: Rc<ir::FunctionSignature>) -> ir::FunctionId;
+24
+25    #[salsa::invoke(queries::module::mir_lower_module_all_functions)]
+26    fn mir_lower_module_all_functions(
+27        &self,
+28        module: analyzer_items::ModuleId,
+29    ) -> Rc<Vec<ir::FunctionId>>;
+30
+31    #[salsa::invoke(queries::contract::mir_lower_contract_all_functions)]
+32    fn mir_lower_contract_all_functions(
+33        &self,
+34        contract: analyzer_items::ContractId,
+35    ) -> Rc<Vec<ir::FunctionId>>;
+36
+37    #[salsa::invoke(queries::structs::mir_lower_struct_all_functions)]
+38    fn mir_lower_struct_all_functions(
+39        &self,
+40        struct_: analyzer_items::StructId,
+41    ) -> Rc<Vec<ir::FunctionId>>;
+42
+43    #[salsa::invoke(queries::enums::mir_lower_enum_all_functions)]
+44    fn mir_lower_enum_all_functions(
+45        &self,
+46        enum_: analyzer_items::EnumId,
+47    ) -> Rc<Vec<ir::FunctionId>>;
+48
+49    #[salsa::invoke(queries::types::mir_lowered_type)]
+50    fn mir_lowered_type(&self, analyzer_type: analyzer_types::TypeId) -> TypeId;
+51
+52    #[salsa::invoke(queries::constant::mir_lowered_constant)]
+53    fn mir_lowered_constant(&self, analyzer_const: analyzer_items::ModuleConstantId) -> ConstantId;
+54
+55    #[salsa::invoke(queries::function::mir_lowered_func_signature)]
+56    fn mir_lowered_func_signature(
+57        &self,
+58        analyzer_func: analyzer_items::FunctionId,
+59    ) -> ir::FunctionId;
+60    #[salsa::invoke(queries::function::mir_lowered_monomorphized_func_signature)]
+61    fn mir_lowered_monomorphized_func_signature(
+62        &self,
+63        analyzer_func: analyzer_items::FunctionId,
+64        resolved_generics: BTreeMap<SmolStr, analyzer_types::TypeId>,
+65    ) -> ir::FunctionId;
+66    #[salsa::invoke(queries::function::mir_lowered_pseudo_monomorphized_func_signature)]
+67    fn mir_lowered_pseudo_monomorphized_func_signature(
+68        &self,
+69        analyzer_func: analyzer_items::FunctionId,
+70    ) -> ir::FunctionId;
+71    #[salsa::invoke(queries::function::mir_lowered_func_body)]
+72    fn mir_lowered_func_body(&self, func: ir::FunctionId) -> Rc<ir::FunctionBody>;
+73}
+74
+75#[salsa::database(SourceDbStorage, AnalyzerDbStorage, MirDbStorage)]
+76#[derive(Default)]
+77pub struct NewDb {
+78    storage: salsa::Storage<NewDb>,
+79}
+80impl salsa::Database for NewDb {}
+81
+82impl Upcast<dyn SourceDb> for NewDb {
+83    fn upcast(&self) -> &(dyn SourceDb + 'static) {
+84        self
+85    }
+86}
+87
+88impl UpcastMut<dyn SourceDb> for NewDb {
+89    fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static) {
+90        &mut *self
+91    }
+92}
+93
+94impl Upcast<dyn AnalyzerDb> for NewDb {
+95    fn upcast(&self) -> &(dyn AnalyzerDb + 'static) {
+96        self
+97    }
+98}
+99
+100impl UpcastMut<dyn AnalyzerDb> for NewDb {
+101    fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static) {
+102        &mut *self
+103    }
+104}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries.rs.html b/compiler-docs/src/fe_mir/db/queries.rs.html new file mode 100644 index 0000000000..b029476695 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries.rs.html @@ -0,0 +1,7 @@ +queries.rs - source

fe_mir/db/
queries.rs

1pub mod constant;
+2pub mod contract;
+3pub mod enums;
+4pub mod function;
+5pub mod module;
+6pub mod structs;
+7pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/constant.rs.html b/compiler-docs/src/fe_mir/db/queries/constant.rs.html new file mode 100644 index 0000000000..33327505c4 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/constant.rs.html @@ -0,0 +1,43 @@ +constant.rs - source

fe_mir/db/queries/
constant.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items as analyzer_items;
+4
+5use crate::{
+6    db::MirDb,
+7    ir::{Constant, ConstantId, SourceInfo, TypeId},
+8};
+9
+10pub fn mir_lowered_constant(
+11    db: &dyn MirDb,
+12    analyzer_const: analyzer_items::ModuleConstantId,
+13) -> ConstantId {
+14    let name = analyzer_const.name(db.upcast());
+15    let value = analyzer_const.constant_value(db.upcast()).unwrap();
+16    let ty = analyzer_const.typ(db.upcast()).unwrap();
+17    let module_id = analyzer_const.module(db.upcast());
+18    let span = analyzer_const.span(db.upcast());
+19    let id = analyzer_const.node_id(db.upcast());
+20
+21    let ty = db.mir_lowered_type(ty);
+22    let source = SourceInfo { span, id };
+23
+24    let constant = Constant {
+25        name,
+26        value: value.into(),
+27        ty,
+28        module_id,
+29        source,
+30    };
+31
+32    db.mir_intern_const(constant.into())
+33}
+34
+35impl ConstantId {
+36    pub fn data(self, db: &dyn MirDb) -> Rc<Constant> {
+37        db.lookup_mir_intern_const(self)
+38    }
+39
+40    pub fn ty(self, db: &dyn MirDb) -> TypeId {
+41        self.data(db).ty
+42    }
+43}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/contract.rs.html b/compiler-docs/src/fe_mir/db/queries/contract.rs.html new file mode 100644 index 0000000000..f13344d10c --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/contract.rs.html @@ -0,0 +1,17 @@ +contract.rs - source

fe_mir/db/queries/
contract.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::{self as analyzer_items};
+4
+5use crate::{db::MirDb, ir::FunctionId};
+6
+7pub fn mir_lower_contract_all_functions(
+8    db: &dyn MirDb,
+9    contract: analyzer_items::ContractId,
+10) -> Rc<Vec<FunctionId>> {
+11    contract
+12        .all_functions(db.upcast())
+13        .iter()
+14        .map(|func| db.mir_lowered_func_signature(*func))
+15        .collect::<Vec<_>>()
+16        .into()
+17}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/enums.rs.html b/compiler-docs/src/fe_mir/db/queries/enums.rs.html new file mode 100644 index 0000000000..8abc577843 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/enums.rs.html @@ -0,0 +1,17 @@ +enums.rs - source

fe_mir/db/queries/
enums.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::{self as analyzer_items};
+4
+5use crate::{db::MirDb, ir::FunctionId};
+6
+7pub fn mir_lower_enum_all_functions(
+8    db: &dyn MirDb,
+9    enum_: analyzer_items::EnumId,
+10) -> Rc<Vec<FunctionId>> {
+11    enum_
+12        .all_functions(db.upcast())
+13        .iter()
+14        .map(|func| db.mir_lowered_func_signature(*func))
+15        .collect::<Vec<_>>()
+16        .into()
+17}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/function.rs.html b/compiler-docs/src/fe_mir/db/queries/function.rs.html new file mode 100644 index 0000000000..aa82bc41ee --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/function.rs.html @@ -0,0 +1,130 @@ +function.rs - source

fe_mir/db/queries/
function.rs

1use std::{collections::BTreeMap, rc::Rc};
+2
+3use fe_analyzer::display::Displayable;
+4use fe_analyzer::namespace::items as analyzer_items;
+5use fe_analyzer::namespace::items::Item;
+6use fe_analyzer::namespace::types as analyzer_types;
+7
+8use smol_str::SmolStr;
+9
+10use crate::{
+11    db::MirDb,
+12    ir::{self, function::Linkage, FunctionSignature, TypeId},
+13    lower::function::{lower_func_body, lower_func_signature, lower_monomorphized_func_signature},
+14};
+15
+16pub fn mir_lowered_func_signature(
+17    db: &dyn MirDb,
+18    analyzer_func: analyzer_items::FunctionId,
+19) -> ir::FunctionId {
+20    lower_func_signature(db, analyzer_func)
+21}
+22
+23pub fn mir_lowered_monomorphized_func_signature(
+24    db: &dyn MirDb,
+25    analyzer_func: analyzer_items::FunctionId,
+26    resolved_generics: BTreeMap<SmolStr, analyzer_types::TypeId>,
+27) -> ir::FunctionId {
+28    lower_monomorphized_func_signature(db, analyzer_func, resolved_generics)
+29}
+30
+31/// Generate MIR function and monomorphize generic parameters as if they were called with unit type
+32/// NOTE: THIS SHOULD ONLY BE USED IN TEST CODE
+33pub fn mir_lowered_pseudo_monomorphized_func_signature(
+34    db: &dyn MirDb,
+35    analyzer_func: analyzer_items::FunctionId,
+36) -> ir::FunctionId {
+37    let resolved_generics = analyzer_func
+38        .sig(db.upcast())
+39        .generic_params(db.upcast())
+40        .iter()
+41        .map(|generic| (generic.name(), analyzer_types::TypeId::unit(db.upcast())))
+42        .collect::<BTreeMap<_, _>>();
+43    lower_monomorphized_func_signature(db, analyzer_func, resolved_generics)
+44}
+45
+46pub fn mir_lowered_func_body(db: &dyn MirDb, func: ir::FunctionId) -> Rc<ir::FunctionBody> {
+47    lower_func_body(db, func)
+48}
+49
+50impl ir::FunctionId {
+51    pub fn signature(self, db: &dyn MirDb) -> Rc<FunctionSignature> {
+52        db.lookup_mir_intern_function(self)
+53    }
+54
+55    pub fn return_type(self, db: &dyn MirDb) -> Option<TypeId> {
+56        self.signature(db).return_type
+57    }
+58
+59    pub fn linkage(self, db: &dyn MirDb) -> Linkage {
+60        self.signature(db).linkage
+61    }
+62
+63    pub fn analyzer_func(self, db: &dyn MirDb) -> analyzer_items::FunctionId {
+64        self.signature(db).analyzer_func_id
+65    }
+66
+67    pub fn body(self, db: &dyn MirDb) -> Rc<ir::FunctionBody> {
+68        db.mir_lowered_func_body(self)
+69    }
+70
+71    pub fn module(self, db: &dyn MirDb) -> analyzer_items::ModuleId {
+72        let analyzer_func = self.analyzer_func(db);
+73        analyzer_func.module(db.upcast())
+74    }
+75
+76    pub fn is_contract_init(self, db: &dyn MirDb) -> bool {
+77        self.analyzer_func(db)
+78            .data(db.upcast())
+79            .sig
+80            .is_constructor(db.upcast())
+81    }
+82
+83    /// Returns a type suffix if a generic function was monomorphized
+84    pub fn type_suffix(&self, db: &dyn MirDb) -> SmolStr {
+85        self.signature(db)
+86            .resolved_generics
+87            .values()
+88            .fold(String::new(), |acc, param| {
+89                format!("{}_{}", acc, param.display(db.upcast()))
+90            })
+91            .into()
+92    }
+93
+94    pub fn name(&self, db: &dyn MirDb) -> SmolStr {
+95        let analyzer_func = self.analyzer_func(db);
+96        analyzer_func.name(db.upcast())
+97    }
+98
+99    /// Returns `class_name::fn_name` if a function is a method else `fn_name`.
+100    pub fn debug_name(self, db: &dyn MirDb) -> SmolStr {
+101        let analyzer_func = self.analyzer_func(db);
+102        let func_name = format!(
+103            "{}{}",
+104            analyzer_func.name(db.upcast()),
+105            self.type_suffix(db)
+106        );
+107
+108        match analyzer_func.sig(db.upcast()).self_item(db.upcast()) {
+109            Some(Item::Impl(id)) => {
+110                let class_name = format!(
+111                    "<{} as {}>",
+112                    id.receiver(db.upcast()).display(db.upcast()),
+113                    id.trait_id(db.upcast()).name(db.upcast())
+114                );
+115                format!("{class_name}::{func_name}").into()
+116            }
+117            Some(class) => {
+118                let class_name = class.name(db.upcast());
+119                format!("{class_name}::{func_name}").into()
+120            }
+121            _ => func_name.into(),
+122        }
+123    }
+124
+125    pub fn returns_aggregate(self, db: &dyn MirDb) -> bool {
+126        self.return_type(db)
+127            .map(|ty| ty.is_aggregate(db))
+128            .unwrap_or_default()
+129    }
+130}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/module.rs.html b/compiler-docs/src/fe_mir/db/queries/module.rs.html new file mode 100644 index 0000000000..92cdd44c58 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/module.rs.html @@ -0,0 +1,35 @@ +module.rs - source

fe_mir/db/queries/
module.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::{self as analyzer_items, TypeDef};
+4
+5use crate::{db::MirDb, ir::FunctionId};
+6
+7pub fn mir_lower_module_all_functions(
+8    db: &dyn MirDb,
+9    module: analyzer_items::ModuleId,
+10) -> Rc<Vec<FunctionId>> {
+11    let mut functions = vec![];
+12
+13    let items = module.all_items(db.upcast());
+14    items.iter().for_each(|item| match item {
+15        analyzer_items::Item::Function(func) => {
+16            functions.push(db.mir_lowered_func_signature(*func))
+17        }
+18
+19        analyzer_items::Item::Type(TypeDef::Contract(contract)) => {
+20            functions.extend_from_slice(&db.mir_lower_contract_all_functions(*contract))
+21        }
+22
+23        analyzer_items::Item::Type(TypeDef::Struct(struct_)) => {
+24            functions.extend_from_slice(&db.mir_lower_struct_all_functions(*struct_))
+25        }
+26
+27        analyzer_items::Item::Type(TypeDef::Enum(enum_)) => {
+28            functions.extend_from_slice(&db.mir_lower_enum_all_functions(*enum_))
+29        }
+30
+31        _ => {}
+32    });
+33
+34    functions.into()
+35}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/structs.rs.html b/compiler-docs/src/fe_mir/db/queries/structs.rs.html new file mode 100644 index 0000000000..224248a59a --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/structs.rs.html @@ -0,0 +1,17 @@ +structs.rs - source

fe_mir/db/queries/
structs.rs

1use std::rc::Rc;
+2
+3use fe_analyzer::namespace::items::{self as analyzer_items};
+4
+5use crate::{db::MirDb, ir::FunctionId};
+6
+7pub fn mir_lower_struct_all_functions(
+8    db: &dyn MirDb,
+9    struct_: analyzer_items::StructId,
+10) -> Rc<Vec<FunctionId>> {
+11    struct_
+12        .all_functions(db.upcast())
+13        .iter()
+14        .map(|func| db.mir_lowered_pseudo_monomorphized_func_signature(*func))
+15        .collect::<Vec<_>>()
+16        .into()
+17}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/db/queries/types.rs.html b/compiler-docs/src/fe_mir/db/queries/types.rs.html new file mode 100644 index 0000000000..528a92a5b8 --- /dev/null +++ b/compiler-docs/src/fe_mir/db/queries/types.rs.html @@ -0,0 +1,657 @@ +types.rs - source

fe_mir/db/queries/
types.rs

1use std::{fmt, rc::Rc, str::FromStr};
+2
+3use fe_analyzer::namespace::{items::EnumVariantId, types as analyzer_types};
+4
+5use num_bigint::BigInt;
+6use num_traits::ToPrimitive;
+7
+8use crate::{
+9    db::MirDb,
+10    ir::{
+11        types::{ArrayDef, TupleDef, TypeKind},
+12        Type, TypeId, Value,
+13    },
+14    lower::types::lower_type,
+15};
+16
+17pub fn mir_lowered_type(db: &dyn MirDb, analyzer_type: analyzer_types::TypeId) -> TypeId {
+18    lower_type(db, analyzer_type)
+19}
+20
+21impl TypeId {
+22    pub fn data(self, db: &dyn MirDb) -> Rc<Type> {
+23        db.lookup_mir_intern_type(self)
+24    }
+25
+26    pub fn analyzer_ty(self, db: &dyn MirDb) -> Option<analyzer_types::TypeId> {
+27        self.data(db).analyzer_ty
+28    }
+29
+30    pub fn projection_ty(self, db: &dyn MirDb, access: &Value) -> TypeId {
+31        let ty = self.deref(db);
+32        let pty = match &ty.data(db).kind {
+33            TypeKind::Array(ArrayDef { elem_ty, .. }) => *elem_ty,
+34            TypeKind::Tuple(def) => {
+35                let index = expect_projection_index(access);
+36                def.items[index]
+37            }
+38            TypeKind::Struct(def) | TypeKind::Contract(def) => {
+39                let index = expect_projection_index(access);
+40                def.fields[index].1
+41            }
+42            TypeKind::Enum(_) => {
+43                let index = expect_projection_index(access);
+44                debug_assert_eq!(index, 0);
+45                ty.projection_ty_imm(db, 0)
+46            }
+47            _ => panic!("{:?} can't project onto the `access`", self.as_string(db)),
+48        };
+49        match &self.data(db).kind {
+50            TypeKind::SPtr(_) | TypeKind::Contract(_) => pty.make_sptr(db),
+51            TypeKind::MPtr(_) => pty.make_mptr(db),
+52            _ => pty,
+53        }
+54    }
+55
+56    pub fn deref(self, db: &dyn MirDb) -> TypeId {
+57        match self.data(db).kind {
+58            TypeKind::SPtr(inner) => inner,
+59            TypeKind::MPtr(inner) => inner.deref(db),
+60            _ => self,
+61        }
+62    }
+63
+64    pub fn make_sptr(self, db: &dyn MirDb) -> TypeId {
+65        db.mir_intern_type(Type::new(TypeKind::SPtr(self), None).into())
+66    }
+67
+68    pub fn make_mptr(self, db: &dyn MirDb) -> TypeId {
+69        db.mir_intern_type(Type::new(TypeKind::MPtr(self), None).into())
+70    }
+71
+72    pub fn projection_ty_imm(self, db: &dyn MirDb, index: usize) -> TypeId {
+73        match &self.data(db).kind {
+74            TypeKind::Array(ArrayDef { elem_ty, .. }) => *elem_ty,
+75            TypeKind::Tuple(def) => def.items[index],
+76            TypeKind::Struct(def) | TypeKind::Contract(def) => def.fields[index].1,
+77            TypeKind::Enum(_) => {
+78                debug_assert_eq!(index, 0);
+79                self.enum_disc_type(db)
+80            }
+81            _ => panic!("{:?} can't project onto the `index`", self.as_string(db)),
+82        }
+83    }
+84
+85    pub fn aggregate_field_num(self, db: &dyn MirDb) -> usize {
+86        match &self.data(db).kind {
+87            TypeKind::Array(ArrayDef { len, .. }) => *len,
+88            TypeKind::Tuple(def) => def.items.len(),
+89            TypeKind::Struct(def) | TypeKind::Contract(def) => def.fields.len(),
+90            TypeKind::Enum(_) => 2,
+91            _ => unreachable!(),
+92        }
+93    }
+94
+95    pub fn enum_disc_type(self, db: &dyn MirDb) -> TypeId {
+96        let kind = match &self.deref(db).data(db).kind {
+97            TypeKind::Enum(def) => def.tag_type(),
+98            _ => unreachable!(),
+99        };
+100        let analyzer_type = match kind {
+101            TypeKind::U8 => Some(analyzer_types::Integer::U8),
+102            TypeKind::U16 => Some(analyzer_types::Integer::U16),
+103            TypeKind::U32 => Some(analyzer_types::Integer::U32),
+104            TypeKind::U64 => Some(analyzer_types::Integer::U64),
+105            TypeKind::U128 => Some(analyzer_types::Integer::U128),
+106            TypeKind::U256 => Some(analyzer_types::Integer::U256),
+107            _ => None,
+108        }
+109        .map(|int| analyzer_types::TypeId::int(db.upcast(), int));
+110
+111        db.mir_intern_type(Type::new(kind, analyzer_type).into())
+112    }
+113
+114    pub fn enum_data_offset(self, db: &dyn MirDb, slot_size: usize) -> usize {
+115        match &self.data(db).kind {
+116            TypeKind::Enum(def) => {
+117                let disc_size = self.enum_disc_type(db).size_of(db, slot_size);
+118                let mut align = 1;
+119                for variant in def.variants.iter() {
+120                    let variant_align = variant.ty.align_of(db, slot_size);
+121                    align = num_integer::lcm(align, variant_align);
+122                }
+123                round_up(disc_size, align)
+124            }
+125            _ => unreachable!(),
+126        }
+127    }
+128
+129    pub fn enum_variant_type(self, db: &dyn MirDb, variant_id: EnumVariantId) -> TypeId {
+130        let name = variant_id.name(db.upcast());
+131        match &self.deref(db).data(db).kind {
+132            TypeKind::Enum(def) => def
+133                .variants
+134                .iter()
+135                .find(|variant| variant.name == name)
+136                .map(|variant| variant.ty)
+137                .unwrap(),
+138            _ => unreachable!(),
+139        }
+140    }
+141
+142    pub fn index_from_fname(self, db: &dyn MirDb, fname: &str) -> BigInt {
+143        let ty = self.deref(db);
+144        match &ty.data(db).kind {
+145            TypeKind::Tuple(_) => {
+146                // TODO: Fix this when the syntax for tuple access changes.
+147                let index_str = &fname[4..];
+148                BigInt::from_str(index_str).unwrap()
+149            }
+150
+151            TypeKind::Struct(def) | TypeKind::Contract(def) => def
+152                .fields
+153                .iter()
+154                .enumerate()
+155                .find_map(|(i, field)| (field.0 == fname).then(|| i.into()))
+156                .unwrap(),
+157
+158            other => unreachable!("{:?} does not have fields", other),
+159        }
+160    }
+161
+162    pub fn is_primitive(self, db: &dyn MirDb) -> bool {
+163        matches!(
+164            &self.data(db).kind,
+165            TypeKind::I8
+166                | TypeKind::I16
+167                | TypeKind::I32
+168                | TypeKind::I64
+169                | TypeKind::I128
+170                | TypeKind::I256
+171                | TypeKind::U8
+172                | TypeKind::U16
+173                | TypeKind::U32
+174                | TypeKind::U64
+175                | TypeKind::U128
+176                | TypeKind::U256
+177                | TypeKind::Bool
+178                | TypeKind::Address
+179                | TypeKind::Unit
+180        )
+181    }
+182
+183    pub fn is_integral(self, db: &dyn MirDb) -> bool {
+184        matches!(
+185            &self.data(db).kind,
+186            TypeKind::I8
+187                | TypeKind::I16
+188                | TypeKind::I32
+189                | TypeKind::I64
+190                | TypeKind::I128
+191                | TypeKind::I256
+192                | TypeKind::U8
+193                | TypeKind::U16
+194                | TypeKind::U32
+195                | TypeKind::U64
+196                | TypeKind::U128
+197                | TypeKind::U256
+198        )
+199    }
+200
+201    pub fn is_address(self, db: &dyn MirDb) -> bool {
+202        matches!(&self.data(db).kind, TypeKind::Address)
+203    }
+204
+205    pub fn is_unit(self, db: &dyn MirDb) -> bool {
+206        matches!(&self.data(db).as_ref().kind, TypeKind::Unit)
+207    }
+208
+209    pub fn is_enum(self, db: &dyn MirDb) -> bool {
+210        matches!(&self.data(db).as_ref().kind, TypeKind::Enum(_))
+211    }
+212
+213    pub fn is_signed(self, db: &dyn MirDb) -> bool {
+214        matches!(
+215            &self.data(db).kind,
+216            TypeKind::I8
+217                | TypeKind::I16
+218                | TypeKind::I32
+219                | TypeKind::I64
+220                | TypeKind::I128
+221                | TypeKind::I256
+222        )
+223    }
+224
+225    /// Returns size of the type in bytes.
+226    pub fn size_of(self, db: &dyn MirDb, slot_size: usize) -> usize {
+227        match &self.data(db).kind {
+228            TypeKind::Bool | TypeKind::I8 | TypeKind::U8 => 1,
+229            TypeKind::I16 | TypeKind::U16 => 2,
+230            TypeKind::I32 | TypeKind::U32 => 4,
+231            TypeKind::I64 | TypeKind::U64 => 8,
+232            TypeKind::I128 | TypeKind::U128 => 16,
+233            TypeKind::String(len) => 32 + len,
+234            TypeKind::MPtr(..)
+235            | TypeKind::SPtr(..)
+236            | TypeKind::I256
+237            | TypeKind::U256
+238            | TypeKind::Map(_) => 32,
+239            TypeKind::Address => 20,
+240            TypeKind::Unit => 0,
+241
+242            TypeKind::Array(def) => array_elem_size_imp(db, def, slot_size) * def.len,
+243
+244            TypeKind::Tuple(def) => {
+245                if def.items.is_empty() {
+246                    return 0;
+247                }
+248                let last_idx = def.items.len() - 1;
+249                self.aggregate_elem_offset(db, last_idx, slot_size)
+250                    + def.items[last_idx].size_of(db, slot_size)
+251            }
+252
+253            TypeKind::Struct(def) | TypeKind::Contract(def) => {
+254                if def.fields.is_empty() {
+255                    return 0;
+256                }
+257                let last_idx = def.fields.len() - 1;
+258                self.aggregate_elem_offset(db, last_idx, slot_size)
+259                    + def.fields[last_idx].1.size_of(db, slot_size)
+260            }
+261
+262            TypeKind::Enum(def) => {
+263                let data_offset = self.enum_data_offset(db, slot_size);
+264                let maximum_data_size = def
+265                    .variants
+266                    .iter()
+267                    .map(|variant| variant.ty.size_of(db, slot_size))
+268                    .max()
+269                    .unwrap_or(0);
+270                data_offset + maximum_data_size
+271            }
+272        }
+273    }
+274
+275    pub fn is_zero_sized(self, db: &dyn MirDb) -> bool {
+276        // It's ok to use 1 as a slot size because slot size doesn't affect whether a
+277        // type is zero sized or not.
+278        self.size_of(db, 1) == 0
+279    }
+280
+281    pub fn align_of(self, db: &dyn MirDb, slot_size: usize) -> usize {
+282        if self.is_primitive(db) {
+283            1
+284        } else {
+285            // TODO: Too naive, we could implement more efficient layout for aggregate
+286            // types.
+287            slot_size
+288        }
+289    }
+290
+291    /// Returns an offset of the element of aggregate type.
+292    pub fn aggregate_elem_offset<T>(self, db: &dyn MirDb, elem_idx: T, slot_size: usize) -> usize
+293    where
+294        T: num_traits::ToPrimitive,
+295    {
+296        debug_assert!(self.is_aggregate(db));
+297        debug_assert!(elem_idx.to_usize().unwrap() < self.aggregate_field_num(db));
+298        let elem_idx = elem_idx.to_usize().unwrap();
+299
+300        if elem_idx == 0 {
+301            return 0;
+302        }
+303
+304        match &self.data(db).kind {
+305            TypeKind::Array(def) => array_elem_size_imp(db, def, slot_size) * elem_idx,
+306            TypeKind::Enum(_) => self.enum_data_offset(db, slot_size),
+307            _ => {
+308                let mut offset = self.aggregate_elem_offset(db, elem_idx - 1, slot_size)
+309                    + self
+310                        .projection_ty_imm(db, elem_idx - 1)
+311                        .size_of(db, slot_size);
+312
+313                let elem_ty = self.projection_ty_imm(db, elem_idx);
+314                if (offset % slot_size + elem_ty.size_of(db, slot_size)) > slot_size {
+315                    offset = round_up(offset, slot_size);
+316                }
+317
+318                round_up(offset, elem_ty.align_of(db, slot_size))
+319            }
+320        }
+321    }
+322
+323    pub fn is_aggregate(self, db: &dyn MirDb) -> bool {
+324        matches!(
+325            &self.data(db).kind,
+326            TypeKind::Array(_)
+327                | TypeKind::Tuple(_)
+328                | TypeKind::Struct(_)
+329                | TypeKind::Enum(_)
+330                | TypeKind::Contract(_)
+331        )
+332    }
+333
+334    pub fn is_struct(self, db: &dyn MirDb) -> bool {
+335        matches!(&self.data(db).as_ref().kind, TypeKind::Struct(_))
+336    }
+337
+338    pub fn is_array(self, db: &dyn MirDb) -> bool {
+339        matches!(&self.data(db).kind, TypeKind::Array(_))
+340    }
+341
+342    pub fn is_string(self, db: &dyn MirDb) -> bool {
+343        matches! {
+344            &self.data(db).kind,
+345            TypeKind::String(_)
+346        }
+347    }
+348
+349    pub fn is_ptr(self, db: &dyn MirDb) -> bool {
+350        self.is_mptr(db) || self.is_sptr(db)
+351    }
+352
+353    pub fn is_mptr(self, db: &dyn MirDb) -> bool {
+354        matches!(self.data(db).kind, TypeKind::MPtr(_))
+355    }
+356
+357    pub fn is_sptr(self, db: &dyn MirDb) -> bool {
+358        matches!(self.data(db).kind, TypeKind::SPtr(_))
+359    }
+360
+361    pub fn is_map(self, db: &dyn MirDb) -> bool {
+362        matches!(self.data(db).kind, TypeKind::Map(_))
+363    }
+364
+365    pub fn is_contract(self, db: &dyn MirDb) -> bool {
+366        matches!(self.data(db).kind, TypeKind::Contract(_))
+367    }
+368
+369    pub fn array_elem_size(self, db: &dyn MirDb, slot_size: usize) -> usize {
+370        let data = self.data(db);
+371        if let TypeKind::Array(def) = &data.kind {
+372            array_elem_size_imp(db, def, slot_size)
+373        } else {
+374            panic!("expected `Array` type; but got {:?}", data.as_ref())
+375        }
+376    }
+377
+378    pub fn print<W: fmt::Write>(&self, db: &dyn MirDb, w: &mut W) -> fmt::Result {
+379        match &self.data(db).kind {
+380            TypeKind::I8 => write!(w, "i8"),
+381            TypeKind::I16 => write!(w, "i16"),
+382            TypeKind::I32 => write!(w, "i32"),
+383            TypeKind::I64 => write!(w, "i64"),
+384            TypeKind::I128 => write!(w, "i128"),
+385            TypeKind::I256 => write!(w, "i256"),
+386            TypeKind::U8 => write!(w, "u8"),
+387            TypeKind::U16 => write!(w, "u16"),
+388            TypeKind::U32 => write!(w, "u32"),
+389            TypeKind::U64 => write!(w, "u64"),
+390            TypeKind::U128 => write!(w, "u128"),
+391            TypeKind::U256 => write!(w, "u256"),
+392            TypeKind::Bool => write!(w, "bool"),
+393            TypeKind::Address => write!(w, "address"),
+394            TypeKind::Unit => write!(w, "()"),
+395            TypeKind::String(size) => write!(w, "Str<{size}>"),
+396            TypeKind::Array(ArrayDef { elem_ty, len }) => {
+397                write!(w, "[")?;
+398                elem_ty.print(db, w)?;
+399                write!(w, "; {len}]")
+400            }
+401            TypeKind::Tuple(TupleDef { items }) => {
+402                write!(w, "(")?;
+403                if items.is_empty() {
+404                    return write!(w, ")");
+405                }
+406
+407                let len = items.len();
+408                for item in &items[0..len - 1] {
+409                    item.print(db, w)?;
+410                    write!(w, ", ")?;
+411                }
+412                items.last().unwrap().print(db, w)?;
+413                write!(w, ")")
+414            }
+415            TypeKind::Struct(def) => {
+416                write!(w, "{}", def.name)
+417            }
+418            TypeKind::Enum(def) => {
+419                write!(w, "{}", def.name)
+420            }
+421            TypeKind::Contract(def) => {
+422                write!(w, "{}", def.name)
+423            }
+424            TypeKind::Map(def) => {
+425                write!(w, "Map<")?;
+426                def.key_ty.print(db, w)?;
+427                write!(w, ",")?;
+428                def.value_ty.print(db, w)?;
+429                write!(w, ">")
+430            }
+431            TypeKind::MPtr(inner) => {
+432                write!(w, "*@m ")?;
+433                inner.print(db, w)
+434            }
+435            TypeKind::SPtr(inner) => {
+436                write!(w, "*@s ")?;
+437                inner.print(db, w)
+438            }
+439        }
+440    }
+441
+442    pub fn as_string(&self, db: &dyn MirDb) -> String {
+443        let mut s = String::new();
+444        self.print(db, &mut s).unwrap();
+445        s
+446    }
+447}
+448
+449fn array_elem_size_imp(db: &dyn MirDb, arr: &ArrayDef, slot_size: usize) -> usize {
+450    let elem_ty = arr.elem_ty;
+451    let elem = elem_ty.size_of(db, slot_size);
+452    let align = if elem_ty.is_address(db) {
+453        slot_size
+454    } else {
+455        elem_ty.align_of(db, slot_size)
+456    };
+457    round_up(elem, align)
+458}
+459
+460fn expect_projection_index(value: &Value) -> usize {
+461    match value {
+462        Value::Immediate { imm, .. } => imm.to_usize().unwrap(),
+463        _ => panic!("given `value` is not an immediate"),
+464    }
+465}
+466
+467fn round_up(value: usize, slot_size: usize) -> usize {
+468    ((value + slot_size - 1) / slot_size) * slot_size
+469}
+470
+471#[cfg(test)]
+472mod tests {
+473    use fe_analyzer::namespace::items::ModuleId;
+474    use fe_common::Span;
+475
+476    use super::*;
+477    use crate::{
+478        db::{MirDb, NewDb},
+479        ir::types::StructDef,
+480    };
+481
+482    #[test]
+483    fn test_primitive_type_info() {
+484        let db = NewDb::default();
+485        let i8 = db.mir_intern_type(Type::new(TypeKind::I8, None).into());
+486        let bool = db.mir_intern_type(Type::new(TypeKind::Bool, None).into());
+487
+488        debug_assert_eq!(i8.size_of(&db, 1), 1);
+489        debug_assert_eq!(i8.size_of(&db, 32), 1);
+490        debug_assert_eq!(i8.align_of(&db, 1), 1);
+491        debug_assert_eq!(i8.align_of(&db, 32), 1);
+492        debug_assert_eq!(bool.size_of(&db, 1), 1);
+493        debug_assert_eq!(bool.size_of(&db, 32), 1);
+494        debug_assert_eq!(i8.align_of(&db, 32), 1);
+495        debug_assert_eq!(i8.align_of(&db, 32), 1);
+496
+497        let u32 = db.mir_intern_type(Type::new(TypeKind::U32, None).into());
+498        debug_assert_eq!(u32.size_of(&db, 1), 4);
+499        debug_assert_eq!(u32.size_of(&db, 32), 4);
+500        debug_assert_eq!(u32.align_of(&db, 32), 1);
+501
+502        let address = db.mir_intern_type(Type::new(TypeKind::Address, None).into());
+503        debug_assert_eq!(address.size_of(&db, 1), 20);
+504        debug_assert_eq!(address.size_of(&db, 32), 20);
+505        debug_assert_eq!(address.align_of(&db, 32), 1);
+506    }
+507
+508    #[test]
+509    fn test_primitive_elem_array_type_info() {
+510        let db = NewDb::default();
+511        let i32 = db.mir_intern_type(Type::new(TypeKind::I32, None).into());
+512
+513        let array_len = 10;
+514        let array_def = ArrayDef {
+515            elem_ty: i32,
+516            len: array_len,
+517        };
+518        let array = db.mir_intern_type(Type::new(TypeKind::Array(array_def), None).into());
+519
+520        let elem_size = array.array_elem_size(&db, 1);
+521        debug_assert_eq!(elem_size, 4);
+522        debug_assert_eq!(array.array_elem_size(&db, 32), elem_size);
+523
+524        debug_assert_eq!(array.size_of(&db, 1), elem_size * array_len);
+525        debug_assert_eq!(array.size_of(&db, 32), elem_size * array_len);
+526        debug_assert_eq!(array.align_of(&db, 1), 1);
+527        debug_assert_eq!(array.align_of(&db, 32), 32);
+528
+529        debug_assert_eq!(array.aggregate_elem_offset(&db, 3, 32), elem_size * 3);
+530        debug_assert_eq!(array.aggregate_elem_offset(&db, 9, 1), elem_size * 9);
+531    }
+532
+533    #[test]
+534    fn test_aggregate_elem_array_type_info() {
+535        let db = NewDb::default();
+536        let i8 = db.mir_intern_type(Type::new(TypeKind::I8, None).into());
+537        let i64 = db.mir_intern_type(Type::new(TypeKind::I64, None).into());
+538        let i128 = db.mir_intern_type(Type::new(TypeKind::I128, None).into());
+539
+540        let fields = vec![
+541            ("".into(), i64),
+542            ("".into(), i64),
+543            ("".into(), i8),
+544            ("".into(), i128),
+545            ("".into(), i8),
+546        ];
+547
+548        let struct_def = StructDef {
+549            name: "".into(),
+550            fields,
+551            span: Span::dummy(),
+552            module_id: ModuleId::from_raw_internal(0),
+553        };
+554        let aggregate = db.mir_intern_type(Type::new(TypeKind::Struct(struct_def), None).into());
+555
+556        let array_len = 10;
+557        let array_def = ArrayDef {
+558            elem_ty: aggregate,
+559            len: array_len,
+560        };
+561        let array = db.mir_intern_type(Type::new(TypeKind::Array(array_def), None).into());
+562
+563        debug_assert_eq!(array.array_elem_size(&db, 1), 34);
+564        debug_assert_eq!(array.array_elem_size(&db, 32), 64);
+565
+566        debug_assert_eq!(array.size_of(&db, 1), 34 * array_len);
+567        debug_assert_eq!(array.size_of(&db, 32), 64 * array_len);
+568
+569        debug_assert_eq!(array.align_of(&db, 1), 1);
+570        debug_assert_eq!(array.align_of(&db, 32), 32);
+571
+572        debug_assert_eq!(array.aggregate_elem_offset(&db, 3, 1), 102);
+573        debug_assert_eq!(array.aggregate_elem_offset(&db, 3, 32), 192);
+574    }
+575
+576    #[test]
+577    fn test_primitive_elem_aggregate_type_info() {
+578        let db = NewDb::default();
+579        let i8 = db.mir_intern_type(Type::new(TypeKind::I8, None).into());
+580        let i64 = db.mir_intern_type(Type::new(TypeKind::I64, None).into());
+581        let i128 = db.mir_intern_type(Type::new(TypeKind::I128, None).into());
+582
+583        let fields = vec![
+584            ("".into(), i64),
+585            ("".into(), i64),
+586            ("".into(), i8),
+587            ("".into(), i128),
+588            ("".into(), i8),
+589        ];
+590
+591        let struct_def = StructDef {
+592            name: "".into(),
+593            fields,
+594            span: Span::dummy(),
+595            module_id: ModuleId::from_raw_internal(0),
+596        };
+597        let aggregate = db.mir_intern_type(Type::new(TypeKind::Struct(struct_def), None).into());
+598
+599        debug_assert_eq!(aggregate.size_of(&db, 1), 34);
+600        debug_assert_eq!(aggregate.size_of(&db, 32), 49);
+601
+602        debug_assert_eq!(aggregate.align_of(&db, 1), 1);
+603        debug_assert_eq!(aggregate.align_of(&db, 32), 32);
+604
+605        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 0, 1), 0);
+606        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 0, 32), 0);
+607        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 3, 1), 17);
+608        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 3, 32), 32);
+609        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 4, 1), 33);
+610        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 4, 32), 48);
+611    }
+612
+613    #[test]
+614    fn test_aggregate_elem_aggregate_type_info() {
+615        let db = NewDb::default();
+616        let i8 = db.mir_intern_type(Type::new(TypeKind::I8, None).into());
+617        let i64 = db.mir_intern_type(Type::new(TypeKind::I64, None).into());
+618        let i128 = db.mir_intern_type(Type::new(TypeKind::I128, None).into());
+619
+620        let fields_inner = vec![
+621            ("".into(), i64),
+622            ("".into(), i64),
+623            ("".into(), i8),
+624            ("".into(), i128),
+625            ("".into(), i8),
+626        ];
+627
+628        let struct_def_inner = StructDef {
+629            name: "".into(),
+630            fields: fields_inner,
+631            span: Span::dummy(),
+632            module_id: ModuleId::from_raw_internal(0),
+633        };
+634        let aggregate_inner =
+635            db.mir_intern_type(Type::new(TypeKind::Struct(struct_def_inner), None).into());
+636
+637        let fields = vec![("".into(), i8), ("".into(), aggregate_inner)];
+638        let struct_def = StructDef {
+639            name: "".into(),
+640            fields,
+641            span: Span::dummy(),
+642            module_id: ModuleId::from_raw_internal(0),
+643        };
+644        let aggregate = db.mir_intern_type(Type::new(TypeKind::Struct(struct_def), None).into());
+645
+646        debug_assert_eq!(aggregate.size_of(&db, 1), 35);
+647        debug_assert_eq!(aggregate.size_of(&db, 32), 81);
+648
+649        debug_assert_eq!(aggregate.align_of(&db, 1), 1);
+650        debug_assert_eq!(aggregate.align_of(&db, 32), 32);
+651
+652        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 0, 1), 0);
+653        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 0, 32), 0);
+654        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 1, 1), 1);
+655        debug_assert_eq!(aggregate.aggregate_elem_offset(&db, 1, 32), 32);
+656    }
+657}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/graphviz/block.rs.html b/compiler-docs/src/fe_mir/graphviz/block.rs.html new file mode 100644 index 0000000000..bf799116e1 --- /dev/null +++ b/compiler-docs/src/fe_mir/graphviz/block.rs.html @@ -0,0 +1,62 @@ +block.rs - source

fe_mir/graphviz/
block.rs

1use std::fmt::Write;
+2
+3use dot2::{label, Id};
+4
+5use crate::{
+6    analysis::ControlFlowGraph,
+7    db::MirDb,
+8    ir::{BasicBlockId, FunctionId},
+9    pretty_print::PrettyPrint,
+10};
+11
+12#[derive(Debug, Clone, Copy)]
+13pub(super) struct BlockNode {
+14    func: FunctionId,
+15    pub block: BasicBlockId,
+16}
+17
+18impl BlockNode {
+19    pub(super) fn new(func: FunctionId, block: BasicBlockId) -> Self {
+20        Self { func, block }
+21    }
+22    pub(super) fn id(self) -> dot2::Result<Id<'static>> {
+23        Id::new(format!("fn{}_bb{}", self.func.0, self.block.index()))
+24    }
+25
+26    pub(super) fn label(self, db: &dyn MirDb) -> label::Text<'static> {
+27        let mut label = r#"<table border="0" cellborder="1" cellspacing="0">"#.to_string();
+28
+29        // Write block header.
+30        write!(
+31            &mut label,
+32            r#"<tr><td bgcolor="gray" align="center" colspan="1">BB{}</td></tr>"#,
+33            self.block.index()
+34        )
+35        .unwrap();
+36
+37        // Write block body.
+38        let func_body = self.func.body(db);
+39        write!(label, r#"<tr><td align="left" balign="left">"#).unwrap();
+40        for inst in func_body.order.iter_inst(self.block) {
+41            let mut inst_string = String::new();
+42            inst.pretty_print(db, &func_body.store, &mut inst_string)
+43                .unwrap();
+44            write!(label, "{}", dot2::escape_html(&inst_string)).unwrap();
+45            write!(label, "<br/>").unwrap();
+46        }
+47        write!(label, r#"</td></tr>"#).unwrap();
+48
+49        write!(label, "</table>").unwrap();
+50
+51        label::Text::HtmlStr(label.into())
+52    }
+53
+54    pub(super) fn succs(self, db: &dyn MirDb) -> Vec<BlockNode> {
+55        let func_body = self.func.body(db);
+56        let cfg = ControlFlowGraph::compute(&func_body);
+57        cfg.succs(self.block)
+58            .iter()
+59            .map(|block| Self::new(self.func, *block))
+60            .collect()
+61    }
+62}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/graphviz/function.rs.html b/compiler-docs/src/fe_mir/graphviz/function.rs.html new file mode 100644 index 0000000000..5002661885 --- /dev/null +++ b/compiler-docs/src/fe_mir/graphviz/function.rs.html @@ -0,0 +1,78 @@ +function.rs - source

fe_mir/graphviz/
function.rs

1use std::fmt::Write;
+2
+3use dot2::{label, Id};
+4
+5use crate::{analysis::ControlFlowGraph, db::MirDb, ir::FunctionId, pretty_print::PrettyPrint};
+6
+7use super::block::BlockNode;
+8
+9#[derive(Debug, Clone, Copy)]
+10pub(super) struct FunctionNode {
+11    pub(super) func: FunctionId,
+12}
+13
+14impl FunctionNode {
+15    pub(super) fn new(func: FunctionId) -> Self {
+16        Self { func }
+17    }
+18
+19    pub(super) fn subgraph_id(self) -> Option<Id<'static>> {
+20        dot2::Id::new(format!("cluster_{}", self.func.0)).ok()
+21    }
+22
+23    pub(super) fn label(self, db: &dyn MirDb) -> label::Text<'static> {
+24        let mut label = self.signature(db);
+25        write!(label, r#"<br/><br align="left"/>"#).unwrap();
+26
+27        // Maps local value id to local name.
+28        let body = self.func.body(db);
+29        for local in body.store.locals() {
+30            local.pretty_print(db, &body.store, &mut label).unwrap();
+31            write!(
+32                label,
+33                r#" =&gt; {}<br align="left"/>"#,
+34                body.store.local_name(*local).unwrap()
+35            )
+36            .unwrap();
+37        }
+38
+39        label::Text::HtmlStr(label.into())
+40    }
+41
+42    pub(super) fn blocks(self, db: &dyn MirDb) -> Vec<BlockNode> {
+43        let body = self.func.body(db);
+44        // We use control flow graph to collect reachable blocks.
+45        let cfg = ControlFlowGraph::compute(&body);
+46        cfg.post_order()
+47            .map(|block| BlockNode::new(self.func, block))
+48            .collect()
+49    }
+50
+51    fn signature(self, db: &dyn MirDb) -> String {
+52        let body = self.func.body(db);
+53
+54        let sig_data = self.func.signature(db);
+55        let mut sig = format!("fn {}(", self.func.debug_name(db));
+56
+57        let params = &sig_data.params;
+58        let param_len = params.len();
+59        for (i, param) in params.iter().enumerate() {
+60            let name = &param.name;
+61            let ty = param.ty;
+62            write!(&mut sig, "{name}: ").unwrap();
+63            ty.pretty_print(db, &body.store, &mut sig).unwrap();
+64            if param_len - 1 != i {
+65                write!(sig, ", ").unwrap();
+66            }
+67        }
+68        write!(sig, ")").unwrap();
+69
+70        let ret_ty = self.func.return_type(db);
+71        if let Some(ret_ty) = ret_ty {
+72            write!(sig, " -> ").unwrap();
+73            ret_ty.pretty_print(db, &body.store, &mut sig).unwrap();
+74        }
+75
+76        dot2::escape_html(&sig)
+77    }
+78}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/graphviz/mod.rs.html b/compiler-docs/src/fe_mir/graphviz/mod.rs.html new file mode 100644 index 0000000000..e5a663daa8 --- /dev/null +++ b/compiler-docs/src/fe_mir/graphviz/mod.rs.html @@ -0,0 +1,22 @@ +mod.rs - source

fe_mir/graphviz/
mod.rs

1use std::io;
+2
+3use fe_analyzer::namespace::items::ModuleId;
+4
+5use crate::db::MirDb;
+6
+7mod block;
+8mod function;
+9mod module;
+10
+11/// Writes mir graphs of functions in a `module`.
+12pub fn write_mir_graphs<W: io::Write>(
+13    db: &dyn MirDb,
+14    module: ModuleId,
+15    w: &mut W,
+16) -> io::Result<()> {
+17    let module_graph = module::ModuleGraph::new(db, module);
+18    dot2::render(&module_graph, w).map_err(|err| match err {
+19        dot2::Error::Io(err) => err,
+20        _ => panic!("invalid graphviz id"),
+21    })
+22}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/graphviz/module.rs.html b/compiler-docs/src/fe_mir/graphviz/module.rs.html new file mode 100644 index 0000000000..a4ed39b9ba --- /dev/null +++ b/compiler-docs/src/fe_mir/graphviz/module.rs.html @@ -0,0 +1,158 @@ +module.rs - source

fe_mir/graphviz/
module.rs

1use dot2::{label::Text, GraphWalk, Id, Kind, Labeller};
+2use fe_analyzer::namespace::items::ModuleId;
+3
+4use crate::{
+5    db::MirDb,
+6    ir::{inst::BranchInfo, FunctionId},
+7    pretty_print::PrettyPrint,
+8};
+9
+10use super::{block::BlockNode, function::FunctionNode};
+11
+12pub(super) struct ModuleGraph<'db> {
+13    db: &'db dyn MirDb,
+14    module: ModuleId,
+15}
+16
+17impl<'db> ModuleGraph<'db> {
+18    pub(super) fn new(db: &'db dyn MirDb, module: ModuleId) -> Self {
+19        Self { db, module }
+20    }
+21}
+22
+23impl<'db> GraphWalk<'db> for ModuleGraph<'db> {
+24    type Node = BlockNode;
+25    type Edge = ModuleGraphEdge;
+26    type Subgraph = FunctionNode;
+27
+28    fn nodes(&self) -> dot2::Nodes<'db, Self::Node> {
+29        let mut nodes = Vec::new();
+30
+31        // Collect function nodes.
+32        for func in self
+33            .db
+34            .mir_lower_module_all_functions(self.module)
+35            .iter()
+36            .map(|id| FunctionNode::new(*id))
+37        {
+38            nodes.extend(func.blocks(self.db).into_iter())
+39        }
+40
+41        nodes.into()
+42    }
+43
+44    fn edges(&self) -> dot2::Edges<'db, Self::Edge> {
+45        let mut edges = vec![];
+46        for func in self.db.mir_lower_module_all_functions(self.module).iter() {
+47            for block in FunctionNode::new(*func).blocks(self.db) {
+48                for succ in block.succs(self.db) {
+49                    let edge = ModuleGraphEdge {
+50                        from: block,
+51                        to: succ,
+52                        func: *func,
+53                    };
+54                    edges.push(edge);
+55                }
+56            }
+57        }
+58
+59        edges.into()
+60    }
+61
+62    fn source(&self, edge: &Self::Edge) -> Self::Node {
+63        edge.from
+64    }
+65
+66    fn target(&self, edge: &Self::Edge) -> Self::Node {
+67        edge.to
+68    }
+69
+70    fn subgraphs(&self) -> dot2::Subgraphs<'db, Self::Subgraph> {
+71        self.db
+72            .mir_lower_module_all_functions(self.module)
+73            .iter()
+74            .map(|id| FunctionNode::new(*id))
+75            .collect::<Vec<_>>()
+76            .into()
+77    }
+78
+79    fn subgraph_nodes(&self, s: &Self::Subgraph) -> dot2::Nodes<'db, Self::Node> {
+80        s.blocks(self.db).into_iter().collect::<Vec<_>>().into()
+81    }
+82}
+83
+84impl<'db> Labeller<'db> for ModuleGraph<'db> {
+85    type Node = BlockNode;
+86    type Edge = ModuleGraphEdge;
+87    type Subgraph = FunctionNode;
+88
+89    fn graph_id(&self) -> dot2::Result<Id<'db>> {
+90        let module_name = self.module.name(self.db.upcast());
+91        dot2::Id::new(module_name.to_string())
+92    }
+93
+94    fn node_id(&self, n: &Self::Node) -> dot2::Result<Id<'db>> {
+95        n.id()
+96    }
+97
+98    fn node_shape(&self, _n: &Self::Node) -> Option<Text<'db>> {
+99        Some(Text::LabelStr("none".into()))
+100    }
+101
+102    fn node_label(&self, n: &Self::Node) -> dot2::Result<Text<'db>> {
+103        Ok(n.label(self.db))
+104    }
+105
+106    fn edge_label<'a>(&self, e: &Self::Edge) -> Text<'db> {
+107        Text::LabelStr(e.label(self.db).into())
+108    }
+109
+110    fn subgraph_id(&self, s: &Self::Subgraph) -> Option<Id<'db>> {
+111        s.subgraph_id()
+112    }
+113
+114    fn subgraph_label(&self, s: &Self::Subgraph) -> Text<'db> {
+115        s.label(self.db)
+116    }
+117
+118    fn kind(&self) -> Kind {
+119        Kind::Digraph
+120    }
+121}
+122
+123#[derive(Debug, Clone)]
+124pub(super) struct ModuleGraphEdge {
+125    from: BlockNode,
+126    to: BlockNode,
+127    func: FunctionId,
+128}
+129
+130impl ModuleGraphEdge {
+131    fn label(&self, db: &dyn MirDb) -> String {
+132        let body = self.func.body(db);
+133        let terminator = body.order.terminator(&body.store, self.from.block).unwrap();
+134        let to = self.to.block;
+135        match body.store.branch_info(terminator) {
+136            BranchInfo::NotBranch => unreachable!(),
+137            BranchInfo::Jump(_) => String::new(),
+138            BranchInfo::Branch(_, true_bb, _) => {
+139                format! {"{}", true_bb == to}
+140            }
+141            BranchInfo::Switch(_, table, default) => {
+142                if default == Some(to) {
+143                    return "*".to_string();
+144                }
+145
+146                for (value, bb) in table.iter() {
+147                    if bb == to {
+148                        let mut s = String::new();
+149                        value.pretty_print(db, &body.store, &mut s).unwrap();
+150                        return s;
+151                    }
+152                }
+153
+154                unreachable!()
+155            }
+156        }
+157    }
+158}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/basic_block.rs.html b/compiler-docs/src/fe_mir/ir/basic_block.rs.html new file mode 100644 index 0000000000..1d18d6be66 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/basic_block.rs.html @@ -0,0 +1,6 @@ +basic_block.rs - source

fe_mir/ir/
basic_block.rs

1use id_arena::Id;
+2
+3pub type BasicBlockId = Id<BasicBlock>;
+4
+5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+6pub struct BasicBlock {}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/body_builder.rs.html b/compiler-docs/src/fe_mir/ir/body_builder.rs.html new file mode 100644 index 0000000000..a720a09181 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/body_builder.rs.html @@ -0,0 +1,381 @@ +body_builder.rs - source

fe_mir/ir/
body_builder.rs

1use fe_analyzer::namespace::items::ContractId;
+2use num_bigint::BigInt;
+3
+4use crate::ir::{
+5    body_cursor::{BodyCursor, CursorLocation},
+6    inst::{BinOp, Inst, InstKind, UnOp},
+7    value::{AssignableValue, Local},
+8    BasicBlock, BasicBlockId, FunctionBody, FunctionId, InstId, SourceInfo, TypeId,
+9};
+10
+11use super::{
+12    inst::{CallType, CastKind, SwitchTable, YulIntrinsicOp},
+13    ConstantId, Value, ValueId,
+14};
+15
+16#[derive(Debug)]
+17pub struct BodyBuilder {
+18    pub body: FunctionBody,
+19    loc: CursorLocation,
+20}
+21
+22macro_rules! impl_unary_inst {
+23    ($name:ident, $code:path) => {
+24        pub fn $name(&mut self, value: ValueId, source: SourceInfo) -> InstId {
+25            let inst = Inst::unary($code, value, source);
+26            self.insert_inst(inst)
+27        }
+28    };
+29}
+30
+31macro_rules! impl_binary_inst {
+32    ($name:ident, $code:path) => {
+33        pub fn $name(&mut self, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> InstId {
+34            let inst = Inst::binary($code, lhs, rhs, source);
+35            self.insert_inst(inst)
+36        }
+37    };
+38}
+39
+40impl BodyBuilder {
+41    pub fn new(fid: FunctionId, source: SourceInfo) -> Self {
+42        let body = FunctionBody::new(fid, source);
+43        let entry_block = body.order.entry();
+44        Self {
+45            body,
+46            loc: CursorLocation::BlockTop(entry_block),
+47        }
+48    }
+49
+50    pub fn build(self) -> FunctionBody {
+51        self.body
+52    }
+53
+54    pub fn func_id(&self) -> FunctionId {
+55        self.body.fid
+56    }
+57
+58    pub fn make_block(&mut self) -> BasicBlockId {
+59        let block = BasicBlock {};
+60        let block_id = self.body.store.store_block(block);
+61        self.body.order.append_block(block_id);
+62        block_id
+63    }
+64
+65    pub fn make_value(&mut self, value: impl Into<Value>) -> ValueId {
+66        self.body.store.store_value(value.into())
+67    }
+68
+69    pub fn map_result(&mut self, inst: InstId, result: AssignableValue) {
+70        self.body.store.map_result(inst, result)
+71    }
+72
+73    pub fn inst_result(&mut self, inst: InstId) -> Option<&AssignableValue> {
+74        self.body.store.inst_result(inst)
+75    }
+76
+77    pub fn move_to_block(&mut self, block: BasicBlockId) {
+78        self.loc = CursorLocation::BlockBottom(block)
+79    }
+80
+81    pub fn move_to_block_top(&mut self, block: BasicBlockId) {
+82        self.loc = CursorLocation::BlockTop(block)
+83    }
+84
+85    pub fn make_unit(&mut self, unit_ty: TypeId) -> ValueId {
+86        self.body.store.store_value(Value::Unit { ty: unit_ty })
+87    }
+88
+89    pub fn make_imm(&mut self, imm: BigInt, ty: TypeId) -> ValueId {
+90        self.body.store.store_value(Value::Immediate { imm, ty })
+91    }
+92
+93    pub fn make_imm_from_bool(&mut self, imm: bool, ty: TypeId) -> ValueId {
+94        if imm {
+95            self.make_imm(1u8.into(), ty)
+96        } else {
+97            self.make_imm(0u8.into(), ty)
+98        }
+99    }
+100
+101    pub fn make_constant(&mut self, constant: ConstantId, ty: TypeId) -> ValueId {
+102        self.body
+103            .store
+104            .store_value(Value::Constant { constant, ty })
+105    }
+106
+107    pub fn declare(&mut self, local: Local) -> ValueId {
+108        let source = local.source.clone();
+109        let local_id = self.body.store.store_value(Value::Local(local));
+110
+111        let kind = InstKind::Declare { local: local_id };
+112        let inst = Inst::new(kind, source);
+113        self.insert_inst(inst);
+114        local_id
+115    }
+116
+117    pub fn store_func_arg(&mut self, local: Local) -> ValueId {
+118        self.body.store.store_value(Value::Local(local))
+119    }
+120
+121    impl_unary_inst!(not, UnOp::Not);
+122    impl_unary_inst!(neg, UnOp::Neg);
+123    impl_unary_inst!(inv, UnOp::Inv);
+124
+125    impl_binary_inst!(add, BinOp::Add);
+126    impl_binary_inst!(sub, BinOp::Sub);
+127    impl_binary_inst!(mul, BinOp::Mul);
+128    impl_binary_inst!(div, BinOp::Div);
+129    impl_binary_inst!(modulo, BinOp::Mod);
+130    impl_binary_inst!(pow, BinOp::Pow);
+131    impl_binary_inst!(shl, BinOp::Shl);
+132    impl_binary_inst!(shr, BinOp::Shr);
+133    impl_binary_inst!(bit_or, BinOp::BitOr);
+134    impl_binary_inst!(bit_xor, BinOp::BitXor);
+135    impl_binary_inst!(bit_and, BinOp::BitAnd);
+136    impl_binary_inst!(logical_and, BinOp::LogicalAnd);
+137    impl_binary_inst!(logical_or, BinOp::LogicalOr);
+138    impl_binary_inst!(eq, BinOp::Eq);
+139    impl_binary_inst!(ne, BinOp::Ne);
+140    impl_binary_inst!(ge, BinOp::Ge);
+141    impl_binary_inst!(gt, BinOp::Gt);
+142    impl_binary_inst!(le, BinOp::Le);
+143    impl_binary_inst!(lt, BinOp::Lt);
+144
+145    pub fn primitive_cast(
+146        &mut self,
+147        value: ValueId,
+148        result_ty: TypeId,
+149        source: SourceInfo,
+150    ) -> InstId {
+151        let kind = InstKind::Cast {
+152            kind: CastKind::Primitive,
+153            value,
+154            to: result_ty,
+155        };
+156        let inst = Inst::new(kind, source);
+157        self.insert_inst(inst)
+158    }
+159
+160    pub fn untag_cast(&mut self, value: ValueId, result_ty: TypeId, source: SourceInfo) -> InstId {
+161        let kind = InstKind::Cast {
+162            kind: CastKind::Untag,
+163            value,
+164            to: result_ty,
+165        };
+166        let inst = Inst::new(kind, source);
+167        self.insert_inst(inst)
+168    }
+169
+170    pub fn aggregate_construct(
+171        &mut self,
+172        ty: TypeId,
+173        args: Vec<ValueId>,
+174        source: SourceInfo,
+175    ) -> InstId {
+176        let kind = InstKind::AggregateConstruct { ty, args };
+177        let inst = Inst::new(kind, source);
+178        self.insert_inst(inst)
+179    }
+180
+181    pub fn bind(&mut self, src: ValueId, source: SourceInfo) -> InstId {
+182        let kind = InstKind::Bind { src };
+183        let inst = Inst::new(kind, source);
+184        self.insert_inst(inst)
+185    }
+186
+187    pub fn mem_copy(&mut self, src: ValueId, source: SourceInfo) -> InstId {
+188        let kind = InstKind::MemCopy { src };
+189        let inst = Inst::new(kind, source);
+190        self.insert_inst(inst)
+191    }
+192
+193    pub fn load(&mut self, src: ValueId, source: SourceInfo) -> InstId {
+194        let kind = InstKind::Load { src };
+195        let inst = Inst::new(kind, source);
+196        self.insert_inst(inst)
+197    }
+198
+199    pub fn aggregate_access(
+200        &mut self,
+201        value: ValueId,
+202        indices: Vec<ValueId>,
+203        source: SourceInfo,
+204    ) -> InstId {
+205        let kind = InstKind::AggregateAccess { value, indices };
+206        let inst = Inst::new(kind, source);
+207        self.insert_inst(inst)
+208    }
+209
+210    pub fn map_access(&mut self, value: ValueId, key: ValueId, source: SourceInfo) -> InstId {
+211        let kind = InstKind::MapAccess { value, key };
+212        let inst = Inst::new(kind, source);
+213        self.insert_inst(inst)
+214    }
+215
+216    pub fn call(
+217        &mut self,
+218        func: FunctionId,
+219        args: Vec<ValueId>,
+220        call_type: CallType,
+221        source: SourceInfo,
+222    ) -> InstId {
+223        let kind = InstKind::Call {
+224            func,
+225            args,
+226            call_type,
+227        };
+228        let inst = Inst::new(kind, source);
+229        self.insert_inst(inst)
+230    }
+231
+232    pub fn keccak256(&mut self, arg: ValueId, source: SourceInfo) -> InstId {
+233        let kind = InstKind::Keccak256 { arg };
+234        let inst = Inst::new(kind, source);
+235        self.insert_inst(inst)
+236    }
+237
+238    pub fn abi_encode(&mut self, arg: ValueId, source: SourceInfo) -> InstId {
+239        let kind = InstKind::AbiEncode { arg };
+240        let inst = Inst::new(kind, source);
+241        self.insert_inst(inst)
+242    }
+243
+244    pub fn create(&mut self, value: ValueId, contract: ContractId, source: SourceInfo) -> InstId {
+245        let kind = InstKind::Create { value, contract };
+246        let inst = Inst::new(kind, source);
+247        self.insert_inst(inst)
+248    }
+249
+250    pub fn create2(
+251        &mut self,
+252        value: ValueId,
+253        salt: ValueId,
+254        contract: ContractId,
+255        source: SourceInfo,
+256    ) -> InstId {
+257        let kind = InstKind::Create2 {
+258            value,
+259            salt,
+260            contract,
+261        };
+262        let inst = Inst::new(kind, source);
+263        self.insert_inst(inst)
+264    }
+265
+266    pub fn yul_intrinsic(
+267        &mut self,
+268        op: YulIntrinsicOp,
+269        args: Vec<ValueId>,
+270        source: SourceInfo,
+271    ) -> InstId {
+272        let inst = Inst::intrinsic(op, args, source);
+273        self.insert_inst(inst)
+274    }
+275
+276    pub fn jump(&mut self, dest: BasicBlockId, source: SourceInfo) -> InstId {
+277        let kind = InstKind::Jump { dest };
+278        let inst = Inst::new(kind, source);
+279        self.insert_inst(inst)
+280    }
+281
+282    pub fn branch(
+283        &mut self,
+284        cond: ValueId,
+285        then: BasicBlockId,
+286        else_: BasicBlockId,
+287        source: SourceInfo,
+288    ) -> InstId {
+289        let kind = InstKind::Branch { cond, then, else_ };
+290        let inst = Inst::new(kind, source);
+291        self.insert_inst(inst)
+292    }
+293
+294    pub fn switch(
+295        &mut self,
+296        disc: ValueId,
+297        table: SwitchTable,
+298        default: Option<BasicBlockId>,
+299        source: SourceInfo,
+300    ) -> InstId {
+301        let kind = InstKind::Switch {
+302            disc,
+303            table,
+304            default,
+305        };
+306        let inst = Inst::new(kind, source);
+307        self.insert_inst(inst)
+308    }
+309
+310    pub fn revert(&mut self, arg: Option<ValueId>, source: SourceInfo) -> InstId {
+311        let kind = InstKind::Revert { arg };
+312        let inst = Inst::new(kind, source);
+313        self.insert_inst(inst)
+314    }
+315
+316    pub fn emit(&mut self, arg: ValueId, source: SourceInfo) -> InstId {
+317        let kind = InstKind::Emit { arg };
+318        let inst = Inst::new(kind, source);
+319        self.insert_inst(inst)
+320    }
+321
+322    pub fn ret(&mut self, arg: ValueId, source: SourceInfo) -> InstId {
+323        let kind = InstKind::Return { arg: arg.into() };
+324        let inst = Inst::new(kind, source);
+325        self.insert_inst(inst)
+326    }
+327
+328    pub fn nop(&mut self, source: SourceInfo) -> InstId {
+329        let kind = InstKind::Nop;
+330        let inst = Inst::new(kind, source);
+331        self.insert_inst(inst)
+332    }
+333
+334    pub fn value_ty(&mut self, value: ValueId) -> TypeId {
+335        self.body.store.value_ty(value)
+336    }
+337
+338    pub fn value_data(&mut self, value: ValueId) -> &Value {
+339        self.body.store.value_data(value)
+340    }
+341
+342    /// Returns `true` if current block is terminated.
+343    pub fn is_block_terminated(&mut self, block: BasicBlockId) -> bool {
+344        self.body.order.is_terminated(&self.body.store, block)
+345    }
+346
+347    pub fn is_current_block_terminated(&mut self) -> bool {
+348        let current_block = self.current_block();
+349        self.is_block_terminated(current_block)
+350    }
+351
+352    pub fn current_block(&mut self) -> BasicBlockId {
+353        self.cursor().expect_block()
+354    }
+355
+356    pub fn remove_inst(&mut self, inst: InstId) {
+357        let mut cursor = BodyCursor::new(&mut self.body, CursorLocation::Inst(inst));
+358        if self.loc == cursor.loc() {
+359            self.loc = cursor.prev_loc();
+360        }
+361        cursor.remove_inst();
+362    }
+363
+364    pub fn inst_data(&self, inst: InstId) -> &Inst {
+365        self.body.store.inst_data(inst)
+366    }
+367
+368    fn insert_inst(&mut self, inst: Inst) -> InstId {
+369        let mut cursor = self.cursor();
+370        let inst_id = cursor.store_and_insert_inst(inst);
+371
+372        // Set cursor to the new inst.
+373        self.loc = CursorLocation::Inst(inst_id);
+374
+375        inst_id
+376    }
+377
+378    fn cursor(&mut self) -> BodyCursor {
+379        BodyCursor::new(&mut self.body, self.loc)
+380    }
+381}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/body_cursor.rs.html b/compiler-docs/src/fe_mir/ir/body_cursor.rs.html new file mode 100644 index 0000000000..695e29c678 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/body_cursor.rs.html @@ -0,0 +1,231 @@ +body_cursor.rs - source

fe_mir/ir/
body_cursor.rs

1//! This module provides a collection of structs to modify function body
+2//! in-place.
+3// The design used here is greatly inspired by [`cranelift`](https://crates.io/crates/cranelift)
+4
+5use super::{
+6    value::AssignableValue, BasicBlock, BasicBlockId, FunctionBody, Inst, InstId, ValueId,
+7};
+8
+9/// Specify a current location of [`BodyCursor`]
+10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+11pub enum CursorLocation {
+12    Inst(InstId),
+13    BlockTop(BasicBlockId),
+14    BlockBottom(BasicBlockId),
+15    NoWhere,
+16}
+17
+18pub struct BodyCursor<'a> {
+19    body: &'a mut FunctionBody,
+20    loc: CursorLocation,
+21}
+22
+23impl<'a> BodyCursor<'a> {
+24    pub fn new(body: &'a mut FunctionBody, loc: CursorLocation) -> Self {
+25        Self { body, loc }
+26    }
+27
+28    pub fn new_at_entry(body: &'a mut FunctionBody) -> Self {
+29        let entry = body.order.entry();
+30        Self {
+31            body,
+32            loc: CursorLocation::BlockTop(entry),
+33        }
+34    }
+35    pub fn set_loc(&mut self, loc: CursorLocation) {
+36        self.loc = loc;
+37    }
+38
+39    pub fn loc(&self) -> CursorLocation {
+40        self.loc
+41    }
+42
+43    pub fn next_loc(&self) -> CursorLocation {
+44        match self.loc() {
+45            CursorLocation::Inst(inst) => self.body.order.next_inst(inst).map_or_else(
+46                || CursorLocation::BlockBottom(self.body.order.inst_block(inst)),
+47                CursorLocation::Inst,
+48            ),
+49            CursorLocation::BlockTop(block) => self
+50                .body
+51                .order
+52                .first_inst(block)
+53                .map_or_else(|| CursorLocation::BlockBottom(block), CursorLocation::Inst),
+54            CursorLocation::BlockBottom(block) => self
+55                .body()
+56                .order
+57                .next_block(block)
+58                .map_or(CursorLocation::NoWhere, |next_block| {
+59                    CursorLocation::BlockTop(next_block)
+60                }),
+61            CursorLocation::NoWhere => CursorLocation::NoWhere,
+62        }
+63    }
+64
+65    pub fn prev_loc(&self) -> CursorLocation {
+66        match self.loc() {
+67            CursorLocation::Inst(inst) => self.body.order.prev_inst(inst).map_or_else(
+68                || CursorLocation::BlockTop(self.body.order.inst_block(inst)),
+69                CursorLocation::Inst,
+70            ),
+71            CursorLocation::BlockTop(block) => self
+72                .body
+73                .order
+74                .prev_block(block)
+75                .map_or(CursorLocation::NoWhere, |prev_block| {
+76                    CursorLocation::BlockBottom(prev_block)
+77                }),
+78            CursorLocation::BlockBottom(block) => self
+79                .body
+80                .order
+81                .last_inst(block)
+82                .map_or_else(|| CursorLocation::BlockTop(block), CursorLocation::Inst),
+83            CursorLocation::NoWhere => CursorLocation::NoWhere,
+84        }
+85    }
+86
+87    pub fn next_block(&self) -> Option<BasicBlockId> {
+88        let block = self.expect_block();
+89        self.body.order.next_block(block)
+90    }
+91
+92    pub fn prev_block(&self) -> Option<BasicBlockId> {
+93        let block = self.expect_block();
+94        self.body.order.prev_block(block)
+95    }
+96
+97    pub fn proceed(&mut self) {
+98        self.set_loc(self.next_loc())
+99    }
+100
+101    pub fn back(&mut self) {
+102        self.set_loc(self.prev_loc());
+103    }
+104
+105    pub fn body(&self) -> &FunctionBody {
+106        self.body
+107    }
+108
+109    pub fn body_mut(&mut self) -> &mut FunctionBody {
+110        self.body
+111    }
+112
+113    /// Sets a cursor to an entry block.
+114    pub fn set_to_entry(&mut self) {
+115        let entry_bb = self.body().order.entry();
+116        let loc = CursorLocation::BlockTop(entry_bb);
+117        self.set_loc(loc);
+118    }
+119
+120    /// Insert [`InstId`] to a location where a cursor points.
+121    /// If you need to store and insert [`Inst`], use [`store_and_insert_inst`].
+122    ///
+123    /// # Panics
+124    /// Panics if a cursor points [`CursorLocation::NoWhere`].
+125    pub fn insert_inst(&mut self, inst: InstId) {
+126        match self.loc() {
+127            CursorLocation::Inst(at) => self.body.order.insert_inst_after(inst, at),
+128            CursorLocation::BlockTop(block) => self.body.order.prepend_inst(inst, block),
+129            CursorLocation::BlockBottom(block) => self.body.order.append_inst(inst, block),
+130            CursorLocation::NoWhere => panic!("cursor loc points to `NoWhere`"),
+131        }
+132    }
+133
+134    pub fn store_and_insert_inst(&mut self, data: Inst) -> InstId {
+135        let inst = self.body.store.store_inst(data);
+136        self.insert_inst(inst);
+137        inst
+138    }
+139
+140    /// Remove a current pointed [`Inst`] from a function body. A cursor
+141    /// proceeds to a next inst.
+142    ///
+143    /// # Panics
+144    /// Panics if a cursor doesn't point [`CursorLocation::Inst`].
+145    pub fn remove_inst(&mut self) {
+146        let inst = self.expect_inst();
+147        let next_loc = self.next_loc();
+148        self.body.order.remove_inst(inst);
+149        self.set_loc(next_loc);
+150    }
+151
+152    /// Remove a current pointed `block` and contained insts from a function
+153    /// body. A cursor proceeds to a next block.
+154    ///
+155    /// # Panics
+156    /// Panics if a cursor doesn't point [`CursorLocation::Inst`].
+157    pub fn remove_block(&mut self) {
+158        let block = match self.loc() {
+159            CursorLocation::Inst(inst) => self.body.order.inst_block(inst),
+160            CursorLocation::BlockTop(block) | CursorLocation::BlockBottom(block) => block,
+161            CursorLocation::NoWhere => panic!("cursor loc points `NoWhere`"),
+162        };
+163
+164        // Store next block of the current block for later use.
+165        let next_block = self.body.order.next_block(block);
+166
+167        // Remove all insts in the current block.
+168        if let Some(first_inst) = self.body.order.first_inst(block) {
+169            self.set_loc(CursorLocation::Inst(first_inst));
+170            while matches!(self.loc(), CursorLocation::Inst(..)) {
+171                self.remove_inst();
+172            }
+173        }
+174        // Remove current block.
+175        self.body.order.remove_block(block);
+176
+177        // Set cursor location to next block if exists.
+178        if let Some(next_block) = next_block {
+179            self.set_loc(CursorLocation::BlockTop(next_block))
+180        } else {
+181            self.set_loc(CursorLocation::NoWhere)
+182        }
+183    }
+184
+185    /// Insert [`BasicBlockId`] to a location where a cursor points.
+186    /// If you need to store and insert [`BasicBlock`], use
+187    /// [`store_and_insert_block`].
+188    ///
+189    /// # Panics
+190    /// Panics if a cursor points [`CursorLocation::NoWhere`].
+191    pub fn insert_block(&mut self, block: BasicBlockId) {
+192        let current = self.expect_block();
+193        self.body.order.insert_block_after_block(block, current)
+194    }
+195
+196    pub fn store_and_insert_block(&mut self, block: BasicBlock) -> BasicBlockId {
+197        let block_id = self.body.store.store_block(block);
+198        self.insert_block(block_id);
+199        block_id
+200    }
+201
+202    pub fn map_result(&mut self, result: AssignableValue) -> Option<ValueId> {
+203        let inst = self.expect_inst();
+204        let result_value = result.value_id();
+205        self.body.store.map_result(inst, result);
+206        result_value
+207    }
+208
+209    /// Returns current inst that cursor points.
+210    ///
+211    /// # Panics
+212    /// Panics if a cursor doesn't point [`CursorLocation::Inst`].
+213    pub fn expect_inst(&self) -> InstId {
+214        match self.loc {
+215            CursorLocation::Inst(inst) => inst,
+216            _ => panic!("Cursor doesn't point any inst."),
+217        }
+218    }
+219
+220    /// Returns current block that cursor points.
+221    ///
+222    /// # Panics
+223    /// Panics if a cursor points [`CursorLocation::NoWhere`].
+224    pub fn expect_block(&self) -> BasicBlockId {
+225        match self.loc {
+226            CursorLocation::Inst(inst) => self.body.order.inst_block(inst),
+227            CursorLocation::BlockTop(block) | CursorLocation::BlockBottom(block) => block,
+228            CursorLocation::NoWhere => panic!("cursor loc points `NoWhere`"),
+229        }
+230    }
+231}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/body_order.rs.html b/compiler-docs/src/fe_mir/ir/body_order.rs.html new file mode 100644 index 0000000000..e9a538b3a1 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/body_order.rs.html @@ -0,0 +1,473 @@ +body_order.rs - source

fe_mir/ir/
body_order.rs

1use fxhash::FxHashMap;
+2
+3use super::{basic_block::BasicBlockId, function::BodyDataStore, inst::InstId};
+4
+5#[derive(Debug, Clone, PartialEq, Eq)]
+6/// Represents basic block order and instruction order.
+7pub struct BodyOrder {
+8    blocks: FxHashMap<BasicBlockId, BlockNode>,
+9    insts: FxHashMap<InstId, InstNode>,
+10    entry_block: BasicBlockId,
+11    last_block: BasicBlockId,
+12}
+13impl BodyOrder {
+14    pub fn new(entry_block: BasicBlockId) -> Self {
+15        let entry_block_node = BlockNode::default();
+16        let mut blocks = FxHashMap::default();
+17        blocks.insert(entry_block, entry_block_node);
+18
+19        Self {
+20            blocks,
+21            insts: FxHashMap::default(),
+22            entry_block,
+23            last_block: entry_block,
+24        }
+25    }
+26
+27    /// Returns an entry block of a function body.
+28    pub fn entry(&self) -> BasicBlockId {
+29        self.entry_block
+30    }
+31
+32    /// Returns a last block of a function body.
+33    pub fn last_block(&self) -> BasicBlockId {
+34        self.last_block
+35    }
+36
+37    /// Returns `true` if a block doesn't contain any block.
+38    pub fn is_block_empty(&self, block: BasicBlockId) -> bool {
+39        self.first_inst(block).is_none()
+40    }
+41
+42    /// Returns `true` if a function body contains a given `block`.
+43    pub fn is_block_inserted(&self, block: BasicBlockId) -> bool {
+44        self.blocks.contains_key(&block)
+45    }
+46
+47    /// Returns a number of block in a function.
+48    pub fn block_num(&self) -> usize {
+49        self.blocks.len()
+50    }
+51
+52    /// Returns a previous block of a given block.
+53    ///
+54    /// # Panics
+55    /// Panics if `block` is not inserted yet.
+56    pub fn prev_block(&self, block: BasicBlockId) -> Option<BasicBlockId> {
+57        self.blocks[&block].prev
+58    }
+59
+60    /// Returns a next block of a given block.
+61    ///
+62    /// # Panics
+63    /// Panics if `block` is not inserted yet.
+64    pub fn next_block(&self, block: BasicBlockId) -> Option<BasicBlockId> {
+65        self.blocks[&block].next
+66    }
+67
+68    /// Returns `true` is a given `inst` is inserted.
+69    pub fn is_inst_inserted(&self, inst: InstId) -> bool {
+70        self.insts.contains_key(&inst)
+71    }
+72
+73    /// Returns first instruction of a block if exists.
+74    ///
+75    /// # Panics
+76    /// Panics if `block` is not inserted yet.
+77    pub fn first_inst(&self, block: BasicBlockId) -> Option<InstId> {
+78        self.blocks[&block].first_inst
+79    }
+80
+81    /// Returns a terminator instruction of a block.
+82    ///
+83    /// # Panics
+84    /// Panics if
+85    /// 1. `block` is not inserted yet.
+86    pub fn terminator(&self, store: &BodyDataStore, block: BasicBlockId) -> Option<InstId> {
+87        let last_inst = self.last_inst(block)?;
+88        if store.is_terminator(last_inst) {
+89            Some(last_inst)
+90        } else {
+91            None
+92        }
+93    }
+94
+95    /// Returns `true` if a `block` is terminated.
+96    pub fn is_terminated(&self, store: &BodyDataStore, block: BasicBlockId) -> bool {
+97        self.terminator(store, block).is_some()
+98    }
+99
+100    /// Returns a last instruction of a block.
+101    ///
+102    /// # Panics
+103    /// Panics if `block` is not inserted yet.
+104    pub fn last_inst(&self, block: BasicBlockId) -> Option<InstId> {
+105        self.blocks[&block].last_inst
+106    }
+107
+108    /// Returns a previous instruction of a given `inst`.
+109    ///
+110    /// # Panics
+111    /// Panics if `inst` is not inserted yet.
+112    pub fn prev_inst(&self, inst: InstId) -> Option<InstId> {
+113        self.insts[&inst].prev
+114    }
+115
+116    /// Returns a next instruction of a given `inst`.
+117    ///
+118    /// # Panics
+119    /// Panics if `inst` is not inserted yet.
+120    pub fn next_inst(&self, inst: InstId) -> Option<InstId> {
+121        self.insts[&inst].next
+122    }
+123
+124    /// Returns a block to which a given `inst` belongs.
+125    ///
+126    /// # Panics
+127    /// Panics if `inst` is not inserted yet.
+128    pub fn inst_block(&self, inst: InstId) -> BasicBlockId {
+129        self.insts[&inst].block
+130    }
+131
+132    /// Returns an iterator which iterates all basic blocks in a function body
+133    /// in pre-order.
+134    pub fn iter_block(&self) -> impl Iterator<Item = BasicBlockId> + '_ {
+135        BlockIter {
+136            next: Some(self.entry_block),
+137            blocks: &self.blocks,
+138        }
+139    }
+140
+141    /// Returns an iterator which iterates all instruction in a given `block` in
+142    /// pre-order.
+143    ///
+144    /// # Panics
+145    /// Panics if `block` is not inserted yet.
+146    pub fn iter_inst(&self, block: BasicBlockId) -> impl Iterator<Item = InstId> + '_ {
+147        InstIter {
+148            next: self.blocks[&block].first_inst,
+149            insts: &self.insts,
+150        }
+151    }
+152
+153    /// Appends a given `block` to a function body.
+154    ///
+155    /// # Panics
+156    /// Panics if a given `block` is already inserted to a function.
+157    pub fn append_block(&mut self, block: BasicBlockId) {
+158        debug_assert!(!self.is_block_inserted(block));
+159
+160        let mut block_node = BlockNode::default();
+161        let last_block = self.last_block;
+162        let last_block_node = &mut self.block_mut(last_block);
+163        last_block_node.next = Some(block);
+164        block_node.prev = Some(last_block);
+165
+166        self.blocks.insert(block, block_node);
+167        self.last_block = block;
+168    }
+169
+170    /// Inserts a given `block` before a `before` block.
+171    ///
+172    /// # Panics
+173    /// Panics if
+174    /// 1. a given `block` is already inserted.
+175    /// 2. a given `before` block is NOTE inserted yet.
+176    pub fn insert_block_before_block(&mut self, block: BasicBlockId, before: BasicBlockId) {
+177        debug_assert!(self.is_block_inserted(before));
+178        debug_assert!(!self.is_block_inserted(block));
+179
+180        let mut block_node = BlockNode::default();
+181
+182        match self.blocks[&before].prev {
+183            Some(prev) => {
+184                block_node.prev = Some(prev);
+185                self.block_mut(prev).next = Some(block);
+186            }
+187            None => self.entry_block = block,
+188        }
+189
+190        block_node.next = Some(before);
+191        self.block_mut(before).prev = Some(block);
+192        self.blocks.insert(block, block_node);
+193    }
+194
+195    /// Inserts a given `block` after a `after` block.
+196    ///
+197    /// # Panics
+198    /// Panics if
+199    /// 1. a given `block` is already inserted.
+200    /// 2. a given `after` block is NOTE inserted yet.
+201    pub fn insert_block_after_block(&mut self, block: BasicBlockId, after: BasicBlockId) {
+202        debug_assert!(self.is_block_inserted(after));
+203        debug_assert!(!self.is_block_inserted(block));
+204
+205        let mut block_node = BlockNode::default();
+206
+207        match self.blocks[&after].next {
+208            Some(next) => {
+209                block_node.next = Some(next);
+210                self.block_mut(next).prev = Some(block);
+211            }
+212            None => self.last_block = block,
+213        }
+214        block_node.prev = Some(after);
+215        self.block_mut(after).next = Some(block);
+216        self.blocks.insert(block, block_node);
+217    }
+218
+219    /// Remove a given `block` from a function. All instructions in a block are
+220    /// also removed.
+221    ///
+222    /// # Panics
+223    /// Panics if
+224    /// 1. a given `block` is NOT inserted.
+225    /// 2. a `block` is the last one block in a function.
+226    pub fn remove_block(&mut self, block: BasicBlockId) {
+227        debug_assert!(self.is_block_inserted(block));
+228        debug_assert!(self.block_num() > 1);
+229
+230        // Remove all insts in a `block`.
+231        let mut next_inst = self.first_inst(block);
+232        while let Some(inst) = next_inst {
+233            next_inst = self.next_inst(inst);
+234            self.remove_inst(inst);
+235        }
+236
+237        // Remove `block`.
+238        let block_node = &self.blocks[&block];
+239        let prev_block = block_node.prev;
+240        let next_block = block_node.next;
+241        match (prev_block, next_block) {
+242            // `block` is in the middle of a function.
+243            (Some(prev), Some(next)) => {
+244                self.block_mut(prev).next = Some(next);
+245                self.block_mut(next).prev = Some(prev);
+246            }
+247            // `block` is the last block of a function.
+248            (Some(prev), None) => {
+249                self.block_mut(prev).next = None;
+250                self.last_block = prev;
+251            }
+252            // `block` is the first block of a function.
+253            (None, Some(next)) => {
+254                self.block_mut(next).prev = None;
+255                self.entry_block = next
+256            }
+257            (None, None) => {
+258                unreachable!()
+259            }
+260        }
+261
+262        self.blocks.remove(&block);
+263    }
+264
+265    /// Appends `inst` to the end of a `block`
+266    ///
+267    /// # Panics
+268    /// Panics if
+269    /// 1. a given `block` is NOT inserted.
+270    /// 2. a given `inst` is already inserted.
+271    pub fn append_inst(&mut self, inst: InstId, block: BasicBlockId) {
+272        debug_assert!(self.is_block_inserted(block));
+273        debug_assert!(!self.is_inst_inserted(inst));
+274
+275        let mut inst_node = InstNode::new(block);
+276
+277        if let Some(last_inst) = self.blocks[&block].last_inst {
+278            inst_node.prev = Some(last_inst);
+279            self.inst_mut(last_inst).next = Some(inst);
+280        } else {
+281            self.block_mut(block).first_inst = Some(inst);
+282        }
+283
+284        self.block_mut(block).last_inst = Some(inst);
+285        self.insts.insert(inst, inst_node);
+286    }
+287
+288    /// Prepends `inst` to the beginning of a `block`
+289    ///
+290    /// # Panics
+291    /// Panics if
+292    /// 1. a given `block` is NOT inserted.
+293    /// 2. a given `inst` is already inserted.
+294    pub fn prepend_inst(&mut self, inst: InstId, block: BasicBlockId) {
+295        debug_assert!(self.is_block_inserted(block));
+296        debug_assert!(!self.is_inst_inserted(inst));
+297
+298        let mut inst_node = InstNode::new(block);
+299
+300        if let Some(first_inst) = self.blocks[&block].first_inst {
+301            inst_node.next = Some(first_inst);
+302            self.inst_mut(first_inst).prev = Some(inst);
+303        } else {
+304            self.block_mut(block).last_inst = Some(inst);
+305        }
+306
+307        self.block_mut(block).first_inst = Some(inst);
+308        self.insts.insert(inst, inst_node);
+309    }
+310
+311    /// Insert `inst` before `before` inst.
+312    ///
+313    /// # Panics
+314    /// Panics if
+315    /// 1. a given `before` is NOT inserted.
+316    /// 2. a given `inst` is already inserted.
+317    pub fn insert_inst_before_inst(&mut self, inst: InstId, before: InstId) {
+318        debug_assert!(self.is_inst_inserted(before));
+319        debug_assert!(!self.is_inst_inserted(inst));
+320
+321        let before_inst_node = &self.insts[&before];
+322        let block = before_inst_node.block;
+323        let mut inst_node = InstNode::new(block);
+324
+325        match before_inst_node.prev {
+326            Some(prev) => {
+327                inst_node.prev = Some(prev);
+328                self.inst_mut(prev).next = Some(inst);
+329            }
+330            None => self.block_mut(block).first_inst = Some(inst),
+331        }
+332        inst_node.next = Some(before);
+333        self.inst_mut(before).prev = Some(inst);
+334        self.insts.insert(inst, inst_node);
+335    }
+336
+337    /// Insert `inst` after `after` inst.
+338    ///
+339    /// # Panics
+340    /// Panics if
+341    /// 1. a given `after` is NOT inserted.
+342    /// 2. a given `inst` is already inserted.
+343    pub fn insert_inst_after(&mut self, inst: InstId, after: InstId) {
+344        debug_assert!(self.is_inst_inserted(after));
+345        debug_assert!(!self.is_inst_inserted(inst));
+346
+347        let after_inst_node = &self.insts[&after];
+348        let block = after_inst_node.block;
+349        let mut inst_node = InstNode::new(block);
+350
+351        match after_inst_node.next {
+352            Some(next) => {
+353                inst_node.next = Some(next);
+354                self.inst_mut(next).prev = Some(inst);
+355            }
+356            None => self.block_mut(block).last_inst = Some(inst),
+357        }
+358        inst_node.prev = Some(after);
+359        self.inst_mut(after).next = Some(inst);
+360        self.insts.insert(inst, inst_node);
+361    }
+362
+363    /// Remove instruction from the function body.
+364    ///
+365    /// # Panics
+366    /// Panics if a given `inst` is not inserted.
+367    pub fn remove_inst(&mut self, inst: InstId) {
+368        debug_assert!(self.is_inst_inserted(inst));
+369
+370        let inst_node = &self.insts[&inst];
+371        let inst_block = inst_node.block;
+372        let prev_inst = inst_node.prev;
+373        let next_inst = inst_node.next;
+374        match (prev_inst, next_inst) {
+375            (Some(prev), Some(next)) => {
+376                self.inst_mut(prev).next = Some(next);
+377                self.inst_mut(next).prev = Some(prev);
+378            }
+379            (Some(prev), None) => {
+380                self.inst_mut(prev).next = None;
+381                self.block_mut(inst_block).last_inst = Some(prev);
+382            }
+383            (None, Some(next)) => {
+384                self.inst_mut(next).prev = None;
+385                self.block_mut(inst_block).first_inst = Some(next);
+386            }
+387            (None, None) => {
+388                let block_node = self.block_mut(inst_block);
+389                block_node.first_inst = None;
+390                block_node.last_inst = None;
+391            }
+392        }
+393
+394        self.insts.remove(&inst);
+395    }
+396
+397    fn block_mut(&mut self, block: BasicBlockId) -> &mut BlockNode {
+398        self.blocks.get_mut(&block).unwrap()
+399    }
+400
+401    fn inst_mut(&mut self, inst: InstId) -> &mut InstNode {
+402        self.insts.get_mut(&inst).unwrap()
+403    }
+404}
+405
+406struct BlockIter<'a> {
+407    next: Option<BasicBlockId>,
+408    blocks: &'a FxHashMap<BasicBlockId, BlockNode>,
+409}
+410
+411impl<'a> Iterator for BlockIter<'a> {
+412    type Item = BasicBlockId;
+413
+414    fn next(&mut self) -> Option<BasicBlockId> {
+415        let next = self.next?;
+416        self.next = self.blocks[&next].next;
+417        Some(next)
+418    }
+419}
+420
+421struct InstIter<'a> {
+422    next: Option<InstId>,
+423    insts: &'a FxHashMap<InstId, InstNode>,
+424}
+425
+426impl<'a> Iterator for InstIter<'a> {
+427    type Item = InstId;
+428
+429    fn next(&mut self) -> Option<InstId> {
+430        let next = self.next?;
+431        self.next = self.insts[&next].next;
+432        Some(next)
+433    }
+434}
+435
+436#[derive(Default, Debug, Clone, PartialEq, Eq)]
+437/// A helper struct to track a basic block order in a function body.
+438struct BlockNode {
+439    /// A previous block.
+440    prev: Option<BasicBlockId>,
+441
+442    /// A next block.
+443    next: Option<BasicBlockId>,
+444
+445    /// A first instruction of a block.
+446    first_inst: Option<InstId>,
+447
+448    /// A last instruction of a block.
+449    last_inst: Option<InstId>,
+450}
+451
+452#[derive(Debug, Clone, PartialEq, Eq)]
+453/// A helper struct to track a instruction order in a basic block.
+454struct InstNode {
+455    /// An block to which a inst belongs.
+456    block: BasicBlockId,
+457
+458    /// A previous instruction.
+459    prev: Option<InstId>,
+460
+461    /// A next instruction.
+462    next: Option<InstId>,
+463}
+464
+465impl InstNode {
+466    fn new(block: BasicBlockId) -> Self {
+467        Self {
+468            block,
+469            prev: None,
+470            next: None,
+471        }
+472    }
+473}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/constant.rs.html b/compiler-docs/src/fe_mir/ir/constant.rs.html new file mode 100644 index 0000000000..5af6083245 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/constant.rs.html @@ -0,0 +1,47 @@ +constant.rs - source

fe_mir/ir/
constant.rs

1use fe_common::impl_intern_key;
+2use num_bigint::BigInt;
+3use smol_str::SmolStr;
+4
+5use fe_analyzer::{context, namespace::items as analyzer_items};
+6
+7use super::{SourceInfo, TypeId};
+8
+9#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+10pub struct Constant {
+11    /// A name of a constant.
+12    pub name: SmolStr,
+13
+14    /// A value of a constant.
+15    pub value: ConstantValue,
+16
+17    /// A type of a constant.
+18    pub ty: TypeId,
+19
+20    /// A module where a constant is declared.
+21    pub module_id: analyzer_items::ModuleId,
+22
+23    /// A span where a constant is declared.
+24    pub source: SourceInfo,
+25}
+26
+27/// An interned Id for [`Constant`].
+28#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+29pub struct ConstantId(pub(crate) u32);
+30impl_intern_key!(ConstantId);
+31
+32#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+33pub enum ConstantValue {
+34    Immediate(BigInt),
+35    Str(SmolStr),
+36    Bool(bool),
+37}
+38
+39impl From<context::Constant> for ConstantValue {
+40    fn from(value: context::Constant) -> Self {
+41        match value {
+42            context::Constant::Int(num) | context::Constant::Address(num) => Self::Immediate(num),
+43            context::Constant::Str(s) => Self::Str(s),
+44            context::Constant::Bool(b) => Self::Bool(b),
+45        }
+46    }
+47}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/function.rs.html b/compiler-docs/src/fe_mir/ir/function.rs.html new file mode 100644 index 0000000000..79512819ed --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/function.rs.html @@ -0,0 +1,275 @@ +function.rs - source

fe_mir/ir/
function.rs

1use fe_analyzer::namespace::items as analyzer_items;
+2use fe_analyzer::namespace::types as analyzer_types;
+3use fe_common::impl_intern_key;
+4use fxhash::FxHashMap;
+5use id_arena::Arena;
+6use num_bigint::BigInt;
+7use smol_str::SmolStr;
+8use std::collections::BTreeMap;
+9
+10use super::{
+11    basic_block::BasicBlock,
+12    body_order::BodyOrder,
+13    inst::{BranchInfo, Inst, InstId, InstKind},
+14    types::TypeId,
+15    value::{AssignableValue, Local, Value, ValueId},
+16    BasicBlockId, SourceInfo,
+17};
+18
+19/// Represents function signature.
+20#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+21pub struct FunctionSignature {
+22    pub params: Vec<FunctionParam>,
+23    pub resolved_generics: BTreeMap<SmolStr, analyzer_types::TypeId>,
+24    pub return_type: Option<TypeId>,
+25    pub module_id: analyzer_items::ModuleId,
+26    pub analyzer_func_id: analyzer_items::FunctionId,
+27    pub linkage: Linkage,
+28}
+29
+30#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+31pub struct FunctionParam {
+32    pub name: SmolStr,
+33    pub ty: TypeId,
+34    pub source: SourceInfo,
+35}
+36
+37#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+38pub struct FunctionId(pub u32);
+39impl_intern_key!(FunctionId);
+40
+41#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+42pub enum Linkage {
+43    /// A function can only be called within the same module.
+44    Private,
+45
+46    /// A function can be called from other modules, but can NOT be called from
+47    /// other accounts and transactions.
+48    Public,
+49
+50    /// A function can be called from other modules, and also can be called from
+51    /// other accounts and transactions.
+52    Export,
+53}
+54
+55impl Linkage {
+56    pub fn is_exported(self) -> bool {
+57        self == Linkage::Export
+58    }
+59}
+60
+61/// A function body, which is not stored in salsa db to enable in-place
+62/// transformation.
+63#[derive(Debug, Clone, PartialEq, Eq)]
+64pub struct FunctionBody {
+65    pub fid: FunctionId,
+66
+67    pub store: BodyDataStore,
+68
+69    /// Tracks order of basic blocks and instructions in a function body.
+70    pub order: BodyOrder,
+71
+72    pub source: SourceInfo,
+73}
+74
+75impl FunctionBody {
+76    pub fn new(fid: FunctionId, source: SourceInfo) -> Self {
+77        let mut store = BodyDataStore::default();
+78        let entry_bb = store.store_block(BasicBlock {});
+79        Self {
+80            fid,
+81            store,
+82            order: BodyOrder::new(entry_bb),
+83            source,
+84        }
+85    }
+86}
+87
+88/// A collection of basic block, instructions and values appear in a function
+89/// body.
+90#[derive(Default, Debug, Clone, PartialEq, Eq)]
+91pub struct BodyDataStore {
+92    /// Instructions appear in a function body.
+93    insts: Arena<Inst>,
+94
+95    /// All values in a function.
+96    values: Arena<Value>,
+97
+98    blocks: Arena<BasicBlock>,
+99
+100    /// Maps an immediate to a value to ensure the same immediate results in the
+101    /// same value.
+102    immediates: FxHashMap<(BigInt, TypeId), ValueId>,
+103
+104    unit_value: Option<ValueId>,
+105
+106    /// Maps an instruction to a value.
+107    inst_results: FxHashMap<InstId, AssignableValue>,
+108
+109    /// All declared local variables in a function.
+110    locals: Vec<ValueId>,
+111}
+112
+113impl BodyDataStore {
+114    pub fn store_inst(&mut self, inst: Inst) -> InstId {
+115        self.insts.alloc(inst)
+116    }
+117
+118    pub fn inst_data(&self, inst: InstId) -> &Inst {
+119        &self.insts[inst]
+120    }
+121
+122    pub fn inst_data_mut(&mut self, inst: InstId) -> &mut Inst {
+123        &mut self.insts[inst]
+124    }
+125
+126    pub fn replace_inst(&mut self, inst: InstId, new: Inst) -> Inst {
+127        let old = &mut self.insts[inst];
+128        std::mem::replace(old, new)
+129    }
+130
+131    pub fn store_value(&mut self, value: Value) -> ValueId {
+132        match value {
+133            Value::Immediate { imm, ty } => self.store_immediate(imm, ty),
+134
+135            Value::Unit { .. } => {
+136                if let Some(unit_value) = self.unit_value {
+137                    unit_value
+138                } else {
+139                    let unit_value = self.values.alloc(value);
+140                    self.unit_value = Some(unit_value);
+141                    unit_value
+142                }
+143            }
+144
+145            Value::Local(ref local) => {
+146                let is_user_defined = !local.is_tmp;
+147                let value_id = self.values.alloc(value);
+148                if is_user_defined {
+149                    self.locals.push(value_id);
+150                }
+151                value_id
+152            }
+153
+154            _ => self.values.alloc(value),
+155        }
+156    }
+157
+158    pub fn is_nop(&self, inst: InstId) -> bool {
+159        matches!(&self.inst_data(inst).kind, InstKind::Nop)
+160    }
+161
+162    pub fn is_terminator(&self, inst: InstId) -> bool {
+163        self.inst_data(inst).is_terminator()
+164    }
+165
+166    pub fn branch_info(&self, inst: InstId) -> BranchInfo {
+167        self.inst_data(inst).branch_info()
+168    }
+169
+170    pub fn value_data(&self, value: ValueId) -> &Value {
+171        &self.values[value]
+172    }
+173
+174    pub fn value_data_mut(&mut self, value: ValueId) -> &mut Value {
+175        &mut self.values[value]
+176    }
+177
+178    pub fn values(&self) -> impl Iterator<Item = &Value> {
+179        self.values.iter().map(|(_, value_data)| value_data)
+180    }
+181
+182    pub fn values_mut(&mut self) -> impl Iterator<Item = &mut Value> {
+183        self.values.iter_mut().map(|(_, value_data)| value_data)
+184    }
+185
+186    pub fn store_block(&mut self, block: BasicBlock) -> BasicBlockId {
+187        self.blocks.alloc(block)
+188    }
+189
+190    /// Returns an instruction result
+191    pub fn inst_result(&self, inst: InstId) -> Option<&AssignableValue> {
+192        self.inst_results.get(&inst)
+193    }
+194
+195    pub fn map_result(&mut self, inst: InstId, result: AssignableValue) {
+196        self.inst_results.insert(inst, result);
+197    }
+198
+199    pub fn remove_inst_result(&mut self, inst: InstId) -> Option<AssignableValue> {
+200        self.inst_results.remove(&inst)
+201    }
+202
+203    pub fn rewrite_branch_dest(&mut self, inst: InstId, from: BasicBlockId, to: BasicBlockId) {
+204        match &mut self.inst_data_mut(inst).kind {
+205            InstKind::Jump { dest } => {
+206                if *dest == from {
+207                    *dest = to;
+208                }
+209            }
+210            InstKind::Branch { then, else_, .. } => {
+211                if *then == from {
+212                    *then = to;
+213                }
+214                if *else_ == from {
+215                    *else_ = to;
+216                }
+217            }
+218            _ => unreachable!("inst is not a branch"),
+219        }
+220    }
+221
+222    pub fn value_ty(&self, vid: ValueId) -> TypeId {
+223        self.values[vid].ty()
+224    }
+225
+226    pub fn locals(&self) -> &[ValueId] {
+227        &self.locals
+228    }
+229
+230    pub fn locals_mut(&mut self) -> &[ValueId] {
+231        &mut self.locals
+232    }
+233
+234    pub fn func_args(&self) -> impl Iterator<Item = ValueId> + '_ {
+235        self.locals()
+236            .iter()
+237            .filter(|value| match self.value_data(**value) {
+238                Value::Local(local) => local.is_arg,
+239                _ => unreachable!(),
+240            })
+241            .copied()
+242    }
+243
+244    pub fn func_args_mut(&mut self) -> impl Iterator<Item = &mut Value> {
+245        self.values_mut().filter(|value| match value {
+246            Value::Local(local) => local.is_arg,
+247            _ => false,
+248        })
+249    }
+250
+251    /// Returns Some(`local_name`) if value is `Value::Local`.
+252    pub fn local_name(&self, value: ValueId) -> Option<&str> {
+253        match self.value_data(value) {
+254            Value::Local(Local { name, .. }) => Some(name),
+255            _ => None,
+256        }
+257    }
+258
+259    pub fn replace_value(&mut self, value: ValueId, to: Value) -> Value {
+260        std::mem::replace(&mut self.values[value], to)
+261    }
+262
+263    fn store_immediate(&mut self, imm: BigInt, ty: TypeId) -> ValueId {
+264        if let Some(value) = self.immediates.get(&(imm.clone(), ty)) {
+265            *value
+266        } else {
+267            let id = self.values.alloc(Value::Immediate {
+268                imm: imm.clone(),
+269                ty,
+270            });
+271            self.immediates.insert((imm, ty), id);
+272            id
+273        }
+274    }
+275}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/inst.rs.html b/compiler-docs/src/fe_mir/ir/inst.rs.html new file mode 100644 index 0000000000..679a51b19e --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/inst.rs.html @@ -0,0 +1,764 @@ +inst.rs - source

fe_mir/ir/
inst.rs

1use std::fmt;
+2
+3use fe_analyzer::namespace::items::ContractId;
+4use id_arena::Id;
+5
+6use super::{basic_block::BasicBlockId, function::FunctionId, value::ValueId, SourceInfo, TypeId};
+7
+8pub type InstId = Id<Inst>;
+9
+10#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+11pub struct Inst {
+12    pub kind: InstKind,
+13    pub source: SourceInfo,
+14}
+15
+16#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+17pub enum InstKind {
+18    /// This is not a real instruction, just used to tag a position where a
+19    /// local is declared.
+20    Declare {
+21        local: ValueId,
+22    },
+23
+24    /// Unary instruction.
+25    Unary {
+26        op: UnOp,
+27        value: ValueId,
+28    },
+29
+30    /// Binary instruction.
+31    Binary {
+32        op: BinOp,
+33        lhs: ValueId,
+34        rhs: ValueId,
+35    },
+36
+37    Cast {
+38        kind: CastKind,
+39        value: ValueId,
+40        to: TypeId,
+41    },
+42
+43    /// Constructs aggregate value, i.e. struct, tuple and array.
+44    AggregateConstruct {
+45        ty: TypeId,
+46        args: Vec<ValueId>,
+47    },
+48
+49    Bind {
+50        src: ValueId,
+51    },
+52
+53    MemCopy {
+54        src: ValueId,
+55    },
+56
+57    /// Load a primitive value from a ptr
+58    Load {
+59        src: ValueId,
+60    },
+61
+62    /// Access to aggregate fields or elements.
+63    /// # Example
+64    ///
+65    /// ```fe
+66    /// struct Foo:
+67    ///     x: i32
+68    ///     y: Array<i32, 8>
+69    /// ```
+70    /// `foo.y` is lowered into `AggregateAccess(foo, [1])' for example.
+71    AggregateAccess {
+72        value: ValueId,
+73        indices: Vec<ValueId>,
+74    },
+75
+76    MapAccess {
+77        key: ValueId,
+78        value: ValueId,
+79    },
+80
+81    Call {
+82        func: FunctionId,
+83        args: Vec<ValueId>,
+84        call_type: CallType,
+85    },
+86
+87    /// Unconditional jump instruction.
+88    Jump {
+89        dest: BasicBlockId,
+90    },
+91
+92    /// Conditional branching instruction.
+93    Branch {
+94        cond: ValueId,
+95        then: BasicBlockId,
+96        else_: BasicBlockId,
+97    },
+98
+99    Switch {
+100        disc: ValueId,
+101        table: SwitchTable,
+102        default: Option<BasicBlockId>,
+103    },
+104
+105    Revert {
+106        arg: Option<ValueId>,
+107    },
+108
+109    Emit {
+110        arg: ValueId,
+111    },
+112
+113    Return {
+114        arg: Option<ValueId>,
+115    },
+116
+117    Keccak256 {
+118        arg: ValueId,
+119    },
+120
+121    AbiEncode {
+122        arg: ValueId,
+123    },
+124
+125    Nop,
+126
+127    Create {
+128        value: ValueId,
+129        contract: ContractId,
+130    },
+131
+132    Create2 {
+133        value: ValueId,
+134        salt: ValueId,
+135        contract: ContractId,
+136    },
+137
+138    YulIntrinsic {
+139        op: YulIntrinsicOp,
+140        args: Vec<ValueId>,
+141    },
+142}
+143
+144#[derive(Debug, Clone, Default, PartialEq, Eq, Hash)]
+145pub struct SwitchTable {
+146    values: Vec<ValueId>,
+147    blocks: Vec<BasicBlockId>,
+148}
+149
+150impl SwitchTable {
+151    pub fn iter(&self) -> impl Iterator<Item = (ValueId, BasicBlockId)> + '_ {
+152        self.values.iter().copied().zip(self.blocks.iter().copied())
+153    }
+154
+155    pub fn len(&self) -> usize {
+156        debug_assert!(self.values.len() == self.blocks.len());
+157        self.values.len()
+158    }
+159
+160    pub fn is_empty(&self) -> bool {
+161        debug_assert!(self.values.len() == self.blocks.len());
+162        self.values.is_empty()
+163    }
+164
+165    pub fn add_arm(&mut self, value: ValueId, block: BasicBlockId) {
+166        self.values.push(value);
+167        self.blocks.push(block);
+168    }
+169}
+170
+171impl Inst {
+172    pub fn new(kind: InstKind, source: SourceInfo) -> Self {
+173        Self { kind, source }
+174    }
+175
+176    pub fn unary(op: UnOp, value: ValueId, source: SourceInfo) -> Self {
+177        let kind = InstKind::Unary { op, value };
+178        Self::new(kind, source)
+179    }
+180
+181    pub fn binary(op: BinOp, lhs: ValueId, rhs: ValueId, source: SourceInfo) -> Self {
+182        let kind = InstKind::Binary { op, lhs, rhs };
+183        Self::new(kind, source)
+184    }
+185
+186    pub fn intrinsic(op: YulIntrinsicOp, args: Vec<ValueId>, source: SourceInfo) -> Self {
+187        let kind = InstKind::YulIntrinsic { op, args };
+188        Self::new(kind, source)
+189    }
+190
+191    pub fn nop() -> Self {
+192        Self {
+193            kind: InstKind::Nop,
+194            source: SourceInfo::dummy(),
+195        }
+196    }
+197
+198    pub fn is_terminator(&self) -> bool {
+199        match self.kind {
+200            InstKind::Jump { .. }
+201            | InstKind::Branch { .. }
+202            | InstKind::Switch { .. }
+203            | InstKind::Revert { .. }
+204            | InstKind::Return { .. } => true,
+205            InstKind::YulIntrinsic { op, .. } => op.is_terminator(),
+206            _ => false,
+207        }
+208    }
+209
+210    pub fn branch_info(&self) -> BranchInfo {
+211        match self.kind {
+212            InstKind::Jump { dest } => BranchInfo::Jump(dest),
+213            InstKind::Branch { cond, then, else_ } => BranchInfo::Branch(cond, then, else_),
+214            InstKind::Switch {
+215                disc,
+216                ref table,
+217                default,
+218            } => BranchInfo::Switch(disc, table, default),
+219            _ => BranchInfo::NotBranch,
+220        }
+221    }
+222
+223    pub fn args(&self) -> ValueIter {
+224        use InstKind::*;
+225        match &self.kind {
+226            Declare { local: arg }
+227            | Bind { src: arg }
+228            | MemCopy { src: arg }
+229            | Load { src: arg }
+230            | Unary { value: arg, .. }
+231            | Cast { value: arg, .. }
+232            | Emit { arg }
+233            | Keccak256 { arg }
+234            | AbiEncode { arg }
+235            | Create { value: arg, .. }
+236            | Branch { cond: arg, .. } => ValueIter::one(*arg),
+237
+238            Switch { disc, table, .. } => {
+239                ValueIter::one(*disc).chain(ValueIter::Slice(table.values.iter()))
+240            }
+241
+242            Binary { lhs, rhs, .. }
+243            | MapAccess {
+244                value: lhs,
+245                key: rhs,
+246            }
+247            | Create2 {
+248                value: lhs,
+249                salt: rhs,
+250                ..
+251            } => ValueIter::one(*lhs).chain(ValueIter::one(*rhs)),
+252
+253            Revert { arg } | Return { arg } => ValueIter::One(*arg),
+254
+255            Nop | Jump { .. } => ValueIter::Zero,
+256
+257            AggregateAccess { value, indices } => {
+258                ValueIter::one(*value).chain(ValueIter::Slice(indices.iter()))
+259            }
+260
+261            AggregateConstruct { args, .. } | Call { args, .. } | YulIntrinsic { args, .. } => {
+262                ValueIter::Slice(args.iter())
+263            }
+264        }
+265    }
+266
+267    pub fn args_mut(&mut self) -> ValueIterMut {
+268        use InstKind::*;
+269        match &mut self.kind {
+270            Declare { local: arg }
+271            | Bind { src: arg }
+272            | MemCopy { src: arg }
+273            | Load { src: arg }
+274            | Unary { value: arg, .. }
+275            | Cast { value: arg, .. }
+276            | Emit { arg }
+277            | Keccak256 { arg }
+278            | AbiEncode { arg }
+279            | Create { value: arg, .. }
+280            | Branch { cond: arg, .. } => ValueIterMut::one(arg),
+281
+282            Switch { disc, table, .. } => {
+283                ValueIterMut::one(disc).chain(ValueIterMut::Slice(table.values.iter_mut()))
+284            }
+285
+286            Binary { lhs, rhs, .. }
+287            | MapAccess {
+288                value: lhs,
+289                key: rhs,
+290            }
+291            | Create2 {
+292                value: lhs,
+293                salt: rhs,
+294                ..
+295            } => ValueIterMut::one(lhs).chain(ValueIterMut::one(rhs)),
+296
+297            Revert { arg } | Return { arg } => ValueIterMut::One(arg.as_mut()),
+298
+299            Nop | Jump { .. } => ValueIterMut::Zero,
+300
+301            AggregateAccess { value, indices } => {
+302                ValueIterMut::one(value).chain(ValueIterMut::Slice(indices.iter_mut()))
+303            }
+304
+305            AggregateConstruct { args, .. } | Call { args, .. } | YulIntrinsic { args, .. } => {
+306                ValueIterMut::Slice(args.iter_mut())
+307            }
+308        }
+309    }
+310}
+311
+312#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+313pub enum UnOp {
+314    /// `not` operator for logical inversion.
+315    Not,
+316    /// `-` operator for negation.
+317    Neg,
+318    /// `~` operator for bitwise inversion.
+319    Inv,
+320}
+321
+322impl fmt::Display for UnOp {
+323    fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result {
+324        match self {
+325            Self::Not => write!(w, "not"),
+326            Self::Neg => write!(w, "-"),
+327            Self::Inv => write!(w, "~"),
+328        }
+329    }
+330}
+331
+332#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+333pub enum BinOp {
+334    Add,
+335    Sub,
+336    Mul,
+337    Div,
+338    Mod,
+339    Pow,
+340    Shl,
+341    Shr,
+342    BitOr,
+343    BitXor,
+344    BitAnd,
+345    LogicalAnd,
+346    LogicalOr,
+347    Eq,
+348    Ne,
+349    Ge,
+350    Gt,
+351    Le,
+352    Lt,
+353}
+354
+355impl fmt::Display for BinOp {
+356    fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result {
+357        match self {
+358            Self::Add => write!(w, "+"),
+359            Self::Sub => write!(w, "-"),
+360            Self::Mul => write!(w, "*"),
+361            Self::Div => write!(w, "/"),
+362            Self::Mod => write!(w, "%"),
+363            Self::Pow => write!(w, "**"),
+364            Self::Shl => write!(w, "<<"),
+365            Self::Shr => write!(w, ">>"),
+366            Self::BitOr => write!(w, "|"),
+367            Self::BitXor => write!(w, "^"),
+368            Self::BitAnd => write!(w, "&"),
+369            Self::LogicalAnd => write!(w, "and"),
+370            Self::LogicalOr => write!(w, "or"),
+371            Self::Eq => write!(w, "=="),
+372            Self::Ne => write!(w, "!="),
+373            Self::Ge => write!(w, ">="),
+374            Self::Gt => write!(w, ">"),
+375            Self::Le => write!(w, "<="),
+376            Self::Lt => write!(w, "<"),
+377        }
+378    }
+379}
+380
+381#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+382pub enum CallType {
+383    Internal,
+384    External,
+385}
+386
+387impl fmt::Display for CallType {
+388    fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result {
+389        match self {
+390            Self::Internal => write!(w, "internal"),
+391            Self::External => write!(w, "external"),
+392        }
+393    }
+394}
+395
+396#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+397pub enum CastKind {
+398    /// A cast from a primitive type to a primitive type.
+399    Primitive,
+400
+401    /// A cast from an enum type to its underlying type.
+402    Untag,
+403}
+404
+405// TODO: We don't need all yul intrinsics.
+406#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+407pub enum YulIntrinsicOp {
+408    Stop,
+409    Add,
+410    Sub,
+411    Mul,
+412    Div,
+413    Sdiv,
+414    Mod,
+415    Smod,
+416    Exp,
+417    Not,
+418    Lt,
+419    Gt,
+420    Slt,
+421    Sgt,
+422    Eq,
+423    Iszero,
+424    And,
+425    Or,
+426    Xor,
+427    Byte,
+428    Shl,
+429    Shr,
+430    Sar,
+431    Addmod,
+432    Mulmod,
+433    Signextend,
+434    Keccak256,
+435    Pc,
+436    Pop,
+437    Mload,
+438    Mstore,
+439    Mstore8,
+440    Sload,
+441    Sstore,
+442    Msize,
+443    Gas,
+444    Address,
+445    Balance,
+446    Selfbalance,
+447    Caller,
+448    Callvalue,
+449    Calldataload,
+450    Calldatasize,
+451    Calldatacopy,
+452    Codesize,
+453    Codecopy,
+454    Extcodesize,
+455    Extcodecopy,
+456    Returndatasize,
+457    Returndatacopy,
+458    Extcodehash,
+459    Create,
+460    Create2,
+461    Call,
+462    Callcode,
+463    Delegatecall,
+464    Staticcall,
+465    Return,
+466    Revert,
+467    Selfdestruct,
+468    Invalid,
+469    Log0,
+470    Log1,
+471    Log2,
+472    Log3,
+473    Log4,
+474    Chainid,
+475    Basefee,
+476    Origin,
+477    Gasprice,
+478    Blockhash,
+479    Coinbase,
+480    Timestamp,
+481    Number,
+482    Prevrandao,
+483    Gaslimit,
+484}
+485impl YulIntrinsicOp {
+486    pub fn is_terminator(self) -> bool {
+487        matches!(
+488            self,
+489            Self::Return | Self::Revert | Self::Selfdestruct | Self::Invalid
+490        )
+491    }
+492}
+493
+494impl fmt::Display for YulIntrinsicOp {
+495    fn fmt(&self, w: &mut fmt::Formatter) -> fmt::Result {
+496        let op = match self {
+497            Self::Stop => "__stop",
+498            Self::Add => "__add",
+499            Self::Sub => "__sub",
+500            Self::Mul => "__mul",
+501            Self::Div => "__div",
+502            Self::Sdiv => "__sdiv",
+503            Self::Mod => "__mod",
+504            Self::Smod => "__smod",
+505            Self::Exp => "__exp",
+506            Self::Not => "__not",
+507            Self::Lt => "__lt",
+508            Self::Gt => "__gt",
+509            Self::Slt => "__slt",
+510            Self::Sgt => "__sgt",
+511            Self::Eq => "__eq",
+512            Self::Iszero => "__iszero",
+513            Self::And => "__and",
+514            Self::Or => "__or",
+515            Self::Xor => "__xor",
+516            Self::Byte => "__byte",
+517            Self::Shl => "__shl",
+518            Self::Shr => "__shr",
+519            Self::Sar => "__sar",
+520            Self::Addmod => "__addmod",
+521            Self::Mulmod => "__mulmod",
+522            Self::Signextend => "__signextend",
+523            Self::Keccak256 => "__keccak256",
+524            Self::Pc => "__pc",
+525            Self::Pop => "__pop",
+526            Self::Mload => "__mload",
+527            Self::Mstore => "__mstore",
+528            Self::Mstore8 => "__mstore8",
+529            Self::Sload => "__sload",
+530            Self::Sstore => "__sstore",
+531            Self::Msize => "__msize",
+532            Self::Gas => "__gas",
+533            Self::Address => "__address",
+534            Self::Balance => "__balance",
+535            Self::Selfbalance => "__selfbalance",
+536            Self::Caller => "__caller",
+537            Self::Callvalue => "__callvalue",
+538            Self::Calldataload => "__calldataload",
+539            Self::Calldatasize => "__calldatasize",
+540            Self::Calldatacopy => "__calldatacopy",
+541            Self::Codesize => "__codesize",
+542            Self::Codecopy => "__codecopy",
+543            Self::Extcodesize => "__extcodesize",
+544            Self::Extcodecopy => "__extcodecopy",
+545            Self::Returndatasize => "__returndatasize",
+546            Self::Returndatacopy => "__returndatacopy",
+547            Self::Extcodehash => "__extcodehash",
+548            Self::Create => "__create",
+549            Self::Create2 => "__create2",
+550            Self::Call => "__call",
+551            Self::Callcode => "__callcode",
+552            Self::Delegatecall => "__delegatecall",
+553            Self::Staticcall => "__staticcall",
+554            Self::Return => "__return",
+555            Self::Revert => "__revert",
+556            Self::Selfdestruct => "__selfdestruct",
+557            Self::Invalid => "__invalid",
+558            Self::Log0 => "__log0",
+559            Self::Log1 => "__log1",
+560            Self::Log2 => "__log2",
+561            Self::Log3 => "__log3",
+562            Self::Log4 => "__log4",
+563            Self::Chainid => "__chainid",
+564            Self::Basefee => "__basefee",
+565            Self::Origin => "__origin",
+566            Self::Gasprice => "__gasprice",
+567            Self::Blockhash => "__blockhash",
+568            Self::Coinbase => "__coinbase",
+569            Self::Timestamp => "__timestamp",
+570            Self::Number => "__number",
+571            Self::Prevrandao => "__prevrandao",
+572            Self::Gaslimit => "__gaslimit",
+573        };
+574
+575        write!(w, "{op}")
+576    }
+577}
+578
+579impl From<fe_analyzer::builtins::Intrinsic> for YulIntrinsicOp {
+580    fn from(val: fe_analyzer::builtins::Intrinsic) -> Self {
+581        use fe_analyzer::builtins::Intrinsic;
+582        match val {
+583            Intrinsic::__stop => Self::Stop,
+584            Intrinsic::__add => Self::Add,
+585            Intrinsic::__sub => Self::Sub,
+586            Intrinsic::__mul => Self::Mul,
+587            Intrinsic::__div => Self::Div,
+588            Intrinsic::__sdiv => Self::Sdiv,
+589            Intrinsic::__mod => Self::Mod,
+590            Intrinsic::__smod => Self::Smod,
+591            Intrinsic::__exp => Self::Exp,
+592            Intrinsic::__not => Self::Not,
+593            Intrinsic::__lt => Self::Lt,
+594            Intrinsic::__gt => Self::Gt,
+595            Intrinsic::__slt => Self::Slt,
+596            Intrinsic::__sgt => Self::Sgt,
+597            Intrinsic::__eq => Self::Eq,
+598            Intrinsic::__iszero => Self::Iszero,
+599            Intrinsic::__and => Self::And,
+600            Intrinsic::__or => Self::Or,
+601            Intrinsic::__xor => Self::Xor,
+602            Intrinsic::__byte => Self::Byte,
+603            Intrinsic::__shl => Self::Shl,
+604            Intrinsic::__shr => Self::Shr,
+605            Intrinsic::__sar => Self::Sar,
+606            Intrinsic::__addmod => Self::Addmod,
+607            Intrinsic::__mulmod => Self::Mulmod,
+608            Intrinsic::__signextend => Self::Signextend,
+609            Intrinsic::__keccak256 => Self::Keccak256,
+610            Intrinsic::__pc => Self::Pc,
+611            Intrinsic::__pop => Self::Pop,
+612            Intrinsic::__mload => Self::Mload,
+613            Intrinsic::__mstore => Self::Mstore,
+614            Intrinsic::__mstore8 => Self::Mstore8,
+615            Intrinsic::__sload => Self::Sload,
+616            Intrinsic::__sstore => Self::Sstore,
+617            Intrinsic::__msize => Self::Msize,
+618            Intrinsic::__gas => Self::Gas,
+619            Intrinsic::__address => Self::Address,
+620            Intrinsic::__balance => Self::Balance,
+621            Intrinsic::__selfbalance => Self::Selfbalance,
+622            Intrinsic::__caller => Self::Caller,
+623            Intrinsic::__callvalue => Self::Callvalue,
+624            Intrinsic::__calldataload => Self::Calldataload,
+625            Intrinsic::__calldatasize => Self::Calldatasize,
+626            Intrinsic::__calldatacopy => Self::Calldatacopy,
+627            Intrinsic::__codesize => Self::Codesize,
+628            Intrinsic::__codecopy => Self::Codecopy,
+629            Intrinsic::__extcodesize => Self::Extcodesize,
+630            Intrinsic::__extcodecopy => Self::Extcodecopy,
+631            Intrinsic::__returndatasize => Self::Returndatasize,
+632            Intrinsic::__returndatacopy => Self::Returndatacopy,
+633            Intrinsic::__extcodehash => Self::Extcodehash,
+634            Intrinsic::__create => Self::Create,
+635            Intrinsic::__create2 => Self::Create2,
+636            Intrinsic::__call => Self::Call,
+637            Intrinsic::__callcode => Self::Callcode,
+638            Intrinsic::__delegatecall => Self::Delegatecall,
+639            Intrinsic::__staticcall => Self::Staticcall,
+640            Intrinsic::__return => Self::Return,
+641            Intrinsic::__revert => Self::Revert,
+642            Intrinsic::__selfdestruct => Self::Selfdestruct,
+643            Intrinsic::__invalid => Self::Invalid,
+644            Intrinsic::__log0 => Self::Log0,
+645            Intrinsic::__log1 => Self::Log1,
+646            Intrinsic::__log2 => Self::Log2,
+647            Intrinsic::__log3 => Self::Log3,
+648            Intrinsic::__log4 => Self::Log4,
+649            Intrinsic::__chainid => Self::Chainid,
+650            Intrinsic::__basefee => Self::Basefee,
+651            Intrinsic::__origin => Self::Origin,
+652            Intrinsic::__gasprice => Self::Gasprice,
+653            Intrinsic::__blockhash => Self::Blockhash,
+654            Intrinsic::__coinbase => Self::Coinbase,
+655            Intrinsic::__timestamp => Self::Timestamp,
+656            Intrinsic::__number => Self::Number,
+657            Intrinsic::__prevrandao => Self::Prevrandao,
+658            Intrinsic::__gaslimit => Self::Gaslimit,
+659        }
+660    }
+661}
+662
+663pub enum BranchInfo<'a> {
+664    NotBranch,
+665    Jump(BasicBlockId),
+666    Branch(ValueId, BasicBlockId, BasicBlockId),
+667    Switch(ValueId, &'a SwitchTable, Option<BasicBlockId>),
+668}
+669
+670impl<'a> BranchInfo<'a> {
+671    pub fn is_not_a_branch(&self) -> bool {
+672        matches!(self, BranchInfo::NotBranch)
+673    }
+674
+675    pub fn block_iter(&self) -> BlockIter {
+676        match self {
+677            Self::NotBranch => BlockIter::Zero,
+678            Self::Jump(block) => BlockIter::one(*block),
+679            Self::Branch(_, then, else_) => BlockIter::one(*then).chain(BlockIter::one(*else_)),
+680            Self::Switch(_, table, default) => {
+681                BlockIter::Slice(table.blocks.iter()).chain(BlockIter::One(*default))
+682            }
+683        }
+684    }
+685}
+686
+687pub type BlockIter<'a> = IterBase<'a, BasicBlockId>;
+688pub type ValueIter<'a> = IterBase<'a, ValueId>;
+689pub type ValueIterMut<'a> = IterMutBase<'a, ValueId>;
+690
+691pub enum IterBase<'a, T> {
+692    Zero,
+693    One(Option<T>),
+694    Slice(std::slice::Iter<'a, T>),
+695    Chain(Box<IterBase<'a, T>>, Box<IterBase<'a, T>>),
+696}
+697
+698impl<'a, T> IterBase<'a, T> {
+699    fn one(value: T) -> Self {
+700        Self::One(Some(value))
+701    }
+702
+703    fn chain(self, rhs: Self) -> Self {
+704        Self::Chain(self.into(), rhs.into())
+705    }
+706}
+707
+708impl<'a, T> Iterator for IterBase<'a, T>
+709where
+710    T: Copy,
+711{
+712    type Item = T;
+713
+714    fn next(&mut self) -> Option<Self::Item> {
+715        match self {
+716            Self::Zero => None,
+717            Self::One(value) => value.take(),
+718            Self::Slice(s) => s.next().copied(),
+719            Self::Chain(first, second) => {
+720                if let Some(value) = first.next() {
+721                    Some(value)
+722                } else {
+723                    second.next()
+724                }
+725            }
+726        }
+727    }
+728}
+729
+730pub enum IterMutBase<'a, T> {
+731    Zero,
+732    One(Option<&'a mut T>),
+733    Slice(std::slice::IterMut<'a, T>),
+734    Chain(Box<IterMutBase<'a, T>>, Box<IterMutBase<'a, T>>),
+735}
+736
+737impl<'a, T> IterMutBase<'a, T> {
+738    fn one(value: &'a mut T) -> Self {
+739        Self::One(Some(value))
+740    }
+741
+742    fn chain(self, rhs: Self) -> Self {
+743        Self::Chain(self.into(), rhs.into())
+744    }
+745}
+746
+747impl<'a, T> Iterator for IterMutBase<'a, T> {
+748    type Item = &'a mut T;
+749
+750    fn next(&mut self) -> Option<Self::Item> {
+751        match self {
+752            Self::Zero => None,
+753            Self::One(value) => value.take(),
+754            Self::Slice(s) => s.next(),
+755            Self::Chain(first, second) => {
+756                if let Some(value) = first.next() {
+757                    Some(value)
+758                } else {
+759                    second.next()
+760                }
+761            }
+762        }
+763    }
+764}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/mod.rs.html b/compiler-docs/src/fe_mir/ir/mod.rs.html new file mode 100644 index 0000000000..f3225aa0b8 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/mod.rs.html @@ -0,0 +1,49 @@ +mod.rs - source

fe_mir/ir/
mod.rs

1use fe_common::Span;
+2use fe_parser::node::{Node, NodeId};
+3
+4pub mod basic_block;
+5pub mod body_builder;
+6pub mod body_cursor;
+7pub mod body_order;
+8pub mod constant;
+9pub mod function;
+10pub mod inst;
+11pub mod types;
+12pub mod value;
+13
+14pub use basic_block::{BasicBlock, BasicBlockId};
+15pub use constant::{Constant, ConstantId};
+16pub use function::{FunctionBody, FunctionId, FunctionParam, FunctionSignature};
+17pub use inst::{Inst, InstId};
+18pub use types::{Type, TypeId, TypeKind};
+19pub use value::{Value, ValueId};
+20
+21/// An original source information that indicates where `mir` entities derive
+22/// from. `SourceInfo` is mainly used for diagnostics.
+23#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+24pub struct SourceInfo {
+25    pub span: Span,
+26    pub id: NodeId,
+27}
+28
+29impl SourceInfo {
+30    pub fn dummy() -> Self {
+31        Self {
+32            span: Span::dummy(),
+33            id: NodeId::dummy(),
+34        }
+35    }
+36
+37    pub fn is_dummy(&self) -> bool {
+38        self == &Self::dummy()
+39    }
+40}
+41
+42impl<T> From<&Node<T>> for SourceInfo {
+43    fn from(node: &Node<T>) -> Self {
+44        Self {
+45            span: node.span,
+46            id: node.id,
+47        }
+48    }
+49}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/types.rs.html b/compiler-docs/src/fe_mir/ir/types.rs.html new file mode 100644 index 0000000000..733eec2e80 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/types.rs.html @@ -0,0 +1,120 @@ +types.rs - source

fe_mir/ir/
types.rs

1use fe_analyzer::namespace::items as analyzer_items;
+2use fe_analyzer::namespace::types as analyzer_types;
+3use fe_common::{impl_intern_key, Span};
+4use smol_str::SmolStr;
+5
+6#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+7pub struct Type {
+8    pub kind: TypeKind,
+9    pub analyzer_ty: Option<analyzer_types::TypeId>,
+10}
+11
+12impl Type {
+13    pub fn new(kind: TypeKind, analyzer_ty: Option<analyzer_types::TypeId>) -> Self {
+14        Self { kind, analyzer_ty }
+15    }
+16}
+17
+18#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+19pub enum TypeKind {
+20    I8,
+21    I16,
+22    I32,
+23    I64,
+24    I128,
+25    I256,
+26    U8,
+27    U16,
+28    U32,
+29    U64,
+30    U128,
+31    U256,
+32    Bool,
+33    Address,
+34    Unit,
+35    Array(ArrayDef),
+36    // TODO: we should consider whether we really need `String` type.
+37    String(usize),
+38    Tuple(TupleDef),
+39    Struct(StructDef),
+40    Enum(EnumDef),
+41    Contract(StructDef),
+42    Map(MapDef),
+43    MPtr(TypeId),
+44    SPtr(TypeId),
+45}
+46
+47/// An interned Id for [`ArrayDef`].
+48#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+49pub struct TypeId(pub u32);
+50impl_intern_key!(TypeId);
+51
+52/// A static array type definition.
+53#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+54pub struct ArrayDef {
+55    pub elem_ty: TypeId,
+56    pub len: usize,
+57}
+58
+59/// A tuple type definition.
+60#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+61pub struct TupleDef {
+62    pub items: Vec<TypeId>,
+63}
+64
+65/// A user defined struct type definition.
+66#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+67pub struct StructDef {
+68    pub name: SmolStr,
+69    pub fields: Vec<(SmolStr, TypeId)>,
+70    pub span: Span,
+71    pub module_id: analyzer_items::ModuleId,
+72}
+73
+74/// A user defined struct type definition.
+75#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+76pub struct EnumDef {
+77    pub name: SmolStr,
+78    pub variants: Vec<EnumVariant>,
+79    pub span: Span,
+80    pub module_id: analyzer_items::ModuleId,
+81}
+82
+83impl EnumDef {
+84    pub fn tag_type(&self) -> TypeKind {
+85        let variant_num = self.variants.len() as u64;
+86        if variant_num <= u8::MAX as u64 {
+87            TypeKind::U8
+88        } else if variant_num <= u16::MAX as u64 {
+89            TypeKind::U16
+90        } else if variant_num <= u32::MAX as u64 {
+91            TypeKind::U32
+92        } else {
+93            TypeKind::U64
+94        }
+95    }
+96}
+97
+98/// A user defined struct type definition.
+99#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+100pub struct EnumVariant {
+101    pub name: SmolStr,
+102    pub span: Span,
+103    pub ty: TypeId,
+104}
+105
+106/// A user defined struct type definition.
+107#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+108pub struct EventDef {
+109    pub name: SmolStr,
+110    pub fields: Vec<(SmolStr, TypeId, bool)>,
+111    pub span: Span,
+112    pub module_id: analyzer_items::ModuleId,
+113}
+114
+115/// A map type definition.
+116#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+117pub struct MapDef {
+118    pub key_ty: TypeId,
+119    pub value_ty: TypeId,
+120}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/ir/value.rs.html b/compiler-docs/src/fe_mir/ir/value.rs.html new file mode 100644 index 0000000000..7d5e6fb3f5 --- /dev/null +++ b/compiler-docs/src/fe_mir/ir/value.rs.html @@ -0,0 +1,142 @@ +value.rs - source

fe_mir/ir/
value.rs

1use id_arena::Id;
+2use num_bigint::BigInt;
+3use smol_str::SmolStr;
+4
+5use crate::db::MirDb;
+6
+7use super::{
+8    constant::ConstantId,
+9    function::BodyDataStore,
+10    inst::InstId,
+11    types::{TypeId, TypeKind},
+12    SourceInfo,
+13};
+14
+15pub type ValueId = Id<Value>;
+16
+17#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+18pub enum Value {
+19    /// A value resulted from an instruction.
+20    Temporary { inst: InstId, ty: TypeId },
+21
+22    /// A local variable declared in a function body.
+23    Local(Local),
+24
+25    /// An immediate value.
+26    Immediate { imm: BigInt, ty: TypeId },
+27
+28    /// A constant value.
+29    Constant { constant: ConstantId, ty: TypeId },
+30
+31    /// A singleton value representing `Unit` type.
+32    Unit { ty: TypeId },
+33}
+34
+35impl Value {
+36    pub fn ty(&self) -> TypeId {
+37        match self {
+38            Self::Local(val) => val.ty,
+39            Self::Immediate { ty, .. }
+40            | Self::Temporary { ty, .. }
+41            | Self::Unit { ty }
+42            | Self::Constant { ty, .. } => *ty,
+43        }
+44    }
+45
+46    pub fn is_imm(&self) -> bool {
+47        matches!(self, Self::Immediate { .. })
+48    }
+49}
+50
+51#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+52pub enum AssignableValue {
+53    Value(ValueId),
+54    Aggregate {
+55        lhs: Box<AssignableValue>,
+56        idx: ValueId,
+57    },
+58    Map {
+59        lhs: Box<AssignableValue>,
+60        key: ValueId,
+61    },
+62}
+63
+64impl From<ValueId> for AssignableValue {
+65    fn from(value: ValueId) -> Self {
+66        Self::Value(value)
+67    }
+68}
+69
+70impl AssignableValue {
+71    pub fn ty(&self, db: &dyn MirDb, store: &BodyDataStore) -> TypeId {
+72        match self {
+73            Self::Value(value) => store.value_ty(*value),
+74            Self::Aggregate { lhs, idx } => {
+75                let lhs_ty = lhs.ty(db, store);
+76                lhs_ty.projection_ty(db, store.value_data(*idx))
+77            }
+78            Self::Map { lhs, .. } => {
+79                let lhs_ty = lhs.ty(db, store).deref(db);
+80                match lhs_ty.data(db).kind {
+81                    TypeKind::Map(def) => def.value_ty.make_sptr(db),
+82                    _ => unreachable!(),
+83                }
+84            }
+85        }
+86    }
+87
+88    pub fn value_id(&self) -> Option<ValueId> {
+89        match self {
+90            Self::Value(value) => Some(*value),
+91            _ => None,
+92        }
+93    }
+94}
+95
+96#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+97pub struct Local {
+98    /// An original name of a local variable.
+99    pub name: SmolStr,
+100
+101    pub ty: TypeId,
+102
+103    /// `true` if a local is a function argument.
+104    pub is_arg: bool,
+105
+106    /// `true` if a local is introduced in MIR.
+107    pub is_tmp: bool,
+108
+109    pub source: SourceInfo,
+110}
+111
+112impl Local {
+113    pub fn user_local(name: SmolStr, ty: TypeId, source: SourceInfo) -> Local {
+114        Self {
+115            name,
+116            ty,
+117            is_arg: false,
+118            is_tmp: false,
+119            source,
+120        }
+121    }
+122
+123    pub fn arg_local(name: SmolStr, ty: TypeId, source: SourceInfo) -> Local {
+124        Self {
+125            name,
+126            ty,
+127            is_arg: true,
+128            is_tmp: false,
+129            source,
+130        }
+131    }
+132
+133    pub fn tmp_local(name: SmolStr, ty: TypeId) -> Local {
+134        Self {
+135            name,
+136            ty,
+137            is_arg: false,
+138            is_tmp: true,
+139            source: SourceInfo::dummy(),
+140        }
+141    }
+142}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lib.rs.html b/compiler-docs/src/fe_mir/lib.rs.html new file mode 100644 index 0000000000..221d212dd5 --- /dev/null +++ b/compiler-docs/src/fe_mir/lib.rs.html @@ -0,0 +1,7 @@ +lib.rs - source

fe_mir/
lib.rs

1pub mod analysis;
+2pub mod db;
+3pub mod graphviz;
+4pub mod ir;
+5pub mod pretty_print;
+6
+7mod lower;
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/function.rs.html b/compiler-docs/src/fe_mir/lower/function.rs.html new file mode 100644 index 0000000000..5a29da44ff --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/function.rs.html @@ -0,0 +1,1367 @@ +function.rs - source

fe_mir/lower/
function.rs

1use std::{collections::BTreeMap, rc::Rc, vec};
+2
+3use fe_analyzer::{
+4    builtins::{ContractTypeMethod, GlobalFunction, ValueMethod},
+5    constants::{EMITTABLE_TRAIT_NAME, EMIT_FN_NAME},
+6    context::{Adjustment, AdjustmentKind, CallType as AnalyzerCallType, NamedThing},
+7    namespace::{
+8        items as analyzer_items,
+9        types::{self as analyzer_types, Type},
+10    },
+11};
+12use fe_common::numeric::Literal;
+13use fe_parser::{ast, node::Node};
+14use fxhash::FxHashMap;
+15use id_arena::{Arena, Id};
+16use num_bigint::BigInt;
+17use smol_str::SmolStr;
+18
+19use crate::{
+20    db::MirDb,
+21    ir::{
+22        self,
+23        body_builder::BodyBuilder,
+24        constant::ConstantValue,
+25        function::Linkage,
+26        inst::{CallType, InstKind},
+27        value::{AssignableValue, Local},
+28        BasicBlockId, Constant, FunctionBody, FunctionId, FunctionParam, FunctionSignature, InstId,
+29        SourceInfo, TypeId, Value, ValueId,
+30    },
+31};
+32
+33type ScopeId = Id<Scope>;
+34
+35pub fn lower_func_signature(db: &dyn MirDb, func: analyzer_items::FunctionId) -> FunctionId {
+36    lower_monomorphized_func_signature(db, func, BTreeMap::new())
+37}
+38pub fn lower_monomorphized_func_signature(
+39    db: &dyn MirDb,
+40    func: analyzer_items::FunctionId,
+41    resolved_generics: BTreeMap<SmolStr, analyzer_types::TypeId>,
+42) -> FunctionId {
+43    // TODO: Remove this when an analyzer's function signature contains `self` type.
+44    let mut params = vec![];
+45
+46    if func.takes_self(db.upcast()) {
+47        let self_ty = func.self_type(db.upcast()).unwrap();
+48        let source = self_arg_source(db, func);
+49        params.push(make_param(db, "self", self_ty, source));
+50    }
+51    let analyzer_signature = func.signature(db.upcast());
+52
+53    for param in analyzer_signature.params.iter() {
+54        let source = arg_source(db, func, &param.name);
+55
+56        let param_type =
+57            if let Type::Generic(generic) = param.typ.clone().unwrap().deref_typ(db.upcast()) {
+58                *resolved_generics.get(&generic.name).unwrap()
+59            } else {
+60                param.typ.clone().unwrap()
+61            };
+62
+63        params.push(make_param(db, param.clone().name, param_type, source))
+64    }
+65
+66    let return_type = db.mir_lowered_type(analyzer_signature.return_type.clone().unwrap());
+67
+68    let linkage = if func.is_public(db.upcast()) {
+69        if func.is_contract_func(db.upcast()) && !func.is_constructor(db.upcast()) {
+70            Linkage::Export
+71        } else {
+72            Linkage::Public
+73        }
+74    } else {
+75        Linkage::Private
+76    };
+77
+78    let sig = FunctionSignature {
+79        params,
+80        resolved_generics,
+81        return_type: Some(return_type),
+82        module_id: func.module(db.upcast()),
+83        analyzer_func_id: func,
+84        linkage,
+85    };
+86
+87    db.mir_intern_function(sig.into())
+88}
+89
+90pub fn lower_func_body(db: &dyn MirDb, func: FunctionId) -> Rc<FunctionBody> {
+91    let analyzer_func = func.analyzer_func(db);
+92    let ast = &analyzer_func.data(db.upcast()).ast;
+93    let analyzer_body = analyzer_func.body(db.upcast());
+94
+95    BodyLowerHelper::new(db, func, ast, analyzer_body.as_ref())
+96        .lower()
+97        .into()
+98}
+99
+100pub(super) struct BodyLowerHelper<'db, 'a> {
+101    pub(super) db: &'db dyn MirDb,
+102    pub(super) builder: BodyBuilder,
+103    ast: &'a Node<ast::Function>,
+104    func: FunctionId,
+105    analyzer_body: &'a fe_analyzer::context::FunctionBody,
+106    scopes: Arena<Scope>,
+107    current_scope: ScopeId,
+108}
+109
+110impl<'db, 'a> BodyLowerHelper<'db, 'a> {
+111    pub(super) fn lower_stmt(&mut self, stmt: &Node<ast::FuncStmt>) {
+112        match &stmt.kind {
+113            ast::FuncStmt::Return { value } => {
+114                let value = if let Some(expr) = value {
+115                    self.lower_expr_to_value(expr)
+116                } else {
+117                    self.make_unit()
+118                };
+119                self.builder.ret(value, stmt.into());
+120                let next_block = self.builder.make_block();
+121                self.builder.move_to_block(next_block);
+122            }
+123
+124            ast::FuncStmt::VarDecl { target, value, .. } => {
+125                self.lower_var_decl(target, value.as_ref(), stmt.into());
+126            }
+127
+128            ast::FuncStmt::ConstantDecl { name, value, .. } => {
+129                let ty = self.lower_analyzer_type(self.analyzer_body.var_types[&name.id]);
+130
+131                let value = self.analyzer_body.expressions[&value.id]
+132                    .const_value
+133                    .clone()
+134                    .unwrap();
+135
+136                let constant =
+137                    self.make_local_constant(name.kind.clone(), ty, value.into(), stmt.into());
+138                self.scope_mut().declare_var(&name.kind, constant);
+139            }
+140
+141            ast::FuncStmt::Assign { target, value } => {
+142                let result = self.lower_assignable_value(target);
+143                let (expr, _ty) = self.lower_expr(value);
+144                self.builder.map_result(expr, result)
+145            }
+146
+147            ast::FuncStmt::AugAssign { target, op, value } => {
+148                let result = self.lower_assignable_value(target);
+149                let lhs = self.lower_expr_to_value(target);
+150                let rhs = self.lower_expr_to_value(value);
+151
+152                let inst = self.lower_binop(op.kind, lhs, rhs, stmt.into());
+153                self.builder.map_result(inst, result)
+154            }
+155
+156            ast::FuncStmt::For { target, iter, body } => self.lower_for_loop(target, iter, body),
+157
+158            ast::FuncStmt::While { test, body } => {
+159                let header_bb = self.builder.make_block();
+160                let exit_bb = self.builder.make_block();
+161
+162                let cond = self.lower_expr_to_value(test);
+163                self.builder
+164                    .branch(cond, header_bb, exit_bb, SourceInfo::dummy());
+165
+166                // Lower while body.
+167                self.builder.move_to_block(header_bb);
+168                self.enter_loop_scope(header_bb, exit_bb);
+169                for stmt in body {
+170                    self.lower_stmt(stmt);
+171                }
+172                let cond = self.lower_expr_to_value(test);
+173                self.builder
+174                    .branch(cond, header_bb, exit_bb, SourceInfo::dummy());
+175
+176                self.leave_scope();
+177
+178                // Move to while exit bb.
+179                self.builder.move_to_block(exit_bb);
+180            }
+181
+182            ast::FuncStmt::If {
+183                test,
+184                body,
+185                or_else,
+186            } => self.lower_if(test, body, or_else),
+187
+188            ast::FuncStmt::Match { expr, arms } => {
+189                let matrix = &self.analyzer_body.matches[&stmt.id];
+190                super::pattern_match::lower_match(self, matrix, expr, arms);
+191            }
+192
+193            ast::FuncStmt::Assert { test, msg } => {
+194                let then_bb = self.builder.make_block();
+195                let false_bb = self.builder.make_block();
+196
+197                let cond = self.lower_expr_to_value(test);
+198                self.builder
+199                    .branch(cond, then_bb, false_bb, SourceInfo::dummy());
+200
+201                self.builder.move_to_block(false_bb);
+202
+203                let msg = match msg {
+204                    Some(msg) => self.lower_expr_to_value(msg),
+205                    None => self.make_u256_imm(1),
+206                };
+207                self.builder.revert(Some(msg), stmt.into());
+208                self.builder.move_to_block(then_bb);
+209            }
+210
+211            ast::FuncStmt::Expr { value } => {
+212                self.lower_expr_to_value(value);
+213            }
+214
+215            ast::FuncStmt::Break => {
+216                let exit = self.scope().loop_exit(&self.scopes);
+217                self.builder.jump(exit, stmt.into());
+218                let next_block = self.builder.make_block();
+219                self.builder.move_to_block(next_block);
+220            }
+221
+222            ast::FuncStmt::Continue => {
+223                let entry = self.scope().loop_entry(&self.scopes);
+224                if let Some(loop_idx) = self.scope().loop_idx(&self.scopes) {
+225                    let imm_one = self.make_u256_imm(1u32);
+226                    let inc = self.builder.add(loop_idx, imm_one, SourceInfo::dummy());
+227                    self.builder.map_result(inc, loop_idx.into());
+228                    let maximum_iter_count = self.scope().maximum_iter_count(&self.scopes).unwrap();
+229                    let exit = self.scope().loop_exit(&self.scopes);
+230                    self.branch_eq(loop_idx, maximum_iter_count, exit, entry, stmt.into());
+231                } else {
+232                    self.builder.jump(entry, stmt.into());
+233                }
+234                let next_block = self.builder.make_block();
+235                self.builder.move_to_block(next_block);
+236            }
+237
+238            ast::FuncStmt::Revert { error } => {
+239                let error = error.as_ref().map(|err| self.lower_expr_to_value(err));
+240                self.builder.revert(error, stmt.into());
+241                let next_block = self.builder.make_block();
+242                self.builder.move_to_block(next_block);
+243            }
+244
+245            ast::FuncStmt::Unsafe(stmts) => {
+246                self.enter_scope();
+247                for stmt in stmts {
+248                    self.lower_stmt(stmt)
+249                }
+250                self.leave_scope()
+251            }
+252        }
+253    }
+254
+255    pub(super) fn lower_var_decl(
+256        &mut self,
+257        var: &Node<ast::VarDeclTarget>,
+258        init: Option<&Node<ast::Expr>>,
+259        source: SourceInfo,
+260    ) {
+261        match &var.kind {
+262            ast::VarDeclTarget::Name(name) => {
+263                let ty = self.lower_analyzer_type(self.analyzer_body.var_types[&var.id]);
+264                let value = self.declare_var(name, ty, var.into());
+265                if let Some(init) = init {
+266                    let (init, _init_ty) = self.lower_expr(init);
+267                    // debug_assert_eq!(ty.deref(self.db), init_ty, "vardecl init type mismatch: {} != {}",
+268                    //                  ty.as_string(self.db),
+269                    //                  init_ty.as_string(self.db));
+270                    self.builder.map_result(init, value.into());
+271                }
+272            }
+273
+274            ast::VarDeclTarget::Tuple(decls) => {
+275                if let Some(init) = init {
+276                    if let ast::Expr::Tuple { elts } = &init.kind {
+277                        debug_assert_eq!(decls.len(), elts.len());
+278                        for (decl, init_elem) in decls.iter().zip(elts.iter()) {
+279                            self.lower_var_decl(decl, Some(init_elem), source.clone());
+280                        }
+281                    } else {
+282                        let init_ty = self.expr_ty(init);
+283                        let init_value = self.lower_expr_to_value(init);
+284                        self.lower_var_decl_unpack(var, init_value, init_ty, source);
+285                    };
+286                } else {
+287                    for decl in decls {
+288                        self.lower_var_decl(decl, None, source.clone())
+289                    }
+290                }
+291            }
+292        }
+293    }
+294
+295    pub(super) fn declare_var(
+296        &mut self,
+297        name: &SmolStr,
+298        ty: TypeId,
+299        source: SourceInfo,
+300    ) -> ValueId {
+301        let local = Local::user_local(name.clone(), ty, source);
+302        let value = self.builder.declare(local);
+303        self.scope_mut().declare_var(name, value);
+304        value
+305    }
+306
+307    pub(super) fn lower_var_decl_unpack(
+308        &mut self,
+309        var: &Node<ast::VarDeclTarget>,
+310        init: ValueId,
+311        init_ty: TypeId,
+312        source: SourceInfo,
+313    ) {
+314        match &var.kind {
+315            ast::VarDeclTarget::Name(name) => {
+316                let ty = self.lower_analyzer_type(self.analyzer_body.var_types[&var.id]);
+317                let local = Local::user_local(name.clone(), ty, var.into());
+318
+319                let lhs = self.builder.declare(local);
+320                self.scope_mut().declare_var(name, lhs);
+321                let bind = self.builder.bind(init, source);
+322                self.builder.map_result(bind, lhs.into());
+323            }
+324
+325            ast::VarDeclTarget::Tuple(decls) => {
+326                for (index, decl) in decls.iter().enumerate() {
+327                    let elem_ty = init_ty.projection_ty_imm(self.db, index);
+328                    let index_value = self.make_u256_imm(index);
+329                    let elem_inst =
+330                        self.builder
+331                            .aggregate_access(init, vec![index_value], source.clone());
+332                    let elem_value = self.map_to_tmp(elem_inst, elem_ty);
+333                    self.lower_var_decl_unpack(decl, elem_value, elem_ty, source.clone())
+334                }
+335            }
+336        }
+337    }
+338
+339    pub(super) fn lower_expr(&mut self, expr: &Node<ast::Expr>) -> (InstId, TypeId) {
+340        let mut ty = self.expr_ty(expr);
+341        let mut inst = match &expr.kind {
+342            ast::Expr::Ternary {
+343                if_expr,
+344                test,
+345                else_expr,
+346            } => {
+347                let true_bb = self.builder.make_block();
+348                let false_bb = self.builder.make_block();
+349                let merge_bb = self.builder.make_block();
+350
+351                let tmp = self
+352                    .builder
+353                    .declare(Local::tmp_local("$ternary_tmp".into(), ty));
+354
+355                let cond = self.lower_expr_to_value(test);
+356                self.builder
+357                    .branch(cond, true_bb, false_bb, SourceInfo::dummy());
+358
+359                self.builder.move_to_block(true_bb);
+360                let (value, _) = self.lower_expr(if_expr);
+361                self.builder.map_result(value, tmp.into());
+362                self.builder.jump(merge_bb, SourceInfo::dummy());
+363
+364                self.builder.move_to_block(false_bb);
+365                let (value, _) = self.lower_expr(else_expr);
+366                self.builder.map_result(value, tmp.into());
+367                self.builder.jump(merge_bb, SourceInfo::dummy());
+368
+369                self.builder.move_to_block(merge_bb);
+370                self.builder.bind(tmp, SourceInfo::dummy())
+371            }
+372
+373            ast::Expr::BoolOperation { left, op, right } => {
+374                self.lower_bool_op(op.kind, left, right, ty)
+375            }
+376
+377            ast::Expr::BinOperation { left, op, right } => {
+378                let lhs = self.lower_expr_to_value(left);
+379                let rhs = self.lower_expr_to_value(right);
+380                self.lower_binop(op.kind, lhs, rhs, expr.into())
+381            }
+382
+383            ast::Expr::UnaryOperation { op, operand } => {
+384                let value = self.lower_expr_to_value(operand);
+385                match op.kind {
+386                    ast::UnaryOperator::Invert => self.builder.inv(value, expr.into()),
+387                    ast::UnaryOperator::Not => self.builder.not(value, expr.into()),
+388                    ast::UnaryOperator::USub => self.builder.neg(value, expr.into()),
+389                }
+390            }
+391
+392            ast::Expr::CompOperation { left, op, right } => {
+393                let lhs = self.lower_expr_to_value(left);
+394                let rhs = self.lower_expr_to_value(right);
+395                self.lower_comp_op(op.kind, lhs, rhs, expr.into())
+396            }
+397
+398            ast::Expr::Attribute { .. } => {
+399                let mut indices = vec![];
+400                let value = self.lower_aggregate_access(expr, &mut indices);
+401                self.builder.aggregate_access(value, indices, expr.into())
+402            }
+403
+404            ast::Expr::Subscript { value, index } => {
+405                let value_ty = self.expr_ty(value).deref(self.db);
+406                if value_ty.is_aggregate(self.db) {
+407                    let mut indices = vec![];
+408                    let value = self.lower_aggregate_access(expr, &mut indices);
+409                    self.builder.aggregate_access(value, indices, expr.into())
+410                } else if value_ty.is_map(self.db) {
+411                    let value = self.lower_expr_to_value(value);
+412                    let key = self.lower_expr_to_value(index);
+413                    self.builder.map_access(value, key, expr.into())
+414                } else {
+415                    unreachable!()
+416                }
+417            }
+418
+419            ast::Expr::Call {
+420                func,
+421                generic_args,
+422                args,
+423            } => {
+424                let ty = self.expr_ty(expr);
+425                self.lower_call(func, generic_args, &args.kind, ty, expr.into())
+426            }
+427
+428            ast::Expr::List { elts } | ast::Expr::Tuple { elts } => {
+429                let args = elts
+430                    .iter()
+431                    .map(|elem| self.lower_expr_to_value(elem))
+432                    .collect();
+433                let ty = self.expr_ty(expr);
+434                self.builder.aggregate_construct(ty, args, expr.into())
+435            }
+436
+437            ast::Expr::Repeat { value, len: _ } => {
+438                let array_type = if let Type::Array(array_type) = self.analyzer_body.expressions
+439                    [&expr.id]
+440                    .typ
+441                    .typ(self.db.upcast())
+442                {
+443                    array_type
+444                } else {
+445                    panic!("not an array");
+446                };
+447
+448                let args = vec![self.lower_expr_to_value(value); array_type.size];
+449                let ty = self.expr_ty(expr);
+450                self.builder.aggregate_construct(ty, args, expr.into())
+451            }
+452
+453            ast::Expr::Bool(b) => {
+454                let imm = self.builder.make_imm_from_bool(*b, ty);
+455                self.builder.bind(imm, expr.into())
+456            }
+457
+458            ast::Expr::Name(name) => {
+459                let value = self.resolve_name(name);
+460                self.builder.bind(value, expr.into())
+461            }
+462
+463            ast::Expr::Path(path) => {
+464                let value = self.resolve_path(path, expr.into());
+465                self.builder.bind(value, expr.into())
+466            }
+467
+468            ast::Expr::Num(num) => {
+469                let imm = Literal::new(num).parse().unwrap();
+470                let imm = self.builder.make_imm(imm, ty);
+471                self.builder.bind(imm, expr.into())
+472            }
+473
+474            ast::Expr::Str(s) => {
+475                let ty = self.expr_ty(expr);
+476                let const_value = self.make_local_constant(
+477                    "str_in_func".into(),
+478                    ty,
+479                    ConstantValue::Str(s.clone()),
+480                    expr.into(),
+481                );
+482                self.builder.bind(const_value, expr.into())
+483            }
+484
+485            ast::Expr::Unit => {
+486                let value = self.make_unit();
+487                self.builder.bind(value, expr.into())
+488            }
+489        };
+490
+491        for Adjustment { into, kind } in &self.analyzer_body.expressions[&expr.id].type_adjustments
+492        {
+493            let into_ty = self.lower_analyzer_type(*into);
+494
+495            match kind {
+496                AdjustmentKind::Copy => {
+497                    let val = self.inst_result_or_tmp(inst, ty);
+498                    inst = self.builder.mem_copy(val, expr.into());
+499                }
+500                AdjustmentKind::Load => {
+501                    let val = self.inst_result_or_tmp(inst, ty);
+502                    inst = self.builder.load(val, expr.into());
+503                }
+504                AdjustmentKind::IntSizeIncrease => {
+505                    let val = self.inst_result_or_tmp(inst, ty);
+506                    inst = self.builder.primitive_cast(val, into_ty, expr.into())
+507                }
+508                AdjustmentKind::StringSizeIncrease => {} // XXX
+509            }
+510            ty = into_ty;
+511        }
+512        (inst, ty)
+513    }
+514
+515    fn inst_result_or_tmp(&mut self, inst: InstId, ty: TypeId) -> ValueId {
+516        self.builder
+517            .inst_result(inst)
+518            .and_then(|r| r.value_id())
+519            .unwrap_or_else(|| self.map_to_tmp(inst, ty))
+520    }
+521
+522    pub(super) fn lower_expr_to_value(&mut self, expr: &Node<ast::Expr>) -> ValueId {
+523        let (inst, ty) = self.lower_expr(expr);
+524        self.map_to_tmp(inst, ty)
+525    }
+526
+527    pub(super) fn enter_scope(&mut self) {
+528        let new_scope = Scope::with_parent(self.current_scope);
+529        self.current_scope = self.scopes.alloc(new_scope);
+530    }
+531
+532    pub(super) fn leave_scope(&mut self) {
+533        self.current_scope = self.scopes[self.current_scope].parent.unwrap();
+534    }
+535
+536    pub(super) fn make_imm(&mut self, imm: impl Into<BigInt>, ty: TypeId) -> ValueId {
+537        self.builder.make_value(Value::Immediate {
+538            imm: imm.into(),
+539            ty,
+540        })
+541    }
+542
+543    pub(super) fn make_u256_imm(&mut self, value: impl Into<BigInt>) -> ValueId {
+544        let u256_ty = self.u256_ty();
+545        self.make_imm(value, u256_ty)
+546    }
+547
+548    pub(super) fn map_to_tmp(&mut self, inst: InstId, ty: TypeId) -> ValueId {
+549        match &self.builder.inst_data(inst).kind {
+550            InstKind::Bind { src } => {
+551                let value = *src;
+552                self.builder.remove_inst(inst);
+553                value
+554            }
+555            _ => {
+556                let tmp = Value::Temporary { inst, ty };
+557                let result = self.builder.make_value(tmp);
+558                self.builder.map_result(inst, result.into());
+559                result
+560            }
+561        }
+562    }
+563
+564    fn new(
+565        db: &'db dyn MirDb,
+566        func: FunctionId,
+567        ast: &'a Node<ast::Function>,
+568        analyzer_body: &'a fe_analyzer::context::FunctionBody,
+569    ) -> Self {
+570        let mut builder = BodyBuilder::new(func, ast.into());
+571        let mut scopes = Arena::new();
+572
+573        // Make a root scope. A root scope collects function parameters and module
+574        // constants.
+575        let root = Scope::root(db, func, &mut builder);
+576        let current_scope = scopes.alloc(root);
+577        Self {
+578            db,
+579            builder,
+580            ast,
+581            func,
+582            analyzer_body,
+583            scopes,
+584            current_scope,
+585        }
+586    }
+587
+588    fn lower_analyzer_type(&self, analyzer_ty: analyzer_types::TypeId) -> TypeId {
+589        // If the analyzer type is generic we first need to resolve it to its concrete
+590        // type before lowering to a MIR type
+591        if let analyzer_types::Type::Generic(generic) = analyzer_ty.deref_typ(self.db.upcast()) {
+592            let resolved_type = self
+593                .func
+594                .signature(self.db)
+595                .resolved_generics
+596                .get(&generic.name)
+597                .cloned()
+598                .expect("expected generic to be resolved");
+599
+600            return self.db.mir_lowered_type(resolved_type);
+601        }
+602
+603        self.db.mir_lowered_type(analyzer_ty)
+604    }
+605
+606    fn lower(mut self) -> FunctionBody {
+607        for stmt in &self.ast.kind.body {
+608            self.lower_stmt(stmt)
+609        }
+610
+611        let last_block = self.builder.current_block();
+612        if !self.builder.is_block_terminated(last_block) {
+613            let unit = self.make_unit();
+614            self.builder.ret(unit, SourceInfo::dummy());
+615        }
+616
+617        self.builder.build()
+618    }
+619
+620    fn branch_eq(
+621        &mut self,
+622        v1: ValueId,
+623        v2: ValueId,
+624        true_bb: BasicBlockId,
+625        false_bb: BasicBlockId,
+626        source: SourceInfo,
+627    ) {
+628        let cond = self.builder.eq(v1, v2, source.clone());
+629        let bool_ty = self.bool_ty();
+630        let cond = self.map_to_tmp(cond, bool_ty);
+631        self.builder.branch(cond, true_bb, false_bb, source);
+632    }
+633
+634    fn lower_if(
+635        &mut self,
+636        cond: &Node<ast::Expr>,
+637        then: &[Node<ast::FuncStmt>],
+638        else_: &[Node<ast::FuncStmt>],
+639    ) {
+640        let cond = self.lower_expr_to_value(cond);
+641
+642        if else_.is_empty() {
+643            let then_bb = self.builder.make_block();
+644            let merge_bb = self.builder.make_block();
+645
+646            self.builder
+647                .branch(cond, then_bb, merge_bb, SourceInfo::dummy());
+648
+649            // Lower then block.
+650            self.builder.move_to_block(then_bb);
+651            self.enter_scope();
+652            for stmt in then {
+653                self.lower_stmt(stmt);
+654            }
+655            self.builder.jump(merge_bb, SourceInfo::dummy());
+656            self.builder.move_to_block(merge_bb);
+657            self.leave_scope();
+658        } else {
+659            let then_bb = self.builder.make_block();
+660            let else_bb = self.builder.make_block();
+661
+662            self.builder
+663                .branch(cond, then_bb, else_bb, SourceInfo::dummy());
+664
+665            // Lower then block.
+666            self.builder.move_to_block(then_bb);
+667            self.enter_scope();
+668            for stmt in then {
+669                self.lower_stmt(stmt);
+670            }
+671            self.leave_scope();
+672            let then_block_end_bb = self.builder.current_block();
+673
+674            // Lower else_block.
+675            self.builder.move_to_block(else_bb);
+676            self.enter_scope();
+677            for stmt in else_ {
+678                self.lower_stmt(stmt);
+679            }
+680            self.leave_scope();
+681            let else_block_end_bb = self.builder.current_block();
+682
+683            let merge_bb = self.builder.make_block();
+684            if !self.builder.is_block_terminated(then_block_end_bb) {
+685                self.builder.move_to_block(then_block_end_bb);
+686                self.builder.jump(merge_bb, SourceInfo::dummy());
+687            }
+688            if !self.builder.is_block_terminated(else_block_end_bb) {
+689                self.builder.move_to_block(else_block_end_bb);
+690                self.builder.jump(merge_bb, SourceInfo::dummy());
+691            }
+692            self.builder.move_to_block(merge_bb);
+693        }
+694    }
+695
+696    // NOTE: we assume a type of `iter` is array.
+697    // TODO: Desugar to `loop` + `match` like rustc in HIR to generate better MIR.
+698    fn lower_for_loop(
+699        &mut self,
+700        loop_variable: &Node<SmolStr>,
+701        iter: &Node<ast::Expr>,
+702        body: &[Node<ast::FuncStmt>],
+703    ) {
+704        let preheader_bb = self.builder.make_block();
+705        let entry_bb = self.builder.make_block();
+706        let exit_bb = self.builder.make_block();
+707
+708        let iter_elem_ty = self.analyzer_body.var_types[&loop_variable.id];
+709        let iter_elem_ty = self.lower_analyzer_type(iter_elem_ty);
+710
+711        self.builder.jump(preheader_bb, SourceInfo::dummy());
+712
+713        // `For` has its scope from preheader block.
+714        self.enter_loop_scope(entry_bb, exit_bb);
+715
+716        /* Lower preheader. */
+717        self.builder.move_to_block(preheader_bb);
+718
+719        // Declare loop_variable.
+720        let loop_value = self.builder.declare(Local::user_local(
+721            loop_variable.kind.clone(),
+722            iter_elem_ty,
+723            loop_variable.into(),
+724        ));
+725        self.scope_mut()
+726            .declare_var(&loop_variable.kind, loop_value);
+727
+728        // Declare and initialize `loop_idx` to 0.
+729        let loop_idx = Local::tmp_local("$loop_idx_tmp".into(), self.u256_ty());
+730        let loop_idx = self.builder.declare(loop_idx);
+731        let imm_zero = self.make_u256_imm(0u32);
+732        let imm_zero = self.builder.bind(imm_zero, SourceInfo::dummy());
+733        self.builder.map_result(imm_zero, loop_idx.into());
+734
+735        // Evaluates loop variable.
+736        let iter_ty = self.expr_ty(iter);
+737        let iter = self.lower_expr_to_value(iter);
+738
+739        // Create maximum loop count.
+740        let maximum_iter_count = match &iter_ty.deref(self.db).data(self.db).kind {
+741            ir::TypeKind::Array(ir::types::ArrayDef { len, .. }) => *len,
+742            _ => unreachable!(),
+743        };
+744        let maximum_iter_count = self.make_u256_imm(maximum_iter_count);
+745        self.branch_eq(
+746            loop_idx,
+747            maximum_iter_count,
+748            exit_bb,
+749            entry_bb,
+750            SourceInfo::dummy(),
+751        );
+752        self.scope_mut().loop_idx = Some(loop_idx);
+753        self.scope_mut().maximum_iter_count = Some(maximum_iter_count);
+754
+755        /* Lower body. */
+756        self.builder.move_to_block(entry_bb);
+757
+758        // loop_variable = array[loop_idx]
+759        let iter_elem = self
+760            .builder
+761            .aggregate_access(iter, vec![loop_idx], SourceInfo::dummy());
+762        self.builder
+763            .map_result(iter_elem, AssignableValue::Value(loop_value));
+764
+765        for stmt in body {
+766            self.lower_stmt(stmt);
+767        }
+768
+769        // loop_idx += 1
+770        let imm_one = self.make_u256_imm(1u32);
+771        let inc = self.builder.add(loop_idx, imm_one, SourceInfo::dummy());
+772        self.builder
+773            .map_result(inc, AssignableValue::Value(loop_idx));
+774        self.branch_eq(
+775            loop_idx,
+776            maximum_iter_count,
+777            exit_bb,
+778            entry_bb,
+779            SourceInfo::dummy(),
+780        );
+781
+782        /* Move to exit bb */
+783        self.leave_scope();
+784        self.builder.move_to_block(exit_bb);
+785    }
+786
+787    fn lower_assignable_value(&mut self, expr: &Node<ast::Expr>) -> AssignableValue {
+788        match &expr.kind {
+789            ast::Expr::Attribute { value, attr } => {
+790                let idx = self.expr_ty(value).index_from_fname(self.db, &attr.kind);
+791                let idx = self.make_u256_imm(idx);
+792                let lhs = self.lower_assignable_value(value).into();
+793                AssignableValue::Aggregate { lhs, idx }
+794            }
+795            ast::Expr::Subscript { value, index } => {
+796                let lhs = self.lower_assignable_value(value).into();
+797                let attr = self.lower_expr_to_value(index);
+798                let value_ty = self.expr_ty(value).deref(self.db);
+799                if value_ty.is_aggregate(self.db) {
+800                    AssignableValue::Aggregate { lhs, idx: attr }
+801                } else if value_ty.is_map(self.db) {
+802                    AssignableValue::Map { lhs, key: attr }
+803                } else {
+804                    unreachable!()
+805                }
+806            }
+807            ast::Expr::Name(name) => self.resolve_name(name).into(),
+808            ast::Expr::Path(path) => self.resolve_path(path, expr.into()).into(),
+809            _ => self.lower_expr_to_value(expr).into(),
+810        }
+811    }
+812
+813    /// Returns the pre-adjustment type of the given `Expr`
+814    fn expr_ty(&self, expr: &Node<ast::Expr>) -> TypeId {
+815        let analyzer_ty = self.analyzer_body.expressions[&expr.id].typ;
+816        self.lower_analyzer_type(analyzer_ty)
+817    }
+818
+819    fn lower_bool_op(
+820        &mut self,
+821        op: ast::BoolOperator,
+822        lhs: &Node<ast::Expr>,
+823        rhs: &Node<ast::Expr>,
+824        ty: TypeId,
+825    ) -> InstId {
+826        let true_bb = self.builder.make_block();
+827        let false_bb = self.builder.make_block();
+828        let merge_bb = self.builder.make_block();
+829
+830        let lhs = self.lower_expr_to_value(lhs);
+831        let tmp = self
+832            .builder
+833            .declare(Local::tmp_local(format!("${op}_tmp").into(), ty));
+834
+835        match op {
+836            ast::BoolOperator::And => {
+837                self.builder
+838                    .branch(lhs, true_bb, false_bb, SourceInfo::dummy());
+839
+840                self.builder.move_to_block(true_bb);
+841                let (rhs, _rhs_ty) = self.lower_expr(rhs);
+842                self.builder.map_result(rhs, tmp.into());
+843                self.builder.jump(merge_bb, SourceInfo::dummy());
+844
+845                self.builder.move_to_block(false_bb);
+846                let false_imm = self.builder.make_imm_from_bool(false, ty);
+847                let false_imm_copy = self.builder.bind(false_imm, SourceInfo::dummy());
+848                self.builder.map_result(false_imm_copy, tmp.into());
+849                self.builder.jump(merge_bb, SourceInfo::dummy());
+850            }
+851
+852            ast::BoolOperator::Or => {
+853                self.builder
+854                    .branch(lhs, true_bb, false_bb, SourceInfo::dummy());
+855
+856                self.builder.move_to_block(true_bb);
+857                let true_imm = self.builder.make_imm_from_bool(true, ty);
+858                let true_imm_copy = self.builder.bind(true_imm, SourceInfo::dummy());
+859                self.builder.map_result(true_imm_copy, tmp.into());
+860                self.builder.jump(merge_bb, SourceInfo::dummy());
+861
+862                self.builder.move_to_block(false_bb);
+863                let (rhs, _rhs_ty) = self.lower_expr(rhs);
+864                self.builder.map_result(rhs, tmp.into());
+865                self.builder.jump(merge_bb, SourceInfo::dummy());
+866            }
+867        }
+868
+869        self.builder.move_to_block(merge_bb);
+870        self.builder.bind(tmp, SourceInfo::dummy())
+871    }
+872
+873    fn lower_binop(
+874        &mut self,
+875        op: ast::BinOperator,
+876        lhs: ValueId,
+877        rhs: ValueId,
+878        source: SourceInfo,
+879    ) -> InstId {
+880        match op {
+881            ast::BinOperator::Add => self.builder.add(lhs, rhs, source),
+882            ast::BinOperator::Sub => self.builder.sub(lhs, rhs, source),
+883            ast::BinOperator::Mult => self.builder.mul(lhs, rhs, source),
+884            ast::BinOperator::Div => self.builder.div(lhs, rhs, source),
+885            ast::BinOperator::Mod => self.builder.modulo(lhs, rhs, source),
+886            ast::BinOperator::Pow => self.builder.pow(lhs, rhs, source),
+887            ast::BinOperator::LShift => self.builder.shl(lhs, rhs, source),
+888            ast::BinOperator::RShift => self.builder.shr(lhs, rhs, source),
+889            ast::BinOperator::BitOr => self.builder.bit_or(lhs, rhs, source),
+890            ast::BinOperator::BitXor => self.builder.bit_xor(lhs, rhs, source),
+891            ast::BinOperator::BitAnd => self.builder.bit_and(lhs, rhs, source),
+892        }
+893    }
+894
+895    fn lower_comp_op(
+896        &mut self,
+897        op: ast::CompOperator,
+898        lhs: ValueId,
+899        rhs: ValueId,
+900        source: SourceInfo,
+901    ) -> InstId {
+902        match op {
+903            ast::CompOperator::Eq => self.builder.eq(lhs, rhs, source),
+904            ast::CompOperator::NotEq => self.builder.ne(lhs, rhs, source),
+905            ast::CompOperator::Lt => self.builder.lt(lhs, rhs, source),
+906            ast::CompOperator::LtE => self.builder.le(lhs, rhs, source),
+907            ast::CompOperator::Gt => self.builder.gt(lhs, rhs, source),
+908            ast::CompOperator::GtE => self.builder.ge(lhs, rhs, source),
+909        }
+910    }
+911
+912    fn resolve_generics_args(
+913        &mut self,
+914        method: &analyzer_items::FunctionId,
+915        args: &[Id<Value>],
+916    ) -> BTreeMap<SmolStr, analyzer_types::TypeId> {
+917        method
+918            .signature(self.db.upcast())
+919            .params
+920            .iter()
+921            .zip(args.iter().map(|val| {
+922                self.builder
+923                    .value_ty(*val)
+924                    .analyzer_ty(self.db)
+925                    .expect("invalid parameter")
+926            }))
+927            .filter_map(|(param, typ)| {
+928                if let Type::Generic(generic) =
+929                    param.typ.clone().unwrap().deref_typ(self.db.upcast())
+930                {
+931                    Some((generic.name, typ))
+932                } else {
+933                    None
+934                }
+935            })
+936            .collect::<BTreeMap<_, _>>()
+937    }
+938
+939    fn lower_function_id(
+940        &mut self,
+941        function: &analyzer_items::FunctionId,
+942        args: &[Id<Value>],
+943    ) -> FunctionId {
+944        let resolved_generics = self.resolve_generics_args(function, args);
+945        if function.is_generic(self.db.upcast()) {
+946            self.db
+947                .mir_lowered_monomorphized_func_signature(*function, resolved_generics)
+948        } else {
+949            self.db.mir_lowered_func_signature(*function)
+950        }
+951    }
+952
+953    fn lower_call(
+954        &mut self,
+955        func: &Node<ast::Expr>,
+956        _generic_args: &Option<Node<Vec<ast::GenericArg>>>,
+957        args: &[Node<ast::CallArg>],
+958        ty: TypeId,
+959        source: SourceInfo,
+960    ) -> InstId {
+961        let call_type = &self.analyzer_body.calls[&func.id];
+962
+963        let mut args: Vec<_> = args
+964            .iter()
+965            .map(|arg| self.lower_expr_to_value(&arg.kind.value))
+966            .collect();
+967
+968        match call_type {
+969            AnalyzerCallType::BuiltinFunction(GlobalFunction::Keccak256) => {
+970                self.builder.keccak256(args[0], source)
+971            }
+972
+973            AnalyzerCallType::Intrinsic(intrinsic) => {
+974                self.builder
+975                    .yul_intrinsic((*intrinsic).into(), args, source)
+976            }
+977
+978            AnalyzerCallType::BuiltinValueMethod { method, .. } => {
+979                let arg = self.lower_method_receiver(func);
+980                match method {
+981                    ValueMethod::ToMem => self.builder.mem_copy(arg, source),
+982                    ValueMethod::AbiEncode => self.builder.abi_encode(arg, source),
+983                }
+984            }
+985
+986            // We ignores `args[0]', which represents `context` and not used for now.
+987            AnalyzerCallType::BuiltinAssociatedFunction { contract, function } => match function {
+988                ContractTypeMethod::Create => self.builder.create(args[1], *contract, source),
+989                ContractTypeMethod::Create2 => {
+990                    self.builder.create2(args[1], args[2], *contract, source)
+991                }
+992            },
+993
+994            AnalyzerCallType::AssociatedFunction { function, .. }
+995            | AnalyzerCallType::Pure(function) => {
+996                let func_id = self.lower_function_id(function, &args);
+997                self.builder.call(func_id, args, CallType::Internal, source)
+998            }
+999
+1000            AnalyzerCallType::ValueMethod { method, .. } => {
+1001                let mut method_args = vec![self.lower_method_receiver(func)];
+1002                let func_id = self.lower_function_id(method, &args);
+1003
+1004                method_args.append(&mut args);
+1005
+1006                self.builder
+1007                    .call(func_id, method_args, CallType::Internal, source)
+1008            }
+1009            AnalyzerCallType::TraitValueMethod {
+1010                trait_id, method, ..
+1011            } if trait_id.is_std_trait(self.db.upcast(), EMITTABLE_TRAIT_NAME)
+1012                && method.name(self.db.upcast()) == EMIT_FN_NAME =>
+1013            {
+1014                let event = self.lower_method_receiver(func);
+1015                self.builder.emit(event, source)
+1016            }
+1017            AnalyzerCallType::TraitValueMethod {
+1018                method,
+1019                trait_id,
+1020                generic_type,
+1021                ..
+1022            } => {
+1023                let mut method_args = vec![self.lower_method_receiver(func)];
+1024                method_args.append(&mut args);
+1025
+1026                let concrete_type = self
+1027                    .func
+1028                    .signature(self.db)
+1029                    .resolved_generics
+1030                    .get(&generic_type.name)
+1031                    .cloned()
+1032                    .expect("unresolved generic type");
+1033
+1034                let impl_ = concrete_type
+1035                    .get_impl_for(self.db.upcast(), *trait_id)
+1036                    .expect("missing impl");
+1037
+1038                let function = impl_
+1039                    .function(self.db.upcast(), &method.name(self.db.upcast()))
+1040                    .expect("missing function");
+1041
+1042                let func_id = self.db.mir_lowered_func_signature(function);
+1043                self.builder
+1044                    .call(func_id, method_args, CallType::Internal, source)
+1045            }
+1046            AnalyzerCallType::External { function, .. } => {
+1047                let receiver = self.lower_method_receiver(func);
+1048                debug_assert!(self.builder.value_ty(receiver).is_address(self.db));
+1049
+1050                let mut method_args = vec![receiver];
+1051                method_args.append(&mut args);
+1052                let func_id = self.db.mir_lowered_func_signature(*function);
+1053                self.builder
+1054                    .call(func_id, method_args, CallType::External, source)
+1055            }
+1056
+1057            AnalyzerCallType::TypeConstructor(to_ty) => {
+1058                if to_ty.is_string(self.db.upcast()) {
+1059                    let arg = *args.last().unwrap();
+1060                    self.builder.mem_copy(arg, source)
+1061                } else if ty.is_primitive(self.db) {
+1062                    // TODO: Ignore `ctx` for now.
+1063                    let arg = *args.last().unwrap();
+1064                    let arg_ty = self.builder.value_ty(arg);
+1065                    if arg_ty == ty {
+1066                        self.builder.bind(arg, source)
+1067                    } else {
+1068                        debug_assert!(!arg_ty.is_ptr(self.db)); // Should be explicitly `Load`ed
+1069                        self.builder.primitive_cast(arg, ty, source)
+1070                    }
+1071                } else if ty.is_aggregate(self.db) {
+1072                    self.builder.aggregate_construct(ty, args, source)
+1073                } else {
+1074                    unreachable!()
+1075                }
+1076            }
+1077
+1078            AnalyzerCallType::EnumConstructor(variant) => {
+1079                let tag_type = ty.enum_disc_type(self.db);
+1080                let tag = self.make_imm(variant.disc(self.db.upcast()), tag_type);
+1081                let data_ty = ty.enum_variant_type(self.db, *variant);
+1082                let enum_args = if data_ty.is_unit(self.db) {
+1083                    vec![tag, self.make_unit()]
+1084                } else {
+1085                    std::iter::once(tag).chain(args).collect()
+1086                };
+1087                self.builder.aggregate_construct(ty, enum_args, source)
+1088            }
+1089        }
+1090    }
+1091
+1092    // FIXME: This is ugly hack to properly analyze method call. Remove this when  https://github.com/ethereum/fe/issues/670 is resolved.
+1093    fn lower_method_receiver(&mut self, receiver: &Node<ast::Expr>) -> ValueId {
+1094        match &receiver.kind {
+1095            ast::Expr::Attribute { value, .. } => self.lower_expr_to_value(value),
+1096            _ => unreachable!(),
+1097        }
+1098    }
+1099
+1100    fn lower_aggregate_access(
+1101        &mut self,
+1102        expr: &Node<ast::Expr>,
+1103        indices: &mut Vec<ValueId>,
+1104    ) -> ValueId {
+1105        match &expr.kind {
+1106            ast::Expr::Attribute { value, attr } => {
+1107                let index = self.expr_ty(value).index_from_fname(self.db, &attr.kind);
+1108                let value = self.lower_aggregate_access(value, indices);
+1109                indices.push(self.make_u256_imm(index));
+1110                value
+1111            }
+1112
+1113            ast::Expr::Subscript { value, index }
+1114                if self.expr_ty(value).deref(self.db).is_aggregate(self.db) =>
+1115            {
+1116                let value = self.lower_aggregate_access(value, indices);
+1117                indices.push(self.lower_expr_to_value(index));
+1118                value
+1119            }
+1120
+1121            _ => self.lower_expr_to_value(expr),
+1122        }
+1123    }
+1124
+1125    fn make_unit(&mut self) -> ValueId {
+1126        let unit_ty = analyzer_types::TypeId::unit(self.db.upcast());
+1127        let unit_ty = self.db.mir_lowered_type(unit_ty);
+1128        self.builder.make_unit(unit_ty)
+1129    }
+1130
+1131    fn make_local_constant(
+1132        &mut self,
+1133        name: SmolStr,
+1134        ty: TypeId,
+1135        value: ConstantValue,
+1136        source: SourceInfo,
+1137    ) -> ValueId {
+1138        let function_id = self.builder.func_id();
+1139        let constant = Constant {
+1140            name,
+1141            value,
+1142            ty,
+1143            module_id: function_id.module(self.db),
+1144            source,
+1145        };
+1146
+1147        let constant_id = self.db.mir_intern_const(constant.into());
+1148        self.builder.make_constant(constant_id, ty)
+1149    }
+1150
+1151    fn u256_ty(&mut self) -> TypeId {
+1152        self.db
+1153            .mir_intern_type(ir::Type::new(ir::TypeKind::U256, None).into())
+1154    }
+1155
+1156    fn bool_ty(&mut self) -> TypeId {
+1157        self.db
+1158            .mir_intern_type(ir::Type::new(ir::TypeKind::Bool, None).into())
+1159    }
+1160
+1161    fn enter_loop_scope(&mut self, entry: BasicBlockId, exit: BasicBlockId) {
+1162        let new_scope = Scope::loop_scope(self.current_scope, entry, exit);
+1163        self.current_scope = self.scopes.alloc(new_scope);
+1164    }
+1165
+1166    /// Resolve a name appeared in an expression.
+1167    /// NOTE: Don't call this to resolve method receiver.
+1168    fn resolve_name(&mut self, name: &str) -> ValueId {
+1169        if let Some(value) = self.scopes[self.current_scope].resolve_name(&self.scopes, name) {
+1170            // Name is defined in local.
+1171            value
+1172        } else {
+1173            // Name is defined in global.
+1174            let func_id = self.builder.func_id();
+1175            let module = func_id.module(self.db);
+1176            let constant = match module
+1177                .resolve_name(self.db.upcast(), name)
+1178                .unwrap()
+1179                .unwrap()
+1180            {
+1181                NamedThing::Item(analyzer_items::Item::Constant(id)) => {
+1182                    self.db.mir_lowered_constant(id)
+1183                }
+1184                _ => panic!("name defined in global must be constant"),
+1185            };
+1186            let ty = constant.ty(self.db);
+1187            self.builder.make_constant(constant, ty)
+1188        }
+1189    }
+1190
+1191    /// Resolve a path appeared in an expression.
+1192    /// NOTE: Don't call this to resolve method receiver.
+1193    fn resolve_path(&mut self, path: &ast::Path, source: SourceInfo) -> ValueId {
+1194        let func_id = self.builder.func_id();
+1195        let module = func_id.module(self.db);
+1196        match module.resolve_path(self.db.upcast(), path).value.unwrap() {
+1197            NamedThing::Item(analyzer_items::Item::Constant(id)) => {
+1198                let constant = self.db.mir_lowered_constant(id);
+1199                let ty = constant.ty(self.db);
+1200                self.builder.make_constant(constant, ty)
+1201            }
+1202            NamedThing::EnumVariant(variant) => {
+1203                let enum_ty = self
+1204                    .db
+1205                    .mir_lowered_type(variant.parent(self.db.upcast()).as_type(self.db.upcast()));
+1206                let tag_type = enum_ty.enum_disc_type(self.db);
+1207                let tag = self.make_imm(variant.disc(self.db.upcast()), tag_type);
+1208                let data = self.make_unit();
+1209                let enum_args = vec![tag, data];
+1210                let inst = self.builder.aggregate_construct(enum_ty, enum_args, source);
+1211                self.map_to_tmp(inst, enum_ty)
+1212            }
+1213            _ => panic!("path defined in global must be constant"),
+1214        }
+1215    }
+1216
+1217    fn scope(&self) -> &Scope {
+1218        &self.scopes[self.current_scope]
+1219    }
+1220
+1221    fn scope_mut(&mut self) -> &mut Scope {
+1222        &mut self.scopes[self.current_scope]
+1223    }
+1224}
+1225
+1226#[derive(Debug)]
+1227struct Scope {
+1228    parent: Option<ScopeId>,
+1229    loop_entry: Option<BasicBlockId>,
+1230    loop_exit: Option<BasicBlockId>,
+1231    variables: FxHashMap<SmolStr, ValueId>,
+1232    // TODO: Remove the below two fields when `for` loop desugaring is implemented.
+1233    loop_idx: Option<ValueId>,
+1234    maximum_iter_count: Option<ValueId>,
+1235}
+1236
+1237impl Scope {
+1238    fn root(db: &dyn MirDb, func: FunctionId, builder: &mut BodyBuilder) -> Self {
+1239        let mut root = Self {
+1240            parent: None,
+1241            loop_entry: None,
+1242            loop_exit: None,
+1243            variables: FxHashMap::default(),
+1244            loop_idx: None,
+1245            maximum_iter_count: None,
+1246        };
+1247
+1248        // Declare function parameters.
+1249        for param in &func.signature(db).params {
+1250            let local = Local::arg_local(param.name.clone(), param.ty, param.source.clone());
+1251            let value_id = builder.store_func_arg(local);
+1252            root.declare_var(&param.name, value_id)
+1253        }
+1254
+1255        root
+1256    }
+1257
+1258    fn with_parent(parent: ScopeId) -> Self {
+1259        Self {
+1260            parent: parent.into(),
+1261            loop_entry: None,
+1262            loop_exit: None,
+1263            variables: FxHashMap::default(),
+1264            loop_idx: None,
+1265            maximum_iter_count: None,
+1266        }
+1267    }
+1268
+1269    fn loop_scope(parent: ScopeId, loop_entry: BasicBlockId, loop_exit: BasicBlockId) -> Self {
+1270        Self {
+1271            parent: parent.into(),
+1272            loop_entry: loop_entry.into(),
+1273            loop_exit: loop_exit.into(),
+1274            variables: FxHashMap::default(),
+1275            loop_idx: None,
+1276            maximum_iter_count: None,
+1277        }
+1278    }
+1279
+1280    fn loop_entry(&self, scopes: &Arena<Scope>) -> BasicBlockId {
+1281        match self.loop_entry {
+1282            Some(entry) => entry,
+1283            None => scopes[self.parent.unwrap()].loop_entry(scopes),
+1284        }
+1285    }
+1286
+1287    fn loop_exit(&self, scopes: &Arena<Scope>) -> BasicBlockId {
+1288        match self.loop_exit {
+1289            Some(exit) => exit,
+1290            None => scopes[self.parent.unwrap()].loop_exit(scopes),
+1291        }
+1292    }
+1293
+1294    fn loop_idx(&self, scopes: &Arena<Scope>) -> Option<ValueId> {
+1295        match self.loop_idx {
+1296            Some(idx) => Some(idx),
+1297            None => scopes[self.parent?].loop_idx(scopes),
+1298        }
+1299    }
+1300
+1301    fn maximum_iter_count(&self, scopes: &Arena<Scope>) -> Option<ValueId> {
+1302        match self.maximum_iter_count {
+1303            Some(count) => Some(count),
+1304            None => scopes[self.parent?].maximum_iter_count(scopes),
+1305        }
+1306    }
+1307
+1308    fn declare_var(&mut self, name: &SmolStr, value: ValueId) {
+1309        debug_assert!(!self.variables.contains_key(name));
+1310
+1311        self.variables.insert(name.clone(), value);
+1312    }
+1313
+1314    fn resolve_name(&self, scopes: &Arena<Scope>, name: &str) -> Option<ValueId> {
+1315        match self.variables.get(name) {
+1316            Some(id) => Some(*id),
+1317            None => scopes[self.parent?].resolve_name(scopes, name),
+1318        }
+1319    }
+1320}
+1321
+1322fn self_arg_source(db: &dyn MirDb, func: analyzer_items::FunctionId) -> SourceInfo {
+1323    func.data(db.upcast())
+1324        .ast
+1325        .kind
+1326        .sig
+1327        .kind
+1328        .args
+1329        .iter()
+1330        .find(|arg| matches!(arg.kind, ast::FunctionArg::Self_ { .. }))
+1331        .unwrap()
+1332        .into()
+1333}
+1334
+1335fn arg_source(db: &dyn MirDb, func: analyzer_items::FunctionId, arg_name: &str) -> SourceInfo {
+1336    func.data(db.upcast())
+1337        .ast
+1338        .kind
+1339        .sig
+1340        .kind
+1341        .args
+1342        .iter()
+1343        .find_map(|arg| match &arg.kind {
+1344            ast::FunctionArg::Regular { name, .. } => {
+1345                if name.kind == arg_name {
+1346                    Some(name.into())
+1347                } else {
+1348                    None
+1349                }
+1350            }
+1351            ast::FunctionArg::Self_ { .. } => None,
+1352        })
+1353        .unwrap()
+1354}
+1355
+1356fn make_param(
+1357    db: &dyn MirDb,
+1358    name: impl Into<SmolStr>,
+1359    ty: analyzer_types::TypeId,
+1360    source: SourceInfo,
+1361) -> FunctionParam {
+1362    FunctionParam {
+1363        name: name.into(),
+1364        ty: db.mir_lowered_type(ty),
+1365        source,
+1366    }
+1367}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/mod.rs.html b/compiler-docs/src/fe_mir/lower/mod.rs.html new file mode 100644 index 0000000000..da96068652 --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/mod.rs.html @@ -0,0 +1,4 @@ +mod.rs - source

fe_mir/lower/
mod.rs

1pub mod function;
+2pub mod types;
+3
+4mod pattern_match;
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/pattern_match/decision_tree.rs.html b/compiler-docs/src/fe_mir/lower/pattern_match/decision_tree.rs.html new file mode 100644 index 0000000000..32f1bbf19a --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/pattern_match/decision_tree.rs.html @@ -0,0 +1,576 @@ +decision_tree.rs - source

fe_mir/lower/pattern_match/
decision_tree.rs

1//! This module contains the decision tree definition and its construction
+2//! function.
+3//! The algorithm for efficient decision tree construction is mainly based on [Compiling pattern matching to good decision trees](https://dl.acm.org/doi/10.1145/1411304.1411311).
+4use std::io;
+5
+6use fe_analyzer::{
+7    pattern_analysis::{
+8        ConstructorKind, PatternMatrix, PatternRowVec, SigmaSet, SimplifiedPattern,
+9        SimplifiedPatternKind,
+10    },
+11    AnalyzerDb,
+12};
+13use indexmap::IndexMap;
+14use smol_str::SmolStr;
+15
+16use super::tree_vis::TreeRenderer;
+17
+18pub fn build_decision_tree(
+19    db: &dyn AnalyzerDb,
+20    pattern_matrix: &PatternMatrix,
+21    policy: ColumnSelectionPolicy,
+22) -> DecisionTree {
+23    let builder = DecisionTreeBuilder::new(policy);
+24    let simplified_arms = SimplifiedArmMatrix::new(pattern_matrix);
+25
+26    builder.build(db, simplified_arms)
+27}
+28
+29#[derive(Debug)]
+30pub enum DecisionTree {
+31    Leaf(LeafNode),
+32    Switch(SwitchNode),
+33}
+34
+35impl DecisionTree {
+36    #[allow(unused)]
+37    pub fn dump_dot<W>(&self, db: &dyn AnalyzerDb, w: &mut W) -> io::Result<()>
+38    where
+39        W: io::Write,
+40    {
+41        let renderer = TreeRenderer::new(db, self);
+42        dot2::render(&renderer, w).map_err(|err| match err {
+43            dot2::Error::Io(err) => err,
+44            _ => panic!("invalid graphviz id"),
+45        })
+46    }
+47}
+48
+49#[derive(Debug)]
+50pub struct LeafNode {
+51    pub arm_idx: usize,
+52    pub binds: IndexMap<(SmolStr, usize), Occurrence>,
+53}
+54
+55impl LeafNode {
+56    fn new(arm: SimplifiedArm, occurrences: &[Occurrence]) -> Self {
+57        let arm_idx = arm.body;
+58        let binds = arm.finalize_binds(occurrences);
+59        Self { arm_idx, binds }
+60    }
+61}
+62
+63#[derive(Debug)]
+64pub struct SwitchNode {
+65    pub occurrence: Occurrence,
+66    pub arms: Vec<(Case, DecisionTree)>,
+67}
+68
+69#[derive(Debug, Clone, Copy)]
+70pub enum Case {
+71    Ctor(ConstructorKind),
+72    Default,
+73}
+74
+75#[derive(Debug, Clone, Default)]
+76pub struct ColumnSelectionPolicy(Vec<ColumnScoringFunction>);
+77
+78impl ColumnSelectionPolicy {
+79    /// The score of column i is the sum of the negation of the arities of
+80    /// constructors in sigma(i).
+81    pub fn arity(&mut self) -> &mut Self {
+82        self.add_heuristic(ColumnScoringFunction::Arity)
+83    }
+84
+85    /// The score is the negation of the cardinal of sigma(i), C(Sigma(i)).
+86    /// If sigma(i) is NOT complete, the resulting score is C(Sigma(i)) - 1.
+87    pub fn small_branching(&mut self) -> &mut Self {
+88        self.add_heuristic(ColumnScoringFunction::SmallBranching)
+89    }
+90
+91    /// The score is the number of needed rows of column i in the necessity
+92    /// matrix.
+93    #[allow(unused)]
+94    pub fn needed_column(&mut self) -> &mut Self {
+95        self.add_heuristic(ColumnScoringFunction::NeededColumn)
+96    }
+97
+98    /// The score is the larger row index j such that column i is needed for all
+99    /// rows j′; 1 ≤ j′ ≤ j.
+100    pub fn needed_prefix(&mut self) -> &mut Self {
+101        self.add_heuristic(ColumnScoringFunction::NeededPrefix)
+102    }
+103
+104    fn select_column(&self, db: &dyn AnalyzerDb, mat: &SimplifiedArmMatrix) -> usize {
+105        let mut candidates: Vec<_> = (0..mat.ncols()).collect();
+106
+107        for scoring_fn in &self.0 {
+108            let mut max_score = i32::MIN;
+109            for col in std::mem::take(&mut candidates) {
+110                let score = scoring_fn.score(db, mat, col);
+111                match score.cmp(&max_score) {
+112                    std::cmp::Ordering::Less => {}
+113                    std::cmp::Ordering::Equal => {
+114                        candidates.push(col);
+115                    }
+116                    std::cmp::Ordering::Greater => {
+117                        candidates = vec![col];
+118                        max_score = score;
+119                    }
+120                }
+121            }
+122
+123            if candidates.len() == 1 {
+124                return candidates.pop().unwrap();
+125            }
+126        }
+127
+128        // If there are more than one candidates remained, filter the columns with the
+129        // shortest occurrences among the candidates, then select the rightmost one.
+130        // This heuristics corresponds to the R pseudo heuristic in the paper.
+131        let mut shortest_occurrences = usize::MAX;
+132        for col in std::mem::take(&mut candidates) {
+133            let occurrences = mat.occurrences[col].len();
+134            match occurrences.cmp(&shortest_occurrences) {
+135                std::cmp::Ordering::Less => {
+136                    candidates = vec![col];
+137                    shortest_occurrences = occurrences;
+138                }
+139                std::cmp::Ordering::Equal => {
+140                    candidates.push(col);
+141                }
+142                std::cmp::Ordering::Greater => {}
+143            }
+144        }
+145
+146        candidates.pop().unwrap()
+147    }
+148
+149    fn add_heuristic(&mut self, heuristic: ColumnScoringFunction) -> &mut Self {
+150        debug_assert!(!self.0.contains(&heuristic));
+151        self.0.push(heuristic);
+152        self
+153    }
+154}
+155
+156#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+157pub struct Occurrence(Vec<usize>);
+158
+159impl Occurrence {
+160    pub fn new() -> Self {
+161        Self(vec![])
+162    }
+163
+164    pub fn iter(&self) -> impl Iterator<Item = &usize> {
+165        self.0.iter()
+166    }
+167
+168    pub fn parent(&self) -> Option<Occurrence> {
+169        let mut inner = self.0.clone();
+170        inner.pop().map(|_| Occurrence(inner))
+171    }
+172
+173    pub fn last_index(&self) -> Option<usize> {
+174        self.0.last().cloned()
+175    }
+176
+177    fn phi_specialize(&self, db: &dyn AnalyzerDb, ctor: ConstructorKind) -> Vec<Self> {
+178        let arity = ctor.arity(db);
+179        (0..arity)
+180            .map(|i| {
+181                let mut inner = self.0.clone();
+182                inner.push(i);
+183                Self(inner)
+184            })
+185            .collect()
+186    }
+187
+188    fn len(&self) -> usize {
+189        self.0.len()
+190    }
+191}
+192
+193struct DecisionTreeBuilder {
+194    policy: ColumnSelectionPolicy,
+195}
+196
+197impl DecisionTreeBuilder {
+198    fn new(policy: ColumnSelectionPolicy) -> Self {
+199        DecisionTreeBuilder { policy }
+200    }
+201
+202    fn build(&self, db: &dyn AnalyzerDb, mut mat: SimplifiedArmMatrix) -> DecisionTree {
+203        debug_assert!(mat.nrows() > 0, "unexhausted pattern matrix");
+204
+205        if mat.is_first_arm_satisfied() {
+206            mat.arms.truncate(1);
+207            return DecisionTree::Leaf(LeafNode::new(mat.arms.pop().unwrap(), &mat.occurrences));
+208        }
+209
+210        let col = self.policy.select_column(db, &mat);
+211        mat.swap(col);
+212
+213        let mut switch_arms = vec![];
+214        let occurrence = &mat.occurrences[0];
+215        let sigma_set = mat.sigma_set(0);
+216        for &ctor in sigma_set.iter() {
+217            let destructured_mat = mat.phi_specialize(db, ctor, occurrence);
+218            let subtree = self.build(db, destructured_mat);
+219            switch_arms.push((Case::Ctor(ctor), subtree));
+220        }
+221
+222        if !sigma_set.is_complete(db) {
+223            let destructured_mat = mat.d_specialize(db, occurrence);
+224            let subtree = self.build(db, destructured_mat);
+225            switch_arms.push((Case::Default, subtree));
+226        }
+227
+228        DecisionTree::Switch(SwitchNode {
+229            occurrence: occurrence.clone(),
+230            arms: switch_arms,
+231        })
+232    }
+233}
+234
+235#[derive(Clone, Debug)]
+236struct SimplifiedArmMatrix {
+237    arms: Vec<SimplifiedArm>,
+238    occurrences: Vec<Occurrence>,
+239}
+240
+241impl SimplifiedArmMatrix {
+242    fn new(mat: &PatternMatrix) -> Self {
+243        let cols = mat.ncols();
+244        let arms: Vec<_> = mat
+245            .rows()
+246            .iter()
+247            .enumerate()
+248            .map(|(body, pat)| SimplifiedArm::new(pat, body))
+249            .collect();
+250        let occurrences = vec![Occurrence::new(); cols];
+251
+252        SimplifiedArmMatrix { arms, occurrences }
+253    }
+254
+255    fn nrows(&self) -> usize {
+256        self.arms.len()
+257    }
+258
+259    fn ncols(&self) -> usize {
+260        self.arms[0].pat_vec.len()
+261    }
+262
+263    fn pat(&self, row: usize, col: usize) -> &SimplifiedPattern {
+264        self.arms[row].pat(col)
+265    }
+266
+267    fn necessity_matrix(&self, db: &dyn AnalyzerDb) -> NecessityMatrix {
+268        NecessityMatrix::from_mat(db, self)
+269    }
+270
+271    fn reduced_pat_mat(&self, col: usize) -> PatternMatrix {
+272        let mut rows = Vec::with_capacity(self.nrows());
+273        for arm in self.arms.iter() {
+274            let reduced_pat_vec = arm
+275                .pat_vec
+276                .pats()
+277                .iter()
+278                .enumerate()
+279                .filter(|(i, _)| (*i != col))
+280                .map(|(_, pat)| pat.clone())
+281                .collect();
+282            rows.push(PatternRowVec::new(reduced_pat_vec));
+283        }
+284
+285        PatternMatrix::new(rows)
+286    }
+287
+288    /// Returns the constructor set in the column i.
+289    fn sigma_set(&self, col: usize) -> SigmaSet {
+290        SigmaSet::from_rows(self.arms.iter().map(|arm| &arm.pat_vec), col)
+291    }
+292
+293    fn is_first_arm_satisfied(&self) -> bool {
+294        self.arms[0]
+295            .pat_vec
+296            .pats()
+297            .iter()
+298            .all(SimplifiedPattern::is_wildcard)
+299    }
+300
+301    fn phi_specialize(
+302        &self,
+303        db: &dyn AnalyzerDb,
+304        ctor: ConstructorKind,
+305        occurrence: &Occurrence,
+306    ) -> Self {
+307        let mut new_arms = Vec::new();
+308        for arm in &self.arms {
+309            new_arms.extend_from_slice(&arm.phi_specialize(db, ctor, occurrence));
+310        }
+311
+312        let mut new_occurrences = self.occurrences[0].phi_specialize(db, ctor);
+313        new_occurrences.extend_from_slice(&self.occurrences.as_slice()[1..]);
+314
+315        Self {
+316            arms: new_arms,
+317            occurrences: new_occurrences,
+318        }
+319    }
+320
+321    fn d_specialize(&self, db: &dyn AnalyzerDb, occurrence: &Occurrence) -> Self {
+322        let mut new_arms = Vec::new();
+323        for arm in &self.arms {
+324            new_arms.extend_from_slice(&arm.d_specialize(db, occurrence));
+325        }
+326
+327        Self {
+328            arms: new_arms,
+329            occurrences: self.occurrences.as_slice()[1..].to_vec(),
+330        }
+331    }
+332
+333    fn swap(&mut self, i: usize) {
+334        for arm in &mut self.arms {
+335            arm.swap(0, i)
+336        }
+337        self.occurrences.swap(0, i);
+338    }
+339}
+340
+341#[derive(Clone, Debug)]
+342struct SimplifiedArm {
+343    pat_vec: PatternRowVec,
+344    body: usize,
+345    binds: IndexMap<(SmolStr, usize), Occurrence>,
+346}
+347
+348impl SimplifiedArm {
+349    fn new(pat: &PatternRowVec, body: usize) -> Self {
+350        let pat = PatternRowVec::new(pat.inner.iter().map(generalize_pattern).collect());
+351        Self {
+352            pat_vec: pat,
+353            body,
+354            binds: IndexMap::new(),
+355        }
+356    }
+357
+358    fn len(&self) -> usize {
+359        self.pat_vec.len()
+360    }
+361
+362    fn pat(&self, col: usize) -> &SimplifiedPattern {
+363        &self.pat_vec.inner[col]
+364    }
+365
+366    fn phi_specialize(
+367        &self,
+368        db: &dyn AnalyzerDb,
+369        ctor: ConstructorKind,
+370        occurrence: &Occurrence,
+371    ) -> Vec<Self> {
+372        let body = self.body;
+373        let binds = self.new_binds(occurrence);
+374
+375        self.pat_vec
+376            .phi_specialize(db, ctor)
+377            .into_iter()
+378            .map(|pat| SimplifiedArm {
+379                pat_vec: pat,
+380                body,
+381                binds: binds.clone(),
+382            })
+383            .collect()
+384    }
+385
+386    fn d_specialize(&self, db: &dyn AnalyzerDb, occurrence: &Occurrence) -> Vec<Self> {
+387        let body = self.body;
+388        let binds = self.new_binds(occurrence);
+389
+390        self.pat_vec
+391            .d_specialize(db)
+392            .into_iter()
+393            .map(|pat| SimplifiedArm {
+394                pat_vec: pat,
+395                body,
+396                binds: binds.clone(),
+397            })
+398            .collect()
+399    }
+400
+401    fn new_binds(&self, occurrence: &Occurrence) -> IndexMap<(SmolStr, usize), Occurrence> {
+402        let mut binds = self.binds.clone();
+403        if let Some(SimplifiedPatternKind::WildCard(Some(bind))) =
+404            self.pat_vec.head().map(|pat| &pat.kind)
+405        {
+406            binds.entry(bind.clone()).or_insert(occurrence.clone());
+407        }
+408        binds
+409    }
+410
+411    fn finalize_binds(self, occurrences: &[Occurrence]) -> IndexMap<(SmolStr, usize), Occurrence> {
+412        debug_assert!(self.len() == occurrences.len());
+413
+414        let mut binds = self.binds;
+415        for (pat, occurrence) in self.pat_vec.pats().iter().zip(occurrences.iter()) {
+416            debug_assert!(pat.is_wildcard());
+417
+418            if let SimplifiedPatternKind::WildCard(Some(bind)) = &pat.kind {
+419                binds.entry(bind.clone()).or_insert(occurrence.clone());
+420            }
+421        }
+422
+423        binds
+424    }
+425
+426    fn swap(&mut self, i: usize, j: usize) {
+427        self.pat_vec.swap(i, j);
+428    }
+429}
+430
+431struct NecessityMatrix {
+432    data: Vec<bool>,
+433    ncol: usize,
+434    nrow: usize,
+435}
+436
+437impl NecessityMatrix {
+438    fn new(ncol: usize, nrow: usize) -> Self {
+439        let data = vec![false; ncol * nrow];
+440        Self { data, ncol, nrow }
+441    }
+442
+443    fn from_mat(db: &dyn AnalyzerDb, mat: &SimplifiedArmMatrix) -> Self {
+444        let nrow = mat.nrows();
+445        let ncol = mat.ncols();
+446        let mut necessity_mat = Self::new(ncol, nrow);
+447
+448        necessity_mat.compute(db, mat);
+449        necessity_mat
+450    }
+451
+452    fn compute(&mut self, db: &dyn AnalyzerDb, mat: &SimplifiedArmMatrix) {
+453        for row in 0..self.nrow {
+454            for col in 0..self.ncol {
+455                let pat = mat.pat(row, col);
+456                let pos = self.pos(row, col);
+457
+458                if !pat.is_wildcard() {
+459                    self.data[pos] = true;
+460                } else {
+461                    let reduced_pat_mat = mat.reduced_pat_mat(col);
+462                    self.data[pos] = !reduced_pat_mat.is_row_useful(db, row);
+463                }
+464            }
+465        }
+466    }
+467
+468    fn compute_needed_column_score(&self, col: usize) -> i32 {
+469        let mut num = 0;
+470        for i in 0..self.nrow {
+471            if self.data[self.pos(i, col)] {
+472                num += 1;
+473            }
+474        }
+475
+476        num
+477    }
+478
+479    fn compute_needed_prefix_score(&self, col: usize) -> i32 {
+480        let mut current_row = 0;
+481        for i in 0..self.nrow {
+482            if self.data[self.pos(i, col)] {
+483                current_row += 1;
+484            } else {
+485                return current_row;
+486            }
+487        }
+488
+489        current_row
+490    }
+491
+492    fn pos(&self, row: usize, col: usize) -> usize {
+493        self.ncol * row + col
+494    }
+495}
+496
+497#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+498enum ColumnScoringFunction {
+499    /// The score of column i is the sum of the negation of the arities of
+500    /// constructors in sigma(i).
+501    Arity,
+502
+503    /// The score is the negation of the cardinal of sigma(i), C(Sigma(i)).
+504    /// If sigma(i) is NOT complete, the resulting score is C(Sigma(i)) - 1.
+505    SmallBranching,
+506
+507    /// The score is the number of needed rows of column i in the necessity
+508    /// matrix.
+509    NeededColumn,
+510
+511    NeededPrefix,
+512}
+513
+514impl ColumnScoringFunction {
+515    fn score(&self, db: &dyn AnalyzerDb, mat: &SimplifiedArmMatrix, col: usize) -> i32 {
+516        match self {
+517            ColumnScoringFunction::Arity => mat
+518                .sigma_set(col)
+519                .iter()
+520                .map(|c| -(c.arity(db) as i32))
+521                .sum(),
+522
+523            ColumnScoringFunction::SmallBranching => {
+524                let sigma_set = mat.sigma_set(col);
+525                let score = -(mat.sigma_set(col).len() as i32);
+526                if sigma_set.is_complete(db) {
+527                    score
+528                } else {
+529                    score - 1
+530                }
+531            }
+532
+533            ColumnScoringFunction::NeededColumn => {
+534                mat.necessity_matrix(db).compute_needed_column_score(col)
+535            }
+536
+537            ColumnScoringFunction::NeededPrefix => {
+538                mat.necessity_matrix(db).compute_needed_prefix_score(col)
+539            }
+540        }
+541    }
+542}
+543
+544fn generalize_pattern(pat: &SimplifiedPattern) -> SimplifiedPattern {
+545    match &pat.kind {
+546        SimplifiedPatternKind::WildCard(_) => pat.clone(),
+547
+548        SimplifiedPatternKind::Constructor { kind, fields } => {
+549            let fields = fields.iter().map(generalize_pattern).collect();
+550            let kind = SimplifiedPatternKind::Constructor {
+551                kind: *kind,
+552                fields,
+553            };
+554            SimplifiedPattern::new(kind, pat.ty)
+555        }
+556
+557        SimplifiedPatternKind::Or(pats) => {
+558            let mut gen_pats = vec![];
+559            for pat in pats {
+560                let gen_pad = generalize_pattern(pat);
+561                if gen_pad.is_wildcard() {
+562                    gen_pats.push(gen_pad);
+563                    break;
+564                } else {
+565                    gen_pats.push(gen_pad);
+566                }
+567            }
+568
+569            if gen_pats.len() == 1 {
+570                gen_pats.pop().unwrap()
+571            } else {
+572                SimplifiedPattern::new(SimplifiedPatternKind::Or(gen_pats), pat.ty)
+573            }
+574        }
+575    }
+576}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/pattern_match/mod.rs.html b/compiler-docs/src/fe_mir/lower/pattern_match/mod.rs.html new file mode 100644 index 0000000000..85765f29f3 --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/pattern_match/mod.rs.html @@ -0,0 +1,326 @@ +mod.rs - source

fe_mir/lower/pattern_match/
mod.rs

1use fe_analyzer::pattern_analysis::{ConstructorKind, PatternMatrix};
+2use fe_parser::{
+3    ast::{Expr, LiteralPattern, MatchArm},
+4    node::Node,
+5};
+6use fxhash::FxHashMap;
+7use id_arena::{Arena, Id};
+8use smol_str::SmolStr;
+9
+10use crate::ir::{
+11    body_builder::BodyBuilder, inst::SwitchTable, BasicBlockId, SourceInfo, TypeId, ValueId,
+12};
+13
+14use self::decision_tree::{
+15    Case, ColumnSelectionPolicy, DecisionTree, LeafNode, Occurrence, SwitchNode,
+16};
+17
+18use super::function::BodyLowerHelper;
+19
+20pub mod decision_tree;
+21mod tree_vis;
+22
+23pub(super) fn lower_match<'b>(
+24    helper: &'b mut BodyLowerHelper<'_, '_>,
+25    mat: &PatternMatrix,
+26    scrutinee: &Node<Expr>,
+27    arms: &'b [Node<MatchArm>],
+28) {
+29    let mut policy = ColumnSelectionPolicy::default();
+30    // PBA heuristics described in the paper.
+31    policy.needed_prefix().small_branching().arity();
+32
+33    let scrutinee = helper.lower_expr_to_value(scrutinee);
+34    let decision_tree = decision_tree::build_decision_tree(helper.db.upcast(), mat, policy);
+35
+36    DecisionTreeLowerHelper::new(helper, scrutinee, arms).lower(decision_tree);
+37}
+38
+39struct DecisionTreeLowerHelper<'db, 'a, 'b> {
+40    helper: &'b mut BodyLowerHelper<'db, 'a>,
+41    scopes: Arena<Scope>,
+42    current_scope: ScopeId,
+43    root_block: BasicBlockId,
+44    declared_vars: FxHashMap<(SmolStr, usize), ValueId>,
+45    arms: &'b [Node<MatchArm>],
+46    lowered_arms: FxHashMap<usize, BasicBlockId>,
+47    match_exit: BasicBlockId,
+48}
+49
+50impl<'db, 'a, 'b> DecisionTreeLowerHelper<'db, 'a, 'b> {
+51    fn new(
+52        helper: &'b mut BodyLowerHelper<'db, 'a>,
+53        scrutinee: ValueId,
+54        arms: &'b [Node<MatchArm>],
+55    ) -> Self {
+56        let match_exit = helper.builder.make_block();
+57
+58        let mut scope = Scope::default();
+59        scope.register_occurrence(Occurrence::new(), scrutinee);
+60        let mut scopes = Arena::new();
+61        let current_scope = scopes.alloc(scope);
+62
+63        let root_block = helper.builder.current_block();
+64
+65        DecisionTreeLowerHelper {
+66            helper,
+67            scopes,
+68            current_scope,
+69            root_block,
+70            declared_vars: FxHashMap::default(),
+71            arms,
+72            lowered_arms: FxHashMap::default(),
+73            match_exit,
+74        }
+75    }
+76
+77    fn lower(&mut self, tree: DecisionTree) {
+78        self.lower_tree(tree);
+79
+80        let match_exit = self.match_exit;
+81        self.builder().move_to_block(match_exit);
+82    }
+83
+84    fn lower_tree(&mut self, tree: DecisionTree) {
+85        match tree {
+86            DecisionTree::Leaf(leaf) => self.lower_leaf(leaf),
+87            DecisionTree::Switch(switch) => self.lower_switch(switch),
+88        }
+89    }
+90
+91    fn lower_leaf(&mut self, leaf: LeafNode) {
+92        for (var, occurrence) in leaf.binds {
+93            let occurrence_value = self.resolve_occurrence(&occurrence);
+94            let ty = self.builder().value_ty(occurrence_value);
+95            let var_value = self.declare_or_use_var(&var, ty);
+96
+97            let inst = self.builder().bind(occurrence_value, SourceInfo::dummy());
+98            self.builder().map_result(inst, var_value.into());
+99        }
+100
+101        let arm_body = self.lower_arm_body(leaf.arm_idx);
+102        self.builder().jump(arm_body, SourceInfo::dummy());
+103    }
+104
+105    fn lower_switch(&mut self, mut switch: SwitchNode) {
+106        let current_bb = self.builder().current_block();
+107        let occurrence_value = self.resolve_occurrence(&switch.occurrence);
+108
+109        if switch.arms.len() == 1 {
+110            let arm = switch.arms.pop().unwrap();
+111            let arm_bb = self.enter_arm(&switch.occurrence, &arm.0);
+112            self.lower_tree(arm.1);
+113            self.builder().move_to_block(current_bb);
+114            self.builder().jump(arm_bb, SourceInfo::dummy());
+115            return;
+116        }
+117
+118        let mut table = SwitchTable::default();
+119        let mut default_arm = None;
+120        let occurrence_ty = self.builder().value_ty(occurrence_value);
+121
+122        for (case, tree) in switch.arms {
+123            let arm_bb = self.enter_arm(&switch.occurrence, &case);
+124            self.lower_tree(tree);
+125            self.leave_arm();
+126
+127            if let Some(disc) = self.case_to_disc(&case, occurrence_ty) {
+128                table.add_arm(disc, arm_bb);
+129            } else {
+130                debug_assert!(default_arm.is_none());
+131                default_arm = Some(arm_bb);
+132            }
+133        }
+134
+135        self.builder().move_to_block(current_bb);
+136        let disc = self.extract_disc(occurrence_value);
+137        self.builder()
+138            .switch(disc, table, default_arm, SourceInfo::dummy());
+139    }
+140
+141    fn lower_arm_body(&mut self, index: usize) -> BasicBlockId {
+142        if let Some(block) = self.lowered_arms.get(&index) {
+143            *block
+144        } else {
+145            let current_bb = self.builder().current_block();
+146            let body_bb = self.builder().make_block();
+147
+148            self.builder().move_to_block(body_bb);
+149            for stmt in &self.arms[index].kind.body {
+150                self.helper.lower_stmt(stmt);
+151            }
+152
+153            if !self.builder().is_current_block_terminated() {
+154                let match_exit = self.match_exit;
+155                self.builder().jump(match_exit, SourceInfo::dummy());
+156            }
+157
+158            self.lowered_arms.insert(index, body_bb);
+159            self.builder().move_to_block(current_bb);
+160            body_bb
+161        }
+162    }
+163
+164    fn enter_arm(&mut self, occurrence: &Occurrence, case: &Case) -> BasicBlockId {
+165        self.helper.enter_scope();
+166
+167        let bb = self.builder().make_block();
+168        self.builder().move_to_block(bb);
+169
+170        let scope = Scope::with_parent(self.current_scope);
+171        self.current_scope = self.scopes.alloc(scope);
+172
+173        self.update_occurrence(occurrence, case);
+174        bb
+175    }
+176
+177    fn leave_arm(&mut self) {
+178        self.current_scope = self.scopes[self.current_scope].parent.unwrap();
+179        self.helper.leave_scope();
+180    }
+181
+182    fn case_to_disc(&mut self, case: &Case, occurrence_ty: TypeId) -> Option<ValueId> {
+183        match case {
+184            Case::Ctor(ConstructorKind::Enum(variant)) => {
+185                let disc_ty = occurrence_ty.enum_disc_type(self.helper.db);
+186                let disc = variant.disc(self.helper.db.upcast());
+187                Some(self.helper.make_imm(disc, disc_ty))
+188            }
+189
+190            Case::Ctor(ConstructorKind::Literal((LiteralPattern::Bool(b), ty))) => {
+191                let ty = self.helper.db.mir_lowered_type(*ty);
+192                Some(self.builder().make_imm_from_bool(*b, ty))
+193            }
+194
+195            Case::Ctor(ConstructorKind::Tuple(_))
+196            | Case::Ctor(ConstructorKind::Struct(_))
+197            | Case::Default => None,
+198        }
+199    }
+200
+201    fn update_occurrence(&mut self, occurrence: &Occurrence, case: &Case) {
+202        let old_value = self.resolve_occurrence(occurrence);
+203        let old_ty = self.builder().value_ty(old_value);
+204
+205        match case {
+206            Case::Ctor(ConstructorKind::Enum(variant)) => {
+207                let new_ty = old_ty.enum_variant_type(self.helper.db, *variant);
+208                let cast = self
+209                    .builder()
+210                    .untag_cast(old_value, new_ty, SourceInfo::dummy());
+211                let value = self.helper.map_to_tmp(cast, new_ty);
+212                self.current_scope_mut()
+213                    .register_occurrence(occurrence.clone(), value)
+214            }
+215
+216            Case::Ctor(ConstructorKind::Literal((LiteralPattern::Bool(b), _))) => {
+217                let value = self.builder().make_imm_from_bool(*b, old_ty);
+218                self.current_scope_mut()
+219                    .register_occurrence(occurrence.clone(), value)
+220            }
+221
+222            Case::Ctor(ConstructorKind::Tuple(_))
+223            | Case::Ctor(ConstructorKind::Struct(_))
+224            | Case::Default => {}
+225        }
+226    }
+227
+228    fn extract_disc(&mut self, value: ValueId) -> ValueId {
+229        let value_ty = self.builder().value_ty(value);
+230        match value_ty {
+231            _ if value_ty.deref(self.helper.db).is_enum(self.helper.db) => {
+232                let disc_ty = value_ty.enum_disc_type(self.helper.db);
+233                let disc_index = self.helper.make_u256_imm(0);
+234                let inst =
+235                    self.builder()
+236                        .aggregate_access(value, vec![disc_index], SourceInfo::dummy());
+237                self.helper.map_to_tmp(inst, disc_ty)
+238            }
+239
+240            _ => value,
+241        }
+242    }
+243
+244    fn declare_or_use_var(&mut self, var: &(SmolStr, usize), ty: TypeId) -> ValueId {
+245        if let Some(value) = self.declared_vars.get(var) {
+246            *value
+247        } else {
+248            let current_block = self.builder().current_block();
+249            let root_block = self.root_block;
+250            self.builder().move_to_block_top(root_block);
+251            let value = self.helper.declare_var(&var.0, ty, SourceInfo::dummy());
+252            self.builder().move_to_block(current_block);
+253            self.declared_vars.insert(var.clone(), value);
+254            value
+255        }
+256    }
+257
+258    fn builder(&mut self) -> &mut BodyBuilder {
+259        &mut self.helper.builder
+260    }
+261
+262    fn resolve_occurrence(&mut self, occurrence: &Occurrence) -> ValueId {
+263        if let Some(value) = self
+264            .current_scope()
+265            .resolve_occurrence(&self.scopes, occurrence)
+266        {
+267            return value;
+268        }
+269
+270        let parent = occurrence.parent().unwrap();
+271        let parent_value = self.resolve_occurrence(&parent);
+272        let parent_value_ty = self.builder().value_ty(parent_value);
+273
+274        let index = occurrence.last_index().unwrap();
+275        let index_value = self.helper.make_u256_imm(occurrence.last_index().unwrap());
+276        let inst =
+277            self.builder()
+278                .aggregate_access(parent_value, vec![index_value], SourceInfo::dummy());
+279
+280        let ty = parent_value_ty.projection_ty_imm(self.helper.db, index);
+281        let value = self.helper.map_to_tmp(inst, ty);
+282        self.current_scope_mut()
+283            .register_occurrence(occurrence.clone(), value);
+284        value
+285    }
+286
+287    fn current_scope(&self) -> &Scope {
+288        self.scopes.get(self.current_scope).unwrap()
+289    }
+290
+291    fn current_scope_mut(&mut self) -> &mut Scope {
+292        self.scopes.get_mut(self.current_scope).unwrap()
+293    }
+294}
+295
+296type ScopeId = Id<Scope>;
+297
+298#[derive(Debug, Default)]
+299struct Scope {
+300    parent: Option<ScopeId>,
+301    occurrences: FxHashMap<Occurrence, ValueId>,
+302}
+303
+304impl Scope {
+305    pub fn with_parent(parent: ScopeId) -> Self {
+306        Self {
+307            parent: Some(parent),
+308            ..Default::default()
+309        }
+310    }
+311
+312    pub fn register_occurrence(&mut self, occurrence: Occurrence, value: ValueId) {
+313        self.occurrences.insert(occurrence, value);
+314    }
+315
+316    pub fn resolve_occurrence(
+317        &self,
+318        arena: &Arena<Scope>,
+319        occurrence: &Occurrence,
+320    ) -> Option<ValueId> {
+321        match self.occurrences.get(occurrence) {
+322            Some(value) => Some(*value),
+323            None => arena[self.parent?].resolve_occurrence(arena, occurrence),
+324        }
+325    }
+326}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/pattern_match/tree_vis.rs.html b/compiler-docs/src/fe_mir/lower/pattern_match/tree_vis.rs.html new file mode 100644 index 0000000000..403dfcd549 --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/pattern_match/tree_vis.rs.html @@ -0,0 +1,150 @@ +tree_vis.rs - source

fe_mir/lower/pattern_match/
tree_vis.rs

1use std::fmt::Write;
+2
+3use dot2::{label::Text, Id};
+4use fe_analyzer::{pattern_analysis::ConstructorKind, AnalyzerDb};
+5use fxhash::FxHashMap;
+6use indexmap::IndexMap;
+7use smol_str::SmolStr;
+8
+9use super::decision_tree::{Case, DecisionTree, LeafNode, Occurrence, SwitchNode};
+10
+11pub(super) struct TreeRenderer<'db> {
+12    nodes: Vec<Node>,
+13    edges: FxHashMap<(usize, usize), Case>,
+14    db: &'db dyn AnalyzerDb,
+15}
+16
+17impl<'db> TreeRenderer<'db> {
+18    #[allow(unused)]
+19    pub(super) fn new(db: &'db dyn AnalyzerDb, tree: &DecisionTree) -> Self {
+20        let mut renderer = Self {
+21            nodes: Vec::new(),
+22            edges: FxHashMap::default(),
+23            db,
+24        };
+25
+26        match tree {
+27            DecisionTree::Leaf(leaf) => {
+28                renderer.nodes.push(Node::from(leaf));
+29            }
+30            DecisionTree::Switch(switch) => {
+31                renderer.nodes.push(Node::from(switch));
+32                let node_id = renderer.nodes.len() - 1;
+33                for arm in &switch.arms {
+34                    renderer.switch_from(&arm.1, node_id, arm.0);
+35                }
+36            }
+37        }
+38        renderer
+39    }
+40
+41    fn switch_from(&mut self, tree: &DecisionTree, node_id: usize, case: Case) {
+42        match tree {
+43            DecisionTree::Leaf(leaf) => {
+44                self.nodes.push(Node::from(leaf));
+45                self.edges.insert((node_id, self.nodes.len() - 1), case);
+46            }
+47
+48            DecisionTree::Switch(switch) => {
+49                self.nodes.push(Node::from(switch));
+50                let switch_id = self.nodes.len() - 1;
+51                self.edges.insert((node_id, switch_id), case);
+52                for arm in &switch.arms {
+53                    self.switch_from(&arm.1, switch_id, arm.0);
+54                }
+55            }
+56        }
+57    }
+58}
+59
+60impl<'db> dot2::Labeller<'db> for TreeRenderer<'db> {
+61    type Node = usize;
+62    type Edge = (Self::Node, Self::Node);
+63    type Subgraph = ();
+64
+65    fn graph_id(&self) -> dot2::Result<Id<'db>> {
+66        dot2::Id::new("DecisionTree")
+67    }
+68
+69    fn node_id(&self, n: &Self::Node) -> dot2::Result<Id<'db>> {
+70        dot2::Id::new(format!("N{}", *n))
+71    }
+72
+73    fn node_label(&self, n: &Self::Node) -> dot2::Result<Text<'db>> {
+74        let node = &self.nodes[*n];
+75        let label = match node {
+76            Node::Leaf { arm_idx, .. } => {
+77                format!("arm_idx: {arm_idx}")
+78            }
+79            Node::Switch(occurrence) => {
+80                let mut s = "expr".to_string();
+81                for num in occurrence.iter() {
+82                    write!(&mut s, ".{num}").unwrap();
+83                }
+84                s
+85            }
+86        };
+87
+88        Ok(Text::LabelStr(label.into()))
+89    }
+90
+91    fn edge_label(&self, e: &Self::Edge) -> Text<'db> {
+92        let label = match &self.edges[e] {
+93            Case::Ctor(ConstructorKind::Enum(variant)) => {
+94                variant.name_with_parent(self.db).to_string()
+95            }
+96            Case::Ctor(ConstructorKind::Tuple(_)) => "()".to_string(),
+97            Case::Ctor(ConstructorKind::Struct(sid)) => sid.name(self.db).into(),
+98            Case::Ctor(ConstructorKind::Literal((lit, _))) => lit.to_string(),
+99            Case::Default => "_".into(),
+100        };
+101
+102        Text::LabelStr(label.into())
+103    }
+104}
+105
+106impl<'db> dot2::GraphWalk<'db> for TreeRenderer<'db> {
+107    type Node = usize;
+108    type Edge = (Self::Node, Self::Node);
+109    type Subgraph = ();
+110
+111    fn nodes(&self) -> dot2::Nodes<'db, Self::Node> {
+112        (0..self.nodes.len()).collect()
+113    }
+114
+115    fn edges(&self) -> dot2::Edges<'db, Self::Edge> {
+116        self.edges.keys().cloned().collect::<Vec<_>>().into()
+117    }
+118
+119    fn source(&self, e: &Self::Edge) -> Self::Node {
+120        e.0
+121    }
+122
+123    fn target(&self, e: &Self::Edge) -> Self::Node {
+124        e.1
+125    }
+126}
+127
+128enum Node {
+129    Leaf {
+130        arm_idx: usize,
+131        #[allow(unused)]
+132        binds: IndexMap<(SmolStr, usize), Occurrence>,
+133    },
+134    Switch(Occurrence),
+135}
+136
+137impl From<&LeafNode> for Node {
+138    fn from(node: &LeafNode) -> Self {
+139        Node::Leaf {
+140            arm_idx: node.arm_idx,
+141            binds: node.binds.clone(),
+142        }
+143    }
+144}
+145
+146impl From<&SwitchNode> for Node {
+147    fn from(node: &SwitchNode) -> Self {
+148        Node::Switch(node.occurrence.clone())
+149    }
+150}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/lower/types.rs.html b/compiler-docs/src/fe_mir/lower/types.rs.html new file mode 100644 index 0000000000..dab676fb43 --- /dev/null +++ b/compiler-docs/src/fe_mir/lower/types.rs.html @@ -0,0 +1,194 @@ +types.rs - source

fe_mir/lower/
types.rs

1use crate::{
+2    db::MirDb,
+3    ir::{
+4        types::{ArrayDef, EnumDef, EnumVariant, MapDef, StructDef, TupleDef},
+5        Type, TypeId, TypeKind,
+6    },
+7};
+8
+9use fe_analyzer::namespace::{
+10    items as analyzer_items,
+11    types::{self as analyzer_types, TraitOrType},
+12};
+13
+14pub fn lower_type(db: &dyn MirDb, analyzer_ty: analyzer_types::TypeId) -> TypeId {
+15    let ty_kind = match analyzer_ty.typ(db.upcast()) {
+16        analyzer_types::Type::SPtr(inner) => TypeKind::SPtr(lower_type(db, inner)),
+17
+18        // NOTE: this results in unexpected MIR TypeId inequalities
+19        //  (when different analyzer types map to the same MIR type).
+20        //  We could (should?) remove .analyzer_ty from Type.
+21        analyzer_types::Type::Mut(inner) => match inner.typ(db.upcast()) {
+22            analyzer_types::Type::SPtr(t) => TypeKind::SPtr(lower_type(db, t)),
+23            analyzer_types::Type::Base(t) => lower_base(t),
+24            analyzer_types::Type::Contract(_) => TypeKind::Address,
+25            _ => TypeKind::MPtr(lower_type(db, inner)),
+26        },
+27        analyzer_types::Type::SelfType(inner) => match inner {
+28            TraitOrType::TypeId(id) => return lower_type(db, id),
+29            TraitOrType::TraitId(_) => panic!("traits aren't lowered"),
+30        },
+31        analyzer_types::Type::Base(base) => lower_base(base),
+32        analyzer_types::Type::Array(arr) => lower_array(db, &arr),
+33        analyzer_types::Type::Map(map) => lower_map(db, &map),
+34        analyzer_types::Type::Tuple(tup) => lower_tuple(db, &tup),
+35        analyzer_types::Type::String(string) => TypeKind::String(string.max_size),
+36        analyzer_types::Type::Contract(_) => TypeKind::Address,
+37        analyzer_types::Type::SelfContract(contract) => lower_contract(db, contract),
+38        analyzer_types::Type::Struct(struct_) => lower_struct(db, struct_),
+39        analyzer_types::Type::Enum(enum_) => lower_enum(db, enum_),
+40        analyzer_types::Type::Generic(_) => {
+41            panic!("should be lowered in `lower_analyzer_type`")
+42        }
+43    };
+44
+45    intern_type(db, ty_kind, Some(analyzer_ty.deref(db.upcast())))
+46}
+47
+48fn lower_base(base: analyzer_types::Base) -> TypeKind {
+49    use analyzer_types::{Base, Integer};
+50
+51    match base {
+52        Base::Numeric(int_ty) => match int_ty {
+53            Integer::I8 => TypeKind::I8,
+54            Integer::I16 => TypeKind::I16,
+55            Integer::I32 => TypeKind::I32,
+56            Integer::I64 => TypeKind::I64,
+57            Integer::I128 => TypeKind::I128,
+58            Integer::I256 => TypeKind::I256,
+59            Integer::U8 => TypeKind::U8,
+60            Integer::U16 => TypeKind::U16,
+61            Integer::U32 => TypeKind::U32,
+62            Integer::U64 => TypeKind::U64,
+63            Integer::U128 => TypeKind::U128,
+64            Integer::U256 => TypeKind::U256,
+65        },
+66
+67        Base::Bool => TypeKind::Bool,
+68        Base::Address => TypeKind::Address,
+69        Base::Unit => TypeKind::Unit,
+70    }
+71}
+72
+73fn lower_array(db: &dyn MirDb, arr: &analyzer_types::Array) -> TypeKind {
+74    let len = arr.size;
+75    let elem_ty = db.mir_lowered_type(arr.inner);
+76
+77    let def = ArrayDef { elem_ty, len };
+78    TypeKind::Array(def)
+79}
+80
+81fn lower_map(db: &dyn MirDb, map: &analyzer_types::Map) -> TypeKind {
+82    let key_ty = db.mir_lowered_type(map.key);
+83    let value_ty = db.mir_lowered_type(map.value);
+84
+85    let def = MapDef { key_ty, value_ty };
+86    TypeKind::Map(def)
+87}
+88
+89fn lower_tuple(db: &dyn MirDb, tup: &analyzer_types::Tuple) -> TypeKind {
+90    let items = tup
+91        .items
+92        .iter()
+93        .map(|item| db.mir_lowered_type(*item))
+94        .collect();
+95
+96    let def = TupleDef { items };
+97    TypeKind::Tuple(def)
+98}
+99
+100fn lower_contract(db: &dyn MirDb, contract: analyzer_items::ContractId) -> TypeKind {
+101    let name = contract.name(db.upcast());
+102
+103    // Note: contract field types are wrapped in SPtr in TypeId::projection_ty
+104    let fields = contract
+105        .fields(db.upcast())
+106        .iter()
+107        .map(|(fname, fid)| {
+108            let analyzer_type = fid.typ(db.upcast()).unwrap();
+109            let ty = db.mir_lowered_type(analyzer_type);
+110            (fname.clone(), ty)
+111        })
+112        .collect();
+113
+114    // Obtain span.
+115    let span = contract.span(db.upcast());
+116
+117    let module_id = contract.module(db.upcast());
+118
+119    let def = StructDef {
+120        name,
+121        fields,
+122        span,
+123        module_id,
+124    };
+125    TypeKind::Contract(def)
+126}
+127
+128fn lower_struct(db: &dyn MirDb, id: analyzer_items::StructId) -> TypeKind {
+129    let name = id.name(db.upcast());
+130
+131    // Lower struct fields.
+132    let fields = id
+133        .fields(db.upcast())
+134        .iter()
+135        .map(|(fname, fid)| {
+136            let analyzer_types = fid.typ(db.upcast()).unwrap();
+137            let ty = db.mir_lowered_type(analyzer_types);
+138            (fname.clone(), ty)
+139        })
+140        .collect();
+141
+142    // obtain span.
+143    let span = id.span(db.upcast());
+144
+145    let module_id = id.module(db.upcast());
+146
+147    let def = StructDef {
+148        name,
+149        fields,
+150        span,
+151        module_id,
+152    };
+153    TypeKind::Struct(def)
+154}
+155
+156fn lower_enum(db: &dyn MirDb, id: analyzer_items::EnumId) -> TypeKind {
+157    let analyzer_variants = id.variants(db.upcast());
+158    let mut variants = Vec::with_capacity(analyzer_variants.len());
+159    for variant in analyzer_variants.values() {
+160        let variant_ty = match variant.kind(db.upcast()).unwrap() {
+161            analyzer_items::EnumVariantKind::Tuple(elts) => {
+162                let tuple_ty = analyzer_types::TypeId::tuple(db.upcast(), &elts);
+163                db.mir_lowered_type(tuple_ty)
+164            }
+165            analyzer_items::EnumVariantKind::Unit => {
+166                let unit_ty = analyzer_types::TypeId::unit(db.upcast());
+167                db.mir_lowered_type(unit_ty)
+168            }
+169        };
+170
+171        variants.push(EnumVariant {
+172            name: variant.name(db.upcast()),
+173            span: variant.span(db.upcast()),
+174            ty: variant_ty,
+175        });
+176    }
+177
+178    let def = EnumDef {
+179        name: id.name(db.upcast()),
+180        span: id.span(db.upcast()),
+181        variants,
+182        module_id: id.module(db.upcast()),
+183    };
+184
+185    TypeKind::Enum(def)
+186}
+187
+188fn intern_type(
+189    db: &dyn MirDb,
+190    ty_kind: TypeKind,
+191    analyzer_type: Option<analyzer_types::TypeId>,
+192) -> TypeId {
+193    db.mir_intern_type(Type::new(ty_kind, analyzer_type).into())
+194}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/pretty_print/inst.rs.html b/compiler-docs/src/fe_mir/pretty_print/inst.rs.html new file mode 100644 index 0000000000..48372c9de9 --- /dev/null +++ b/compiler-docs/src/fe_mir/pretty_print/inst.rs.html @@ -0,0 +1,206 @@ +inst.rs - source

fe_mir/pretty_print/
inst.rs

1use std::fmt::{self, Write};
+2
+3use crate::{
+4    db::MirDb,
+5    ir::{function::BodyDataStore, inst::InstKind, InstId},
+6};
+7
+8use super::PrettyPrint;
+9
+10impl PrettyPrint for InstId {
+11    fn pretty_print<W: Write>(
+12        &self,
+13        db: &dyn MirDb,
+14        store: &BodyDataStore,
+15        w: &mut W,
+16    ) -> fmt::Result {
+17        if let Some(result) = store.inst_result(*self) {
+18            result.pretty_print(db, store, w)?;
+19            write!(w, ": ")?;
+20
+21            let result_ty = result.ty(db, store);
+22            result_ty.pretty_print(db, store, w)?;
+23            write!(w, " = ")?;
+24        }
+25
+26        match &store.inst_data(*self).kind {
+27            InstKind::Declare { local } => {
+28                write!(w, "let ")?;
+29                local.pretty_print(db, store, w)?;
+30                write!(w, ": ")?;
+31                store.value_ty(*local).pretty_print(db, store, w)
+32            }
+33
+34            InstKind::Unary { op, value } => {
+35                write!(w, "{op}")?;
+36                value.pretty_print(db, store, w)
+37            }
+38
+39            InstKind::Binary { op, lhs, rhs } => {
+40                lhs.pretty_print(db, store, w)?;
+41                write!(w, " {op} ")?;
+42                rhs.pretty_print(db, store, w)
+43            }
+44
+45            InstKind::Cast { value, to, .. } => {
+46                value.pretty_print(db, store, w)?;
+47                write!(w, " as ")?;
+48                to.pretty_print(db, store, w)
+49            }
+50
+51            InstKind::AggregateConstruct { ty, args } => {
+52                ty.pretty_print(db, store, w)?;
+53                write!(w, "{{")?;
+54                if args.is_empty() {
+55                    return write!(w, "}}");
+56                }
+57
+58                let arg_len = args.len();
+59                for (arg_idx, arg) in args.iter().enumerate().take(arg_len - 1) {
+60                    write!(w, "<{arg_idx}>: ")?;
+61                    arg.pretty_print(db, store, w)?;
+62                    write!(w, ", ")?;
+63                }
+64                let arg = args[arg_len - 1];
+65                write!(w, "<{}>: ", arg_len - 1)?;
+66                arg.pretty_print(db, store, w)?;
+67                write!(w, "}}")
+68            }
+69
+70            InstKind::Bind { src } => {
+71                write!(w, "bind ")?;
+72                src.pretty_print(db, store, w)
+73            }
+74
+75            InstKind::MemCopy { src } => {
+76                write!(w, "memcopy ")?;
+77                src.pretty_print(db, store, w)
+78            }
+79
+80            InstKind::Load { src } => {
+81                write!(w, "load ")?;
+82                src.pretty_print(db, store, w)
+83            }
+84
+85            InstKind::AggregateAccess { value, indices } => {
+86                value.pretty_print(db, store, w)?;
+87                for index in indices {
+88                    write!(w, ".<")?;
+89                    index.pretty_print(db, store, w)?;
+90                    write!(w, ">")?
+91                }
+92                Ok(())
+93            }
+94
+95            InstKind::MapAccess { value, key } => {
+96                value.pretty_print(db, store, w)?;
+97                write!(w, "{{")?;
+98                key.pretty_print(db, store, w)?;
+99                write!(w, "}}")
+100            }
+101
+102            InstKind::Call {
+103                func,
+104                args,
+105                call_type,
+106            } => {
+107                let name = func.debug_name(db);
+108                write!(w, "{name}@{call_type}(")?;
+109                args.as_slice().pretty_print(db, store, w)?;
+110                write!(w, ")")
+111            }
+112
+113            InstKind::Jump { dest } => {
+114                write!(w, "jump BB{}", dest.index())
+115            }
+116
+117            InstKind::Branch { cond, then, else_ } => {
+118                write!(w, "branch ")?;
+119                cond.pretty_print(db, store, w)?;
+120                write!(w, " then: BB{} else: BB{}", then.index(), else_.index())
+121            }
+122
+123            InstKind::Switch {
+124                disc,
+125                table,
+126                default,
+127            } => {
+128                write!(w, "switch ")?;
+129                disc.pretty_print(db, store, w)?;
+130                for (value, block) in table.iter() {
+131                    write!(w, " ")?;
+132                    value.pretty_print(db, store, w)?;
+133                    write!(w, ": BB{}", block.index())?;
+134                }
+135
+136                if let Some(default) = default {
+137                    write!(w, " default: BB{}", default.index())
+138                } else {
+139                    Ok(())
+140                }
+141            }
+142
+143            InstKind::Revert { arg } => {
+144                write!(w, "revert ")?;
+145                if let Some(arg) = arg {
+146                    arg.pretty_print(db, store, w)?;
+147                }
+148                Ok(())
+149            }
+150
+151            InstKind::Emit { arg } => {
+152                write!(w, "emit ")?;
+153                arg.pretty_print(db, store, w)
+154            }
+155
+156            InstKind::Return { arg } => {
+157                if let Some(arg) = arg {
+158                    write!(w, "return ")?;
+159                    arg.pretty_print(db, store, w)
+160                } else {
+161                    write!(w, "return")
+162                }
+163            }
+164
+165            InstKind::Keccak256 { arg } => {
+166                write!(w, "keccak256 ")?;
+167                arg.pretty_print(db, store, w)
+168            }
+169
+170            InstKind::AbiEncode { arg } => {
+171                write!(w, "abi_encode ")?;
+172                arg.pretty_print(db, store, w)
+173            }
+174
+175            InstKind::Nop => {
+176                write!(w, "nop")
+177            }
+178
+179            InstKind::Create { value, contract } => {
+180                write!(w, "create ")?;
+181                let contract_name = contract.name(db.upcast());
+182                write!(w, "{contract_name} ")?;
+183                value.pretty_print(db, store, w)
+184            }
+185
+186            InstKind::Create2 {
+187                value,
+188                salt,
+189                contract,
+190            } => {
+191                write!(w, "create2 ")?;
+192                let contract_name = contract.name(db.upcast());
+193                write!(w, "{contract_name} ")?;
+194                value.pretty_print(db, store, w)?;
+195                write!(w, " ")?;
+196                salt.pretty_print(db, store, w)
+197            }
+198
+199            InstKind::YulIntrinsic { op, args } => {
+200                write!(w, "{op}(")?;
+201                args.as_slice().pretty_print(db, store, w)?;
+202                write!(w, ")")
+203            }
+204        }
+205    }
+206}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/pretty_print/mod.rs.html b/compiler-docs/src/fe_mir/pretty_print/mod.rs.html new file mode 100644 index 0000000000..cce97a3ea5 --- /dev/null +++ b/compiler-docs/src/fe_mir/pretty_print/mod.rs.html @@ -0,0 +1,22 @@ +mod.rs - source

fe_mir/pretty_print/
mod.rs

1use std::fmt;
+2
+3use crate::{db::MirDb, ir::function::BodyDataStore};
+4
+5mod inst;
+6mod types;
+7mod value;
+8
+9pub trait PrettyPrint {
+10    fn pretty_print<W: fmt::Write>(
+11        &self,
+12        db: &dyn MirDb,
+13        store: &BodyDataStore,
+14        w: &mut W,
+15    ) -> fmt::Result;
+16
+17    fn pretty_string(&self, db: &dyn MirDb, store: &BodyDataStore) -> String {
+18        let mut s = String::new();
+19        self.pretty_print(db, store, &mut s).unwrap();
+20        s
+21    }
+22}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/pretty_print/types.rs.html b/compiler-docs/src/fe_mir/pretty_print/types.rs.html new file mode 100644 index 0000000000..cc535f0e72 --- /dev/null +++ b/compiler-docs/src/fe_mir/pretty_print/types.rs.html @@ -0,0 +1,19 @@ +types.rs - source

fe_mir/pretty_print/
types.rs

1use std::fmt::{self, Write};
+2
+3use crate::{
+4    db::MirDb,
+5    ir::{function::BodyDataStore, TypeId},
+6};
+7
+8use super::PrettyPrint;
+9
+10impl PrettyPrint for TypeId {
+11    fn pretty_print<W: Write>(
+12        &self,
+13        db: &dyn MirDb,
+14        _store: &BodyDataStore,
+15        w: &mut W,
+16    ) -> fmt::Result {
+17        self.print(db, w)
+18    }
+19}
\ No newline at end of file diff --git a/compiler-docs/src/fe_mir/pretty_print/value.rs.html b/compiler-docs/src/fe_mir/pretty_print/value.rs.html new file mode 100644 index 0000000000..06cd8c2c53 --- /dev/null +++ b/compiler-docs/src/fe_mir/pretty_print/value.rs.html @@ -0,0 +1,81 @@ +value.rs - source

fe_mir/pretty_print/
value.rs

1use std::fmt::{self, Write};
+2
+3use crate::{
+4    db::MirDb,
+5    ir::{
+6        constant::ConstantValue, function::BodyDataStore, value::AssignableValue, Value, ValueId,
+7    },
+8};
+9
+10use super::PrettyPrint;
+11
+12impl PrettyPrint for ValueId {
+13    fn pretty_print<W: Write>(
+14        &self,
+15        db: &dyn MirDb,
+16        store: &BodyDataStore,
+17        w: &mut W,
+18    ) -> fmt::Result {
+19        match store.value_data(*self) {
+20            Value::Temporary { .. } | Value::Local(_) => write!(w, "_{}", self.index()),
+21            Value::Immediate { imm, .. } => write!(w, "{imm}"),
+22            Value::Constant { constant, .. } => {
+23                let const_value = constant.data(db);
+24                write!(w, "const ")?;
+25                match &const_value.value {
+26                    ConstantValue::Immediate(num) => write!(w, "{num}"),
+27                    ConstantValue::Str(s) => write!(w, r#""{s}""#),
+28                    ConstantValue::Bool(b) => write!(w, "{b}"),
+29                }
+30            }
+31            Value::Unit { .. } => write!(w, "()"),
+32        }
+33    }
+34}
+35
+36impl PrettyPrint for &[ValueId] {
+37    fn pretty_print<W: Write>(
+38        &self,
+39        db: &dyn MirDb,
+40        store: &BodyDataStore,
+41        w: &mut W,
+42    ) -> fmt::Result {
+43        if self.is_empty() {
+44            return Ok(());
+45        }
+46
+47        let arg_len = self.len();
+48        for arg in self.iter().take(arg_len - 1) {
+49            arg.pretty_print(db, store, w)?;
+50            write!(w, ", ")?;
+51        }
+52        let arg = self[arg_len - 1];
+53        arg.pretty_print(db, store, w)
+54    }
+55}
+56
+57impl PrettyPrint for AssignableValue {
+58    fn pretty_print<W: Write>(
+59        &self,
+60        db: &dyn MirDb,
+61        store: &BodyDataStore,
+62        w: &mut W,
+63    ) -> fmt::Result {
+64        match self {
+65            Self::Value(value) => value.pretty_print(db, store, w),
+66            Self::Aggregate { lhs, idx } => {
+67                lhs.pretty_print(db, store, w)?;
+68                write!(w, ".<")?;
+69                idx.pretty_print(db, store, w)?;
+70                write!(w, ">")
+71            }
+72
+73            Self::Map { lhs, key } => {
+74                lhs.pretty_print(db, store, w)?;
+75                write!(w, "{{")?;
+76                key.pretty_print(db, store, w)?;
+77                write!(w, "}}")
+78            }
+79        }
+80    }
+81}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/ast.rs.html b/compiler-docs/src/fe_parser/ast.rs.html new file mode 100644 index 0000000000..a0444a4788 --- /dev/null +++ b/compiler-docs/src/fe_parser/ast.rs.html @@ -0,0 +1,1421 @@ +ast.rs - source

fe_parser/
ast.rs

1use crate::node::Node;
+2use fe_common::{Span, Spanned};
+3use indenter::indented;
+4use serde::{Deserialize, Serialize};
+5pub use smol_str::SmolStr;
+6use std::fmt;
+7use std::fmt::Formatter;
+8use std::fmt::Write;
+9use vec1::Vec1;
+10
+11#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+12pub struct Module {
+13    pub body: Vec<ModuleStmt>,
+14}
+15
+16#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+17pub enum ModuleStmt {
+18    Pragma(Node<Pragma>),
+19    Use(Node<Use>),
+20    TypeAlias(Node<TypeAlias>),
+21    Contract(Node<Contract>),
+22    Constant(Node<ConstantDecl>),
+23    Struct(Node<Struct>),
+24    Enum(Node<Enum>),
+25    Trait(Node<Trait>),
+26    Impl(Node<Impl>),
+27    Function(Node<Function>),
+28    Attribute(Node<SmolStr>),
+29    ParseError(Span),
+30}
+31
+32#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+33pub struct Pragma {
+34    pub version_requirement: Node<SmolStr>,
+35}
+36
+37#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+38pub struct Path {
+39    pub segments: Vec<Node<SmolStr>>,
+40}
+41
+42impl Path {
+43    pub fn remove_last(&self) -> Path {
+44        Path {
+45            segments: self.segments[0..self.segments.len() - 1].to_vec(),
+46        }
+47    }
+48}
+49
+50#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+51pub struct Use {
+52    pub tree: Node<UseTree>,
+53}
+54
+55#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+56pub enum UseTree {
+57    Glob {
+58        prefix: Path,
+59    },
+60    Nested {
+61        prefix: Path,
+62        children: Vec<Node<UseTree>>,
+63    },
+64    Simple {
+65        path: Path,
+66        rename: Option<Node<SmolStr>>,
+67    },
+68}
+69
+70#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+71pub struct ConstantDecl {
+72    pub name: Node<SmolStr>,
+73    pub typ: Node<TypeDesc>,
+74    pub value: Node<Expr>,
+75    pub pub_qual: Option<Span>,
+76}
+77
+78#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+79pub struct TypeAlias {
+80    pub name: Node<SmolStr>,
+81    pub typ: Node<TypeDesc>,
+82    pub pub_qual: Option<Span>,
+83}
+84
+85#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+86pub struct Contract {
+87    pub name: Node<SmolStr>,
+88    pub fields: Vec<Node<Field>>,
+89    pub body: Vec<ContractStmt>,
+90    pub pub_qual: Option<Span>,
+91}
+92
+93#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+94pub struct Struct {
+95    pub name: Node<SmolStr>,
+96    pub fields: Vec<Node<Field>>,
+97    pub functions: Vec<Node<Function>>,
+98    pub pub_qual: Option<Span>,
+99}
+100
+101#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+102pub struct Enum {
+103    pub name: Node<SmolStr>,
+104    pub variants: Vec<Node<Variant>>,
+105    pub functions: Vec<Node<Function>>,
+106    pub pub_qual: Option<Span>,
+107}
+108
+109#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+110pub struct Trait {
+111    pub name: Node<SmolStr>,
+112    pub functions: Vec<Node<FunctionSignature>>,
+113    pub pub_qual: Option<Span>,
+114}
+115
+116#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+117pub struct Impl {
+118    pub impl_trait: Node<SmolStr>,
+119    pub receiver: Node<TypeDesc>,
+120    pub functions: Vec<Node<Function>>,
+121}
+122
+123#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+124pub enum TypeDesc {
+125    Unit,
+126    // TODO: replace with `Name(SmolStr)`, or eliminate in favor of `Path`?
+127    Base {
+128        base: SmolStr,
+129    },
+130    Path(Path),
+131    Tuple {
+132        items: Vec1<Node<TypeDesc>>,
+133    },
+134    Generic {
+135        // TODO: when we support user-defined generic types,
+136        // this will have to be a `Path`
+137        base: Node<SmolStr>,
+138        args: Node<Vec<GenericArg>>,
+139    },
+140    SelfType,
+141}
+142
+143#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+144pub enum GenericArg {
+145    TypeDesc(Node<TypeDesc>),
+146    Int(Node<usize>),
+147    ConstExpr(Node<Expr>),
+148}
+149
+150impl Spanned for GenericArg {
+151    fn span(&self) -> Span {
+152        match self {
+153            GenericArg::TypeDesc(node) => node.span,
+154            GenericArg::Int(node) => node.span,
+155            GenericArg::ConstExpr(node) => node.span,
+156        }
+157    }
+158}
+159
+160#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+161pub enum GenericParameter {
+162    Unbounded(Node<SmolStr>),
+163    Bounded {
+164        name: Node<SmolStr>,
+165        bound: Node<TypeDesc>,
+166    },
+167}
+168
+169impl GenericParameter {
+170    pub fn name(&self) -> SmolStr {
+171        self.name_node().kind
+172    }
+173
+174    pub fn name_node(&self) -> Node<SmolStr> {
+175        match self {
+176            GenericParameter::Unbounded(node) => node.clone(),
+177            GenericParameter::Bounded { name, .. } => name.clone(),
+178        }
+179    }
+180}
+181
+182impl Spanned for GenericParameter {
+183    fn span(&self) -> Span {
+184        match self {
+185            GenericParameter::Unbounded(node) => node.span,
+186            GenericParameter::Bounded { name, bound } => name.span + bound.span,
+187        }
+188    }
+189}
+190
+191/// struct or contract field, with optional 'pub' and 'const' qualifiers
+192#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+193pub struct Field {
+194    pub is_pub: bool,
+195    pub is_const: bool,
+196    pub attributes: Vec<Node<SmolStr>>,
+197    pub name: Node<SmolStr>,
+198    pub typ: Node<TypeDesc>,
+199    pub value: Option<Node<Expr>>,
+200}
+201
+202/// Enum variant definition.
+203#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+204pub struct Variant {
+205    pub name: Node<SmolStr>,
+206    pub kind: VariantKind,
+207}
+208
+209/// Enum variant kind.
+210#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+211pub enum VariantKind {
+212    /// Unit variant.
+213    /// E.g., `Bar` in
+214    ///
+215    /// ```fe
+216    /// enum Foo {
+217    ///     Bar
+218    ///     Baz(u32, i32)
+219    /// }
+220    /// ```
+221    Unit,
+222
+223    /// Tuple variant.
+224    /// E.g., `Baz(u32, i32)` in
+225    ///
+226    /// ```fe
+227    /// enum Foo {
+228    ///     Bar
+229    ///     Baz(u32, i32)
+230    /// }
+231    /// ```
+232    Tuple(Vec<Node<TypeDesc>>),
+233}
+234
+235#[allow(clippy::large_enum_variant)]
+236#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+237pub enum ContractStmt {
+238    Function(Node<Function>),
+239}
+240
+241#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+242pub struct FunctionSignature {
+243    // qualifier order: `pub unsafe fn`
+244    pub pub_: Option<Span>,
+245    pub unsafe_: Option<Span>,
+246    pub name: Node<SmolStr>,
+247    pub generic_params: Node<Vec<GenericParameter>>,
+248    pub args: Vec<Node<FunctionArg>>,
+249    pub return_type: Option<Node<TypeDesc>>,
+250}
+251
+252#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+253pub struct Function {
+254    pub sig: Node<FunctionSignature>,
+255    pub body: Vec<Node<FuncStmt>>,
+256}
+257
+258#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+259#[allow(clippy::large_enum_variant)]
+260pub enum FunctionArg {
+261    Regular {
+262        mut_: Option<Span>,
+263        label: Option<Node<SmolStr>>,
+264        name: Node<SmolStr>,
+265        typ: Node<TypeDesc>,
+266    },
+267    Self_ {
+268        mut_: Option<Span>,
+269    },
+270}
+271impl FunctionArg {
+272    pub fn label_span(&self) -> Option<Span> {
+273        match self {
+274            Self::Regular { label, .. } => label.as_ref().map(|label| label.span),
+275            Self::Self_ { .. } => None,
+276        }
+277    }
+278
+279    pub fn name_span(&self) -> Option<Span> {
+280        match self {
+281            Self::Regular { name, .. } => Some(name.span),
+282            Self::Self_ { .. } => None,
+283        }
+284    }
+285
+286    pub fn typ_span(&self) -> Option<Span> {
+287        match self {
+288            Self::Regular { typ, .. } => Some(typ.span),
+289            Self::Self_ { .. } => None,
+290        }
+291    }
+292}
+293
+294#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+295pub enum FuncStmt {
+296    Return {
+297        value: Option<Node<Expr>>,
+298    },
+299    VarDecl {
+300        mut_: Option<Span>,
+301        target: Node<VarDeclTarget>,
+302        typ: Node<TypeDesc>,
+303        value: Option<Node<Expr>>,
+304    },
+305    ConstantDecl {
+306        name: Node<SmolStr>,
+307        typ: Node<TypeDesc>,
+308        value: Node<Expr>,
+309    },
+310    Assign {
+311        target: Node<Expr>,
+312        value: Node<Expr>,
+313    },
+314    AugAssign {
+315        target: Node<Expr>,
+316        op: Node<BinOperator>,
+317        value: Node<Expr>,
+318    },
+319    For {
+320        target: Node<SmolStr>,
+321        iter: Node<Expr>,
+322        body: Vec<Node<FuncStmt>>,
+323    },
+324    While {
+325        test: Node<Expr>,
+326        body: Vec<Node<FuncStmt>>,
+327    },
+328    If {
+329        test: Node<Expr>,
+330        body: Vec<Node<FuncStmt>>,
+331        or_else: Vec<Node<FuncStmt>>,
+332    },
+333    Match {
+334        expr: Node<Expr>,
+335        arms: Vec<Node<MatchArm>>,
+336    },
+337    Assert {
+338        test: Node<Expr>,
+339        msg: Option<Node<Expr>>,
+340    },
+341    Expr {
+342        value: Node<Expr>,
+343    },
+344    Break,
+345    Continue,
+346    Revert {
+347        error: Option<Node<Expr>>,
+348    },
+349    Unsafe(Vec<Node<FuncStmt>>),
+350}
+351
+352#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+353pub struct MatchArm {
+354    pub pat: Node<Pattern>,
+355    pub body: Vec<Node<FuncStmt>>,
+356}
+357
+358#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+359pub enum Pattern {
+360    /// Represents a wildcard pattern `_`.
+361    WildCard,
+362    /// Rest pattern. e.g., `..`
+363    Rest,
+364    /// Represents a literal pattern. e.g., `true`.
+365    Literal(Node<LiteralPattern>),
+366    /// Represents tuple destructuring pattern. e.g., `(x, y, z)`.
+367    Tuple(Vec<Node<Pattern>>),
+368    /// Represents unit variant pattern. e.g., `Enum::Unit`.
+369    Path(Node<Path>),
+370    /// Represents tuple variant pattern. e.g., `Enum::Tuple(x, y, z)`.
+371    PathTuple(Node<Path>, Vec<Node<Pattern>>),
+372    /// Represents struct or struct variant destructuring pattern. e.g.,
+373    /// `MyStruct {x: pat1, y: pat2}}`.
+374    PathStruct {
+375        path: Node<Path>,
+376        fields: Vec<(Node<SmolStr>, Node<Pattern>)>,
+377        has_rest: bool,
+378    },
+379    /// Represents or pattern. e.g., `EnumUnit | EnumTuple(_, _, _)`
+380    Or(Vec<Node<Pattern>>),
+381}
+382
+383impl Pattern {
+384    pub fn is_rest(&self) -> bool {
+385        matches!(self, Pattern::Rest)
+386    }
+387}
+388
+389#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+390pub enum LiteralPattern {
+391    Bool(bool),
+392}
+393
+394#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+395pub enum VarDeclTarget {
+396    Name(SmolStr),
+397    Tuple(Vec<Node<VarDeclTarget>>),
+398}
+399
+400#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+401pub enum Expr {
+402    Ternary {
+403        if_expr: Box<Node<Expr>>,
+404        test: Box<Node<Expr>>,
+405        else_expr: Box<Node<Expr>>,
+406    },
+407    BoolOperation {
+408        left: Box<Node<Expr>>,
+409        op: Node<BoolOperator>,
+410        right: Box<Node<Expr>>,
+411    },
+412    BinOperation {
+413        left: Box<Node<Expr>>,
+414        op: Node<BinOperator>,
+415        right: Box<Node<Expr>>,
+416    },
+417    UnaryOperation {
+418        op: Node<UnaryOperator>,
+419        operand: Box<Node<Expr>>,
+420    },
+421    CompOperation {
+422        left: Box<Node<Expr>>,
+423        op: Node<CompOperator>,
+424        right: Box<Node<Expr>>,
+425    },
+426    Attribute {
+427        value: Box<Node<Expr>>,
+428        attr: Node<SmolStr>,
+429    },
+430    Subscript {
+431        value: Box<Node<Expr>>,
+432        index: Box<Node<Expr>>,
+433    },
+434    Call {
+435        func: Box<Node<Expr>>,
+436        generic_args: Option<Node<Vec<GenericArg>>>,
+437        args: Node<Vec<Node<CallArg>>>,
+438    },
+439    List {
+440        elts: Vec<Node<Expr>>,
+441    },
+442    Repeat {
+443        value: Box<Node<Expr>>,
+444        len: Box<Node<GenericArg>>,
+445    },
+446    Tuple {
+447        elts: Vec<Node<Expr>>,
+448    },
+449    Bool(bool),
+450    Name(SmolStr),
+451    Path(Path),
+452    Num(SmolStr),
+453    Str(SmolStr),
+454    Unit,
+455}
+456
+457#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+458pub struct CallArg {
+459    pub label: Option<Node<SmolStr>>,
+460    pub value: Node<Expr>,
+461}
+462
+463#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+464pub enum BoolOperator {
+465    And,
+466    Or,
+467}
+468
+469#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+470pub enum BinOperator {
+471    Add,
+472    Sub,
+473    Mult,
+474    Div,
+475    Mod,
+476    Pow,
+477    LShift,
+478    RShift,
+479    BitOr,
+480    BitXor,
+481    BitAnd,
+482}
+483
+484#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+485pub enum UnaryOperator {
+486    Invert,
+487    Not,
+488    USub,
+489}
+490
+491#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone, Copy)]
+492pub enum CompOperator {
+493    Eq,
+494    NotEq,
+495    Lt,
+496    LtE,
+497    Gt,
+498    GtE,
+499}
+500
+501impl Node<Contract> {
+502    pub fn name(&self) -> &str {
+503        &self.kind.name.kind
+504    }
+505}
+506
+507impl Node<Struct> {
+508    pub fn name(&self) -> &str {
+509        &self.kind.name.kind
+510    }
+511}
+512
+513impl Node<Enum> {
+514    pub fn name(&self) -> &str {
+515        &self.kind.name.kind
+516    }
+517}
+518
+519impl Node<Variant> {
+520    pub fn name(&self) -> &str {
+521        &self.kind.name.kind
+522    }
+523}
+524
+525impl Node<Trait> {
+526    pub fn name(&self) -> &str {
+527        &self.kind.name.kind
+528    }
+529}
+530
+531impl Node<Field> {
+532    pub fn name(&self) -> &str {
+533        &self.kind.name.kind
+534    }
+535}
+536
+537impl Node<Function> {
+538    pub fn name(&self) -> &str {
+539        &self.kind.sig.kind.name.kind
+540    }
+541}
+542
+543impl Node<FunctionArg> {
+544    pub fn name(&self) -> &str {
+545        match &self.kind {
+546            FunctionArg::Regular { name, .. } => &name.kind,
+547            FunctionArg::Self_ { .. } => "self",
+548        }
+549    }
+550
+551    pub fn name_span(&self) -> Span {
+552        match &self.kind {
+553            FunctionArg::Regular { name, .. } => name.span,
+554            FunctionArg::Self_ { .. } => self.span,
+555        }
+556    }
+557}
+558
+559impl Node<TypeAlias> {
+560    pub fn name(&self) -> &str {
+561        &self.kind.name.kind
+562    }
+563}
+564
+565impl Spanned for ModuleStmt {
+566    fn span(&self) -> Span {
+567        match self {
+568            ModuleStmt::Pragma(inner) => inner.span,
+569            ModuleStmt::Use(inner) => inner.span,
+570            ModuleStmt::Trait(inner) => inner.span,
+571            ModuleStmt::Impl(inner) => inner.span,
+572            ModuleStmt::TypeAlias(inner) => inner.span,
+573            ModuleStmt::Contract(inner) => inner.span,
+574            ModuleStmt::Constant(inner) => inner.span,
+575            ModuleStmt::Struct(inner) => inner.span,
+576            ModuleStmt::Enum(inner) => inner.span,
+577            ModuleStmt::Function(inner) => inner.span,
+578            ModuleStmt::Attribute(inner) => inner.span,
+579            ModuleStmt::ParseError(span) => *span,
+580        }
+581    }
+582}
+583
+584impl Spanned for ContractStmt {
+585    fn span(&self) -> Span {
+586        match self {
+587            ContractStmt::Function(inner) => inner.span,
+588        }
+589    }
+590}
+591
+592impl fmt::Display for Module {
+593    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+594        let (uses, rest): (Vec<&ModuleStmt>, Vec<&ModuleStmt>) = self
+595            .body
+596            .iter()
+597            .partition(|&stmt| matches!(stmt, ModuleStmt::Use(_) | ModuleStmt::Pragma(_)));
+598        for stmt in &uses {
+599            writeln!(f, "{stmt}")?;
+600        }
+601        if !uses.is_empty() && !rest.is_empty() {
+602            writeln!(f)?;
+603        }
+604        let mut delim = "";
+605        for stmt in rest {
+606            writeln!(f, "{delim}{stmt}")?;
+607            delim = "\n";
+608        }
+609        Ok(())
+610    }
+611}
+612
+613impl fmt::Display for ModuleStmt {
+614    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+615        match self {
+616            ModuleStmt::Pragma(node) => write!(f, "{}", node.kind),
+617            ModuleStmt::Use(node) => write!(f, "{}", node.kind),
+618            ModuleStmt::Trait(node) => write!(f, "{}", node.kind),
+619            ModuleStmt::Impl(node) => write!(f, "{}", node.kind),
+620            ModuleStmt::TypeAlias(node) => write!(f, "{}", node.kind),
+621            ModuleStmt::Contract(node) => write!(f, "{}", node.kind),
+622            ModuleStmt::Constant(node) => write!(f, "{}", node.kind),
+623            ModuleStmt::Struct(node) => write!(f, "{}", node.kind),
+624            ModuleStmt::Enum(node) => write!(f, "{}", node.kind),
+625            ModuleStmt::Function(node) => write!(f, "{}", node.kind),
+626            ModuleStmt::Attribute(node) => writeln!(f, "#{}", node.kind),
+627            ModuleStmt::ParseError(span) => {
+628                write!(f, "# PARSE ERROR: {}..{}", span.start, span.end)
+629            }
+630        }
+631    }
+632}
+633
+634impl fmt::Display for Pragma {
+635    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+636        write!(f, "pragma {}", self.version_requirement.kind)
+637    }
+638}
+639
+640impl fmt::Display for Use {
+641    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+642        // TODO pub use
+643        write!(f, "use {}", self.tree.kind)
+644    }
+645}
+646
+647impl fmt::Display for UseTree {
+648    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+649        match self {
+650            UseTree::Glob { prefix } => write!(f, "{prefix}::*"),
+651            UseTree::Simple { path, rename } => {
+652                if let Some(rename) = rename {
+653                    write!(f, "{} as {}", path, rename.kind)
+654                } else {
+655                    write!(f, "{path}")
+656                }
+657            }
+658            UseTree::Nested { prefix, children } => {
+659                write!(f, "{}::{{{}}}", prefix, node_comma_joined(children))
+660            }
+661        }
+662    }
+663}
+664
+665impl fmt::Display for Path {
+666    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+667        let joined_names = self
+668            .segments
+669            .iter()
+670            .map(|name| name.kind.as_ref())
+671            .collect::<Vec<_>>()
+672            .join("::");
+673        write!(f, "{joined_names}")?;
+674
+675        Ok(())
+676    }
+677}
+678
+679impl fmt::Display for ConstantDecl {
+680    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+681        let ConstantDecl {
+682            name,
+683            typ,
+684            value,
+685            pub_qual,
+686        } = self;
+687        if pub_qual.is_some() {
+688            write!(f, "pub ")?;
+689        }
+690        write!(f, "const {}: {} = {}", name.kind, typ.kind, value.kind)
+691    }
+692}
+693
+694impl fmt::Display for Trait {
+695    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+696        writeln!(f, "trait {}:", self.name.kind)?;
+697
+698        Ok(())
+699    }
+700}
+701
+702impl fmt::Display for Impl {
+703    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+704        writeln!(
+705            f,
+706            "impl {} for {}",
+707            self.impl_trait.kind, self.receiver.kind
+708        )?;
+709
+710        Ok(())
+711    }
+712}
+713
+714impl fmt::Display for TypeAlias {
+715    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+716        let TypeAlias {
+717            name,
+718            typ,
+719            pub_qual,
+720        } = self;
+721        if pub_qual.is_some() {
+722            write!(f, "pub ")?;
+723        }
+724        write!(f, "type {} = {}", name.kind, typ.kind)
+725    }
+726}
+727
+728impl fmt::Display for Contract {
+729    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+730        let Contract {
+731            name,
+732            fields,
+733            body,
+734            pub_qual,
+735        } = self;
+736
+737        if pub_qual.is_some() {
+738            write!(f, "pub ")?;
+739        }
+740        write!(f, "contract {} {{", name.kind)?;
+741
+742        if !fields.is_empty() {
+743            for field in fields {
+744                writeln!(f)?;
+745                write!(indented(f), "{}", field.kind)?;
+746            }
+747            writeln!(f)?;
+748        }
+749        if !body.is_empty() {
+750            writeln!(f)?;
+751            write!(indented(f), "{}", double_line_joined(body))?;
+752            writeln!(f)?;
+753        }
+754        write!(f, "}}")
+755    }
+756}
+757
+758impl fmt::Display for Struct {
+759    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+760        let Struct {
+761            name,
+762            fields,
+763            functions,
+764            pub_qual,
+765        } = self;
+766
+767        if pub_qual.is_some() {
+768            write!(f, "pub ")?;
+769        }
+770        write!(f, "struct {} ", name.kind)?;
+771        write!(f, "{{")?;
+772        write_nodes_line_wrapped(&mut indented(f), fields)?;
+773
+774        if !self.fields.is_empty() && !functions.is_empty() {
+775            writeln!(f)?;
+776        }
+777        if !functions.is_empty() {
+778            writeln!(indented(f), "{}", double_line_joined(functions))?;
+779        }
+780        write!(f, "}}")
+781    }
+782}
+783
+784impl fmt::Display for Enum {
+785    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+786        let Enum {
+787            name,
+788            variants,
+789            functions,
+790            pub_qual,
+791        } = self;
+792
+793        if pub_qual.is_some() {
+794            write!(f, "pub ")?;
+795        }
+796
+797        write!(f, "enum {} ", name.kind)?;
+798        write!(f, "{{")?;
+799        write_nodes_line_wrapped(&mut indented(f), variants)?;
+800
+801        if !functions.is_empty() {
+802            writeln!(indented(f), "{}", double_line_joined(functions))?;
+803        }
+804        write!(f, "}}")
+805    }
+806}
+807
+808impl fmt::Display for TypeDesc {
+809    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+810        match self {
+811            TypeDesc::Unit => write!(f, "()"),
+812            TypeDesc::Base { base } => write!(f, "{base}"),
+813            TypeDesc::Path(path) => write!(f, "{path}"),
+814            TypeDesc::Tuple { items } => {
+815                if items.len() == 1 {
+816                    write!(f, "({},)", items[0].kind)
+817                } else {
+818                    write!(f, "({})", node_comma_joined(items))
+819                }
+820            }
+821            TypeDesc::Generic { base, args } => {
+822                write!(f, "{}<{}>", base.kind, comma_joined(args.kind.iter()))
+823            }
+824            TypeDesc::SelfType => write!(f, "Self"),
+825        }
+826    }
+827}
+828
+829impl fmt::Display for GenericParameter {
+830    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+831        match self {
+832            GenericParameter::Unbounded(name) => write!(f, "{}", name.kind),
+833            GenericParameter::Bounded { name, bound } => write!(f, "{}: {}", name.kind, bound.kind),
+834        }
+835    }
+836}
+837
+838impl fmt::Display for GenericArg {
+839    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+840        match self {
+841            GenericArg::TypeDesc(node) => write!(f, "{}", node.kind),
+842            GenericArg::Int(node) => write!(f, "{}", node.kind),
+843            GenericArg::ConstExpr(node) => write!(f, "{{ {} }}", node.kind),
+844        }
+845    }
+846}
+847
+848impl fmt::Display for Field {
+849    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+850        if self.is_pub {
+851            write!(f, "pub ")?;
+852        }
+853        if self.is_const {
+854            write!(f, "const ")?;
+855        }
+856        write!(f, "{}: {}", self.name.kind, self.typ.kind)
+857    }
+858}
+859
+860impl fmt::Display for Variant {
+861    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+862        write!(f, "{}", self.name.kind)?;
+863        match &self.kind {
+864            VariantKind::Unit => Ok(()),
+865            VariantKind::Tuple(elts) => {
+866                write!(f, "({})", node_comma_joined(elts))
+867            }
+868        }
+869    }
+870}
+871
+872impl fmt::Display for ContractStmt {
+873    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+874        match self {
+875            ContractStmt::Function(node) => write!(f, "{}", node.kind),
+876        }
+877    }
+878}
+879
+880impl fmt::Display for Node<Function> {
+881    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+882        self.kind.fmt(f)
+883    }
+884}
+885
+886impl fmt::Display for Function {
+887    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+888        let FunctionSignature {
+889            pub_,
+890            unsafe_,
+891            name,
+892            generic_params,
+893            args,
+894            return_type,
+895        } = &self.sig.kind;
+896
+897        if pub_.is_some() {
+898            write!(f, "pub ")?;
+899        }
+900        if unsafe_.is_some() {
+901            write!(f, "unsafe ")?;
+902        }
+903        write!(f, "fn {}", name.kind)?;
+904        if !generic_params.kind.is_empty() {
+905            write!(f, "<{}>", comma_joined(generic_params.kind.iter()))?;
+906        }
+907        write!(f, "({})", node_comma_joined(args))?;
+908
+909        if let Some(return_type) = return_type.as_ref() {
+910            write!(f, " -> {}", return_type.kind)?;
+911        }
+912        write!(f, " {{")?;
+913        write_nodes_line_wrapped(&mut indented(f), &self.body)?;
+914        write!(f, "}}")
+915    }
+916}
+917
+918impl fmt::Display for FunctionArg {
+919    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+920        match self {
+921            FunctionArg::Regular {
+922                mut_,
+923                label,
+924                name,
+925                typ,
+926            } => {
+927                if mut_.is_some() {
+928                    write!(f, "mut ")?
+929                }
+930                if let Some(label) = label {
+931                    write!(f, "{} ", label.kind)?
+932                }
+933
+934                write!(f, "{}: {}", name.kind, typ.kind)
+935            }
+936            FunctionArg::Self_ { mut_ } => {
+937                if mut_.is_some() {
+938                    write!(f, "mut ")?;
+939                }
+940                write!(f, "self")
+941            }
+942        }
+943    }
+944}
+945
+946impl fmt::Display for FuncStmt {
+947    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+948        match self {
+949            FuncStmt::Return { value } => {
+950                if let Some(value) = value {
+951                    write!(f, "return {}", value.kind)
+952                } else {
+953                    write!(f, "return")
+954                }
+955            }
+956            FuncStmt::VarDecl {
+957                mut_,
+958                target,
+959                typ,
+960                value,
+961            } => {
+962                let mut_ = if mut_.is_some() { "mut " } else { "" };
+963                if let Some(value) = value {
+964                    write!(
+965                        f,
+966                        "let {}{}: {} = {}",
+967                        mut_, target.kind, typ.kind, value.kind
+968                    )
+969                } else {
+970                    write!(f, "let {}{}: {}", mut_, target.kind, typ.kind)
+971                }
+972            }
+973            FuncStmt::ConstantDecl { name, typ, value } => {
+974                write!(f, "const {}: {} = {}", name.kind, typ.kind, value.kind)
+975            }
+976            FuncStmt::Assign { target, value } => write!(f, "{} = {}", target.kind, value.kind),
+977            FuncStmt::AugAssign { target, op, value } => {
+978                write!(f, "{} {}= {}", target.kind, op.kind, value.kind)
+979            }
+980            FuncStmt::For { target, iter, body } => {
+981                write!(f, "for {} in {} {{", target.kind, iter.kind)?;
+982                write_nodes_line_wrapped(&mut indented(f), body)?;
+983                write!(f, "}}")
+984            }
+985            FuncStmt::While { test, body } => {
+986                write!(f, "while {} {{", test.kind)?;
+987                write_nodes_line_wrapped(&mut indented(f), body)?;
+988                write!(f, "}}")
+989            }
+990            FuncStmt::If {
+991                test,
+992                body,
+993                or_else,
+994            } => {
+995                write!(f, "if {} {{", test.kind)?;
+996                write_nodes_line_wrapped(&mut indented(f), body)?;
+997
+998                if or_else.is_empty() {
+999                    write!(f, "}}")
+1000                } else {
+1001                    if body.is_empty() {
+1002                        writeln!(f)?;
+1003                    }
+1004
+1005                    if matches!(
+1006                        &or_else[..],
+1007                        &[Node {
+1008                            kind: FuncStmt::If { .. },
+1009                            ..
+1010                        }]
+1011                    ) {
+1012                        write!(f, "}} else ")?;
+1013                        write!(f, "{}", or_else[0].kind)
+1014                    } else {
+1015                        write!(f, "}} else {{")?;
+1016                        write_nodes_line_wrapped(&mut indented(f), or_else)?;
+1017                        write!(f, "}}")
+1018                    }
+1019                }
+1020            }
+1021            FuncStmt::Match { expr, arms } => {
+1022                write!(f, "match {} {{", expr.kind)?;
+1023                write_nodes_line_wrapped(&mut indented(f), arms)?;
+1024                write!(f, "}}")
+1025            }
+1026            FuncStmt::Assert { test, msg } => {
+1027                if let Some(msg) = msg {
+1028                    write!(f, "assert {}, {}", test.kind, msg.kind)
+1029                } else {
+1030                    write!(f, "assert {}", test.kind)
+1031                }
+1032            }
+1033            FuncStmt::Expr { value } => write!(f, "{}", value.kind),
+1034            FuncStmt::Break => write!(f, "break"),
+1035            FuncStmt::Continue => write!(f, "continue"),
+1036            FuncStmt::Revert { error } => {
+1037                if let Some(error) = error {
+1038                    write!(f, "revert {}", error.kind)
+1039                } else {
+1040                    write!(f, "revert")
+1041                }
+1042            }
+1043            FuncStmt::Unsafe(body) => {
+1044                write!(f, "unsafe {{")?;
+1045                write_nodes_line_wrapped(&mut indented(f), body)?;
+1046                write!(f, "}}")
+1047            }
+1048        }
+1049    }
+1050}
+1051
+1052impl fmt::Display for VarDeclTarget {
+1053    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+1054        match self {
+1055            VarDeclTarget::Name(name) => write!(f, "{name}"),
+1056            VarDeclTarget::Tuple(elts) => {
+1057                if elts.len() == 1 {
+1058                    write!(f, "({},)", elts[0].kind)
+1059                } else {
+1060                    write!(f, "({})", node_comma_joined(elts))
+1061                }
+1062            }
+1063        }
+1064    }
+1065}
+1066
+1067impl fmt::Display for Expr {
+1068    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+1069        match self {
+1070            Expr::Ternary {
+1071                if_expr,
+1072                test,
+1073                else_expr,
+1074            } => write!(
+1075                f,
+1076                "{} if {} else {}",
+1077                if_expr.kind, test.kind, else_expr.kind
+1078            ),
+1079            Expr::BoolOperation { left, op, right } => {
+1080                let left = maybe_fmt_left_with_parens(&op.kind, &left.kind);
+1081                let right = maybe_fmt_right_with_parens(&op.kind, &right.kind);
+1082                write!(f, "{} {} {}", left, op.kind, right)
+1083            }
+1084            Expr::BinOperation { left, op, right } => {
+1085                let left = maybe_fmt_left_with_parens(&op.kind, &left.kind);
+1086                let right = maybe_fmt_right_with_parens(&op.kind, &right.kind);
+1087                write!(f, "{} {} {}", left, op.kind, right)
+1088            }
+1089            Expr::UnaryOperation { op, operand } => {
+1090                let operand = maybe_fmt_operand_with_parens(&op.kind, &operand.kind);
+1091                if op.kind == UnaryOperator::Not {
+1092                    write!(f, "{} {}", op.kind, operand)
+1093                } else {
+1094                    write!(f, "{}{}", op.kind, operand)
+1095                }
+1096            }
+1097            Expr::CompOperation { left, op, right } => {
+1098                let left = maybe_fmt_left_with_parens(&op.kind, &left.kind);
+1099                let right = maybe_fmt_right_with_parens(&op.kind, &right.kind);
+1100                write!(f, "{} {} {}", left, op.kind, right)
+1101            }
+1102            Expr::Attribute { value, attr } => write!(f, "{}.{}", value.kind, attr.kind),
+1103            Expr::Subscript { value, index } => write!(f, "{}[{}]", value.kind, index.kind),
+1104            Expr::Call {
+1105                func,
+1106                generic_args,
+1107                args,
+1108            } => {
+1109                write!(f, "{}", func.kind)?;
+1110                if let Some(generic_args) = generic_args {
+1111                    write!(f, "<{}>", comma_joined(generic_args.kind.iter()))?;
+1112                }
+1113                write!(f, "({})", node_comma_joined(&args.kind))
+1114            }
+1115            Expr::List { elts } => write!(f, "[{}]", node_comma_joined(elts)),
+1116            Expr::Repeat { value: elt, len } => write!(f, "[{}; {}]", elt.kind, len.kind),
+1117            Expr::Tuple { elts } => {
+1118                if elts.len() == 1 {
+1119                    write!(f, "({},)", elts[0].kind)
+1120                } else {
+1121                    write!(f, "({})", node_comma_joined(elts))
+1122                }
+1123            }
+1124            Expr::Bool(bool) => write!(f, "{bool}"),
+1125            Expr::Name(name) => write!(f, "{name}"),
+1126            Expr::Path(path) => write!(f, "{path}"),
+1127            Expr::Num(num) => write!(f, "{num}"),
+1128            Expr::Str(str) => write!(f, "\"{str}\""),
+1129            Expr::Unit => write!(f, "()"),
+1130        }
+1131    }
+1132}
+1133
+1134impl fmt::Display for CallArg {
+1135    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
+1136        if let Some(label) = &self.label {
+1137            if let Expr::Name(var_name) = &self.value.kind {
+1138                if var_name == &label.kind {
+1139                    return write!(f, "{var_name}");
+1140                }
+1141            }
+1142            write!(f, "{}: {}", label.kind, self.value.kind)
+1143        } else {
+1144            write!(f, "{}", self.value.kind)
+1145        }
+1146    }
+1147}
+1148
+1149impl fmt::Display for BoolOperator {
+1150    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1151        use BoolOperator::*;
+1152        match self {
+1153            And => write!(f, "and"),
+1154            Or => write!(f, "or"),
+1155        }
+1156    }
+1157}
+1158
+1159impl fmt::Display for BinOperator {
+1160    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1161        use BinOperator::*;
+1162        match self {
+1163            Add => write!(f, "+"),
+1164            Sub => write!(f, "-"),
+1165            Mult => write!(f, "*"),
+1166            Div => write!(f, "/"),
+1167            Mod => write!(f, "%"),
+1168            Pow => write!(f, "**"),
+1169            LShift => write!(f, "<<"),
+1170            RShift => write!(f, ">>"),
+1171            BitOr => write!(f, "|"),
+1172            BitXor => write!(f, "^"),
+1173            BitAnd => write!(f, "&"),
+1174        }
+1175    }
+1176}
+1177
+1178impl fmt::Display for UnaryOperator {
+1179    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1180        use UnaryOperator::*;
+1181        match self {
+1182            Invert => write!(f, "~"),
+1183            Not => write!(f, "not"),
+1184            USub => write!(f, "-"),
+1185        }
+1186    }
+1187}
+1188
+1189impl fmt::Display for CompOperator {
+1190    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1191        use CompOperator::*;
+1192        match self {
+1193            Eq => write!(f, "=="),
+1194            NotEq => write!(f, "!="),
+1195            Lt => write!(f, "<"),
+1196            LtE => write!(f, "<="),
+1197            Gt => write!(f, ">"),
+1198            GtE => write!(f, ">="),
+1199        }
+1200    }
+1201}
+1202
+1203impl fmt::Display for MatchArm {
+1204    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1205        write!(f, "{} => {{", self.pat.kind)?;
+1206        write_nodes_line_wrapped(&mut indented(f), &self.body)?;
+1207        write!(f, "}}")
+1208    }
+1209}
+1210
+1211impl fmt::Display for Pattern {
+1212    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1213        match self {
+1214            Self::WildCard => write!(f, "_"),
+1215            Self::Rest => write!(f, ".."),
+1216            Self::Literal(pat) => write!(f, "{}", pat.kind),
+1217            Self::Path(path) => write!(f, "{}", path.kind),
+1218            Self::PathTuple(path, elts) => {
+1219                write!(f, "{}", path.kind)?;
+1220                write!(f, "({})", node_comma_joined(elts))
+1221            }
+1222            Self::Tuple(elts) => {
+1223                write!(f, "({})", node_comma_joined(elts))
+1224            }
+1225            Self::PathStruct {
+1226                path,
+1227                fields,
+1228                has_rest: is_rest,
+1229            } => {
+1230                write!(f, "{}", path.kind)?;
+1231                let fields = fields
+1232                    .iter()
+1233                    .map(|(name, pat)| format!("{}: {}", name.kind, pat.kind));
+1234                let fields = comma_joined(fields);
+1235                if *is_rest {
+1236                    write!(f, "{{{fields}, ..}}")
+1237                } else {
+1238                    write!(f, "{{{fields}}}")
+1239                }
+1240            }
+1241            Self::Or(pats) => {
+1242                write!(f, "{}", node_delim_joined(pats, "| "))
+1243            }
+1244        }
+1245    }
+1246}
+1247
+1248impl fmt::Display for LiteralPattern {
+1249    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+1250        match self {
+1251            Self::Bool(b) => write!(f, "{b}"),
+1252        }
+1253    }
+1254}
+1255
+1256fn node_comma_joined(nodes: &[Node<impl fmt::Display>]) -> String {
+1257    node_delim_joined(nodes, ", ")
+1258}
+1259
+1260fn node_delim_joined(nodes: &[Node<impl fmt::Display>], delim: &str) -> String {
+1261    delim_joined(nodes.iter().map(|node| &node.kind), delim)
+1262}
+1263
+1264fn comma_joined<T>(items: impl Iterator<Item = T>) -> String
+1265where
+1266    T: fmt::Display,
+1267{
+1268    delim_joined(items, ", ")
+1269}
+1270
+1271fn delim_joined<T>(items: impl Iterator<Item = T>, delim: &str) -> String
+1272where
+1273    T: fmt::Display,
+1274{
+1275    items
+1276        .map(|item| format!("{item}"))
+1277        .collect::<Vec<_>>()
+1278        .join(delim)
+1279}
+1280
+1281fn write_nodes_line_wrapped(f: &mut impl Write, nodes: &[Node<impl fmt::Display>]) -> fmt::Result {
+1282    if !nodes.is_empty() {
+1283        writeln!(f)?;
+1284    }
+1285    for n in nodes {
+1286        writeln!(f, "{}", n.kind)?;
+1287    }
+1288    Ok(())
+1289}
+1290
+1291fn double_line_joined(items: &[impl fmt::Display]) -> String {
+1292    items
+1293        .iter()
+1294        .map(|item| format!("{item}"))
+1295        .collect::<Vec<_>>()
+1296        .join("\n\n")
+1297}
+1298
+1299trait InfixBindingPower {
+1300    fn infix_binding_power(&self) -> (u8, u8);
+1301}
+1302
+1303trait PrefixBindingPower {
+1304    fn prefix_binding_power(&self) -> u8;
+1305}
+1306
+1307impl InfixBindingPower for BoolOperator {
+1308    fn infix_binding_power(&self) -> (u8, u8) {
+1309        use BoolOperator::*;
+1310
+1311        match self {
+1312            Or => (50, 51),
+1313            And => (60, 61),
+1314        }
+1315    }
+1316}
+1317
+1318impl InfixBindingPower for BinOperator {
+1319    fn infix_binding_power(&self) -> (u8, u8) {
+1320        use BinOperator::*;
+1321
+1322        match self {
+1323            Add | Sub => (120, 121),
+1324            Mult | Div | Mod => (130, 131),
+1325            Pow => (141, 140),
+1326            LShift | RShift => (110, 111),
+1327            BitOr => (80, 81),
+1328            BitXor => (90, 91),
+1329            BitAnd => (100, 101),
+1330        }
+1331    }
+1332}
+1333
+1334impl InfixBindingPower for CompOperator {
+1335    fn infix_binding_power(&self) -> (u8, u8) {
+1336        (70, 71)
+1337    }
+1338}
+1339
+1340impl PrefixBindingPower for UnaryOperator {
+1341    fn prefix_binding_power(&self) -> u8 {
+1342        use UnaryOperator::*;
+1343
+1344        match self {
+1345            Not => 65,
+1346            Invert | USub => 135,
+1347        }
+1348    }
+1349}
+1350
+1351fn maybe_fmt_left_with_parens(op: &impl InfixBindingPower, expr: &Expr) -> String {
+1352    if expr_right_binding_power(expr) < op.infix_binding_power().0 {
+1353        format!("({expr})")
+1354    } else {
+1355        format!("{expr}")
+1356    }
+1357}
+1358
+1359fn maybe_fmt_right_with_parens(op: &impl InfixBindingPower, expr: &Expr) -> String {
+1360    if op.infix_binding_power().1 > expr_left_binding_power(expr) {
+1361        format!("({expr})")
+1362    } else {
+1363        format!("{expr}")
+1364    }
+1365}
+1366
+1367fn maybe_fmt_operand_with_parens(op: &impl PrefixBindingPower, expr: &Expr) -> String {
+1368    if op.prefix_binding_power() > expr_left_binding_power(expr) {
+1369        format!("({expr})")
+1370    } else {
+1371        format!("{expr}")
+1372    }
+1373}
+1374
+1375fn expr_left_binding_power(expr: &Expr) -> u8 {
+1376    let max_power = u8::MAX;
+1377
+1378    match expr {
+1379        Expr::Ternary { .. } => max_power,
+1380        Expr::BoolOperation { op, .. } => op.kind.infix_binding_power().0,
+1381        Expr::BinOperation { op, .. } => op.kind.infix_binding_power().0,
+1382        Expr::UnaryOperation { op, .. } => op.kind.prefix_binding_power(),
+1383        Expr::CompOperation { op, .. } => op.kind.infix_binding_power().0,
+1384        Expr::Attribute { .. } => max_power,
+1385        Expr::Subscript { .. } => max_power,
+1386        Expr::Call { .. } => max_power,
+1387        Expr::List { .. } => max_power,
+1388        Expr::Repeat { .. } => max_power,
+1389        Expr::Tuple { .. } => max_power,
+1390        Expr::Bool(_) => max_power,
+1391        Expr::Name(_) => max_power,
+1392        Expr::Path(_) => max_power,
+1393        Expr::Num(_) => max_power,
+1394        Expr::Str(_) => max_power,
+1395        Expr::Unit => max_power,
+1396    }
+1397}
+1398
+1399fn expr_right_binding_power(expr: &Expr) -> u8 {
+1400    let max_power = u8::MAX;
+1401
+1402    match expr {
+1403        Expr::Ternary { .. } => max_power,
+1404        Expr::BoolOperation { op, .. } => op.kind.infix_binding_power().1,
+1405        Expr::BinOperation { op, .. } => op.kind.infix_binding_power().1,
+1406        Expr::UnaryOperation { op, .. } => op.kind.prefix_binding_power(),
+1407        Expr::CompOperation { op, .. } => op.kind.infix_binding_power().1,
+1408        Expr::Attribute { .. } => max_power,
+1409        Expr::Subscript { .. } => max_power,
+1410        Expr::Call { .. } => max_power,
+1411        Expr::List { .. } => max_power,
+1412        Expr::Repeat { .. } => max_power,
+1413        Expr::Tuple { .. } => max_power,
+1414        Expr::Bool(_) => max_power,
+1415        Expr::Name(_) => max_power,
+1416        Expr::Path(_) => max_power,
+1417        Expr::Num(_) => max_power,
+1418        Expr::Str(_) => max_power,
+1419        Expr::Unit => max_power,
+1420    }
+1421}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar.rs.html b/compiler-docs/src/fe_parser/grammar.rs.html new file mode 100644 index 0000000000..c1426ad55f --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar.rs.html @@ -0,0 +1,5 @@ +grammar.rs - source

fe_parser/
grammar.rs

1pub mod contracts;
+2pub mod expressions;
+3pub mod functions;
+4pub mod module;
+5pub mod types;
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/contracts.rs.html b/compiler-docs/src/fe_parser/grammar/contracts.rs.html new file mode 100644 index 0000000000..3bf030d9f2 --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/contracts.rs.html @@ -0,0 +1,91 @@ +contracts.rs - source

fe_parser/grammar/
contracts.rs

1use super::functions::parse_fn_def;
+2use super::types::{parse_field, parse_opt_qualifier};
+3
+4use crate::ast::{Contract, ContractStmt};
+5use crate::node::{Node, Span};
+6use crate::{ParseFailed, ParseResult, Parser, TokenKind};
+7
+8// Rule: all "statement" level parse functions consume their trailing
+9// newline(s), either directly or via a function they call.
+10// This is required to parse an `if` block, because we need to peek past the
+11// trailing newlines to check whether it's followed by an `else` block, and is
+12// done for all statements for consistency.
+13
+14/// Parse a contract definition.
+15/// # Panics
+16/// Panics if the next token isn't `contract`.
+17pub fn parse_contract_def(
+18    par: &mut Parser,
+19    contract_pub_qual: Option<Span>,
+20) -> ParseResult<Node<Contract>> {
+21    let contract_tok = par.assert(TokenKind::Contract);
+22    let contract_name = par.expect_with_notes(
+23        TokenKind::Name,
+24        "failed to parse contract definition",
+25        |_| vec!["Note: `contract` must be followed by a name, which must start with a letter and contain only letters, numbers, or underscores".into()],
+26    )?;
+27
+28    let mut span = contract_tok.span + contract_name.span;
+29    par.enter_block(span, "contract definition")?;
+30
+31    let mut fields = vec![];
+32    let mut defs = vec![];
+33
+34    loop {
+35        par.eat_newlines();
+36        let mut pub_qual = parse_opt_qualifier(par, TokenKind::Pub);
+37        let const_qual = parse_opt_qualifier(par, TokenKind::Const);
+38        if pub_qual.is_none() && const_qual.is_some() && par.peek() == Some(TokenKind::Pub) {
+39            pub_qual = parse_opt_qualifier(par, TokenKind::Pub);
+40            par.error(
+41                pub_qual.unwrap() + const_qual,
+42                "`const pub` should be written `pub const`",
+43            );
+44        }
+45
+46        match par.peek_or_err()? {
+47            TokenKind::Name => {
+48                let field = parse_field(par, vec![], pub_qual, const_qual)?;
+49                if !defs.is_empty() {
+50                    par.error(
+51                        field.span,
+52                        "contract field definitions must come before any function definitions",
+53                    );
+54                }
+55                fields.push(field);
+56            }
+57            TokenKind::Fn | TokenKind::Unsafe => {
+58                if let Some(span) = const_qual {
+59                    par.error(
+60                        span,
+61                        "`const` qualifier can't be used with function definitions",
+62                    );
+63                }
+64                defs.push(ContractStmt::Function(parse_fn_def(par, pub_qual)?));
+65            }
+66            TokenKind::BraceClose => {
+67                span += par.next()?.span;
+68                break;
+69            }
+70            _ => {
+71                let tok = par.next()?;
+72                par.unexpected_token_error(
+73                    &tok,
+74                    "failed to parse contract definition body",
+75                    vec![],
+76                );
+77                return Err(ParseFailed);
+78            }
+79        };
+80    }
+81
+82    Ok(Node::new(
+83        Contract {
+84            name: Node::new(contract_name.text.into(), contract_name.span),
+85            fields,
+86            body: defs,
+87            pub_qual: contract_pub_qual,
+88        },
+89        span,
+90    ))
+91}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/expressions.rs.html b/compiler-docs/src/fe_parser/grammar/expressions.rs.html new file mode 100644 index 0000000000..deb9c5aaa7 --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/expressions.rs.html @@ -0,0 +1,677 @@ +expressions.rs - source

fe_parser/grammar/
expressions.rs

1use crate::ast::{self, CallArg, Expr, GenericArg, Path};
+2use crate::node::Node;
+3use crate::{Label, ParseFailed, ParseResult, Parser, Token, TokenKind};
+4
+5use super::types::parse_generic_args;
+6
+7use if_chain::if_chain;
+8
+9// Expressions are parsed in Pratt's top-down operator precedence style.
+10// See this article for a nice explanation:
+11// <https://matklad.github.io/2020/04/13/simple-but-powerful-pratt-parsing.html>
+12
+13/// Parse an expression, starting with the next token.
+14pub fn parse_expr(par: &mut Parser) -> ParseResult<Node<Expr>> {
+15    parse_expr_with_min_bp(par, 0)
+16}
+17
+18/// Parse an expression, stopping if/when we reach an operator that binds less
+19/// tightly than given binding power.
+20pub fn parse_expr_with_min_bp(par: &mut Parser, min_bp: u8) -> ParseResult<Node<Expr>> {
+21    let mut expr_head = parse_expr_head(par)?;
+22
+23    while let Some(op) = par.peek() {
+24        if let Some(lbp) = postfix_binding_power(op) {
+25            if lbp < min_bp {
+26                break;
+27            }
+28
+29            expr_head = match op {
+30                TokenKind::ParenOpen => {
+31                    let args = parse_call_args(par)?;
+32                    let span = expr_head.span + args.span;
+33                    Node::new(
+34                        Expr::Call {
+35                            func: Box::new(expr_head),
+36                            generic_args: None,
+37                            args,
+38                        },
+39                        span,
+40                    )
+41                }
+42                TokenKind::BracketOpen => {
+43                    par.next()?;
+44                    let index = parse_expr(par)?;
+45                    let rbracket = par.expect(
+46                        TokenKind::BracketClose,
+47                        "failed to parse subscript expression",
+48                    )?;
+49                    let span = expr_head.span + rbracket.span;
+50                    Node::new(
+51                        Expr::Subscript {
+52                            value: Box::new(expr_head),
+53                            index: Box::new(index),
+54                        },
+55                        span,
+56                    )
+57                }
+58                TokenKind::If => {
+59                    par.next()?;
+60                    let test = parse_expr(par)?;
+61                    par.expect(
+62                        TokenKind::Else,
+63                        "failed to parse ternary `if-else` expression",
+64                    )?;
+65                    let else_val = parse_expr(par)?;
+66                    let span = expr_head.span + else_val.span;
+67                    Node::new(
+68                        Expr::Ternary {
+69                            if_expr: Box::new(expr_head),
+70                            test: Box::new(test),
+71                            else_expr: Box::new(else_val),
+72                        },
+73                        span,
+74                    )
+75                }
+76                _ => unreachable!(), // patterns above must match those in `postfix_binding_power`
+77            };
+78            continue;
+79        }
+80
+81        if matches!(op, TokenKind::Lt) {
+82            let mut bt_par = par.as_bt_parser();
+83            if_chain! {
+84                if let Ok(generic_args) = parse_generic_args(&mut bt_par);
+85                if matches!(bt_par.peek(), Some(TokenKind::ParenOpen));
+86                if let Ok(args) = parse_call_args(&mut bt_par);
+87                then {
+88                    let span = expr_head.span + args.span;
+89                    expr_head = Node::new(
+90                        Expr::Call {
+91                            func: Box::new(expr_head),
+92                            generic_args: Some(generic_args),
+93                            args,
+94                        },
+95                        span,
+96                    );
+97                    bt_par.accept();
+98                    continue;
+99                }
+100            }
+101        }
+102
+103        if let Some((lbp, rbp)) = infix_binding_power(op) {
+104            if lbp < min_bp {
+105                break;
+106            }
+107
+108            let op_tok = par.next()?;
+109            let rhs = parse_expr_with_min_bp(par, rbp)?;
+110            expr_head = infix_op(par, expr_head, &op_tok, rhs)?;
+111            continue;
+112        }
+113        break;
+114    }
+115
+116    Ok(expr_head)
+117}
+118
+119/// Parse call arguments
+120pub fn parse_call_args(par: &mut Parser) -> ParseResult<Node<Vec<Node<CallArg>>>> {
+121    use TokenKind::*;
+122    let lparen = par.assert(ParenOpen);
+123    let mut args = vec![];
+124    let mut span = lparen.span;
+125    loop {
+126        if par.peek_or_err()? == ParenClose {
+127            span += par.next()?.span;
+128            break;
+129        }
+130
+131        let arg = parse_expr(par)?;
+132        match par.peek_or_err()? {
+133            TokenKind::Eq => {
+134                let eq = par.next()?;
+135                if let Expr::Name(name) = arg.kind {
+136                    par.fancy_error(
+137                        "Syntax error in argument list",
+138                        vec![Label::primary(eq.span, "unexpected `=`".to_string())],
+139                        vec![
+140                            "Argument labels should be followed by `:`.".to_string(),
+141                            format!("Hint: try `{name}:`"),
+142                            "If this is a variable assignment, it must be a standalone statement."
+143                                .to_string(),
+144                        ],
+145                    );
+146                    let value = parse_expr(par)?;
+147                    let span = arg.span + value.span;
+148                    args.push(Node::new(
+149                        CallArg {
+150                            label: Some(Node::new(name, arg.span)),
+151                            value,
+152                        },
+153                        span,
+154                    ));
+155                } else {
+156                    par.fancy_error(
+157                        "Syntax error in argument list",
+158                        vec![Label::primary(eq.span, "unexpected `=`".to_string())],
+159                        vec![],
+160                    );
+161                }
+162            }
+163
+164            TokenKind::Colon => {
+165                let sep_tok = par.next()?;
+166                let value = parse_expr(par)?;
+167                if let Expr::Name(name) = arg.kind {
+168                    let span = arg.span + value.span;
+169                    args.push(Node::new(
+170                        CallArg {
+171                            label: Some(Node::new(name, arg.span)),
+172                            value,
+173                        },
+174                        span,
+175                    ));
+176                } else {
+177                    par.fancy_error(
+178                        "Syntax error in function call argument list",
+179                        vec![
+180                            Label::primary(
+181                                sep_tok.span,
+182                                "In a function call, `:` is used for named arguments".to_string(),
+183                            ),
+184                            Label::secondary(
+185                                arg.span,
+186                                "this should be a function parameter name".to_string(),
+187                            ),
+188                        ],
+189                        vec![],
+190                    );
+191                    return Err(ParseFailed);
+192                }
+193            }
+194            _ => {
+195                let span = arg.span;
+196                args.push(Node::new(
+197                    CallArg {
+198                        label: None,
+199                        value: arg,
+200                    },
+201                    span,
+202                ));
+203            }
+204        }
+205        if par.peek_or_err()? == Comma {
+206            par.next()?;
+207        } else {
+208            span += par
+209                .expect(ParenClose, "failed to parse function call argument list")?
+210                .span;
+211            break;
+212        }
+213    }
+214
+215    Ok(Node::new(args, span))
+216}
+217
+218/// Try to build an expression starting with the given token.
+219fn parse_expr_head(par: &mut Parser) -> ParseResult<Node<Expr>> {
+220    use TokenKind::*;
+221
+222    match par.peek_or_err()? {
+223        Name | SelfValue | Int | Hex | Octal | Binary | Text | True | False => {
+224            let tok = par.next()?;
+225            Ok(atom(par, &tok))
+226        }
+227        Plus | Minus | Not | Tilde => {
+228            let op = par.next()?;
+229            let operand = parse_expr_with_min_bp(par, prefix_binding_power(op.kind))?;
+230            unary_op(par, &op, operand)
+231        }
+232        ParenOpen => parse_group_or_tuple(par),
+233        BracketOpen => parse_list_or_repeat(par),
+234        _ => {
+235            let tok = par.next()?;
+236            par.unexpected_token_error(
+237                &tok,
+238                format!("Unexpected token while parsing expression: `{}`", tok.text),
+239                vec![],
+240            );
+241            Err(ParseFailed)
+242        }
+243    }
+244}
+245
+246/// Specifies how tightly a prefix unary operator binds to its operand.
+247fn prefix_binding_power(op: TokenKind) -> u8 {
+248    use TokenKind::*;
+249    match op {
+250        Not => 65,
+251        Plus | Minus | Tilde => 135,
+252        _ => panic!("Unexpected unary op token: {op:?}"),
+253    }
+254}
+255
+256/// Specifies how tightly does an infix operator bind to its left and right
+257/// operands. See https://docs.python.org/3/reference/expressions.html#operator-precedence
+258fn infix_binding_power(op: TokenKind) -> Option<(u8, u8)> {
+259    use TokenKind::*;
+260
+261    let bp = match op {
+262        // assignment expr `:=`?
+263        // lambda?
+264        // Comma => (40, 41),
+265        Or => (50, 51),
+266        And => (60, 61),
+267        // prefix Not => 65
+268
+269        // all comparisons are the same
+270        Lt | LtEq | Gt | GtEq | NotEq | EqEq => (70, 71),
+271
+272        Pipe => (80, 81),
+273        Hat => (90, 91),
+274        Amper => (100, 101),
+275        LtLt | GtGt => (110, 111),
+276        Plus | Minus => (120, 121),
+277        Star | Slash | Percent => (130, 131),
+278        // Prefix Plus | Minus | Tilde => 135
+279        StarStar => (141, 140),
+280        Dot => (150, 151),
+281        ColonColon => (160, 161),
+282        _ => return None,
+283    };
+284    Some(bp)
+285}
+286
+287/// Specifies how tightly a postfix operator binds to its operand.
+288/// We don't have any "real" postfix operators (like `?` in rust),
+289/// but we treat `[`, `(`, and ternary `if` as though they're postfix
+290/// operators.
+291fn postfix_binding_power(op: TokenKind) -> Option<u8> {
+292    use TokenKind::*;
+293    match op {
+294        If => Some(35), // ternary
+295        BracketOpen | ParenOpen => Some(150),
+296        _ => None,
+297    }
+298}
+299
+300/// Parse a square-bracket list expression, eg. `[1, 2, x]` or `[true; 42]`
+301fn parse_list_or_repeat(par: &mut Parser) -> ParseResult<Node<Expr>> {
+302    let lbracket = par.assert(TokenKind::BracketOpen);
+303    let elts = parse_expr_list(par, &[TokenKind::BracketClose, TokenKind::Semi], None)?;
+304
+305    if elts.len() == 1 {
+306        if par.peek() == Some(TokenKind::BracketClose) {
+307            let rbracket = par.assert(TokenKind::BracketClose);
+308            let span = lbracket.span + rbracket.span;
+309            Ok(Node::new(Expr::List { elts }, span))
+310        } else if par.peek() == Some(TokenKind::Semi) {
+311            par.assert(TokenKind::Semi);
+312
+313            let len = if par.peek() == Some(TokenKind::BraceOpen) {
+314                // handle `{ ... }` const expression
+315                let brace_open = par.next()?;
+316                let expr = parse_expr(par)?;
+317                if !matches!(par.peek(), Some(TokenKind::BraceClose)) {
+318                    par.error(brace_open.span, "missing closing delimiter `}`");
+319                    return Err(ParseFailed);
+320                }
+321                let brace_close = par.assert(TokenKind::BraceClose);
+322                let span = brace_open.span + brace_close.span;
+323                Box::new(Node::new(GenericArg::ConstExpr(expr), span))
+324            } else {
+325                // handle const expression without braces
+326                let expr = parse_expr(par)?;
+327                let span = expr.span;
+328                Box::new(Node::new(GenericArg::ConstExpr(expr), span))
+329            };
+330
+331            let rbracket = par.assert(TokenKind::BracketClose);
+332            let span = lbracket.span + rbracket.span;
+333            Ok(Node::new(
+334                Expr::Repeat {
+335                    value: Box::new(elts[0].clone()),
+336                    len,
+337                },
+338                span,
+339            ))
+340        } else {
+341            par.error(lbracket.span, "expected `]` or `;`");
+342            Err(ParseFailed)
+343        }
+344    } else {
+345        let rbracket = par.assert(TokenKind::BracketClose);
+346        let span = lbracket.span + rbracket.span;
+347        Ok(Node::new(Expr::List { elts }, span))
+348    }
+349}
+350
+351/// Parse a paren-wrapped expression, which might turn out to be a tuple
+352/// if it contains commas.
+353fn parse_group_or_tuple(par: &mut Parser) -> ParseResult<Node<Expr>> {
+354    use TokenKind::*;
+355    let lparen = par.assert(ParenOpen);
+356    if par.peek_or_err()? == ParenClose {
+357        let rparen = par.next()?;
+358        let span = lparen.span + rparen.span;
+359        return Ok(Node::new(Expr::Unit, span));
+360    }
+361
+362    let elem = parse_expr(par)?;
+363    match par.peek_or_err()? {
+364        ParenClose => {
+365            // expr wrapped in parens
+366            let rparen = par.next()?;
+367            let span = lparen.span + rparen.span;
+368            Ok(Node::new(elem.kind, span))
+369        }
+370        Comma => {
+371            // tuple
+372            par.next()?;
+373            let elts = parse_expr_list(par, &[ParenClose], Some(elem))?;
+374            let rparen = par.expect(ParenClose, "failed to parse tuple expression")?;
+375            let span = lparen.span + rparen.span;
+376            Ok(Node::new(Expr::Tuple { elts }, span))
+377        }
+378        _ => {
+379            let tok = par.next()?;
+380            par.unexpected_token_error(
+381                &tok,
+382                "Unexpected token while parsing expression in parentheses",
+383                vec![],
+384            );
+385            Err(ParseFailed)
+386        }
+387    }
+388}
+389
+390/// Parse some number of comma-separated expressions, until `end_marker` is
+391/// `peek()`ed.
+392fn parse_expr_list(
+393    par: &mut Parser,
+394    end_markers: &[TokenKind],
+395    head: Option<Node<Expr>>,
+396) -> ParseResult<Vec<Node<Expr>>> {
+397    let mut elts = vec![];
+398    if let Some(elem) = head {
+399        elts.push(elem);
+400    }
+401    loop {
+402        let next = par.peek_or_err()?;
+403        if end_markers.contains(&next) {
+404            break;
+405        }
+406        elts.push(parse_expr(par)?);
+407        match par.peek_or_err()? {
+408            TokenKind::Comma => {
+409                par.next()?;
+410            }
+411            tk if end_markers.contains(&tk) => break,
+412            _ => {
+413                let tok = par.next()?;
+414                par.unexpected_token_error(
+415                    &tok,
+416                    "Unexpected token while parsing list of expressions",
+417                    vec![],
+418                );
+419                return Err(ParseFailed);
+420            }
+421        }
+422    }
+423
+424    Ok(elts)
+425}
+426
+427/* node building utils */
+428
+429/// Create an "atom" expr from the given `Token` (`Name`, `Num`, `Bool`, etc)
+430fn atom(par: &mut Parser, tok: &Token) -> Node<Expr> {
+431    use TokenKind::*;
+432
+433    let expr = match tok.kind {
+434        Name | SelfValue => Expr::Name(tok.text.into()),
+435        Int | Hex | Octal | Binary => Expr::Num(tok.text.into()),
+436        True | False => Expr::Bool(tok.kind == True),
+437        Text => {
+438            if let Some(string) = unescape_string(tok.text) {
+439                Expr::Str(string.into())
+440            } else {
+441                par.error(tok.span, "String contains an invalid escape sequence");
+442                Expr::Str(tok.text.into())
+443            }
+444        }
+445        _ => panic!("Unexpected atom token: {tok:?}"),
+446    };
+447    Node::new(expr, tok.span)
+448}
+449
+450fn unescape_string(quoted_string: &str) -> Option<String> {
+451    let inner = &quoted_string[1..quoted_string.len() - 1];
+452    unescape::unescape(inner)
+453}
+454
+455/// Create an expr from the given infix operator and operands.
+456fn infix_op(
+457    par: &mut Parser,
+458    left: Node<Expr>,
+459    op: &Token,
+460    right: Node<Expr>,
+461) -> ParseResult<Node<Expr>> {
+462    use TokenKind::*;
+463    let expr = match op.kind {
+464        Or | And => bool_op(left, op, right),
+465
+466        Amper | Hat | Pipe | LtLt | GtGt | Plus | Minus | Star | Slash | Percent | StarStar => {
+467            bin_op(left, op, right)
+468        }
+469
+470        Lt | LtEq | Gt | GtEq | NotEq | EqEq => comp_op(left, op, right),
+471
+472        Dot => {
+473            let span = left.span + right.span;
+474            match right.kind {
+475                Expr::Name(name) => Node::new(
+476                    Expr::Attribute {
+477                        value: Box::new(left),
+478                        attr: Node::new(name, right.span),
+479                    },
+480                    span,
+481                ),
+482                Expr::Num(_num) => {
+483                    par.error(span, "floats not supported");
+484                    return Err(ParseFailed);
+485                }
+486                Expr::Call {
+487                    func,
+488                    generic_args,
+489                    args,
+490                } => {
+491                    let func_span = left.span + func.span;
+492                    let func = Box::new(Node::new(
+493                        Expr::Attribute {
+494                            value: Box::new(left),
+495                            attr: {
+496                                if let Expr::Name(name) = func.kind {
+497                                    Node::new(name, func.span)
+498                                } else {
+499                                    par.fancy_error(
+500                                        "failed to parse attribute expression",
+501                                        vec![Label::primary(func.span, "expected a name")],
+502                                        vec![],
+503                                    );
+504                                    return Err(ParseFailed);
+505                                }
+506                            },
+507                        },
+508                        func_span,
+509                    ));
+510
+511                    Node::new(
+512                        Expr::Call {
+513                            func,
+514                            generic_args,
+515                            args,
+516                        },
+517                        span,
+518                    )
+519                }
+520                _ => {
+521                    par.fancy_error(
+522                        "failed to parse attribute expression",
+523                        vec![Label::primary(right.span, "expected a name")],
+524                        vec![],
+525                    );
+526                    return Err(ParseFailed);
+527                }
+528            }
+529        }
+530        ColonColon => {
+531            let mut path = match left.kind {
+532                Expr::Name(name) => Path {
+533                    segments: vec![Node::new(name, left.span)],
+534                },
+535                Expr::Path(path) => path,
+536                _ => {
+537                    par.fancy_error(
+538                        "failed to parse path expression",
+539                        vec![
+540                            Label::secondary(op.span, "path delimiter".to_string()),
+541                            Label::primary(left.span, "expected a name"),
+542                        ],
+543                        vec![],
+544                    );
+545                    return Err(ParseFailed);
+546                }
+547            };
+548
+549            // `right` can't be a Path (rbp > lbp); only valid option is `Name`
+550            match right.kind {
+551                Expr::Name(name) => {
+552                    path.segments.push(Node::new(name, right.span));
+553                    Node::new(Expr::Path(path), left.span + right.span)
+554                }
+555                _ => {
+556                    par.fancy_error(
+557                        "failed to parse path expression",
+558                        vec![
+559                            Label::secondary(op.span, "path delimiter".to_string()),
+560                            Label::primary(right.span, "expected a name"),
+561                        ],
+562                        vec![],
+563                    );
+564                    return Err(ParseFailed);
+565                }
+566            }
+567        }
+568        _ => panic!("Unexpected infix op token: {op:?}"),
+569    };
+570    Ok(expr)
+571}
+572
+573/// Create an `Expr::BoolOperation` node for the given operator and operands.
+574fn bool_op(left: Node<Expr>, op: &Token, right: Node<Expr>) -> Node<Expr> {
+575    use TokenKind::*;
+576    let astop = match op.kind {
+577        And => ast::BoolOperator::And,
+578        Or => ast::BoolOperator::Or,
+579        _ => panic!(),
+580    };
+581
+582    let span = left.span + right.span;
+583    Node::new(
+584        Expr::BoolOperation {
+585            left: Box::new(left),
+586            op: Node::new(astop, op.span),
+587            right: Box::new(right),
+588        },
+589        span,
+590    )
+591}
+592
+593/// Create an `Expr::BinOperation` node for the given operator and operands.
+594fn bin_op(left: Node<Expr>, op: &Token, right: Node<Expr>) -> Node<Expr> {
+595    use ast::BinOperator::*;
+596    use TokenKind::*;
+597
+598    let astop = match op.kind {
+599        Amper => BitAnd,
+600        Hat => BitXor,
+601        Pipe => BitOr,
+602        LtLt => LShift,
+603        GtGt => RShift,
+604        Plus => Add,
+605        Minus => Sub,
+606        Star => Mult,
+607        Slash => Div,
+608        Percent => Mod,
+609        StarStar => Pow,
+610        _ => panic!(),
+611    };
+612
+613    let span = left.span + right.span;
+614    Node::new(
+615        Expr::BinOperation {
+616            left: Box::new(left),
+617            op: Node::new(astop, op.span),
+618            right: Box::new(right),
+619        },
+620        span,
+621    )
+622}
+623
+624/// Create an `Expr::UnaryOperation` node for the given operator and operands.
+625fn unary_op(par: &mut Parser, op: &Token, operand: Node<Expr>) -> ParseResult<Node<Expr>> {
+626    use ast::UnaryOperator;
+627    use TokenKind::*;
+628
+629    let astop = match op.kind {
+630        Tilde => UnaryOperator::Invert,
+631        Not => UnaryOperator::Not,
+632        Minus => UnaryOperator::USub,
+633        Plus => {
+634            par.fancy_error(
+635                "unary plus not supported",
+636                vec![Label::primary(op.span, "consider removing the '+'")],
+637                vec![],
+638            );
+639            return Err(ParseFailed);
+640        }
+641        _ => panic!(),
+642    };
+643
+644    let span = op.span + operand.span;
+645    Ok(Node::new(
+646        Expr::UnaryOperation {
+647            op: Node::new(astop, op.span),
+648            operand: Box::new(operand),
+649        },
+650        span,
+651    ))
+652}
+653
+654/// Create an `Expr::CompOperation` node for the given operator and operands.
+655fn comp_op(left: Node<Expr>, op: &Token, right: Node<Expr>) -> Node<Expr> {
+656    use ast::CompOperator;
+657    use TokenKind::*;
+658    let astop = match op.kind {
+659        In => todo!("in"), // CompOperator::In,
+660        Lt => CompOperator::Lt,
+661        LtEq => CompOperator::LtE,
+662        Gt => CompOperator::Gt,
+663        GtEq => CompOperator::GtE,
+664        NotEq => CompOperator::NotEq,
+665        EqEq => CompOperator::Eq,
+666        _ => panic!(),
+667    };
+668    let span = left.span + right.span;
+669    Node::new(
+670        Expr::CompOperation {
+671            left: Box::new(left),
+672            op: Node::new(astop, op.span),
+673            right: Box::new(right),
+674        },
+675        span,
+676    )
+677}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/functions.rs.html b/compiler-docs/src/fe_parser/grammar/functions.rs.html new file mode 100644 index 0000000000..c38edf9bf0 --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/functions.rs.html @@ -0,0 +1,914 @@ +functions.rs - source

fe_parser/grammar/
functions.rs

1use super::expressions::parse_expr;
+2use super::types::parse_type_desc;
+3
+4use crate::ast::{
+5    BinOperator, Expr, FuncStmt, Function, FunctionArg, FunctionSignature, GenericParameter,
+6    LiteralPattern, MatchArm, Path, Pattern, TypeDesc, VarDeclTarget,
+7};
+8use crate::node::{Node, Span};
+9use crate::{Label, ParseFailed, ParseResult, Parser, TokenKind};
+10
+11/// Parse a function definition without a body. The optional `pub` qualifier
+12/// must be parsed by the caller, and passed in. Next token must be `unsafe` or
+13/// `fn`.
+14pub fn parse_fn_sig(
+15    par: &mut Parser,
+16    mut pub_qual: Option<Span>,
+17) -> ParseResult<Node<FunctionSignature>> {
+18    let unsafe_qual = par.optional(TokenKind::Unsafe).map(|tok| tok.span);
+19    if let Some(pub_) = par.optional(TokenKind::Pub) {
+20        let unsafe_span =
+21            unsafe_qual.expect("caller must verify that next token is `unsafe` or `fn`");
+22
+23        par.fancy_error(
+24            "`pub` visibility modifier must come before `unsafe`",
+25            vec![Label::primary(
+26                unsafe_span + pub_.span,
+27                "use `pub unsafe` here",
+28            )],
+29            vec![],
+30        );
+31        pub_qual = pub_qual.or(Some(pub_.span));
+32    }
+33    let fn_tok = par.expect(TokenKind::Fn, "failed to parse function definition")?;
+34    let name = par.expect(TokenKind::Name, "failed to parse function definition")?;
+35
+36    let mut span = fn_tok.span + name.span + unsafe_qual + pub_qual;
+37
+38    let generic_params = if par.peek() == Some(TokenKind::Lt) {
+39        parse_generic_params(par)?
+40    } else {
+41        Node::new(vec![], name.span)
+42    };
+43
+44    let args = match par.peek_or_err()? {
+45        TokenKind::ParenOpen => {
+46            let node = parse_fn_param_list(par)?;
+47            span += node.span;
+48            node.kind
+49        }
+50        TokenKind::BraceOpen | TokenKind::Arrow => {
+51            par.fancy_error(
+52                "function definition requires a list of parameters",
+53                vec![Label::primary(
+54                    name.span,
+55                    "function name must be followed by `(`",
+56                )],
+57                vec![
+58                    format!(
+59                        "Note: if the function `{}` takes no parameters, use an empty set of parentheses.",
+60                        name.text
+61                    ),
+62                    format!("Example: fn {}()", name.text),
+63                    "Note: each parameter must have a name and a type.".into(),
+64                    format!("Example: fn {}(my_value: u256, x: bool)", name.text),
+65                ],
+66            );
+67            vec![]
+68        }
+69        _ => {
+70            let tok = par.next()?;
+71            par.unexpected_token_error(
+72                &tok,
+73                "failed to parse function definition",
+74                vec![
+75                    "function name must be followed by a list of parameters".into(),
+76                    "Example: `fn foo(x: address, y: u256)` or `fn f()`".into(),
+77                ],
+78            );
+79            return Err(ParseFailed);
+80        }
+81    };
+82    let return_type = if par.peek() == Some(TokenKind::Arrow) {
+83        par.next()?;
+84        let typ = parse_type_desc(par)?;
+85        span += typ.span;
+86        Some(typ)
+87    } else {
+88        None
+89    };
+90
+91    Ok(Node::new(
+92        FunctionSignature {
+93            pub_: pub_qual,
+94            unsafe_: unsafe_qual,
+95            name: name.into(),
+96            args,
+97            generic_params,
+98            return_type,
+99        },
+100        span,
+101    ))
+102}
+103
+104/// Parse a function definition. The optional `pub` qualifier must be parsed by
+105/// the caller, and passed in. Next token must be `unsafe` or `fn`.
+106pub fn parse_fn_def(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<Function>> {
+107    let sig = parse_fn_sig(par, pub_qual)?;
+108
+109    // TODO: allow multi-line return type? `fn f()\n ->\n u8`
+110    par.enter_block(sig.span, "function definition")?;
+111    let body = parse_block_stmts(par)?;
+112    let rbrace = par.expect(TokenKind::BraceClose, "missing `}` in fn definition")?;
+113
+114    Ok(Node::new(
+115        Function {
+116            sig: sig.clone(),
+117            body,
+118        },
+119        sig.span + rbrace.span,
+120    ))
+121}
+122
+123/// Parse a single generic function parameter (eg. `T:SomeTrait` in `fn foo<T:
+124/// SomeTrait>(some_arg: u256) -> bool`). # Panics
+125/// Panics if the first token isn't `Name`.
+126pub fn parse_generic_param(par: &mut Parser) -> ParseResult<GenericParameter> {
+127    use TokenKind::*;
+128
+129    let name = par.assert(Name);
+130    match par.optional(Colon) {
+131        Some(_) => {
+132            let bound = par.expect(TokenKind::Name, "failed to parse generic bound")?;
+133            Ok(GenericParameter::Bounded {
+134                name: Node::new(name.text.into(), name.span),
+135                bound: Node::new(
+136                    TypeDesc::Base {
+137                        base: bound.text.into(),
+138                    },
+139                    bound.span,
+140                ),
+141            })
+142        }
+143        None => Ok(GenericParameter::Unbounded(Node::new(
+144            name.text.into(),
+145            name.span,
+146        ))),
+147    }
+148}
+149
+150/// Parse an angle-bracket-wrapped list of generic arguments (eg. `<T, R:
+151/// SomeTrait>` in `fn foo<T, R: SomeTrait>(some_arg: u256) -> bool`). # Panics
+152/// Panics if the first token isn't `<`.
+153pub fn parse_generic_params(par: &mut Parser) -> ParseResult<Node<Vec<GenericParameter>>> {
+154    use TokenKind::*;
+155    let mut span = par.assert(Lt).span;
+156
+157    let mut args = vec![];
+158
+159    let expect_end = |par: &mut Parser| {
+160        // If there's no comma, the next token must be `>`
+161        match par.peek_or_err()? {
+162            Gt => Ok(par.next()?.span),
+163            _ => {
+164                let tok = par.next()?;
+165                par.unexpected_token_error(
+166                    &tok,
+167                    "Unexpected token while parsing generic arg list",
+168                    vec!["Expected a `>` here".to_string()],
+169                );
+170                Err(ParseFailed)
+171            }
+172        }
+173    };
+174
+175    loop {
+176        match par.peek_or_err()? {
+177            Gt => {
+178                span += par.next()?.span;
+179                break;
+180            }
+181            Name => {
+182                let typ = parse_generic_param(par)?;
+183                args.push(typ);
+184                if par.peek() == Some(Comma) {
+185                    par.next()?;
+186                } else {
+187                    span += expect_end(par)?;
+188                    break;
+189                }
+190            }
+191
+192            // Invalid generic argument.
+193            _ => {
+194                let tok = par.next()?;
+195                par.unexpected_token_error(
+196                    &tok,
+197                    "failed to parse list of generic function parameters",
+198                    vec!["Expected a generic parameter name such as `T` here".to_string()],
+199                );
+200                return Err(ParseFailed);
+201            }
+202        }
+203    }
+204    Ok(Node::new(args, span))
+205}
+206
+207fn parse_fn_param_list(par: &mut Parser) -> ParseResult<Node<Vec<Node<FunctionArg>>>> {
+208    let mut span = par.assert(TokenKind::ParenOpen).span;
+209    let mut params = vec![];
+210    loop {
+211        match par.peek_or_err()? {
+212            TokenKind::ParenClose => {
+213                span += par.next()?.span;
+214                break;
+215            }
+216            TokenKind::Mut | TokenKind::Name | TokenKind::SelfValue => {
+217                params.push(parse_fn_param(par)?);
+218
+219                if par.peek() == Some(TokenKind::Comma) {
+220                    par.next()?;
+221                } else {
+222                    span += par
+223                        .expect(
+224                            TokenKind::ParenClose,
+225                            "unexpected token while parsing function parameter list",
+226                        )?
+227                        .span;
+228                    break;
+229                }
+230            }
+231            _ => {
+232                let tok = par.next()?;
+233                par.unexpected_token_error(&tok, "failed to parse function parameter list", vec![]);
+234                return Err(ParseFailed);
+235            }
+236        }
+237    }
+238    Ok(Node::new(params, span))
+239}
+240
+241fn parse_fn_param(par: &mut Parser) -> ParseResult<Node<FunctionArg>> {
+242    let mut_ = par.optional(TokenKind::Mut).map(|tok| tok.span);
+243
+244    match par.peek_or_err()? {
+245        TokenKind::SelfValue => Ok(Node::new(FunctionArg::Self_ { mut_ }, par.next()?.span)),
+246        TokenKind::Name => {
+247            let ident = par.next()?;
+248
+249            // Parameter can have an optional label specifier. Example:
+250            //     fn transfer(from sender: address, to recipient: address, _ val: u256)
+251            //     transfer(from: me, to: you, 100)
+252
+253            let (label, name) = match par.optional(TokenKind::Name) {
+254                Some(name) => (Some(ident), name),
+255                None => (None, ident),
+256            };
+257            par.expect_with_notes(
+258                TokenKind::Colon,
+259                "failed to parse function parameter",
+260                |_| {
+261                    vec![
+262                        "Note: parameter name must be followed by a colon and a type description"
+263                            .into(),
+264                        format!("Example: `{}: u256`", name.text),
+265                    ]
+266                },
+267            )?;
+268            let typ = parse_type_desc(par)?;
+269            let param_span = name.span + typ.span + mut_ + label.as_ref();
+270            Ok(Node::new(
+271                FunctionArg::Regular {
+272                    mut_,
+273                    label: label.map(Node::from),
+274                    name: name.into(),
+275                    typ,
+276                },
+277                param_span,
+278            ))
+279        }
+280        _ => {
+281            let tok = par.next()?;
+282            par.unexpected_token_error(&tok, "failed to parse function parameter list", vec![]);
+283            Err(ParseFailed)
+284        }
+285    }
+286}
+287
+288/// Parse (function) statements until a `}` or end-of-file is reached.
+289fn parse_block_stmts(par: &mut Parser) -> ParseResult<Vec<Node<FuncStmt>>> {
+290    let mut body = vec![];
+291    loop {
+292        par.eat_newlines();
+293        match par.peek_or_err()? {
+294            TokenKind::BraceClose => break,
+295            _ => body.push(parse_stmt(par)?),
+296        }
+297    }
+298    Ok(body)
+299}
+300
+301fn aug_assign_op(tk: TokenKind) -> Option<BinOperator> {
+302    use BinOperator::*;
+303    use TokenKind::*;
+304
+305    let op = match tk {
+306        PlusEq => Add,
+307        MinusEq => Sub,
+308        StarEq => Mult,
+309        SlashEq => Div,
+310        PercentEq => Mod,
+311        StarStarEq => Pow,
+312        LtLtEq => LShift,
+313        GtGtEq => RShift,
+314        PipeEq => BitOr,
+315        HatEq => BitXor,
+316        AmperEq => BitAnd,
+317        _ => return None,
+318    };
+319    Some(op)
+320}
+321
+322/// Parse a `continue`, `break`, `pass`, or `revert` statement.
+323///
+324/// # Panics
+325/// Panics if the next token isn't one of the above.
+326pub fn parse_single_word_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+327    let tok = par.next()?;
+328    par.expect_stmt_end(tok.kind.describe())?;
+329    let stmt = match tok.kind {
+330        TokenKind::Continue => FuncStmt::Continue,
+331        TokenKind::Break => FuncStmt::Break,
+332        _ => panic!(),
+333    };
+334    Ok(Node::new(stmt, tok.span))
+335}
+336
+337/// Parse a function-level statement.
+338pub fn parse_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+339    use TokenKind::*;
+340
+341    // rule: stmt parsing fns eat the trailing separator (newline, semi)
+342    match par.peek_or_err()? {
+343        For => parse_for_stmt(par),
+344        If => parse_if_stmt(par),
+345        Match => parse_match_stmt(par),
+346        While => parse_while_stmt(par),
+347        Return => parse_return_stmt(par),
+348        Assert => parse_assert_stmt(par),
+349        Revert => parse_revert_stmt(par),
+350        Continue | Break => parse_single_word_stmt(par),
+351        Let => parse_var_decl(par),
+352        Const => parse_const_decl(par),
+353        Unsafe => parse_unsafe_block(par),
+354        _ => parse_expr_stmt(par),
+355    }
+356}
+357
+358fn parse_var_decl(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+359    let let_tkn = par.assert(TokenKind::Let);
+360    let mut_ = par.optional(TokenKind::Mut).map(|t| t.span);
+361    let expr = parse_expr(par)?;
+362    let target = expr_to_vardecl_target(par, expr.clone())?;
+363    let node = match par.peek() {
+364        Some(TokenKind::Colon) => {
+365            par.next()?;
+366            let typ = parse_type_desc(par)?;
+367            let value = if par.peek() == Some(TokenKind::Eq) {
+368                par.next()?;
+369                Some(parse_expr(par)?)
+370            } else {
+371                None
+372            };
+373            let span = let_tkn.span + target.span + typ.span + value.as_ref();
+374            par.expect_stmt_end("variable declaration")?;
+375            Node::new(
+376                FuncStmt::VarDecl {
+377                    mut_,
+378                    target,
+379                    typ,
+380                    value,
+381                },
+382                span,
+383            )
+384        }
+385        _ => {
+386            par.fancy_error(
+387                "failed to parse variable declaration",
+388                vec![Label::primary(
+389                    expr.span,
+390                    "Must be followed by type annotation",
+391                )],
+392                vec!["Example: `let x: u8 = 1`".into()],
+393            );
+394            return Err(ParseFailed);
+395        }
+396    };
+397    Ok(node)
+398}
+399
+400fn parse_const_decl(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+401    let const_tok = par.assert(TokenKind::Const);
+402    let name = par.expect(TokenKind::Name, "failed to parse constant declaration")?;
+403    par.expect_with_notes(
+404        TokenKind::Colon,
+405        "failed to parse constant declaration",
+406        |_| {
+407            vec![
+408                "Note: constant name must be followed by a colon and a type description".into(),
+409                format!("Example: let `{}: u256 = 1000`", name.text),
+410            ]
+411        },
+412    )?;
+413    let typ = parse_type_desc(par)?;
+414    par.expect_with_notes(
+415        TokenKind::Eq,
+416        "failed to parse constant declaration",
+417        |_| {
+418            vec![
+419            "Note: the type of a constant must be followed by an equals sign and a value assignment"
+420                .into(),
+421                format!(
+422                    "Example: let `{}: u256 = 1000`",
+423                    name.text
+424                ),
+425        ]
+426        },
+427    )?;
+428
+429    let value = parse_expr(par)?;
+430    par.expect_stmt_end("variable declaration")?;
+431
+432    let span = const_tok.span + value.span;
+433    Ok(Node::new(
+434        FuncStmt::ConstantDecl {
+435            name: name.into(),
+436            typ,
+437            value,
+438        },
+439        span,
+440    ))
+441}
+442
+443/// Parse a (function) statement that begins with an expression. This might be
+444/// a `VarDecl`, `Assign`, or an expression.
+445fn parse_expr_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+446    use TokenKind::*;
+447    let expr = parse_expr(par)?;
+448    let node = match par.peek() {
+449        None | Some(Newline | Semi | BraceClose) => {
+450            let span = expr.span;
+451            Node::new(FuncStmt::Expr { value: expr }, span)
+452        }
+453        Some(Colon) => {
+454            par.fancy_error(
+455                "Variable declaration must begin with `let`",
+456                vec![Label::primary(expr.span, "invalid variable declaration")],
+457                vec!["Example: `let x: u8 = 1`".into()],
+458            );
+459            return Err(ParseFailed);
+460        }
+461        Some(Eq) => {
+462            par.next()?;
+463            let value = parse_expr(par)?;
+464            let span = expr.span + value.span;
+465            // TODO: should `x = y = z` be allowed?
+466            Node::new(
+467                FuncStmt::Assign {
+468                    target: expr,
+469                    value,
+470                },
+471                span,
+472            )
+473        }
+474        Some(tk) => {
+475            let tok = par.next()?;
+476            if let Some(op) = aug_assign_op(tk) {
+477                let value = parse_expr(par)?;
+478                let span = expr.span + value.span;
+479                Node::new(
+480                    FuncStmt::AugAssign {
+481                        target: expr,
+482                        op: Node::new(op, tok.span),
+483                        value,
+484                    },
+485                    span,
+486                )
+487            } else {
+488                par.unexpected_token_error(&tok, "invalid syntax in function body", vec![]);
+489                return Err(ParseFailed);
+490            }
+491        }
+492    };
+493    par.expect_stmt_end("statement")?;
+494    Ok(node)
+495}
+496
+497fn expr_to_vardecl_target(par: &mut Parser, expr: Node<Expr>) -> ParseResult<Node<VarDeclTarget>> {
+498    match expr.kind {
+499        Expr::Name(name) => Ok(Node::new(VarDeclTarget::Name(name), expr.span)),
+500        Expr::Tuple { elts } if !elts.is_empty() => Ok(Node::new(
+501            VarDeclTarget::Tuple(
+502                elts.into_iter()
+503                    .map(|elt| expr_to_vardecl_target(par, elt))
+504                    .collect::<ParseResult<Vec<_>>>()?,
+505            ),
+506            expr.span,
+507        )),
+508        _ => {
+509            par.fancy_error(
+510                "failed to parse variable declaration",
+511                vec![Label::primary(
+512                    expr.span,
+513                    "invalid variable declaration target",
+514                )],
+515                vec![
+516                    "The left side of a variable declaration can be either a name\nor a non-empty tuple."
+517                        .into(),
+518                ],
+519            );
+520            Err(ParseFailed)
+521        }
+522    }
+523}
+524
+525/// Parse an `if` statement.
+526///
+527/// # Panics
+528/// Panics if the next token isn't `if`.
+529pub fn parse_if_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+530    let if_tok = par.assert(TokenKind::If);
+531    let test = parse_expr(par)?;
+532    par.enter_block(if_tok.span + test.span, "`if` statement")?;
+533    let body = parse_block_stmts(par)?;
+534    par.expect(TokenKind::BraceClose, "`if` statement")?;
+535    par.eat_newlines();
+536
+537    let else_block = match par.peek() {
+538        Some(TokenKind::Else) => {
+539            let else_tok = par.next()?;
+540            if par.peek() == Some(TokenKind::If) {
+541                vec![parse_if_stmt(par)?]
+542            } else {
+543                par.enter_block(else_tok.span, "`if` statement `else` branch")?;
+544                let else_body = parse_block_stmts(par)?;
+545                par.expect(TokenKind::BraceClose, "`if` statement")?;
+546                else_body
+547            }
+548        }
+549        _ => vec![],
+550    };
+551
+552    let span = if_tok.span + test.span + body.last() + else_block.last();
+553    Ok(Node::new(
+554        FuncStmt::If {
+555            test,
+556            body,
+557            or_else: else_block,
+558        },
+559        span,
+560    ))
+561}
+562
+563/// Parse a `match` statement.
+564///
+565/// # Panics
+566/// Panics if the next token isn't `match`.
+567pub fn parse_match_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+568    let match_tok = par.assert(TokenKind::Match);
+569    let expr = parse_expr(par)?;
+570    par.enter_block(match_tok.span + expr.span, "`match` statement")?;
+571    let arms = parse_match_arms(par)?;
+572    let end = par.expect(TokenKind::BraceClose, "`match` statement")?;
+573
+574    let span = match_tok.span + end.span;
+575    Ok(Node::new(FuncStmt::Match { expr, arms }, span))
+576}
+577
+578pub fn parse_match_arms(par: &mut Parser) -> ParseResult<Vec<Node<MatchArm>>> {
+579    let mut arms = vec![];
+580    par.eat_newlines();
+581    while par.peek_or_err()? != TokenKind::BraceClose {
+582        let pat = parse_pattern(par)?;
+583
+584        par.expect(TokenKind::FatArrow, "`match arm`")?;
+585
+586        par.enter_block(pat.span, "`match` arm")?;
+587        let body = parse_block_stmts(par)?;
+588        let end = par.expect(TokenKind::BraceClose, "`match` arm")?;
+589
+590        let span = pat.span + end.span;
+591        arms.push(Node::new(MatchArm { pat, body }, span));
+592        par.eat_newlines();
+593    }
+594
+595    Ok(arms)
+596}
+597
+598pub fn parse_pattern(par: &mut Parser) -> ParseResult<Node<Pattern>> {
+599    let mut left_pat = parse_pattern_atom(par)?;
+600    let mut span = left_pat.span;
+601    while let Some(TokenKind::Pipe) = par.peek() {
+602        par.next().unwrap();
+603        let right_pat = parse_pattern_atom(par)?;
+604        span += right_pat.span;
+605        let patterns = match left_pat.kind {
+606            Pattern::Or(mut patterns) => {
+607                patterns.push(right_pat);
+608                patterns
+609            }
+610            _ => {
+611                vec![left_pat, right_pat]
+612            }
+613        };
+614        left_pat = Node::new(Pattern::Or(patterns), span);
+615    }
+616
+617    Ok(left_pat)
+618}
+619
+620/// Parse a `while` statement.
+621///
+622/// # Panics
+623/// Panics if the next token isn't `while`.
+624pub fn parse_while_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+625    let while_tok = par.assert(TokenKind::While);
+626
+627    let test = parse_expr(par)?;
+628    par.enter_block(while_tok.span + test.span, "`while` statement")?;
+629    let body = parse_block_stmts(par)?;
+630    let end = par.expect(TokenKind::BraceClose, "`while` statement")?;
+631    let span = while_tok.span + test.span + end.span;
+632
+633    Ok(Node::new(FuncStmt::While { test, body }, span))
+634}
+635
+636/// Parse a `for` statement.
+637///
+638/// # Panics
+639/// Panics if the next token isn't `for`.
+640pub fn parse_for_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+641    let for_tok = par.assert(TokenKind::For);
+642
+643    let target = par
+644        .expect(TokenKind::Name, "failed to parse `for` statement")?
+645        .into();
+646    par.expect(TokenKind::In, "failed to parse `for` statement")?;
+647    let iter = parse_expr(par)?;
+648    par.enter_block(for_tok.span + iter.span, "`for` statement")?;
+649    let body = parse_block_stmts(par)?;
+650    let end = par.expect(TokenKind::BraceClose, "`for` statement")?;
+651    par.expect_stmt_end("`for` statement")?;
+652    let span = for_tok.span + iter.span + end.span;
+653
+654    Ok(Node::new(FuncStmt::For { target, iter, body }, span))
+655}
+656
+657/// Parse a `return` statement.
+658///
+659/// # Panics
+660/// Panics if the next token isn't `return`.
+661pub fn parse_return_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+662    let ret = par.assert(TokenKind::Return);
+663    let value = match par.peek() {
+664        None | Some(TokenKind::Newline) => None,
+665        Some(_) => Some(parse_expr(par)?),
+666    };
+667    par.expect_stmt_end("return statement")?;
+668    let span = ret.span + value.as_ref();
+669    Ok(Node::new(FuncStmt::Return { value }, span))
+670}
+671
+672/// Parse an `assert` statement.
+673///
+674/// # Panics
+675/// Panics if the next token isn't `assert`.
+676pub fn parse_assert_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+677    let assert_tok = par.assert(TokenKind::Assert);
+678    let test = parse_expr(par)?;
+679    let msg = match par.peek() {
+680        None | Some(TokenKind::Newline) => None,
+681        Some(TokenKind::Comma) => {
+682            par.next()?;
+683            Some(parse_expr(par)?)
+684        }
+685        Some(_) => {
+686            let tok = par.next()?;
+687            par.unexpected_token_error(&tok, "failed to parse `assert` statement", vec![]);
+688            return Err(ParseFailed);
+689        }
+690    };
+691    par.expect_stmt_end("assert statement")?;
+692    let span = assert_tok.span + test.span + msg.as_ref();
+693    Ok(Node::new(FuncStmt::Assert { test, msg }, span))
+694}
+695
+696/// Parse a `revert` statement.
+697///
+698/// # Panics
+699/// Panics if the next token isn't `revert`.
+700pub fn parse_revert_stmt(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+701    let revert_tok = par.assert(TokenKind::Revert);
+702    let error = match par.peek() {
+703        None | Some(TokenKind::Newline) => None,
+704        Some(_) => Some(parse_expr(par)?),
+705    };
+706    par.expect_stmt_end("revert statement")?;
+707    let span = revert_tok.span + error.as_ref();
+708    Ok(Node::new(FuncStmt::Revert { error }, span))
+709}
+710
+711/// Parse an `unsafe` block.
+712///
+713/// # Panics
+714/// Panics if the next token isn't `unsafe`.
+715pub fn parse_unsafe_block(par: &mut Parser) -> ParseResult<Node<FuncStmt>> {
+716    let kw_tok = par.assert(TokenKind::Unsafe);
+717    par.enter_block(kw_tok.span, "`unsafe` block")?;
+718    let body = parse_block_stmts(par)?;
+719    let end = par.expect(TokenKind::BraceClose, "`unsafe` block")?;
+720    let span = kw_tok.span + end.span;
+721
+722    Ok(Node::new(FuncStmt::Unsafe(body), span))
+723}
+724
+725fn parse_pattern_atom(par: &mut Parser) -> ParseResult<Node<Pattern>> {
+726    match par.peek() {
+727        Some(TokenKind::ParenOpen) => return parse_tuple_pattern(par, None),
+728        Some(TokenKind::True) => {
+729            let span = par.next().unwrap().span;
+730            let literal_pat = Node::new(LiteralPattern::Bool(true), span);
+731            return Ok(Node::new(Pattern::Literal(literal_pat), span));
+732        }
+733        Some(TokenKind::False) => {
+734            let span = par.next().unwrap().span;
+735            let literal_pat = Node::new(LiteralPattern::Bool(false), span);
+736            return Ok(Node::new(Pattern::Literal(literal_pat), span));
+737        }
+738        Some(TokenKind::DotDot) => {
+739            let span = par.next().unwrap().span;
+740            return Ok(Node::new(Pattern::Rest, span));
+741        }
+742        _ => {}
+743    }
+744
+745    let mut pattern = parse_path_pattern_segment(par)?;
+746
+747    while let Some(TokenKind::ColonColon) = par.peek() {
+748        par.next().unwrap();
+749        let right = parse_path_pattern_segment(par)?;
+750        pattern = try_merge_path_pattern(par, pattern, right)?;
+751    }
+752
+753    if let Some(TokenKind::ParenOpen) = par.peek() {
+754        match pattern.kind {
+755            Pattern::Path(path) => parse_tuple_pattern(par, Some(path)),
+756            Pattern::WildCard => {
+757                invalid_pattern(par, "can't use wildcard with tuple pattern", pattern.span)
+758            }
+759            _ => unreachable!(),
+760        }
+761    } else if let Some(TokenKind::BraceOpen) = par.peek() {
+762        match pattern.kind {
+763            Pattern::Path(path) => parse_struct_pattern(par, path),
+764            Pattern::WildCard => {
+765                invalid_pattern(par, "can't use wildcard with struct pattern", pattern.span)
+766            }
+767            _ => unreachable!(),
+768        }
+769    } else {
+770        Ok(pattern)
+771    }
+772}
+773
+774fn parse_tuple_pattern(par: &mut Parser, path: Option<Node<Path>>) -> ParseResult<Node<Pattern>> {
+775    if let Some(TokenKind::ParenOpen) = par.peek() {
+776        par.eat_newlines();
+777        let paren_span = par.next().unwrap().span;
+778
+779        let (elts, last_span) = if let Some(TokenKind::ParenClose) = par.peek() {
+780            (vec![], par.next().unwrap().span)
+781        } else {
+782            par.eat_newlines();
+783            let mut elts = vec![parse_pattern(par)?];
+784            while let Some(TokenKind::Comma) = par.peek() {
+785                par.next().unwrap();
+786                elts.push(parse_pattern(par)?);
+787                par.eat_newlines();
+788            }
+789            let last_span = par.expect(TokenKind::ParenClose, "pattern")?.span;
+790            (elts, last_span)
+791        };
+792
+793        if let Some(path) = path {
+794            let span = path.span + last_span;
+795            Ok(Node::new(Pattern::PathTuple(path, elts), span))
+796        } else {
+797            let span = paren_span + last_span;
+798            Ok(Node::new(Pattern::Tuple(elts), span))
+799        }
+800    } else {
+801        unreachable!()
+802    }
+803}
+804
+805fn parse_struct_pattern(par: &mut Parser, path: Node<Path>) -> ParseResult<Node<Pattern>> {
+806    if let Some(TokenKind::BraceOpen) = par.peek() {
+807        par.eat_newlines();
+808        let mut span = par.next().unwrap().span;
+809
+810        let mut fields = vec![];
+811        let mut has_rest = false;
+812        loop {
+813            par.eat_newlines();
+814            match par.peek_or_err()? {
+815                TokenKind::Name => {
+816                    let name = par.next().unwrap();
+817                    let field_name = Node::new(name.text.into(), name.span);
+818                    par.expect(TokenKind::Colon, "failed to parse struct pattern")?;
+819                    let pat = parse_pattern(par)?;
+820                    fields.push((field_name, pat));
+821                    if par.peek() == Some(TokenKind::Comma) {
+822                        par.next()?;
+823                    } else {
+824                        span += par
+825                            .expect(TokenKind::BraceClose, "failed to parse struct pattern")?
+826                            .span;
+827                        break;
+828                    }
+829                }
+830
+831                TokenKind::DotDot => {
+832                    par.next().unwrap();
+833                    has_rest = true;
+834                    par.eat_newlines();
+835                    span += par
+836                        .expect(
+837                            TokenKind::BraceClose,
+838                            "`..` pattern should be the last position in the struct pattern",
+839                        )?
+840                        .span;
+841                    break;
+842                }
+843
+844                TokenKind::BraceClose => {
+845                    span += par.next().unwrap().span;
+846                    break;
+847                }
+848
+849                _ => {
+850                    let tok = par.next()?;
+851                    par.unexpected_token_error(&tok, "failed to parse struct pattern", vec![]);
+852                    return Err(ParseFailed);
+853                }
+854            }
+855        }
+856
+857        Ok(Node::new(
+858            Pattern::PathStruct {
+859                path,
+860                fields,
+861                has_rest,
+862            },
+863            span,
+864        ))
+865    } else {
+866        unreachable!()
+867    }
+868}
+869
+870fn try_merge_path_pattern(
+871    par: &mut Parser,
+872    left: Node<Pattern>,
+873    right: Node<Pattern>,
+874) -> ParseResult<Node<Pattern>> {
+875    let span = left.span + right.span;
+876
+877    match (left.kind, right.kind) {
+878        (Pattern::Path(mut left_path), Pattern::Path(right_path)) => {
+879            left_path
+880                .kind
+881                .segments
+882                .extend_from_slice(&right_path.kind.segments);
+883            left_path.span = span;
+884            let span = left.span + right.span;
+885            Ok(Node::new(Pattern::Path(left_path), span))
+886        }
+887        _ => invalid_pattern(par, "invalid pattern here", span),
+888    }
+889}
+890
+891fn parse_path_pattern_segment(par: &mut Parser) -> ParseResult<Node<Pattern>> {
+892    let tok = par.expect(TokenKind::Name, "failed to parse pattern")?;
+893    let text = tok.text;
+894    if text == "_" {
+895        Ok(Node::new(Pattern::WildCard, tok.span))
+896    } else {
+897        let path = Path {
+898            segments: vec![Node::new(text.into(), tok.span)],
+899        };
+900        Ok(Node::new(
+901            Pattern::Path(Node::new(path, tok.span)),
+902            tok.span,
+903        ))
+904    }
+905}
+906
+907fn invalid_pattern(par: &mut Parser, message: &str, span: Span) -> ParseResult<Node<Pattern>> {
+908    par.fancy_error(
+909        "invalid pattern",
+910        vec![Label::primary(span, message)],
+911        vec![],
+912    );
+913    Err(ParseFailed)
+914}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/module.rs.html b/compiler-docs/src/fe_parser/grammar/module.rs.html new file mode 100644 index 0000000000..15677e6072 --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/module.rs.html @@ -0,0 +1,281 @@ +module.rs - source

fe_parser/grammar/
module.rs

1use super::expressions::parse_expr;
+2use super::functions::parse_fn_def;
+3use super::types::{
+4    parse_impl_def, parse_path_tail, parse_struct_def, parse_trait_def, parse_type_alias,
+5    parse_type_desc,
+6};
+7use super::{contracts::parse_contract_def, types::parse_enum_def};
+8use crate::ast::{ConstantDecl, Module, ModuleStmt, Pragma, Use, UseTree};
+9use crate::node::{Node, Span};
+10use crate::{Label, ParseFailed, ParseResult, Parser, TokenKind};
+11
+12use semver::VersionReq;
+13
+14/// Parse a [`Module`].
+15pub fn parse_module(par: &mut Parser) -> Node<Module> {
+16    let mut body = vec![];
+17    loop {
+18        match par.peek() {
+19            Some(TokenKind::Newline) => {
+20                par.next().unwrap();
+21            }
+22            None => break,
+23            Some(_) => {
+24                match parse_module_stmt(par) {
+25                    Ok(stmt) => body.push(stmt),
+26                    Err(_) => {
+27                        // TODO: capture a real span here
+28                        body.push(ModuleStmt::ParseError(Span::zero(par.file_id)));
+29                        break;
+30                    }
+31                };
+32            }
+33        }
+34    }
+35    let span = Span::zero(par.file_id) + body.first() + body.last();
+36    Node::new(Module { body }, span)
+37}
+38
+39/// Parse a [`ModuleStmt`].
+40pub fn parse_module_stmt(par: &mut Parser) -> ParseResult<ModuleStmt> {
+41    let stmt = match par.peek_or_err()? {
+42        TokenKind::Pragma => ModuleStmt::Pragma(parse_pragma(par)?),
+43        TokenKind::Use => ModuleStmt::Use(parse_use(par)?),
+44        TokenKind::Contract => ModuleStmt::Contract(parse_contract_def(par, None)?),
+45        TokenKind::Struct => ModuleStmt::Struct(parse_struct_def(par, None)?),
+46        TokenKind::Enum => ModuleStmt::Enum(parse_enum_def(par, None)?),
+47        TokenKind::Trait => ModuleStmt::Trait(parse_trait_def(par, None)?),
+48        TokenKind::Impl => ModuleStmt::Impl(parse_impl_def(par)?),
+49        TokenKind::Type => ModuleStmt::TypeAlias(parse_type_alias(par, None)?),
+50        TokenKind::Const => ModuleStmt::Constant(parse_constant(par, None)?),
+51        TokenKind::Pub => {
+52            let pub_span = par.next()?.span;
+53            match par.peek_or_err()? {
+54                TokenKind::Fn | TokenKind::Unsafe => {
+55                    ModuleStmt::Function(parse_fn_def(par, Some(pub_span))?)
+56                }
+57                TokenKind::Struct => ModuleStmt::Struct(parse_struct_def(par, Some(pub_span))?),
+58                TokenKind::Enum => ModuleStmt::Enum(parse_enum_def(par, Some(pub_span))?),
+59                TokenKind::Trait => ModuleStmt::Trait(parse_trait_def(par, Some(pub_span))?),
+60                TokenKind::Type => ModuleStmt::TypeAlias(parse_type_alias(par, Some(pub_span))?),
+61                TokenKind::Const => ModuleStmt::Constant(parse_constant(par, Some(pub_span))?),
+62                TokenKind::Contract => {
+63                    ModuleStmt::Contract(parse_contract_def(par, Some(pub_span))?)
+64                }
+65                _ => {
+66                    let tok = par.next()?;
+67                    par.unexpected_token_error(
+68                        &tok,
+69                        "failed to parse module",
+70                        vec!["Note: expected `fn`".into()],
+71                    );
+72                    return Err(ParseFailed);
+73                }
+74            }
+75        }
+76        TokenKind::Fn | TokenKind::Unsafe => ModuleStmt::Function(parse_fn_def(par, None)?),
+77        TokenKind::Hash => {
+78            let attr = par.expect(TokenKind::Hash, "expected `#`")?;
+79            let attr_name = par.expect_with_notes(TokenKind::Name, "failed to parse attribute definition", |_|
+80                vec!["Note: an attribute name must start with a letter or underscore, and contain letters, numbers, or underscores".into()])?;
+81            ModuleStmt::Attribute(Node::new(attr_name.text.into(), attr.span + attr_name.span))
+82        }
+83        _ => {
+84            let tok = par.next()?;
+85            par.unexpected_token_error(
+86                &tok,
+87                "failed to parse module",
+88                vec!["Note: expected import, contract, struct, type or const".into()],
+89            );
+90            return Err(ParseFailed);
+91        }
+92    };
+93    Ok(stmt)
+94}
+95
+96/// Parse a constant, e.g. `const MAGIC_NUMBER: u256 = 4711`.
+97/// # Panics
+98/// Panics if the next token isn't `const`.
+99pub fn parse_constant(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<ConstantDecl>> {
+100    let const_tok = par.assert(TokenKind::Const);
+101    let name = par.expect(TokenKind::Name, "failed to parse constant declaration")?;
+102    par.expect_with_notes(
+103        TokenKind::Colon,
+104        "failed to parse constant declaration",
+105        |_| {
+106            vec![
+107                "Note: constant name must be followed by a colon and a type description".into(),
+108                format!("Example: let `{}: u256 = 1000`", name.text),
+109            ]
+110        },
+111    )?;
+112    let typ = parse_type_desc(par)?;
+113    par.expect_with_notes(
+114        TokenKind::Eq,
+115        "failed to parse constant declaration",
+116        |_| {
+117            vec![
+118            "Note: the type of a constant must be followed by an equals sign and a value assignment"
+119                .into(),
+120                format!(
+121                    "Example: let `{}: u256 = 1000`",
+122                    name.text
+123                ),
+124        ]
+125        },
+126    )?;
+127
+128    let exp = parse_expr(par)?;
+129
+130    let span = const_tok.span + exp.span;
+131    Ok(Node::new(
+132        ConstantDecl {
+133            name: name.into(),
+134            typ,
+135            value: exp,
+136            pub_qual,
+137        },
+138        span,
+139    ))
+140}
+141
+142/// Parse a `use` statement.
+143/// # Panics
+144/// Panics if the next token isn't `use`.
+145pub fn parse_use(par: &mut Parser) -> ParseResult<Node<Use>> {
+146    let use_tok = par.assert(TokenKind::Use);
+147
+148    let tree = parse_use_tree(par)?;
+149    let tree_span = tree.span;
+150
+151    Ok(Node::new(Use { tree }, use_tok.span + tree_span))
+152}
+153
+154/// Parse a `use` tree.
+155pub fn parse_use_tree(par: &mut Parser) -> ParseResult<Node<UseTree>> {
+156    let (path, path_span, trailing_delim) = {
+157        let path_head =
+158            par.expect_with_notes(TokenKind::Name, "failed to parse `use` statement", |_| {
+159                vec![
+160                    "Note: `use` paths must start with a name".into(),
+161                    "Example: `use foo::bar`".into(),
+162                ]
+163            })?;
+164        parse_path_tail(par, path_head.into())
+165    };
+166
+167    if trailing_delim.is_some() {
+168        match par.peek() {
+169            Some(TokenKind::BraceOpen) => {
+170                par.next()?;
+171
+172                let mut children = vec![];
+173                let close_brace_span;
+174
+175                loop {
+176                    children.push(parse_use_tree(par)?);
+177                    let tok = par.next()?;
+178                    match tok.kind {
+179                        TokenKind::Comma => {
+180                            continue;
+181                        }
+182                        TokenKind::BraceClose => {
+183                            close_brace_span = tok.span;
+184                            break;
+185                        }
+186                        _ => {
+187                            par.unexpected_token_error(
+188                                &tok,
+189                                "failed to parse `use` tree",
+190                                vec!["Note: expected a `,` or `}` token".to_string()],
+191                            );
+192                            return Err(ParseFailed);
+193                        }
+194                    }
+195                }
+196
+197                Ok(Node::new(
+198                    UseTree::Nested {
+199                        prefix: path,
+200                        children,
+201                    },
+202                    close_brace_span,
+203                ))
+204            }
+205            Some(TokenKind::Star) => {
+206                par.next()?;
+207                Ok(Node::new(UseTree::Glob { prefix: path }, path_span))
+208            }
+209            _ => {
+210                let tok = par.next()?;
+211                par.unexpected_token_error(
+212                    &tok,
+213                    "failed to parse `use` tree",
+214                    vec!["Note: expected a `*`, `{` or name token".to_string()],
+215                );
+216                Err(ParseFailed)
+217            }
+218        }
+219    } else if par.peek() == Some(TokenKind::As) {
+220        par.next()?;
+221
+222        let rename_tok = par.expect(TokenKind::Name, "failed to parse `use` tree")?;
+223        let span = path_span + rename_tok.span;
+224        let rename = Some(rename_tok.into());
+225
+226        Ok(Node::new(UseTree::Simple { path, rename }, span))
+227    } else {
+228        Ok(Node::new(UseTree::Simple { path, rename: None }, path_span))
+229    }
+230}
+231
+232/// Parse a `pragma <version-requirement>` statement.
+233pub fn parse_pragma(par: &mut Parser) -> ParseResult<Node<Pragma>> {
+234    let tok = par.assert(TokenKind::Pragma);
+235    assert_eq!(tok.text, "pragma");
+236
+237    let mut version_string = String::new();
+238    let mut tokens = vec![];
+239    loop {
+240        match par.peek() {
+241            Some(TokenKind::Newline) => break,
+242            None => break,
+243            _ => {
+244                let tok = par.next()?;
+245                version_string.push_str(tok.text);
+246                tokens.push(tok);
+247            }
+248        }
+249    }
+250
+251    let version_requirement_span = match (tokens.first(), tokens.last()) {
+252        (Some(first), Some(last)) => first.span + last.span,
+253        _ => {
+254            par.error(
+255                tok.span,
+256                "failed to parse pragma statement: missing version requirement",
+257            );
+258            return Err(ParseFailed);
+259        }
+260    };
+261
+262    match VersionReq::parse(&version_string) {
+263        Ok(_) => Ok(Node::new(
+264            Pragma {
+265                version_requirement: Node::new(version_string.into(), version_requirement_span),
+266            },
+267            tok.span + version_requirement_span,
+268        )),
+269        Err(err) => {
+270            par.fancy_error(
+271                format!("failed to parse pragma statement: {err}"),
+272                vec![Label::primary(
+273                    version_requirement_span,
+274                    "Invalid version requirement",
+275                )],
+276                vec!["Example: `^0.5.0`".into()],
+277            );
+278            Err(ParseFailed)
+279        }
+280    }
+281}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/grammar/types.rs.html b/compiler-docs/src/fe_parser/grammar/types.rs.html new file mode 100644 index 0000000000..840c7a216e --- /dev/null +++ b/compiler-docs/src/fe_parser/grammar/types.rs.html @@ -0,0 +1,680 @@ +types.rs - source

fe_parser/grammar/
types.rs

1use crate::ast::{
+2    self, Enum, Field, GenericArg, Impl, Path, Trait, TypeAlias, TypeDesc, Variant, VariantKind,
+3};
+4use crate::grammar::expressions::parse_expr;
+5use crate::grammar::functions::{parse_fn_def, parse_fn_sig};
+6use crate::node::{Node, Span};
+7use crate::Token;
+8use crate::{ParseFailed, ParseResult, Parser, TokenKind};
+9use fe_common::diagnostics::Label;
+10use if_chain::if_chain;
+11use smol_str::SmolStr;
+12use vec1::Vec1;
+13
+14/// Parse a [`ModuleStmt::Struct`].
+15/// # Panics
+16/// Panics if the next token isn't `struct`.
+17pub fn parse_struct_def(
+18    par: &mut Parser,
+19    pub_qual: Option<Span>,
+20) -> ParseResult<Node<ast::Struct>> {
+21    let struct_tok = par.assert(TokenKind::Struct);
+22    let name = par.expect_with_notes(TokenKind::Name, "failed to parse struct definition", |_| {
+23        vec!["Note: a struct name must start with a letter or underscore, and contain letters, numbers, or underscores".into()]
+24    })?;
+25
+26    let mut span = struct_tok.span + name.span;
+27    let mut fields = vec![];
+28    let mut functions = vec![];
+29    par.enter_block(span, "struct body must start with `{`")?;
+30
+31    loop {
+32        par.eat_newlines();
+33
+34        let attributes = if let Some(attr) = par.optional(TokenKind::Hash) {
+35            let attr_name = par.expect_with_notes(TokenKind::Name, "failed to parse attribute definition", |_|
+36                vec!["Note: an attribute name must start with a letter or underscore, and contain letters, numbers, or underscores".into()])?;
+37            // This hints to a future where we would support multiple attributes per field. For now we don't need it.
+38            vec![Node::new(attr_name.text.into(), attr.span + attr_name.span)]
+39        } else {
+40            vec![]
+41        };
+42
+43        par.eat_newlines();
+44
+45        let pub_qual = par.optional(TokenKind::Pub).map(|tok| tok.span);
+46        match par.peek_or_err()? {
+47            TokenKind::Name => {
+48                let field = parse_field(par, attributes, pub_qual, None)?;
+49                if !functions.is_empty() {
+50                    par.error(
+51                        field.span,
+52                        "struct field definitions must come before any function definitions",
+53                    );
+54                }
+55                fields.push(field);
+56            }
+57            TokenKind::Fn | TokenKind::Unsafe => {
+58                functions.push(parse_fn_def(par, pub_qual)?);
+59            }
+60            TokenKind::BraceClose if pub_qual.is_none() => {
+61                span += par.next()?.span;
+62                break;
+63            }
+64            _ => {
+65                let tok = par.next()?;
+66                par.unexpected_token_error(&tok, "failed to parse struct definition", vec![]);
+67                return Err(ParseFailed);
+68            }
+69        }
+70    }
+71    Ok(Node::new(
+72        ast::Struct {
+73            name: name.into(),
+74            fields,
+75            functions,
+76            pub_qual,
+77        },
+78        span,
+79    ))
+80}
+81
+82#[allow(clippy::unnecessary_literal_unwrap)]
+83/// Parse a [`ModuleStmt::Enum`].
+84/// # Panics
+85/// Panics if the next token isn't [`TokenKind::Enum`].
+86pub fn parse_enum_def(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<Enum>> {
+87    let enum_tok = par.assert(TokenKind::Enum);
+88    let name = par.expect_with_notes(
+89        TokenKind::Name,
+90        "failed to parse enum definition",
+91        |_| vec!["Note: `enum` must be followed by a name, which must start with a letter and contain only letters, numbers, or underscores".into()],
+92    )?;
+93
+94    let mut span = enum_tok.span + name.span;
+95    let mut variants = vec![];
+96    let mut functions = vec![];
+97
+98    par.enter_block(span, "enum definition")?;
+99    loop {
+100        par.eat_newlines();
+101        match par.peek_or_err()? {
+102            TokenKind::Name => {
+103                let variant = parse_variant(par)?;
+104                if !functions.is_empty() {
+105                    par.error(
+106                        variant.span,
+107                        "enum variant definitions must come before any function definitions",
+108                    );
+109                }
+110                variants.push(variant);
+111            }
+112
+113            TokenKind::Fn | TokenKind::Unsafe => {
+114                functions.push(parse_fn_def(par, None)?);
+115            }
+116
+117            TokenKind::Pub => {
+118                let pub_qual = Some(par.next().unwrap().span);
+119                match par.peek() {
+120                    Some(TokenKind::Fn | TokenKind::Unsafe) => {
+121                        functions.push(parse_fn_def(par, pub_qual)?);
+122                    }
+123
+124                    _ => {
+125                        par.error(
+126                            pub_qual.unwrap(),
+127                            "expected `fn` or `unsafe fn` after `pub`",
+128                        );
+129                    }
+130                }
+131            }
+132
+133            TokenKind::BraceClose => {
+134                span += par.next()?.span;
+135                break;
+136            }
+137
+138            _ => {
+139                let tok = par.next()?;
+140                par.unexpected_token_error(&tok, "failed to parse enum definition body", vec![]);
+141                return Err(ParseFailed);
+142            }
+143        };
+144    }
+145
+146    Ok(Node::new(
+147        ast::Enum {
+148            name: name.into(),
+149            variants,
+150            functions,
+151            pub_qual,
+152        },
+153        span,
+154    ))
+155}
+156
+157/// Parse a trait definition.
+158/// # Panics
+159/// Panics if the next token isn't `trait`.
+160pub fn parse_trait_def(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<Trait>> {
+161    let trait_tok = par.assert(TokenKind::Trait);
+162
+163    // trait Event {}
+164    let trait_name = par.expect_with_notes(
+165        TokenKind::Name,
+166        "failed to parse trait definition",
+167        |_| vec!["Note: `trait` must be followed by a name, which must start with a letter and contain only letters, numbers, or underscores".into()],
+168    )?;
+169
+170    let header_span = trait_tok.span + trait_name.span;
+171    let mut functions = vec![];
+172    par.enter_block(header_span, "trait definition")?;
+173
+174    loop {
+175        match par.peek_or_err()? {
+176            TokenKind::Fn => {
+177                // TODO: Traits should also be allowed to have functions that do contain a body.
+178                functions.push(parse_fn_sig(par, None)?);
+179                par.expect_with_notes(
+180                    TokenKind::Semi,
+181                    "failed to parse trait definition",
+182                    |_| vec!["Note: trait functions must appear without body and followed by a semicolon.".into()],
+183                )?;
+184                par.eat_newlines();
+185            }
+186            TokenKind::BraceClose => {
+187                par.next()?;
+188                break;
+189            }
+190            _ => {
+191                let tok = par.next()?;
+192                par.unexpected_token_error(&tok, "failed to parse trait definition body", vec![]);
+193                return Err(ParseFailed);
+194            }
+195        };
+196    }
+197
+198    let span = header_span + pub_qual;
+199    Ok(Node::new(
+200        Trait {
+201            name: Node::new(trait_name.text.into(), trait_name.span),
+202            functions,
+203            pub_qual,
+204        },
+205        span,
+206    ))
+207}
+208
+209/// Parse an impl block.
+210/// # Panics
+211/// Panics if the next token isn't `impl`.
+212pub fn parse_impl_def(par: &mut Parser) -> ParseResult<Node<Impl>> {
+213    let impl_tok = par.assert(TokenKind::Impl);
+214
+215    // impl SomeTrait for SomeType {}
+216    let trait_name =
+217        par.expect_with_notes(TokenKind::Name, "failed to parse `impl` definition", |_| {
+218            vec!["Note: `impl` must be followed by the name of a trait".into()]
+219        })?;
+220
+221    let for_tok =
+222        par.expect_with_notes(TokenKind::For, "failed to parse `impl` definition", |_| {
+223            vec![format!(
+224                "Note: `impl {}` must be followed by the keyword `for`",
+225                trait_name.text
+226            )]
+227        })?;
+228
+229    let receiver = parse_type_desc(par)?;
+230    let mut functions = vec![];
+231
+232    let header_span = impl_tok.span + trait_name.span + for_tok.span + receiver.span;
+233
+234    par.enter_block(header_span, "impl definition")?;
+235
+236    loop {
+237        par.eat_newlines();
+238        match par.peek_or_err()? {
+239            TokenKind::Fn => {
+240                functions.push(parse_fn_def(par, None)?);
+241            }
+242            TokenKind::BraceClose => {
+243                par.next()?;
+244                break;
+245            }
+246            _ => {
+247                let tok = par.next()?;
+248                par.unexpected_token_error(&tok, "failed to parse `impl` definition body", vec![]);
+249                return Err(ParseFailed);
+250            }
+251        };
+252    }
+253
+254    Ok(Node::new(
+255        Impl {
+256            impl_trait: Node::new(trait_name.text.into(), trait_name.span),
+257            receiver,
+258            functions,
+259        },
+260        header_span,
+261    ))
+262}
+263
+264/// Parse a type alias definition, e.g. `type MyMap = Map<u8, address>`.
+265/// # Panics
+266/// Panics if the next token isn't `type`.
+267pub fn parse_type_alias(par: &mut Parser, pub_qual: Option<Span>) -> ParseResult<Node<TypeAlias>> {
+268    let type_tok = par.assert(TokenKind::Type);
+269    let name = par.expect(TokenKind::Name, "failed to parse type declaration")?;
+270    par.expect_with_notes(TokenKind::Eq, "failed to parse type declaration", |_| {
+271        vec![
+272            "Note: a type alias name must be followed by an equals sign and a type description"
+273                .into(),
+274            format!("Example: `type {} = Map<address, u64>`", name.text),
+275        ]
+276    })?;
+277    let typ = parse_type_desc(par)?;
+278    let span = type_tok.span + pub_qual + typ.span;
+279    Ok(Node::new(
+280        TypeAlias {
+281            name: name.into(),
+282            typ,
+283            pub_qual,
+284        },
+285        span,
+286    ))
+287}
+288
+289/// Parse a field for a struct or contract. The leading optional `pub` and
+290/// `const` qualifiers must be parsed by the caller, and passed in.
+291pub fn parse_field(
+292    par: &mut Parser,
+293    attributes: Vec<Node<SmolStr>>,
+294    pub_qual: Option<Span>,
+295    const_qual: Option<Span>,
+296) -> ParseResult<Node<Field>> {
+297    let name = par.expect(TokenKind::Name, "failed to parse field definition")?;
+298    par.expect_with_notes(
+299        TokenKind::Colon,
+300        "failed to parse field definition",
+301        |next| {
+302            let mut notes = vec![];
+303            if name.text == "def" && next.kind == TokenKind::Name {
+304                notes.push("Hint: use `fn` to define a function".into());
+305                notes.push(format!(
+306                    "Example: `{}fn {}( ...`",
+307                    if pub_qual.is_some() { "pub " } else { "" },
+308                    next.text
+309                ));
+310            }
+311            notes
+312                .push("Note: field name must be followed by a colon and a type description".into());
+313            notes.push(format!(
+314                "Example: {}{}{}: address",
+315                if pub_qual.is_some() { "pub " } else { "" },
+316                if const_qual.is_some() { "const " } else { "" },
+317                name.text
+318            ));
+319            notes
+320        },
+321    )?;
+322
+323    let typ = parse_type_desc(par)?;
+324    let value = if par.peek() == Some(TokenKind::Eq) {
+325        par.next()?;
+326        Some(parse_expr(par)?)
+327    } else {
+328        None
+329    };
+330    par.expect_stmt_end("field definition")?;
+331    let span = name.span + pub_qual + const_qual + &typ;
+332    Ok(Node::new(
+333        Field {
+334            is_pub: pub_qual.is_some(),
+335            is_const: const_qual.is_some(),
+336            attributes,
+337            name: name.into(),
+338            typ,
+339            value,
+340        },
+341        span,
+342    ))
+343}
+344
+345/// Parse a variant for a enum definition.
+346/// # Panics
+347/// Panics if the next token isn't [`TokenKind::Name`].
+348pub fn parse_variant(par: &mut Parser) -> ParseResult<Node<Variant>> {
+349    let name = par.expect(TokenKind::Name, "failed to parse enum variant")?;
+350    let mut span = name.span;
+351
+352    let kind = match par.peek_or_err()? {
+353        TokenKind::ParenOpen => {
+354            span += par.next().unwrap().span;
+355            let mut tys = vec![];
+356            loop {
+357                match par.peek_or_err()? {
+358                    TokenKind::ParenClose => {
+359                        span += par.next().unwrap().span;
+360                        break;
+361                    }
+362
+363                    _ => {
+364                        let ty = parse_type_desc(par)?;
+365                        span += ty.span;
+366                        tys.push(ty);
+367                        if par.peek_or_err()? == TokenKind::Comma {
+368                            par.next()?;
+369                        } else {
+370                            span += par
+371                                .expect(
+372                                    TokenKind::ParenClose,
+373                                    "unexpected token while parsing enum variant",
+374                                )?
+375                                .span;
+376                            break;
+377                        }
+378                    }
+379                }
+380            }
+381
+382            VariantKind::Tuple(tys)
+383        }
+384
+385        _ => VariantKind::Unit,
+386    };
+387
+388    par.expect_stmt_end("enum variant")?;
+389    Ok(Node::new(
+390        Variant {
+391            name: name.into(),
+392            kind,
+393        },
+394        span,
+395    ))
+396}
+397
+398/// Parse an optional qualifier (`pub`, `const`, or `idx`).
+399pub fn parse_opt_qualifier(par: &mut Parser, tk: TokenKind) -> Option<Span> {
+400    if par.peek() == Some(tk) {
+401        let tok = par.next().unwrap();
+402        Some(tok.span)
+403    } else {
+404        None
+405    }
+406}
+407
+408/// Parse an angle-bracket-wrapped list of generic arguments (eg. the tail end
+409/// of `Map<address, u256>`).
+410/// # Panics
+411/// Panics if the first token isn't `<`.
+412pub fn parse_generic_args(par: &mut Parser) -> ParseResult<Node<Vec<GenericArg>>> {
+413    use TokenKind::*;
+414    let mut span = par.assert(Lt).span;
+415
+416    let mut args = vec![];
+417
+418    let expect_end = |par: &mut Parser| {
+419        // If there's no comma, the next token must be `>`
+420        match par.peek_or_err()? {
+421            Gt => Ok(par.next()?.span),
+422            GtGt => Ok(par.split_next()?.span),
+423            _ => {
+424                let tok = par.next()?;
+425                par.unexpected_token_error(
+426                    &tok,
+427                    "Unexpected token while parsing generic arg list",
+428                    vec![],
+429                );
+430                Err(ParseFailed)
+431            }
+432        }
+433    };
+434
+435    loop {
+436        match par.peek_or_err()? {
+437            Gt => {
+438                span += par.next()?.span;
+439                break;
+440            }
+441            GtGt => {
+442                span += par.split_next()?.span;
+443                break;
+444            }
+445            // Parse non-constant generic argument.
+446            Name | ParenOpen => {
+447                let typ = parse_type_desc(par)?;
+448                args.push(GenericArg::TypeDesc(Node::new(typ.kind, typ.span)));
+449                if par.peek() == Some(Comma) {
+450                    par.next()?;
+451                } else {
+452                    span += expect_end(par)?;
+453                    break;
+454                }
+455            }
+456            // Parse literal-type constant generic argument.
+457            Int => {
+458                let tok = par.next()?;
+459                if let Ok(num) = tok.text.parse() {
+460                    args.push(GenericArg::Int(Node::new(num, tok.span)));
+461                    if par.peek() == Some(Comma) {
+462                        par.next()?;
+463                    } else {
+464                        span += expect_end(par)?;
+465                        break;
+466                    }
+467                } else {
+468                    par.error(tok.span, "failed to parse integer literal");
+469                    return Err(ParseFailed);
+470                }
+471            }
+472            // Parse expr-type constant generic argument.
+473            BraceOpen => {
+474                let brace_open = par.next()?;
+475                let expr = parse_expr(par)?;
+476                if !matches!(par.next()?.kind, BraceClose) {
+477                    par.error(brace_open.span, "missing closing delimiter `}`");
+478                    return Err(ParseFailed);
+479                }
+480
+481                args.push(GenericArg::ConstExpr(expr));
+482
+483                if par.peek() == Some(Comma) {
+484                    par.next()?;
+485                } else {
+486                    span += expect_end(par)?;
+487                    break;
+488                }
+489            }
+490
+491            // Invalid generic argument.
+492            _ => {
+493                let tok = par.next()?;
+494                par.unexpected_token_error(
+495                    &tok,
+496                    "failed to parse generic type argument list",
+497                    vec![],
+498                );
+499                return Err(ParseFailed);
+500            }
+501        }
+502    }
+503    Ok(Node::new(args, span))
+504}
+505
+506/// Returns path and trailing `::` token, if present.
+507pub fn parse_path_tail<'a>(
+508    par: &mut Parser<'a>,
+509    head: Node<SmolStr>,
+510) -> (Path, Span, Option<Token<'a>>) {
+511    let mut span = head.span;
+512    let mut segments = vec![head];
+513    while let Some(delim) = par.optional(TokenKind::ColonColon) {
+514        if let Some(name) = par.optional(TokenKind::Name) {
+515            span += name.span;
+516            segments.push(name.into());
+517        } else {
+518            return (Path { segments }, span, Some(delim));
+519        }
+520    }
+521    (Path { segments }, span, None)
+522}
+523
+524/// Parse a type description, e.g. `u8` or `Map<address, u256>`.
+525pub fn parse_type_desc(par: &mut Parser) -> ParseResult<Node<TypeDesc>> {
+526    use TokenKind::*;
+527    let mut typ = match par.peek_or_err()? {
+528        SelfType => {
+529            let _self = par.next()?;
+530            Node::new(TypeDesc::SelfType, _self.span)
+531        }
+532        Name => {
+533            let name = par.next()?;
+534            match par.peek() {
+535                Some(ColonColon) => {
+536                    let (path, span, trailing_delim) = parse_path_tail(par, name.into());
+537                    if let Some(colons) = trailing_delim {
+538                        let next = par.next()?;
+539                        par.fancy_error(
+540                            "failed to parse type description",
+541                            vec![
+542                                Label::secondary(colons.span, "path delimiter"),
+543                                Label::primary(next.span, "expected a name"),
+544                            ],
+545                            vec![],
+546                        );
+547                        return Err(ParseFailed);
+548                    }
+549                    Node::new(TypeDesc::Path(path), span)
+550                }
+551                Some(Lt) => {
+552                    let args = parse_generic_args(par)?;
+553                    let span = name.span + args.span;
+554                    Node::new(
+555                        TypeDesc::Generic {
+556                            base: name.into(),
+557                            args,
+558                        },
+559                        span,
+560                    )
+561                }
+562                _ => Node::new(
+563                    TypeDesc::Base {
+564                        base: name.text.into(),
+565                    },
+566                    name.span,
+567                ),
+568            }
+569        }
+570        ParenOpen => {
+571            let mut span = par.next()?.span;
+572            let mut items = vec![];
+573            loop {
+574                match par.peek_or_err()? {
+575                    ParenClose => {
+576                        span += par.next()?.span;
+577                        break;
+578                    }
+579
+580                    Name | ParenOpen => {
+581                        let item = parse_type_desc(par)?;
+582                        span += item.span;
+583                        items.push(item);
+584                        if par.peek_or_err()? == Comma {
+585                            par.next()?;
+586                        } else {
+587                            span += par
+588                                .expect(
+589                                    ParenClose,
+590                                    "Unexpected token while parsing tuple type description",
+591                                )?
+592                                .span;
+593                            break;
+594                        }
+595                    }
+596
+597                    _ => {
+598                        let tok = par.next()?;
+599                        par.unexpected_token_error(
+600                            &tok,
+601                            "failed to parse type description",
+602                            vec![],
+603                        );
+604                        return Err(ParseFailed);
+605                    }
+606                }
+607            }
+608            if items.is_empty() {
+609                Node::new(TypeDesc::Unit, span)
+610            } else {
+611                Node::new(
+612                    TypeDesc::Tuple {
+613                        items: Vec1::try_from_vec(items).expect("couldn't convert vec to vec1"),
+614                    },
+615                    span,
+616                )
+617            }
+618        }
+619        _ => {
+620            let tok = par.next()?;
+621            par.unexpected_token_error(&tok, "failed to parse type description", vec![]);
+622            return Err(ParseFailed);
+623        }
+624    };
+625
+626    while par.peek() == Some(BracketOpen) {
+627        let l_brack = par.next()?.span;
+628
+629        if_chain! {
+630            if let Some(size_token) = par.optional(TokenKind::Int);
+631            if let Ok(dimension) = size_token.text.parse::<usize>();
+632            if let Some(r_brack) = par.optional(TokenKind::BracketClose);
+633            then {
+634                let span = typ.span + l_brack + r_brack.span;
+635                par.fancy_error(
+636                    "Outdated array syntax",
+637                    vec![
+638                        Label::primary(
+639                            span,
+640                            ""
+641                        )
+642                    ],
+643                    vec![
+644                        format!("Hint: Use `Array<{}, {}>`", typ.kind, dimension)
+645                    ]
+646                );
+647                typ = Node::new(
+648                    TypeDesc::Generic {
+649                        base: Node::new("Array".into(), typ.span),
+650                        args: Node::new(vec![
+651                            GenericArg::TypeDesc(
+652                                Node::new(typ.kind, typ.span)
+653                            ),
+654                            GenericArg::Int(
+655                                Node::new(dimension, size_token.span)
+656                            )
+657                        ], span)
+658                    },
+659                    span,
+660                );
+661            } else {
+662                par.fancy_error(
+663                    "Unexpected token while parsing type description",
+664                    vec![
+665                        Label::primary(
+666                            l_brack,
+667                            "Unexpected token"
+668                        )
+669                    ],
+670                    vec![
+671                        format!("Hint: To define an array type use `Array<{}, 10>`", typ.kind)
+672                    ]
+673                );
+674                return Err(ParseFailed);
+675            }
+676        }
+677    }
+678
+679    Ok(typ)
+680}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/lexer.rs.html b/compiler-docs/src/fe_parser/lexer.rs.html new file mode 100644 index 0000000000..48b27adb7d --- /dev/null +++ b/compiler-docs/src/fe_parser/lexer.rs.html @@ -0,0 +1,102 @@ +lexer.rs - source

fe_parser/
lexer.rs

1mod token;
+2use crate::node::Span;
+3use fe_common::files::SourceFileId;
+4use logos::Logos;
+5pub use token::{Token, TokenKind};
+6
+7#[derive(Clone)]
+8pub struct Lexer<'a> {
+9    file_id: SourceFileId,
+10    inner: logos::Lexer<'a, TokenKind>,
+11}
+12
+13impl<'a> Lexer<'a> {
+14    /// Create a new lexer with the given source code string.
+15    pub fn new(file_id: SourceFileId, src: &'a str) -> Lexer {
+16        Lexer {
+17            file_id,
+18            inner: TokenKind::lexer(src),
+19        }
+20    }
+21
+22    /// Return the full source code string that's being tokenized.
+23    pub fn source(&self) -> &'a str {
+24        self.inner.source()
+25    }
+26}
+27
+28impl<'a> Iterator for Lexer<'a> {
+29    type Item = Token<'a>;
+30
+31    fn next(&mut self) -> Option<Self::Item> {
+32        let kind = self.inner.next()?;
+33        let text = self.inner.slice();
+34        let span = self.inner.span();
+35        Some(Token {
+36            kind,
+37            text,
+38            span: Span {
+39                file_id: self.file_id,
+40                start: span.start,
+41                end: span.end,
+42            },
+43        })
+44    }
+45}
+46
+47#[cfg(test)]
+48mod tests {
+49    use crate::lexer::{Lexer, TokenKind};
+50    use fe_common::files::SourceFileId;
+51    use TokenKind::*;
+52
+53    fn check(input: &str, expected: &[TokenKind]) {
+54        let lex = Lexer::new(SourceFileId::dummy_file(), input);
+55
+56        let actual = lex.map(|t| t.kind).collect::<Vec<_>>();
+57
+58        assert!(
+59            actual.iter().eq(expected.iter()),
+60            "\nexpected: {expected:?}\n  actual: {actual:?}"
+61        );
+62    }
+63
+64    #[test]
+65    fn basic() {
+66        check(
+67            "contract Foo:\n  x: u32\n  fn f() -> u32: not x",
+68            &[
+69                Contract, Name, Colon, Newline, Name, Colon, Name, Newline, Fn, Name, ParenOpen,
+70                ParenClose, Arrow, Name, Colon, Not, Name,
+71            ],
+72        );
+73    }
+74
+75    #[test]
+76    fn strings() {
+77        let rawstr = r#""string \t with \n escapes \" \"""#;
+78        let mut lex = Lexer::new(SourceFileId::dummy_file(), rawstr);
+79        let lexedstr = lex.next().unwrap();
+80        assert!(lexedstr.kind == Text);
+81        assert!(lexedstr.text == rawstr);
+82        assert!(lex.next().is_none());
+83    }
+84
+85    #[test]
+86    fn errors() {
+87        check(
+88            "contract Foo@ 5u8 \n  self.bar",
+89            &[
+90                Contract, Name, Error, Int, Name, Newline, SelfValue, Dot, Name,
+91            ],
+92        );
+93    }
+94
+95    #[test]
+96    fn tabs_and_comment() {
+97        check(
+98            "\n\t \tcontract\n\tFoo // hi mom!\n ",
+99            &[Newline, Contract, Newline, Name, Newline],
+100        );
+101    }
+102}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/lexer/token.rs.html b/compiler-docs/src/fe_parser/lexer/token.rs.html new file mode 100644 index 0000000000..ab74787082 --- /dev/null +++ b/compiler-docs/src/fe_parser/lexer/token.rs.html @@ -0,0 +1,316 @@ +token.rs - source

fe_parser/lexer/
token.rs

1use crate::node::Node;
+2use crate::node::Span;
+3use logos::Logos;
+4use smol_str::SmolStr;
+5use std::ops::Add;
+6
+7#[derive(Debug, PartialEq, Eq, Clone)]
+8pub struct Token<'a> {
+9    pub kind: TokenKind,
+10    pub text: &'a str,
+11    pub span: Span,
+12}
+13
+14impl<'a> From<Token<'a>> for Node<SmolStr> {
+15    fn from(tok: Token<'a>) -> Node<SmolStr> {
+16        Node::new(tok.text.into(), tok.span)
+17    }
+18}
+19
+20impl<'a> Add<&Token<'a>> for Span {
+21    type Output = Self;
+22
+23    fn add(self, other: &Token<'a>) -> Self {
+24        self + other.span
+25    }
+26}
+27
+28#[derive(Debug, Copy, Clone, PartialEq, Eq, Logos)]
+29pub enum TokenKind {
+30    // Ignoring comments and spaces/tabs for now.
+31    // If we implement an auto-formatting tool, we'll probably want to change this.
+32    #[regex(r"//[^\n]*", logos::skip)]
+33    #[regex("[ \t]+", logos::skip)]
+34    #[error]
+35    Error,
+36
+37    #[regex(r"\n[ \t]*")]
+38    Newline,
+39
+40    #[regex("[a-zA-Z_][a-zA-Z0-9_]*")]
+41    Name,
+42    #[regex("[0-9]+(?:_[0-9]+)*")]
+43    Int,
+44    #[regex("0[xX][0-9a-fA-F]+")]
+45    Hex,
+46    #[regex("0[oO][0-7]+")]
+47    Octal,
+48    #[regex("0[bB][0-1]+")]
+49    Binary,
+50    // Float,
+51    #[regex(r#""([^"\\]|\\.)*""#)]
+52    #[regex(r#"'([^'\\]|\\.)*'"#)]
+53    Text,
+54    #[token("true")]
+55    True,
+56    #[token("false")]
+57    False,
+58    // #[token("None")] // ?
+59    // None,
+60    #[token("assert")]
+61    Assert,
+62    #[token("break")]
+63    Break,
+64    #[token("continue")]
+65    Continue,
+66    #[token("contract")]
+67    Contract,
+68    #[token("fn")]
+69    Fn,
+70    #[token("const")]
+71    Const,
+72    #[token("else")]
+73    Else,
+74    #[token("idx")]
+75    Idx,
+76    #[token("if")]
+77    If,
+78    #[token("match")]
+79    Match,
+80    #[token("impl")]
+81    Impl,
+82    #[token("pragma")]
+83    Pragma,
+84    #[token("for")]
+85    For,
+86    #[token("pub")]
+87    Pub,
+88    #[token("return")]
+89    Return,
+90    #[token("revert")]
+91    Revert,
+92    #[token("Self")]
+93    SelfType,
+94    #[token("self")]
+95    SelfValue,
+96    #[token("struct")]
+97    Struct,
+98    #[token("enum")]
+99    Enum,
+100    #[token("trait")]
+101    Trait,
+102    #[token("type")]
+103    Type,
+104    #[token("unsafe")]
+105    Unsafe,
+106    #[token("while")]
+107    While,
+108
+109    #[token("and")]
+110    And,
+111    #[token("as")]
+112    As,
+113    #[token("in")]
+114    In,
+115    #[token("not")]
+116    Not,
+117    #[token("or")]
+118    Or,
+119    #[token("let")]
+120    Let,
+121    #[token("mut")]
+122    Mut,
+123    #[token("use")]
+124    Use,
+125    // Symbols
+126    #[token("(")]
+127    ParenOpen,
+128    #[token(")")]
+129    ParenClose,
+130    #[token("[")]
+131    BracketOpen,
+132    #[token("]")]
+133    BracketClose,
+134    #[token("{")]
+135    BraceOpen,
+136    #[token("}")]
+137    BraceClose,
+138    #[token(":")]
+139    Colon,
+140    #[token("::")]
+141    ColonColon,
+142    #[token(",")]
+143    Comma,
+144    #[token("#")]
+145    Hash,
+146    #[token(";")]
+147    Semi,
+148    #[token("+")]
+149    Plus,
+150    #[token("-")]
+151    Minus,
+152    #[token("*")]
+153    Star,
+154    #[token("/")]
+155    Slash,
+156    #[token("|")]
+157    Pipe,
+158    #[token("&")]
+159    Amper,
+160    #[token("<")]
+161    Lt,
+162    #[token("<<")]
+163    LtLt,
+164    #[token(">")]
+165    Gt,
+166    #[token(">>")]
+167    GtGt,
+168    #[token("=")]
+169    Eq,
+170    #[token(".")]
+171    Dot,
+172    #[token("..")]
+173    DotDot,
+174    #[token("%")]
+175    Percent,
+176    #[token("==")]
+177    EqEq,
+178    #[token("!=")]
+179    NotEq,
+180    #[token("<=")]
+181    LtEq,
+182    #[token(">=")]
+183    GtEq,
+184    #[token("~")]
+185    Tilde,
+186    #[token("^")]
+187    Hat,
+188    #[token("**")]
+189    StarStar,
+190    #[token("**=")]
+191    StarStarEq,
+192    #[token("+=")]
+193    PlusEq,
+194    #[token("-=")]
+195    MinusEq,
+196    #[token("*=")]
+197    StarEq,
+198    #[token("/=")]
+199    SlashEq,
+200    #[token("%=")]
+201    PercentEq,
+202    #[token("&=")]
+203    AmperEq,
+204    #[token("|=")]
+205    PipeEq,
+206    #[token("^=")]
+207    HatEq,
+208    #[token("<<=")]
+209    LtLtEq,
+210    #[token(">>=")]
+211    GtGtEq,
+212    #[token("->")]
+213    Arrow,
+214    #[token("=>")]
+215    FatArrow,
+216}
+217
+218impl TokenKind {
+219    /// Return a user-friendly description of the token kind. E.g.
+220    /// TokenKind::Newline => "a newline"
+221    /// TokenKind::Colon => "`:`"
+222    pub fn describe(&self) -> &str {
+223        use TokenKind::*;
+224        match self {
+225            Newline => "a newline",
+226            Name => "a name",
+227            Int => "a number",
+228            Hex => "a hexadecimal number",
+229            Octal => "an octal number",
+230            Binary => "a binary number",
+231            Text => "a string",
+232
+233            True => "keyword `true`",
+234            False => "keyword `false`",
+235            Assert => "keyword `assert`",
+236            Break => "keyword `break`",
+237            Continue => "keyword `continue`",
+238            Contract => "keyword `contract`",
+239            Fn => "keyword `fn`",
+240            Const => "keyword `const`",
+241            Let => "keyword `let`",
+242            Mut => "keyword `mut`",
+243            Else => "keyword `else`",
+244            Idx => "keyword `idx`",
+245            If => "keyword `if`",
+246            Match => "keyword `match`",
+247            Impl => "keyword `impl`",
+248            Pragma => "keyword `pragma`",
+249            For => "keyword `for`",
+250            Pub => "keyword `pub`",
+251            Return => "keyword `return`",
+252            Revert => "keyword `revert`",
+253            SelfType => "keyword `Self`",
+254            SelfValue => "keyword `self`",
+255            Struct => "keyword `struct`",
+256            Enum => "keyword `enum`",
+257            Trait => "keyword `trait`",
+258            Type => "keyword `type`",
+259            Unsafe => "keyword `unsafe`",
+260            While => "keyword `while`",
+261            And => "keyword `and`",
+262            As => "keyword `as`",
+263            In => "keyword `in`",
+264            Not => "keyword `not`",
+265            Or => "keyword `or`",
+266            Use => "keyword `use`",
+267            ParenOpen => "symbol `(`",
+268            ParenClose => "symbol `)`",
+269            BracketOpen => "symbol `[`",
+270            BracketClose => "symbol `]`",
+271            BraceOpen => "symbol `{`",
+272            BraceClose => "symbol `}`",
+273            Colon => "symbol `:`",
+274            ColonColon => "symbol `::`",
+275            Comma => "symbol `,`",
+276            Hash => "symbol `#`",
+277            Semi => "symbol `;`",
+278            Plus => "symbol `+`",
+279            Minus => "symbol `-`",
+280            Star => "symbol `*`",
+281            Slash => "symbol `/`",
+282            Pipe => "symbol `|`",
+283            Amper => "symbol `&`",
+284            Lt => "symbol `<`",
+285            LtLt => "symbol `<<`",
+286            Gt => "symbol `>`",
+287            GtGt => "symbol `>>`",
+288            Eq => "symbol `=`",
+289            Dot => "symbol `.`",
+290            DotDot => "symbol `..`",
+291            Percent => "symbol `%`",
+292            EqEq => "symbol `==`",
+293            NotEq => "symbol `!=`",
+294            LtEq => "symbol `<=`",
+295            GtEq => "symbol `>=`",
+296            Tilde => "symbol `~`",
+297            Hat => "symbol `^`",
+298            StarStar => "symbol `**`",
+299            StarStarEq => "symbol `**=`",
+300            PlusEq => "symbol `+=`",
+301            MinusEq => "symbol `-=`",
+302            StarEq => "symbol `*=`",
+303            SlashEq => "symbol `/=`",
+304            PercentEq => "symbol `%=`",
+305            AmperEq => "symbol `&=`",
+306            PipeEq => "symbol `|=`",
+307            HatEq => "symbol `^=`",
+308            LtLtEq => "symbol `<<=`",
+309            GtGtEq => "symbol `>>=`",
+310            Arrow => "symbol `->`",
+311            FatArrow => "symbol `=>`",
+312
+313            Error => unreachable!(), // TODO this is reachable
+314        }
+315    }
+316}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/lib.rs.html b/compiler-docs/src/fe_parser/lib.rs.html new file mode 100644 index 0000000000..16cc3ac5c0 --- /dev/null +++ b/compiler-docs/src/fe_parser/lib.rs.html @@ -0,0 +1,30 @@ +lib.rs - source

fe_parser/
lib.rs

1pub mod ast;
+2pub mod grammar;
+3pub mod lexer;
+4pub use lexer::{Token, TokenKind};
+5mod parser;
+6pub use parser::{Label, ParseFailed, ParseResult, Parser};
+7pub mod node;
+8
+9use ast::Module;
+10use fe_common::diagnostics::Diagnostic;
+11use fe_common::files::SourceFileId;
+12
+13/// Parse a [`Module`] from the file content string.
+14///
+15/// Returns a `Module` (which may be incomplete), and a vec of [`Diagnostic`]s
+16/// (which may be empty) to display to the user. If any of the returned
+17/// diagnostics are errors, the compilation of this file should ultimately fail.
+18///
+19/// If a fatal parse error occurred, the last element of the `Module::body` will
+20/// be a `ModuleStmt::ParseError`. The parser currently has very limited ability
+21/// to recover from syntax errors; this is just a first meager attempt at returning a
+22/// useful AST when there are syntax errors.
+23///
+24/// A [`SourceFileId`] is required to associate any diagnostics with the
+25/// underlying file.
+26pub fn parse_file(file_id: SourceFileId, src: &str) -> (Module, Vec<Diagnostic>) {
+27    let mut parser = Parser::new(file_id, src);
+28    let node = crate::grammar::module::parse_module(&mut parser);
+29    (node.kind, parser.diagnostics)
+30}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/node.rs.html b/compiler-docs/src/fe_parser/node.rs.html new file mode 100644 index 0000000000..678c3c3a80 --- /dev/null +++ b/compiler-docs/src/fe_parser/node.rs.html @@ -0,0 +1,66 @@ +node.rs - source

fe_parser/
node.rs

1pub use fe_common::{Span, Spanned};
+2use serde::{Deserialize, Serialize};
+3use std::sync::atomic::{AtomicU32, Ordering};
+4
+5#[derive(Debug, PartialEq, Copy, Clone, Hash, Eq, Default, PartialOrd, Ord)]
+6pub struct NodeId(u32);
+7
+8impl NodeId {
+9    pub fn create() -> Self {
+10        static NEXT_ID: AtomicU32 = AtomicU32::new(0);
+11        Self(NEXT_ID.fetch_add(1, Ordering::Relaxed))
+12    }
+13
+14    pub fn dummy() -> Self {
+15        Self(u32::MAX)
+16    }
+17
+18    pub fn is_dummy(self) -> bool {
+19        self == Self::dummy()
+20    }
+21}
+22
+23#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Hash, Clone)]
+24pub struct Node<T> {
+25    pub kind: T,
+26    #[serde(skip_serializing, skip_deserializing)]
+27    pub id: NodeId,
+28    pub span: Span,
+29}
+30
+31impl<T> Node<T> {
+32    pub fn new(kind: T, span: Span) -> Self {
+33        let id = NodeId::create();
+34        Self { kind, id, span }
+35    }
+36}
+37
+38impl<T> Spanned for Node<T> {
+39    fn span(&self) -> Span {
+40        self.span
+41    }
+42}
+43
+44impl<T> From<&Node<T>> for Span {
+45    fn from(node: &Node<T>) -> Self {
+46        node.span
+47    }
+48}
+49
+50impl<T> From<&Box<Node<T>>> for Span {
+51    fn from(node: &Box<Node<T>>) -> Self {
+52        node.span
+53    }
+54}
+55
+56impl<T> From<&Node<T>> for NodeId {
+57    fn from(node: &Node<T>) -> Self {
+58        node.id
+59    }
+60}
+61
+62impl<T> From<&Box<Node<T>>> for NodeId {
+63    fn from(node: &Box<Node<T>>) -> Self {
+64        node.id
+65    }
+66}
\ No newline at end of file diff --git a/compiler-docs/src/fe_parser/parser.rs.html b/compiler-docs/src/fe_parser/parser.rs.html new file mode 100644 index 0000000000..75ad52b979 --- /dev/null +++ b/compiler-docs/src/fe_parser/parser.rs.html @@ -0,0 +1,429 @@ +parser.rs - source

fe_parser/
parser.rs

1pub use fe_common::diagnostics::Label;
+2use fe_common::diagnostics::{Diagnostic, Severity};
+3use fe_common::files::SourceFileId;
+4
+5use crate::lexer::{Lexer, Token, TokenKind};
+6use crate::node::Span;
+7use std::{error, fmt};
+8
+9#[derive(Debug, PartialEq, Eq, Hash, Copy, Clone)]
+10pub struct ParseFailed;
+11impl fmt::Display for ParseFailed {
+12    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
+13        write!(fmt, "ParseFailed")
+14    }
+15}
+16impl error::Error for ParseFailed {}
+17
+18pub type ParseResult<T> = Result<T, ParseFailed>;
+19
+20/// `Parser` maintains the parsing state, such as the token stream,
+21/// "enclosure" (paren, brace, ..) stack, diagnostics, etc.
+22/// Syntax parsing logic is in the [`crate::grammar`] module.
+23///
+24/// See [`BTParser`] if you need backtrackable parser.
+25pub struct Parser<'a> {
+26    pub file_id: SourceFileId,
+27    lexer: Lexer<'a>,
+28
+29    /// Tokens that have been "peeked", or split from a larger token.
+30    /// Eg. `>>` may be split into two `>` tokens when parsing the end of a
+31    /// generic type parameter list (eg. `Map<u256, Map<u256, address>>`).
+32    buffered: Vec<Token<'a>>,
+33
+34    enclosure_stack: Vec<Enclosure>,
+35
+36    /// The diagnostics (errors and warnings) emitted during parsing.
+37    pub diagnostics: Vec<Diagnostic>,
+38}
+39
+40impl<'a> Parser<'a> {
+41    /// Create a new parser for a source code string and associated file id.
+42    pub fn new(file_id: SourceFileId, content: &'a str) -> Self {
+43        Parser {
+44            file_id,
+45            lexer: Lexer::new(file_id, content),
+46            buffered: vec![],
+47            enclosure_stack: vec![],
+48            diagnostics: vec![],
+49        }
+50    }
+51
+52    /// Returns back tracking parser.
+53    pub fn as_bt_parser<'b>(&'b mut self) -> BTParser<'a, 'b> {
+54        BTParser::new(self)
+55    }
+56
+57    /// Return the next token, or an error if we've reached the end of the file.
+58    #[allow(clippy::should_implement_trait)] // next() is a nice short name for a common task
+59    pub fn next(&mut self) -> ParseResult<Token<'a>> {
+60        self.eat_newlines_if_in_nonblock_enclosure();
+61        if let Some(tok) = self.next_raw() {
+62            if is_enclosure_open(tok.kind) {
+63                self.enclosure_stack
+64                    .push(Enclosure::non_block(tok.kind, tok.span));
+65            } else if is_enclosure_close(tok.kind) {
+66                if let Some(open) = self.enclosure_stack.pop() {
+67                    if !enclosure_tokens_match(open.token_kind, tok.kind) {
+68                        // TODO: we should search the enclosure_stack
+69                        //  for the last matching enclosure open token.
+70                        //  If any enclosures are unclosed, we should emit an
+71                        //  error, and somehow close their respective ast nodes.
+72                        //  We could synthesize the correct close token, or emit
+73                        //  a special TokenKind::UnclosedEnclosure or whatever.
+74                        todo!()
+75                    }
+76                } else {
+77                    self.error(tok.span, format!("Unmatched `{}`", tok.text));
+78                }
+79            }
+80            Ok(tok)
+81        } else {
+82            self.error(
+83                Span::new(
+84                    self.file_id,
+85                    self.lexer.source().len(),
+86                    self.lexer.source().len(),
+87                ),
+88                "unexpected end of file",
+89            );
+90            Err(ParseFailed)
+91        }
+92    }
+93
+94    fn next_raw(&mut self) -> Option<Token<'a>> {
+95        self.buffered.pop().or_else(|| self.lexer.next())
+96    }
+97
+98    /// Take a peek at the next token kind without consuming it, or return an
+99    /// error if we've reached the end of the file.
+100    pub fn peek_or_err(&mut self) -> ParseResult<TokenKind> {
+101        self.eat_newlines_if_in_nonblock_enclosure();
+102        if let Some(tk) = self.peek_raw() {
+103            Ok(tk)
+104        } else {
+105            let index = self.lexer.source().len();
+106            self.error(
+107                Span::new(self.file_id, index, index),
+108                "unexpected end of file",
+109            );
+110            Err(ParseFailed)
+111        }
+112    }
+113
+114    /// Take a peek at the next token kind. Returns `None` if we've reached the
+115    /// end of the file.
+116    pub fn peek(&mut self) -> Option<TokenKind> {
+117        self.eat_newlines_if_in_nonblock_enclosure();
+118        self.peek_raw()
+119    }
+120
+121    fn peek_raw(&mut self) -> Option<TokenKind> {
+122        if self.buffered.is_empty() {
+123            if let Some(tok) = self.lexer.next() {
+124                self.buffered.push(tok);
+125            } else {
+126                return None;
+127            }
+128        }
+129        Some(self.buffered.last().unwrap().kind)
+130    }
+131
+132    fn eat_newlines_if_in_nonblock_enclosure(&mut self) {
+133        // TODO: allow newlines inside angle brackets?
+134        //   eg `fn f(x: map\n <\n u8\n, ...`
+135        if let Some(enc) = self.enclosure_stack.last() {
+136            if !enc.is_block {
+137                self.eat_newlines();
+138            }
+139        }
+140    }
+141
+142    /// Split the next token into two tokens, returning the first. Only supports
+143    /// splitting the `>>` token into two `>` tokens, specifically for
+144    /// parsing the closing angle bracket of a generic type argument list
+145    /// (`Map<x, Map<y, z>>`).
+146    ///
+147    /// # Panics
+148    /// Panics if the next token isn't `>>`
+149    pub fn split_next(&mut self) -> ParseResult<Token<'a>> {
+150        let gtgt = self.next()?;
+151        assert_eq!(gtgt.kind, TokenKind::GtGt);
+152
+153        let (gt1, gt2) = gtgt.text.split_at(1);
+154        self.buffered.push(Token {
+155            kind: TokenKind::Gt,
+156            text: gt2,
+157            span: Span::new(self.file_id, gtgt.span.start + 1, gtgt.span.end),
+158        });
+159
+160        Ok(Token {
+161            kind: TokenKind::Gt,
+162            text: gt1,
+163            span: Span::new(self.file_id, gtgt.span.start, gtgt.span.end - 1),
+164        })
+165    }
+166
+167    /// Returns `true` if the parser has reached the end of the file.
+168    pub fn done(&mut self) -> bool {
+169        self.peek_raw().is_none()
+170    }
+171
+172    pub fn eat_newlines(&mut self) {
+173        while self.peek_raw() == Some(TokenKind::Newline) {
+174            self.next_raw();
+175        }
+176    }
+177
+178    /// Assert that the next token kind it matches the expected token
+179    /// kind, and return it. This should be used in cases where the next token
+180    /// kind is expected to have been checked already.
+181    ///
+182    /// # Panics
+183    /// Panics if the next token kind isn't `tk`.
+184    pub fn assert(&mut self, tk: TokenKind) -> Token<'a> {
+185        let tok = self.next().unwrap();
+186        assert_eq!(tok.kind, tk, "internal parser error");
+187        tok
+188    }
+189
+190    /// If the next token matches the expected kind, return it. Otherwise emit
+191    /// an error diagnostic with the given message and return an error.
+192    pub fn expect<S: Into<String>>(
+193        &mut self,
+194        expected: TokenKind,
+195        message: S,
+196    ) -> ParseResult<Token<'a>> {
+197        self.expect_with_notes(expected, message, |_| Vec::new())
+198    }
+199
+200    /// Like [`Parser::expect`], but with additional notes to be appended to the
+201    /// bottom of the diagnostic message. The notes are provided by a
+202    /// function that returns a `Vec<String>`, to avoid allocations in the
+203    /// case where the token is as expected.
+204    pub fn expect_with_notes<Str, NotesFn>(
+205        &mut self,
+206        expected: TokenKind,
+207        message: Str,
+208        notes_fn: NotesFn,
+209    ) -> ParseResult<Token<'a>>
+210    where
+211        Str: Into<String>,
+212        NotesFn: FnOnce(&Token) -> Vec<String>,
+213    {
+214        let tok = self.next()?;
+215        if tok.kind == expected {
+216            Ok(tok)
+217        } else {
+218            self.fancy_error(
+219                message.into(),
+220                vec![Label::primary(
+221                    tok.span,
+222                    format!(
+223                        "expected {}, found {}",
+224                        expected.describe(),
+225                        tok.kind.describe()
+226                    ),
+227                )],
+228                notes_fn(&tok),
+229            );
+230            Err(ParseFailed)
+231        }
+232    }
+233
+234    /// If the next token matches the expected kind, return it. Otherwise return
+235    /// None.
+236    pub fn optional(&mut self, kind: TokenKind) -> Option<Token<'a>> {
+237        if self.peek() == Some(kind) {
+238            Some(self.next().unwrap())
+239        } else {
+240            None
+241        }
+242    }
+243
+244    /// Emit an "unexpected token" error diagnostic with the given message.
+245    pub fn unexpected_token_error<S: Into<String>>(
+246        &mut self,
+247        tok: &Token,
+248        message: S,
+249        notes: Vec<String>,
+250    ) {
+251        self.fancy_error(
+252            message,
+253            vec![Label::primary(tok.span, "unexpected token")],
+254            notes,
+255        );
+256    }
+257
+258    /// Enter a "block", which is a brace-enclosed list of statements,
+259    /// separated by newlines and/or semicolons.
+260    /// This checks for and consumes the `{` that precedes the block.
+261    pub fn enter_block(&mut self, context_span: Span, context_name: &str) -> ParseResult<()> {
+262        if self.peek_raw() == Some(TokenKind::BraceOpen) {
+263            let tok = self.next_raw().unwrap();
+264            self.enclosure_stack.push(Enclosure::block(tok.span));
+265            self.eat_newlines();
+266            Ok(())
+267        } else {
+268            self.fancy_error(
+269                format!("{context_name} must start with `{{`"),
+270                vec![Label::primary(
+271                    Span::new(self.file_id, context_span.end, context_span.end),
+272                    "expected `{` here",
+273                )],
+274                vec![],
+275            );
+276            Err(ParseFailed)
+277        }
+278    }
+279
+280    /// Consumes newlines and semicolons. Returns Ok if one or more newlines or
+281    /// semicolons are consumed, or if the next token is a `}`.
+282    pub fn expect_stmt_end(&mut self, context_name: &str) -> ParseResult<()> {
+283        let mut newline = false;
+284        while matches!(self.peek_raw(), Some(TokenKind::Newline | TokenKind::Semi)) {
+285            newline = true;
+286            self.next_raw().unwrap();
+287        }
+288        if newline {
+289            return Ok(());
+290        }
+291        match self.peek_raw() {
+292            Some(TokenKind::BraceClose) => Ok(()),
+293            Some(_) => {
+294                let tok = self.next()?;
+295                self.unexpected_token_error(
+296                    &tok,
+297                    format!("unexpected token while parsing {context_name}"),
+298                    vec![format!(
+299                        "expected a newline; found {} instead",
+300                        tok.kind.describe()
+301                    )],
+302                );
+303                Err(ParseFailed)
+304            }
+305            None => Ok(()), // unexpect eof error will be generated be parent block
+306        }
+307    }
+308
+309    /// Emit an error diagnostic, but don't stop parsing
+310    pub fn error<S: Into<String>>(&mut self, span: Span, message: S) {
+311        self.diagnostics.push(Diagnostic {
+312            severity: Severity::Error,
+313            message: message.into(),
+314            labels: vec![Label::primary(span, "")],
+315            notes: vec![],
+316        })
+317    }
+318
+319    /// Emit a "fancy" error diagnostic with any number of labels and notes,
+320    /// but don't stop parsing.
+321    pub fn fancy_error<S: Into<String>>(
+322        &mut self,
+323        message: S,
+324        labels: Vec<Label>,
+325        notes: Vec<String>,
+326    ) {
+327        self.diagnostics.push(Diagnostic {
+328            severity: Severity::Error,
+329            message: message.into(),
+330            labels,
+331            notes,
+332        })
+333    }
+334}
+335
+336/// A thin wrapper that makes [`Parser`] backtrackable.
+337pub struct BTParser<'a, 'b> {
+338    snapshot: &'b mut Parser<'a>,
+339    parser: Parser<'a>,
+340}
+341
+342impl<'a, 'b> BTParser<'a, 'b> {
+343    pub fn new(snapshot: &'b mut Parser<'a>) -> Self {
+344        let parser = Parser {
+345            file_id: snapshot.file_id,
+346            lexer: snapshot.lexer.clone(),
+347            buffered: snapshot.buffered.clone(),
+348            enclosure_stack: snapshot.enclosure_stack.clone(),
+349            diagnostics: Vec::new(),
+350        };
+351        Self { snapshot, parser }
+352    }
+353
+354    pub fn accept(self) {
+355        self.snapshot.lexer = self.parser.lexer;
+356        self.snapshot.buffered = self.parser.buffered;
+357        self.snapshot.enclosure_stack = self.parser.enclosure_stack;
+358        self.snapshot.diagnostics.extend(self.parser.diagnostics);
+359    }
+360}
+361
+362impl<'a, 'b> std::ops::Deref for BTParser<'a, 'b> {
+363    type Target = Parser<'a>;
+364
+365    fn deref(&self) -> &Self::Target {
+366        &self.parser
+367    }
+368}
+369
+370impl<'a, 'b> std::ops::DerefMut for BTParser<'a, 'b> {
+371    fn deref_mut(&mut self) -> &mut Self::Target {
+372        &mut self.parser
+373    }
+374}
+375
+376/// The start position of a chunk of code enclosed by (), [], or {}.
+377/// (This has nothing to do with "closures".)
+378///
+379/// Note that <> isn't currently considered an enclosure, as `<` might be
+380/// a less-than operator, while the rest are unambiguous.
+381///
+382/// A `{}` enclosure may or may not be a block. A block contains a list of
+383/// statements, separated by newlines or semicolons (or both).
+384/// Semicolons and newlines are consumed by `par.expect_stmt_end()`.
+385///
+386/// Non-block enclosures contains zero or more expressions, maybe separated by
+387/// commas. When the top-most enclosure is a non-block, newlines are ignored
+388/// (by `par.next()`), and semicolons are just normal tokens that'll be
+389/// rejected by the parsing fns in grammar/.
+390#[derive(Clone, Debug)]
+391struct Enclosure {
+392    token_kind: TokenKind,
+393    _token_span: Span, // TODO: mark mismatched tokens
+394    is_block: bool,
+395}
+396impl Enclosure {
+397    pub fn block(token_span: Span) -> Self {
+398        Self {
+399            token_kind: TokenKind::BraceOpen,
+400            _token_span: token_span,
+401            is_block: true,
+402        }
+403    }
+404    pub fn non_block(token_kind: TokenKind, token_span: Span) -> Self {
+405        Self {
+406            token_kind,
+407            _token_span: token_span,
+408            is_block: false,
+409        }
+410    }
+411}
+412
+413fn is_enclosure_open(tk: TokenKind) -> bool {
+414    use TokenKind::*;
+415    matches!(tk, ParenOpen | BraceOpen | BracketOpen)
+416}
+417
+418fn is_enclosure_close(tk: TokenKind) -> bool {
+419    use TokenKind::*;
+420    matches!(tk, ParenClose | BraceClose | BracketClose)
+421}
+422
+423fn enclosure_tokens_match(open: TokenKind, close: TokenKind) -> bool {
+424    use TokenKind::*;
+425    matches!(
+426        (open, close),
+427        (ParenOpen, ParenClose) | (BraceOpen, BraceClose) | (BracketOpen, BracketClose)
+428    )
+429}
\ No newline at end of file diff --git a/compiler-docs/src/fe_test_files/lib.rs.html b/compiler-docs/src/fe_test_files/lib.rs.html new file mode 100644 index 0000000000..d2c6721052 --- /dev/null +++ b/compiler-docs/src/fe_test_files/lib.rs.html @@ -0,0 +1,44 @@ +lib.rs - source

fe_test_files/
lib.rs

1use include_dir::{include_dir, Dir};
+2
+3const FIXTURES: Dir = include_dir!("$CARGO_MANIFEST_DIR/fixtures");
+4
+5const NEW_FIXTURES: Dir = include_dir!("$CARGO_MANIFEST_DIR/../tests/fixtures");
+6
+7pub fn fixture(path: &str) -> &'static str {
+8    FIXTURES
+9        .get_file(path)
+10        .unwrap_or_else(|| panic!("bad fixture file path {path}"))
+11        .contents_utf8()
+12        .expect("fixture file isn't utf8")
+13}
+14
+15pub fn fixture_bytes(path: &str) -> &'static [u8] {
+16    FIXTURES
+17        .get_file(path)
+18        .unwrap_or_else(|| panic!("bad fixture file path {path}"))
+19        .contents()
+20}
+21
+22pub fn fixture_dir(path: &str) -> &Dir<'static> {
+23    FIXTURES
+24        .get_dir(path)
+25        .unwrap_or_else(|| panic!("no fixture dir named \"{path}\""))
+26}
+27
+28/// Returns `(file_path, file_content)`
+29pub fn fixture_dir_files(path: &str) -> Vec<(&'static str, &'static str)> {
+30    let dir = FIXTURES
+31        .get_dir(path)
+32        .unwrap_or_else(|| panic!("no fixture dir named \"{path}\""));
+33
+34    fe_library::static_dir_files(dir)
+35}
+36
+37/// Returns `(file_path, file_content)`
+38pub fn new_fixture_dir_files(path: &str) -> Vec<(&'static str, &'static str)> {
+39    let dir = NEW_FIXTURES
+40        .get_dir(path)
+41        .unwrap_or_else(|| panic!("no fixture dir named \"{path}\""));
+42
+43    fe_library::static_dir_files(dir)
+44}
\ No newline at end of file diff --git a/compiler-docs/src/fe_test_runner/lib.rs.html b/compiler-docs/src/fe_test_runner/lib.rs.html new file mode 100644 index 0000000000..3aa56b96a9 --- /dev/null +++ b/compiler-docs/src/fe_test_runner/lib.rs.html @@ -0,0 +1,191 @@ +lib.rs - source

fe_test_runner/
lib.rs

1use colored::Colorize;
+2use ethabi::{Event, Hash, RawLog};
+3use indexmap::IndexMap;
+4use revm::primitives::{
+5    AccountInfo, Address, Bytecode, Bytes, Env, ExecutionResult, TransactTo, B256, U256,
+6};
+7use std::{fmt::Display, str::FromStr};
+8
+9pub use ethabi;
+10
+11#[derive(Debug)]
+12pub struct TestSink {
+13    success_count: usize,
+14    failure_details: Vec<String>,
+15    logs_details: Vec<String>,
+16    collect_logs: bool,
+17}
+18
+19impl TestSink {
+20    pub fn new(collect_logs: bool) -> Self {
+21        Self {
+22            success_count: 0,
+23            failure_details: vec![],
+24            logs_details: vec![],
+25            collect_logs,
+26        }
+27    }
+28
+29    pub fn test_count(&self) -> usize {
+30        self.failure_count() + self.success_count()
+31    }
+32
+33    pub fn failure_count(&self) -> usize {
+34        self.failure_details.len()
+35    }
+36
+37    pub fn logs_count(&self) -> usize {
+38        self.logs_details.len()
+39    }
+40
+41    pub fn success_count(&self) -> usize {
+42        self.success_count
+43    }
+44
+45    pub fn insert_failure(&mut self, name: &str, reason: &str) {
+46        self.failure_details
+47            .push(format!("{}\n{}", name, reason.red()))
+48    }
+49
+50    pub fn insert_logs(&mut self, name: &str, logs: &str) {
+51        if self.collect_logs {
+52            self.logs_details.push(format!(
+53                "{} produced the following logs:\n{}\n",
+54                name,
+55                logs.bright_yellow()
+56            ))
+57        }
+58    }
+59
+60    pub fn inc_success_count(&mut self) {
+61        self.success_count += 1
+62    }
+63
+64    pub fn failure_details(&self) -> String {
+65        self.failure_details.join("\n")
+66    }
+67
+68    pub fn logs_details(&self) -> String {
+69        self.logs_details.join("\n")
+70    }
+71}
+72
+73impl Display for TestSink {
+74    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+75        if self.logs_count() != 0 {
+76            writeln!(f, "{}", self.logs_details())?;
+77            writeln!(f)?;
+78        }
+79
+80        if self.failure_count() != 0 {
+81            writeln!(f, "{}", self.failure_details())?;
+82            writeln!(f)?;
+83            if self.collect_logs {
+84                writeln!(f, "note: failed tests do not produce logs")?;
+85                writeln!(f)?;
+86            }
+87        }
+88
+89        let test_description = |n: usize, status: &dyn Display| -> String {
+90            if n == 1 {
+91                format!("1 test {status}")
+92            } else {
+93                format!("{n} tests {status}")
+94            }
+95        };
+96
+97        write!(
+98            f,
+99            "{}; ",
+100            test_description(self.success_count(), &"passed".green())
+101        )?;
+102        write!(
+103            f,
+104            "{}; ",
+105            test_description(self.failure_count(), &"failed".red())
+106        )?;
+107        write!(f, "{}", test_description(self.test_count(), &"executed"))
+108    }
+109}
+110
+111pub fn execute(name: &str, events: &[Event], bytecode: &str, sink: &mut TestSink) -> bool {
+112    let events: IndexMap<_, _> = events
+113        .iter()
+114        .map(|event| (event.signature(), event))
+115        .collect();
+116    let bytecode = Bytecode::new_raw(Bytes::copy_from_slice(&hex::decode(bytecode).unwrap()));
+117
+118    let mut database = revm::InMemoryDB::default();
+119    let test_address = Address::from_str("0000000000000000000000000000000000000042").unwrap();
+120    let test_info = AccountInfo::new(U256::ZERO, 0, B256::default(), bytecode);
+121    database.insert_account_info(test_address, test_info);
+122
+123    let mut env = Env::default();
+124    env.tx.transact_to = TransactTo::Call(test_address);
+125
+126    let builder = revm::EvmBuilder::default()
+127        .with_db(database)
+128        .with_env(Box::new(env));
+129    let mut evm = builder.build();
+130    let result = evm.transact_commit().expect("evm failure");
+131
+132    if let ExecutionResult::Success { logs, .. } = result {
+133        let logs: Vec<_> = logs
+134            .iter()
+135            .map(|log| {
+136                if let Some(Some(event)) = log
+137                    .topics()
+138                    .first()
+139                    .map(|sig| events.get(&Hash::from_slice(sig.as_slice())))
+140                {
+141                    let topics = log
+142                        .topics()
+143                        .iter()
+144                        .map(|topic| Hash::from_slice(topic.as_slice()))
+145                        .collect();
+146                    let data = log.data.data.clone().to_vec();
+147                    let raw_log = RawLog { topics, data };
+148                    if let Ok(parsed_event) = event.parse_log(raw_log) {
+149                        format!(
+150                            "  {} emitted by {} with the following parameters [{}]",
+151                            event.name,
+152                            log.address,
+153                            parsed_event
+154                                .params
+155                                .iter()
+156                                .map(|param| format!("{}: {}", param.name, param.value))
+157                                .collect::<Vec<String>>()
+158                                .join(", "),
+159                        )
+160                    } else {
+161                        format!("  {:?}", log)
+162                    }
+163                } else {
+164                    format!("  {:?}", log)
+165                }
+166            })
+167            .collect();
+168
+169        if !logs.is_empty() {
+170            sink.insert_logs(name, &logs.join("\n"))
+171        }
+172
+173        sink.inc_success_count();
+174        true
+175    } else if let ExecutionResult::Revert { output, .. } = result {
+176        sink.insert_failure(
+177            name,
+178            &if output.is_empty() {
+179                "  reverted".to_string()
+180            } else {
+181                format!(
+182                    "  reverted with the following output: {}",
+183                    hex::encode(output)
+184                )
+185            },
+186        );
+187        false
+188    } else {
+189        panic!("test halted")
+190    }
+191}
\ No newline at end of file diff --git a/compiler-docs/src/fe_yulc/lib.rs.html b/compiler-docs/src/fe_yulc/lib.rs.html new file mode 100644 index 0000000000..8ddea57cf9 --- /dev/null +++ b/compiler-docs/src/fe_yulc/lib.rs.html @@ -0,0 +1,96 @@ +lib.rs - source

fe_yulc/
lib.rs

1use indexmap::map::IndexMap;
+2
+3#[derive(Debug)]
+4pub struct YulcError(pub String);
+5
+6pub struct ContractBytecode {
+7    pub bytecode: String,
+8    pub runtime_bytecode: String,
+9}
+10
+11/// Compile a map of Yul contracts to a map of bytecode contracts.
+12///
+13/// Returns a `contract_name -> hex_encoded_bytecode` map.
+14pub fn compile(
+15    contracts: impl Iterator<Item = (impl AsRef<str>, impl AsRef<str>)>,
+16    optimize: bool,
+17) -> Result<IndexMap<String, ContractBytecode>, YulcError> {
+18    contracts
+19        .map(|(name, yul_src)| {
+20            compile_single_contract(name.as_ref(), yul_src.as_ref(), optimize, true)
+21                .map(|bytecode| (name.as_ref().to_string(), bytecode))
+22        })
+23        .collect()
+24}
+25
+26#[cfg(feature = "solc-backend")]
+27/// Compiles a single Yul contract to bytecode.
+28pub fn compile_single_contract(
+29    name: &str,
+30    yul_src: &str,
+31    optimize: bool,
+32    verify_runtime_bytecode: bool,
+33) -> Result<ContractBytecode, YulcError> {
+34    let solc_temp = include_str!("solc_temp.json");
+35    let input = solc_temp
+36        .replace("{optimizer_enabled}", &optimize.to_string())
+37        .replace("{src}", yul_src);
+38    let raw_output = solc::compile(&input);
+39    let output: serde_json::Value = serde_json::from_str(&raw_output)
+40        .map_err(|_| YulcError("JSON serialization error".into()))?;
+41
+42    let bytecode = output["contracts"]["input.yul"][name]["evm"]["bytecode"]["object"]
+43        .to_string()
+44        .replace('"', "");
+45
+46    let runtime_bytecode = output["contracts"]["input.yul"][name]["evm"]["deployedBytecode"]
+47        ["object"]
+48        .to_string()
+49        .replace('"', "");
+50
+51    if bytecode == "null" {
+52        return Err(YulcError(output.to_string()));
+53    }
+54    if verify_runtime_bytecode && runtime_bytecode == "null" {
+55        return Err(YulcError(output.to_string()));
+56    }
+57
+58    Ok(ContractBytecode {
+59        bytecode,
+60        runtime_bytecode,
+61    })
+62}
+63
+64#[cfg(not(feature = "solc-backend"))]
+65/// Compiles a single Yul contract to bytecode.
+66pub fn compile_single_contract(
+67    _name: &str,
+68    _yul_src: &str,
+69    _optimize: bool,
+70    _verify_runtime_bytecode: bool,
+71) -> Result<ContractBytecode, YulcError> {
+72    // This is ugly, but required (as far as I can tell) to make
+73    // `cargo test --workspace` work without solc.
+74    panic!("fe-yulc requires 'solc-backend' feature")
+75}
+76
+77#[cfg(feature = "solc-backend")]
+78#[test]
+79fn test_solc_sanity() {
+80    let yul_src = "{ sstore(0,0) }";
+81    let solc_temp = include_str!("solc_temp.json");
+82    let input = solc_temp
+83        .replace("{optimizer_enabled}", "false")
+84        .replace("{src}", yul_src);
+85
+86    let raw_output = solc::compile(&input);
+87    let output: serde_json::Value = serde_json::from_str(&raw_output).unwrap();
+88
+89    let bytecode = output["contracts"]["input.yul"]["object"]["evm"]["bytecode"]["object"]
+90        .to_string()
+91        .replace('"', "");
+92
+93    // solc 0.8.4: push1 0; push1 0; sstore  "6000600055"
+94    // solc 0.8.7: push1 0; dup1;    sstore  "60008055"
+95    assert_eq!(bytecode, "60008055", "incorrect bytecode",);
+96}
\ No newline at end of file diff --git a/compiler-docs/static.files/COPYRIGHT-7fb11f4e.txt b/compiler-docs/static.files/COPYRIGHT-7fb11f4e.txt new file mode 100644 index 0000000000..752dab0a34 --- /dev/null +++ b/compiler-docs/static.files/COPYRIGHT-7fb11f4e.txt @@ -0,0 +1,71 @@ +# REUSE-IgnoreStart + +These documentation pages include resources by third parties. This copyright +file applies only to those resources. The following third party resources are +included, and carry their own copyright notices and license terms: + +* Fira Sans (FiraSans-Regular.woff2, FiraSans-Medium.woff2): + + Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ + with Reserved Font Name Fira Sans. + + Copyright (c) 2014, Telefonica S.A. + + Licensed under the SIL Open Font License, Version 1.1. + See FiraSans-LICENSE.txt. + +* rustdoc.css, main.js, and playpen.js: + + Copyright 2015 The Rust Developers. + Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or + the MIT license (LICENSE-MIT.txt) at your option. + +* normalize.css: + + Copyright (c) Nicolas Gallagher and Jonathan Neal. + Licensed under the MIT license (see LICENSE-MIT.txt). + +* Source Code Pro (SourceCodePro-Regular.ttf.woff2, + SourceCodePro-Semibold.ttf.woff2, SourceCodePro-It.ttf.woff2): + + Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), + with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark + of Adobe Systems Incorporated in the United States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceCodePro-LICENSE.txt. + +* Source Serif 4 (SourceSerif4-Regular.ttf.woff2, SourceSerif4-Bold.ttf.woff2, + SourceSerif4-It.ttf.woff2, SourceSerif4-Semibold.ttf.woff2): + + Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name + 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United + States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceSerif4-LICENSE.md. + +* Nanum Barun Gothic Font (NanumBarunGothic.woff2) + + Copyright 2010, NAVER Corporation (http://www.nhncorp.com) + with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, + NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, + Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, + Naver NanumMyeongjoEco, NanumMyeongjoEco, Naver NanumGothicLight, + NanumGothicLight, NanumBarunGothic, Naver NanumBarunGothic. + + https://hangeul.naver.com/2017/nanum + https://github.com/hiun/NanumBarunGothic + + Licensed under the SIL Open Font License, Version 1.1. + See NanumBarunGothic-LICENSE.txt. + +* Rust logos (rust-logo.svg, favicon.svg, favicon-32x32.png) + + Copyright 2025 Rust Foundation. + Licensed under the Creative Commons Attribution license (CC-BY). + https://rustfoundation.org/policy/rust-trademark-policy/ + +This copyright file is intended to be distributed with rustdoc output. + +# REUSE-IgnoreEnd diff --git a/compiler-docs/static.files/FiraMono-Medium-86f75c8c.woff2 b/compiler-docs/static.files/FiraMono-Medium-86f75c8c.woff2 new file mode 100644 index 0000000000..610e9b2071 Binary files /dev/null and b/compiler-docs/static.files/FiraMono-Medium-86f75c8c.woff2 differ diff --git a/compiler-docs/static.files/FiraMono-Regular-87c26294.woff2 b/compiler-docs/static.files/FiraMono-Regular-87c26294.woff2 new file mode 100644 index 0000000000..9fa44b7cc2 Binary files /dev/null and b/compiler-docs/static.files/FiraMono-Regular-87c26294.woff2 differ diff --git a/compiler-docs/static.files/FiraSans-Italic-81dc35de.woff2 b/compiler-docs/static.files/FiraSans-Italic-81dc35de.woff2 new file mode 100644 index 0000000000..3f63664fee Binary files /dev/null and b/compiler-docs/static.files/FiraSans-Italic-81dc35de.woff2 differ diff --git a/compiler-docs/static.files/FiraSans-LICENSE-05ab6dbd.txt b/compiler-docs/static.files/FiraSans-LICENSE-05ab6dbd.txt new file mode 100644 index 0000000000..d7e9c149b7 --- /dev/null +++ b/compiler-docs/static.files/FiraSans-LICENSE-05ab6dbd.txt @@ -0,0 +1,98 @@ +// REUSE-IgnoreStart + +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. +with Reserved Font Name < Fira >, + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/compiler-docs/static.files/FiraSans-Medium-e1aa3f0a.woff2 b/compiler-docs/static.files/FiraSans-Medium-e1aa3f0a.woff2 new file mode 100644 index 0000000000..7a1e5fc548 Binary files /dev/null and b/compiler-docs/static.files/FiraSans-Medium-e1aa3f0a.woff2 differ diff --git a/compiler-docs/static.files/FiraSans-MediumItalic-ccf7e434.woff2 b/compiler-docs/static.files/FiraSans-MediumItalic-ccf7e434.woff2 new file mode 100644 index 0000000000..2d08f9f7d4 Binary files /dev/null and b/compiler-docs/static.files/FiraSans-MediumItalic-ccf7e434.woff2 differ diff --git a/compiler-docs/static.files/FiraSans-Regular-0fe48ade.woff2 b/compiler-docs/static.files/FiraSans-Regular-0fe48ade.woff2 new file mode 100644 index 0000000000..e766e06ccb Binary files /dev/null and b/compiler-docs/static.files/FiraSans-Regular-0fe48ade.woff2 differ diff --git a/compiler-docs/static.files/LICENSE-APACHE-a60eea81.txt b/compiler-docs/static.files/LICENSE-APACHE-a60eea81.txt new file mode 100644 index 0000000000..16fe87b06e --- /dev/null +++ b/compiler-docs/static.files/LICENSE-APACHE-a60eea81.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/compiler-docs/static.files/LICENSE-MIT-23f18e03.txt b/compiler-docs/static.files/LICENSE-MIT-23f18e03.txt new file mode 100644 index 0000000000..31aa79387f --- /dev/null +++ b/compiler-docs/static.files/LICENSE-MIT-23f18e03.txt @@ -0,0 +1,23 @@ +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/compiler-docs/static.files/NanumBarunGothic-13b3dcba.ttf.woff2 b/compiler-docs/static.files/NanumBarunGothic-13b3dcba.ttf.woff2 new file mode 100644 index 0000000000..1866ad4bce Binary files /dev/null and b/compiler-docs/static.files/NanumBarunGothic-13b3dcba.ttf.woff2 differ diff --git a/compiler-docs/static.files/NanumBarunGothic-LICENSE-a37d393b.txt b/compiler-docs/static.files/NanumBarunGothic-LICENSE-a37d393b.txt new file mode 100644 index 0000000000..4b3edc29eb --- /dev/null +++ b/compiler-docs/static.files/NanumBarunGothic-LICENSE-a37d393b.txt @@ -0,0 +1,103 @@ +// REUSE-IgnoreStart + +Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/), + +with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, +NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, +Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco, +NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic, +Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/compiler-docs/static.files/SourceCodePro-It-fc8b9304.ttf.woff2 b/compiler-docs/static.files/SourceCodePro-It-fc8b9304.ttf.woff2 new file mode 100644 index 0000000000..462c34efcd Binary files /dev/null and b/compiler-docs/static.files/SourceCodePro-It-fc8b9304.ttf.woff2 differ diff --git a/compiler-docs/static.files/SourceCodePro-LICENSE-67f54ca7.txt b/compiler-docs/static.files/SourceCodePro-LICENSE-67f54ca7.txt new file mode 100644 index 0000000000..0d2941e148 --- /dev/null +++ b/compiler-docs/static.files/SourceCodePro-LICENSE-67f54ca7.txt @@ -0,0 +1,97 @@ +// REUSE-IgnoreStart + +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/compiler-docs/static.files/SourceCodePro-Regular-8badfe75.ttf.woff2 b/compiler-docs/static.files/SourceCodePro-Regular-8badfe75.ttf.woff2 new file mode 100644 index 0000000000..10b558e0b6 Binary files /dev/null and b/compiler-docs/static.files/SourceCodePro-Regular-8badfe75.ttf.woff2 differ diff --git a/compiler-docs/static.files/SourceCodePro-Semibold-aa29a496.ttf.woff2 b/compiler-docs/static.files/SourceCodePro-Semibold-aa29a496.ttf.woff2 new file mode 100644 index 0000000000..5ec64eef0e Binary files /dev/null and b/compiler-docs/static.files/SourceCodePro-Semibold-aa29a496.ttf.woff2 differ diff --git a/compiler-docs/static.files/SourceSerif4-Bold-6d4fd4c0.ttf.woff2 b/compiler-docs/static.files/SourceSerif4-Bold-6d4fd4c0.ttf.woff2 new file mode 100644 index 0000000000..181a07f63b Binary files /dev/null and b/compiler-docs/static.files/SourceSerif4-Bold-6d4fd4c0.ttf.woff2 differ diff --git a/compiler-docs/static.files/SourceSerif4-It-ca3b17ed.ttf.woff2 b/compiler-docs/static.files/SourceSerif4-It-ca3b17ed.ttf.woff2 new file mode 100644 index 0000000000..2ae08a7bed Binary files /dev/null and b/compiler-docs/static.files/SourceSerif4-It-ca3b17ed.ttf.woff2 differ diff --git a/compiler-docs/static.files/SourceSerif4-LICENSE-a2cfd9d5.md b/compiler-docs/static.files/SourceSerif4-LICENSE-a2cfd9d5.md new file mode 100644 index 0000000000..175fa4f47a --- /dev/null +++ b/compiler-docs/static.files/SourceSerif4-LICENSE-a2cfd9d5.md @@ -0,0 +1,98 @@ + + +Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. +Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + + diff --git a/compiler-docs/static.files/SourceSerif4-Regular-6b053e98.ttf.woff2 b/compiler-docs/static.files/SourceSerif4-Regular-6b053e98.ttf.woff2 new file mode 100644 index 0000000000..0263fc3042 Binary files /dev/null and b/compiler-docs/static.files/SourceSerif4-Regular-6b053e98.ttf.woff2 differ diff --git a/compiler-docs/static.files/SourceSerif4-Semibold-457a13ac.ttf.woff2 b/compiler-docs/static.files/SourceSerif4-Semibold-457a13ac.ttf.woff2 new file mode 100644 index 0000000000..dd55f4e95e Binary files /dev/null and b/compiler-docs/static.files/SourceSerif4-Semibold-457a13ac.ttf.woff2 differ diff --git a/compiler-docs/static.files/favicon-044be391.svg b/compiler-docs/static.files/favicon-044be391.svg new file mode 100644 index 0000000000..8b34b51198 --- /dev/null +++ b/compiler-docs/static.files/favicon-044be391.svg @@ -0,0 +1,24 @@ + + + + + diff --git a/compiler-docs/static.files/favicon-32x32-6580c154.png b/compiler-docs/static.files/favicon-32x32-6580c154.png new file mode 100644 index 0000000000..69b8613ce1 Binary files /dev/null and b/compiler-docs/static.files/favicon-32x32-6580c154.png differ diff --git a/compiler-docs/static.files/main-eebb9057.js b/compiler-docs/static.files/main-eebb9057.js new file mode 100644 index 0000000000..750010f4cc --- /dev/null +++ b/compiler-docs/static.files/main-eebb9057.js @@ -0,0 +1,11 @@ +"use strict";window.RUSTDOC_TOOLTIP_HOVER_MS=300;window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS=450;function resourcePath(basename,extension){return getVar("root-path")+basename+getVar("resource-suffix")+extension;}function hideMain(){addClass(document.getElementById(MAIN_ID),"hidden");const toggle=document.getElementById("toggle-all-docs");if(toggle){toggle.setAttribute("disabled","disabled");}}function showMain(){const main=document.getElementById(MAIN_ID);if(!main){return;}removeClass(main,"hidden");const mainHeading=main.querySelector(".main-heading");if(mainHeading&&window.searchState.rustdocToolbar){if(window.searchState.rustdocToolbar.parentElement){window.searchState.rustdocToolbar.parentElement.removeChild(window.searchState.rustdocToolbar,);}mainHeading.appendChild(window.searchState.rustdocToolbar);}const toggle=document.getElementById("toggle-all-docs");if(toggle){toggle.removeAttribute("disabled");}}window.rootPath=getVar("root-path");window.currentCrate=getVar("current-crate");function setMobileTopbar(){const mobileTopbar=document.querySelector(".mobile-topbar");const locationTitle=document.querySelector(".sidebar h2.location");if(mobileTopbar){const mobileTitle=document.createElement("h2");mobileTitle.className="location";if(hasClass(document.querySelector(".rustdoc"),"crate")){mobileTitle.innerHTML=`Crate ${window.currentCrate}`;}else if(locationTitle){mobileTitle.innerHTML=locationTitle.innerHTML;}mobileTopbar.appendChild(mobileTitle);}}function getVirtualKey(ev){if("key"in ev&&typeof ev.key!=="undefined"){return ev.key;}const c=ev.charCode||ev.keyCode;if(c===27){return"Escape";}return String.fromCharCode(c);}const MAIN_ID="main-content";const SETTINGS_BUTTON_ID="settings-menu";const ALTERNATIVE_DISPLAY_ID="alternative-display";const NOT_DISPLAYED_ID="not-displayed";const HELP_BUTTON_ID="help-button";function getSettingsButton(){return document.getElementById(SETTINGS_BUTTON_ID);}function getHelpButton(){return document.getElementById(HELP_BUTTON_ID);}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0];}function insertAfter(newNode,referenceNode){referenceNode.parentNode.insertBefore(newNode,referenceNode.nextSibling);}function getOrCreateSection(id,classes){let el=document.getElementById(id);if(!el){el=document.createElement("section");el.id=id;el.className=classes;insertAfter(el,document.getElementById(MAIN_ID));}return el;}function getAlternativeDisplayElem(){return getOrCreateSection(ALTERNATIVE_DISPLAY_ID,"content hidden");}function getNotDisplayedElem(){return getOrCreateSection(NOT_DISPLAYED_ID,"hidden");}function switchDisplayedElement(elemToDisplay){const el=getAlternativeDisplayElem();if(el.children.length>0){getNotDisplayedElem().appendChild(el.firstElementChild);}if(elemToDisplay===null){addClass(el,"hidden");showMain();return;}el.appendChild(elemToDisplay);hideMain();removeClass(el,"hidden");const mainHeading=elemToDisplay.querySelector(".main-heading");if(mainHeading&&window.searchState.rustdocToolbar){if(window.searchState.rustdocToolbar.parentElement){window.searchState.rustdocToolbar.parentElement.removeChild(window.searchState.rustdocToolbar,);}mainHeading.appendChild(window.searchState.rustdocToolbar);}}function browserSupportsHistoryApi(){return window.history&&typeof window.history.pushState==="function";}function preLoadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="preload";link.as="style";document.getElementsByTagName("head")[0].appendChild(link);}(function(){const isHelpPage=window.location.pathname.endsWith("/help.html");function loadScript(url,errorCallback){const script=document.createElement("script");script.src=url;if(errorCallback!==undefined){script.onerror=errorCallback;}document.head.append(script);}const settingsButton=getSettingsButton();if(settingsButton){settingsButton.onclick=event=>{if(event.ctrlKey||event.altKey||event.metaKey){return;}window.hideAllModals(false);addClass(getSettingsButton(),"rotate");event.preventDefault();loadScript(getVar("static-root-path")+getVar("settings-js"));setTimeout(()=>{const themes=getVar("themes").split(",");for(const theme of themes){if(theme!==""){preLoadCss(getVar("root-path")+theme+".css");}}},0);};}window.searchState={rustdocToolbar:document.querySelector("rustdoc-toolbar"),loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:()=>{let el=document.getElementById("search");if(!el){el=document.createElement("section");el.id="search";getNotDisplayedElem().appendChild(el);}return el;},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:()=>{if(window.searchState.timeout!==null){clearTimeout(window.searchState.timeout);window.searchState.timeout=null;}},isDisplayed:()=>{const outputElement=window.searchState.outputElement();return!!outputElement&&!!outputElement.parentElement&&outputElement.parentElement.id===ALTERNATIVE_DISPLAY_ID;},focus:()=>{window.searchState.input&&window.searchState.input.focus();},defocus:()=>{window.searchState.input&&window.searchState.input.blur();},showResults:search=>{if(search===null||typeof search==="undefined"){search=window.searchState.outputElement();}switchDisplayedElement(search);document.title=window.searchState.title;},removeQueryParameters:()=>{document.title=window.searchState.titleBeforeSearch;if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.hash);}},hideResults:()=>{switchDisplayedElement(null);window.searchState.removeQueryParameters();},getQueryStringParams:()=>{const params={};window.location.search.substring(1).split("&").map(s=>{const pair=s.split("=").map(x=>x.replace(/\+/g," "));params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1]);});return params;},setup:()=>{const search_input=window.searchState.input;if(!search_input){return;}let searchLoaded=false;function sendSearchForm(){document.getElementsByClassName("search-form")[0].submit();}function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(getVar("static-root-path")+getVar("search-js"),sendSearchForm);loadScript(resourcePath("search-index",".js"),sendSearchForm);}}search_input.addEventListener("focus",()=>{window.searchState.origPlaceholder=search_input.placeholder;search_input.placeholder="Type your search here.";loadSearch();});if(search_input.value!==""){loadSearch();}const params=window.searchState.getQueryStringParams();if(params.search!==undefined){window.searchState.setLoadingSearch();loadSearch();}},setLoadingSearch:()=>{const search=window.searchState.outputElement();if(!search){return;}search.innerHTML="

"+window.searchState.loadingText+"

";window.searchState.showResults(search);},descShards:new Map(),loadDesc:async function({descShard,descIndex}){if(descShard.promise===null){descShard.promise=new Promise((resolve,reject)=>{descShard.resolve=resolve;const ds=descShard;const fname=`${ds.crate}-desc-${ds.shard}-`;const url=resourcePath(`search.desc/${descShard.crate}/${fname}`,".js",);loadScript(url,reject);});}const list=await descShard.promise;return list[descIndex];},loadedDescShard:function(crate,shard,data){this.descShards.get(crate)[shard].resolve(data.split("\n"));},};const toggleAllDocsId="toggle-all-docs";let savedHash="";function handleHashes(ev){if(ev!==null&&window.searchState.isDisplayed()&&ev.newURL){switchDisplayedElement(null);const hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.search+"#"+hash);}const elem=document.getElementById(hash);if(elem){elem.scrollIntoView();}}const pageId=window.location.hash.replace(/^#/,"");if(savedHash!==pageId){savedHash=pageId;if(pageId!==""){expandSection(pageId);}}if(savedHash.startsWith("impl-")){const splitAt=savedHash.indexOf("/");if(splitAt!==-1){const implId=savedHash.slice(0,splitAt);const assocId=savedHash.slice(splitAt+1);const implElems=document.querySelectorAll(`details > summary > section[id^="${implId}"]`,);onEachLazy(implElems,implElem=>{const numbered=/^(.+?)-([0-9]+)$/.exec(implElem.id);if(implElem.id!==implId&&(!numbered||numbered[1]!==implId)){return false;}return onEachLazy(implElem.parentElement.parentElement.querySelectorAll(`[id^="${assocId}"]`),item=>{const numbered=/^(.+?)-([0-9]+)$/.exec(item.id);if(item.id===assocId||(numbered&&numbered[1]===assocId)){openParentDetails(item);item.scrollIntoView();setTimeout(()=>{window.location.replace("#"+item.id);},0);return true;}},);});}}}function onHashChange(ev){hideSidebar();handleHashes(ev);}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true;}elem=elem.parentElement;}}function expandSection(id){openParentDetails(document.getElementById(id));}function handleEscape(ev){window.searchState.clearInputTimeout();window.searchState.hideResults();ev.preventDefault();window.searchState.defocus();window.hideAllModals(true);}function handleShortcut(ev){const disableShortcuts=getSettingValue("disable-shortcuts")==="true";if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return;}if(document.activeElement&&document.activeElement.tagName==="INPUT"&&document.activeElement.type!=="checkbox"&&document.activeElement.type!=="radio"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":case"/":ev.preventDefault();window.searchState.focus();break;case"+":ev.preventDefault();expandAllDocs();break;case"-":ev.preventDefault();collapseAllDocs(false);break;case"_":ev.preventDefault();collapseAllDocs(true);break;case"?":showHelp();break;default:break;}}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);function addSidebarItems(){if(!window.SIDEBAR_ITEMS){return;}const sidebar=document.getElementById("rustdoc-modnav");function block(shortty,id,longty){const filtered=window.SIDEBAR_ITEMS[shortty];if(!filtered){return;}const modpath=hasClass(document.querySelector(".rustdoc"),"mod")?"../":"";const h3=document.createElement("h3");h3.innerHTML=`${longty}`;const ul=document.createElement("ul");ul.className="block "+shortty;for(const name of filtered){let path;if(shortty==="mod"){path=`${modpath}${name}/index.html`;}else{path=`${modpath}${shortty}.${name}.html`;}let current_page=document.location.href.toString();if(current_page.endsWith("/")){current_page+="index.html";}const link=document.createElement("a");link.href=path;link.textContent=name;const li=document.createElement("li");if(link.href===current_page){li.classList.add("current");}li.appendChild(link);ul.appendChild(li);}sidebar.appendChild(h3);sidebar.appendChild(ul);}if(sidebar){block("primitive","primitives","Primitive Types");block("mod","modules","Modules");block("macro","macros","Macros");block("struct","structs","Structs");block("enum","enums","Enums");block("constant","constants","Constants");block("static","static","Statics");block("trait","traits","Traits");block("fn","functions","Functions");block("type","types","Type Aliases");block("union","unions","Unions");block("foreigntype","foreign-types","Foreign Types");block("keyword","keywords","Keywords");block("attr","attributes","Attribute Macros");block("derive","derives","Derive Macros");block("traitalias","trait-aliases","Trait Aliases");}}window.register_implementors=imp=>{const implementors=document.getElementById("implementors-list");const synthetic_implementors=document.getElementById("synthetic-implementors-list");const inlined_types=new Set();const TEXT_IDX=0;const SYNTHETIC_IDX=1;const TYPES_IDX=2;if(synthetic_implementors){onEachLazy(synthetic_implementors.getElementsByClassName("impl"),el=>{const aliases=el.getAttribute("data-aliases");if(!aliases){return;}aliases.split(",").forEach(alias=>{inlined_types.add(alias);});});}let currentNbImpls=implementors.getElementsByClassName("impl").length;const traitName=document.querySelector(".main-heading h1 > .trait").textContent;const baseIdName="impl-"+traitName+"-";const libs=Object.getOwnPropertyNames(imp);const script=document.querySelector("script[data-ignore-extern-crates]");const ignoreExternCrates=new Set((script?script.getAttribute("data-ignore-extern-crates"):"").split(","),);for(const lib of libs){if(lib===window.currentCrate||ignoreExternCrates.has(lib)){continue;}const structs=imp[lib];struct_loop:for(const struct of structs){const list=struct[SYNTHETIC_IDX]?synthetic_implementors:implementors;if(struct[SYNTHETIC_IDX]){for(const struct_type of struct[TYPES_IDX]){if(inlined_types.has(struct_type)){continue struct_loop;}inlined_types.add(struct_type);}}const code=document.createElement("h3");code.innerHTML=struct[TEXT_IDX];addClass(code,"code-header");onEachLazy(code.getElementsByTagName("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href);}});const currentId=baseIdName+currentNbImpls;const anchor=document.createElement("a");anchor.href="#"+currentId;addClass(anchor,"anchor");const display=document.createElement("div");display.id=currentId;addClass(display,"impl");display.appendChild(anchor);display.appendChild(code);list.appendChild(display);currentNbImpls+=1;}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors);}window.register_type_impls=imp=>{if(!imp||!imp[window.currentCrate]){return;}window.pending_type_impls=undefined;const idMap=new Map();let implementations=document.getElementById("implementations-list");let trait_implementations=document.getElementById("trait-implementations-list");let trait_implementations_header=document.getElementById("trait-implementations");const script=document.querySelector("script[data-self-path]");const selfPath=script?script.getAttribute("data-self-path"):null;const mainContent=document.querySelector("#main-content");const sidebarSection=document.querySelector(".sidebar section");let methods=document.querySelector(".sidebar .block.method");let associatedTypes=document.querySelector(".sidebar .block.associatedtype");let associatedConstants=document.querySelector(".sidebar .block.associatedconstant");let sidebarTraitList=document.querySelector(".sidebar .block.trait-implementation");for(const impList of imp[window.currentCrate]){const types=impList.slice(2);const text=impList[0];const isTrait=impList[1]!==0;const traitName=impList[1];if(types.indexOf(selfPath)===-1){continue;}let outputList=isTrait?trait_implementations:implementations;if(outputList===null){const outputListName=isTrait?"Trait Implementations":"Implementations";const outputListId=isTrait?"trait-implementations-list":"implementations-list";const outputListHeaderId=isTrait?"trait-implementations":"implementations";const outputListHeader=document.createElement("h2");outputListHeader.id=outputListHeaderId;outputListHeader.innerText=outputListName;outputList=document.createElement("div");outputList.id=outputListId;if(isTrait){const link=document.createElement("a");link.href=`#${outputListHeaderId}`;link.innerText="Trait Implementations";const h=document.createElement("h3");h.appendChild(link);trait_implementations=outputList;trait_implementations_header=outputListHeader;sidebarSection.appendChild(h);sidebarTraitList=document.createElement("ul");sidebarTraitList.className="block trait-implementation";sidebarSection.appendChild(sidebarTraitList);mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList);}else{implementations=outputList;if(trait_implementations){mainContent.insertBefore(outputListHeader,trait_implementations_header);mainContent.insertBefore(outputList,trait_implementations_header);}else{const mainContent=document.querySelector("#main-content");mainContent.appendChild(outputListHeader);mainContent.appendChild(outputList);}}}const template=document.createElement("template");template.innerHTML=text;onEachLazy(template.content.querySelectorAll("a"),elem=>{const href=elem.getAttribute("href");if(href&&!href.startsWith("#")&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href);}});onEachLazy(template.content.querySelectorAll("[id]"),el=>{let i=0;if(idMap.has(el.id)){i=idMap.get(el.id);}else if(document.getElementById(el.id)){i=1;while(document.getElementById(`${el.id}-${2 * i}`)){i=2*i;}while(document.getElementById(`${el.id}-${i}`)){i+=1;}}if(i!==0){const oldHref=`#${el.id}`;const newHref=`#${el.id}-${i}`;el.id=`${el.id}-${i}`;onEachLazy(template.content.querySelectorAll("a[href]"),link=>{if(link.getAttribute("href")===oldHref){link.href=newHref;}});}idMap.set(el.id,i+1);});const templateAssocItems=template.content.querySelectorAll("section.tymethod, "+"section.method, section.associatedtype, section.associatedconstant");if(isTrait){const li=document.createElement("li");const a=document.createElement("a");a.href=`#${template.content.querySelector(".impl").id}`;a.textContent=traitName;li.appendChild(a);sidebarTraitList.append(li);}else{onEachLazy(templateAssocItems,item=>{let block=hasClass(item,"associatedtype")?associatedTypes:(hasClass(item,"associatedconstant")?associatedConstants:(methods));if(!block){const blockTitle=hasClass(item,"associatedtype")?"Associated Types":(hasClass(item,"associatedconstant")?"Associated Constants":("Methods"));const blockClass=hasClass(item,"associatedtype")?"associatedtype":(hasClass(item,"associatedconstant")?"associatedconstant":("method"));const blockHeader=document.createElement("h3");const blockLink=document.createElement("a");blockLink.href="#implementations";blockLink.innerText=blockTitle;blockHeader.appendChild(blockLink);block=document.createElement("ul");block.className=`block ${blockClass}`;const insertionReference=methods||sidebarTraitList;if(insertionReference){const insertionReferenceH=insertionReference.previousElementSibling;sidebarSection.insertBefore(blockHeader,insertionReferenceH);sidebarSection.insertBefore(block,insertionReferenceH);}else{sidebarSection.appendChild(blockHeader);sidebarSection.appendChild(block);}if(hasClass(item,"associatedtype")){associatedTypes=block;}else if(hasClass(item,"associatedconstant")){associatedConstants=block;}else{methods=block;}}const li=document.createElement("li");const a=document.createElement("a");a.innerText=item.id.split("-")[0].split(".")[1];a.href=`#${item.id}`;li.appendChild(a);block.appendChild(li);});}outputList.appendChild(template.content);}for(const list of[methods,associatedTypes,associatedConstants,sidebarTraitList]){if(!list){continue;}const newChildren=Array.prototype.slice.call(list.children);newChildren.sort((a,b)=>{const aI=a.innerText;const bI=b.innerText;return aIbI?1:0;});list.replaceChildren(...newChildren);}};if(window.pending_type_impls){window.register_type_impls(window.pending_type_impls);}function addSidebarCrates(){if(!window.ALL_CRATES){return;}const sidebarElems=document.getElementById("rustdoc-modnav");if(!sidebarElems){return;}const h3=document.createElement("h3");h3.innerHTML="Crates";const ul=document.createElement("ul");ul.className="block crate";for(const crate of window.ALL_CRATES){const link=document.createElement("a");link.href=window.rootPath+crate+"/index.html";link.textContent=crate;const li=document.createElement("li");if(window.rootPath!=="./"&&crate===window.currentCrate){li.className="current";}li.appendChild(link);ul.appendChild(li);}sidebarElems.appendChild(h3);sidebarElems.appendChild(ul);}function expandAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);removeClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hasClass(e,"type-contents-toggle")&&!hasClass(e,"more-examples-toggle")){e.open=true;}});innerToggle.children[0].innerText="Summary";}function collapseAllDocs(collapseImpls){const innerToggle=document.getElementById(toggleAllDocsId);addClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if((collapseImpls||e.parentNode.id!=="implementations-list")||(!hasClass(e,"implementors-toggle")&&!hasClass(e,"type-contents-toggle"))){e.open=false;}});innerToggle.children[0].innerText="Show all";}function toggleAllDocs(ev){const innerToggle=document.getElementById(toggleAllDocsId);if(!innerToggle){return;}if(hasClass(innerToggle,"will-expand")){expandAllDocs();}else{collapseAllDocs(ev!==undefined&&ev.shiftKey);}}(function(){const toggles=document.getElementById(toggleAllDocsId);if(toggles){toggles.onclick=toggleAllDocs;}const hideMethodDocs=getSettingValue("auto-hide-method-docs")==="true";const hideImplementations=getSettingValue("auto-hide-trait-implementations")==="true";const hideLargeItemContents=getSettingValue("auto-hide-large-items")!=="false";function setImplementorsTogglesOpen(id,open){const list=document.getElementById(id);if(list!==null){onEachLazy(list.getElementsByClassName("implementors-toggle"),e=>{e.open=open;});}}if(hideImplementations){setImplementorsTogglesOpen("trait-implementations-list",false);setImplementorsTogglesOpen("blanket-implementations-list",false);}onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hideLargeItemContents&&hasClass(e,"type-contents-toggle")){e.open=true;}if(hideMethodDocs&&hasClass(e,"method-toggle")){e.open=false;}});}());window.rustdoc_add_line_numbers_to_examples=()=>{function generateLine(nb){return`${nb}`;}onEachLazy(document.querySelectorAll(".rustdoc:not(.src) :not(.scraped-example) > .example-wrap > pre > code",),code=>{if(hasClass(code.parentElement.parentElement,"hide-lines")){removeClass(code.parentElement.parentElement,"hide-lines");return;}const lines=code.innerHTML.split("\n");const digits=(lines.length+"").length;code.innerHTML=lines.map((line,index)=>generateLine(index+1)+line).join("\n");addClass(code.parentElement.parentElement,`digits-${digits}`);});};window.rustdoc_remove_line_numbers_from_examples=()=>{onEachLazy(document.querySelectorAll(".rustdoc:not(.src) :not(.scraped-example) > .example-wrap"),x=>addClass(x,"hide-lines"),);};if(getSettingValue("line-numbers")==="true"){window.rustdoc_add_line_numbers_to_examples();}function showSidebar(){window.hideAllModals(false);const sidebar=document.getElementsByClassName("sidebar")[0];addClass(sidebar,"shown");}function hideSidebar(){const sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"shown");}window.addEventListener("resize",()=>{if(window.CURRENT_TOOLTIP_ELEMENT){const base=window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE;const force_visible=base.TOOLTIP_FORCE_VISIBLE;hideTooltip(false);if(force_visible){showTooltip(base);base.TOOLTIP_FORCE_VISIBLE=true;}}});const mainElem=document.getElementById(MAIN_ID);if(mainElem){mainElem.addEventListener("click",hideSidebar);}onEachLazy(document.querySelectorAll("a[href^='#']"),el=>{el.addEventListener("click",()=>{expandSection(el.hash.slice(1));hideSidebar();});});onEachLazy(document.querySelectorAll(".toggle > summary:not(.hideme)"),el=>{el.addEventListener("click",e=>{if(!e.target.matches("summary, a, a *")){e.preventDefault();}});});function showTooltip(e){const notable_ty=e.getAttribute("data-notable-ty");if(!window.NOTABLE_TRAITS&¬able_ty){const data=document.getElementById("notable-traits-data");if(data){window.NOTABLE_TRAITS=JSON.parse(data.innerText);}else{throw new Error("showTooltip() called with notable without any notable traits!");}}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE===e){clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);return;}window.hideAllModals(false);const wrapper=document.createElement("div");if(notable_ty){wrapper.innerHTML="
"+window.NOTABLE_TRAITS[notable_ty]+"
";}else{const ttl=e.getAttribute("title");if(ttl!==null){e.setAttribute("data-title",ttl);e.removeAttribute("title");}const dttl=e.getAttribute("data-title");if(dttl!==null){const titleContent=document.createElement("div");titleContent.className="content";titleContent.appendChild(document.createTextNode(dttl));wrapper.appendChild(titleContent);}}wrapper.className="tooltip popover";const focusCatcher=document.createElement("div");focusCatcher.setAttribute("tabindex","0");focusCatcher.onfocus=hideTooltip;wrapper.appendChild(focusCatcher);const pos=e.getBoundingClientRect();wrapper.style.top=(pos.top+window.scrollY+pos.height)+"px";wrapper.style.left=0;wrapper.style.right="auto";wrapper.style.visibility="hidden";document.body.appendChild(wrapper);const wrapperPos=wrapper.getBoundingClientRect();const finalPos=pos.left+window.scrollX-wrapperPos.width+24;if(finalPos>0){wrapper.style.left=finalPos+"px";}else{wrapper.style.setProperty("--popover-arrow-offset",(wrapperPos.right-pos.right+4)+"px",);}wrapper.style.visibility="";window.CURRENT_TOOLTIP_ELEMENT=wrapper;window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE=e;clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);wrapper.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return;}clearTooltipHoverTimeout(e);};wrapper.onpointerleave=ev=>{if(ev.pointerType!=="mouse"||!(ev.relatedTarget instanceof HTMLElement)){return;}if(!e.TOOLTIP_FORCE_VISIBLE&&!e.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(wrapper,"fade-out");}};}function setTooltipHoverTimeout(element,show){clearTooltipHoverTimeout(element);if(!show&&!window.CURRENT_TOOLTIP_ELEMENT){return;}if(show&&window.CURRENT_TOOLTIP_ELEMENT){return;}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE!==element){return;}element.TOOLTIP_HOVER_TIMEOUT=setTimeout(()=>{if(show){showTooltip(element);}else if(!element.TOOLTIP_FORCE_VISIBLE){hideTooltip(false);}},show?window.RUSTDOC_TOOLTIP_HOVER_MS:window.RUSTDOC_TOOLTIP_HOVER_EXIT_MS);}function clearTooltipHoverTimeout(element){if(element.TOOLTIP_HOVER_TIMEOUT!==undefined){removeClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out");clearTimeout(element.TOOLTIP_HOVER_TIMEOUT);delete element.TOOLTIP_HOVER_TIMEOUT;}}function tooltipBlurHandler(event){if(window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.contains(event.relatedTarget)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(document.activeElement)&&!window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.contains(event.relatedTarget)){setTimeout(()=>hideTooltip(false),0);}}function hideTooltip(focus){if(window.CURRENT_TOOLTIP_ELEMENT){if(window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE){if(focus){window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.focus();}window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE=false;}document.body.removeChild(window.CURRENT_TOOLTIP_ELEMENT);clearTooltipHoverTimeout(window.CURRENT_TOOLTIP_ELEMENT);window.CURRENT_TOOLTIP_ELEMENT=null;}}onEachLazy(document.getElementsByClassName("tooltip"),e=>{e.onclick=()=>{e.TOOLTIP_FORCE_VISIBLE=e.TOOLTIP_FORCE_VISIBLE?false:true;if(window.CURRENT_TOOLTIP_ELEMENT&&!e.TOOLTIP_FORCE_VISIBLE){hideTooltip(true);}else{showTooltip(e);window.CURRENT_TOOLTIP_ELEMENT.setAttribute("tabindex","0");window.CURRENT_TOOLTIP_ELEMENT.focus();window.CURRENT_TOOLTIP_ELEMENT.onblur=tooltipBlurHandler;}return false;};e.onpointerenter=ev=>{if(ev.pointerType!=="mouse"){return;}setTooltipHoverTimeout(e,true);};e.onpointermove=ev=>{if(ev.pointerType!=="mouse"){return;}setTooltipHoverTimeout(e,true);};e.onpointerleave=ev=>{if(ev.pointerType!=="mouse"){return;}if(!e.TOOLTIP_FORCE_VISIBLE&&window.CURRENT_TOOLTIP_ELEMENT&&!window.CURRENT_TOOLTIP_ELEMENT.contains(ev.relatedTarget)){setTooltipHoverTimeout(e,false);addClass(window.CURRENT_TOOLTIP_ELEMENT,"fade-out");}};});const sidebar_menu_toggle=document.getElementsByClassName("sidebar-menu-toggle")[0];if(sidebar_menu_toggle){sidebar_menu_toggle.addEventListener("click",()=>{const sidebar=document.getElementsByClassName("sidebar")[0];if(!hasClass(sidebar,"shown")){showSidebar();}else{hideSidebar();}});}function helpBlurHandler(event){if(!getHelpButton().contains(document.activeElement)&&!getHelpButton().contains(event.relatedTarget)&&!getSettingsButton().contains(document.activeElement)&&!getSettingsButton().contains(event.relatedTarget)){window.hidePopoverMenus();}}function buildHelpMenu(){const book_info=document.createElement("span");const drloChannel=`https://doc.rust-lang.org/${getVar("channel")}`;book_info.className="top";book_info.innerHTML=`You can find more information in \ +the rustdoc book.`;const shortcuts=[["?","Show this help dialog"],["S / /","Focus the search field"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],["_","Collapse all sections, including impl blocks"],].map(x=>"
"+x[0].split(" ").map((y,index)=>((index&1)===0?""+y+"":" "+y+" ")).join("")+"
"+x[1]+"
").join("");const div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

Keyboard Shortcuts

"+shortcuts+"
";const infos=[`For a full list of all search features, take a look \ + here.`,"Prefix searches with a type followed by a colon (e.g., fn:) to \ + restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \ + enum, trait, type, macro, \ + and const.","Search functions by type signature (e.g., vec -> usize or \ + -> vec or String, enum:Cow -> bool)","You can look for items with an exact name by putting double quotes around \ + your request: \"string\"",`Look for functions that accept or return \ + slices and \ + arrays by writing square \ + brackets (e.g., -> [u8] or [] -> Option)`,"Look for items inside another one by searching for a path: vec::Vec",].map(x=>"

"+x+"

").join("");const div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;const rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";const rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);const container=document.createElement("div");if(!isHelpPage){container.className="popover";}container.id="help";container.style.display="none";const side_by_side=document.createElement("div");side_by_side.className="side-by-side";side_by_side.appendChild(div_shortcuts);side_by_side.appendChild(div_infos);container.appendChild(book_info);container.appendChild(side_by_side);container.appendChild(rustdoc_version);if(isHelpPage){const help_section=document.createElement("section");help_section.appendChild(container);document.getElementById("main-content").appendChild(help_section);container.style.display="block";}else{const help_button=getHelpButton();help_button.appendChild(container);container.onblur=helpBlurHandler;help_button.onblur=helpBlurHandler;help_button.children[0].onblur=helpBlurHandler;}return container;}window.hideAllModals=switchFocus=>{hideSidebar();window.hidePopoverMenus();hideTooltip(switchFocus);};window.hidePopoverMenus=()=>{onEachLazy(document.querySelectorAll("rustdoc-toolbar .popover"),elem=>{elem.style.display="none";});const button=getHelpButton();if(button){removeClass(button,"help-open");}};function getHelpMenu(buildNeeded){let menu=getHelpButton().querySelector(".popover");if(!menu&&buildNeeded){menu=buildHelpMenu();}return menu;}function showHelp(){const button=getHelpButton();addClass(button,"help-open");button.querySelector("a").focus();const menu=getHelpMenu(true);if(menu.style.display==="none"){window.hideAllModals();menu.style.display="";}}const helpLink=document.querySelector(`#${HELP_BUTTON_ID} > a`);if(isHelpPage){buildHelpMenu();}else if(helpLink){helpLink.addEventListener("click",event=>{if(!helpLink.contains(helpLink)||event.ctrlKey||event.altKey||event.metaKey){return;}event.preventDefault();const menu=getHelpMenu(true);const shouldShowHelp=menu.style.display==="none";if(shouldShowHelp){showHelp();}else{window.hidePopoverMenus();}});}setMobileTopbar();addSidebarItems();addSidebarCrates();onHashChange(null);window.addEventListener("hashchange",onHashChange);window.searchState.setup();}());(function(){const SIDEBAR_MIN=100;const SIDEBAR_MAX=500;const RUSTDOC_MOBILE_BREAKPOINT=700;const BODY_MIN=400;const SIDEBAR_VANISH_THRESHOLD=SIDEBAR_MIN/2;const sidebarButton=document.getElementById("sidebar-button");if(sidebarButton){sidebarButton.addEventListener("click",e=>{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false");if(document.querySelector(".rustdoc.src")){window.rustdocToggleSrcSidebar();}e.preventDefault();});}let currentPointerId=null;let desiredSidebarSize=null;let pendingSidebarResizingFrame=false;const resizer=document.querySelector(".sidebar-resizer");const sidebar=document.querySelector(".sidebar");if(!resizer||!sidebar){return;}const isSrcPage=hasClass(document.body,"src");const hideSidebar=function(){if(isSrcPage){window.rustdocCloseSourceSidebar();updateLocalStorage("src-sidebar-width",null);document.documentElement.style.removeProperty("--src-sidebar-width");sidebar.style.removeProperty("--src-sidebar-width");resizer.style.removeProperty("--src-sidebar-width");}else{addClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","true");updateLocalStorage("desktop-sidebar-width",null);document.documentElement.style.removeProperty("--desktop-sidebar-width");sidebar.style.removeProperty("--desktop-sidebar-width");resizer.style.removeProperty("--desktop-sidebar-width");}};const showSidebar=function(){if(isSrcPage){window.rustdocShowSourceSidebar();}else{removeClass(document.documentElement,"hide-sidebar");updateLocalStorage("hide-sidebar","false");}};const changeSidebarSize=function(size){if(isSrcPage){updateLocalStorage("src-sidebar-width",size.toString());sidebar.style.setProperty("--src-sidebar-width",size+"px");resizer.style.setProperty("--src-sidebar-width",size+"px");}else{updateLocalStorage("desktop-sidebar-width",size.toString());sidebar.style.setProperty("--desktop-sidebar-width",size+"px");resizer.style.setProperty("--desktop-sidebar-width",size+"px");}};const isSidebarHidden=function(){return isSrcPage?!hasClass(document.documentElement,"src-sidebar-expanded"):hasClass(document.documentElement,"hide-sidebar");};const resize=function(e){if(currentPointerId===null||currentPointerId!==e.pointerId){return;}e.preventDefault();const pos=e.clientX-3;if(pos=SIDEBAR_MIN){if(isSidebarHidden()){showSidebar();}const constrainedPos=Math.min(pos,window.innerWidth-BODY_MIN,SIDEBAR_MAX);changeSidebarSize(constrainedPos);desiredSidebarSize=constrainedPos;if(pendingSidebarResizingFrame!==false){clearTimeout(pendingSidebarResizingFrame);}pendingSidebarResizingFrame=setTimeout(()=>{if(currentPointerId===null||pendingSidebarResizingFrame===false){return;}pendingSidebarResizingFrame=false;document.documentElement.style.setProperty("--resizing-sidebar-width",desiredSidebarSize+"px",);},100);}};window.addEventListener("resize",()=>{if(window.innerWidth=(window.innerWidth-BODY_MIN)){changeSidebarSize(window.innerWidth-BODY_MIN);}else if(desiredSidebarSize!==null&&desiredSidebarSize>SIDEBAR_MIN){changeSidebarSize(desiredSidebarSize);}});const stopResize=function(e){if(currentPointerId===null){return;}if(e){e.preventDefault();}desiredSidebarSize=sidebar.getBoundingClientRect().width;removeClass(resizer,"active");window.removeEventListener("pointermove",resize,false);window.removeEventListener("pointerup",stopResize,false);removeClass(document.documentElement,"sidebar-resizing");document.documentElement.style.removeProperty("--resizing-sidebar-width");if(resizer.releasePointerCapture){resizer.releasePointerCapture(currentPointerId);currentPointerId=null;}};const initResize=function(e){if(currentPointerId!==null||e.altKey||e.ctrlKey||e.metaKey||e.button!==0){return;}if(resizer.setPointerCapture){resizer.setPointerCapture(e.pointerId);if(!resizer.hasPointerCapture(e.pointerId)){resizer.releasePointerCapture(e.pointerId);return;}currentPointerId=e.pointerId;}window.hideAllModals(false);e.preventDefault();window.addEventListener("pointermove",resize,false);window.addEventListener("pointercancel",stopResize,false);window.addEventListener("pointerup",stopResize,false);addClass(resizer,"active");addClass(document.documentElement,"sidebar-resizing");const pos=e.clientX-sidebar.offsetLeft-3;document.documentElement.style.setProperty("--resizing-sidebar-width",pos+"px");desiredSidebarSize=null;};resizer.addEventListener("pointerdown",initResize,false);}());(function(){function copyContentToClipboard(content){if(content===null){return;}const el=document.createElement("textarea");el.value=content;el.setAttribute("readonly","");el.style.position="absolute";el.style.left="-9999px";document.body.appendChild(el);el.select();document.execCommand("copy");document.body.removeChild(el);}function copyButtonAnimation(button){button.classList.add("clicked");if(button.reset_button_timeout!==undefined){clearTimeout(button.reset_button_timeout);}button.reset_button_timeout=setTimeout(()=>{button.reset_button_timeout=undefined;button.classList.remove("clicked");},1000);}const but=document.getElementById("copy-path");if(!but){return;}but.onclick=()=>{const titleElement=document.querySelector("title");const title=titleElement&&titleElement.textContent?titleElement.textContent.replace(" - Rust",""):"";const[item,module]=title.split(" in ");const path=[item];if(module!==undefined){path.unshift(module);}copyContentToClipboard(path.join("::"));copyButtonAnimation(but);};function copyCode(codeElem){if(!codeElem){return;}copyContentToClipboard(codeElem.textContent);}function getExampleWrap(event){const target=event.target;if(target instanceof HTMLElement){let elem=target;while(elem!==null&&!hasClass(elem,"example-wrap")){if(elem===document.body||elem.tagName==="A"||elem.tagName==="BUTTON"||hasClass(elem,"docblock")){return null;}elem=elem.parentElement;}return elem;}else{return null;}}function addCopyButton(event){const elem=getExampleWrap(event);if(elem===null){return;}elem.removeEventListener("mouseover",addCopyButton);const parent=document.createElement("div");parent.className="button-holder";const runButton=elem.querySelector(".test-arrow");if(runButton!==null){parent.appendChild(runButton);}elem.appendChild(parent);const copyButton=document.createElement("button");copyButton.className="copy-button";copyButton.title="Copy code to clipboard";copyButton.addEventListener("click",()=>{copyCode(elem.querySelector("pre > code"));copyButtonAnimation(copyButton);});parent.appendChild(copyButton);if(!elem.parentElement||!elem.parentElement.classList.contains("scraped-example")||!window.updateScrapedExample){return;}const scrapedWrapped=elem.parentElement;window.updateScrapedExample(scrapedWrapped,parent);}function showHideCodeExampleButtons(event){const elem=getExampleWrap(event);if(elem===null){return;}let buttons=elem.querySelector(".button-holder");if(buttons===null){addCopyButton(event);buttons=elem.querySelector(".button-holder");if(buttons===null){return;}}buttons.classList.toggle("keep-visible");}onEachLazy(document.querySelectorAll(".docblock .example-wrap"),elem=>{elem.addEventListener("mouseover",addCopyButton);elem.addEventListener("click",showHideCodeExampleButtons);});}());(function(){document.body.addEventListener("copy",event=>{let target=nonnull(event.target);let isInsideCode=false;while(target&&target!==document.body){if(target.tagName==="CODE"){isInsideCode=true;break;}target=target.parentElement;}if(!isInsideCode){return;}const selection=document.getSelection();nonnull(event.clipboardData).setData("text/plain",selection.toString());event.preventDefault();});}()); \ No newline at end of file diff --git a/compiler-docs/static.files/normalize-9960930a.css b/compiler-docs/static.files/normalize-9960930a.css new file mode 100644 index 0000000000..469959f137 --- /dev/null +++ b/compiler-docs/static.files/normalize-9960930a.css @@ -0,0 +1,2 @@ + /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type="button"],[type="reset"],[type="submit"],button{-webkit-appearance:button}[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} \ No newline at end of file diff --git a/compiler-docs/static.files/noscript-32bb7600.css b/compiler-docs/static.files/noscript-32bb7600.css new file mode 100644 index 0000000000..c228ec49bd --- /dev/null +++ b/compiler-docs/static.files/noscript-32bb7600.css @@ -0,0 +1 @@ + #main-content .attributes{margin-left:0 !important;}#copy-path,#sidebar-button,.sidebar-resizer{display:none !important;}nav.sub{display:none;}.src .sidebar{display:none;}.notable-traits{display:none;}:root,:root:not([data-theme]){--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--sidebar-border-color:#ddd;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--mobile-sidebar-menu-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#595959;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}@media (prefers-color-scheme:dark){:root,:root:not([data-theme]){--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--sidebar-border-color:#2A2A2A;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#a5a5a5;--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(65%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}} \ No newline at end of file diff --git a/compiler-docs/static.files/rust-logo-9a9549ea.svg b/compiler-docs/static.files/rust-logo-9a9549ea.svg new file mode 100644 index 0000000000..62424d8ffd --- /dev/null +++ b/compiler-docs/static.files/rust-logo-9a9549ea.svg @@ -0,0 +1,61 @@ + + + diff --git a/compiler-docs/static.files/rustdoc-aa0817cf.css b/compiler-docs/static.files/rustdoc-aa0817cf.css new file mode 100644 index 0000000000..5fa709d10c --- /dev/null +++ b/compiler-docs/static.files/rustdoc-aa0817cf.css @@ -0,0 +1,59 @@ + :root{--nav-sub-mobile-padding:8px;--search-typename-width:6.75rem;--desktop-sidebar-width:200px;--src-sidebar-width:300px;--desktop-sidebar-z-index:100;--sidebar-elems-left-padding:24px;--clipboard-image:url('data:image/svg+xml,\ +\ +\ +');--copy-path-height:34px;--copy-path-width:33px;--checkmark-image:url('data:image/svg+xml,\ +\ +');--button-left-margin:4px;--button-border-radius:2px;--toolbar-button-border-radius:6px;--code-block-border-radius:6px;--impl-items-indent:0.3em;--docblock-indent:24px;--font-family:"Source Serif 4",NanumBarunGothic,serif;--font-family-code:"Source Code Pro",monospace;--line-number-padding:4px;--line-number-right-margin:20px;--prev-arrow-image:url('data:image/svg+xml,');--next-arrow-image:url('data:image/svg+xml,');--expand-arrow-image:url('data:image/svg+xml,');--collapse-arrow-image:url('data:image/svg+xml,');--hamburger-image:url('data:image/svg+xml,\ + ');}:root.sans-serif{--font-family:"Fira Sans",sans-serif;--font-family-code:"Fira Mono",monospace;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular-0fe48ade.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:italic;font-weight:400;src:local('Fira Sans Italic'),url("FiraSans-Italic-81dc35de.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium-e1aa3f0a.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:italic;font-weight:500;src:local('Fira Sans Medium Italic'),url("FiraSans-MediumItalic-ccf7e434.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Mono';font-style:normal;font-weight:400;src:local('Fira Mono'),url("FiraMono-Regular-87c26294.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Mono';font-style:normal;font-weight:500;src:local('Fira Mono Medium'),url("FiraMono-Medium-86f75c8c.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular-6b053e98.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It-ca3b17ed.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:500;src:local('Source Serif 4 Semibold'),url("SourceSerif4-Semibold-457a13ac.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold-6d4fd4c0.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular-8badfe75.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It-fc8b9304.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold-aa29a496.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'NanumBarunGothic';src:url("NanumBarunGothic-13b3dcba.ttf.woff2") format("woff2");font-display:swap;unicode-range:U+AC00-D7AF,U+1100-11FF,U+3130-318F,U+A960-A97F,U+D7B0-D7FF;}*{box-sizing:border-box;}body{font:1rem/1.5 var(--font-family);margin:0;position:relative;overflow-wrap:break-word;overflow-wrap:anywhere;font-feature-settings:"kern","liga";background-color:var(--main-background-color);color:var(--main-color);}h1{font-size:1.5rem;}h2{font-size:1.375rem;}h3{font-size:1.25rem;}h1,h2,h3,h4,h5,h6{font-weight:500;}h1,h2,h3,h4{margin:25px 0 15px 0;padding-bottom:6px;}.docblock h3,.docblock h4,h5,h6{margin:15px 0 5px 0;}.docblock>h2:first-child,.docblock>h3:first-child,.docblock>h4:first-child,.docblock>h5:first-child,.docblock>h6:first-child{margin-top:0;}.main-heading h1{margin:0;padding:0;grid-area:main-heading-h1;overflow-wrap:break-word;overflow-wrap:anywhere;}.main-heading{position:relative;display:grid;grid-template-areas:"main-heading-breadcrumbs main-heading-breadcrumbs" "main-heading-h1 main-heading-toolbar" "main-heading-sub-heading main-heading-toolbar";grid-template-columns:minmax(105px,1fr) minmax(0,max-content);grid-template-rows:minmax(25px,min-content) min-content min-content;padding-bottom:6px;margin-bottom:15px;}.rustdoc-breadcrumbs{grid-area:main-heading-breadcrumbs;line-height:1.25;padding-top:5px;position:relative;z-index:1;}.rustdoc-breadcrumbs a{padding:5px 0 7px;}.content h2,.top-doc .docblock>h3,.top-doc .docblock>h4{border-bottom:1px solid var(--headings-border-bottom-color);}h1,h2{line-height:1.25;padding-top:3px;padding-bottom:9px;}h3.code-header{font-size:1.125rem;}h4.code-header{font-size:1rem;}.code-header{font-weight:600;margin:0;padding:0;white-space:pre-wrap;}.structfield,.sub-variant-field{margin:0.6em 0;}#crate-search,h1,h2,h3,h4,h5,h6,.sidebar,.mobile-topbar,.search-input,.search-results .result-name,.item-table dt>a,.out-of-band,.sub-heading,span.since,a.src,rustdoc-toolbar,summary.hideme,.scraped-example-list,.rustdoc-breadcrumbs,ul.all-items{font-family:"Fira Sans",Arial,NanumBarunGothic,sans-serif;}#toggle-all-docs,a.anchor,.section-header a,#src-sidebar a,.rust a,.sidebar h2 a,.sidebar h3 a,.mobile-topbar h2 a,h1 a,.search-results a,.search-results li,.stab,.result-name i{color:var(--main-color);}span.enum,a.enum,span.struct,a.struct,span.union,a.union,span.primitive,a.primitive,span.type,a.type,span.foreigntype,a.foreigntype{color:var(--type-link-color);}span.trait,a.trait,span.traitalias,a.traitalias{color:var(--trait-link-color);}span.associatedtype,a.associatedtype,span.constant,a.constant,span.static,a.static{color:var(--assoc-item-link-color);}span.fn,a.fn,span.method,a.method,span.tymethod,a.tymethod{color:var(--function-link-color);}span.attr,a.attr,span.derive,a.derive,span.macro,a.macro{color:var(--macro-link-color);}span.mod,a.mod{color:var(--mod-link-color);}span.keyword,a.keyword{color:var(--keyword-link-color);}a{color:var(--link-color);text-decoration:none;}ol,ul{padding-left:24px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.625em;}p,.docblock>.warning{margin:0 0 .75em 0;}p:last-child,.docblock>.warning:last-child{margin:0;}button{padding:1px 6px;cursor:pointer;}button#toggle-all-docs{padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.rustdoc{display:flex;flex-direction:row;flex-wrap:nowrap;}main{position:relative;flex-grow:1;padding:10px 15px 40px 45px;min-width:0;}.src main{padding:15px;}.width-limiter{max-width:960px;margin-right:auto;}details:not(.toggle) summary{margin-bottom:.6em;}code,pre,.code-header,.type-signature{font-family:var(--font-family-code);}.docblock code,.item-table dd code{border-radius:3px;padding:0 0.125em;}.docblock pre code,.item-table dd pre code{padding:0;}pre{padding:14px;line-height:1.5;}pre.item-decl{overflow-x:auto;}.item-decl .type-contents-toggle{contain:initial;}.src .content pre{padding:20px;padding-left:16px;}img{max-width:100%;}.logo-container{line-height:0;display:block;}.rust-logo{filter:var(--rust-logo-filter);}.sidebar{font-size:0.875rem;flex:0 0 var(--desktop-sidebar-width);width:var(--desktop-sidebar-width);overflow-y:scroll;overscroll-behavior:contain;position:sticky;height:100vh;top:0;left:0;z-index:var(--desktop-sidebar-z-index);border-right:solid 1px var(--sidebar-border-color);}.rustdoc.src .sidebar{flex-basis:50px;width:50px;overflow-x:hidden;overflow-y:hidden;}.hide-sidebar .sidebar,.hide-sidebar .sidebar-resizer{display:none;}.sidebar-resizer{touch-action:none;width:9px;cursor:ew-resize;z-index:calc(var(--desktop-sidebar-z-index) + 1);position:fixed;height:100%;left:var(--desktop-sidebar-width);display:flex;align-items:center;justify-content:flex-start;color:var(--right-side-color);}.sidebar-resizer::before{content:"";border-right:dotted 2px currentColor;width:2px;height:12px;}.sidebar-resizer::after{content:"";border-right:dotted 2px currentColor;width:2px;height:16px;}.rustdoc.src .sidebar-resizer{left:49px;}.src-sidebar-expanded .src .sidebar-resizer{left:var(--src-sidebar-width);}.sidebar-resizing{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;}.sidebar-resizing *{cursor:ew-resize !important;}.sidebar-resizing .sidebar{position:fixed;border-right:solid 2px var(--sidebar-resizer-active);}.sidebar-resizing>body{padding-left:var(--resizing-sidebar-width);}.sidebar-resizer:hover,.sidebar-resizer:active,.sidebar-resizer:focus,.sidebar-resizer.active{width:10px;margin:0;left:calc(var(--desktop-sidebar-width) - 1px);border-left:solid 1px var(--sidebar-resizer-hover);color:var(--sidebar-resizer-hover);}.src-sidebar-expanded .rustdoc.src .sidebar-resizer:hover,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:active,.src-sidebar-expanded .rustdoc.src .sidebar-resizer:focus,.src-sidebar-expanded .rustdoc.src .sidebar-resizer.active{left:calc(var(--src-sidebar-width) - 1px);}@media (pointer:coarse){.sidebar-resizer{display:none !important;}.sidebar{border-right:none;}}.sidebar-resizer.active{padding:0 140px;width:calc(140px + 140px + 9px + 2px);margin-left:-140px;border-left:none;color:var(--sidebar-resizer-active);}.sidebar,.mobile-topbar,.sidebar-menu-toggle,#src-sidebar{background-color:var(--sidebar-background-color);}.src .sidebar>*{visibility:hidden;}.src-sidebar-expanded .src .sidebar{overflow-y:auto;flex-basis:var(--src-sidebar-width);width:var(--src-sidebar-width);}.src-sidebar-expanded .src .sidebar>*{visibility:visible;}#all-types{margin-top:1em;}*{scrollbar-width:initial;scrollbar-color:var(--scrollbar-color);}.sidebar{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color);}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;background-color:var(--scrollbar-track-background-color);}.sidebar::-webkit-scrollbar-track{background-color:var(--scrollbar-track-background-color);}::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb-background-color);}.hidden{display:none !important;}.logo-container>img{height:48px;width:48px;}ul.block,.block li,.block ul{padding:0;margin:0;list-style:none;}.block ul a{padding-left:1rem;}.sidebar-elems a,.sidebar>h2 a{display:block;padding:0.25rem;margin-right:0.25rem;border-left:solid var(--sidebar-elems-left-padding) transparent;margin-left:calc(-0.25rem - var(--sidebar-elems-left-padding));background-clip:border-box;}.hide-toc #rustdoc-toc,.hide-toc .in-crate{display:none;}.hide-modnav #rustdoc-modnav{display:none;}.sidebar h2{text-wrap:balance;overflow-wrap:anywhere;padding:0;margin:0.7rem 0;}.sidebar h3{text-wrap:balance;overflow-wrap:anywhere;font-size:1.125rem;padding:0;margin:0;}.sidebar-elems,.sidebar>.version,.sidebar>h2{padding-left:var(--sidebar-elems-left-padding);}.sidebar a{color:var(--sidebar-link-color);}.sidebar .current,.sidebar .current a,.sidebar-crate a.logo-container:hover+h2 a,.sidebar a:hover:not(.logo-container){background-color:var(--sidebar-current-link-background-color);}.sidebar-elems .block{margin-bottom:2em;}.sidebar-elems .block li a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}.sidebar-crate{display:flex;align-items:center;justify-content:center;margin:14px 32px 1rem;row-gap:10px;column-gap:32px;flex-wrap:wrap;}.sidebar-crate h2{flex-grow:1;margin:0 -8px;align-self:start;}.sidebar-crate .logo-container{margin:0 calc(-16px - var(--sidebar-elems-left-padding));padding:0 var(--sidebar-elems-left-padding);text-align:center;}.sidebar-crate .logo-container img{margin-top:-16px;border-top:solid 16px transparent;box-sizing:content-box;position:relative;background-clip:border-box;z-index:1;}.sidebar-crate h2 a{display:block;border-left:solid var(--sidebar-elems-left-padding) transparent;background-clip:border-box;margin:0 calc(-24px + 0.25rem) 0 calc(-0.2rem - var(--sidebar-elems-left-padding));padding:calc((16px - 0.57rem ) / 2 ) 0.25rem;padding-left:0.2rem;}.sidebar-crate h2 .version{display:block;font-weight:normal;font-size:1rem;overflow-wrap:break-word;}.sidebar-crate+.version{margin-top:-1rem;margin-bottom:1rem;}.mobile-topbar{display:none;}.rustdoc .example-wrap{display:flex;position:relative;margin-bottom:10px;}.rustdoc .example-wrap>pre,.rustdoc .scraped-example .src-line-numbers,.rustdoc .scraped-example .src-line-numbers>pre{border-radius:6px;}.rustdoc .scraped-example{position:relative;}.rustdoc .example-wrap:last-child{margin-bottom:0px;}.rustdoc .example-wrap pre{margin:0;flex-grow:1;}.scraped-example:not(.expanded) .example-wrap{max-height:calc(1.5em * 5 + 10px);}.more-scraped-examples .scraped-example:not(.expanded) .example-wrap{max-height:calc(1.5em * 10 + 10px);}.rustdoc:not(.src) .scraped-example:not(.expanded) .src-line-numbers,.rustdoc:not(.src) .scraped-example:not(.expanded) .src-line-numbers>pre,.rustdoc:not(.src) .scraped-example:not(.expanded) pre.rust{padding-bottom:0;overflow:auto hidden;}.rustdoc:not(.src) .scraped-example .src-line-numbers{padding-top:0;}.rustdoc:not(.src) .scraped-example.expanded .src-line-numbers{padding-bottom:0;}.rustdoc:not(.src) .example-wrap pre{overflow:auto;}.example-wrap code{position:relative;}.example-wrap pre code span{display:inline;}.example-wrap.digits-1{--example-wrap-digits-count:1ch;}.example-wrap.digits-2{--example-wrap-digits-count:2ch;}.example-wrap.digits-3{--example-wrap-digits-count:3ch;}.example-wrap.digits-4{--example-wrap-digits-count:4ch;}.example-wrap.digits-5{--example-wrap-digits-count:5ch;}.example-wrap.digits-6{--example-wrap-digits-count:6ch;}.example-wrap.digits-7{--example-wrap-digits-count:7ch;}.example-wrap.digits-8{--example-wrap-digits-count:8ch;}.example-wrap.digits-9{--example-wrap-digits-count:9ch;}.example-wrap [data-nosnippet]{width:calc(var(--example-wrap-digits-count) + var(--line-number-padding) * 2);}.example-wrap pre>code{padding-left:calc(var(--example-wrap-digits-count) + var(--line-number-padding) * 2 + var(--line-number-right-margin));}.example-wrap [data-nosnippet]{color:var(--src-line-numbers-span-color);text-align:right;display:inline-block;margin-right:var(--line-number-right-margin);-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;padding:0 var(--line-number-padding);position:absolute;left:0;}.example-wrap .line-highlighted[data-nosnippet]{background-color:var(--src-line-number-highlighted-background-color);}.example-wrap pre>code{position:relative;display:block;}:root.word-wrap-source-code .example-wrap pre>code{word-break:break-all;white-space:pre-wrap;}:root.word-wrap-source-code .example-wrap pre>code *{word-break:break-all;}.example-wrap [data-nosnippet]:target{border-right:none;}.example-wrap.hide-lines [data-nosnippet]{display:none;}.search-loading{text-align:center;}.item-table dd{overflow-wrap:break-word;overflow-wrap:anywhere;}.docblock :not(pre)>code,.item-table dd code{white-space:pre-wrap;}.top-doc .docblock h2{font-size:1.375rem;}.top-doc .docblock h3{font-size:1.25rem;}.top-doc .docblock h4,.top-doc .docblock h5{font-size:1.125rem;}.top-doc .docblock h6{font-size:1rem;}.docblock h5{font-size:1rem;}.docblock h6{font-size:0.875rem;}.docblock{margin-left:var(--docblock-indent);position:relative;}.docblock>:not(.more-examples-toggle):not(.example-wrap){max-width:100%;overflow-x:auto;}.sub-heading{font-size:1rem;flex-grow:0;grid-area:main-heading-sub-heading;line-height:1.25;padding-bottom:4px;}.main-heading rustdoc-toolbar,.main-heading .out-of-band{grid-area:main-heading-toolbar;}rustdoc-toolbar{display:flex;flex-direction:row;flex-wrap:nowrap;min-height:60px;}.docblock code,.item-table dd code,pre,.rustdoc.src .example-wrap,.example-wrap .src-line-numbers{background-color:var(--code-block-background-color);border-radius:var(--code-block-border-radius);text-decoration:inherit;}#main-content{position:relative;}.docblock table{margin:.5em 0;border-collapse:collapse;}.docblock table td,.docblock table th{padding:.5em;border:1px solid var(--border-color);}.docblock table tbody tr:nth-child(2n){background:var(--table-alt-row-background-color);}.docblock .stab,.item-table dd .stab,.docblock p code{display:inline-block;}.docblock li{margin-bottom:.4em;}.docblock li p:not(:last-child){margin-bottom:.3em;}div.where{white-space:pre-wrap;font-size:0.875rem;}.item-info{display:block;margin-left:var(--docblock-indent);}.impl-items>.item-info{margin-left:calc(var(--docblock-indent) + var(--impl-items-indent));}.item-info code{font-size:0.875rem;}#main-content>.item-info{margin-left:0;}nav.sub{flex-grow:1;flex-flow:row nowrap;margin:4px 0 0 0;display:flex;align-items:center;}.search-form{position:relative;display:flex;height:34px;flex-grow:1;margin-bottom:4px;}.src nav.sub{margin:0 0 -10px 0;}.section-header{display:block;position:relative;}.section-header:hover>.anchor,.impl:hover>.anchor,.trait-impl:hover>.anchor,.variant:hover>.anchor{display:initial;}.anchor{display:none;position:absolute;left:-0.5em;background:none !important;}.anchor.field{left:-5px;}.section-header>.anchor{left:-15px;padding-right:8px;}h2.section-header>.anchor{padding-right:6px;}a.doc-anchor{color:var(--main-color);display:none;position:absolute;left:-17px;padding-right:10px;padding-left:3px;}*:hover>.doc-anchor{display:block;}.top-doc>.docblock>*:first-child>.doc-anchor{display:none !important;}.main-heading a:hover,.example-wrap .rust a:hover:not([data-nosnippet]),.all-items a:hover,.docblock a:not(.scrape-help):not(.tooltip):hover:not(.doc-anchor),.item-table dd a:not(.scrape-help):not(.tooltip):hover,.item-info a{text-decoration:underline;}.crate.block li.current a{font-weight:500;}table,.item-table{overflow-wrap:break-word;}.item-table{padding:0;margin:0;width:100%;}.item-table>dt{padding-right:1.25rem;}.item-table>dd{margin-inline-start:0;margin-left:0;}.search-results-title{margin-top:0;white-space:nowrap;display:flex;align-items:baseline;}.search-results-title+.sub-heading{color:var(--main-color);display:flex;align-items:baseline;white-space:nowrap;}#crate-search-div{position:relative;min-width:0;}#crate-search{padding:0 23px 0 4px;max-width:100%;text-overflow:ellipsis;border:1px solid var(--border-color);border-radius:4px;outline:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;background-color:var(--main-background-color);color:inherit;line-height:1.5;font-weight:500;}#crate-search:hover,#crate-search:focus{border-color:var(--crate-search-hover-border);}#crate-search-div::after{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0;content:"";background-repeat:no-repeat;background-size:20px;background-position:calc(100% - 2px) 56%;background-image:url('data:image/svg+xml, \ + ');filter:var(--crate-search-div-filter);}#crate-search-div:hover::after,#crate-search-div:focus-within::after{filter:var(--crate-search-div-hover-filter);}#crate-search>option{font-size:1rem;}.search-input{-webkit-appearance:none;outline:none;border:1px solid var(--border-color);border-radius:2px;padding:8px;font-size:1rem;flex-grow:1;background-color:var(--button-background-color);color:var(--search-color);}.search-input:focus{border-color:var(--search-input-focused-border-color);}.search-results{display:none;}.search-results.active{display:block;margin:0;padding:0;}.search-results>a{display:grid;grid-template-areas:"search-result-name search-result-desc" "search-result-type-signature search-result-type-signature";grid-template-columns:.6fr .4fr;margin-left:2px;margin-right:2px;border-bottom:1px solid var(--search-result-border-color);column-gap:1em;}.search-results>a>div.desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;grid-area:search-result-desc;}.search-results a:hover,.search-results a:focus{background-color:var(--search-result-link-focus-background-color);}.search-results .result-name{display:flex;align-items:center;justify-content:start;grid-area:search-result-name;}.search-results .result-name .alias{color:var(--search-results-alias-color);}.search-results .result-name .grey{color:var(--search-results-grey-color);}.search-results .result-name .typename{color:var(--search-results-grey-color);font-size:0.875rem;width:var(--search-typename-width);}.search-results .result-name .path{word-break:break-all;max-width:calc(100% - var(--search-typename-width));display:inline-block;}.search-results .result-name .path>*{display:inline;}.search-results .type-signature{grid-area:search-result-type-signature;white-space:pre-wrap;}.popover{position:absolute;top:100%;right:0;z-index:calc(var(--desktop-sidebar-z-index) + 1);margin-top:7px;border-radius:3px;border:1px solid var(--border-color);background-color:var(--main-background-color);color:var(--main-color);--popover-arrow-offset:11px;}.popover::before{content:'';position:absolute;right:var(--popover-arrow-offset);border:solid var(--border-color);border-width:1px 1px 0 0;background-color:var(--main-background-color);padding:4px;transform:rotate(-45deg);top:-5px;}.setting-line{margin:1.2em 0.6em;}.setting-radio input,.setting-check input{margin-right:0.3em;height:1.2rem;width:1.2rem;border:2px solid var(--settings-input-border-color);outline:none;-webkit-appearance:none;cursor:pointer;}.setting-radio input{border-radius:50%;}.setting-radio span,.setting-check span{padding-bottom:1px;}.setting-radio{margin-top:0.1em;margin-bottom:0.1em;min-width:3.8em;padding:0.3em;display:inline-flex;align-items:center;cursor:pointer;}.setting-radio+.setting-radio{margin-left:0.5em;}.setting-check{margin-right:20px;display:flex;align-items:center;cursor:pointer;}.setting-check input{flex-shrink:0;}.setting-radio input:checked{box-shadow:inset 0 0 0 3px var(--main-background-color);background-color:var(--settings-input-color);}.setting-check input:checked{background-color:var(--settings-input-color);border-width:1px;content:url('data:image/svg+xml,\ + \ + ');}.setting-radio input:focus,.setting-check input:focus{box-shadow:0 0 1px 1px var(--settings-input-color);}.setting-radio input:checked:focus{box-shadow:inset 0 0 0 3px var(--main-background-color),0 0 2px 2px var(--settings-input-color);}.setting-radio input:hover,.setting-check input:hover{border-color:var(--settings-input-color) !important;}#settings.popover{--popover-arrow-offset:202px;top:calc(100% - 16px);}#help.popover{max-width:600px;--popover-arrow-offset:118px;top:calc(100% - 16px);}#help dt{float:left;clear:left;margin-right:0.5rem;}#help dd{margin-bottom:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:1.125rem;padding:0 0.5rem;text-wrap-style:balance;}#help span.top{margin:10px 0;border-bottom:1px solid var(--border-color);padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid var(--border-color);}.side-by-side{display:flex;margin-bottom:20px;}.side-by-side>div{width:50%;padding:0 20px 0 17px;}.item-info .stab{display:block;padding:3px;margin-bottom:5px;}.item-table dt .stab{margin-left:0.3125em;}.stab{padding:0 2px;font-size:0.875rem;font-weight:normal;color:var(--main-color);background-color:var(--stab-background-color);width:fit-content;white-space:pre-wrap;border-radius:3px;display:inline;vertical-align:baseline;}.stab.portability>code{background:none;color:var(--stab-code-color);}.stab .emoji,.item-info .stab::before{font-size:1.25rem;}.stab .emoji{margin-right:0.3rem;}.item-info .stab::before{content:"\0";width:0;display:inline-block;color:transparent;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.since{font-weight:normal;font-size:initial;}.rightside{padding-left:12px;float:right;}.rightside:not(a),.out-of-band,.sub-heading,rustdoc-toolbar{color:var(--right-side-color);}pre.rust{tab-size:4;-moz-tab-size:4;}pre.rust .kw{color:var(--code-highlight-kw-color);}pre.rust .kw-2{color:var(--code-highlight-kw-2-color);}pre.rust .lifetime{color:var(--code-highlight-lifetime-color);}pre.rust .prelude-ty{color:var(--code-highlight-prelude-color);}pre.rust .prelude-val{color:var(--code-highlight-prelude-val-color);}pre.rust .string{color:var(--code-highlight-string-color);}pre.rust .number{color:var(--code-highlight-number-color);}pre.rust .bool-val{color:var(--code-highlight-literal-color);}pre.rust .self{color:var(--code-highlight-self-color);}pre.rust .attr{color:var(--code-highlight-attribute-color);}pre.rust .macro,pre.rust .macro-nonterminal{color:var(--code-highlight-macro-color);}pre.rust .question-mark{font-weight:bold;color:var(--code-highlight-question-mark-color);}pre.rust .comment{color:var(--code-highlight-comment-color);}pre.rust .doccomment{color:var(--code-highlight-doc-comment-color);}.rustdoc.src .example-wrap pre.rust a:not([data-nosnippet]){background:var(--codeblock-link-background);}.example-wrap.compile_fail,.example-wrap.should_panic{border-left:2px solid var(--codeblock-error-color);}.ignore.example-wrap{border-left:2px solid var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover,.example-wrap.should_panic:hover{border-left:2px solid var(--codeblock-error-hover-color);}.example-wrap.ignore:hover{border-left:2px solid var(--codeblock-ignore-hover-color);}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip{color:var(--codeblock-error-color);}.example-wrap.ignore .tooltip{color:var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover .tooltip,.example-wrap.should_panic:hover .tooltip{color:var(--codeblock-error-hover-color);}.example-wrap.ignore:hover .tooltip{color:var(--codeblock-ignore-hover-color);}.example-wrap .tooltip{position:absolute;display:block;left:-25px;top:5px;margin:0;line-height:1;}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip,.example-wrap.ignore .tooltip{font-weight:bold;font-size:1.25rem;}.content .docblock .warning{border-left:2px solid var(--warning-border-color);padding:14px;position:relative;overflow-x:visible !important;}.content .docblock .warning::before{color:var(--warning-border-color);content:"ⓘ";position:absolute;left:-25px;top:5px;font-weight:bold;font-size:1.25rem;}.top-doc>.docblock>.warning:first-child::before{top:20px;}.example-wrap>a.test-arrow,.example-wrap .button-holder{visibility:hidden;position:absolute;top:4px;right:4px;z-index:1;}a.test-arrow{height:var(--copy-path-height);padding:6px 4px 0 11px;}a.test-arrow::before{content:url('data:image/svg+xml,');}.example-wrap .button-holder{display:flex;}@media not (pointer:coarse){.example-wrap:hover>a.test-arrow,.example-wrap:hover>.button-holder{visibility:visible;}}.example-wrap .button-holder.keep-visible{visibility:visible;}.example-wrap .button-holder>*{background:var(--main-background-color);cursor:pointer;border-radius:var(--button-border-radius);height:var(--copy-path-height);width:var(--copy-path-width);border:0;color:var(--code-example-button-color);}.example-wrap .button-holder>*:hover{color:var(--code-example-button-hover-color);}.example-wrap .button-holder>*:not(:first-child){margin-left:var(--button-left-margin);}.example-wrap .button-holder .copy-button{padding:2px 0 0 4px;}.example-wrap .button-holder .copy-button::before,.example-wrap .test-arrow::before,.example-wrap .button-holder .prev::before,.example-wrap .button-holder .next::before,.example-wrap .button-holder .expand::before{filter:var(--copy-path-img-filter);}.example-wrap .button-holder .copy-button::before{content:var(--clipboard-image);}.example-wrap .button-holder .copy-button:hover::before,.example-wrap .test-arrow:hover::before{filter:var(--copy-path-img-hover-filter);}.example-wrap .button-holder .copy-button.clicked::before{content:var(--checkmark-image);padding-right:5px;}.example-wrap .button-holder .prev,.example-wrap .button-holder .next,.example-wrap .button-holder .expand{line-height:0px;}.example-wrap .button-holder .prev::before{content:var(--prev-arrow-image);}.example-wrap .button-holder .next::before{content:var(--next-arrow-image);}.example-wrap .button-holder .expand::before{content:var(--expand-arrow-image);}.example-wrap .button-holder .expand.collapse::before{content:var(--collapse-arrow-image);}.code-attribute{font-weight:300;color:var(--code-attribute-color);}.item-spacer{width:100%;height:12px;display:block;}.main-heading span.since::before{content:"Since ";}.sub-variant h4{font-size:1rem;font-weight:400;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}@keyframes targetfadein{from{background-color:var(--main-background-color);}10%{background-color:var(--target-border-color);}to{background-color:var(--target-background-color);}}:target:not([data-nosnippet]){background-color:var(--target-background-color);border-right:3px solid var(--target-border-color);}.code-header a.tooltip{color:inherit;margin-right:15px;position:relative;}.code-header a.tooltip:hover{color:var(--link-color);}a.tooltip:hover::after{position:absolute;top:calc(100% - 10px);left:-15px;right:-15px;height:20px;content:"\00a0";}@media not (prefers-reduced-motion){:target{animation:0.65s cubic-bezier(0,0,0.1,1.0) 0.1s targetfadein;}.fade-out{opacity:0;transition:opacity 0.45s cubic-bezier(0,0,0.1,1.0);}}.popover.tooltip .content{margin:0.25em 0.5em;}.popover.tooltip .content pre,.popover.tooltip .content code{background:transparent;margin:0;padding:0;font-size:1.25rem;white-space:pre-wrap;}.popover.tooltip .content>h3:first-child{margin:0 0 5px 0;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#search-tabs{margin-top:0.25rem;display:flex;flex-direction:row;gap:1px;margin-bottom:4px;}#search-tabs button{text-align:center;font-size:1.125rem;border:0;border-top:2px solid;flex:1;line-height:1.5;color:inherit;}#search-tabs button:not(.selected){background-color:var(--search-tab-button-not-selected-background);border-top-color:var(--search-tab-button-not-selected-border-top-color);}#search-tabs button:hover,#search-tabs button.selected{background-color:var(--search-tab-button-selected-background);border-top-color:var(--search-tab-button-selected-border-top-color);}#search-tabs .count{font-size:1rem;font-variant-numeric:tabular-nums;color:var(--search-tab-title-count-color);}#search .error code{border-radius:3px;background-color:var(--search-error-code-background-color);}.search-corrections{font-weight:normal;}#src-sidebar{width:100%;overflow:auto;}#src-sidebar div.files>a:hover,details.dir-entry summary:hover,#src-sidebar div.files>a:focus,details.dir-entry summary:focus{background-color:var(--src-sidebar-background-hover);}#src-sidebar div.files>a.selected{background-color:var(--src-sidebar-background-selected);}.src-sidebar-title{position:sticky;top:0;display:flex;padding:8px 8px 0 48px;margin-bottom:7px;background:var(--sidebar-background-color);border-bottom:1px solid var(--border-color);}#settings-menu,#help-button,button#toggle-all-docs{margin-left:var(--button-left-margin);display:flex;line-height:1.25;min-width:14px;}#sidebar-button{display:none;line-height:0;}.hide-sidebar #sidebar-button,.src #sidebar-button{display:flex;margin-right:4px;position:fixed;height:34px;width:34px;}.hide-sidebar #sidebar-button{left:6px;background-color:var(--main-background-color);z-index:1;}.src #sidebar-button{left:8px;z-index:calc(var(--desktop-sidebar-z-index) + 1);}.hide-sidebar .src #sidebar-button{position:static;}#settings-menu>a,#help-button>a,#sidebar-button>a,button#toggle-all-docs{display:flex;align-items:center;justify-content:center;flex-direction:column;}#settings-menu>a,#help-button>a,button#toggle-all-docs{border:1px solid transparent;border-radius:var(--button-border-radius);color:var(--main-color);}#settings-menu>a,#help-button>a,button#toggle-all-docs{width:80px;border-radius:var(--toolbar-button-border-radius);}#settings-menu>a,#help-button>a{min-width:0;}#sidebar-button>a{background-color:var(--sidebar-background-color);width:33px;}#sidebar-button>a:hover,#sidebar-button>a:focus-visible{background-color:var(--main-background-color);}#settings-menu>a:hover,#settings-menu>a:focus-visible,#help-button>a:hover,#help-button>a:focus-visible,button#toggle-all-docs:hover,button#toggle-all-docs:focus-visible{border-color:var(--settings-button-border-focus);text-decoration:none;}#settings-menu>a::before{content:url('data:image/svg+xml,\ + ');width:18px;height:18px;filter:var(--settings-menu-filter);}button#toggle-all-docs::before{content:url('data:image/svg+xml,\ + ');width:18px;height:18px;filter:var(--settings-menu-filter);}button#toggle-all-docs.will-expand::before{content:url('data:image/svg+xml,\ + ');}#help-button>a::before{content:url('data:image/svg+xml,\ + \ + ?');width:18px;height:18px;filter:var(--settings-menu-filter);}button#toggle-all-docs::before,#help-button>a::before,#settings-menu>a::before{filter:var(--settings-menu-filter);margin:8px;}@media not (pointer:coarse){button#toggle-all-docs:hover::before,#help-button>a:hover::before,#settings-menu>a:hover::before{filter:var(--settings-menu-hover-filter);}}button[disabled]#toggle-all-docs{opacity:0.25;border:solid 1px var(--main-background-color);background-size:cover;}button[disabled]#toggle-all-docs:hover{border:solid 1px var(--main-background-color);cursor:not-allowed;}rustdoc-toolbar span.label{font-size:1rem;flex-grow:1;padding-bottom:4px;}#sidebar-button>a::before{content:url('data:image/svg+xml,\ + \ + \ + ');width:22px;height:22px;}#copy-path{color:var(--copy-path-button-color);background:var(--main-background-color);height:var(--copy-path-height);width:var(--copy-path-width);margin-left:10px;padding:0;padding-left:2px;border:0;font-size:0;}#copy-path::before{filter:var(--copy-path-img-filter);content:var(--clipboard-image);}#copy-path:hover::before{filter:var(--copy-path-img-hover-filter);}#copy-path.clicked::before{content:var(--checkmark-image);}@keyframes rotating{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}#settings-menu.rotate>a img{animation:rotating 2s linear infinite;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px var(--border-color);border-radius:3px;color:var(--kbd-color);background-color:var(--kbd-background);box-shadow:inset 0 -1px 0 var(--kbd-box-shadow-color);}ul.all-items>li{list-style:none;}details.dir-entry{padding-left:4px;}details.dir-entry>summary{margin:0 0 0 -4px;padding:0 0 0 4px;cursor:pointer;}details.dir-entry div.folders,details.dir-entry div.files{padding-left:23px;}details.dir-entry a{display:block;}details.toggle{contain:layout;position:relative;}details.big-toggle{contain:inline-size;}details.toggle>summary.hideme{cursor:pointer;font-size:1rem;}details.toggle>summary{list-style:none;outline:none;}details.toggle>summary::-webkit-details-marker,details.toggle>summary::marker{display:none;}details.toggle>summary.hideme>span{margin-left:9px;}details.toggle>summary::before{background:url('data:image/svg+xml,\ + ');content:"";cursor:pointer;width:16px;height:16px;display:inline-block;vertical-align:middle;opacity:.5;filter:var(--toggle-filter);}details.toggle>summary.hideme>span,.more-examples-toggle summary,.more-examples-toggle .hide-more{color:var(--toggles-color);}details.toggle>summary::after{content:"Expand";overflow:hidden;width:0;height:0;position:absolute;}details.toggle>summary.hideme::after{content:"";}details.toggle>summary:focus::before,details.toggle>summary:hover::before{opacity:1;}details.toggle>summary:focus-visible::before{outline:1px dotted #000;outline-offset:1px;}details.non-exhaustive{margin-bottom:8px;}details.toggle>summary.hideme::before{position:relative;}details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;top:4px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>.methods>details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;}.impl-items>*:not(.item-info),.implementors-toggle>.docblock,#main-content>.methods>:not(.item-info),.impl>.item-info,.impl>.docblock,.impl+.docblock{margin-left:var(--impl-items-indent);}details.big-toggle>summary:not(.hideme)::before{left:-34px;top:9px;}details.toggle[open] >summary.hideme{position:absolute;}details.toggle[open] >summary.hideme>span{display:none;}details.toggle[open] >summary::before{background:url('data:image/svg+xml,\ + ');}details.toggle[open] >summary::after{content:"Collapse";}details.toggle:not([open])>summary .docblock{max-height:calc(1.5em + 0.75em);overflow-y:hidden;}details.toggle:not([open])>summary .docblock>:first-child{max-width:100%;overflow:hidden;width:fit-content;white-space:nowrap;position:relative;padding-right:1em;}details.toggle:not([open])>summary .docblock>:first-child::after{content:"…";position:absolute;right:0;top:0;bottom:0;z-index:1;background-color:var(--main-background-color);font:1rem/1.5 "Source Serif 4",NanumBarunGothic,serif;padding-left:0.2em;}details.toggle:not([open])>summary .docblock>div:first-child::after{padding-top:calc(1.5em + 0.75em - 1.2rem);}details.toggle>summary .docblock{margin-top:0.75em;}.docblock summary>*{display:inline-block;}.docblock>.example-wrap:first-child .tooltip{margin-top:16px;}.src #sidebar-button>a::before,.sidebar-menu-toggle::before{content:var(--hamburger-image);opacity:0.75;filter:var(--mobile-sidebar-menu-filter);}.sidebar-menu-toggle:hover::before,.sidebar-menu-toggle:active::before,.sidebar-menu-toggle:focus::before{opacity:1;}@media (max-width:850px){#search-tabs .count{display:block;}.side-by-side{flex-direction:column-reverse;}.side-by-side>div{width:auto;}}@media (max-width:700px){:root{--impl-items-indent:0.7em;}*[id]{scroll-margin-top:45px;}#copy-path{width:0;visibility:hidden;}rustdoc-toolbar span.label{display:none;}#settings-menu>a,#help-button>a,button#toggle-all-docs{width:33px;}#settings.popover{--popover-arrow-offset:86px;}#help.popover{--popover-arrow-offset:48px;}.rustdoc{display:block;}main{padding-left:15px;padding-top:0px;}.sidebar .logo-container,.sidebar .location,.sidebar-resizer{display:none;}.sidebar{position:fixed;top:45px;left:-1000px;z-index:11;height:calc(100vh - 45px);border-right:none;width:100%;}.sidebar-elems .block li a{white-space:wrap;}.src main,.rustdoc.src .sidebar{top:0;padding:0;height:100vh;border:0;}.src .search-form{margin-left:40px;}.src .main-heading{margin-left:8px;}.hide-sidebar .search-form{margin-left:32px;}.hide-sidebar .src .search-form{margin-left:0;}.sidebar.shown,.src-sidebar-expanded .src .sidebar,.rustdoc:not(.src) .sidebar:focus-within{left:0;}.mobile-topbar h2{padding-bottom:0;margin:auto 0.5em auto auto;overflow:hidden;font-size:24px;white-space:nowrap;text-overflow:ellipsis;}.mobile-topbar .logo-container>img{max-width:35px;max-height:35px;margin:5px 0 5px 20px;}.mobile-topbar{display:flex;flex-direction:row;position:sticky;z-index:10;font-size:2rem;height:45px;width:100%;left:0;top:0;}.hide-sidebar .mobile-topbar{display:none;}.sidebar-menu-toggle{width:45px;border:none;line-height:0;}.hide-sidebar .sidebar-menu-toggle{display:none;}.sidebar-elems{margin-top:1em;}.anchor{display:none !important;}#main-content>details.toggle>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}#sidebar-button>a::before{content:url('data:image/svg+xml,\ + \ + \ + ');width:22px;height:22px;}.sidebar-menu-toggle:hover{background:var(--main-background-color);}.search-results>a,.search-results>a>div{display:block;}.search-results>a{padding:5px 0px;}.search-results>a>div.desc,.item-table dd{padding-left:2em;}.search-results .result-name{display:block;}.search-results .result-name .typename{width:initial;margin-right:0;}.search-results .result-name .typename,.search-results .result-name .path{display:inline;}.src-sidebar-expanded .src .sidebar{position:fixed;max-width:100vw;width:100vw;}.src .src-sidebar-title{padding-top:0;}details.implementors-toggle:not(.top-doc)>summary{margin-left:10px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>.methods>details.toggle>summary:not(.hideme)::before{left:-20px;}summary>.item-info{margin-left:10px;}.impl-items>.item-info{margin-left:calc(var(--impl-items-indent) + 10px);}.src nav.sub{margin:0 0 -25px 0;padding:var(--nav-sub-mobile-padding);}html:not(.src-sidebar-expanded) .src #sidebar-button>a{background-color:var(--main-background-color);}html:not(.src-sidebar-expanded) .src #sidebar-button>a:hover,html:not(.src-sidebar-expanded) .src #sidebar-button>a:focus-visible{background-color:var(--sidebar-background-color);}}@media (min-width:701px){.scraped-example-title{position:absolute;z-index:10;background:var(--main-background-color);bottom:8px;right:5px;padding:2px 4px;box-shadow:0 0 4px var(--main-background-color);}.item-table:not(.reexports){display:grid;grid-template-columns:33% 67%;}.item-table>dt,.item-table>dd{overflow-wrap:anywhere;}.item-table>dt{grid-column-start:1;}.item-table>dd{grid-column-start:2;}}@media print{:root{--docblock-indent:0;}nav.sidebar,nav.sub,.out-of-band,a.src,#copy-path,details.toggle[open] >summary::before,details.toggle>summary::before,details.toggle.top-doc>summary{display:none;}main{padding:10px;}}@media (max-width:464px){:root{--docblock-indent:12px;}.docblock code{overflow-wrap:break-word;overflow-wrap:anywhere;}nav.sub{flex-direction:column;}.search-form{align-self:stretch;}}.variant,.implementors-toggle>summary,.impl,#implementors-list>.docblock,.impl-items>section,.impl-items>.toggle>summary,.methods>section,.methods>.toggle>summary{margin-bottom:0.75em;}.variants>.docblock,.implementors-toggle>.docblock,.impl-items>.toggle[open]:not(:last-child),.methods>.toggle[open]:not(:last-child),.implementors-toggle[open]:not(:last-child){margin-bottom:2em;}#trait-implementations-list .impl-items>.toggle:not(:last-child),#synthetic-implementations-list .impl-items>.toggle:not(:last-child),#blanket-implementations-list .impl-items>.toggle:not(:last-child){margin-bottom:1em;}.scraped-example-list .scrape-help{margin-left:10px;padding:0 4px;font-weight:normal;font-size:12px;position:relative;bottom:1px;border:1px solid var(--scrape-example-help-border-color);border-radius:50px;color:var(--scrape-example-help-color);}.scraped-example-list .scrape-help:hover{border-color:var(--scrape-example-help-hover-border-color);color:var(--scrape-example-help-hover-color);}.scraped-example:not(.expanded) .example-wrap::before,.scraped-example:not(.expanded) .example-wrap::after{content:" ";width:100%;height:5px;position:absolute;z-index:1;}.scraped-example:not(.expanded) .example-wrap::before{top:0;background:linear-gradient(to bottom,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded) .example-wrap::after{bottom:0;background:linear-gradient(to top,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded){width:100%;overflow-y:hidden;margin-bottom:0;}.scraped-example:not(.expanded){overflow-x:hidden;}.scraped-example .rust span.highlight{background:var(--scrape-example-code-line-highlight);}.scraped-example .rust span.highlight.focus{background:var(--scrape-example-code-line-highlight-focus);}.more-examples-toggle{max-width:calc(100% + 25px);margin-top:10px;margin-left:-25px;}.more-examples-toggle .hide-more{margin-left:25px;cursor:pointer;}.more-scraped-examples{margin-left:25px;position:relative;}.toggle-line{position:absolute;top:5px;bottom:0;right:calc(100% + 10px);padding:0 4px;cursor:pointer;}.toggle-line-inner{min-width:2px;height:100%;background:var(--scrape-example-toggle-line-background);}.toggle-line:hover .toggle-line-inner{background:var(--scrape-example-toggle-line-hover-background);}.more-scraped-examples .scraped-example,.example-links{margin-top:20px;}.more-scraped-examples .scraped-example:first-child{margin-top:5px;}.example-links ul{margin-bottom:0;}:root[data-theme="light"],:root:not([data-theme]){--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#f5f5f5;--sidebar-background-color-hover:#e0e0e0;--sidebar-border-color:#ddd;--code-block-background-color:#f5f5f5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--mobile-sidebar-menu-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#595959;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#fff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--src-sidebar-background-selected:#fff;--src-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#f5f5f5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);--sidebar-resizer-hover:hsl(207,90%,66%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="dark"]{--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--sidebar-border-color:#999;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--code-example-button-color:#7f7f7f;--code-example-button-hover-color:#a5a5a5;--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--settings-menu-filter:invert(50%);--settings-menu-hover-filter:invert(65%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--src-sidebar-background-selected:#333;--src-sidebar-background-hover:#444;--table-alt-row-background-color:#2a2a2a;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);--sidebar-resizer-hover:hsl(207,30%,54%);--sidebar-resizer-active:hsl(207,90%,54%);}:root[data-theme="ayu"]{--main-background-color:#0f1419;--main-color:#c5c5c5;--settings-input-color:#ffb454;--settings-input-border-color:#999;--settings-button-color:#fff;--settings-button-border-focus:#e0e0e0;--sidebar-background-color:#14191f;--sidebar-background-color-hover:rgba(70,70,70,0.33);--sidebar-border-color:#5c6773;--code-block-background-color:#191f26;--scrollbar-track-background-color:transparent;--scrollbar-thumb-background-color:#5c6773;--scrollbar-color:#5c6773 #24292f;--headings-border-bottom-color:#5c6773;--border-color:#5c6773;--button-background-color:#141920;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--mobile-sidebar-menu-filter:invert(100%);--search-input-focused-border-color:#5c6773;--copy-path-button-color:#fff;--copy-path-img-filter:invert(70%);--copy-path-img-hover-filter:invert(100%);--code-example-button-color:#b2b2b2;--code-example-button-hover-color:#fff;--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--warning-border-color:#ff8e00;--type-link-color:#ffa0a5;--trait-link-color:#39afd7;--assoc-item-link-color:#39afd7;--function-link-color:#fdd687;--macro-link-color:#a37acc;--keyword-link-color:#39afd7;--mod-link-color:#39afd7;--link-color:#39afd7;--sidebar-link-color:#53b1db;--sidebar-current-link-background-color:transparent;--search-result-link-focus-background-color:#3c3c3c;--search-result-border-color:#aaa3;--search-color:#fff;--search-error-code-background-color:#4f4c4c;--search-results-alias-color:#c5c5c5;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:none;--search-tab-button-not-selected-background:transparent !important;--search-tab-button-selected-border-top-color:none;--search-tab-button-selected-background:#141920 !important;--settings-menu-filter:invert(70%);--settings-menu-hover-filter:invert(100%);--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ff7733;--code-highlight-kw-2-color:#ff7733;--code-highlight-lifetime-color:#ff7733;--code-highlight-prelude-color:#69f2df;--code-highlight-prelude-val-color:#ff7733;--code-highlight-number-color:#b8cc52;--code-highlight-string-color:#b8cc52;--code-highlight-literal-color:#ff7733;--code-highlight-attribute-color:#e6e1cf;--code-highlight-self-color:#36a3d9;--code-highlight-macro-color:#a37acc;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#788797;--code-highlight-doc-comment-color:#a1ac88;--src-line-numbers-span-color:#5c6773;--src-line-number-highlighted-background-color:rgba(255,236,164,0.06);--target-background-color:rgba(255,236,164,0.06);--target-border-color:rgba(255,180,76,0.85);--kbd-color:#c5c5c5;--kbd-background:#314559;--kbd-box-shadow-color:#5c6773;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg) brightness(94%) contrast(94%);--crate-search-div-hover-filter:invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg) brightness(113%) contrast(76%);--crate-search-hover-border:#e0e0e0;--src-sidebar-background-selected:#14191f;--src-sidebar-background-hover:#14191f;--table-alt-row-background-color:#191f26;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:#5b3b01;--scrape-example-code-line-highlight-focus:#7c4b0f;--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(15,20,25,1);--scrape-example-code-wrapper-background-end:rgba(15,20,25,0);--sidebar-resizer-hover:hsl(34,50%,33%);--sidebar-resizer-active:hsl(34,100%,66%);}:root[data-theme="ayu"] h1,:root[data-theme="ayu"] h2,:root[data-theme="ayu"] h3,:root[data-theme="ayu"] h4,:where(:root[data-theme="ayu"]) h1 a,:root[data-theme="ayu"] .sidebar h2 a,:root[data-theme="ayu"] .sidebar h3 a{color:#fff;}:root[data-theme="ayu"] .docblock code{color:#ffb454;}:root[data-theme="ayu"] .docblock a>code{color:#39AFD7 !important;}:root[data-theme="ayu"] .code-header,:root[data-theme="ayu"] .docblock pre>code,:root[data-theme="ayu"] pre,:root[data-theme="ayu"] pre>code,:root[data-theme="ayu"] .item-info code,:root[data-theme="ayu"] .rustdoc.source .example-wrap{color:#e6e1cf;}:root[data-theme="ayu"] .sidebar .current,:root[data-theme="ayu"] .sidebar .current a,:root[data-theme="ayu"] .sidebar a:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:hover,:root[data-theme="ayu"] details.dir-entry summary:hover,:root[data-theme="ayu"] #src-sidebar div.files>a:focus,:root[data-theme="ayu"] details.dir-entry summary:focus,:root[data-theme="ayu"] #src-sidebar div.files>a.selected{color:#ffb44c;}:root[data-theme="ayu"] .sidebar-elems .location{color:#ff7733;}:root[data-theme="ayu"] a[data-nosnippet].line-highlighted{color:#708090;padding-right:7px;border-right:1px solid #ffb44c;}:root[data-theme="ayu"] .search-results a:hover,:root[data-theme="ayu"] .search-results a:focus{color:#fff !important;background-color:#3c3c3c;}:root[data-theme="ayu"] .search-results a{color:#0096cf;}:root[data-theme="ayu"] .search-results a div.desc{color:#c5c5c5;}:root[data-theme="ayu"] .result-name .primitive>i,:root[data-theme="ayu"] .result-name .keyword>i{color:#788797;}:root[data-theme="ayu"] #search-tabs>button.selected{border-bottom:1px solid #ffb44c !important;border-top:none;}:root[data-theme="ayu"] #search-tabs>button:not(.selected){border:none;background-color:transparent !important;}:root[data-theme="ayu"] #search-tabs>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}:root[data-theme="ayu"] #settings-menu>a img,:root[data-theme="ayu"] #sidebar-button>a::before{filter:invert(100);} \ No newline at end of file diff --git a/compiler-docs/static.files/scrape-examples-5e967b76.js b/compiler-docs/static.files/scrape-examples-5e967b76.js new file mode 100644 index 0000000000..40dfe842fd --- /dev/null +++ b/compiler-docs/static.files/scrape-examples-5e967b76.js @@ -0,0 +1 @@ +"use strict";(function(){const DEFAULT_MAX_LINES=5;const HIDDEN_MAX_LINES=10;function scrollToLoc(elt,loc,isHidden){const lines=elt.querySelectorAll("[data-nosnippet]");let scrollOffset;const maxLines=isHidden?HIDDEN_MAX_LINES:DEFAULT_MAX_LINES;if(loc[1]-loc[0]>maxLines){const line=Math.max(0,loc[0]-1);scrollOffset=lines[line].offsetTop;}else{const halfHeight=elt.offsetHeight/2;const offsetTop=lines[loc[0]].offsetTop;const lastLine=lines[loc[1]];const offsetBot=lastLine.offsetTop+lastLine.offsetHeight;const offsetMid=(offsetTop+offsetBot)/2;scrollOffset=offsetMid-halfHeight;}lines[0].parentElement.scrollTo(0,scrollOffset);elt.querySelector(".rust").scrollTo(0,scrollOffset);}function createScrapeButton(parent,className,content){const button=document.createElement("button");button.className=className;button.title=content;parent.insertBefore(button,parent.firstChild);return button;}window.updateScrapedExample=(example,buttonHolder)=>{let locIndex=0;const highlights=Array.prototype.slice.call(example.querySelectorAll(".highlight"));const link=example.querySelector(".scraped-example-title a");let expandButton=null;if(!example.classList.contains("expanded")){expandButton=createScrapeButton(buttonHolder,"expand","Show all");}const isHidden=example.parentElement.classList.contains("more-scraped-examples");const locs=example.locs;if(locs.length>1){const next=createScrapeButton(buttonHolder,"next","Next usage");const prev=createScrapeButton(buttonHolder,"prev","Previous usage");const onChangeLoc=changeIndex=>{removeClass(highlights[locIndex],"focus");changeIndex();scrollToLoc(example,locs[locIndex][0],isHidden);addClass(highlights[locIndex],"focus");const url=locs[locIndex][1];const title=locs[locIndex][2];link.href=url;link.innerHTML=title;};prev.addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex-1+locs.length)%locs.length;});});next.addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex+1)%locs.length;});});}if(expandButton){expandButton.addEventListener("click",()=>{if(hasClass(example,"expanded")){removeClass(example,"expanded");removeClass(expandButton,"collapse");expandButton.title="Show all";scrollToLoc(example,locs[0][0],isHidden);}else{addClass(example,"expanded");addClass(expandButton,"collapse");expandButton.title="Show single example";}});}};function setupLoc(example,isHidden){example.locs=JSON.parse(example.attributes.getNamedItem("data-locs").textContent);scrollToLoc(example,example.locs[0][0],isHidden);}const firstExamples=document.querySelectorAll(".scraped-example-list > .scraped-example");onEachLazy(firstExamples,el=>setupLoc(el,false));onEachLazy(document.querySelectorAll(".more-examples-toggle"),toggle=>{onEachLazy(toggle.querySelectorAll(".toggle-line, .hide-more"),button=>{button.addEventListener("click",()=>{toggle.open=false;});});const moreExamples=toggle.querySelectorAll(".scraped-example");toggle.querySelector("summary").addEventListener("click",()=>{setTimeout(()=>{onEachLazy(moreExamples,el=>setupLoc(el,true));});},{once:true});});})(); \ No newline at end of file diff --git a/compiler-docs/static.files/search-fa3e91e5.js b/compiler-docs/static.files/search-fa3e91e5.js new file mode 100644 index 0000000000..d4818b4fe6 --- /dev/null +++ b/compiler-docs/static.files/search-fa3e91e5.js @@ -0,0 +1,6 @@ +"use strict";if(!Array.prototype.toSpliced){Array.prototype.toSpliced=function(){const me=this.slice();Array.prototype.splice.apply(me,arguments);return me;};}function onEachBtwn(arr,func,funcBtwn){let skipped=true;for(const value of arr){if(!skipped){funcBtwn(value);}skipped=func(value);}}function undef2null(x){if(x!==undefined){return x;}return null;}const itemTypes=["keyword","primitive","mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","associatedtype","constant","associatedconstant","union","foreigntype","existential","attr","derive","traitalias","generic",];const TY_PRIMITIVE=itemTypes.indexOf("primitive");const TY_GENERIC=itemTypes.indexOf("generic");const TY_IMPORT=itemTypes.indexOf("import");const TY_TRAIT=itemTypes.indexOf("trait");const TY_FN=itemTypes.indexOf("fn");const TY_METHOD=itemTypes.indexOf("method");const TY_TYMETHOD=itemTypes.indexOf("tymethod");const ROOT_PATH=typeof window!=="undefined"?window.rootPath:"../";const UNBOXING_LIMIT=5;const REGEX_IDENT=/\p{ID_Start}\p{ID_Continue}*|_\p{ID_Continue}+/uy;const REGEX_INVALID_TYPE_FILTER=/[^a-z]/ui;const MAX_RESULTS=200;const NO_TYPE_FILTER=-1;const editDistanceState={current:[],prev:[],prevPrev:[],calculate:function calculate(a,b,limit){if(a.lengthlimit){return limit+1;}while(b.length>0&&b[0]===a[0]){a=a.substring(1);b=b.substring(1);}while(b.length>0&&b[b.length-1]===a[a.length-1]){a=a.substring(0,a.length-1);b=b.substring(0,b.length-1);}if(b.length===0){return minDist;}const aLength=a.length;const bLength=b.length;for(let i=0;i<=bLength;++i){this.current[i]=0;this.prev[i]=i;this.prevPrev[i]=Number.MAX_VALUE;}for(let i=1;i<=aLength;++i){this.current[0]=i;const aIdx=i-1;for(let j=1;j<=bLength;++j){const bIdx=j-1;const substitutionCost=a[aIdx]===b[bIdx]?0:1;this.current[j]=Math.min(this.prev[j]+1,this.current[j-1]+1,this.prev[j-1]+substitutionCost,);if((i>1)&&(j>1)&&(a[aIdx]===b[bIdx-1])&&(a[aIdx-1]===b[bIdx])){this.current[j]=Math.min(this.current[j],this.prevPrev[j-2]+1,);}}const prevPrevTmp=this.prevPrev;this.prevPrev=this.prev;this.prev=this.current;this.current=prevPrevTmp;}const distance=this.prev[bLength];return distance<=limit?distance:(limit+1);},};function editDistance(a,b,limit){return editDistanceState.calculate(a,b,limit);}function isEndCharacter(c){return"=,>-])".indexOf(c)!==-1;}function isFnLikeTy(ty){return ty===TY_FN||ty===TY_METHOD||ty===TY_TYMETHOD;}function isSeparatorCharacter(c){return c===","||c==="=";}function isReturnArrow(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="->";}function skipWhitespace(parserState){while(parserState.pos0){const c=parserState.userQuery[pos-1];if(c===lookingFor){return true;}else if(c!==" "){break;}pos-=1;}return false;}function isLastElemGeneric(elems,parserState){return(elems.length>0&&elems[elems.length-1].generics.length>0)||prevIs(parserState,">");}function getFilteredNextElem(query,parserState,elems,isInGenerics){const start=parserState.pos;if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){throw["Expected type filter before ",":"];}getNextElem(query,parserState,elems,isInGenerics);if(parserState.userQuery[parserState.pos]===":"&&!isPathStart(parserState)){if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",];}if(elems.length===0){throw["Expected type filter before ",":"];}else if(query.literalSearch){throw["Cannot use quotes on type filter"];}const typeFilterElem=elems.pop();checkExtraTypeFilterCharacters(start,parserState);parserState.typeFilter=typeFilterElem.normalizedPathLast;parserState.pos+=1;parserState.totalElems-=1;query.literalSearch=false;getNextElem(query,parserState,elems,isInGenerics);}}function getItemsBefore(query,parserState,elems,endChar){let foundStopChar=true;let foundSeparator=false;const oldTypeFilter=parserState.typeFilter;parserState.typeFilter=null;const oldIsInBinding=parserState.isInBinding;parserState.isInBinding=null;let hofParameters=null;let extra="";if(endChar===">"){extra="<";}else if(endChar==="]"){extra="[";}else if(endChar===")"){extra="(";}else if(endChar===""){extra="->";}else{extra=endChar;}while(parserState.pos"," after ","="];}hofParameters=[...elems];elems.length=0;parserState.pos+=2;foundStopChar=true;foundSeparator=false;continue;}else if(c===" "){parserState.pos+=1;continue;}else if(isSeparatorCharacter(c)){parserState.pos+=1;foundStopChar=true;foundSeparator=true;continue;}else if(c===":"&&isPathStart(parserState)){throw["Unexpected ","::",": paths cannot start with ","::"];}else if(isEndCharacter(c)){throw["Unexpected ",c," after ",extra];}if(!foundStopChar){let extra=[];if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"];}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"];}if(endChar!==""){throw["Expected ",",",", ","=",", or ",endChar,...extra,", found ",c,];}throw["Expected ",","," or ","=",...extra,", found ",c,];}const posBefore=parserState.pos;getFilteredNextElem(query,parserState,elems,endChar!=="");if(endChar!==""&&parserState.pos>=parserState.length){throw["Unclosed ",extra];}if(posBefore===parserState.pos){parserState.pos+=1;}foundStopChar=false;}if(parserState.pos>=parserState.length&&endChar!==""){throw["Unclosed ",extra];}parserState.pos+=1;if(hofParameters){foundSeparator=false;if([...elems,...hofParameters].some(x=>x.bindingName)||parserState.isInBinding){throw["Unexpected ","="," within ","->"];}const hofElem=makePrimitiveElement("->",{generics:hofParameters,bindings:new Map([["output",[...elems]]]),typeFilter:null,});elems.length=0;elems[0]=hofElem;}parserState.typeFilter=oldTypeFilter;parserState.isInBinding=oldIsInBinding;return{foundSeparator};}function getNextElem(query,parserState,elems,isInGenerics){const generics=[];skipWhitespace(parserState);let start=parserState.pos;let end;if("[(".indexOf(parserState.userQuery[parserState.pos])!==-1){let endChar=")";let name="()";let friendlyName="tuple";if(parserState.userQuery[parserState.pos]==="["){endChar="]";name="[]";friendlyName="slice";}parserState.pos+=1;const{foundSeparator}=getItemsBefore(query,parserState,generics,endChar);const typeFilter=parserState.typeFilter;const bindingName=parserState.isInBinding;parserState.typeFilter=null;parserState.isInBinding=null;for(const gen of generics){if(gen.bindingName!==null){throw["Type parameter ","=",` cannot be within ${friendlyName} `,name];}}if(name==="()"&&!foundSeparator&&generics.length===1&&typeFilter===null){elems.push(generics[0]);}else if(name==="()"&&generics.length===1&&generics[0].name==="->"){generics[0].typeFilter=typeFilter;elems.push(generics[0]);}else{if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive ",name," and ",typeFilter," both specified",];}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1;}elems.push(makePrimitiveElement(name,{bindingName,generics}));}}else if(parserState.userQuery[parserState.pos]==="&"){if(parserState.typeFilter!==null&&parserState.typeFilter!=="primitive"){throw["Invalid search type: primitive ","&"," and ",parserState.typeFilter," both specified",];}parserState.typeFilter=null;parserState.pos+=1;let c=parserState.userQuery[parserState.pos];while(c===" "&&parserState.pos=end){throw["Found generics without a path"];}parserState.pos+=1;getItemsBefore(query,parserState,generics,">");}else if(parserState.pos=end){throw["Found generics without a path"];}if(parserState.isInBinding){throw["Unexpected ","("," after ","="];}parserState.pos+=1;const typeFilter=parserState.typeFilter;parserState.typeFilter=null;getItemsBefore(query,parserState,generics,")");skipWhitespace(parserState);if(isReturnArrow(parserState)){parserState.pos+=2;skipWhitespace(parserState);getFilteredNextElem(query,parserState,generics,isInGenerics);generics[generics.length-1].bindingName=makePrimitiveElement("output");}else{generics.push(makePrimitiveElement(null,{bindingName:makePrimitiveElement("output"),typeFilter:null,}));}parserState.typeFilter=typeFilter;}if(isStringElem){skipWhitespace(parserState);}if(start>=end&&generics.length===0){return;}if(parserState.userQuery[parserState.pos]==="="){if(parserState.isInBinding){throw["Cannot write ","="," twice in a binding"];}if(!isInGenerics){throw["Type parameter ","="," must be within generics list"];}const name=parserState.userQuery.slice(start,end).trim();if(name==="!"){throw["Type parameter ","="," key cannot be ","!"," never type"];}if(name.includes("!")){throw["Type parameter ","="," key cannot be ","!"," macro"];}if(name.includes("::")){throw["Type parameter ","="," key cannot contain ","::"," path"];}if(name.includes(":")){throw["Type parameter ","="," key cannot contain ",":"," type"];}parserState.isInBinding={name,generics};}else{elems.push(createQueryElement(query,parserState,parserState.userQuery.slice(start,end),generics,isInGenerics,),);}}}function checkExtraTypeFilterCharacters(start,parserState){const query=parserState.userQuery.slice(start,parserState.pos).trim();const match=query.match(REGEX_INVALID_TYPE_FILTER);if(match){throw["Unexpected ",match[0]," in type filter (before ",":",")",];}}function createQueryElement(query,parserState,name,generics,isInGenerics){const path=name.trim();if(path.length===0&&generics.length===0){throw["Unexpected ",parserState.userQuery[parserState.pos]];}if(query.literalSearch&&parserState.totalElems-parserState.genericsElems>0){throw["Cannot have more than one element if you use quotes"];}const typeFilter=parserState.typeFilter;parserState.typeFilter=null;if(name.trim()==="!"){if(typeFilter!==null&&typeFilter!=="primitive"){throw["Invalid search type: primitive never type ","!"," and ",typeFilter," both specified",];}if(generics.length!==0){throw["Never type ","!"," does not accept generic parameters",];}const bindingName=parserState.isInBinding;parserState.isInBinding=null;return makePrimitiveElement("never",{bindingName});}const quadcolon=/::\s*::/.exec(path);if(path.startsWith("::")){throw["Paths cannot start with ","::"];}else if(quadcolon!==null){throw["Unexpected ",quadcolon[0]];}const pathSegments=path.split(/(?:::\s*)|(?:\s+(?:::\s*)?)/).map(x=>x.toLowerCase());if(pathSegments.length===0||(pathSegments.length===1&&pathSegments[0]==="")){if(generics.length>0||prevIs(parserState,">")){throw["Found generics without a path"];}else{throw["Unexpected ",parserState.userQuery[parserState.pos]];}}for(const[i,pathSegment]of pathSegments.entries()){if(pathSegment==="!"){if(i!==0){throw["Never type ","!"," is not associated item"];}pathSegments[i]="never";}}parserState.totalElems+=1;if(isInGenerics){parserState.genericsElems+=1;}const bindingName=parserState.isInBinding;parserState.isInBinding=null;const bindings=new Map();const pathLast=pathSegments[pathSegments.length-1];return{name:name.trim(),id:null,fullPath:pathSegments,pathWithoutLast:pathSegments.slice(0,pathSegments.length-1),pathLast,normalizedPathLast:pathLast.replace(/_/g,""),generics:generics.filter(gen=>{if(gen.bindingName!==null&&gen.bindingName.name!==null){if(gen.name!==null){gen.bindingName.generics.unshift(gen);}bindings.set(gen.bindingName.name.toLowerCase().replace(/_/g,""),gen.bindingName.generics,);return false;}return true;}),bindings,typeFilter,bindingName,};}function makePrimitiveElement(name,extra){return Object.assign({name,id:null,fullPath:[name],pathWithoutLast:[],pathLast:name,normalizedPathLast:name,generics:[],bindings:new Map(),typeFilter:"primitive",bindingName:null,},extra);}function getStringElem(query,parserState,isInGenerics){if(isInGenerics){throw["Unexpected ","\""," in generics"];}else if(query.literalSearch){throw["Cannot have more than one literal search element"];}else if(parserState.totalElems-parserState.genericsElems>0){throw["Cannot use literal search when there is more than one element"];}parserState.pos+=1;const start=parserState.pos;const end=getIdentEndPosition(parserState);if(parserState.pos>=parserState.length){throw["Unclosed ","\""];}else if(parserState.userQuery[end]!=="\""){throw["Unexpected ",parserState.userQuery[end]," in a string element"];}else if(start===end){throw["Cannot have empty string element"];}parserState.pos+=1;query.literalSearch=true;}function getIdentEndPosition(parserState){let afterIdent=consumeIdent(parserState);let end=parserState.pos;let macroExclamation=-1;while(parserState.pos0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]," (not a valid identifier)"];}else{throw["Unexpected ",c," (not a valid identifier)"];}parserState.pos+=1;afterIdent=consumeIdent(parserState);end=parserState.pos;}if(macroExclamation!==-1){if(parserState.typeFilter===null){parserState.typeFilter="macro";}else if(parserState.typeFilter!=="macro"){throw["Invalid search type: macro ","!"," and ",parserState.typeFilter," both specified",];}end=macroExclamation;}return end;}function isSpecialStartCharacter(c){return"<\"".indexOf(c)!==-1;}function isPathStart(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="::";}function consumeIdent(parserState){REGEX_IDENT.lastIndex=parserState.pos;const match=parserState.userQuery.match(REGEX_IDENT);if(match){parserState.pos+=match[0].length;return true;}return false;}function isPathSeparator(c){return c===":"||c===" ";}class VlqHexDecoder{constructor(string,cons){this.string=string;this.cons=cons;this.offset=0;this.backrefQueue=[];}decodeList(){let c=this.string.charCodeAt(this.offset);const ret=[];while(c!==125){ret.push(this.decode());c=this.string.charCodeAt(this.offset);}this.offset+=1;return ret;}decode(){let n=0;let c=this.string.charCodeAt(this.offset);if(c===123){this.offset+=1;return this.decodeList();}while(c<96){n=(n<<4)|(c&0xF);this.offset+=1;c=this.string.charCodeAt(this.offset);}n=(n<<4)|(c&0xF);const[sign,value]=[n&1,n>>1];this.offset+=1;return sign?-value:value;}next(){const c=this.string.charCodeAt(this.offset);if(c>=48&&c<64){this.offset+=1;return this.backrefQueue[c-48];}if(c===96){this.offset+=1;return this.cons(0);}const result=this.cons(this.decode());this.backrefQueue.unshift(result);if(this.backrefQueue.length>16){this.backrefQueue.pop();}return result;}}class RoaringBitmap{constructor(str){const strdecoded=atob(str);const u8array=new Uint8Array(strdecoded.length);for(let j=0;j=4){offsets=[];for(let j=0;j>3]&(1<<(j&0x7))){const runcount=(u8array[i]|(u8array[i+1]<<8));i+=2;this.containers.push(new RoaringBitmapRun(runcount,u8array.slice(i,i+(runcount*4)),));i+=runcount*4;}else if(this.cardinalities[j]>=4096){this.containers.push(new RoaringBitmapBits(u8array.slice(i,i+8192)));i+=8192;}else{const end=this.cardinalities[j]*2;this.containers.push(new RoaringBitmapArray(this.cardinalities[j],u8array.slice(i,i+end),));i+=end;}}}contains(keyvalue){const key=keyvalue>>16;const value=keyvalue&0xFFFF;let left=0;let right=this.keys.length-1;while(left<=right){const mid=Math.floor((left+right)/2);const x=this.keys[mid];if(xkey){right=mid-1;}else{return this.containers[mid].contains(value);}}return false;}}class RoaringBitmapRun{constructor(runcount,array){this.runcount=runcount;this.array=array;}contains(value){let left=0;let right=this.runcount-1;while(left<=right){const mid=Math.floor((left+right)/2);const i=mid*4;const start=this.array[i]|(this.array[i+1]<<8);const lenm1=this.array[i+2]|(this.array[i+3]<<8);if((start+lenm1)value){right=mid-1;}else{return true;}}return false;}}class RoaringBitmapArray{constructor(cardinality,array){this.cardinality=cardinality;this.array=array;}contains(value){let left=0;let right=this.cardinality-1;while(left<=right){const mid=Math.floor((left+right)/2);const i=mid*2;const x=this.array[i]|(this.array[i+1]<<8);if(xvalue){right=mid-1;}else{return true;}}return false;}}class RoaringBitmapBits{constructor(array){this.array=array;}contains(value){return!!(this.array[value>>3]&(1<<(value&7)));}}class NameTrie{constructor(){this.children=[];this.matches=[];}insert(name,id,tailTable){this.insertSubstring(name,0,id,tailTable);}insertSubstring(name,substart,id,tailTable){const l=name.length;if(substart===l){this.matches.push(id);}else{const sb=name.charCodeAt(substart);let child;if(this.children[sb]!==undefined){child=this.children[sb];}else{child=new NameTrie();this.children[sb]=child;let sste;if(substart>=2){const tail=name.substring(substart-2,substart+1);const entry=tailTable.get(tail);if(entry!==undefined){sste=entry;}else{sste=[];tailTable.set(tail,sste);}sste.push(child);}}child.insertSubstring(name,substart+1,id,tailTable);}}search(name,tailTable){const results=new Set();this.searchSubstringPrefix(name,0,results);if(results.size=3){const levParams=name.length>=6?new Lev2TParametricDescription(name.length):new Lev1TParametricDescription(name.length);this.searchLev(name,0,levParams,results);const tail=name.substring(0,3);const list=tailTable.get(tail);if(list!==undefined){for(const entry of list){entry.searchSubstringPrefix(name,3,results);}}}return[...results];}searchSubstringPrefix(name,substart,results){const l=name.length;if(substart===l){for(const match of this.matches){results.add(match);}let unprocessedChildren=[];for(const child of this.children){if(child){unprocessedChildren.push(child);}}let nextSet=[];while(unprocessedChildren.length!==0){const next=unprocessedChildren.pop();for(const child of next.children){if(child){nextSet.push(child);}}for(const match of next.matches){results.add(match);}if(unprocessedChildren.length===0){const tmp=unprocessedChildren;unprocessedChildren=nextSet;nextSet=tmp;}}}else{const sb=name.charCodeAt(substart);if(this.children[sb]!==undefined){this.children[sb].searchSubstringPrefix(name,substart+1,results);}}}searchLev(name,substart,levParams,results){const stack=[[this,0]];const n=levParams.n;while(stack.length!==0){const[trie,levState]=stack.pop();for(const[charCode,child]of trie.children.entries()){if(!child){continue;}const levPos=levParams.getPosition(levState);const vector=levParams.getVector(name,charCode,levPos,Math.min(name.length,levPos+(2*n)+1),);const newLevState=levParams.transition(levState,levPos,vector,);if(newLevState>=0){stack.push([child,newLevState]);if(levParams.isAccept(newLevState)){for(const match of child.matches){results.add(match);}}}}}}}class DocSearch{constructor(rawSearchIndex,rootPath,searchState){this.searchIndexDeprecated=new Map();this.searchIndexEmptyDesc=new Map();this.functionTypeFingerprint=new Uint32Array(0);this.typeNameIdMap=new Map();this.assocTypeIdNameMap=new Map();this.ALIASES=new Map();this.FOUND_ALIASES=new Set();this.rootPath=rootPath;this.searchState=searchState;this.typeNameIdOfArray=this.buildTypeMapIndex("array");this.typeNameIdOfSlice=this.buildTypeMapIndex("slice");this.typeNameIdOfArrayOrSlice=this.buildTypeMapIndex("[]");this.typeNameIdOfTuple=this.buildTypeMapIndex("tuple");this.typeNameIdOfUnit=this.buildTypeMapIndex("unit");this.typeNameIdOfTupleOrUnit=this.buildTypeMapIndex("()");this.typeNameIdOfFn=this.buildTypeMapIndex("fn");this.typeNameIdOfFnMut=this.buildTypeMapIndex("fnmut");this.typeNameIdOfFnOnce=this.buildTypeMapIndex("fnonce");this.typeNameIdOfHof=this.buildTypeMapIndex("->");this.typeNameIdOfOutput=this.buildTypeMapIndex("output",true);this.typeNameIdOfReference=this.buildTypeMapIndex("reference");this.EMPTY_BINDINGS_MAP=new Map();this.EMPTY_GENERICS_ARRAY=[];this.TYPES_POOL=new Map();this.nameTrie=new NameTrie();this.tailTable=new Map();this.searchIndex=this.buildIndex(rawSearchIndex);}buildTypeMapIndex(name,isAssocType){if(name===""||name===null){return null;}const obj=this.typeNameIdMap.get(name);if(obj!==undefined){obj.assocOnly=!!(isAssocType&&obj.assocOnly);return obj.id;}else{const id=this.typeNameIdMap.size;this.typeNameIdMap.set(name,{id,assocOnly:!!isAssocType});return id;}}buildItemSearchTypeAll(types,paths,lowercasePaths){return types&&types.length>0?types.map(type=>this.buildItemSearchType(type,paths,lowercasePaths)):this.EMPTY_GENERICS_ARRAY;}buildItemSearchType(type,paths,lowercasePaths,isAssocType){const PATH_INDEX_DATA=0;const GENERICS_DATA=1;const BINDINGS_DATA=2;let pathIndex,generics,bindings;if(typeof type==="number"){pathIndex=type;generics=this.EMPTY_GENERICS_ARRAY;bindings=this.EMPTY_BINDINGS_MAP;}else{pathIndex=type[PATH_INDEX_DATA];generics=this.buildItemSearchTypeAll(type[GENERICS_DATA],paths,lowercasePaths,);if(type.length>BINDINGS_DATA&&type[BINDINGS_DATA].length>0){bindings=new Map(type[BINDINGS_DATA].map(binding=>{const[assocType,constraints]=binding;return[this.buildItemSearchType(assocType,paths,lowercasePaths,true).id,this.buildItemSearchTypeAll(constraints,paths,lowercasePaths),];}));}else{bindings=this.EMPTY_BINDINGS_MAP;}}let result;if(pathIndex<0){result={id:pathIndex,name:"",ty:TY_GENERIC,path:null,exactPath:null,generics,bindings,unboxFlag:true,};}else if(pathIndex===0){result={id:null,name:"",ty:null,path:null,exactPath:null,generics,bindings,unboxFlag:true,};}else{const item=lowercasePaths[pathIndex-1];const id=this.buildTypeMapIndex(item.name,isAssocType);if(isAssocType&&id!==null){this.assocTypeIdNameMap.set(id,paths[pathIndex-1].name);}result={id,name:paths[pathIndex-1].name,ty:item.ty,path:item.path,exactPath:item.exactPath,generics,bindings,unboxFlag:item.unboxFlag,};}const cr=this.TYPES_POOL.get(result.id);if(cr){if(cr.generics.length===result.generics.length&&cr.generics!==result.generics&&cr.generics.every((x,i)=>result.generics[i]===x)){result.generics=cr.generics;}if(cr.bindings.size===result.bindings.size&&cr.bindings!==result.bindings){let ok=true;for(const[k,v]of cr.bindings.entries()){const v2=result.bindings.get(v);if(!v2){ok=false;break;}if(v!==v2&&v.length===v2.length&&v.every((x,i)=>v2[i]===x)){result.bindings.set(k,v);}else if(v!==v2){ok=false;break;}}if(ok){result.bindings=cr.bindings;}}if(cr.ty===result.ty&&cr.path===result.path&&cr.bindings===result.bindings&&cr.generics===result.generics&&cr.ty===result.ty&&cr.name===result.name&&cr.unboxFlag===result.unboxFlag){return cr;}}this.TYPES_POOL.set(result.id,result);return result;}buildFunctionTypeFingerprint(type,output){let input=type.id;if(input===this.typeNameIdOfArray||input===this.typeNameIdOfSlice){input=this.typeNameIdOfArrayOrSlice;}if(input===this.typeNameIdOfTuple||input===this.typeNameIdOfUnit){input=this.typeNameIdOfTupleOrUnit;}if(input===this.typeNameIdOfFn||input===this.typeNameIdOfFnMut||input===this.typeNameIdOfFnOnce){input=this.typeNameIdOfHof;}const hashint1=k=>{k=(~~k+0x7ed55d16)+(k<<12);k=(k ^ 0xc761c23c)^(k>>>19);k=(~~k+0x165667b1)+(k<<5);k=(~~k+0xd3a2646c)^(k<<9);k=(~~k+0xfd7046c5)+(k<<3);return(k ^ 0xb55a4f09)^(k>>>16);};const hashint2=k=>{k=~k+(k<<15);k ^=k>>>12;k+=k<<2;k ^=k>>>4;k=Math.imul(k,2057);return k ^(k>>16);};if(input!==null){const h0a=hashint1(input);const h0b=hashint2(input);const h1a=~~(h0a+Math.imul(h0b,2));const h1b=~~(h0a+Math.imul(h0b,3));const h2a=~~(h0a+Math.imul(h0b,4));const h2b=~~(h0a+Math.imul(h0b,5));output[0]|=(1<<(h0a%32))|(1<<(h1b%32));output[1]|=(1<<(h1a%32))|(1<<(h2b%32));output[2]|=(1<<(h2a%32))|(1<<(h0b%32));output[3]+=1;}for(const g of type.generics){this.buildFunctionTypeFingerprint(g,output);}const fb={id:null,ty:0,generics:this.EMPTY_GENERICS_ARRAY,bindings:this.EMPTY_BINDINGS_MAP,};for(const[k,v]of type.bindings.entries()){fb.id=k;fb.generics=v;this.buildFunctionTypeFingerprint(fb,output);}}buildIndex(rawSearchIndex){const buildFunctionSearchTypeCallback=(paths,lowercasePaths)=>{const cb=functionSearchType=>{if(functionSearchType===0){return null;}const INPUTS_DATA=0;const OUTPUT_DATA=1;let inputs;let output;if(typeof functionSearchType[INPUTS_DATA]==="number"){inputs=[this.buildItemSearchType(functionSearchType[INPUTS_DATA],paths,lowercasePaths,),];}else{inputs=this.buildItemSearchTypeAll(functionSearchType[INPUTS_DATA],paths,lowercasePaths,);}if(functionSearchType.length>1){if(typeof functionSearchType[OUTPUT_DATA]==="number"){output=[this.buildItemSearchType(functionSearchType[OUTPUT_DATA],paths,lowercasePaths,),];}else{output=this.buildItemSearchTypeAll(functionSearchType[OUTPUT_DATA],paths,lowercasePaths,);}}else{output=[];}const where_clause=[];const l=functionSearchType.length;for(let i=2;i{const n=noop;return n;});let descShard={crate,shard:0,start:0,len:itemDescShardDecoder.next(),promise:null,resolve:null,};const descShardList=[descShard];this.searchIndexDeprecated.set(crate,new RoaringBitmap(crateCorpus.c));this.searchIndexEmptyDesc.set(crate,new RoaringBitmap(crateCorpus.e));let descIndex=0;let lastParamNames=[];let normalizedName=crate.indexOf("_")===-1?crate:crate.replace(/_/g,"");const crateRow={crate,ty:3,name:crate,path:"",descShard,descIndex,exactPath:"",desc:crateCorpus.doc,parent:undefined,type:null,paramNames:lastParamNames,id,word:crate,normalizedName,bitIndex:0,implDisambiguator:null,};this.nameTrie.insert(normalizedName,id,this.tailTable);id+=1;searchIndex.push(crateRow);currentIndex+=1;if(!this.searchIndexEmptyDesc.get(crate).contains(0)){descIndex+=1;}const itemTypes=crateCorpus.t;const itemNames=crateCorpus.n;const itemPaths=new Map(crateCorpus.q);const itemReexports=new Map(crateCorpus.r);const itemParentIdxDecoder=new VlqHexDecoder(crateCorpus.i,noop=>noop);const implDisambiguator=new Map(crateCorpus.b);const rawPaths=crateCorpus.p;const aliases=crateCorpus.a;const itemParamNames=new Map(crateCorpus.P);const lowercasePaths=[];const paths=[];const itemFunctionDecoder=new VlqHexDecoder(crateCorpus.f,buildFunctionSearchTypeCallback(paths,lowercasePaths),);let len=rawPaths.length;let lastPath=undef2null(itemPaths.get(0));for(let i=0;i{if(elem.length>idx&&elem[idx]!==undefined){const p=itemPaths.get(elem[idx]);if(p!==undefined){return p;}return if_not_found;}return if_null;};const path=elemPath(2,lastPath,null);const exactPath=elemPath(3,path,path);const unboxFlag=elem.length>4&&!!elem[4];lowercasePaths.push({ty,name:name.toLowerCase(),path,exactPath,unboxFlag});paths[i]={ty,name,path,exactPath,unboxFlag};}lastPath="";len=itemTypes.length;let lastName="";let lastWord="";for(let i=0;i=descShard.len&&!this.searchIndexEmptyDesc.get(crate).contains(bitIndex)){descShard={crate,shard:descShard.shard+1,start:descShard.start+descShard.len,len:itemDescShardDecoder.next(),promise:null,resolve:null,};descIndex=0;descShardList.push(descShard);}const name=itemNames[i]===""?lastName:itemNames[i];const word=itemNames[i]===""?lastWord:itemNames[i].toLowerCase();const pathU=itemPaths.get(i);const path=pathU!==undefined?pathU:lastPath;const paramNameString=itemParamNames.get(i);const paramNames=paramNameString!==undefined?paramNameString.split(","):lastParamNames;const type=itemFunctionDecoder.next();if(type!==null){if(type){const fp=this.functionTypeFingerprint.subarray(id*4,(id+1)*4);for(const t of type.inputs){this.buildFunctionTypeFingerprint(t,fp);}for(const t of type.output){this.buildFunctionTypeFingerprint(t,fp);}for(const w of type.where_clause){for(const t of w){this.buildFunctionTypeFingerprint(t,fp);}}}}const itemParentIdx=itemParentIdxDecoder.next();normalizedName=word.indexOf("_")===-1?word:word.replace(/_/g,"");const row={crate,ty:itemTypes.charCodeAt(i)-65,name,path,descShard,descIndex,exactPath:itemReexports.has(i)?itemPaths.get(itemReexports.get(i)):path,parent:itemParentIdx>0?paths[itemParentIdx-1]:undefined,type,paramNames,id,word,normalizedName,bitIndex,implDisambiguator:undef2null(implDisambiguator.get(i)),};this.nameTrie.insert(normalizedName,id,this.tailTable);id+=1;searchIndex.push(row);lastPath=row.path;lastParamNames=row.paramNames;if(!this.searchIndexEmptyDesc.get(crate).contains(bitIndex)){descIndex+=1;}lastName=name;lastWord=word;}if(aliases){allAliases.push([crate,aliases,currentIndex]);}currentIndex+=itemTypes.length;this.searchState.descShards.set(crate,descShardList);}for(const[crate,aliases,index]of allAliases){for(const[alias_name,alias_refs]of Object.entries(aliases)){if(!this.ALIASES.has(crate)){this.ALIASES.set(crate,new Map());}const word=alias_name.toLowerCase();const crate_alias_map=this.ALIASES.get(crate);if(!crate_alias_map.has(word)){crate_alias_map.set(word,[]);}const aliases_map=crate_alias_map.get(word);const normalizedName=word.indexOf("_")===-1?word:word.replace(/_/g,"");for(const alias of alias_refs){const originalIndex=alias+index;const original=searchIndex[originalIndex];const row={crate,name:alias_name,normalizedName,is_alias:true,ty:original.ty,type:original.type,paramNames:[],word,id,parent:undefined,original,path:"",implDisambiguator:original.implDisambiguator,descShard:original.descShard,descIndex:original.descIndex,bitIndex:original.bitIndex,};aliases_map.push(row);this.nameTrie.insert(normalizedName,id,this.tailTable);id+=1;searchIndex.push(row);}}}this.TYPES_POOL=new Map();return searchIndex;}static parseQuery(userQuery){function itemTypeFromName(typename){const index=itemTypes.findIndex(i=>i===typename);if(index<0){throw["Unknown type filter ",typename];}return index;}function convertTypeFilterOnElem(elem){if(typeof elem.typeFilter==="string"){let typeFilter=elem.typeFilter;if(typeFilter==="const"){typeFilter="constant";}elem.typeFilter=itemTypeFromName(typeFilter);}else{elem.typeFilter=NO_TYPE_FILTER;}for(const elem2 of elem.generics){convertTypeFilterOnElem(elem2);}for(const constraints of elem.bindings.values()){for(const constraint of constraints){convertTypeFilterOnElem(constraint);}}}function newParsedQuery(userQuery){return{userQuery,elems:[],returned:[],foundElems:0,totalElems:0,literalSearch:false,hasReturnArrow:false,error:null,correction:null,proposeCorrectionFrom:null,proposeCorrectionTo:null,typeFingerprint:new Uint32Array(4),};}function parseInput(query,parserState){let foundStopChar=true;while(parserState.pos"){if(isReturnArrow(parserState)){query.hasReturnArrow=true;break;}throw["Unexpected ",c," (did you mean ","->","?)"];}else if(parserState.pos>0){throw["Unexpected ",c," after ",parserState.userQuery[parserState.pos-1]];}throw["Unexpected ",c];}else if(c===" "){skipWhitespace(parserState);continue;}if(!foundStopChar){let extra=[];if(isLastElemGeneric(query.elems,parserState)){extra=[" after ",">"];}else if(prevIs(parserState,"\"")){throw["Cannot have more than one element if you use quotes"];}if(parserState.typeFilter!==null){throw["Expected ",","," or ","->",...extra,", found ",c,];}throw["Expected ",",",", ",":"," or ","->",...extra,", found ",c,];}const before=query.elems.length;getFilteredNextElem(query,parserState,query.elems,false);if(query.elems.length===before){parserState.pos+=1;}foundStopChar=false;}if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter ",parserState.typeFilter+":",")",];}while(parserState.postypeof elem==="string")){query.error=err;}else{throw err;}return query;}if(!query.literalSearch){query.literalSearch=parserState.totalElems>1;}query.foundElems=query.elems.length+query.returned.length;query.totalElems=parserState.totalElems;return query;}async execQuery(origParsedQuery,filterCrates,currentCrate){const results_others=new Map(),results_in_args=new Map(),results_returned=new Map();const parsedQuery=origParsedQuery;const queryLen=parsedQuery.elems.reduce((acc,next)=>acc+next.pathLast.length,0)+parsedQuery.returned.reduce((acc,next)=>acc+next.pathLast.length,0);const maxEditDistance=Math.floor(queryLen/3);this.FOUND_ALIASES.clear();const genericSymbols=new Map();const convertNameToId=(elem,isAssocType)=>{const loweredName=elem.pathLast.toLowerCase();if(this.typeNameIdMap.has(loweredName)&&(isAssocType||!this.typeNameIdMap.get(loweredName).assocOnly)){elem.id=this.typeNameIdMap.get(loweredName).id;}else if(!parsedQuery.literalSearch){let match=null;let matchDist=maxEditDistance+1;let matchName="";for(const[name,{id,assocOnly}]of this.typeNameIdMap){const dist=Math.min(editDistance(name,loweredName,maxEditDistance),editDistance(name,elem.normalizedPathLast,maxEditDistance),);if(dist<=matchDist&&dist<=maxEditDistance&&(isAssocType||!assocOnly)){if(dist===matchDist&&matchName>name){continue;}match=id;matchDist=dist;matchName=name;}}if(match!==null){parsedQuery.correction=matchName;}elem.id=match;}if((elem.id===null&&parsedQuery.totalElems>1&&elem.typeFilter===-1&&elem.generics.length===0&&elem.bindings.size===0)||elem.typeFilter===TY_GENERIC){const id=genericSymbols.get(elem.normalizedPathLast);if(id!==undefined){elem.id=id;}else{elem.id=-(genericSymbols.size+1);genericSymbols.set(elem.normalizedPathLast,elem.id);}if(elem.typeFilter===-1&&elem.normalizedPathLast.length>=3){const maxPartDistance=Math.floor(elem.normalizedPathLast.length/3);let matchDist=maxPartDistance+1;let matchName="";for(const name of this.typeNameIdMap.keys()){const dist=editDistance(name,elem.normalizedPathLast,maxPartDistance,);if(dist<=matchDist&&dist<=maxPartDistance){if(dist===matchDist&&matchName>name){continue;}matchDist=dist;matchName=name;}}if(matchName!==""){parsedQuery.proposeCorrectionFrom=elem.name;parsedQuery.proposeCorrectionTo=matchName;}}elem.typeFilter=TY_GENERIC;}if(elem.generics.length>0&&elem.typeFilter===TY_GENERIC){parsedQuery.error=["Generic type parameter ",elem.name," does not accept generic parameters",];}for(const elem2 of elem.generics){convertNameToId(elem2);}elem.bindings=new Map(Array.from(elem.bindings.entries()).map(entry=>{const[name,constraints]=entry;if(!this.typeNameIdMap.has(name)){parsedQuery.error=["Type parameter ",name," does not exist",];return[0,[]];}for(const elem2 of constraints){convertNameToId(elem2,false);}return[this.typeNameIdMap.get(name).id,constraints];}),);};for(const elem of parsedQuery.elems){convertNameToId(elem,false);this.buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint);}for(const elem of parsedQuery.returned){convertNameToId(elem,false);this.buildFunctionTypeFingerprint(elem,parsedQuery.typeFingerprint);}function createQueryResults(results_in_args,results_returned,results_others,parsedQuery){return{"in_args":results_in_args,"returned":results_returned,"others":results_others,"query":parsedQuery,};}const buildHrefAndPath=item=>{let displayPath;let href;if(item.is_alias){this.FOUND_ALIASES.add(item.word);item=item.original;}const type=itemTypes[item.ty];const name=item.name;let path=item.path;let exactPath=item.exactPath;if(type==="mod"){displayPath=path+"::";href=this.rootPath+path.replace(/::/g,"/")+"/"+name+"/index.html";}else if(type==="import"){displayPath=item.path+"::";href=this.rootPath+item.path.replace(/::/g,"/")+"/index.html#reexport."+name;}else if(type==="primitive"||type==="keyword"){displayPath="";exactPath="";href=this.rootPath+path.replace(/::/g,"/")+"/"+type+"."+name+".html";}else if(type==="externcrate"){displayPath="";href=this.rootPath+name+"/index.html";}else if(item.parent!==undefined){const myparent=item.parent;let anchor=type+"."+name;const parentType=itemTypes[myparent.ty];let pageType=parentType;let pageName=myparent.name;exactPath=`${myparent.exactPath}::${myparent.name}`;if(parentType==="primitive"){displayPath=myparent.name+"::";exactPath=myparent.name;}else if(type==="structfield"&&parentType==="variant"){const enumNameIdx=item.path.lastIndexOf("::");const enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName;}else{displayPath=path+"::"+myparent.name+"::";}if(item.implDisambiguator!==null){anchor=item.implDisambiguator+"/"+anchor;}href=this.rootPath+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html#"+anchor;}else{displayPath=item.path+"::";href=this.rootPath+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html";}return[displayPath,href,`${exactPath}::${name}`];};function pathSplitter(path){const tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6);}return tmp;}const transformResults=(results,typeInfo)=>{const duplicates=new Set();const out=[];for(const result of results){if(result.id!==-1){const res=buildHrefAndPath(this.searchIndex[result.id]);const obj=Object.assign({parent:result.parent,type:result.type,dist:result.dist,path_dist:result.path_dist,index:result.index,desc:result.desc,item:result.item,displayPath:pathSplitter(res[0]),fullPath:"",href:"",displayTypeSignature:null,},this.searchIndex[result.id]);obj.fullPath=res[2]+"|"+obj.ty;if(duplicates.has(obj.fullPath)){continue;}if(obj.ty===TY_IMPORT&&duplicates.has(res[2])){continue;}if(duplicates.has(res[2]+"|"+TY_IMPORT)){continue;}duplicates.add(obj.fullPath);duplicates.add(res[2]);if(typeInfo!==null){obj.displayTypeSignature=this.formatDisplayTypeSignature(obj,typeInfo);}obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break;}}}return out;};this.formatDisplayTypeSignature=async(obj,typeInfo)=>{const objType=obj.type;if(!objType){return{type:[],mappedNames:new Map(),whereClause:new Map()};}let fnInputs=null;let fnOutput=null;let mgens=null;if(typeInfo!=="elems"&&typeInfo!=="returned"){fnInputs=unifyFunctionTypes(objType.inputs,parsedQuery.elems,objType.where_clause,null,mgensScratch=>{fnOutput=unifyFunctionTypes(objType.output,parsedQuery.returned,objType.where_clause,mgensScratch,mgensOut=>{mgens=mgensOut;return true;},0,);return!!fnOutput;},0,);}else{const arr=typeInfo==="elems"?objType.inputs:objType.output;const highlighted=unifyFunctionTypes(arr,parsedQuery.elems,objType.where_clause,null,mgensOut=>{mgens=mgensOut;return true;},0,);if(typeInfo==="elems"){fnInputs=highlighted;}else{fnOutput=highlighted;}}if(!fnInputs){fnInputs=objType.inputs;}if(!fnOutput){fnOutput=objType.output;}const mappedNames=new Map();const whereClause=new Map();const fnParamNames=obj.paramNames||[];const queryParamNames=[];const remapQuery=queryElem=>{if(queryElem.id!==null&&queryElem.id<0){queryParamNames[-1-queryElem.id]=queryElem.name;}if(queryElem.generics.length>0){queryElem.generics.forEach(remapQuery);}if(queryElem.bindings.size>0){[...queryElem.bindings.values()].flat().forEach(remapQuery);}};parsedQuery.elems.forEach(remapQuery);parsedQuery.returned.forEach(remapQuery);const pushText=(fnType,result)=>{if(!!(result.length%2)===!!fnType.highlighted){result.push("");}else if(result.length===0&&!!fnType.highlighted){result.push("");result.push("");}result[result.length-1]+=fnType.name;};const writeHof=(fnType,result)=>{const hofOutput=fnType.bindings.get(this.typeNameIdOfOutput)||[];const hofInputs=fnType.generics;pushText(fnType,result);pushText({name:" (",highlighted:false},result);let needsComma=false;for(const fnType of hofInputs){if(needsComma){pushText({name:", ",highlighted:false},result);}needsComma=true;writeFn(fnType,result);}pushText({name:hofOutput.length===0?")":") -> ",highlighted:false,},result);if(hofOutput.length>1){pushText({name:"(",highlighted:false},result);}needsComma=false;for(const fnType of hofOutput){if(needsComma){pushText({name:", ",highlighted:false},result);}needsComma=true;writeFn(fnType,result);}if(hofOutput.length>1){pushText({name:")",highlighted:false},result);}};const writeSpecialPrimitive=(fnType,result)=>{if(fnType.id===this.typeNameIdOfArray||fnType.id===this.typeNameIdOfSlice||fnType.id===this.typeNameIdOfTuple||fnType.id===this.typeNameIdOfUnit){const[ob,sb]=fnType.id===this.typeNameIdOfArray||fnType.id===this.typeNameIdOfSlice?["[","]"]:["(",")"];pushText({name:ob,highlighted:fnType.highlighted},result);onEachBtwn(fnType.generics,nested=>writeFn(nested,result),()=>pushText({name:", ",highlighted:false},result),);pushText({name:sb,highlighted:fnType.highlighted},result);return true;}else if(fnType.id===this.typeNameIdOfReference){pushText({name:"&",highlighted:fnType.highlighted},result);let prevHighlighted=false;onEachBtwn(fnType.generics,value=>{prevHighlighted=!!value.highlighted;writeFn(value,result);},value=>pushText({name:" ",highlighted:prevHighlighted&&value.highlighted,},result),);return true;}else if(fnType.id===this.typeNameIdOfFn){writeHof(fnType,result);return true;}return false;};const writeFn=(fnType,result)=>{if(fnType.id!==null&&fnType.id<0){if(fnParamNames[-1-fnType.id]===""){const generics=fnType.generics.length>0?fnType.generics:objType.where_clause[-1-fnType.id];for(const nested of generics){writeFn(nested,result);}return;}else if(mgens){for(const[queryId,fnId]of mgens){if(fnId===fnType.id){mappedNames.set(queryParamNames[-1-queryId],fnParamNames[-1-fnType.id],);}}}pushText({name:fnParamNames[-1-fnType.id],highlighted:!!fnType.highlighted,},result);const where=[];onEachBtwn(fnType.generics,nested=>writeFn(nested,where),()=>pushText({name:" + ",highlighted:false},where),);if(where.length>0){whereClause.set(fnParamNames[-1-fnType.id],where);}}else{if(fnType.ty===TY_PRIMITIVE){if(writeSpecialPrimitive(fnType,result)){return;}}else if(fnType.ty===TY_TRAIT&&(fnType.id===this.typeNameIdOfFn||fnType.id===this.typeNameIdOfFnMut||fnType.id===this.typeNameIdOfFnOnce)){writeHof(fnType,result);return;}pushText(fnType,result);let hasBindings=false;if(fnType.bindings.size>0){onEachBtwn(fnType.bindings,([key,values])=>{const name=this.assocTypeIdNameMap.get(key);if(values.length===1&&values[0].id<0&&`${fnType.name}::${name}`===fnParamNames[-1-values[0].id]){for(const value of values){writeFn(value,[]);}return true;}if(!hasBindings){hasBindings=true;pushText({name:"<",highlighted:false},result);}pushText({name,highlighted:false},result);pushText({name:values.length!==1?"=(":"=",highlighted:false,},result);onEachBtwn(values||[],value=>writeFn(value,result),()=>pushText({name:" + ",highlighted:false},result),);if(values.length!==1){pushText({name:")",highlighted:false},result);}},()=>pushText({name:", ",highlighted:false},result),);}if(fnType.generics.length>0){pushText({name:hasBindings?", ":"<",highlighted:false},result);}onEachBtwn(fnType.generics,value=>writeFn(value,result),()=>pushText({name:", ",highlighted:false},result),);if(hasBindings||fnType.generics.length>0){pushText({name:">",highlighted:false},result);}}};const type=[];onEachBtwn(fnInputs,fnType=>writeFn(fnType,type),()=>pushText({name:", ",highlighted:false},type),);pushText({name:" -> ",highlighted:false},type);onEachBtwn(fnOutput,fnType=>writeFn(fnType,type),()=>pushText({name:", ",highlighted:false},type),);return{type,mappedNames,whereClause};};const sortResults=async(results,typeInfo,preferredCrate)=>{const userQuery=parsedQuery.userQuery;const normalizedUserQuery=parsedQuery.userQuery.toLowerCase();const isMixedCase=normalizedUserQuery!==userQuery;const result_list=[];const isReturnTypeQuery=parsedQuery.elems.length===0||typeInfo==="returned";for(const result of results.values()){result.item=this.searchIndex[result.id];result.word=this.searchIndex[result.id].word;if(isReturnTypeQuery){const resultItemType=result.item&&result.item.type;if(!resultItemType){continue;}const inputs=resultItemType.inputs;const where_clause=resultItemType.where_clause;if(containsTypeFromQuery(inputs,where_clause)){result.path_dist*=100;result.dist*=100;}}result_list.push(result);}result_list.sort((aaa,bbb)=>{let a;let b;if(isMixedCase){a=Number(aaa.item.name!==userQuery);b=Number(bbb.item.name!==userQuery);if(a!==b){return a-b;}}a=Number(aaa.word!==normalizedUserQuery);b=Number(bbb.word!==normalizedUserQuery);if(a!==b){return a-b;}a=Number(aaa.index<0);b=Number(bbb.index<0);if(a!==b){return a-b;}if(parsedQuery.hasReturnArrow){a=Number(!isFnLikeTy(aaa.item.ty));b=Number(!isFnLikeTy(bbb.item.ty));if(a!==b){return a-b;}}a=Number(aaa.path_dist);b=Number(bbb.path_dist);if(a!==b){return a-b;}a=Number(aaa.index);b=Number(bbb.index);if(a!==b){return a-b;}a=Number(aaa.dist);b=Number(bbb.dist);if(a!==b){return a-b;}a=Number(this.searchIndexDeprecated.get(aaa.item.crate).contains(aaa.item.bitIndex),);b=Number(this.searchIndexDeprecated.get(bbb.item.crate).contains(bbb.item.bitIndex),);if(a!==b){return a-b;}a=Number(aaa.item.crate!==preferredCrate);b=Number(bbb.item.crate!==preferredCrate);if(a!==b){return a-b;}a=Number(aaa.word.length);b=Number(bbb.word.length);if(a!==b){return a-b;}let aw=aaa.word;let bw=bbb.word;if(aw!==bw){return(aw>bw?+1:-1);}a=Number(this.searchIndexEmptyDesc.get(aaa.item.crate).contains(aaa.item.bitIndex),);b=Number(this.searchIndexEmptyDesc.get(bbb.item.crate).contains(bbb.item.bitIndex),);if(a!==b){return a-b;}a=Number(aaa.item.ty);b=Number(bbb.item.ty);if(a!==b){return a-b;}aw=aaa.item.path;bw=bbb.item.path;if(aw!==bw){return(aw>bw?+1:-1);}return 0;});return transformResults(result_list,typeInfo);};function unifyFunctionTypes(fnTypesIn,queryElems,whereClause,mgensIn,solutionCb,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return null;}const mgens=mgensIn===null?null:new Map(mgensIn);if(queryElems.length===0){return solutionCb(mgens)?fnTypesIn:null;}if(!fnTypesIn||fnTypesIn.length===0){return null;}const ql=queryElems.length;const fl=fnTypesIn.length;if(ql===1&&queryElems[0].generics.length===0&&queryElems[0].bindings.size===0){const queryElem=queryElems[0];for(const[i,fnType]of fnTypesIn.entries()){if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue;}if(fnType.id!==null&&fnType.id<0&&queryElem.id!==null&&queryElem.id<0){if(mgens&&mgens.has(queryElem.id)&&mgens.get(queryElem.id)!==fnType.id){continue;}const mgensScratch=new Map(mgens);mgensScratch.set(queryElem.id,fnType.id);if(!solutionCb||solutionCb(mgensScratch)){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({highlighted:true,},fnType,{generics:whereClause[-1-fnType.id],});return highlighted;}}else if(solutionCb(mgens?new Map(mgens):null)){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({highlighted:true,},fnType,{generics:unifyGenericTypes(fnType.generics,queryElem.generics,whereClause,mgens?new Map(mgens):null,solutionCb,unboxingDepth,)||fnType.generics,});return highlighted;}}for(const[i,fnType]of fnTypesIn.entries()){if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue;}if(fnType.id<0){const highlightedGenerics=unifyFunctionTypes(whereClause[(-fnType.id)-1],queryElems,whereClause,mgens,solutionCb,unboxingDepth+1,);if(highlightedGenerics){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({highlighted:true,},fnType,{generics:highlightedGenerics,});return highlighted;}}else{const highlightedGenerics=unifyFunctionTypes([...Array.from(fnType.bindings.values()).flat(),...fnType.generics],queryElems,whereClause,mgens?new Map(mgens):null,solutionCb,unboxingDepth+1,);if(highlightedGenerics){const highlighted=[...fnTypesIn];highlighted[i]=Object.assign({},fnType,{generics:highlightedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,highlightedGenerics.splice(0,v.length)];})),});return highlighted;}}}return null;}const fnTypes=fnTypesIn.slice();const flast=fl-1;const qlast=ql-1;const queryElem=queryElems[qlast];let queryElemsTmp=null;for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){continue;}let mgensScratch;if(fnType.id!==null&&queryElem.id!==null&&fnType.id<0){mgensScratch=new Map(mgens);if(mgensScratch.has(queryElem.id)&&mgensScratch.get(queryElem.id)!==fnType.id){continue;}mgensScratch.set(queryElem.id,fnType.id);}else{mgensScratch=mgens;}fnTypes[i]=fnTypes[flast];fnTypes.length=flast;if(!queryElemsTmp){queryElemsTmp=queryElems.slice(0,qlast);}let unifiedGenerics=[];let unifiedGenericsMgens=null;const passesUnification=unifyFunctionTypes(fnTypes,queryElemsTmp,whereClause,mgensScratch,mgensScratch=>{if(fnType.generics.length===0&&queryElem.generics.length===0&&fnType.bindings.size===0&&queryElem.bindings.size===0){return solutionCb(mgensScratch);}const solution=unifyFunctionTypeCheckBindings(fnType,queryElem,whereClause,mgensScratch,unboxingDepth,);if(!solution){return false;}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){unifiedGenerics=unifyGenericTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb,unboxingDepth,);if(unifiedGenerics!==null){unifiedGenericsMgens=simplifiedMgens;return true;}}return false;},unboxingDepth,);if(passesUnification){passesUnification.length=fl;passesUnification[flast]=passesUnification[i];passesUnification[i]=Object.assign({},fnType,{highlighted:true,generics:unifiedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,queryElem.bindings.has(k)?unifyFunctionTypes(v,queryElem.bindings.get(k),whereClause,unifiedGenericsMgens,solutionCb,unboxingDepth,):unifiedGenerics.splice(0,v.length)];})),});return passesUnification;}fnTypes[flast]=fnTypes[i];fnTypes[i]=fnType;fnTypes.length=fl;}for(let i=flast;i>=0;i-=1){const fnType=fnTypes[i];if(!unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){continue;}const generics=fnType.id!==null&&fnType.id<0?whereClause[(-fnType.id)-1]:fnType.generics;const bindings=fnType.bindings?Array.from(fnType.bindings.values()).flat():[];const passesUnification=unifyFunctionTypes(fnTypes.toSpliced(i,1,...bindings,...generics),queryElems,whereClause,mgens,solutionCb,unboxingDepth+1,);if(passesUnification){const highlightedGenerics=passesUnification.slice(i,i+generics.length+bindings.length,);const highlightedFnType=Object.assign({},fnType,{generics:highlightedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,highlightedGenerics.splice(0,v.length)];})),});return passesUnification.toSpliced(i,generics.length+bindings.length,highlightedFnType,);}}return null;}function unifyGenericTypes(fnTypesIn,queryElems,whereClause,mgensIn,solutionCb,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return null;}const mgens=mgensIn===null?null:new Map(mgensIn);if(queryElems.length===0){return solutionCb(mgens)?fnTypesIn:null;}if(!fnTypesIn||fnTypesIn.length===0){return null;}const fnType=fnTypesIn[0];const queryElem=queryElems[0];if(unifyFunctionTypeIsMatchCandidate(fnType,queryElem,mgens)){if(fnType.id!==null&&fnType.id<0&&queryElem.id!==null&&queryElem.id<0){if(!mgens||!mgens.has(queryElem.id)||mgens.get(queryElem.id)===fnType.id){const mgensScratch=new Map(mgens);mgensScratch.set(queryElem.id,fnType.id);const fnTypesRemaining=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgensScratch,solutionCb,unboxingDepth,);if(fnTypesRemaining){const highlighted=[fnType,...fnTypesRemaining];highlighted[0]=Object.assign({highlighted:true,},fnType,{generics:whereClause[-1-fnType.id],});return highlighted;}}}else{let unifiedGenerics;const fnTypesRemaining=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgens,mgensScratch=>{const solution=unifyFunctionTypeCheckBindings(fnType,queryElem,whereClause,mgensScratch,unboxingDepth,);if(!solution){return false;}const simplifiedGenerics=solution.simplifiedGenerics;for(const simplifiedMgens of solution.mgens){unifiedGenerics=unifyGenericTypes(simplifiedGenerics,queryElem.generics,whereClause,simplifiedMgens,solutionCb,unboxingDepth,);if(unifiedGenerics!==null){return true;}}},unboxingDepth,);if(fnTypesRemaining){const highlighted=[fnType,...fnTypesRemaining];highlighted[0]=Object.assign({highlighted:true,},fnType,{generics:unifiedGenerics||fnType.generics,});return highlighted;}}}if(unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth+1,)){let highlightedRemaining;if(fnType.id!==null&&fnType.id<0){const highlightedGenerics=unifyFunctionTypes(whereClause[(-fnType.id)-1],[queryElem],whereClause,mgens,mgensScratch=>{const hl=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgensScratch,solutionCb,unboxingDepth,);if(hl){highlightedRemaining=hl;}return hl;},unboxingDepth+1,);if(highlightedGenerics){return[Object.assign({highlighted:true,},fnType,{generics:highlightedGenerics,}),...highlightedRemaining];}}else{const highlightedGenerics=unifyGenericTypes([...Array.from(fnType.bindings.values()).flat(),...fnType.generics,],[queryElem],whereClause,mgens,mgensScratch=>{const hl=unifyGenericTypes(fnTypesIn.slice(1),queryElems.slice(1),whereClause,mgensScratch,solutionCb,unboxingDepth,);if(hl){highlightedRemaining=hl;}return hl;},unboxingDepth+1,);if(highlightedGenerics){return[Object.assign({},fnType,{generics:highlightedGenerics,bindings:new Map([...fnType.bindings.entries()].map(([k,v])=>{return[k,highlightedGenerics.splice(0,v.length)];})),}),...highlightedRemaining];}}}return null;}const unifyFunctionTypeIsMatchCandidate=(fnType,queryElem,mgensIn)=>{if(!typePassesFilter(queryElem.typeFilter,fnType.ty)){return false;}if(fnType.id!==null&&fnType.id<0&&queryElem.id!==null&&queryElem.id<0){if(mgensIn&&mgensIn.has(queryElem.id)&&mgensIn.get(queryElem.id)!==fnType.id){return false;}return true;}else{if(queryElem.id===this.typeNameIdOfArrayOrSlice&&(fnType.id===this.typeNameIdOfSlice||fnType.id===this.typeNameIdOfArray)){}else if(queryElem.id===this.typeNameIdOfTupleOrUnit&&(fnType.id===this.typeNameIdOfTuple||fnType.id===this.typeNameIdOfUnit)){}else if(queryElem.id===this.typeNameIdOfHof&&(fnType.id===this.typeNameIdOfFn||fnType.id===this.typeNameIdOfFnMut||fnType.id===this.typeNameIdOfFnOnce)){}else if(fnType.id!==queryElem.id||queryElem.id===null){return false;}if((fnType.generics.length+fnType.bindings.size)===0&&queryElem.generics.length!==0){return false;}if(fnType.bindings.size0){const fnTypePath=fnType.path!==undefined&&fnType.path!==null?fnType.path.split("::"):[];if(queryElemPathLength>fnTypePath.length){return false;}let i=0;for(const path of fnTypePath){if(path===queryElem.pathWithoutLast[i]){i+=1;if(i>=queryElemPathLength){break;}}}if(i0){let mgensSolutionSet=[mgensIn];for(const[name,constraints]of queryElem.bindings.entries()){if(mgensSolutionSet.length===0){return false;}if(!fnType.bindings.has(name)){return false;}const fnTypeBindings=fnType.bindings.get(name);mgensSolutionSet=mgensSolutionSet.flatMap(mgens=>{const newSolutions=[];unifyFunctionTypes(fnTypeBindings,constraints,whereClause,mgens,newMgens=>{newSolutions.push(newMgens);return false;},unboxingDepth,);return newSolutions;});}if(mgensSolutionSet.length===0){return false;}const binds=Array.from(fnType.bindings.entries()).flatMap(entry=>{const[name,constraints]=entry;if(queryElem.bindings.has(name)){return[];}else{return constraints;}});if(simplifiedGenerics.length>0){simplifiedGenerics=[...binds,...simplifiedGenerics];}else{simplifiedGenerics=binds;}return{simplifiedGenerics,mgens:mgensSolutionSet};}return{simplifiedGenerics,mgens:[mgensIn]};}function unifyFunctionTypeIsUnboxCandidate(fnType,queryElem,whereClause,mgens,unboxingDepth,){if(unboxingDepth>=UNBOXING_LIMIT){return false;}if(fnType.id!==null&&fnType.id<0){if(!whereClause){return false;}return checkIfInList(whereClause[(-fnType.id)-1],queryElem,whereClause,mgens,unboxingDepth,);}else if(fnType.unboxFlag&&(fnType.generics.length>0||fnType.bindings.size>0)){const simplifiedGenerics=[...fnType.generics,...Array.from(fnType.bindings.values()).flat(),];return checkIfInList(simplifiedGenerics,queryElem,whereClause,mgens,unboxingDepth,);}return false;}function containsTypeFromQuery(list,where_clause){if(!list)return false;for(const ty of parsedQuery.returned){if(ty.id!==null&&ty.id<0){continue;}if(checkIfInList(list,ty,where_clause,null,0)){return true;}}for(const ty of parsedQuery.elems){if(ty.id!==null&&ty.id<0){continue;}if(checkIfInList(list,ty,where_clause,null,0)){return true;}}return false;}function checkIfInList(list,elem,whereClause,mgens,unboxingDepth){for(const entry of list){if(checkType(entry,elem,whereClause,mgens,unboxingDepth)){return true;}}return false;}const checkType=(row,elem,whereClause,mgens,unboxingDepth)=>{if(unboxingDepth>=UNBOXING_LIMIT){return false;}if(row.id!==null&&elem.id!==null&&row.id>0&&elem.id>0&&elem.pathWithoutLast.length===0&&row.generics.length===0&&elem.generics.length===0&&row.bindings.size===0&&elem.bindings.size===0&&elem.id!==this.typeNameIdOfArrayOrSlice&&elem.id!==this.typeNameIdOfHof&&elem.id!==this.typeNameIdOfTupleOrUnit){return row.id===elem.id&&typePassesFilter(elem.typeFilter,row.ty);}else{return unifyFunctionTypes([row],[elem],whereClause,mgens,()=>true,unboxingDepth,);}};const checkTypeMgensForConflict=mgens=>{if(!mgens){return true;}const fnTypes=new Set();for(const[_qid,fid]of mgens){if(fnTypes.has(fid)){return false;}fnTypes.add(fid);}return true;};function checkPath(contains,ty){if(contains.length===0){return 0;}const maxPathEditDistance=Math.floor(contains.reduce((acc,next)=>acc+next.length,0)/3,);let ret_dist=maxPathEditDistance+1;const path=ty.path.split("::");if(ty.parent&&ty.parent.name){path.push(ty.parent.name.toLowerCase());}const length=path.length;const clength=contains.length;pathiter:for(let i=length-clength;i>=0;i-=1){let dist_total=0;for(let x=0;xmaxPathEditDistance){continue pathiter;}dist_total+=dist;}}ret_dist=Math.min(ret_dist,Math.round(dist_total/clength));}return ret_dist>maxPathEditDistance?null:ret_dist;}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER||filter===type)return true;const name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias";}return false;}const handleAliases=async(ret,query,filterCrates,currentCrate)=>{const lowerQuery=query.toLowerCase();if(this.FOUND_ALIASES.has(lowerQuery)){return;}this.FOUND_ALIASES.add(lowerQuery);const aliases=[];const crateAliases=[];if(filterCrates!==null){if(this.ALIASES.has(filterCrates)&&this.ALIASES.get(filterCrates).has(lowerQuery)){const query_aliases=this.ALIASES.get(filterCrates).get(lowerQuery);for(const alias of query_aliases){aliases.push(alias);}}}else{for(const[crate,crateAliasesIndex]of this.ALIASES){if(crateAliasesIndex.has(lowerQuery)){const pushTo=crate===currentCrate?crateAliases:aliases;const query_aliases=crateAliasesIndex.get(lowerQuery);for(const alias of query_aliases){pushTo.push(alias);}}}}const sortFunc=(aaa,bbb)=>{if(aaa.original.path{alias={...alias};const res=buildHrefAndPath(alias);alias.displayPath=pathSplitter(res[0]);alias.fullPath=alias.displayPath+alias.name;alias.href=res[1];ret.others.unshift(alias);if(ret.others.length>MAX_RESULTS){ret.others.pop();}};aliases.forEach(pushFunc);crateAliases.forEach(pushFunc);};function addIntoResults(results,fullId,id,index,dist,path_dist,maxEditDistance){if(dist<=maxEditDistance||index!==-1){if(results.has(fullId)){const result=results.get(fullId);if(result===undefined||result.dontValidate||result.dist<=dist){return;}}results.set(fullId,{id:id,index:index,dontValidate:parsedQuery.literalSearch,dist:dist,path_dist:path_dist,});}}function handleArgs(row,pos,results){if(!row||(filterCrates!==null&&row.crate!==filterCrates)){return;}const rowType=row.type;if(!rowType){return;}const tfpDist=compareTypeFingerprints(row.id,parsedQuery.typeFingerprint,);if(tfpDist===null){return;}if(results.size>=MAX_RESULTS&&tfpDist>results.max_dist){return;}if(!unifyFunctionTypes(rowType.inputs,parsedQuery.elems,rowType.where_clause,null,mgens=>{return unifyFunctionTypes(rowType.output,parsedQuery.returned,rowType.where_clause,mgens,checkTypeMgensForConflict,0,);},0,)){return;}results.max_dist=Math.max(results.max_dist||0,tfpDist);addIntoResults(results,row.id,pos,0,tfpDist,0,Number.MAX_VALUE);}const compareTypeFingerprints=(fullId,queryFingerprint)=>{const fh0=this.functionTypeFingerprint[fullId*4];const fh1=this.functionTypeFingerprint[(fullId*4)+1];const fh2=this.functionTypeFingerprint[(fullId*4)+2];const[qh0,qh1,qh2]=queryFingerprint;const[in0,in1,in2]=[fh0&qh0,fh1&qh1,fh2&qh2];if((in0 ^ qh0)||(in1 ^ qh1)||(in2 ^ qh2)){return null;}return this.functionTypeFingerprint[(fullId*4)+3];};const innerRunQuery=()=>{if(parsedQuery.foundElems===1&&!parsedQuery.hasReturnArrow){const elem=parsedQuery.elems[0];const handleNameSearch=id=>{const row=this.searchIndex[id];if(!typePassesFilter(elem.typeFilter,row.ty)||(filterCrates!==null&&row.crate!==filterCrates)){return;}let pathDist=0;if(elem.fullPath.length>1){const maybePathDist=checkPath(elem.pathWithoutLast,row);if(maybePathDist===null){return;}pathDist=maybePathDist;}if(parsedQuery.literalSearch){if(row.word===elem.pathLast){addIntoResults(results_others,row.id,id,0,0,pathDist,0);}}else{addIntoResults(results_others,row.id,id,row.normalizedName.indexOf(elem.normalizedPathLast),editDistance(row.normalizedName,elem.normalizedPathLast,maxEditDistance,),pathDist,maxEditDistance,);}};if(elem.normalizedPathLast!==""){const last=elem.normalizedPathLast;for(const id of this.nameTrie.search(last,this.tailTable)){handleNameSearch(id);}}const length=this.searchIndex.length;for(let i=0,nSearchIndex=length;i0){const sortQ=(a,b)=>{const ag=a.generics.length===0&&a.bindings.size===0;const bg=b.generics.length===0&&b.bindings.size===0;if(ag!==bg){return+ag-+bg;}const ai=a.id!==null&&a.id>0;const bi=b.id!==null&&b.id>0;return+ai-+bi;};parsedQuery.elems.sort(sortQ);parsedQuery.returned.sort(sortQ);for(let i=0,nSearchIndex=this.searchIndex.length;i{const descs=await Promise.all(list.map(result=>{return this.searchIndexEmptyDesc.get(result.crate).contains(result.bitIndex)?"":this.searchState.loadDesc(result);}));for(const[i,result]of list.entries()){result.desc=descs[i];}}));if(parsedQuery.error!==null&&ret.others.length!==0){ret.query.error=null;}return ret;}}let rawSearchIndex;let docSearch;const longItemTypes=["keyword","primitive type","module","extern crate","re-export","struct","enum","function","type alias","static","trait","","trait method","method","struct field","enum variant","macro","assoc type","constant","assoc const","union","foreign type","existential type","attribute macro","derive macro","trait alias",];let currentResults;function printTab(nb){let iter=0;let foundCurrentTab=false;let foundCurrentResultSet=false;onEachLazy(document.getElementById("search-tabs").childNodes,elem=>{if(nb===iter){addClass(elem,"selected");foundCurrentTab=true;}else{removeClass(elem,"selected");}iter+=1;});const isTypeSearch=(nb>0||iter===1);iter=0;onEachLazy(document.getElementById("results").childNodes,elem=>{if(nb===iter){addClass(elem,"active");foundCurrentResultSet=true;}else{removeClass(elem,"active");}iter+=1;});if(foundCurrentTab&&foundCurrentResultSet){searchState.currentTab=nb;const correctionsElem=document.getElementsByClassName("search-corrections");if(isTypeSearch){removeClass(correctionsElem[0],"hidden");}else{addClass(correctionsElem[0],"hidden");}}else if(nb!==0){printTab(0);}}function buildUrl(search,filterCrates){let extra="?search="+encodeURIComponent(search);if(filterCrates!==null){extra+="&filter-crate="+encodeURIComponent(filterCrates);}return getNakedUrl()+extra+window.location.hash;}function getFilterCrates(){const elem=document.getElementById("crate-search");if(elem&&elem.value!=="all crates"&&window.searchIndex.has(elem.value)){return elem.value;}return null;}function nextTab(direction){const next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult();}function focusSearchResult(){const target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#search-tabs button").item(searchState.currentTab);searchState.focusedByTab[searchState.currentTab]=null;if(target){target.focus();}}async function addTab(array,query,display){const extraClass=display?" active":"";const output=document.createElement(array.length===0&&query.error===null?"div":"ul",);if(array.length>0){output.className="search-results "+extraClass;const lis=Promise.all(array.map(async item=>{const name=item.is_alias?item.original.name:item.name;const type=itemTypes[item.ty];const longType=longItemTypes[item.ty];const typeName=longType.length!==0?`${longType}`:"?";const link=document.createElement("a");link.className="result-"+type;link.href=item.href;const resultName=document.createElement("span");resultName.className="result-name";resultName.insertAdjacentHTML("beforeend",`${typeName}`);link.appendChild(resultName);let alias=" ";if(item.is_alias){alias=`
\ +${item.name} - see \ +
`;}resultName.insertAdjacentHTML("beforeend",`
${alias}\ +${item.displayPath}${name}\ +
`);const description=document.createElement("div");description.className="desc";description.insertAdjacentHTML("beforeend",item.desc);if(item.displayTypeSignature){const{type,mappedNames,whereClause}=await item.displayTypeSignature;const displayType=document.createElement("div");type.forEach((value,index)=>{if(index%2!==0){const highlight=document.createElement("strong");highlight.appendChild(document.createTextNode(value));displayType.appendChild(highlight);}else{displayType.appendChild(document.createTextNode(value));}});if(mappedNames.size>0||whereClause.size>0){let addWhereLineFn=()=>{const line=document.createElement("div");line.className="where";line.appendChild(document.createTextNode("where"));displayType.appendChild(line);addWhereLineFn=()=>{};};for(const[qname,name]of mappedNames){if(name===qname){continue;}addWhereLineFn();const line=document.createElement("div");line.className="where";line.appendChild(document.createTextNode(` ${qname} matches `));const lineStrong=document.createElement("strong");lineStrong.appendChild(document.createTextNode(name));line.appendChild(lineStrong);displayType.appendChild(line);}for(const[name,innerType]of whereClause){if(innerType.length<=1){continue;}addWhereLineFn();const line=document.createElement("div");line.className="where";line.appendChild(document.createTextNode(` ${name}: `));innerType.forEach((value,index)=>{if(index%2!==0){const highlight=document.createElement("strong");highlight.appendChild(document.createTextNode(value));line.appendChild(highlight);}else{line.appendChild(document.createTextNode(value));}});displayType.appendChild(line);}}displayType.className="type-signature";link.appendChild(displayType);}link.appendChild(description);return link;}));lis.then(lis=>{for(const li of lis){output.appendChild(li);}});}else if(query.error===null){const dlroChannel=`https://doc.rust-lang.org/${getVar("channel")}`;output.className="search-failed"+extraClass;output.innerHTML="No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:";}return output;}function makeTabHeader(tabNb,text,nbElems){const fmtNbElems=nbElems<10?`\u{2007}(${nbElems})\u{2007}\u{2007}`:nbElems<100?`\u{2007}(${nbElems})\u{2007}`:`\u{2007}(${nbElems})`;if(searchState.currentTab===tabNb){return"";}return"";}async function showResults(results,go_to_first,filterCrates){const search=searchState.outputElement();if(go_to_first||(results.others.length===1&&getSettingValue("go-to-only-result")==="true")){window.onunload=()=>{};searchState.removeQueryParameters();const elem=document.createElement("a");elem.href=results.others[0].href;removeClass(elem,"active");document.body.appendChild(elem);elem.click();return;}if(results.query===undefined){results.query=DocSearch.parseQuery(searchState.input.value);}currentResults=results.query.userQuery;let currentTab=searchState.currentTab;if((currentTab===0&&results.others.length===0)||(currentTab===1&&results.in_args.length===0)||(currentTab===2&&results.returned.length===0)){if(results.others.length!==0){currentTab=0;}else if(results.in_args.length){currentTab=1;}else if(results.returned.length){currentTab=2;}}let crates="";if(rawSearchIndex.size>1){crates="
in 
"+"
";}let output=`
\ +

Results

${crates}
`;if(results.query.error!==null){const error=results.query.error;error.forEach((value,index)=>{value=value.split("<").join("<").split(">").join(">");if(index%2!==0){error[index]=`${value.replaceAll(" ", " ")}`;}else{error[index]=value;}});output+=`

Query parser error: "${error.join("")}".

`;output+="
"+makeTabHeader(0,"In Names",results.others.length)+"
";currentTab=0;}else if(results.query.foundElems<=1&&results.query.returned.length===0){output+="
"+makeTabHeader(0,"In Names",results.others.length)+makeTabHeader(1,"In Parameters",results.in_args.length)+makeTabHeader(2,"In Return Types",results.returned.length)+"
";}else{const signatureTabTitle=results.query.elems.length===0?"In Function Return Types":results.query.returned.length===0?"In Function Parameters":"In Function Signatures";output+="
"+makeTabHeader(0,signatureTabTitle,results.others.length)+"
";currentTab=0;}if(results.query.correction!==null){const orig=results.query.returned.length>0?results.query.returned[0].name:results.query.elems[0].name;output+="

"+`Type "${orig}" not found. `+"Showing results for closest type name "+`"${results.query.correction}" instead.

`;}if(results.query.proposeCorrectionFrom!==null){const orig=results.query.proposeCorrectionFrom;const targ=results.query.proposeCorrectionTo;output+="

"+`Type "${orig}" not found and used as generic parameter. `+`Consider searching for "${targ}" instead.

`;}const[ret_others,ret_in_args,ret_returned]=await Promise.all([addTab(results.others,results.query,currentTab===0),addTab(results.in_args,results.query,currentTab===1),addTab(results.returned,results.query,currentTab===2),]);const resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others);resultsElem.appendChild(ret_in_args);resultsElem.appendChild(ret_returned);search.innerHTML=output;if(searchState.rustdocToolbar){search.querySelector(".main-heading").appendChild(searchState.rustdocToolbar);}const crateSearch=document.getElementById("crate-search");if(crateSearch){crateSearch.addEventListener("input",updateCrate);}search.appendChild(resultsElem);searchState.showResults(search);const elems=document.getElementById("search-tabs").childNodes;searchState.focusedByTab=[];let i=0;for(const elem of elems){const j=i;elem.onclick=()=>printTab(j);searchState.focusedByTab.push(null);i+=1;}printTab(currentTab);}function updateSearchHistory(url){if(!browserSupportsHistoryApi()){return;}const params=searchState.getQueryStringParams();if(!history.state&&!params.search){history.pushState(null,"",url);}else{history.replaceState(null,"",url);}}async function search(forced){const query=DocSearch.parseQuery(searchState.input.value.trim());let filterCrates=getFilterCrates();if(!forced&&query.userQuery===currentResults){if(query.userQuery.length>0){putBackSearch();}return;}searchState.setLoadingSearch();const params=searchState.getQueryStringParams();if(filterCrates===null&¶ms["filter-crate"]!==undefined){filterCrates=params["filter-crate"];}searchState.title="\""+query.userQuery+"\" Search - Rust";updateSearchHistory(buildUrl(query.userQuery,filterCrates));await showResults(await docSearch.execQuery(query,filterCrates,window.currentCrate),params.go_to_first,filterCrates);}function onSearchSubmit(e){e.preventDefault();searchState.clearInputTimeout();search();}function putBackSearch(){const search_input=searchState.input;if(!searchState.input){return;}if(search_input.value!==""&&!searchState.isDisplayed()){searchState.showResults();if(browserSupportsHistoryApi()){history.replaceState(null,"",buildUrl(search_input.value,getFilterCrates()));}document.title=searchState.title;}}function registerSearchEvents(){const params=searchState.getQueryStringParams();if(searchState.input.value===""){searchState.input.value=params.search||"";}const searchAfter500ms=()=>{searchState.clearInputTimeout();if(searchState.input.value.length===0){searchState.hideResults();}else{searchState.timeout=setTimeout(search,500);}};searchState.input.onkeyup=searchAfter500ms;searchState.input.oninput=searchAfter500ms;document.getElementsByClassName("search-form")[0].onsubmit=onSearchSubmit;searchState.input.onchange=e=>{if(e.target!==document.activeElement){return;}searchState.clearInputTimeout();setTimeout(search,0);};searchState.input.onpaste=searchState.input.onchange;searchState.outputElement().addEventListener("keydown",e=>{if(e.altKey||e.ctrlKey||e.shiftKey||e.metaKey){return;}if(e.which===38){const previous=document.activeElement.previousElementSibling;if(previous){previous.focus();}else{searchState.focus();}e.preventDefault();}else if(e.which===40){const next=document.activeElement.nextElementSibling;if(next){next.focus();}const rect=document.activeElement.getBoundingClientRect();if(window.innerHeight-rect.bottom{if(e.which===40){focusSearchResult();e.preventDefault();}});searchState.input.addEventListener("focus",()=>{putBackSearch();});searchState.input.addEventListener("blur",()=>{if(window.searchState.input){window.searchState.input.placeholder=window.searchState.origPlaceholder;}});if(browserSupportsHistoryApi()){const previousTitle=document.title;window.addEventListener("popstate",e=>{const params=searchState.getQueryStringParams();document.title=previousTitle;currentResults=null;if(params.search&¶ms.search.length>0){searchState.input.value=params.search;e.preventDefault();search();}else{searchState.input.value="";searchState.hideResults();}});}window.onpageshow=()=>{const qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch;}search();};}function updateCrate(ev){if(ev.target.value==="all crates"){const query=searchState.input.value.trim();updateSearchHistory(buildUrl(query,null));}currentResults=null;search(true);}class ParametricDescription{constructor(w,n,minErrors){this.w=w;this.n=n;this.minErrors=minErrors;}isAccept(absState){const state=Math.floor(absState/(this.w+1));const offset=absState%(this.w+1);return this.w-offset+this.minErrors[state]<=this.n;}getPosition(absState){return absState%(this.w+1);}getVector(name,charCode,pos,end){let vector=0;for(let i=pos;i>5;const bitStart=bitLoc&31;if(bitStart+bitsPerValue<=32){return((data[dataLoc]>>bitStart)&this.MASKS[bitsPerValue-1]);}else{const part=32-bitStart;return ~~(((data[dataLoc]>>bitStart)&this.MASKS[part-1])+((data[1+dataLoc]&this.MASKS[bitsPerValue-part-1])<{const settingId=toggle.id;const settingValue=getSettingValue(settingId);if(settingValue!==null){toggle.checked=settingValue==="true";}toggle.onchange=()=>{changeSetting(toggle.id,toggle.checked);};});onEachLazy(settingsElement.querySelectorAll("input[type=\"radio\"]"),elem=>{const settingId=elem.name;let settingValue=getSettingValue(settingId);if(settingId==="theme"){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||settingValue===null){settingValue=useSystem==="false"?"light":"system preference";}}if(settingValue!==null&&settingValue!=="null"){elem.checked=settingValue===elem.value;}elem.addEventListener("change",()=>{changeSetting(elem.name,elem.value);});},);}function buildSettingsPageSections(settings){let output="";for(const setting of settings){const js_data_name=setting["js_name"];const setting_name=setting["name"];if(setting["options"]!==undefined){output+=`\ +
+
${setting_name}
+
`;onEach(setting["options"],option=>{const checked=option===setting["default"]?" checked":"";const full=`${js_data_name}-${option.replace(/ /g,"-")}`;output+=`\ + `;});output+=`\ +
+
`;}else{const checked=setting["default"]===true?" checked":"";output+=`\ +
\ + \ +
`;}}return output;}function buildSettingsPage(){const theme_list=getVar("themes");const theme_names=(theme_list===null?"":theme_list).split(",").filter(t=>t);theme_names.push("light","dark","ayu");const settings=[{"name":"Theme","js_name":"theme","default":"system preference","options":theme_names.concat("system preference"),},{"name":"Preferred light theme","js_name":"preferred-light-theme","default":"light","options":theme_names,},{"name":"Preferred dark theme","js_name":"preferred-dark-theme","default":"dark","options":theme_names,},{"name":"Auto-hide item contents for large items","js_name":"auto-hide-large-items","default":true,},{"name":"Auto-hide item methods' documentation","js_name":"auto-hide-method-docs","default":false,},{"name":"Auto-hide trait implementation documentation","js_name":"auto-hide-trait-implementations","default":false,},{"name":"Directly go to item in search if there is only one result","js_name":"go-to-only-result","default":false,},{"name":"Show line numbers on code examples","js_name":"line-numbers","default":false,},{"name":"Hide persistent navigation bar","js_name":"hide-sidebar","default":false,},{"name":"Hide table of contents","js_name":"hide-toc","default":false,},{"name":"Hide module navigation","js_name":"hide-modnav","default":false,},{"name":"Disable keyboard shortcuts","js_name":"disable-shortcuts","default":false,},{"name":"Use sans serif fonts","js_name":"sans-serif-fonts","default":false,},{"name":"Word wrap source code","js_name":"word-wrap-source-code","default":false,},];const elementKind=isSettingsPage?"section":"div";const innerHTML=`
${buildSettingsPageSections(settings)}
`;const el=document.createElement(elementKind);el.id="settings";if(!isSettingsPage){el.className="popover";}el.innerHTML=innerHTML;if(isSettingsPage){const mainElem=document.getElementById(MAIN_ID);if(mainElem!==null){mainElem.appendChild(el);}}else{el.setAttribute("tabindex","-1");const settingsBtn=getSettingsButton();if(settingsBtn!==null){settingsBtn.appendChild(el);}}return el;}const settingsMenu=buildSettingsPage();function displaySettings(){settingsMenu.style.display="";onEachLazy(settingsMenu.querySelectorAll("input[type='checkbox']"),el=>{const val=getSettingValue(el.id);const checked=val==="true";if(checked!==el.checked&&val!==null){el.checked=checked;}});}function settingsBlurHandler(event){const helpBtn=getHelpButton();const settingsBtn=getSettingsButton();const helpUnfocused=helpBtn===null||(!helpBtn.contains(document.activeElement)&&!elemContainsTarget(helpBtn,event.relatedTarget));const settingsUnfocused=settingsBtn===null||(!settingsBtn.contains(document.activeElement)&&!elemContainsTarget(settingsBtn,event.relatedTarget));if(helpUnfocused&&settingsUnfocused){window.hidePopoverMenus();}}if(!isSettingsPage){const settingsButton=nonnull(getSettingsButton());const settingsMenu=nonnull(document.getElementById("settings"));settingsButton.onclick=event=>{if(elemContainsTarget(settingsMenu,event.target)){return;}event.preventDefault();const shouldDisplaySettings=settingsMenu.style.display==="none";window.hideAllModals(false);if(shouldDisplaySettings){displaySettings();}};settingsButton.onblur=settingsBlurHandler;nonnull(settingsButton.querySelector("a")).onblur=settingsBlurHandler;onEachLazy(settingsMenu.querySelectorAll("input"),el=>{el.onblur=settingsBlurHandler;});settingsMenu.onblur=settingsBlurHandler;}setTimeout(()=>{setEvents(settingsMenu);if(!isSettingsPage){displaySettings();}removeClass(getSettingsButton(),"rotate");},0);})(); \ No newline at end of file diff --git a/compiler-docs/static.files/src-script-813739b1.js b/compiler-docs/static.files/src-script-813739b1.js new file mode 100644 index 0000000000..bf546257ca --- /dev/null +++ b/compiler-docs/static.files/src-script-813739b1.js @@ -0,0 +1 @@ +"use strict";(function(){const rootPath=getVar("root-path");const NAME_OFFSET=0;const DIRS_OFFSET=1;const FILES_OFFSET=2;const RUSTDOC_MOBILE_BREAKPOINT=700;function closeSidebarIfMobile(){if(window.innerWidth{removeClass(document.documentElement,"src-sidebar-expanded");updateLocalStorage("source-sidebar-show","false");};window.rustdocShowSourceSidebar=()=>{addClass(document.documentElement,"src-sidebar-expanded");updateLocalStorage("source-sidebar-show","true");};window.rustdocToggleSrcSidebar=()=>{if(document.documentElement.classList.contains("src-sidebar-expanded")){window.rustdocCloseSourceSidebar();}else{window.rustdocShowSourceSidebar();}};function createSrcSidebar(srcIndexStr){const container=nonnull(document.querySelector("nav.sidebar"));const sidebar=document.createElement("div");sidebar.id="src-sidebar";const srcIndex=new Map(JSON.parse(srcIndexStr));let hasFoundFile=false;for(const[key,source]of srcIndex){source[NAME_OFFSET]=key;hasFoundFile=createDirEntry(source,sidebar,"",hasFoundFile);}container.appendChild(sidebar);const selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus();}}function highlightSrcLines(){const match=window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);if(!match){return;}let from=parseInt(match[1],10);let to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10);}if(to{removeClass(e,"line-highlighted");});for(let i=from;i<=to;++i){elem=document.getElementById(""+i);if(!elem){break;}addClass(elem,"line-highlighted");}}const handleSrcHighlight=(function(){let prev_line_id=0;const set_fragment=name=>{const x=window.scrollX,y=window.scrollY;if(browserSupportsHistoryApi()){history.replaceState(null,"","#"+name);highlightSrcLines();}else{location.replace("#"+name);}window.scrollTo(x,y);};return ev=>{let cur_line_id=parseInt(ev.target.id,10);if(isNaN(cur_line_id)||ev.ctrlKey||ev.altKey||ev.metaKey){return;}ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){const tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp;}set_fragment(prev_line_id+"-"+cur_line_id);}else{prev_line_id=cur_line_id;set_fragment(""+cur_line_id);}};}());window.addEventListener("hashchange",highlightSrcLines);onEachLazy(document.querySelectorAll("a[data-nosnippet]"),el=>{el.addEventListener("click",handleSrcHighlight);});highlightSrcLines();window.createSrcSidebar=createSrcSidebar;})(); \ No newline at end of file diff --git a/compiler-docs/static.files/storage-68b7e25d.js b/compiler-docs/static.files/storage-68b7e25d.js new file mode 100644 index 0000000000..5b18baa723 --- /dev/null +++ b/compiler-docs/static.files/storage-68b7e25d.js @@ -0,0 +1,25 @@ +"use strict";const builtinThemes=["light","dark","ayu"];const darkThemes=["dark","ayu"];window.currentTheme=(function(){const currentTheme=document.getElementById("themeStyle");return currentTheme instanceof HTMLLinkElement?currentTheme:null;})();const settingsDataset=(function(){const settingsElement=document.getElementById("default-settings");return settingsElement&&settingsElement.dataset?settingsElement.dataset:null;})();function nonnull(x,msg){if(x===null){throw(msg||"unexpected null value!");}else{return x;}}function nonundef(x,msg){if(x===undefined){throw(msg||"unexpected null value!");}else{return x;}}function getSettingValue(settingName){const current=getCurrentValue(settingName);if(current===null&&settingsDataset!==null){const def=settingsDataset[settingName.replace(/-/g,"_")];if(def!==undefined){return def;}}return current;}const localStoredTheme=getSettingValue("theme");function hasClass(elem,className){return!!elem&&!!elem.classList&&elem.classList.contains(className);}function addClass(elem,className){if(elem&&elem.classList){elem.classList.add(className);}}function removeClass(elem,className){if(elem&&elem.classList){elem.classList.remove(className);}}function onEach(arr,func){for(const elem of arr){if(func(elem)){return true;}}return false;}function onEachLazy(lazyArray,func){return onEach(Array.prototype.slice.call(lazyArray),func);}function updateLocalStorage(name,value){try{if(value===null){window.localStorage.removeItem("rustdoc-"+name);}else{window.localStorage.setItem("rustdoc-"+name,value);}}catch(e){}}function getCurrentValue(name){try{return window.localStorage.getItem("rustdoc-"+name);}catch(e){return null;}}function getVar(name){const el=document.querySelector("head > meta[name='rustdoc-vars']");return el?el.getAttribute("data-"+name):null;}function switchTheme(newThemeName,saveTheme){const themeNames=(getVar("themes")||"").split(",").filter(t=>t);themeNames.push(...builtinThemes);if(newThemeName===null||themeNames.indexOf(newThemeName)===-1){return;}if(saveTheme){updateLocalStorage("theme",newThemeName);}document.documentElement.setAttribute("data-theme",newThemeName);if(builtinThemes.indexOf(newThemeName)!==-1){if(window.currentTheme&&window.currentTheme.parentNode){window.currentTheme.parentNode.removeChild(window.currentTheme);window.currentTheme=null;}}else{const newHref=getVar("root-path")+encodeURIComponent(newThemeName)+getVar("resource-suffix")+".css";if(!window.currentTheme){if(document.readyState==="loading"){document.write(``);window.currentTheme=(function(){const currentTheme=document.getElementById("themeStyle");return currentTheme instanceof HTMLLinkElement?currentTheme:null;})();}else{window.currentTheme=document.createElement("link");window.currentTheme.rel="stylesheet";window.currentTheme.id="themeStyle";window.currentTheme.href=newHref;document.documentElement.appendChild(window.currentTheme);}}else if(newHref!==window.currentTheme.href){window.currentTheme.href=newHref;}}}const updateTheme=(function(){const mql=window.matchMedia("(prefers-color-scheme: dark)");function updateTheme(){if(getSettingValue("use-system-theme")!=="false"){const lightTheme=getSettingValue("preferred-light-theme")||"light";const darkTheme=getSettingValue("preferred-dark-theme")||"dark";updateLocalStorage("use-system-theme","true");switchTheme(mql.matches?darkTheme:lightTheme,true);}else{switchTheme(getSettingValue("theme"),false);}}mql.addEventListener("change",updateTheme);return updateTheme;})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&localStoredTheme!==null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("preferred-dark-theme",localStoredTheme);}}updateTheme();if(getSettingValue("source-sidebar-show")==="true"){addClass(document.documentElement,"src-sidebar-expanded");}if(getSettingValue("hide-sidebar")==="true"){addClass(document.documentElement,"hide-sidebar");}if(getSettingValue("hide-toc")==="true"){addClass(document.documentElement,"hide-toc");}if(getSettingValue("hide-modnav")==="true"){addClass(document.documentElement,"hide-modnav");}if(getSettingValue("sans-serif-fonts")==="true"){addClass(document.documentElement,"sans-serif");}if(getSettingValue("word-wrap-source-code")==="true"){addClass(document.documentElement,"word-wrap-source-code");}function updateSidebarWidth(){const desktopSidebarWidth=getSettingValue("desktop-sidebar-width");if(desktopSidebarWidth&&desktopSidebarWidth!=="null"){document.documentElement.style.setProperty("--desktop-sidebar-width",desktopSidebarWidth+"px",);}const srcSidebarWidth=getSettingValue("src-sidebar-width");if(srcSidebarWidth&&srcSidebarWidth!=="null"){document.documentElement.style.setProperty("--src-sidebar-width",srcSidebarWidth+"px",);}}updateSidebarWidth();window.addEventListener("pageshow",ev=>{if(ev.persisted){setTimeout(updateTheme,0);setTimeout(updateSidebarWidth,0);}});class RustdocSearchElement extends HTMLElement{constructor(){super();}connectedCallback(){const rootPath=getVar("root-path");const currentCrate=getVar("current-crate");this.innerHTML=``;}}window.customElements.define("rustdoc-search",RustdocSearchElement);class RustdocToolbarElement extends HTMLElement{constructor(){super();}connectedCallback(){if(this.firstElementChild){return;}const rootPath=getVar("root-path");this.innerHTML=` +
+ Settings +
+
+ Help +
+ `;}}window.customElements.define("rustdoc-toolbar",RustdocToolbarElement); \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.Args.js b/compiler-docs/trait.impl/clap/derive/trait.Args.js new file mode 100644 index 0000000000..02c122eeea --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.Args.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Args for FelangCli"],["impl Args for BuildArgs"],["impl Args for CheckArgs"],["impl Args for NewProjectArgs"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[559]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.CommandFactory.js b/compiler-docs/trait.impl/clap/derive/trait.CommandFactory.js new file mode 100644 index 0000000000..a6dabb2006 --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.CommandFactory.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl CommandFactory for FelangCli"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[135]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.FromArgMatches.js b/compiler-docs/trait.impl/clap/derive/trait.FromArgMatches.js new file mode 100644 index 0000000000..936c94ec85 --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.FromArgMatches.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl FromArgMatches for Commands"],["impl FromArgMatches for FelangCli"],["impl FromArgMatches for BuildArgs"],["impl FromArgMatches for CheckArgs"],["impl FromArgMatches for NewProjectArgs"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[728]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.Parser.js b/compiler-docs/trait.impl/clap/derive/trait.Parser.js new file mode 100644 index 0000000000..5a4c6e3934 --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.Parser.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Parser for FelangCli"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[127]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.Subcommand.js b/compiler-docs/trait.impl/clap/derive/trait.Subcommand.js new file mode 100644 index 0000000000..be8da5416f --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.Subcommand.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Subcommand for Commands"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[133]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/clap/derive/trait.ValueEnum.js b/compiler-docs/trait.impl/clap/derive/trait.ValueEnum.js new file mode 100644 index 0000000000..f8a31218fa --- /dev/null +++ b/compiler-docs/trait.impl/clap/derive/trait.ValueEnum.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl ValueEnum for Emit"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[133]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/clone/trait.Clone.js b/compiler-docs/trait.impl/core/clone/trait.Clone.js new file mode 100644 index 0000000000..0c7f8553d5 --- /dev/null +++ b/compiler-docs/trait.impl/core/clone/trait.Clone.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Clone for Emit"]]],["fe_abi",[["impl Clone for AbiFunctionType"],["impl Clone for StateMutability"],["impl Clone for AbiType"],["impl Clone for AbiContract"],["impl Clone for AbiEvent"],["impl Clone for AbiEventField"],["impl Clone for AbiFunction"],["impl Clone for AbiTupleField"]]],["fe_analyzer",[["impl Clone for ContractTypeMethod"],["impl Clone for GlobalFunction"],["impl Clone for Intrinsic"],["impl Clone for ValueMethod"],["impl Clone for AdjustmentKind"],["impl Clone for CallType"],["impl Clone for Constant"],["impl Clone for NamedThing"],["impl Clone for DepLocality"],["impl Clone for EnumVariantKind"],["impl Clone for IngotMode"],["impl Clone for Item"],["impl Clone for ModuleSource"],["impl Clone for TypeDef"],["impl Clone for BlockScopeType"],["impl Clone for Base"],["impl Clone for GenericArg"],["impl Clone for GenericParamKind"],["impl Clone for GenericType"],["impl Clone for Integer"],["impl Clone for TraitOrType"],["impl Clone for Type"],["impl Clone for ConstructorKind"],["impl Clone for LiteralConstructor"],["impl Clone for SimplifiedPatternKind"],["impl Clone for GlobalFunctionIter"],["impl Clone for IntrinsicIter"],["impl Clone for Adjustment"],["impl Clone for DiagnosticVoucher"],["impl Clone for ExpressionAttributes"],["impl Clone for FunctionBody"],["impl Clone for ConstEvalError"],["impl Clone for TypeError"],["impl Clone for Attribute"],["impl Clone for AttributeId"],["impl Clone for Contract"],["impl Clone for ContractField"],["impl Clone for ContractFieldId"],["impl Clone for ContractId"],["impl Clone for DepGraphWrapper"],["impl Clone for Enum"],["impl Clone for EnumId"],["impl Clone for EnumVariant"],["impl Clone for EnumVariantId"],["impl Clone for Function"],["impl Clone for FunctionId"],["impl Clone for FunctionSig"],["impl Clone for FunctionSigId"],["impl Clone for Impl"],["impl Clone for ImplId"],["impl Clone for Ingot"],["impl Clone for IngotId"],["impl Clone for Module"],["impl Clone for ModuleConstant"],["impl Clone for ModuleConstantId"],["impl Clone for ModuleId"],["impl Clone for Struct"],["impl Clone for StructField"],["impl Clone for StructFieldId"],["impl Clone for StructId"],["impl Clone for Trait"],["impl Clone for TraitId"],["impl Clone for TypeAlias"],["impl Clone for TypeAliasId"],["impl Clone for Array"],["impl Clone for CtxDecl"],["impl Clone for FeString"],["impl Clone for FunctionParam"],["impl Clone for FunctionSignature"],["impl Clone for Generic"],["impl Clone for GenericTypeIter"],["impl Clone for IntegerIter"],["impl Clone for Map"],["impl Clone for SelfDecl"],["impl Clone for Tuple"],["impl Clone for TypeId"],["impl Clone for PatternMatrix"],["impl Clone for PatternRowVec"],["impl Clone for SigmaSet"],["impl Clone for SimplifiedPattern"],["impl<T: Clone> Clone for Analysis<T>"]]],["fe_codegen",[["impl Clone for AbiSrcLocation"]]],["fe_common",[["impl Clone for LabelStyle"],["impl Clone for FileKind"],["impl Clone for Radix"],["impl Clone for DependencyKind"],["impl Clone for ProjectMode"],["impl Clone for Diagnostic"],["impl Clone for Label"],["impl Clone for File"],["impl Clone for SourceFileId"],["impl Clone for Span"],["impl Clone for Dependency"],["impl Clone for GitDependency"],["impl Clone for LocalDependency"],["impl<'a> Clone for Literal<'a>"]]],["fe_mir",[["impl Clone for PostIDom"],["impl Clone for CursorLocation"],["impl Clone for ConstantValue"],["impl Clone for Linkage"],["impl Clone for BinOp"],["impl Clone for CallType"],["impl Clone for CastKind"],["impl Clone for InstKind"],["impl Clone for UnOp"],["impl Clone for YulIntrinsicOp"],["impl Clone for TypeKind"],["impl Clone for AssignableValue"],["impl Clone for Value"],["impl Clone for ControlFlowGraph"],["impl Clone for DomTree"],["impl Clone for Loop"],["impl Clone for LoopTree"],["impl Clone for BasicBlock"],["impl Clone for BodyOrder"],["impl Clone for Constant"],["impl Clone for ConstantId"],["impl Clone for BodyDataStore"],["impl Clone for FunctionBody"],["impl Clone for FunctionId"],["impl Clone for FunctionParam"],["impl Clone for FunctionSignature"],["impl Clone for Inst"],["impl Clone for SwitchTable"],["impl Clone for SourceInfo"],["impl Clone for ArrayDef"],["impl Clone for EnumDef"],["impl Clone for EnumVariant"],["impl Clone for EventDef"],["impl Clone for MapDef"],["impl Clone for StructDef"],["impl Clone for TupleDef"],["impl Clone for Type"],["impl Clone for TypeId"],["impl Clone for Local"]]],["fe_parser",[["impl Clone for BinOperator"],["impl Clone for BoolOperator"],["impl Clone for CompOperator"],["impl Clone for ContractStmt"],["impl Clone for Expr"],["impl Clone for FuncStmt"],["impl Clone for FunctionArg"],["impl Clone for GenericArg"],["impl Clone for GenericParameter"],["impl Clone for LiteralPattern"],["impl Clone for ModuleStmt"],["impl Clone for Pattern"],["impl Clone for TypeDesc"],["impl Clone for UnaryOperator"],["impl Clone for UseTree"],["impl Clone for VarDeclTarget"],["impl Clone for VariantKind"],["impl Clone for TokenKind"],["impl Clone for CallArg"],["impl Clone for ConstantDecl"],["impl Clone for Contract"],["impl Clone for Enum"],["impl Clone for Field"],["impl Clone for Function"],["impl Clone for FunctionSignature"],["impl Clone for Impl"],["impl Clone for MatchArm"],["impl Clone for Module"],["impl Clone for Path"],["impl Clone for Pragma"],["impl Clone for Struct"],["impl Clone for Trait"],["impl Clone for TypeAlias"],["impl Clone for Use"],["impl Clone for Variant"],["impl Clone for NodeId"],["impl Clone for ParseFailed"],["impl<'a> Clone for Lexer<'a>"],["impl<'a> Clone for Token<'a>"],["impl<T: Clone> Clone for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[257,2218,24253,314,3930,10770,10802]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/cmp/trait.Eq.js b/compiler-docs/trait.impl/core/cmp/trait.Eq.js new file mode 100644 index 0000000000..741f02b189 --- /dev/null +++ b/compiler-docs/trait.impl/core/cmp/trait.Eq.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Eq for Emit"]]],["fe_abi",[["impl Eq for AbiFunctionType"],["impl Eq for StateMutability"],["impl Eq for AbiType"],["impl Eq for AbiContract"],["impl Eq for AbiEvent"],["impl Eq for AbiEventField"],["impl Eq for AbiFunction"],["impl Eq for AbiTupleField"]]],["fe_analyzer",[["impl Eq for ContractTypeMethod"],["impl Eq for GlobalFunction"],["impl Eq for Intrinsic"],["impl Eq for ValueMethod"],["impl Eq for AdjustmentKind"],["impl Eq for CallType"],["impl Eq for Constant"],["impl Eq for NamedThing"],["impl Eq for BinaryOperationError"],["impl Eq for IndexingError"],["impl Eq for TypeCoercionError"],["impl Eq for DepLocality"],["impl Eq for EnumVariantKind"],["impl Eq for IngotMode"],["impl Eq for Item"],["impl Eq for ModuleSource"],["impl Eq for TypeDef"],["impl Eq for BlockScopeType"],["impl Eq for Base"],["impl Eq for GenericArg"],["impl Eq for GenericParamKind"],["impl Eq for GenericType"],["impl Eq for Integer"],["impl Eq for TraitOrType"],["impl Eq for Type"],["impl Eq for ConstructorKind"],["impl Eq for LiteralConstructor"],["impl Eq for SimplifiedPatternKind"],["impl Eq for Adjustment"],["impl Eq for DiagnosticVoucher"],["impl Eq for ExpressionAttributes"],["impl Eq for FunctionBody"],["impl Eq for ConstEvalError"],["impl Eq for TypeError"],["impl Eq for Attribute"],["impl Eq for AttributeId"],["impl Eq for Contract"],["impl Eq for ContractField"],["impl Eq for ContractFieldId"],["impl Eq for ContractId"],["impl Eq for DepGraphWrapper"],["impl Eq for Enum"],["impl Eq for EnumId"],["impl Eq for EnumVariant"],["impl Eq for EnumVariantId"],["impl Eq for Function"],["impl Eq for FunctionId"],["impl Eq for FunctionSig"],["impl Eq for FunctionSigId"],["impl Eq for Impl"],["impl Eq for ImplId"],["impl Eq for Ingot"],["impl Eq for IngotId"],["impl Eq for Module"],["impl Eq for ModuleConstant"],["impl Eq for ModuleConstantId"],["impl Eq for ModuleId"],["impl Eq for Struct"],["impl Eq for StructField"],["impl Eq for StructFieldId"],["impl Eq for StructId"],["impl Eq for Trait"],["impl Eq for TraitId"],["impl Eq for TypeAlias"],["impl Eq for TypeAliasId"],["impl Eq for Array"],["impl Eq for CtxDecl"],["impl Eq for FeString"],["impl Eq for FunctionParam"],["impl Eq for FunctionSignature"],["impl Eq for Generic"],["impl Eq for Map"],["impl Eq for SelfDecl"],["impl Eq for Tuple"],["impl Eq for TypeId"],["impl Eq for PatternMatrix"],["impl Eq for PatternRowVec"],["impl Eq for SigmaSet"],["impl Eq for SimplifiedPattern"],["impl<T: Eq> Eq for Analysis<T>"]]],["fe_common",[["impl Eq for LabelStyle"],["impl Eq for FileKind"],["impl Eq for Radix"],["impl Eq for ProjectMode"],["impl Eq for Diagnostic"],["impl Eq for Label"],["impl Eq for File"],["impl Eq for SourceFileId"],["impl Eq for Span"]]],["fe_mir",[["impl Eq for PostIDom"],["impl Eq for CursorLocation"],["impl Eq for ConstantValue"],["impl Eq for Linkage"],["impl Eq for BinOp"],["impl Eq for CallType"],["impl Eq for CastKind"],["impl Eq for InstKind"],["impl Eq for UnOp"],["impl Eq for YulIntrinsicOp"],["impl Eq for TypeKind"],["impl Eq for AssignableValue"],["impl Eq for Value"],["impl Eq for ControlFlowGraph"],["impl Eq for Loop"],["impl Eq for BasicBlock"],["impl Eq for BodyOrder"],["impl Eq for Constant"],["impl Eq for ConstantId"],["impl Eq for BodyDataStore"],["impl Eq for FunctionBody"],["impl Eq for FunctionId"],["impl Eq for FunctionParam"],["impl Eq for FunctionSignature"],["impl Eq for Inst"],["impl Eq for SwitchTable"],["impl Eq for SourceInfo"],["impl Eq for ArrayDef"],["impl Eq for EnumDef"],["impl Eq for EnumVariant"],["impl Eq for EventDef"],["impl Eq for MapDef"],["impl Eq for StructDef"],["impl Eq for TupleDef"],["impl Eq for Type"],["impl Eq for TypeId"],["impl Eq for Local"]]],["fe_parser",[["impl Eq for BinOperator"],["impl Eq for BoolOperator"],["impl Eq for CompOperator"],["impl Eq for ContractStmt"],["impl Eq for Expr"],["impl Eq for FuncStmt"],["impl Eq for FunctionArg"],["impl Eq for GenericArg"],["impl Eq for GenericParameter"],["impl Eq for LiteralPattern"],["impl Eq for ModuleStmt"],["impl Eq for Pattern"],["impl Eq for TypeDesc"],["impl Eq for UnaryOperator"],["impl Eq for UseTree"],["impl Eq for VarDeclTarget"],["impl Eq for VariantKind"],["impl Eq for TokenKind"],["impl Eq for CallArg"],["impl Eq for ConstantDecl"],["impl Eq for Contract"],["impl Eq for Enum"],["impl Eq for Field"],["impl Eq for Function"],["impl Eq for FunctionSignature"],["impl Eq for Impl"],["impl Eq for MatchArm"],["impl Eq for Module"],["impl Eq for Path"],["impl Eq for Pragma"],["impl Eq for Struct"],["impl Eq for Trait"],["impl Eq for TypeAlias"],["impl Eq for Use"],["impl Eq for Variant"],["impl Eq for NodeId"],["impl Eq for ParseFailed"],["impl<'a> Eq for Token<'a>"],["impl<T: Eq> Eq for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[244,2114,22863,2336,9714,10001]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/cmp/trait.Ord.js b/compiler-docs/trait.impl/core/cmp/trait.Ord.js new file mode 100644 index 0000000000..0dbbfdf42a --- /dev/null +++ b/compiler-docs/trait.impl/core/cmp/trait.Ord.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Ord for Emit"]]],["fe_analyzer",[["impl Ord for GlobalFunction"],["impl Ord for Intrinsic"],["impl Ord for Item"],["impl Ord for TypeDef"],["impl Ord for Base"],["impl Ord for GenericType"],["impl Ord for Integer"],["impl Ord for AttributeId"],["impl Ord for ContractFieldId"],["impl Ord for ContractId"],["impl Ord for EnumId"],["impl Ord for EnumVariantId"],["impl Ord for FunctionId"],["impl Ord for FunctionSigId"],["impl Ord for ImplId"],["impl Ord for IngotId"],["impl Ord for ModuleConstantId"],["impl Ord for ModuleId"],["impl Ord for StructFieldId"],["impl Ord for StructId"],["impl Ord for TraitId"],["impl Ord for TypeAliasId"],["impl Ord for FeString"],["impl Ord for Generic"],["impl Ord for TypeId"]]],["fe_mir",[["impl Ord for FunctionId"]]],["fe_parser",[["impl Ord for NodeId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[247,7164,286,268]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/cmp/trait.PartialEq.js b/compiler-docs/trait.impl/core/cmp/trait.PartialEq.js new file mode 100644 index 0000000000..93d2099a6b --- /dev/null +++ b/compiler-docs/trait.impl/core/cmp/trait.PartialEq.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl PartialEq for Emit"]]],["fe_abi",[["impl PartialEq for AbiFunctionType"],["impl PartialEq for StateMutability"],["impl PartialEq for AbiType"],["impl PartialEq for AbiContract"],["impl PartialEq for AbiEvent"],["impl PartialEq for AbiEventField"],["impl PartialEq for AbiFunction"],["impl PartialEq for AbiTupleField"]]],["fe_analyzer",[["impl PartialEq for ContractTypeMethod"],["impl PartialEq for GlobalFunction"],["impl PartialEq for Intrinsic"],["impl PartialEq for ValueMethod"],["impl PartialEq for AdjustmentKind"],["impl PartialEq for CallType"],["impl PartialEq for Constant"],["impl PartialEq for NamedThing"],["impl PartialEq for BinaryOperationError"],["impl PartialEq for IndexingError"],["impl PartialEq for TypeCoercionError"],["impl PartialEq for DepLocality"],["impl PartialEq for EnumVariantKind"],["impl PartialEq for IngotMode"],["impl PartialEq for Item"],["impl PartialEq for ModuleSource"],["impl PartialEq for TypeDef"],["impl PartialEq for BlockScopeType"],["impl PartialEq for Base"],["impl PartialEq for GenericArg"],["impl PartialEq for GenericParamKind"],["impl PartialEq for GenericType"],["impl PartialEq for Integer"],["impl PartialEq for TraitOrType"],["impl PartialEq for Type"],["impl PartialEq for ConstructorKind"],["impl PartialEq for LiteralConstructor"],["impl PartialEq for SimplifiedPatternKind"],["impl PartialEq for Adjustment"],["impl PartialEq for DiagnosticVoucher"],["impl PartialEq for ExpressionAttributes"],["impl PartialEq for FunctionBody"],["impl PartialEq for ConstEvalError"],["impl PartialEq for TypeError"],["impl PartialEq for Attribute"],["impl PartialEq for AttributeId"],["impl PartialEq for Contract"],["impl PartialEq for ContractField"],["impl PartialEq for ContractFieldId"],["impl PartialEq for ContractId"],["impl PartialEq for DepGraphWrapper"],["impl PartialEq for Enum"],["impl PartialEq for EnumId"],["impl PartialEq for EnumVariant"],["impl PartialEq for EnumVariantId"],["impl PartialEq for Function"],["impl PartialEq for FunctionId"],["impl PartialEq for FunctionSig"],["impl PartialEq for FunctionSigId"],["impl PartialEq for Impl"],["impl PartialEq for ImplId"],["impl PartialEq for Ingot"],["impl PartialEq for IngotId"],["impl PartialEq for Module"],["impl PartialEq for ModuleConstant"],["impl PartialEq for ModuleConstantId"],["impl PartialEq for ModuleId"],["impl PartialEq for Struct"],["impl PartialEq for StructField"],["impl PartialEq for StructFieldId"],["impl PartialEq for StructId"],["impl PartialEq for Trait"],["impl PartialEq for TraitId"],["impl PartialEq for TypeAlias"],["impl PartialEq for TypeAliasId"],["impl PartialEq for Array"],["impl PartialEq for CtxDecl"],["impl PartialEq for FeString"],["impl PartialEq for FunctionParam"],["impl PartialEq for FunctionSignature"],["impl PartialEq for Generic"],["impl PartialEq for Map"],["impl PartialEq for SelfDecl"],["impl PartialEq for Tuple"],["impl PartialEq for TypeId"],["impl PartialEq for PatternMatrix"],["impl PartialEq for PatternRowVec"],["impl PartialEq for SigmaSet"],["impl PartialEq for SimplifiedPattern"],["impl<T: PartialEq> PartialEq for Analysis<T>"]]],["fe_common",[["impl PartialEq for LabelStyle"],["impl PartialEq for FileKind"],["impl PartialEq for Radix"],["impl PartialEq for ProjectMode"],["impl PartialEq for Diagnostic"],["impl PartialEq for Label"],["impl PartialEq for File"],["impl PartialEq for SourceFileId"],["impl PartialEq for Span"]]],["fe_mir",[["impl PartialEq for PostIDom"],["impl PartialEq for CursorLocation"],["impl PartialEq for ConstantValue"],["impl PartialEq for Linkage"],["impl PartialEq for BinOp"],["impl PartialEq for CallType"],["impl PartialEq for CastKind"],["impl PartialEq for InstKind"],["impl PartialEq for UnOp"],["impl PartialEq for YulIntrinsicOp"],["impl PartialEq for TypeKind"],["impl PartialEq for AssignableValue"],["impl PartialEq for Value"],["impl PartialEq for ControlFlowGraph"],["impl PartialEq for Loop"],["impl PartialEq for BasicBlock"],["impl PartialEq for BodyOrder"],["impl PartialEq for Constant"],["impl PartialEq for ConstantId"],["impl PartialEq for BodyDataStore"],["impl PartialEq for FunctionBody"],["impl PartialEq for FunctionId"],["impl PartialEq for FunctionParam"],["impl PartialEq for FunctionSignature"],["impl PartialEq for Inst"],["impl PartialEq for SwitchTable"],["impl PartialEq for SourceInfo"],["impl PartialEq for ArrayDef"],["impl PartialEq for EnumDef"],["impl PartialEq for EnumVariant"],["impl PartialEq for EventDef"],["impl PartialEq for MapDef"],["impl PartialEq for StructDef"],["impl PartialEq for TupleDef"],["impl PartialEq for Type"],["impl PartialEq for TypeId"],["impl PartialEq for Local"]]],["fe_parser",[["impl PartialEq for BinOperator"],["impl PartialEq for BoolOperator"],["impl PartialEq for CompOperator"],["impl PartialEq for ContractStmt"],["impl PartialEq for Expr"],["impl PartialEq for FuncStmt"],["impl PartialEq for FunctionArg"],["impl PartialEq for GenericArg"],["impl PartialEq for GenericParameter"],["impl PartialEq for LiteralPattern"],["impl PartialEq for ModuleStmt"],["impl PartialEq for Pattern"],["impl PartialEq for TypeDesc"],["impl PartialEq for UnaryOperator"],["impl PartialEq for UseTree"],["impl PartialEq for VarDeclTarget"],["impl PartialEq for VariantKind"],["impl PartialEq for TokenKind"],["impl PartialEq for CallArg"],["impl PartialEq for ConstantDecl"],["impl PartialEq for Contract"],["impl PartialEq for Enum"],["impl PartialEq for Field"],["impl PartialEq for Function"],["impl PartialEq for FunctionSignature"],["impl PartialEq for Impl"],["impl PartialEq for MatchArm"],["impl PartialEq for Module"],["impl PartialEq for Path"],["impl PartialEq for Pragma"],["impl PartialEq for Struct"],["impl PartialEq for Trait"],["impl PartialEq for TypeAlias"],["impl PartialEq for Use"],["impl PartialEq for Variant"],["impl PartialEq for NodeId"],["impl PartialEq for ParseFailed"],["impl<'a> PartialEq for Token<'a>"],["impl<T: PartialEq> PartialEq for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[265,2282,24564,2525,10491,10841]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/cmp/trait.PartialOrd.js b/compiler-docs/trait.impl/core/cmp/trait.PartialOrd.js new file mode 100644 index 0000000000..3fa21c2b52 --- /dev/null +++ b/compiler-docs/trait.impl/core/cmp/trait.PartialOrd.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl PartialOrd for Emit"]]],["fe_analyzer",[["impl PartialOrd for GlobalFunction"],["impl PartialOrd for Intrinsic"],["impl PartialOrd for Item"],["impl PartialOrd for TypeDef"],["impl PartialOrd for Base"],["impl PartialOrd for GenericType"],["impl PartialOrd for Integer"],["impl PartialOrd for AttributeId"],["impl PartialOrd for ContractFieldId"],["impl PartialOrd for ContractId"],["impl PartialOrd for EnumId"],["impl PartialOrd for EnumVariantId"],["impl PartialOrd for FunctionId"],["impl PartialOrd for FunctionSigId"],["impl PartialOrd for ImplId"],["impl PartialOrd for IngotId"],["impl PartialOrd for ModuleConstantId"],["impl PartialOrd for ModuleId"],["impl PartialOrd for StructFieldId"],["impl PartialOrd for StructId"],["impl PartialOrd for TraitId"],["impl PartialOrd for TypeAliasId"],["impl PartialOrd for FeString"],["impl PartialOrd for Generic"],["impl PartialOrd for TypeId"]]],["fe_mir",[["impl PartialOrd for FunctionId"]]],["fe_parser",[["impl PartialOrd for NodeId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[268,7689,307,289]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/convert/trait.AsRef.js b/compiler-docs/trait.impl/core/convert/trait.AsRef.js new file mode 100644 index 0000000000..ffe77d3cda --- /dev/null +++ b/compiler-docs/trait.impl/core/convert/trait.AsRef.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl AsRef<str> for ContractTypeMethod"],["impl AsRef<str> for GlobalFunction"],["impl AsRef<str> for Intrinsic"],["impl AsRef<str> for ValueMethod"],["impl AsRef<str> for GenericType"],["impl AsRef<str> for Integer"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2399]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/convert/trait.From.js b/compiler-docs/trait.impl/core/convert/trait.From.js new file mode 100644 index 0000000000..0fccd7528d --- /dev/null +++ b/compiler-docs/trait.impl/core/convert/trait.From.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl From<Base> for Type"],["impl From<AlreadyDefined> for FatalError"],["impl From<ConstEvalError> for FatalError"],["impl From<ConstEvalError> for TypeError"],["impl From<FatalError> for ConstEvalError"],["impl From<FatalError> for TypeError"],["impl From<IncompleteItem> for ConstEvalError"],["impl From<IncompleteItem> for FatalError"],["impl From<IncompleteItem> for TypeError"],["impl From<TypeError> for ConstEvalError"],["impl From<TypeError> for FatalError"]]],["fe_common",[["impl From<LabelStyle> for LabelStyle"],["impl From<Span> for Range<usize>"]]],["fe_mir",[["impl From<Constant> for ConstantValue"],["impl From<Id<Value>> for AssignableValue"],["impl From<Intrinsic> for YulIntrinsicOp"],["impl<T> From<&Node<T>> for SourceInfo"]]],["fe_parser",[["impl<'a> From<Token<'a>> for Node<SmolStr>"],["impl<T> From<&Node<T>> for NodeId"],["impl<T> From<&Node<T>> for Span"],["impl<T> From<&Box<Node<T>>> for NodeId"],["impl<T> From<&Box<Node<T>>> for Span"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[4775,954,1328,2413]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/convert/trait.TryFrom.js b/compiler-docs/trait.impl/core/convert/trait.TryFrom.js new file mode 100644 index 0000000000..01653698b6 --- /dev/null +++ b/compiler-docs/trait.impl/core/convert/trait.TryFrom.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl TryFrom<&str> for ContractTypeMethod"],["impl TryFrom<&str> for GlobalFunction"],["impl TryFrom<&str> for Intrinsic"],["impl TryFrom<&str> for ValueMethod"],["impl TryFrom<&str> for GenericType"],["impl TryFrom<&str> for Integer"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2465]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/default/trait.Default.js b/compiler-docs/trait.impl/core/default/trait.Default.js new file mode 100644 index 0000000000..0ea01ffc27 --- /dev/null +++ b/compiler-docs/trait.impl/core/default/trait.Default.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Default for FunctionBody"],["impl Default for TempContext"],["impl Default for AllImplsQuery"],["impl Default for ContractAllFieldsQuery"],["impl Default for ContractAllFunctionsQuery"],["impl Default for ContractCallFunctionQuery"],["impl Default for ContractDependencyGraphQuery"],["impl Default for ContractFieldMapQuery"],["impl Default for ContractFieldTypeQuery"],["impl Default for ContractFunctionMapQuery"],["impl Default for ContractInitFunctionQuery"],["impl Default for ContractPublicFunctionMapQuery"],["impl Default for ContractRuntimeDependencyGraphQuery"],["impl Default for EnumAllFunctionsQuery"],["impl Default for EnumAllVariantsQuery"],["impl Default for EnumDependencyGraphQuery"],["impl Default for EnumFunctionMapQuery"],["impl Default for EnumVariantKindQuery"],["impl Default for EnumVariantMapQuery"],["impl Default for FunctionBodyQuery"],["impl Default for FunctionDependencyGraphQuery"],["impl Default for FunctionSignatureQuery"],["impl Default for FunctionSigsQuery"],["impl Default for ImplAllFunctionsQuery"],["impl Default for ImplForQuery"],["impl Default for ImplFunctionMapQuery"],["impl Default for IngotExternalIngotsQuery"],["impl Default for IngotFilesQuery"],["impl Default for IngotModulesQuery"],["impl Default for IngotRootModuleQuery"],["impl Default for InternAttributeLookupQuery"],["impl Default for InternAttributeQuery"],["impl Default for InternContractFieldLookupQuery"],["impl Default for InternContractFieldQuery"],["impl Default for InternContractLookupQuery"],["impl Default for InternContractQuery"],["impl Default for InternEnumLookupQuery"],["impl Default for InternEnumQuery"],["impl Default for InternEnumVariantLookupQuery"],["impl Default for InternEnumVariantQuery"],["impl Default for InternFunctionLookupQuery"],["impl Default for InternFunctionQuery"],["impl Default for InternFunctionSigLookupQuery"],["impl Default for InternFunctionSigQuery"],["impl Default for InternImplLookupQuery"],["impl Default for InternImplQuery"],["impl Default for InternIngotLookupQuery"],["impl Default for InternIngotQuery"],["impl Default for InternModuleConstLookupQuery"],["impl Default for InternModuleConstQuery"],["impl Default for InternModuleLookupQuery"],["impl Default for InternModuleQuery"],["impl Default for InternStructFieldLookupQuery"],["impl Default for InternStructFieldQuery"],["impl Default for InternStructLookupQuery"],["impl Default for InternStructQuery"],["impl Default for InternTraitLookupQuery"],["impl Default for InternTraitQuery"],["impl Default for InternTypeAliasLookupQuery"],["impl Default for InternTypeAliasQuery"],["impl Default for InternTypeLookupQuery"],["impl Default for InternTypeQuery"],["impl Default for ModuleAllImplsQuery"],["impl Default for ModuleAllItemsQuery"],["impl Default for ModuleConstantTypeQuery"],["impl Default for ModuleConstantValueQuery"],["impl Default for ModuleConstantsQuery"],["impl Default for ModuleContractsQuery"],["impl Default for ModuleFilePathQuery"],["impl Default for ModuleImplMapQuery"],["impl Default for ModuleIsIncompleteQuery"],["impl Default for ModuleItemMapQuery"],["impl Default for ModuleParentModuleQuery"],["impl Default for ModuleParseQuery"],["impl Default for ModuleStructsQuery"],["impl Default for ModuleSubmodulesQuery"],["impl Default for ModuleTestsQuery"],["impl Default for ModuleUsedItemMapQuery"],["impl Default for RootIngotQuery"],["impl Default for StructAllFieldsQuery"],["impl Default for StructAllFunctionsQuery"],["impl Default for StructDependencyGraphQuery"],["impl Default for StructFieldMapQuery"],["impl Default for StructFieldTypeQuery"],["impl Default for StructFunctionMapQuery"],["impl Default for TestDb"],["impl Default for TraitAllFunctionsQuery"],["impl Default for TraitFunctionMapQuery"],["impl Default for TraitIsImplementedForQuery"],["impl Default for TypeAliasTypeQuery"],["impl Default for AttributeId"],["impl Default for EnumId"],["impl Default for ImplId"],["impl Default for StructId"],["impl Default for TraitId"],["impl Default for TypeId"]]],["fe_codegen",[["impl Default for CodegenAbiContractQuery"],["impl Default for CodegenAbiEventQuery"],["impl Default for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl Default for CodegenAbiFunctionQuery"],["impl Default for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl Default for CodegenAbiModuleEventsQuery"],["impl Default for CodegenAbiTypeMaximumSizeQuery"],["impl Default for CodegenAbiTypeMinimumSizeQuery"],["impl Default for CodegenAbiTypeQuery"],["impl Default for CodegenConstantStringSymbolNameQuery"],["impl Default for CodegenContractDeployerSymbolNameQuery"],["impl Default for CodegenContractSymbolNameQuery"],["impl Default for CodegenFunctionSymbolNameQuery"],["impl Default for CodegenLegalizedBodyQuery"],["impl Default for CodegenLegalizedSignatureQuery"],["impl Default for CodegenLegalizedTypeQuery"],["impl Default for Db"],["impl Default for Context"],["impl Default for DefaultRuntimeProvider"]]],["fe_common",[["impl Default for FileContentQuery"],["impl Default for FileLineStartsQuery"],["impl Default for FileNameQuery"],["impl Default for InternFileLookupQuery"],["impl Default for InternFileQuery"],["impl Default for TestDb"]]],["fe_compiler_test_utils",[["impl Default for GasReporter"],["impl Default for Runtime"]]],["fe_mir",[["impl Default for DFSet"],["impl Default for LoopTree"],["impl Default for MirInternConstLookupQuery"],["impl Default for MirInternConstQuery"],["impl Default for MirInternFunctionLookupQuery"],["impl Default for MirInternFunctionQuery"],["impl Default for MirInternTypeLookupQuery"],["impl Default for MirInternTypeQuery"],["impl Default for MirLowerContractAllFunctionsQuery"],["impl Default for MirLowerEnumAllFunctionsQuery"],["impl Default for MirLowerModuleAllFunctionsQuery"],["impl Default for MirLowerStructAllFunctionsQuery"],["impl Default for MirLoweredConstantQuery"],["impl Default for MirLoweredFuncBodyQuery"],["impl Default for MirLoweredFuncSignatureQuery"],["impl Default for MirLoweredMonomorphizedFuncSignatureQuery"],["impl Default for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl Default for MirLoweredTypeQuery"],["impl Default for NewDb"],["impl Default for BodyDataStore"],["impl Default for SwitchTable"]]],["fe_parser",[["impl Default for NodeId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[30367,6351,1786,621,6678,288]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/error/trait.Error.js b/compiler-docs/trait.impl/core/error/trait.Error.js new file mode 100644 index 0000000000..e03787f01d --- /dev/null +++ b/compiler-docs/trait.impl/core/error/trait.Error.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_compiler_test_utils",[["impl Error for SolidityCompileError"]]],["fe_parser",[["impl Error for ParseFailed"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[347,282]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/fmt/trait.Debug.js b/compiler-docs/trait.impl/core/fmt/trait.Debug.js new file mode 100644 index 0000000000..89a68b5186 --- /dev/null +++ b/compiler-docs/trait.impl/core/fmt/trait.Debug.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Debug for Emit"]]],["fe_abi",[["impl Debug for AbiFunctionType"],["impl Debug for StateMutability"],["impl Debug for AbiType"],["impl Debug for AbiContract"],["impl Debug for AbiEvent"],["impl Debug for AbiEventField"],["impl Debug for AbiFunction"],["impl Debug for AbiTupleField"]]],["fe_analyzer",[["impl Debug for ContractTypeMethod"],["impl Debug for GlobalFunction"],["impl Debug for Intrinsic"],["impl Debug for ValueMethod"],["impl Debug for AdjustmentKind"],["impl Debug for CallType"],["impl Debug for Constant"],["impl Debug for NamedThing"],["impl Debug for BinaryOperationError"],["impl Debug for IndexingError"],["impl Debug for TypeCoercionError"],["impl Debug for DepLocality"],["impl Debug for EnumVariantKind"],["impl Debug for IngotMode"],["impl Debug for Item"],["impl Debug for ModuleSource"],["impl Debug for TypeDef"],["impl Debug for BlockScopeType"],["impl Debug for Base"],["impl Debug for GenericArg"],["impl Debug for GenericParamKind"],["impl Debug for GenericType"],["impl Debug for Integer"],["impl Debug for TraitOrType"],["impl Debug for Type"],["impl Debug for ConstructorKind"],["impl Debug for LiteralConstructor"],["impl Debug for SimplifiedPatternKind"],["impl Debug for Adjustment"],["impl Debug for DiagnosticVoucher"],["impl Debug for ExpressionAttributes"],["impl Debug for FunctionBody"],["impl Debug for AllImplsQuery"],["impl Debug for ContractAllFieldsQuery"],["impl Debug for ContractAllFunctionsQuery"],["impl Debug for ContractCallFunctionQuery"],["impl Debug for ContractDependencyGraphQuery"],["impl Debug for ContractFieldMapQuery"],["impl Debug for ContractFieldTypeQuery"],["impl Debug for ContractFunctionMapQuery"],["impl Debug for ContractInitFunctionQuery"],["impl Debug for ContractPublicFunctionMapQuery"],["impl Debug for ContractRuntimeDependencyGraphQuery"],["impl Debug for EnumAllFunctionsQuery"],["impl Debug for EnumAllVariantsQuery"],["impl Debug for EnumDependencyGraphQuery"],["impl Debug for EnumFunctionMapQuery"],["impl Debug for EnumVariantKindQuery"],["impl Debug for EnumVariantMapQuery"],["impl Debug for FunctionBodyQuery"],["impl Debug for FunctionDependencyGraphQuery"],["impl Debug for FunctionSignatureQuery"],["impl Debug for FunctionSigsQuery"],["impl Debug for ImplAllFunctionsQuery"],["impl Debug for ImplForQuery"],["impl Debug for ImplFunctionMapQuery"],["impl Debug for IngotExternalIngotsQuery"],["impl Debug for IngotFilesQuery"],["impl Debug for IngotModulesQuery"],["impl Debug for IngotRootModuleQuery"],["impl Debug for InternAttributeLookupQuery"],["impl Debug for InternAttributeQuery"],["impl Debug for InternContractFieldLookupQuery"],["impl Debug for InternContractFieldQuery"],["impl Debug for InternContractLookupQuery"],["impl Debug for InternContractQuery"],["impl Debug for InternEnumLookupQuery"],["impl Debug for InternEnumQuery"],["impl Debug for InternEnumVariantLookupQuery"],["impl Debug for InternEnumVariantQuery"],["impl Debug for InternFunctionLookupQuery"],["impl Debug for InternFunctionQuery"],["impl Debug for InternFunctionSigLookupQuery"],["impl Debug for InternFunctionSigQuery"],["impl Debug for InternImplLookupQuery"],["impl Debug for InternImplQuery"],["impl Debug for InternIngotLookupQuery"],["impl Debug for InternIngotQuery"],["impl Debug for InternModuleConstLookupQuery"],["impl Debug for InternModuleConstQuery"],["impl Debug for InternModuleLookupQuery"],["impl Debug for InternModuleQuery"],["impl Debug for InternStructFieldLookupQuery"],["impl Debug for InternStructFieldQuery"],["impl Debug for InternStructLookupQuery"],["impl Debug for InternStructQuery"],["impl Debug for InternTraitLookupQuery"],["impl Debug for InternTraitQuery"],["impl Debug for InternTypeAliasLookupQuery"],["impl Debug for InternTypeAliasQuery"],["impl Debug for InternTypeLookupQuery"],["impl Debug for InternTypeQuery"],["impl Debug for ModuleAllImplsQuery"],["impl Debug for ModuleAllItemsQuery"],["impl Debug for ModuleConstantTypeQuery"],["impl Debug for ModuleConstantValueQuery"],["impl Debug for ModuleConstantsQuery"],["impl Debug for ModuleContractsQuery"],["impl Debug for ModuleFilePathQuery"],["impl Debug for ModuleImplMapQuery"],["impl Debug for ModuleIsIncompleteQuery"],["impl Debug for ModuleItemMapQuery"],["impl Debug for ModuleParentModuleQuery"],["impl Debug for ModuleParseQuery"],["impl Debug for ModuleStructsQuery"],["impl Debug for ModuleSubmodulesQuery"],["impl Debug for ModuleTestsQuery"],["impl Debug for ModuleUsedItemMapQuery"],["impl Debug for RootIngotQuery"],["impl Debug for StructAllFieldsQuery"],["impl Debug for StructAllFunctionsQuery"],["impl Debug for StructDependencyGraphQuery"],["impl Debug for StructFieldMapQuery"],["impl Debug for StructFieldTypeQuery"],["impl Debug for StructFunctionMapQuery"],["impl Debug for TraitAllFunctionsQuery"],["impl Debug for TraitFunctionMapQuery"],["impl Debug for TraitIsImplementedForQuery"],["impl Debug for TypeAliasTypeQuery"],["impl Debug for AlreadyDefined"],["impl Debug for ConstEvalError"],["impl Debug for FatalError"],["impl Debug for IncompleteItem"],["impl Debug for TypeError"],["impl Debug for Attribute"],["impl Debug for AttributeId"],["impl Debug for Contract"],["impl Debug for ContractField"],["impl Debug for ContractFieldId"],["impl Debug for ContractId"],["impl Debug for DepGraphWrapper"],["impl Debug for Enum"],["impl Debug for EnumId"],["impl Debug for EnumVariant"],["impl Debug for EnumVariantId"],["impl Debug for Function"],["impl Debug for FunctionId"],["impl Debug for FunctionSig"],["impl Debug for FunctionSigId"],["impl Debug for Impl"],["impl Debug for ImplId"],["impl Debug for Ingot"],["impl Debug for IngotId"],["impl Debug for Module"],["impl Debug for ModuleConstant"],["impl Debug for ModuleConstantId"],["impl Debug for ModuleId"],["impl Debug for Struct"],["impl Debug for StructField"],["impl Debug for StructFieldId"],["impl Debug for StructId"],["impl Debug for Trait"],["impl Debug for TraitId"],["impl Debug for TypeAlias"],["impl Debug for TypeAliasId"],["impl Debug for Array"],["impl Debug for CtxDecl"],["impl Debug for FeString"],["impl Debug for FunctionParam"],["impl Debug for FunctionSignature"],["impl Debug for Generic"],["impl Debug for Map"],["impl Debug for SelfDecl"],["impl Debug for Tuple"],["impl Debug for TypeId"],["impl Debug for PatternMatrix"],["impl Debug for PatternRowVec"],["impl Debug for SigmaSet"],["impl Debug for SimplifiedPattern"],["impl<T: Debug> Debug for Analysis<T>"]]],["fe_codegen",[["impl Debug for AbiSrcLocation"],["impl Debug for CodegenAbiContractQuery"],["impl Debug for CodegenAbiEventQuery"],["impl Debug for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl Debug for CodegenAbiFunctionQuery"],["impl Debug for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl Debug for CodegenAbiModuleEventsQuery"],["impl Debug for CodegenAbiTypeMaximumSizeQuery"],["impl Debug for CodegenAbiTypeMinimumSizeQuery"],["impl Debug for CodegenAbiTypeQuery"],["impl Debug for CodegenConstantStringSymbolNameQuery"],["impl Debug for CodegenContractDeployerSymbolNameQuery"],["impl Debug for CodegenContractSymbolNameQuery"],["impl Debug for CodegenFunctionSymbolNameQuery"],["impl Debug for CodegenLegalizedBodyQuery"],["impl Debug for CodegenLegalizedSignatureQuery"],["impl Debug for CodegenLegalizedTypeQuery"],["impl Debug for DefaultRuntimeProvider"]]],["fe_common",[["impl Debug for LabelStyle"],["impl Debug for FileKind"],["impl Debug for Radix"],["impl Debug for FileContentQuery"],["impl Debug for FileLineStartsQuery"],["impl Debug for FileNameQuery"],["impl Debug for InternFileLookupQuery"],["impl Debug for InternFileQuery"],["impl Debug for Diagnostic"],["impl Debug for Label"],["impl Debug for File"],["impl Debug for SourceFileId"],["impl Debug for Span"],["impl<'a> Debug for Literal<'a>"]]],["fe_compiler_test_utils",[["impl Debug for GasRecord"],["impl Debug for GasReporter"],["impl Debug for SolidityCompileError"]]],["fe_driver",[["impl Debug for CompileError"]]],["fe_mir",[["impl Debug for PostIDom"],["impl Debug for CursorLocation"],["impl Debug for ConstantValue"],["impl Debug for Linkage"],["impl Debug for BinOp"],["impl Debug for CallType"],["impl Debug for CastKind"],["impl Debug for InstKind"],["impl Debug for UnOp"],["impl Debug for YulIntrinsicOp"],["impl Debug for TypeKind"],["impl Debug for AssignableValue"],["impl Debug for Value"],["impl Debug for ControlFlowGraph"],["impl Debug for DFSet"],["impl Debug for DomTree"],["impl Debug for Loop"],["impl Debug for LoopTree"],["impl Debug for PostDomTree"],["impl Debug for MirInternConstLookupQuery"],["impl Debug for MirInternConstQuery"],["impl Debug for MirInternFunctionLookupQuery"],["impl Debug for MirInternFunctionQuery"],["impl Debug for MirInternTypeLookupQuery"],["impl Debug for MirInternTypeQuery"],["impl Debug for MirLowerContractAllFunctionsQuery"],["impl Debug for MirLowerEnumAllFunctionsQuery"],["impl Debug for MirLowerModuleAllFunctionsQuery"],["impl Debug for MirLowerStructAllFunctionsQuery"],["impl Debug for MirLoweredConstantQuery"],["impl Debug for MirLoweredFuncBodyQuery"],["impl Debug for MirLoweredFuncSignatureQuery"],["impl Debug for MirLoweredMonomorphizedFuncSignatureQuery"],["impl Debug for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl Debug for MirLoweredTypeQuery"],["impl Debug for BasicBlock"],["impl Debug for BodyBuilder"],["impl Debug for BodyOrder"],["impl Debug for Constant"],["impl Debug for ConstantId"],["impl Debug for BodyDataStore"],["impl Debug for FunctionBody"],["impl Debug for FunctionId"],["impl Debug for FunctionParam"],["impl Debug for FunctionSignature"],["impl Debug for Inst"],["impl Debug for SwitchTable"],["impl Debug for SourceInfo"],["impl Debug for ArrayDef"],["impl Debug for EnumDef"],["impl Debug for EnumVariant"],["impl Debug for EventDef"],["impl Debug for MapDef"],["impl Debug for StructDef"],["impl Debug for TupleDef"],["impl Debug for Type"],["impl Debug for TypeId"],["impl Debug for Local"]]],["fe_parser",[["impl Debug for BinOperator"],["impl Debug for BoolOperator"],["impl Debug for CompOperator"],["impl Debug for ContractStmt"],["impl Debug for Expr"],["impl Debug for FuncStmt"],["impl Debug for FunctionArg"],["impl Debug for GenericArg"],["impl Debug for GenericParameter"],["impl Debug for LiteralPattern"],["impl Debug for ModuleStmt"],["impl Debug for Pattern"],["impl Debug for TypeDesc"],["impl Debug for UnaryOperator"],["impl Debug for UseTree"],["impl Debug for VarDeclTarget"],["impl Debug for VariantKind"],["impl Debug for TokenKind"],["impl Debug for CallArg"],["impl Debug for ConstantDecl"],["impl Debug for Contract"],["impl Debug for Enum"],["impl Debug for Field"],["impl Debug for Function"],["impl Debug for FunctionSignature"],["impl Debug for Impl"],["impl Debug for MatchArm"],["impl Debug for Module"],["impl Debug for Path"],["impl Debug for Pragma"],["impl Debug for Struct"],["impl Debug for Trait"],["impl Debug for TypeAlias"],["impl Debug for Use"],["impl Debug for Variant"],["impl Debug for NodeId"],["impl Debug for ParseFailed"],["impl<'a> Debug for Token<'a>"],["impl<T: Debug> Debug for Node<T>"]]],["fe_test_runner",[["impl Debug for TestSink"]]],["fe_yulc",[["impl Debug for YulcError"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[253,2186,50895,5845,3854,914,281,16483,10361,284,266]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/fmt/trait.Display.js b/compiler-docs/trait.impl/core/fmt/trait.Display.js new file mode 100644 index 0000000000..0b5a12a90a --- /dev/null +++ b/compiler-docs/trait.impl/core/fmt/trait.Display.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Display for CallType"],["impl Display for Base"],["impl Display for Integer"],["impl Display for FeString"],["impl Display for Generic"],["impl<T: DisplayWithDb> Display for DisplayableWrapper<'_, T>"]]],["fe_common",[["impl Display for Diff"]]],["fe_compiler_test_utils",[["impl Display for GasReporter"],["impl Display for SolidityCompileError"]]],["fe_mir",[["impl Display for BinOp"],["impl Display for CallType"],["impl Display for UnOp"],["impl Display for YulIntrinsicOp"]]],["fe_parser",[["impl Display for BinOperator"],["impl Display for BoolOperator"],["impl Display for CompOperator"],["impl Display for ContractStmt"],["impl Display for Expr"],["impl Display for FuncStmt"],["impl Display for FunctionArg"],["impl Display for GenericArg"],["impl Display for GenericParameter"],["impl Display for LiteralPattern"],["impl Display for ModuleStmt"],["impl Display for Pattern"],["impl Display for TypeDesc"],["impl Display for UnaryOperator"],["impl Display for UseTree"],["impl Display for VarDeclTarget"],["impl Display for CallArg"],["impl Display for ConstantDecl"],["impl Display for Contract"],["impl Display for Enum"],["impl Display for Field"],["impl Display for Function"],["impl Display for Impl"],["impl Display for MatchArm"],["impl Display for Module"],["impl Display for Path"],["impl Display for Pragma"],["impl Display for Struct"],["impl Display for Trait"],["impl Display for TypeAlias"],["impl Display for Use"],["impl Display for Variant"],["impl Display for Node<Function>"],["impl Display for ParseFailed"]]],["fe_test_runner",[["impl Display for TestSink"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1925,285,644,1070,9190,290]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/hash/trait.Hash.js b/compiler-docs/trait.impl/core/hash/trait.Hash.js new file mode 100644 index 0000000000..412556a2df --- /dev/null +++ b/compiler-docs/trait.impl/core/hash/trait.Hash.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Hash for GlobalFunction"],["impl Hash for Intrinsic"],["impl Hash for ValueMethod"],["impl Hash for EnumVariantKind"],["impl Hash for IngotMode"],["impl Hash for Item"],["impl Hash for ModuleSource"],["impl Hash for TypeDef"],["impl Hash for Base"],["impl Hash for GenericArg"],["impl Hash for GenericParamKind"],["impl Hash for GenericType"],["impl Hash for Integer"],["impl Hash for TraitOrType"],["impl Hash for Type"],["impl Hash for ConstructorKind"],["impl Hash for LiteralConstructor"],["impl Hash for DiagnosticVoucher"],["impl Hash for ConstEvalError"],["impl Hash for TypeError"],["impl Hash for Attribute"],["impl Hash for AttributeId"],["impl Hash for Contract"],["impl Hash for ContractField"],["impl Hash for ContractFieldId"],["impl Hash for ContractId"],["impl Hash for Enum"],["impl Hash for EnumId"],["impl Hash for EnumVariant"],["impl Hash for EnumVariantId"],["impl Hash for Function"],["impl Hash for FunctionId"],["impl Hash for FunctionSig"],["impl Hash for FunctionSigId"],["impl Hash for Impl"],["impl Hash for ImplId"],["impl Hash for Ingot"],["impl Hash for IngotId"],["impl Hash for Module"],["impl Hash for ModuleConstant"],["impl Hash for ModuleConstantId"],["impl Hash for ModuleId"],["impl Hash for Struct"],["impl Hash for StructField"],["impl Hash for StructFieldId"],["impl Hash for StructId"],["impl Hash for Trait"],["impl Hash for TraitId"],["impl Hash for TypeAlias"],["impl Hash for TypeAliasId"],["impl Hash for Array"],["impl Hash for CtxDecl"],["impl Hash for FeString"],["impl Hash for FunctionParam"],["impl Hash for FunctionSignature"],["impl Hash for Generic"],["impl Hash for Map"],["impl Hash for SelfDecl"],["impl Hash for Tuple"],["impl Hash for TypeId"],["impl<T: Hash> Hash for Analysis<T>"]]],["fe_common",[["impl Hash for LabelStyle"],["impl Hash for FileKind"],["impl Hash for Diagnostic"],["impl Hash for Label"],["impl Hash for File"],["impl Hash for SourceFileId"],["impl Hash for Span"]]],["fe_mir",[["impl Hash for ConstantValue"],["impl Hash for Linkage"],["impl Hash for BinOp"],["impl Hash for CallType"],["impl Hash for CastKind"],["impl Hash for InstKind"],["impl Hash for UnOp"],["impl Hash for YulIntrinsicOp"],["impl Hash for TypeKind"],["impl Hash for AssignableValue"],["impl Hash for Value"],["impl Hash for BasicBlock"],["impl Hash for Constant"],["impl Hash for ConstantId"],["impl Hash for FunctionId"],["impl Hash for FunctionParam"],["impl Hash for FunctionSignature"],["impl Hash for Inst"],["impl Hash for SwitchTable"],["impl Hash for SourceInfo"],["impl Hash for ArrayDef"],["impl Hash for EnumDef"],["impl Hash for EnumVariant"],["impl Hash for EventDef"],["impl Hash for MapDef"],["impl Hash for StructDef"],["impl Hash for TupleDef"],["impl Hash for Type"],["impl Hash for TypeId"],["impl Hash for Local"]]],["fe_parser",[["impl Hash for BinOperator"],["impl Hash for BoolOperator"],["impl Hash for CompOperator"],["impl Hash for ContractStmt"],["impl Hash for Expr"],["impl Hash for FuncStmt"],["impl Hash for FunctionArg"],["impl Hash for GenericArg"],["impl Hash for GenericParameter"],["impl Hash for LiteralPattern"],["impl Hash for ModuleStmt"],["impl Hash for Pattern"],["impl Hash for TypeDesc"],["impl Hash for UnaryOperator"],["impl Hash for UseTree"],["impl Hash for VarDeclTarget"],["impl Hash for VariantKind"],["impl Hash for CallArg"],["impl Hash for ConstantDecl"],["impl Hash for Contract"],["impl Hash for Enum"],["impl Hash for Field"],["impl Hash for Function"],["impl Hash for FunctionSignature"],["impl Hash for Impl"],["impl Hash for MatchArm"],["impl Hash for Module"],["impl Hash for Path"],["impl Hash for Pragma"],["impl Hash for Struct"],["impl Hash for Trait"],["impl Hash for TypeAlias"],["impl Hash for Use"],["impl Hash for Variant"],["impl Hash for NodeId"],["impl Hash for ParseFailed"],["impl<T: Hash> Hash for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[17920,1873,8012,9783]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/iter/traits/collect/trait.IntoIterator.js b/compiler-docs/trait.impl/core/iter/traits/collect/trait.IntoIterator.js new file mode 100644 index 0000000000..3d20b8b3e4 --- /dev/null +++ b/compiler-docs/trait.impl/core/iter/traits/collect/trait.IntoIterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl IntoIterator for SigmaSet"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[364]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/iter/traits/double_ended/trait.DoubleEndedIterator.js b/compiler-docs/trait.impl/core/iter/traits/double_ended/trait.DoubleEndedIterator.js new file mode 100644 index 0000000000..0dbc47682d --- /dev/null +++ b/compiler-docs/trait.impl/core/iter/traits/double_ended/trait.DoubleEndedIterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl DoubleEndedIterator for GlobalFunctionIter"],["impl DoubleEndedIterator for IntrinsicIter"],["impl DoubleEndedIterator for GenericTypeIter"],["impl DoubleEndedIterator for IntegerIter"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1570]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/iter/traits/exact_size/trait.ExactSizeIterator.js b/compiler-docs/trait.impl/core/iter/traits/exact_size/trait.ExactSizeIterator.js new file mode 100644 index 0000000000..b803a61272 --- /dev/null +++ b/compiler-docs/trait.impl/core/iter/traits/exact_size/trait.ExactSizeIterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl ExactSizeIterator for GlobalFunctionIter"],["impl ExactSizeIterator for IntrinsicIter"],["impl ExactSizeIterator for GenericTypeIter"],["impl ExactSizeIterator for IntegerIter"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1530]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/iter/traits/iterator/trait.Iterator.js b/compiler-docs/trait.impl/core/iter/traits/iterator/trait.Iterator.js new file mode 100644 index 0000000000..05081a2b2c --- /dev/null +++ b/compiler-docs/trait.impl/core/iter/traits/iterator/trait.Iterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Iterator for GlobalFunctionIter"],["impl Iterator for IntrinsicIter"],["impl Iterator for GenericTypeIter"],["impl Iterator for IntegerIter"]]],["fe_mir",[["impl<'a> Iterator for CfgPostOrder<'a>"],["impl<'a, 'b> Iterator for BlocksInLoopPostOrder<'a, 'b>"],["impl<'a, T> Iterator for IterBase<'a, T>
where\n T: Copy,
"],["impl<'a, T> Iterator for IterMutBase<'a, T>"]]],["fe_parser",[["impl<'a> Iterator for Lexer<'a>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1406,1607,338]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Copy.js b/compiler-docs/trait.impl/core/marker/trait.Copy.js new file mode 100644 index 0000000000..ca4d19edf1 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Copy.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Copy for Emit"]]],["fe_abi",[["impl Copy for AbiFunctionType"]]],["fe_analyzer",[["impl Copy for ContractTypeMethod"],["impl Copy for GlobalFunction"],["impl Copy for Intrinsic"],["impl Copy for ValueMethod"],["impl Copy for AdjustmentKind"],["impl Copy for DepLocality"],["impl Copy for IngotMode"],["impl Copy for Item"],["impl Copy for TypeDef"],["impl Copy for Base"],["impl Copy for GenericParamKind"],["impl Copy for GenericType"],["impl Copy for Integer"],["impl Copy for ConstructorKind"],["impl Copy for LiteralConstructor"],["impl Copy for Adjustment"],["impl Copy for AttributeId"],["impl Copy for ContractFieldId"],["impl Copy for ContractId"],["impl Copy for EnumId"],["impl Copy for EnumVariantId"],["impl Copy for FunctionId"],["impl Copy for FunctionSigId"],["impl Copy for ImplId"],["impl Copy for IngotId"],["impl Copy for ModuleConstantId"],["impl Copy for ModuleId"],["impl Copy for StructFieldId"],["impl Copy for StructId"],["impl Copy for TraitId"],["impl Copy for TypeAliasId"],["impl Copy for Array"],["impl Copy for CtxDecl"],["impl Copy for FeString"],["impl Copy for SelfDecl"],["impl Copy for TypeId"]]],["fe_codegen",[["impl Copy for AbiSrcLocation"]]],["fe_common",[["impl Copy for LabelStyle"],["impl Copy for FileKind"],["impl Copy for Radix"],["impl Copy for ProjectMode"],["impl Copy for SourceFileId"],["impl Copy for Span"]]],["fe_mir",[["impl Copy for PostIDom"],["impl Copy for CursorLocation"],["impl Copy for Linkage"],["impl Copy for BinOp"],["impl Copy for CallType"],["impl Copy for UnOp"],["impl Copy for YulIntrinsicOp"],["impl Copy for BasicBlock"],["impl Copy for ConstantId"],["impl Copy for FunctionId"],["impl Copy for MapDef"],["impl Copy for TypeId"]]],["fe_parser",[["impl Copy for BinOperator"],["impl Copy for BoolOperator"],["impl Copy for CompOperator"],["impl Copy for LiteralPattern"],["impl Copy for UnaryOperator"],["impl Copy for TokenKind"],["impl Copy for NodeId"],["impl Copy for ParseFailed"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[256,297,10654,313,1628,3289,2169]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Freeze.js b/compiler-docs/trait.impl/core/marker/trait.Freeze.js new file mode 100644 index 0000000000..33f2a6af3a --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Freeze.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Freeze for Emit",1,["fe::task::build::Emit"]],["impl Freeze for Commands",1,["fe::task::Commands"]],["impl Freeze for FelangCli",1,["fe::FelangCli"]],["impl Freeze for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl Freeze for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl Freeze for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl Freeze for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl Freeze for CtxParam",1,["fe_abi::function::CtxParam"]],["impl Freeze for SelfParam",1,["fe_abi::function::SelfParam"]],["impl Freeze for StateMutability",1,["fe_abi::function::StateMutability"]],["impl Freeze for AbiType",1,["fe_abi::types::AbiType"]],["impl Freeze for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl Freeze for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl Freeze for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl Freeze for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl Freeze for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl Freeze for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl Freeze for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl !Freeze for TempContext",1,["fe_analyzer::context::TempContext"]],["impl !Freeze for TestDb",1,["fe_analyzer::db::TestDb"]],["impl Freeze for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl Freeze for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl Freeze for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl Freeze for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl Freeze for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl Freeze for CallType",1,["fe_analyzer::context::CallType"]],["impl Freeze for Constant",1,["fe_analyzer::context::Constant"]],["impl Freeze for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl Freeze for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl Freeze for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl Freeze for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl Freeze for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl Freeze for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl Freeze for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl Freeze for Item",1,["fe_analyzer::namespace::items::Item"]],["impl Freeze for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl Freeze for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl Freeze for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl Freeze for Base",1,["fe_analyzer::namespace::types::Base"]],["impl Freeze for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl Freeze for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl Freeze for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl Freeze for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl Freeze for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl Freeze for Type",1,["fe_analyzer::namespace::types::Type"]],["impl Freeze for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl Freeze for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl Freeze for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl Freeze for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl Freeze for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl Freeze for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl Freeze for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl Freeze for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl Freeze for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl Freeze for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl Freeze for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl Freeze for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl Freeze for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl Freeze for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl Freeze for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl Freeze for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl Freeze for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl Freeze for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl Freeze for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl Freeze for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl Freeze for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl Freeze for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl Freeze for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl Freeze for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl Freeze for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl Freeze for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl Freeze for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl Freeze for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl Freeze for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl Freeze for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl Freeze for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl Freeze for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl Freeze for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl Freeze for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl Freeze for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl Freeze for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl Freeze for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl Freeze for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl Freeze for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl Freeze for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl Freeze for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl Freeze for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl Freeze for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl Freeze for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl Freeze for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl Freeze for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl Freeze for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl Freeze for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl Freeze for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl Freeze for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl Freeze for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl Freeze for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl Freeze for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl Freeze for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl Freeze for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl Freeze for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl Freeze for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl Freeze for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl Freeze for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl Freeze for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl Freeze for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl Freeze for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl Freeze for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl Freeze for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl Freeze for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl Freeze for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl Freeze for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl Freeze for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl Freeze for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl Freeze for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl Freeze for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl Freeze for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl Freeze for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl Freeze for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl Freeze for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl Freeze for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl Freeze for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl Freeze for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl Freeze for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl Freeze for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl Freeze for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl Freeze for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl Freeze for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl Freeze for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl Freeze for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl Freeze for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl Freeze for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl Freeze for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl Freeze for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl Freeze for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl Freeze for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl Freeze for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl Freeze for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl Freeze for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl Freeze for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl Freeze for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl Freeze for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl Freeze for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl Freeze for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl Freeze for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl Freeze for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl Freeze for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl Freeze for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl Freeze for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl Freeze for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl Freeze for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl Freeze for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl Freeze for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl Freeze for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl Freeze for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl Freeze for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl Freeze for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl Freeze for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl Freeze for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl Freeze for Function",1,["fe_analyzer::namespace::items::Function"]],["impl Freeze for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl Freeze for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl Freeze for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl Freeze for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl Freeze for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl Freeze for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl Freeze for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl Freeze for Module",1,["fe_analyzer::namespace::items::Module"]],["impl Freeze for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl Freeze for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl Freeze for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl Freeze for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl Freeze for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl Freeze for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl Freeze for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl Freeze for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl Freeze for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl Freeze for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl Freeze for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl Freeze for Array",1,["fe_analyzer::namespace::types::Array"]],["impl Freeze for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl Freeze for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl Freeze for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl Freeze for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl Freeze for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl Freeze for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl Freeze for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl Freeze for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl Freeze for Map",1,["fe_analyzer::namespace::types::Map"]],["impl Freeze for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl Freeze for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl Freeze for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl Freeze for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl Freeze for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl Freeze for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl Freeze for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !Freeze for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !Freeze for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !Freeze for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> Freeze for DisplayableWrapper<'a, T>
where\n T: Freeze,
",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> Freeze for Analysis<T>
where\n T: Freeze,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !Freeze for Db",1,["fe_codegen::db::Db"]],["impl Freeze for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl Freeze for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl Freeze for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl Freeze for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl Freeze for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl Freeze for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl Freeze for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl Freeze for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl Freeze for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl Freeze for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl Freeze for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl Freeze for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl Freeze for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl Freeze for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl Freeze for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl Freeze for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl Freeze for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl Freeze for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl Freeze for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl Freeze for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl Freeze for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl !Freeze for TestDb",1,["fe_common::db::TestDb"]],["impl Freeze for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl Freeze for FileKind",1,["fe_common::files::FileKind"]],["impl Freeze for Radix",1,["fe_common::numeric::Radix"]],["impl Freeze for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl Freeze for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl Freeze for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl Freeze for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl Freeze for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl Freeze for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl Freeze for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl Freeze for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl Freeze for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl Freeze for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl Freeze for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl Freeze for Label",1,["fe_common::diagnostics::Label"]],["impl Freeze for File",1,["fe_common::files::File"]],["impl Freeze for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl Freeze for Span",1,["fe_common::span::Span"]],["impl Freeze for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl Freeze for Dependency",1,["fe_common::utils::files::Dependency"]],["impl Freeze for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl Freeze for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl Freeze for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl Freeze for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> Freeze for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl !Freeze for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl !Freeze for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl Freeze for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl Freeze for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl Freeze for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl Freeze for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl Freeze for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl Freeze for CompileError",1,["fe_driver::CompileError"]],["impl Freeze for CompiledContract",1,["fe_driver::CompiledContract"]],["impl Freeze for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl !Freeze for NewDb",1,["fe_mir::db::NewDb"]],["impl Freeze for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl Freeze for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl Freeze for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl Freeze for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl Freeze for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl Freeze for CallType",1,["fe_mir::ir::inst::CallType"]],["impl Freeze for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl Freeze for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl Freeze for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl Freeze for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl Freeze for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl Freeze for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl Freeze for Value",1,["fe_mir::ir::value::Value"]],["impl Freeze for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl Freeze for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl Freeze for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl Freeze for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl Freeze for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl Freeze for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl Freeze for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl Freeze for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl Freeze for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl Freeze for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl Freeze for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl Freeze for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl Freeze for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl Freeze for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl Freeze for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl Freeze for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl Freeze for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl Freeze for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl Freeze for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl Freeze for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl Freeze for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl Freeze for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl Freeze for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl Freeze for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl Freeze for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl Freeze for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl Freeze for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl Freeze for Constant",1,["fe_mir::ir::constant::Constant"]],["impl Freeze for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl Freeze for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl Freeze for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl Freeze for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl Freeze for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl Freeze for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl Freeze for Inst",1,["fe_mir::ir::inst::Inst"]],["impl Freeze for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl Freeze for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl Freeze for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl Freeze for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl Freeze for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl Freeze for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl Freeze for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl Freeze for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl Freeze for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl Freeze for Type",1,["fe_mir::ir::types::Type"]],["impl Freeze for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl Freeze for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> Freeze for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> Freeze for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> Freeze for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> Freeze for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> Freeze for IterBase<'a, T>
where\n T: Freeze,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> Freeze for IterMutBase<'a, T>",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl Freeze for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl Freeze for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl Freeze for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl Freeze for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl Freeze for Expr",1,["fe_parser::ast::Expr"]],["impl Freeze for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl Freeze for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl Freeze for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl Freeze for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl Freeze for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl Freeze for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl Freeze for Pattern",1,["fe_parser::ast::Pattern"]],["impl Freeze for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl Freeze for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl Freeze for UseTree",1,["fe_parser::ast::UseTree"]],["impl Freeze for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl Freeze for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl Freeze for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl Freeze for CallArg",1,["fe_parser::ast::CallArg"]],["impl Freeze for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl Freeze for Contract",1,["fe_parser::ast::Contract"]],["impl Freeze for Enum",1,["fe_parser::ast::Enum"]],["impl Freeze for Field",1,["fe_parser::ast::Field"]],["impl Freeze for Function",1,["fe_parser::ast::Function"]],["impl Freeze for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl Freeze for Impl",1,["fe_parser::ast::Impl"]],["impl Freeze for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl Freeze for Module",1,["fe_parser::ast::Module"]],["impl Freeze for Path",1,["fe_parser::ast::Path"]],["impl Freeze for Pragma",1,["fe_parser::ast::Pragma"]],["impl Freeze for Struct",1,["fe_parser::ast::Struct"]],["impl Freeze for Trait",1,["fe_parser::ast::Trait"]],["impl Freeze for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl Freeze for Use",1,["fe_parser::ast::Use"]],["impl Freeze for Variant",1,["fe_parser::ast::Variant"]],["impl Freeze for NodeId",1,["fe_parser::node::NodeId"]],["impl Freeze for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> Freeze for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> Freeze for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> Freeze for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> Freeze for Node<T>
where\n T: Freeze,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl Freeze for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl Freeze for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl Freeze for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1777,3834,65195,8264,8495,2488,952,22550,12638,324,614]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Send.js b/compiler-docs/trait.impl/core/marker/trait.Send.js new file mode 100644 index 0000000000..348822d448 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Send.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Send for Emit",1,["fe::task::build::Emit"]],["impl Send for Commands",1,["fe::task::Commands"]],["impl Send for FelangCli",1,["fe::FelangCli"]],["impl Send for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl Send for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl Send for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl Send for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl Send for CtxParam",1,["fe_abi::function::CtxParam"]],["impl Send for SelfParam",1,["fe_abi::function::SelfParam"]],["impl Send for StateMutability",1,["fe_abi::function::StateMutability"]],["impl Send for AbiType",1,["fe_abi::types::AbiType"]],["impl Send for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl Send for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl Send for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl Send for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl Send for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl Send for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl Send for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl !Send for CallType",1,["fe_analyzer::context::CallType"]],["impl !Send for Type",1,["fe_analyzer::namespace::types::Type"]],["impl !Send for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl !Send for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl !Send for TestDb",1,["fe_analyzer::db::TestDb"]],["impl !Send for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl !Send for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl !Send for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl Send for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl Send for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl Send for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl Send for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl Send for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl Send for Constant",1,["fe_analyzer::context::Constant"]],["impl Send for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl Send for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl Send for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl Send for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl Send for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl Send for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl Send for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl Send for Item",1,["fe_analyzer::namespace::items::Item"]],["impl Send for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl Send for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl Send for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl Send for Base",1,["fe_analyzer::namespace::types::Base"]],["impl Send for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl Send for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl Send for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl Send for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl Send for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl Send for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl Send for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl Send for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl Send for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl Send for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl Send for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl Send for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl Send for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl Send for TempContext",1,["fe_analyzer::context::TempContext"]],["impl Send for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl Send for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl Send for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl Send for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl Send for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl Send for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl Send for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl Send for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl Send for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl Send for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl Send for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl Send for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl Send for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl Send for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl Send for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl Send for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl Send for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl Send for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl Send for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl Send for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl Send for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl Send for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl Send for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl Send for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl Send for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl Send for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl Send for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl Send for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl Send for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl Send for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl Send for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl Send for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl Send for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl Send for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl Send for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl Send for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl Send for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl Send for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl Send for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl Send for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl Send for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl Send for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl Send for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl Send for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl Send for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl Send for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl Send for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl Send for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl Send for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl Send for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl Send for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl Send for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl Send for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl Send for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl Send for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl Send for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl Send for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl Send for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl Send for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl Send for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl Send for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl Send for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl Send for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl Send for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl Send for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl Send for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl Send for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl Send for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl Send for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl Send for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl Send for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl Send for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl Send for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl Send for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl Send for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl Send for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl Send for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl Send for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl Send for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl Send for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl Send for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl Send for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl Send for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl Send for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl Send for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl Send for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl Send for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl Send for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl Send for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl Send for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl Send for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl Send for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl Send for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl Send for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl Send for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl Send for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl Send for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl Send for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl Send for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl Send for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl Send for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl Send for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl Send for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl Send for Function",1,["fe_analyzer::namespace::items::Function"]],["impl Send for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl Send for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl Send for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl Send for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl Send for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl Send for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl Send for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl Send for Module",1,["fe_analyzer::namespace::items::Module"]],["impl Send for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl Send for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl Send for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl Send for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl Send for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl Send for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl Send for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl Send for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl Send for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl Send for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl Send for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl Send for Array",1,["fe_analyzer::namespace::types::Array"]],["impl Send for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl Send for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl Send for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl Send for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl Send for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl Send for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl Send for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl Send for Map",1,["fe_analyzer::namespace::types::Map"]],["impl Send for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl Send for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl Send for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl Send for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl Send for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl Send for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !Send for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !Send for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !Send for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> !Send for DisplayableWrapper<'a, T>",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> !Send for Analysis<T>",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !Send for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl !Send for Db",1,["fe_codegen::db::Db"]],["impl !Send for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl Send for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl Send for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl Send for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl Send for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl Send for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl Send for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl Send for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl Send for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl Send for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl Send for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl Send for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl Send for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl Send for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl Send for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl Send for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl Send for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl Send for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl Send for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl Send for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl !Send for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl !Send for TestDb",1,["fe_common::db::TestDb"]],["impl !Send for File",1,["fe_common::files::File"]],["impl Send for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl Send for FileKind",1,["fe_common::files::FileKind"]],["impl Send for Radix",1,["fe_common::numeric::Radix"]],["impl Send for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl Send for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl Send for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl Send for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl Send for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl Send for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl Send for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl Send for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl Send for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl Send for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl Send for Label",1,["fe_common::diagnostics::Label"]],["impl Send for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl Send for Span",1,["fe_common::span::Span"]],["impl Send for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl Send for Dependency",1,["fe_common::utils::files::Dependency"]],["impl Send for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl Send for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl Send for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl Send for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> Send for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl Send for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl Send for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl Send for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl Send for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl Send for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl Send for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl Send for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl Send for CompileError",1,["fe_driver::CompileError"]],["impl Send for CompiledContract",1,["fe_driver::CompiledContract"]],["impl Send for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl !Send for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl !Send for NewDb",1,["fe_mir::db::NewDb"]],["impl Send for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl Send for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl Send for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl Send for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl Send for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl Send for CallType",1,["fe_mir::ir::inst::CallType"]],["impl Send for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl Send for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl Send for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl Send for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl Send for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl Send for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl Send for Value",1,["fe_mir::ir::value::Value"]],["impl Send for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl Send for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl Send for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl Send for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl Send for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl Send for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl Send for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl Send for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl Send for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl Send for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl Send for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl Send for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl Send for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl Send for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl Send for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl Send for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl Send for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl Send for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl Send for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl Send for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl Send for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl Send for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl Send for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl Send for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl Send for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl Send for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl Send for Constant",1,["fe_mir::ir::constant::Constant"]],["impl Send for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl Send for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl Send for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl Send for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl Send for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl Send for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl Send for Inst",1,["fe_mir::ir::inst::Inst"]],["impl Send for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl Send for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl Send for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl Send for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl Send for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl Send for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl Send for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl Send for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl Send for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl Send for Type",1,["fe_mir::ir::types::Type"]],["impl Send for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl Send for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> Send for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> Send for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> Send for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> Send for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> Send for IterBase<'a, T>
where\n T: Send + Sync,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> Send for IterMutBase<'a, T>
where\n T: Send,
",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl Send for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl Send for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl Send for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl Send for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl Send for Expr",1,["fe_parser::ast::Expr"]],["impl Send for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl Send for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl Send for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl Send for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl Send for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl Send for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl Send for Pattern",1,["fe_parser::ast::Pattern"]],["impl Send for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl Send for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl Send for UseTree",1,["fe_parser::ast::UseTree"]],["impl Send for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl Send for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl Send for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl Send for CallArg",1,["fe_parser::ast::CallArg"]],["impl Send for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl Send for Contract",1,["fe_parser::ast::Contract"]],["impl Send for Enum",1,["fe_parser::ast::Enum"]],["impl Send for Field",1,["fe_parser::ast::Field"]],["impl Send for Function",1,["fe_parser::ast::Function"]],["impl Send for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl Send for Impl",1,["fe_parser::ast::Impl"]],["impl Send for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl Send for Module",1,["fe_parser::ast::Module"]],["impl Send for Path",1,["fe_parser::ast::Path"]],["impl Send for Pragma",1,["fe_parser::ast::Pragma"]],["impl Send for Struct",1,["fe_parser::ast::Struct"]],["impl Send for Trait",1,["fe_parser::ast::Trait"]],["impl Send for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl Send for Use",1,["fe_parser::ast::Use"]],["impl Send for Variant",1,["fe_parser::ast::Variant"]],["impl Send for NodeId",1,["fe_parser::node::NodeId"]],["impl Send for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> Send for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> Send for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> Send for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> Send for Node<T>
where\n T: Send,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl Send for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl Send for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl Send for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1741,3762,63745,8134,8341,2444,934,22452,12386,318,602]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.StructuralPartialEq.js b/compiler-docs/trait.impl/core/marker/trait.StructuralPartialEq.js new file mode 100644 index 0000000000..a89dde6e05 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.StructuralPartialEq.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl StructuralPartialEq for Emit"]]],["fe_abi",[["impl StructuralPartialEq for AbiFunctionType"],["impl StructuralPartialEq for StateMutability"],["impl StructuralPartialEq for AbiType"],["impl StructuralPartialEq for AbiContract"],["impl StructuralPartialEq for AbiEvent"],["impl StructuralPartialEq for AbiEventField"],["impl StructuralPartialEq for AbiFunction"],["impl StructuralPartialEq for AbiTupleField"]]],["fe_analyzer",[["impl StructuralPartialEq for ContractTypeMethod"],["impl StructuralPartialEq for GlobalFunction"],["impl StructuralPartialEq for Intrinsic"],["impl StructuralPartialEq for ValueMethod"],["impl StructuralPartialEq for AdjustmentKind"],["impl StructuralPartialEq for CallType"],["impl StructuralPartialEq for Constant"],["impl StructuralPartialEq for NamedThing"],["impl StructuralPartialEq for BinaryOperationError"],["impl StructuralPartialEq for IndexingError"],["impl StructuralPartialEq for TypeCoercionError"],["impl StructuralPartialEq for DepLocality"],["impl StructuralPartialEq for EnumVariantKind"],["impl StructuralPartialEq for IngotMode"],["impl StructuralPartialEq for Item"],["impl StructuralPartialEq for ModuleSource"],["impl StructuralPartialEq for TypeDef"],["impl StructuralPartialEq for BlockScopeType"],["impl StructuralPartialEq for Base"],["impl StructuralPartialEq for GenericArg"],["impl StructuralPartialEq for GenericParamKind"],["impl StructuralPartialEq for GenericType"],["impl StructuralPartialEq for Integer"],["impl StructuralPartialEq for TraitOrType"],["impl StructuralPartialEq for Type"],["impl StructuralPartialEq for ConstructorKind"],["impl StructuralPartialEq for LiteralConstructor"],["impl StructuralPartialEq for SimplifiedPatternKind"],["impl StructuralPartialEq for Adjustment"],["impl StructuralPartialEq for DiagnosticVoucher"],["impl StructuralPartialEq for ExpressionAttributes"],["impl StructuralPartialEq for FunctionBody"],["impl StructuralPartialEq for ConstEvalError"],["impl StructuralPartialEq for TypeError"],["impl StructuralPartialEq for Attribute"],["impl StructuralPartialEq for AttributeId"],["impl StructuralPartialEq for Contract"],["impl StructuralPartialEq for ContractField"],["impl StructuralPartialEq for ContractFieldId"],["impl StructuralPartialEq for ContractId"],["impl StructuralPartialEq for Enum"],["impl StructuralPartialEq for EnumId"],["impl StructuralPartialEq for EnumVariant"],["impl StructuralPartialEq for EnumVariantId"],["impl StructuralPartialEq for Function"],["impl StructuralPartialEq for FunctionId"],["impl StructuralPartialEq for FunctionSig"],["impl StructuralPartialEq for FunctionSigId"],["impl StructuralPartialEq for Impl"],["impl StructuralPartialEq for ImplId"],["impl StructuralPartialEq for Ingot"],["impl StructuralPartialEq for IngotId"],["impl StructuralPartialEq for Module"],["impl StructuralPartialEq for ModuleConstant"],["impl StructuralPartialEq for ModuleConstantId"],["impl StructuralPartialEq for ModuleId"],["impl StructuralPartialEq for Struct"],["impl StructuralPartialEq for StructField"],["impl StructuralPartialEq for StructFieldId"],["impl StructuralPartialEq for StructId"],["impl StructuralPartialEq for Trait"],["impl StructuralPartialEq for TraitId"],["impl StructuralPartialEq for TypeAlias"],["impl StructuralPartialEq for TypeAliasId"],["impl StructuralPartialEq for Array"],["impl StructuralPartialEq for CtxDecl"],["impl StructuralPartialEq for FeString"],["impl StructuralPartialEq for FunctionParam"],["impl StructuralPartialEq for FunctionSignature"],["impl StructuralPartialEq for Generic"],["impl StructuralPartialEq for Map"],["impl StructuralPartialEq for SelfDecl"],["impl StructuralPartialEq for Tuple"],["impl StructuralPartialEq for TypeId"],["impl StructuralPartialEq for PatternMatrix"],["impl StructuralPartialEq for PatternRowVec"],["impl StructuralPartialEq for SigmaSet"],["impl StructuralPartialEq for SimplifiedPattern"],["impl<T> StructuralPartialEq for Analysis<T>"]]],["fe_common",[["impl StructuralPartialEq for LabelStyle"],["impl StructuralPartialEq for FileKind"],["impl StructuralPartialEq for Radix"],["impl StructuralPartialEq for ProjectMode"],["impl StructuralPartialEq for Diagnostic"],["impl StructuralPartialEq for Label"],["impl StructuralPartialEq for File"],["impl StructuralPartialEq for SourceFileId"],["impl StructuralPartialEq for Span"]]],["fe_mir",[["impl StructuralPartialEq for PostIDom"],["impl StructuralPartialEq for CursorLocation"],["impl StructuralPartialEq for ConstantValue"],["impl StructuralPartialEq for Linkage"],["impl StructuralPartialEq for BinOp"],["impl StructuralPartialEq for CallType"],["impl StructuralPartialEq for CastKind"],["impl StructuralPartialEq for InstKind"],["impl StructuralPartialEq for UnOp"],["impl StructuralPartialEq for YulIntrinsicOp"],["impl StructuralPartialEq for TypeKind"],["impl StructuralPartialEq for AssignableValue"],["impl StructuralPartialEq for Value"],["impl StructuralPartialEq for ControlFlowGraph"],["impl StructuralPartialEq for Loop"],["impl StructuralPartialEq for BasicBlock"],["impl StructuralPartialEq for BodyOrder"],["impl StructuralPartialEq for Constant"],["impl StructuralPartialEq for ConstantId"],["impl StructuralPartialEq for BodyDataStore"],["impl StructuralPartialEq for FunctionBody"],["impl StructuralPartialEq for FunctionId"],["impl StructuralPartialEq for FunctionParam"],["impl StructuralPartialEq for FunctionSignature"],["impl StructuralPartialEq for Inst"],["impl StructuralPartialEq for SwitchTable"],["impl StructuralPartialEq for SourceInfo"],["impl StructuralPartialEq for ArrayDef"],["impl StructuralPartialEq for EnumDef"],["impl StructuralPartialEq for EnumVariant"],["impl StructuralPartialEq for EventDef"],["impl StructuralPartialEq for MapDef"],["impl StructuralPartialEq for StructDef"],["impl StructuralPartialEq for TupleDef"],["impl StructuralPartialEq for Type"],["impl StructuralPartialEq for TypeId"],["impl StructuralPartialEq for Local"]]],["fe_parser",[["impl StructuralPartialEq for BinOperator"],["impl StructuralPartialEq for BoolOperator"],["impl StructuralPartialEq for CompOperator"],["impl StructuralPartialEq for ContractStmt"],["impl StructuralPartialEq for Expr"],["impl StructuralPartialEq for FuncStmt"],["impl StructuralPartialEq for FunctionArg"],["impl StructuralPartialEq for GenericArg"],["impl StructuralPartialEq for GenericParameter"],["impl StructuralPartialEq for LiteralPattern"],["impl StructuralPartialEq for ModuleStmt"],["impl StructuralPartialEq for Pattern"],["impl StructuralPartialEq for TypeDesc"],["impl StructuralPartialEq for UnaryOperator"],["impl StructuralPartialEq for UseTree"],["impl StructuralPartialEq for VarDeclTarget"],["impl StructuralPartialEq for VariantKind"],["impl StructuralPartialEq for TokenKind"],["impl StructuralPartialEq for CallArg"],["impl StructuralPartialEq for ConstantDecl"],["impl StructuralPartialEq for Contract"],["impl StructuralPartialEq for Enum"],["impl StructuralPartialEq for Field"],["impl StructuralPartialEq for Function"],["impl StructuralPartialEq for FunctionSignature"],["impl StructuralPartialEq for Impl"],["impl StructuralPartialEq for MatchArm"],["impl StructuralPartialEq for Module"],["impl StructuralPartialEq for Path"],["impl StructuralPartialEq for Pragma"],["impl StructuralPartialEq for Struct"],["impl StructuralPartialEq for Trait"],["impl StructuralPartialEq for TypeAlias"],["impl StructuralPartialEq for Use"],["impl StructuralPartialEq for Variant"],["impl StructuralPartialEq for NodeId"],["impl StructuralPartialEq for ParseFailed"],["impl<'a> StructuralPartialEq for Token<'a>"],["impl<T> StructuralPartialEq for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[301,2570,26941,2849,11823,12102]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Sync.js b/compiler-docs/trait.impl/core/marker/trait.Sync.js new file mode 100644 index 0000000000..19e3e22095 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Sync.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Sync for Emit",1,["fe::task::build::Emit"]],["impl Sync for Commands",1,["fe::task::Commands"]],["impl Sync for FelangCli",1,["fe::FelangCli"]],["impl Sync for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl Sync for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl Sync for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl Sync for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl Sync for CtxParam",1,["fe_abi::function::CtxParam"]],["impl Sync for SelfParam",1,["fe_abi::function::SelfParam"]],["impl Sync for StateMutability",1,["fe_abi::function::StateMutability"]],["impl Sync for AbiType",1,["fe_abi::types::AbiType"]],["impl Sync for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl Sync for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl Sync for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl Sync for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl Sync for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl Sync for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl Sync for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl !Sync for CallType",1,["fe_analyzer::context::CallType"]],["impl !Sync for Type",1,["fe_analyzer::namespace::types::Type"]],["impl !Sync for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl !Sync for TempContext",1,["fe_analyzer::context::TempContext"]],["impl !Sync for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl !Sync for TestDb",1,["fe_analyzer::db::TestDb"]],["impl !Sync for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl !Sync for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl !Sync for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl Sync for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl Sync for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl Sync for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl Sync for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl Sync for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl Sync for Constant",1,["fe_analyzer::context::Constant"]],["impl Sync for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl Sync for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl Sync for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl Sync for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl Sync for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl Sync for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl Sync for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl Sync for Item",1,["fe_analyzer::namespace::items::Item"]],["impl Sync for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl Sync for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl Sync for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl Sync for Base",1,["fe_analyzer::namespace::types::Base"]],["impl Sync for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl Sync for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl Sync for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl Sync for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl Sync for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl Sync for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl Sync for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl Sync for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl Sync for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl Sync for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl Sync for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl Sync for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl Sync for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl Sync for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl Sync for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl Sync for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl Sync for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl Sync for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl Sync for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl Sync for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl Sync for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl Sync for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl Sync for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl Sync for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl Sync for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl Sync for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl Sync for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl Sync for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl Sync for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl Sync for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl Sync for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl Sync for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl Sync for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl Sync for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl Sync for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl Sync for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl Sync for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl Sync for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl Sync for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl Sync for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl Sync for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl Sync for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl Sync for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl Sync for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl Sync for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl Sync for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl Sync for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl Sync for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl Sync for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl Sync for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl Sync for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl Sync for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl Sync for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl Sync for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl Sync for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl Sync for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl Sync for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl Sync for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl Sync for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl Sync for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl Sync for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl Sync for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl Sync for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl Sync for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl Sync for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl Sync for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl Sync for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl Sync for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl Sync for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl Sync for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl Sync for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl Sync for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl Sync for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl Sync for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl Sync for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl Sync for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl Sync for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl Sync for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl Sync for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl Sync for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl Sync for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl Sync for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl Sync for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl Sync for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl Sync for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl Sync for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl Sync for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl Sync for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl Sync for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl Sync for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl Sync for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl Sync for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl Sync for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl Sync for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl Sync for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl Sync for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl Sync for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl Sync for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl Sync for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl Sync for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl Sync for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl Sync for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl Sync for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl Sync for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl Sync for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl Sync for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl Sync for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl Sync for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl Sync for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl Sync for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl Sync for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl Sync for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl Sync for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl Sync for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl Sync for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl Sync for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl Sync for Function",1,["fe_analyzer::namespace::items::Function"]],["impl Sync for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl Sync for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl Sync for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl Sync for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl Sync for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl Sync for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl Sync for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl Sync for Module",1,["fe_analyzer::namespace::items::Module"]],["impl Sync for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl Sync for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl Sync for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl Sync for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl Sync for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl Sync for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl Sync for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl Sync for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl Sync for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl Sync for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl Sync for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl Sync for Array",1,["fe_analyzer::namespace::types::Array"]],["impl Sync for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl Sync for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl Sync for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl Sync for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl Sync for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl Sync for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl Sync for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl Sync for Map",1,["fe_analyzer::namespace::types::Map"]],["impl Sync for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl Sync for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl Sync for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl Sync for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl Sync for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl Sync for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !Sync for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !Sync for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !Sync for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> !Sync for DisplayableWrapper<'a, T>",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> !Sync for Analysis<T>",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !Sync for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl !Sync for Db",1,["fe_codegen::db::Db"]],["impl !Sync for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl Sync for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl Sync for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl Sync for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl Sync for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl Sync for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl Sync for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl Sync for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl Sync for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl Sync for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl Sync for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl Sync for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl Sync for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl Sync for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl Sync for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl Sync for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl Sync for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl Sync for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl Sync for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl Sync for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl !Sync for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl !Sync for TestDb",1,["fe_common::db::TestDb"]],["impl !Sync for File",1,["fe_common::files::File"]],["impl Sync for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl Sync for FileKind",1,["fe_common::files::FileKind"]],["impl Sync for Radix",1,["fe_common::numeric::Radix"]],["impl Sync for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl Sync for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl Sync for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl Sync for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl Sync for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl Sync for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl Sync for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl Sync for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl Sync for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl Sync for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl Sync for Label",1,["fe_common::diagnostics::Label"]],["impl Sync for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl Sync for Span",1,["fe_common::span::Span"]],["impl Sync for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl Sync for Dependency",1,["fe_common::utils::files::Dependency"]],["impl Sync for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl Sync for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl Sync for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl Sync for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> Sync for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl !Sync for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl !Sync for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl Sync for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl Sync for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl Sync for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl Sync for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl Sync for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl Sync for CompileError",1,["fe_driver::CompileError"]],["impl Sync for CompiledContract",1,["fe_driver::CompiledContract"]],["impl Sync for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl !Sync for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl !Sync for NewDb",1,["fe_mir::db::NewDb"]],["impl Sync for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl Sync for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl Sync for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl Sync for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl Sync for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl Sync for CallType",1,["fe_mir::ir::inst::CallType"]],["impl Sync for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl Sync for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl Sync for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl Sync for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl Sync for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl Sync for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl Sync for Value",1,["fe_mir::ir::value::Value"]],["impl Sync for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl Sync for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl Sync for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl Sync for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl Sync for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl Sync for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl Sync for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl Sync for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl Sync for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl Sync for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl Sync for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl Sync for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl Sync for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl Sync for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl Sync for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl Sync for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl Sync for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl Sync for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl Sync for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl Sync for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl Sync for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl Sync for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl Sync for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl Sync for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl Sync for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl Sync for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl Sync for Constant",1,["fe_mir::ir::constant::Constant"]],["impl Sync for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl Sync for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl Sync for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl Sync for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl Sync for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl Sync for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl Sync for Inst",1,["fe_mir::ir::inst::Inst"]],["impl Sync for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl Sync for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl Sync for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl Sync for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl Sync for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl Sync for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl Sync for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl Sync for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl Sync for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl Sync for Type",1,["fe_mir::ir::types::Type"]],["impl Sync for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl Sync for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> Sync for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> Sync for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> Sync for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> Sync for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> Sync for IterBase<'a, T>
where\n T: Sync,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> Sync for IterMutBase<'a, T>
where\n T: Sync,
",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl Sync for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl Sync for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl Sync for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl Sync for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl Sync for Expr",1,["fe_parser::ast::Expr"]],["impl Sync for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl Sync for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl Sync for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl Sync for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl Sync for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl Sync for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl Sync for Pattern",1,["fe_parser::ast::Pattern"]],["impl Sync for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl Sync for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl Sync for UseTree",1,["fe_parser::ast::UseTree"]],["impl Sync for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl Sync for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl Sync for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl Sync for CallArg",1,["fe_parser::ast::CallArg"]],["impl Sync for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl Sync for Contract",1,["fe_parser::ast::Contract"]],["impl Sync for Enum",1,["fe_parser::ast::Enum"]],["impl Sync for Field",1,["fe_parser::ast::Field"]],["impl Sync for Function",1,["fe_parser::ast::Function"]],["impl Sync for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl Sync for Impl",1,["fe_parser::ast::Impl"]],["impl Sync for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl Sync for Module",1,["fe_parser::ast::Module"]],["impl Sync for Path",1,["fe_parser::ast::Path"]],["impl Sync for Pragma",1,["fe_parser::ast::Pragma"]],["impl Sync for Struct",1,["fe_parser::ast::Struct"]],["impl Sync for Trait",1,["fe_parser::ast::Trait"]],["impl Sync for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl Sync for Use",1,["fe_parser::ast::Use"]],["impl Sync for Variant",1,["fe_parser::ast::Variant"]],["impl Sync for NodeId",1,["fe_parser::node::NodeId"]],["impl Sync for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> Sync for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> Sync for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> Sync for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> Sync for Node<T>
where\n T: Sync,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl Sync for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl Sync for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl Sync for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1741,3762,63746,8134,8341,2446,934,22317,12386,318,602]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.Unpin.js b/compiler-docs/trait.impl/core/marker/trait.Unpin.js new file mode 100644 index 0000000000..515df376c5 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.Unpin.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl Unpin for Emit",1,["fe::task::build::Emit"]],["impl Unpin for Commands",1,["fe::task::Commands"]],["impl Unpin for FelangCli",1,["fe::FelangCli"]],["impl Unpin for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl Unpin for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl Unpin for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl Unpin for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl Unpin for CtxParam",1,["fe_abi::function::CtxParam"]],["impl Unpin for SelfParam",1,["fe_abi::function::SelfParam"]],["impl Unpin for StateMutability",1,["fe_abi::function::StateMutability"]],["impl Unpin for AbiType",1,["fe_abi::types::AbiType"]],["impl Unpin for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl Unpin for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl Unpin for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl Unpin for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl Unpin for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl Unpin for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl Unpin for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl Unpin for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl Unpin for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl Unpin for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl Unpin for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl Unpin for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl Unpin for CallType",1,["fe_analyzer::context::CallType"]],["impl Unpin for Constant",1,["fe_analyzer::context::Constant"]],["impl Unpin for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl Unpin for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl Unpin for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl Unpin for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl Unpin for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl Unpin for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl Unpin for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl Unpin for Item",1,["fe_analyzer::namespace::items::Item"]],["impl Unpin for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl Unpin for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl Unpin for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl Unpin for Base",1,["fe_analyzer::namespace::types::Base"]],["impl Unpin for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl Unpin for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl Unpin for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl Unpin for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl Unpin for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl Unpin for Type",1,["fe_analyzer::namespace::types::Type"]],["impl Unpin for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl Unpin for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl Unpin for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl Unpin for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl Unpin for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl Unpin for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl Unpin for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl Unpin for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl Unpin for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl Unpin for TempContext",1,["fe_analyzer::context::TempContext"]],["impl Unpin for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl Unpin for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl Unpin for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl Unpin for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl Unpin for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl Unpin for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl Unpin for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl Unpin for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl Unpin for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl Unpin for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl Unpin for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl Unpin for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl Unpin for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl Unpin for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl Unpin for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl Unpin for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl Unpin for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl Unpin for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl Unpin for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl Unpin for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl Unpin for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl Unpin for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl Unpin for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl Unpin for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl Unpin for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl Unpin for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl Unpin for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl Unpin for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl Unpin for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl Unpin for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl Unpin for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl Unpin for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl Unpin for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl Unpin for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl Unpin for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl Unpin for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl Unpin for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl Unpin for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl Unpin for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl Unpin for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl Unpin for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl Unpin for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl Unpin for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl Unpin for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl Unpin for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl Unpin for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl Unpin for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl Unpin for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl Unpin for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl Unpin for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl Unpin for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl Unpin for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl Unpin for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl Unpin for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl Unpin for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl Unpin for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl Unpin for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl Unpin for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl Unpin for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl Unpin for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl Unpin for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl Unpin for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl Unpin for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl Unpin for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl Unpin for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl Unpin for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl Unpin for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl Unpin for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl Unpin for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl Unpin for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl Unpin for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl Unpin for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl Unpin for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl Unpin for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl Unpin for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl Unpin for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl Unpin for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl Unpin for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl Unpin for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl Unpin for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl Unpin for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl Unpin for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl Unpin for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl Unpin for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl Unpin for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl Unpin for TestDb",1,["fe_analyzer::db::TestDb"]],["impl Unpin for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl Unpin for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl Unpin for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl Unpin for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl Unpin for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl Unpin for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl Unpin for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl Unpin for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl Unpin for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl Unpin for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl Unpin for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl Unpin for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl Unpin for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl Unpin for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl Unpin for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl Unpin for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl Unpin for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl Unpin for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl Unpin for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl Unpin for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl Unpin for Function",1,["fe_analyzer::namespace::items::Function"]],["impl Unpin for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl Unpin for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl Unpin for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl Unpin for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl Unpin for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl Unpin for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl Unpin for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl Unpin for Module",1,["fe_analyzer::namespace::items::Module"]],["impl Unpin for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl Unpin for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl Unpin for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl Unpin for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl Unpin for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl Unpin for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl Unpin for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl Unpin for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl Unpin for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl Unpin for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl Unpin for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl Unpin for Array",1,["fe_analyzer::namespace::types::Array"]],["impl Unpin for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl Unpin for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl Unpin for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl Unpin for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl Unpin for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl Unpin for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl Unpin for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl Unpin for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl Unpin for Map",1,["fe_analyzer::namespace::types::Map"]],["impl Unpin for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl Unpin for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl Unpin for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl Unpin for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl Unpin for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl Unpin for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl Unpin for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> Unpin for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> Unpin for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> Unpin for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> Unpin for DisplayableWrapper<'a, T>
where\n T: Unpin,
",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> Unpin for Analysis<T>
where\n T: Unpin,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl Unpin for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl Unpin for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl Unpin for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl Unpin for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl Unpin for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl Unpin for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl Unpin for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl Unpin for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl Unpin for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl Unpin for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl Unpin for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl Unpin for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl Unpin for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl Unpin for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl Unpin for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl Unpin for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl Unpin for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl Unpin for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl Unpin for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl Unpin for Db",1,["fe_codegen::db::Db"]],["impl Unpin for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl Unpin for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl Unpin for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl Unpin for FileKind",1,["fe_common::files::FileKind"]],["impl Unpin for Radix",1,["fe_common::numeric::Radix"]],["impl Unpin for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl Unpin for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl Unpin for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl Unpin for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl Unpin for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl Unpin for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl Unpin for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl Unpin for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl Unpin for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl Unpin for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl Unpin for TestDb",1,["fe_common::db::TestDb"]],["impl Unpin for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl Unpin for Label",1,["fe_common::diagnostics::Label"]],["impl Unpin for File",1,["fe_common::files::File"]],["impl Unpin for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl Unpin for Span",1,["fe_common::span::Span"]],["impl Unpin for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl Unpin for Dependency",1,["fe_common::utils::files::Dependency"]],["impl Unpin for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl Unpin for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl Unpin for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl Unpin for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> Unpin for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl Unpin for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl Unpin for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl Unpin for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl Unpin for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl Unpin for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl Unpin for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl Unpin for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl Unpin for CompileError",1,["fe_driver::CompileError"]],["impl Unpin for CompiledContract",1,["fe_driver::CompiledContract"]],["impl Unpin for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl Unpin for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl Unpin for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl Unpin for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl Unpin for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl Unpin for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl Unpin for CallType",1,["fe_mir::ir::inst::CallType"]],["impl Unpin for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl Unpin for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl Unpin for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl Unpin for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl Unpin for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl Unpin for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl Unpin for Value",1,["fe_mir::ir::value::Value"]],["impl Unpin for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl Unpin for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl Unpin for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl Unpin for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl Unpin for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl Unpin for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl Unpin for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl Unpin for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl Unpin for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl Unpin for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl Unpin for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl Unpin for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl Unpin for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl Unpin for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl Unpin for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl Unpin for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl Unpin for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl Unpin for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl Unpin for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl Unpin for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl Unpin for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl Unpin for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl Unpin for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl Unpin for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl Unpin for NewDb",1,["fe_mir::db::NewDb"]],["impl Unpin for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl Unpin for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl Unpin for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl Unpin for Constant",1,["fe_mir::ir::constant::Constant"]],["impl Unpin for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl Unpin for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl Unpin for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl Unpin for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl Unpin for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl Unpin for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl Unpin for Inst",1,["fe_mir::ir::inst::Inst"]],["impl Unpin for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl Unpin for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl Unpin for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl Unpin for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl Unpin for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl Unpin for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl Unpin for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl Unpin for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl Unpin for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl Unpin for Type",1,["fe_mir::ir::types::Type"]],["impl Unpin for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl Unpin for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> Unpin for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> Unpin for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> Unpin for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> Unpin for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> Unpin for IterBase<'a, T>
where\n T: Unpin,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> Unpin for IterMutBase<'a, T>",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl Unpin for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl Unpin for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl Unpin for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl Unpin for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl Unpin for Expr",1,["fe_parser::ast::Expr"]],["impl Unpin for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl Unpin for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl Unpin for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl Unpin for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl Unpin for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl Unpin for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl Unpin for Pattern",1,["fe_parser::ast::Pattern"]],["impl Unpin for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl Unpin for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl Unpin for UseTree",1,["fe_parser::ast::UseTree"]],["impl Unpin for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl Unpin for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl Unpin for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl Unpin for CallArg",1,["fe_parser::ast::CallArg"]],["impl Unpin for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl Unpin for Contract",1,["fe_parser::ast::Contract"]],["impl Unpin for Enum",1,["fe_parser::ast::Enum"]],["impl Unpin for Field",1,["fe_parser::ast::Field"]],["impl Unpin for Function",1,["fe_parser::ast::Function"]],["impl Unpin for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl Unpin for Impl",1,["fe_parser::ast::Impl"]],["impl Unpin for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl Unpin for Module",1,["fe_parser::ast::Module"]],["impl Unpin for Path",1,["fe_parser::ast::Path"]],["impl Unpin for Pragma",1,["fe_parser::ast::Pragma"]],["impl Unpin for Struct",1,["fe_parser::ast::Struct"]],["impl Unpin for Trait",1,["fe_parser::ast::Trait"]],["impl Unpin for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl Unpin for Use",1,["fe_parser::ast::Use"]],["impl Unpin for Variant",1,["fe_parser::ast::Variant"]],["impl Unpin for NodeId",1,["fe_parser::node::NodeId"]],["impl Unpin for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> Unpin for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> Unpin for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> Unpin for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> Unpin for Node<T>
where\n T: Unpin,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl Unpin for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl Unpin for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl Unpin for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1759,3798,64635,8197,8416,2465,943,22345,12512,321,608]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/marker/trait.UnsafeUnpin.js b/compiler-docs/trait.impl/core/marker/trait.UnsafeUnpin.js new file mode 100644 index 0000000000..797395f188 --- /dev/null +++ b/compiler-docs/trait.impl/core/marker/trait.UnsafeUnpin.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl UnsafeUnpin for Emit",1,["fe::task::build::Emit"]],["impl UnsafeUnpin for Commands",1,["fe::task::Commands"]],["impl UnsafeUnpin for FelangCli",1,["fe::FelangCli"]],["impl UnsafeUnpin for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl UnsafeUnpin for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl UnsafeUnpin for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl UnsafeUnpin for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl UnsafeUnpin for CtxParam",1,["fe_abi::function::CtxParam"]],["impl UnsafeUnpin for SelfParam",1,["fe_abi::function::SelfParam"]],["impl UnsafeUnpin for StateMutability",1,["fe_abi::function::StateMutability"]],["impl UnsafeUnpin for AbiType",1,["fe_abi::types::AbiType"]],["impl UnsafeUnpin for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl UnsafeUnpin for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl UnsafeUnpin for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl UnsafeUnpin for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl UnsafeUnpin for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl UnsafeUnpin for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl UnsafeUnpin for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl UnsafeUnpin for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl UnsafeUnpin for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl UnsafeUnpin for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl UnsafeUnpin for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl UnsafeUnpin for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl UnsafeUnpin for CallType",1,["fe_analyzer::context::CallType"]],["impl UnsafeUnpin for Constant",1,["fe_analyzer::context::Constant"]],["impl UnsafeUnpin for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl UnsafeUnpin for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl UnsafeUnpin for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl UnsafeUnpin for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl UnsafeUnpin for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl UnsafeUnpin for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl UnsafeUnpin for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl UnsafeUnpin for Item",1,["fe_analyzer::namespace::items::Item"]],["impl UnsafeUnpin for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl UnsafeUnpin for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl UnsafeUnpin for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl UnsafeUnpin for Base",1,["fe_analyzer::namespace::types::Base"]],["impl UnsafeUnpin for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl UnsafeUnpin for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl UnsafeUnpin for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl UnsafeUnpin for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl UnsafeUnpin for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl UnsafeUnpin for Type",1,["fe_analyzer::namespace::types::Type"]],["impl UnsafeUnpin for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl UnsafeUnpin for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl UnsafeUnpin for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl UnsafeUnpin for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl UnsafeUnpin for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl UnsafeUnpin for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl UnsafeUnpin for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl UnsafeUnpin for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl UnsafeUnpin for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl UnsafeUnpin for TempContext",1,["fe_analyzer::context::TempContext"]],["impl UnsafeUnpin for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl UnsafeUnpin for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl UnsafeUnpin for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl UnsafeUnpin for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl UnsafeUnpin for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl UnsafeUnpin for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl UnsafeUnpin for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl UnsafeUnpin for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl UnsafeUnpin for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl UnsafeUnpin for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl UnsafeUnpin for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl UnsafeUnpin for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl UnsafeUnpin for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl UnsafeUnpin for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl UnsafeUnpin for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl UnsafeUnpin for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl UnsafeUnpin for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl UnsafeUnpin for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl UnsafeUnpin for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl UnsafeUnpin for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl UnsafeUnpin for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl UnsafeUnpin for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl UnsafeUnpin for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl UnsafeUnpin for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl UnsafeUnpin for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl UnsafeUnpin for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl UnsafeUnpin for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl UnsafeUnpin for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl UnsafeUnpin for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl UnsafeUnpin for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl UnsafeUnpin for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl UnsafeUnpin for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl UnsafeUnpin for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl UnsafeUnpin for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl UnsafeUnpin for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl UnsafeUnpin for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl UnsafeUnpin for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl UnsafeUnpin for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl UnsafeUnpin for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl UnsafeUnpin for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl UnsafeUnpin for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl UnsafeUnpin for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl UnsafeUnpin for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl UnsafeUnpin for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl UnsafeUnpin for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl UnsafeUnpin for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl UnsafeUnpin for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl UnsafeUnpin for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl UnsafeUnpin for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl UnsafeUnpin for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl UnsafeUnpin for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl UnsafeUnpin for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl UnsafeUnpin for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl UnsafeUnpin for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl UnsafeUnpin for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl UnsafeUnpin for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl UnsafeUnpin for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl UnsafeUnpin for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl UnsafeUnpin for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl UnsafeUnpin for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl UnsafeUnpin for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl UnsafeUnpin for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl UnsafeUnpin for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl UnsafeUnpin for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl UnsafeUnpin for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl UnsafeUnpin for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl UnsafeUnpin for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl UnsafeUnpin for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl UnsafeUnpin for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl UnsafeUnpin for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl UnsafeUnpin for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl UnsafeUnpin for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl UnsafeUnpin for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl UnsafeUnpin for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl UnsafeUnpin for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl UnsafeUnpin for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl UnsafeUnpin for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl UnsafeUnpin for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl UnsafeUnpin for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl UnsafeUnpin for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl UnsafeUnpin for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl UnsafeUnpin for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl UnsafeUnpin for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl UnsafeUnpin for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl UnsafeUnpin for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl UnsafeUnpin for TestDb",1,["fe_analyzer::db::TestDb"]],["impl UnsafeUnpin for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl UnsafeUnpin for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl UnsafeUnpin for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl UnsafeUnpin for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl UnsafeUnpin for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl UnsafeUnpin for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl UnsafeUnpin for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl UnsafeUnpin for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl UnsafeUnpin for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl UnsafeUnpin for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl UnsafeUnpin for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl UnsafeUnpin for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl UnsafeUnpin for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl UnsafeUnpin for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl UnsafeUnpin for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl UnsafeUnpin for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl UnsafeUnpin for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl UnsafeUnpin for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl UnsafeUnpin for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl UnsafeUnpin for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl UnsafeUnpin for Function",1,["fe_analyzer::namespace::items::Function"]],["impl UnsafeUnpin for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl UnsafeUnpin for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl UnsafeUnpin for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl UnsafeUnpin for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl UnsafeUnpin for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl UnsafeUnpin for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl UnsafeUnpin for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl UnsafeUnpin for Module",1,["fe_analyzer::namespace::items::Module"]],["impl UnsafeUnpin for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl UnsafeUnpin for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl UnsafeUnpin for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl UnsafeUnpin for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl UnsafeUnpin for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl UnsafeUnpin for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl UnsafeUnpin for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl UnsafeUnpin for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl UnsafeUnpin for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl UnsafeUnpin for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl UnsafeUnpin for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl UnsafeUnpin for Array",1,["fe_analyzer::namespace::types::Array"]],["impl UnsafeUnpin for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl UnsafeUnpin for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl UnsafeUnpin for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl UnsafeUnpin for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl UnsafeUnpin for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl UnsafeUnpin for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl UnsafeUnpin for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl UnsafeUnpin for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl UnsafeUnpin for Map",1,["fe_analyzer::namespace::types::Map"]],["impl UnsafeUnpin for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl UnsafeUnpin for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl UnsafeUnpin for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl UnsafeUnpin for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl UnsafeUnpin for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl UnsafeUnpin for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl UnsafeUnpin for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> UnsafeUnpin for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> UnsafeUnpin for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> UnsafeUnpin for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> UnsafeUnpin for DisplayableWrapper<'a, T>
where\n T: UnsafeUnpin,
",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> UnsafeUnpin for Analysis<T>
where\n T: UnsafeUnpin,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl UnsafeUnpin for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl UnsafeUnpin for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl UnsafeUnpin for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl UnsafeUnpin for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl UnsafeUnpin for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl UnsafeUnpin for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl UnsafeUnpin for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl UnsafeUnpin for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl UnsafeUnpin for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl UnsafeUnpin for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl UnsafeUnpin for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl UnsafeUnpin for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl UnsafeUnpin for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl UnsafeUnpin for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl UnsafeUnpin for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl UnsafeUnpin for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl UnsafeUnpin for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl UnsafeUnpin for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl UnsafeUnpin for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl UnsafeUnpin for Db",1,["fe_codegen::db::Db"]],["impl UnsafeUnpin for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl UnsafeUnpin for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl UnsafeUnpin for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl UnsafeUnpin for FileKind",1,["fe_common::files::FileKind"]],["impl UnsafeUnpin for Radix",1,["fe_common::numeric::Radix"]],["impl UnsafeUnpin for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl UnsafeUnpin for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl UnsafeUnpin for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl UnsafeUnpin for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl UnsafeUnpin for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl UnsafeUnpin for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl UnsafeUnpin for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl UnsafeUnpin for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl UnsafeUnpin for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl UnsafeUnpin for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl UnsafeUnpin for TestDb",1,["fe_common::db::TestDb"]],["impl UnsafeUnpin for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl UnsafeUnpin for Label",1,["fe_common::diagnostics::Label"]],["impl UnsafeUnpin for File",1,["fe_common::files::File"]],["impl UnsafeUnpin for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl UnsafeUnpin for Span",1,["fe_common::span::Span"]],["impl UnsafeUnpin for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl UnsafeUnpin for Dependency",1,["fe_common::utils::files::Dependency"]],["impl UnsafeUnpin for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl UnsafeUnpin for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl UnsafeUnpin for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl UnsafeUnpin for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> UnsafeUnpin for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl UnsafeUnpin for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl UnsafeUnpin for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl UnsafeUnpin for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl UnsafeUnpin for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl UnsafeUnpin for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl UnsafeUnpin for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl UnsafeUnpin for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl UnsafeUnpin for CompileError",1,["fe_driver::CompileError"]],["impl UnsafeUnpin for CompiledContract",1,["fe_driver::CompiledContract"]],["impl UnsafeUnpin for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl UnsafeUnpin for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl UnsafeUnpin for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl UnsafeUnpin for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl UnsafeUnpin for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl UnsafeUnpin for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl UnsafeUnpin for CallType",1,["fe_mir::ir::inst::CallType"]],["impl UnsafeUnpin for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl UnsafeUnpin for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl UnsafeUnpin for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl UnsafeUnpin for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl UnsafeUnpin for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl UnsafeUnpin for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl UnsafeUnpin for Value",1,["fe_mir::ir::value::Value"]],["impl UnsafeUnpin for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl UnsafeUnpin for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl UnsafeUnpin for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl UnsafeUnpin for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl UnsafeUnpin for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl UnsafeUnpin for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl UnsafeUnpin for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl UnsafeUnpin for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl UnsafeUnpin for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl UnsafeUnpin for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl UnsafeUnpin for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl UnsafeUnpin for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl UnsafeUnpin for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl UnsafeUnpin for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl UnsafeUnpin for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl UnsafeUnpin for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl UnsafeUnpin for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl UnsafeUnpin for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl UnsafeUnpin for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl UnsafeUnpin for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl UnsafeUnpin for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl UnsafeUnpin for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl UnsafeUnpin for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl UnsafeUnpin for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl UnsafeUnpin for NewDb",1,["fe_mir::db::NewDb"]],["impl UnsafeUnpin for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl UnsafeUnpin for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl UnsafeUnpin for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl UnsafeUnpin for Constant",1,["fe_mir::ir::constant::Constant"]],["impl UnsafeUnpin for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl UnsafeUnpin for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl UnsafeUnpin for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl UnsafeUnpin for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl UnsafeUnpin for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl UnsafeUnpin for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl UnsafeUnpin for Inst",1,["fe_mir::ir::inst::Inst"]],["impl UnsafeUnpin for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl UnsafeUnpin for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl UnsafeUnpin for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl UnsafeUnpin for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl UnsafeUnpin for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl UnsafeUnpin for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl UnsafeUnpin for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl UnsafeUnpin for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl UnsafeUnpin for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl UnsafeUnpin for Type",1,["fe_mir::ir::types::Type"]],["impl UnsafeUnpin for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl UnsafeUnpin for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> UnsafeUnpin for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> UnsafeUnpin for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> UnsafeUnpin for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> UnsafeUnpin for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> UnsafeUnpin for IterBase<'a, T>
where\n T: UnsafeUnpin,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> UnsafeUnpin for IterMutBase<'a, T>",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl UnsafeUnpin for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl UnsafeUnpin for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl UnsafeUnpin for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl UnsafeUnpin for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl UnsafeUnpin for Expr",1,["fe_parser::ast::Expr"]],["impl UnsafeUnpin for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl UnsafeUnpin for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl UnsafeUnpin for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl UnsafeUnpin for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl UnsafeUnpin for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl UnsafeUnpin for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl UnsafeUnpin for Pattern",1,["fe_parser::ast::Pattern"]],["impl UnsafeUnpin for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl UnsafeUnpin for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl UnsafeUnpin for UseTree",1,["fe_parser::ast::UseTree"]],["impl UnsafeUnpin for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl UnsafeUnpin for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl UnsafeUnpin for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl UnsafeUnpin for CallArg",1,["fe_parser::ast::CallArg"]],["impl UnsafeUnpin for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl UnsafeUnpin for Contract",1,["fe_parser::ast::Contract"]],["impl UnsafeUnpin for Enum",1,["fe_parser::ast::Enum"]],["impl UnsafeUnpin for Field",1,["fe_parser::ast::Field"]],["impl UnsafeUnpin for Function",1,["fe_parser::ast::Function"]],["impl UnsafeUnpin for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl UnsafeUnpin for Impl",1,["fe_parser::ast::Impl"]],["impl UnsafeUnpin for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl UnsafeUnpin for Module",1,["fe_parser::ast::Module"]],["impl UnsafeUnpin for Path",1,["fe_parser::ast::Path"]],["impl UnsafeUnpin for Pragma",1,["fe_parser::ast::Pragma"]],["impl UnsafeUnpin for Struct",1,["fe_parser::ast::Struct"]],["impl UnsafeUnpin for Trait",1,["fe_parser::ast::Trait"]],["impl UnsafeUnpin for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl UnsafeUnpin for Use",1,["fe_parser::ast::Use"]],["impl UnsafeUnpin for Variant",1,["fe_parser::ast::Variant"]],["impl UnsafeUnpin for NodeId",1,["fe_parser::node::NodeId"]],["impl UnsafeUnpin for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> UnsafeUnpin for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> UnsafeUnpin for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> UnsafeUnpin for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> UnsafeUnpin for Node<T>
where\n T: UnsafeUnpin,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl UnsafeUnpin for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl UnsafeUnpin for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl UnsafeUnpin for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1867,2310,41695,5469,5192,1597,571,13913,7304,197,360]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/ops/arith/trait.Add.js b/compiler-docs/trait.impl/core/ops/arith/trait.Add.js new file mode 100644 index 0000000000..ee6b14cfac --- /dev/null +++ b/compiler-docs/trait.impl/core/ops/arith/trait.Add.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[["impl Add for Span"],["impl Add<Option<Span>> for Span"],["impl<'a, T> Add<Option<&'a T>> for Span
where\n Span: Add<&'a T, Output = Self>,
"],["impl<'a, T> Add<&'a T> for Span
where\n T: Spanned,
"]]],["fe_parser",[["impl<'a> Add<&Token<'a>> for Span"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2203,421]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/ops/arith/trait.AddAssign.js b/compiler-docs/trait.impl/core/ops/arith/trait.AddAssign.js new file mode 100644 index 0000000000..ab0821f016 --- /dev/null +++ b/compiler-docs/trait.impl/core/ops/arith/trait.AddAssign.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[["impl<T> AddAssign<T> for Span
where\n Span: Add<T, Output = Self>,
"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[597]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js b/compiler-docs/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js new file mode 100644 index 0000000000..1a374bc61f --- /dev/null +++ b/compiler-docs/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl RefUnwindSafe for Emit",1,["fe::task::build::Emit"]],["impl RefUnwindSafe for Commands",1,["fe::task::Commands"]],["impl RefUnwindSafe for FelangCli",1,["fe::FelangCli"]],["impl RefUnwindSafe for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl RefUnwindSafe for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl RefUnwindSafe for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl RefUnwindSafe for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl RefUnwindSafe for CtxParam",1,["fe_abi::function::CtxParam"]],["impl RefUnwindSafe for SelfParam",1,["fe_abi::function::SelfParam"]],["impl RefUnwindSafe for StateMutability",1,["fe_abi::function::StateMutability"]],["impl RefUnwindSafe for AbiType",1,["fe_abi::types::AbiType"]],["impl RefUnwindSafe for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl RefUnwindSafe for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl RefUnwindSafe for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl RefUnwindSafe for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl RefUnwindSafe for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl RefUnwindSafe for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl RefUnwindSafe for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl !RefUnwindSafe for TempContext",1,["fe_analyzer::context::TempContext"]],["impl RefUnwindSafe for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl RefUnwindSafe for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl RefUnwindSafe for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl RefUnwindSafe for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl RefUnwindSafe for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl RefUnwindSafe for CallType",1,["fe_analyzer::context::CallType"]],["impl RefUnwindSafe for Constant",1,["fe_analyzer::context::Constant"]],["impl RefUnwindSafe for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl RefUnwindSafe for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl RefUnwindSafe for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl RefUnwindSafe for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl RefUnwindSafe for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl RefUnwindSafe for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl RefUnwindSafe for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl RefUnwindSafe for Item",1,["fe_analyzer::namespace::items::Item"]],["impl RefUnwindSafe for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl RefUnwindSafe for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl RefUnwindSafe for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl RefUnwindSafe for Base",1,["fe_analyzer::namespace::types::Base"]],["impl RefUnwindSafe for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl RefUnwindSafe for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl RefUnwindSafe for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl RefUnwindSafe for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl RefUnwindSafe for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl RefUnwindSafe for Type",1,["fe_analyzer::namespace::types::Type"]],["impl RefUnwindSafe for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl RefUnwindSafe for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl RefUnwindSafe for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl RefUnwindSafe for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl RefUnwindSafe for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl RefUnwindSafe for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl RefUnwindSafe for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl RefUnwindSafe for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl RefUnwindSafe for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl RefUnwindSafe for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl RefUnwindSafe for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl RefUnwindSafe for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl RefUnwindSafe for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl RefUnwindSafe for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl RefUnwindSafe for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl RefUnwindSafe for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl RefUnwindSafe for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl RefUnwindSafe for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl RefUnwindSafe for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl RefUnwindSafe for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl RefUnwindSafe for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl RefUnwindSafe for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl RefUnwindSafe for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl RefUnwindSafe for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl RefUnwindSafe for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl RefUnwindSafe for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl RefUnwindSafe for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl RefUnwindSafe for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl RefUnwindSafe for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl RefUnwindSafe for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl RefUnwindSafe for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl RefUnwindSafe for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl RefUnwindSafe for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl RefUnwindSafe for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl RefUnwindSafe for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl RefUnwindSafe for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl RefUnwindSafe for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl RefUnwindSafe for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl RefUnwindSafe for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl RefUnwindSafe for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl RefUnwindSafe for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl RefUnwindSafe for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl RefUnwindSafe for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl RefUnwindSafe for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl RefUnwindSafe for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl RefUnwindSafe for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl RefUnwindSafe for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl RefUnwindSafe for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl RefUnwindSafe for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl RefUnwindSafe for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl RefUnwindSafe for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl RefUnwindSafe for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl RefUnwindSafe for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl RefUnwindSafe for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl RefUnwindSafe for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl RefUnwindSafe for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl RefUnwindSafe for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl RefUnwindSafe for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl RefUnwindSafe for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl RefUnwindSafe for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl RefUnwindSafe for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl RefUnwindSafe for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl RefUnwindSafe for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl RefUnwindSafe for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl RefUnwindSafe for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl RefUnwindSafe for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl RefUnwindSafe for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl RefUnwindSafe for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl RefUnwindSafe for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl RefUnwindSafe for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl RefUnwindSafe for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl RefUnwindSafe for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl RefUnwindSafe for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl RefUnwindSafe for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl RefUnwindSafe for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl RefUnwindSafe for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl RefUnwindSafe for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl RefUnwindSafe for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl RefUnwindSafe for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl RefUnwindSafe for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl RefUnwindSafe for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl RefUnwindSafe for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl RefUnwindSafe for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl RefUnwindSafe for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl RefUnwindSafe for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl RefUnwindSafe for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl RefUnwindSafe for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl RefUnwindSafe for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl RefUnwindSafe for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl RefUnwindSafe for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl RefUnwindSafe for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl RefUnwindSafe for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl RefUnwindSafe for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl RefUnwindSafe for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl RefUnwindSafe for TestDb",1,["fe_analyzer::db::TestDb"]],["impl RefUnwindSafe for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl RefUnwindSafe for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl RefUnwindSafe for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl RefUnwindSafe for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl RefUnwindSafe for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl RefUnwindSafe for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl RefUnwindSafe for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl RefUnwindSafe for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl RefUnwindSafe for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl RefUnwindSafe for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl RefUnwindSafe for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl RefUnwindSafe for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl RefUnwindSafe for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl RefUnwindSafe for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl RefUnwindSafe for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl RefUnwindSafe for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl RefUnwindSafe for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl RefUnwindSafe for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl RefUnwindSafe for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl RefUnwindSafe for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl RefUnwindSafe for Function",1,["fe_analyzer::namespace::items::Function"]],["impl RefUnwindSafe for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl RefUnwindSafe for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl RefUnwindSafe for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl RefUnwindSafe for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl RefUnwindSafe for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl RefUnwindSafe for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl RefUnwindSafe for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl RefUnwindSafe for Module",1,["fe_analyzer::namespace::items::Module"]],["impl RefUnwindSafe for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl RefUnwindSafe for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl RefUnwindSafe for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl RefUnwindSafe for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl RefUnwindSafe for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl RefUnwindSafe for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl RefUnwindSafe for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl RefUnwindSafe for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl RefUnwindSafe for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl RefUnwindSafe for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl RefUnwindSafe for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl RefUnwindSafe for Array",1,["fe_analyzer::namespace::types::Array"]],["impl RefUnwindSafe for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl RefUnwindSafe for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl RefUnwindSafe for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl RefUnwindSafe for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl RefUnwindSafe for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl RefUnwindSafe for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl RefUnwindSafe for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl RefUnwindSafe for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl RefUnwindSafe for Map",1,["fe_analyzer::namespace::types::Map"]],["impl RefUnwindSafe for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl RefUnwindSafe for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl RefUnwindSafe for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl RefUnwindSafe for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl RefUnwindSafe for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl RefUnwindSafe for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl RefUnwindSafe for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !RefUnwindSafe for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !RefUnwindSafe for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !RefUnwindSafe for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> !RefUnwindSafe for DisplayableWrapper<'a, T>",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> RefUnwindSafe for Analysis<T>
where\n T: RefUnwindSafe,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !RefUnwindSafe for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl RefUnwindSafe for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl RefUnwindSafe for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl RefUnwindSafe for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl RefUnwindSafe for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl RefUnwindSafe for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl RefUnwindSafe for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl RefUnwindSafe for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl RefUnwindSafe for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl RefUnwindSafe for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl RefUnwindSafe for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl RefUnwindSafe for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl RefUnwindSafe for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl RefUnwindSafe for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl RefUnwindSafe for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl RefUnwindSafe for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl RefUnwindSafe for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl RefUnwindSafe for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl RefUnwindSafe for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl RefUnwindSafe for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl RefUnwindSafe for Db",1,["fe_codegen::db::Db"]],["impl RefUnwindSafe for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl RefUnwindSafe for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl RefUnwindSafe for FileKind",1,["fe_common::files::FileKind"]],["impl RefUnwindSafe for Radix",1,["fe_common::numeric::Radix"]],["impl RefUnwindSafe for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl RefUnwindSafe for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl RefUnwindSafe for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl RefUnwindSafe for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl RefUnwindSafe for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl RefUnwindSafe for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl RefUnwindSafe for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl RefUnwindSafe for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl RefUnwindSafe for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl RefUnwindSafe for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl RefUnwindSafe for TestDb",1,["fe_common::db::TestDb"]],["impl RefUnwindSafe for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl RefUnwindSafe for Label",1,["fe_common::diagnostics::Label"]],["impl RefUnwindSafe for File",1,["fe_common::files::File"]],["impl RefUnwindSafe for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl RefUnwindSafe for Span",1,["fe_common::span::Span"]],["impl RefUnwindSafe for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl RefUnwindSafe for Dependency",1,["fe_common::utils::files::Dependency"]],["impl RefUnwindSafe for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl RefUnwindSafe for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl RefUnwindSafe for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl RefUnwindSafe for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> RefUnwindSafe for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl !RefUnwindSafe for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl !RefUnwindSafe for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl RefUnwindSafe for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl RefUnwindSafe for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl RefUnwindSafe for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl RefUnwindSafe for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl RefUnwindSafe for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl RefUnwindSafe for CompileError",1,["fe_driver::CompileError"]],["impl RefUnwindSafe for CompiledContract",1,["fe_driver::CompiledContract"]],["impl RefUnwindSafe for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl RefUnwindSafe for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl RefUnwindSafe for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl RefUnwindSafe for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl RefUnwindSafe for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl RefUnwindSafe for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl RefUnwindSafe for CallType",1,["fe_mir::ir::inst::CallType"]],["impl RefUnwindSafe for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl RefUnwindSafe for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl RefUnwindSafe for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl RefUnwindSafe for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl RefUnwindSafe for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl RefUnwindSafe for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl RefUnwindSafe for Value",1,["fe_mir::ir::value::Value"]],["impl RefUnwindSafe for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl RefUnwindSafe for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl RefUnwindSafe for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl RefUnwindSafe for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl RefUnwindSafe for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl RefUnwindSafe for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl RefUnwindSafe for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl RefUnwindSafe for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl RefUnwindSafe for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl RefUnwindSafe for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl RefUnwindSafe for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl RefUnwindSafe for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl RefUnwindSafe for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl RefUnwindSafe for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl RefUnwindSafe for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl RefUnwindSafe for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl RefUnwindSafe for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl RefUnwindSafe for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl RefUnwindSafe for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl RefUnwindSafe for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl RefUnwindSafe for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl RefUnwindSafe for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl RefUnwindSafe for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl RefUnwindSafe for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl RefUnwindSafe for NewDb",1,["fe_mir::db::NewDb"]],["impl RefUnwindSafe for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl RefUnwindSafe for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl RefUnwindSafe for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl RefUnwindSafe for Constant",1,["fe_mir::ir::constant::Constant"]],["impl RefUnwindSafe for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl RefUnwindSafe for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl RefUnwindSafe for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl RefUnwindSafe for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl RefUnwindSafe for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl RefUnwindSafe for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl RefUnwindSafe for Inst",1,["fe_mir::ir::inst::Inst"]],["impl RefUnwindSafe for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl RefUnwindSafe for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl RefUnwindSafe for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl RefUnwindSafe for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl RefUnwindSafe for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl RefUnwindSafe for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl RefUnwindSafe for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl RefUnwindSafe for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl RefUnwindSafe for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl RefUnwindSafe for Type",1,["fe_mir::ir::types::Type"]],["impl RefUnwindSafe for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl RefUnwindSafe for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> RefUnwindSafe for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> RefUnwindSafe for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a> RefUnwindSafe for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a, 'b> RefUnwindSafe for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> RefUnwindSafe for IterBase<'a, T>
where\n T: RefUnwindSafe,
",1,["fe_mir::ir::inst::IterBase"]],["impl<'a, T> RefUnwindSafe for IterMutBase<'a, T>
where\n T: RefUnwindSafe,
",1,["fe_mir::ir::inst::IterMutBase"]]]],["fe_parser",[["impl RefUnwindSafe for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl RefUnwindSafe for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl RefUnwindSafe for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl RefUnwindSafe for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl RefUnwindSafe for Expr",1,["fe_parser::ast::Expr"]],["impl RefUnwindSafe for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl RefUnwindSafe for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl RefUnwindSafe for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl RefUnwindSafe for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl RefUnwindSafe for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl RefUnwindSafe for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl RefUnwindSafe for Pattern",1,["fe_parser::ast::Pattern"]],["impl RefUnwindSafe for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl RefUnwindSafe for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl RefUnwindSafe for UseTree",1,["fe_parser::ast::UseTree"]],["impl RefUnwindSafe for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl RefUnwindSafe for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl RefUnwindSafe for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl RefUnwindSafe for CallArg",1,["fe_parser::ast::CallArg"]],["impl RefUnwindSafe for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl RefUnwindSafe for Contract",1,["fe_parser::ast::Contract"]],["impl RefUnwindSafe for Enum",1,["fe_parser::ast::Enum"]],["impl RefUnwindSafe for Field",1,["fe_parser::ast::Field"]],["impl RefUnwindSafe for Function",1,["fe_parser::ast::Function"]],["impl RefUnwindSafe for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl RefUnwindSafe for Impl",1,["fe_parser::ast::Impl"]],["impl RefUnwindSafe for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl RefUnwindSafe for Module",1,["fe_parser::ast::Module"]],["impl RefUnwindSafe for Path",1,["fe_parser::ast::Path"]],["impl RefUnwindSafe for Pragma",1,["fe_parser::ast::Pragma"]],["impl RefUnwindSafe for Struct",1,["fe_parser::ast::Struct"]],["impl RefUnwindSafe for Trait",1,["fe_parser::ast::Trait"]],["impl RefUnwindSafe for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl RefUnwindSafe for Use",1,["fe_parser::ast::Use"]],["impl RefUnwindSafe for Variant",1,["fe_parser::ast::Variant"]],["impl RefUnwindSafe for NodeId",1,["fe_parser::node::NodeId"]],["impl RefUnwindSafe for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> RefUnwindSafe for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> RefUnwindSafe for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> RefUnwindSafe for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> RefUnwindSafe for Node<T>
where\n T: RefUnwindSafe,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl RefUnwindSafe for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl RefUnwindSafe for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl RefUnwindSafe for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2041,4362,73111,9232,9638,2796,1084,25765,14486,368,702]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js b/compiler-docs/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js new file mode 100644 index 0000000000..f1ab27f973 --- /dev/null +++ b/compiler-docs/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe",[["impl UnwindSafe for Emit",1,["fe::task::build::Emit"]],["impl UnwindSafe for Commands",1,["fe::task::Commands"]],["impl UnwindSafe for FelangCli",1,["fe::FelangCli"]],["impl UnwindSafe for BuildArgs",1,["fe::task::build::BuildArgs"]],["impl UnwindSafe for CheckArgs",1,["fe::task::check::CheckArgs"]],["impl UnwindSafe for NewProjectArgs",1,["fe::task::new::NewProjectArgs"]]]],["fe_abi",[["impl UnwindSafe for AbiFunctionType",1,["fe_abi::function::AbiFunctionType"]],["impl UnwindSafe for CtxParam",1,["fe_abi::function::CtxParam"]],["impl UnwindSafe for SelfParam",1,["fe_abi::function::SelfParam"]],["impl UnwindSafe for StateMutability",1,["fe_abi::function::StateMutability"]],["impl UnwindSafe for AbiType",1,["fe_abi::types::AbiType"]],["impl UnwindSafe for AbiContract",1,["fe_abi::contract::AbiContract"]],["impl UnwindSafe for AbiEvent",1,["fe_abi::event::AbiEvent"]],["impl UnwindSafe for AbiEventField",1,["fe_abi::event::AbiEventField"]],["impl UnwindSafe for AbiEventSignature",1,["fe_abi::event::AbiEventSignature"]],["impl UnwindSafe for AbiFunction",1,["fe_abi::function::AbiFunction"]],["impl UnwindSafe for AbiFunctionSelector",1,["fe_abi::function::AbiFunctionSelector"]],["impl UnwindSafe for AbiTupleField",1,["fe_abi::types::AbiTupleField"]]]],["fe_analyzer",[["impl UnwindSafe for ContractTypeMethod",1,["fe_analyzer::builtins::ContractTypeMethod"]],["impl UnwindSafe for GlobalFunction",1,["fe_analyzer::builtins::GlobalFunction"]],["impl UnwindSafe for Intrinsic",1,["fe_analyzer::builtins::Intrinsic"]],["impl UnwindSafe for ValueMethod",1,["fe_analyzer::builtins::ValueMethod"]],["impl UnwindSafe for AdjustmentKind",1,["fe_analyzer::context::AdjustmentKind"]],["impl UnwindSafe for CallType",1,["fe_analyzer::context::CallType"]],["impl UnwindSafe for Constant",1,["fe_analyzer::context::Constant"]],["impl UnwindSafe for NamedThing",1,["fe_analyzer::context::NamedThing"]],["impl UnwindSafe for BinaryOperationError",1,["fe_analyzer::errors::BinaryOperationError"]],["impl UnwindSafe for IndexingError",1,["fe_analyzer::errors::IndexingError"]],["impl UnwindSafe for TypeCoercionError",1,["fe_analyzer::errors::TypeCoercionError"]],["impl UnwindSafe for DepLocality",1,["fe_analyzer::namespace::items::DepLocality"]],["impl UnwindSafe for EnumVariantKind",1,["fe_analyzer::namespace::items::EnumVariantKind"]],["impl UnwindSafe for IngotMode",1,["fe_analyzer::namespace::items::IngotMode"]],["impl UnwindSafe for Item",1,["fe_analyzer::namespace::items::Item"]],["impl UnwindSafe for ModuleSource",1,["fe_analyzer::namespace::items::ModuleSource"]],["impl UnwindSafe for TypeDef",1,["fe_analyzer::namespace::items::TypeDef"]],["impl UnwindSafe for BlockScopeType",1,["fe_analyzer::namespace::scopes::BlockScopeType"]],["impl UnwindSafe for Base",1,["fe_analyzer::namespace::types::Base"]],["impl UnwindSafe for GenericArg",1,["fe_analyzer::namespace::types::GenericArg"]],["impl UnwindSafe for GenericParamKind",1,["fe_analyzer::namespace::types::GenericParamKind"]],["impl UnwindSafe for GenericType",1,["fe_analyzer::namespace::types::GenericType"]],["impl UnwindSafe for Integer",1,["fe_analyzer::namespace::types::Integer"]],["impl UnwindSafe for TraitOrType",1,["fe_analyzer::namespace::types::TraitOrType"]],["impl UnwindSafe for Type",1,["fe_analyzer::namespace::types::Type"]],["impl UnwindSafe for ConstructorKind",1,["fe_analyzer::traversal::pattern_analysis::ConstructorKind"]],["impl UnwindSafe for LiteralConstructor",1,["fe_analyzer::traversal::pattern_analysis::LiteralConstructor"]],["impl UnwindSafe for SimplifiedPatternKind",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPatternKind"]],["impl UnwindSafe for GlobalFunctionIter",1,["fe_analyzer::builtins::GlobalFunctionIter"]],["impl UnwindSafe for IntrinsicIter",1,["fe_analyzer::builtins::IntrinsicIter"]],["impl UnwindSafe for Adjustment",1,["fe_analyzer::context::Adjustment"]],["impl UnwindSafe for DiagnosticVoucher",1,["fe_analyzer::context::DiagnosticVoucher"]],["impl UnwindSafe for ExpressionAttributes",1,["fe_analyzer::context::ExpressionAttributes"]],["impl UnwindSafe for FunctionBody",1,["fe_analyzer::context::FunctionBody"]],["impl UnwindSafe for TempContext",1,["fe_analyzer::context::TempContext"]],["impl UnwindSafe for AllImplsQuery",1,["fe_analyzer::db::AllImplsQuery"]],["impl UnwindSafe for AnalyzerDbGroupStorage__",1,["fe_analyzer::db::AnalyzerDbGroupStorage__"]],["impl UnwindSafe for AnalyzerDbStorage",1,["fe_analyzer::db::AnalyzerDbStorage"]],["impl UnwindSafe for ContractAllFieldsQuery",1,["fe_analyzer::db::ContractAllFieldsQuery"]],["impl UnwindSafe for ContractAllFunctionsQuery",1,["fe_analyzer::db::ContractAllFunctionsQuery"]],["impl UnwindSafe for ContractCallFunctionQuery",1,["fe_analyzer::db::ContractCallFunctionQuery"]],["impl UnwindSafe for ContractDependencyGraphQuery",1,["fe_analyzer::db::ContractDependencyGraphQuery"]],["impl UnwindSafe for ContractFieldMapQuery",1,["fe_analyzer::db::ContractFieldMapQuery"]],["impl UnwindSafe for ContractFieldTypeQuery",1,["fe_analyzer::db::ContractFieldTypeQuery"]],["impl UnwindSafe for ContractFunctionMapQuery",1,["fe_analyzer::db::ContractFunctionMapQuery"]],["impl UnwindSafe for ContractInitFunctionQuery",1,["fe_analyzer::db::ContractInitFunctionQuery"]],["impl UnwindSafe for ContractPublicFunctionMapQuery",1,["fe_analyzer::db::ContractPublicFunctionMapQuery"]],["impl UnwindSafe for ContractRuntimeDependencyGraphQuery",1,["fe_analyzer::db::ContractRuntimeDependencyGraphQuery"]],["impl UnwindSafe for EnumAllFunctionsQuery",1,["fe_analyzer::db::EnumAllFunctionsQuery"]],["impl UnwindSafe for EnumAllVariantsQuery",1,["fe_analyzer::db::EnumAllVariantsQuery"]],["impl UnwindSafe for EnumDependencyGraphQuery",1,["fe_analyzer::db::EnumDependencyGraphQuery"]],["impl UnwindSafe for EnumFunctionMapQuery",1,["fe_analyzer::db::EnumFunctionMapQuery"]],["impl UnwindSafe for EnumVariantKindQuery",1,["fe_analyzer::db::EnumVariantKindQuery"]],["impl UnwindSafe for EnumVariantMapQuery",1,["fe_analyzer::db::EnumVariantMapQuery"]],["impl UnwindSafe for FunctionBodyQuery",1,["fe_analyzer::db::FunctionBodyQuery"]],["impl UnwindSafe for FunctionDependencyGraphQuery",1,["fe_analyzer::db::FunctionDependencyGraphQuery"]],["impl UnwindSafe for FunctionSignatureQuery",1,["fe_analyzer::db::FunctionSignatureQuery"]],["impl UnwindSafe for FunctionSigsQuery",1,["fe_analyzer::db::FunctionSigsQuery"]],["impl UnwindSafe for ImplAllFunctionsQuery",1,["fe_analyzer::db::ImplAllFunctionsQuery"]],["impl UnwindSafe for ImplForQuery",1,["fe_analyzer::db::ImplForQuery"]],["impl UnwindSafe for ImplFunctionMapQuery",1,["fe_analyzer::db::ImplFunctionMapQuery"]],["impl UnwindSafe for IngotExternalIngotsQuery",1,["fe_analyzer::db::IngotExternalIngotsQuery"]],["impl UnwindSafe for IngotFilesQuery",1,["fe_analyzer::db::IngotFilesQuery"]],["impl UnwindSafe for IngotModulesQuery",1,["fe_analyzer::db::IngotModulesQuery"]],["impl UnwindSafe for IngotRootModuleQuery",1,["fe_analyzer::db::IngotRootModuleQuery"]],["impl UnwindSafe for InternAttributeLookupQuery",1,["fe_analyzer::db::InternAttributeLookupQuery"]],["impl UnwindSafe for InternAttributeQuery",1,["fe_analyzer::db::InternAttributeQuery"]],["impl UnwindSafe for InternContractFieldLookupQuery",1,["fe_analyzer::db::InternContractFieldLookupQuery"]],["impl UnwindSafe for InternContractFieldQuery",1,["fe_analyzer::db::InternContractFieldQuery"]],["impl UnwindSafe for InternContractLookupQuery",1,["fe_analyzer::db::InternContractLookupQuery"]],["impl UnwindSafe for InternContractQuery",1,["fe_analyzer::db::InternContractQuery"]],["impl UnwindSafe for InternEnumLookupQuery",1,["fe_analyzer::db::InternEnumLookupQuery"]],["impl UnwindSafe for InternEnumQuery",1,["fe_analyzer::db::InternEnumQuery"]],["impl UnwindSafe for InternEnumVariantLookupQuery",1,["fe_analyzer::db::InternEnumVariantLookupQuery"]],["impl UnwindSafe for InternEnumVariantQuery",1,["fe_analyzer::db::InternEnumVariantQuery"]],["impl UnwindSafe for InternFunctionLookupQuery",1,["fe_analyzer::db::InternFunctionLookupQuery"]],["impl UnwindSafe for InternFunctionQuery",1,["fe_analyzer::db::InternFunctionQuery"]],["impl UnwindSafe for InternFunctionSigLookupQuery",1,["fe_analyzer::db::InternFunctionSigLookupQuery"]],["impl UnwindSafe for InternFunctionSigQuery",1,["fe_analyzer::db::InternFunctionSigQuery"]],["impl UnwindSafe for InternImplLookupQuery",1,["fe_analyzer::db::InternImplLookupQuery"]],["impl UnwindSafe for InternImplQuery",1,["fe_analyzer::db::InternImplQuery"]],["impl UnwindSafe for InternIngotLookupQuery",1,["fe_analyzer::db::InternIngotLookupQuery"]],["impl UnwindSafe for InternIngotQuery",1,["fe_analyzer::db::InternIngotQuery"]],["impl UnwindSafe for InternModuleConstLookupQuery",1,["fe_analyzer::db::InternModuleConstLookupQuery"]],["impl UnwindSafe for InternModuleConstQuery",1,["fe_analyzer::db::InternModuleConstQuery"]],["impl UnwindSafe for InternModuleLookupQuery",1,["fe_analyzer::db::InternModuleLookupQuery"]],["impl UnwindSafe for InternModuleQuery",1,["fe_analyzer::db::InternModuleQuery"]],["impl UnwindSafe for InternStructFieldLookupQuery",1,["fe_analyzer::db::InternStructFieldLookupQuery"]],["impl UnwindSafe for InternStructFieldQuery",1,["fe_analyzer::db::InternStructFieldQuery"]],["impl UnwindSafe for InternStructLookupQuery",1,["fe_analyzer::db::InternStructLookupQuery"]],["impl UnwindSafe for InternStructQuery",1,["fe_analyzer::db::InternStructQuery"]],["impl UnwindSafe for InternTraitLookupQuery",1,["fe_analyzer::db::InternTraitLookupQuery"]],["impl UnwindSafe for InternTraitQuery",1,["fe_analyzer::db::InternTraitQuery"]],["impl UnwindSafe for InternTypeAliasLookupQuery",1,["fe_analyzer::db::InternTypeAliasLookupQuery"]],["impl UnwindSafe for InternTypeAliasQuery",1,["fe_analyzer::db::InternTypeAliasQuery"]],["impl UnwindSafe for InternTypeLookupQuery",1,["fe_analyzer::db::InternTypeLookupQuery"]],["impl UnwindSafe for InternTypeQuery",1,["fe_analyzer::db::InternTypeQuery"]],["impl UnwindSafe for ModuleAllImplsQuery",1,["fe_analyzer::db::ModuleAllImplsQuery"]],["impl UnwindSafe for ModuleAllItemsQuery",1,["fe_analyzer::db::ModuleAllItemsQuery"]],["impl UnwindSafe for ModuleConstantTypeQuery",1,["fe_analyzer::db::ModuleConstantTypeQuery"]],["impl UnwindSafe for ModuleConstantValueQuery",1,["fe_analyzer::db::ModuleConstantValueQuery"]],["impl UnwindSafe for ModuleConstantsQuery",1,["fe_analyzer::db::ModuleConstantsQuery"]],["impl UnwindSafe for ModuleContractsQuery",1,["fe_analyzer::db::ModuleContractsQuery"]],["impl UnwindSafe for ModuleFilePathQuery",1,["fe_analyzer::db::ModuleFilePathQuery"]],["impl UnwindSafe for ModuleImplMapQuery",1,["fe_analyzer::db::ModuleImplMapQuery"]],["impl UnwindSafe for ModuleIsIncompleteQuery",1,["fe_analyzer::db::ModuleIsIncompleteQuery"]],["impl UnwindSafe for ModuleItemMapQuery",1,["fe_analyzer::db::ModuleItemMapQuery"]],["impl UnwindSafe for ModuleParentModuleQuery",1,["fe_analyzer::db::ModuleParentModuleQuery"]],["impl UnwindSafe for ModuleParseQuery",1,["fe_analyzer::db::ModuleParseQuery"]],["impl UnwindSafe for ModuleStructsQuery",1,["fe_analyzer::db::ModuleStructsQuery"]],["impl UnwindSafe for ModuleSubmodulesQuery",1,["fe_analyzer::db::ModuleSubmodulesQuery"]],["impl UnwindSafe for ModuleTestsQuery",1,["fe_analyzer::db::ModuleTestsQuery"]],["impl UnwindSafe for ModuleUsedItemMapQuery",1,["fe_analyzer::db::ModuleUsedItemMapQuery"]],["impl UnwindSafe for RootIngotQuery",1,["fe_analyzer::db::RootIngotQuery"]],["impl UnwindSafe for StructAllFieldsQuery",1,["fe_analyzer::db::StructAllFieldsQuery"]],["impl UnwindSafe for StructAllFunctionsQuery",1,["fe_analyzer::db::StructAllFunctionsQuery"]],["impl UnwindSafe for StructDependencyGraphQuery",1,["fe_analyzer::db::StructDependencyGraphQuery"]],["impl UnwindSafe for StructFieldMapQuery",1,["fe_analyzer::db::StructFieldMapQuery"]],["impl UnwindSafe for StructFieldTypeQuery",1,["fe_analyzer::db::StructFieldTypeQuery"]],["impl UnwindSafe for StructFunctionMapQuery",1,["fe_analyzer::db::StructFunctionMapQuery"]],["impl UnwindSafe for TestDb",1,["fe_analyzer::db::TestDb"]],["impl UnwindSafe for TraitAllFunctionsQuery",1,["fe_analyzer::db::TraitAllFunctionsQuery"]],["impl UnwindSafe for TraitFunctionMapQuery",1,["fe_analyzer::db::TraitFunctionMapQuery"]],["impl UnwindSafe for TraitIsImplementedForQuery",1,["fe_analyzer::db::TraitIsImplementedForQuery"]],["impl UnwindSafe for TypeAliasTypeQuery",1,["fe_analyzer::db::TypeAliasTypeQuery"]],["impl UnwindSafe for AlreadyDefined",1,["fe_analyzer::errors::AlreadyDefined"]],["impl UnwindSafe for ConstEvalError",1,["fe_analyzer::errors::ConstEvalError"]],["impl UnwindSafe for FatalError",1,["fe_analyzer::errors::FatalError"]],["impl UnwindSafe for IncompleteItem",1,["fe_analyzer::errors::IncompleteItem"]],["impl UnwindSafe for TypeError",1,["fe_analyzer::errors::TypeError"]],["impl UnwindSafe for Attribute",1,["fe_analyzer::namespace::items::Attribute"]],["impl UnwindSafe for AttributeId",1,["fe_analyzer::namespace::items::AttributeId"]],["impl UnwindSafe for Contract",1,["fe_analyzer::namespace::items::Contract"]],["impl UnwindSafe for ContractField",1,["fe_analyzer::namespace::items::ContractField"]],["impl UnwindSafe for ContractFieldId",1,["fe_analyzer::namespace::items::ContractFieldId"]],["impl UnwindSafe for ContractId",1,["fe_analyzer::namespace::items::ContractId"]],["impl UnwindSafe for DepGraphWrapper",1,["fe_analyzer::namespace::items::DepGraphWrapper"]],["impl UnwindSafe for Enum",1,["fe_analyzer::namespace::items::Enum"]],["impl UnwindSafe for EnumId",1,["fe_analyzer::namespace::items::EnumId"]],["impl UnwindSafe for EnumVariant",1,["fe_analyzer::namespace::items::EnumVariant"]],["impl UnwindSafe for EnumVariantId",1,["fe_analyzer::namespace::items::EnumVariantId"]],["impl UnwindSafe for Function",1,["fe_analyzer::namespace::items::Function"]],["impl UnwindSafe for FunctionId",1,["fe_analyzer::namespace::items::FunctionId"]],["impl UnwindSafe for FunctionSig",1,["fe_analyzer::namespace::items::FunctionSig"]],["impl UnwindSafe for FunctionSigId",1,["fe_analyzer::namespace::items::FunctionSigId"]],["impl UnwindSafe for Impl",1,["fe_analyzer::namespace::items::Impl"]],["impl UnwindSafe for ImplId",1,["fe_analyzer::namespace::items::ImplId"]],["impl UnwindSafe for Ingot",1,["fe_analyzer::namespace::items::Ingot"]],["impl UnwindSafe for IngotId",1,["fe_analyzer::namespace::items::IngotId"]],["impl UnwindSafe for Module",1,["fe_analyzer::namespace::items::Module"]],["impl UnwindSafe for ModuleConstant",1,["fe_analyzer::namespace::items::ModuleConstant"]],["impl UnwindSafe for ModuleConstantId",1,["fe_analyzer::namespace::items::ModuleConstantId"]],["impl UnwindSafe for ModuleId",1,["fe_analyzer::namespace::items::ModuleId"]],["impl UnwindSafe for Struct",1,["fe_analyzer::namespace::items::Struct"]],["impl UnwindSafe for StructField",1,["fe_analyzer::namespace::items::StructField"]],["impl UnwindSafe for StructFieldId",1,["fe_analyzer::namespace::items::StructFieldId"]],["impl UnwindSafe for StructId",1,["fe_analyzer::namespace::items::StructId"]],["impl UnwindSafe for Trait",1,["fe_analyzer::namespace::items::Trait"]],["impl UnwindSafe for TraitId",1,["fe_analyzer::namespace::items::TraitId"]],["impl UnwindSafe for TypeAlias",1,["fe_analyzer::namespace::items::TypeAlias"]],["impl UnwindSafe for TypeAliasId",1,["fe_analyzer::namespace::items::TypeAliasId"]],["impl UnwindSafe for Array",1,["fe_analyzer::namespace::types::Array"]],["impl UnwindSafe for CtxDecl",1,["fe_analyzer::namespace::types::CtxDecl"]],["impl UnwindSafe for FeString",1,["fe_analyzer::namespace::types::FeString"]],["impl UnwindSafe for FunctionParam",1,["fe_analyzer::namespace::types::FunctionParam"]],["impl UnwindSafe for FunctionSignature",1,["fe_analyzer::namespace::types::FunctionSignature"]],["impl UnwindSafe for Generic",1,["fe_analyzer::namespace::types::Generic"]],["impl UnwindSafe for GenericParam",1,["fe_analyzer::namespace::types::GenericParam"]],["impl UnwindSafe for GenericTypeIter",1,["fe_analyzer::namespace::types::GenericTypeIter"]],["impl UnwindSafe for IntegerIter",1,["fe_analyzer::namespace::types::IntegerIter"]],["impl UnwindSafe for Map",1,["fe_analyzer::namespace::types::Map"]],["impl UnwindSafe for SelfDecl",1,["fe_analyzer::namespace::types::SelfDecl"]],["impl UnwindSafe for Tuple",1,["fe_analyzer::namespace::types::Tuple"]],["impl UnwindSafe for TypeId",1,["fe_analyzer::namespace::types::TypeId"]],["impl UnwindSafe for PatternMatrix",1,["fe_analyzer::traversal::pattern_analysis::PatternMatrix"]],["impl UnwindSafe for PatternRowVec",1,["fe_analyzer::traversal::pattern_analysis::PatternRowVec"]],["impl UnwindSafe for SigmaSet",1,["fe_analyzer::traversal::pattern_analysis::SigmaSet"]],["impl UnwindSafe for SimplifiedPattern",1,["fe_analyzer::traversal::pattern_analysis::SimplifiedPattern"]],["impl<'a> !UnwindSafe for FunctionScope<'a>",1,["fe_analyzer::namespace::scopes::FunctionScope"]],["impl<'a> !UnwindSafe for ItemScope<'a>",1,["fe_analyzer::namespace::scopes::ItemScope"]],["impl<'a, 'b> !UnwindSafe for BlockScope<'a, 'b>",1,["fe_analyzer::namespace::scopes::BlockScope"]],["impl<'a, T> !UnwindSafe for DisplayableWrapper<'a, T>",1,["fe_analyzer::display::DisplayableWrapper"]],["impl<T> UnwindSafe for Analysis<T>
where\n T: UnwindSafe,
",1,["fe_analyzer::context::Analysis"]]]],["fe_codegen",[["impl !UnwindSafe for Context",1,["fe_codegen::yul::isel::context::Context"]],["impl UnwindSafe for AbiSrcLocation",1,["fe_codegen::yul::runtime::AbiSrcLocation"]],["impl UnwindSafe for CodegenAbiContractQuery",1,["fe_codegen::db::CodegenAbiContractQuery"]],["impl UnwindSafe for CodegenAbiEventQuery",1,["fe_codegen::db::CodegenAbiEventQuery"]],["impl UnwindSafe for CodegenAbiFunctionArgumentMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionArgumentMaximumSizeQuery"]],["impl UnwindSafe for CodegenAbiFunctionQuery",1,["fe_codegen::db::CodegenAbiFunctionQuery"]],["impl UnwindSafe for CodegenAbiFunctionReturnMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiFunctionReturnMaximumSizeQuery"]],["impl UnwindSafe for CodegenAbiModuleEventsQuery",1,["fe_codegen::db::CodegenAbiModuleEventsQuery"]],["impl UnwindSafe for CodegenAbiTypeMaximumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMaximumSizeQuery"]],["impl UnwindSafe for CodegenAbiTypeMinimumSizeQuery",1,["fe_codegen::db::CodegenAbiTypeMinimumSizeQuery"]],["impl UnwindSafe for CodegenAbiTypeQuery",1,["fe_codegen::db::CodegenAbiTypeQuery"]],["impl UnwindSafe for CodegenConstantStringSymbolNameQuery",1,["fe_codegen::db::CodegenConstantStringSymbolNameQuery"]],["impl UnwindSafe for CodegenContractDeployerSymbolNameQuery",1,["fe_codegen::db::CodegenContractDeployerSymbolNameQuery"]],["impl UnwindSafe for CodegenContractSymbolNameQuery",1,["fe_codegen::db::CodegenContractSymbolNameQuery"]],["impl UnwindSafe for CodegenDbGroupStorage__",1,["fe_codegen::db::CodegenDbGroupStorage__"]],["impl UnwindSafe for CodegenDbStorage",1,["fe_codegen::db::CodegenDbStorage"]],["impl UnwindSafe for CodegenFunctionSymbolNameQuery",1,["fe_codegen::db::CodegenFunctionSymbolNameQuery"]],["impl UnwindSafe for CodegenLegalizedBodyQuery",1,["fe_codegen::db::CodegenLegalizedBodyQuery"]],["impl UnwindSafe for CodegenLegalizedSignatureQuery",1,["fe_codegen::db::CodegenLegalizedSignatureQuery"]],["impl UnwindSafe for CodegenLegalizedTypeQuery",1,["fe_codegen::db::CodegenLegalizedTypeQuery"]],["impl UnwindSafe for Db",1,["fe_codegen::db::Db"]],["impl UnwindSafe for DefaultRuntimeProvider",1,["fe_codegen::yul::runtime::DefaultRuntimeProvider"]]]],["fe_common",[["impl UnwindSafe for LabelStyle",1,["fe_common::diagnostics::LabelStyle"]],["impl UnwindSafe for FileKind",1,["fe_common::files::FileKind"]],["impl UnwindSafe for Radix",1,["fe_common::numeric::Radix"]],["impl UnwindSafe for DependencyKind",1,["fe_common::utils::files::DependencyKind"]],["impl UnwindSafe for FileLoader",1,["fe_common::utils::files::FileLoader"]],["impl UnwindSafe for ProjectMode",1,["fe_common::utils::files::ProjectMode"]],["impl UnwindSafe for FileContentQuery",1,["fe_common::db::FileContentQuery"]],["impl UnwindSafe for FileLineStartsQuery",1,["fe_common::db::FileLineStartsQuery"]],["impl UnwindSafe for FileNameQuery",1,["fe_common::db::FileNameQuery"]],["impl UnwindSafe for InternFileLookupQuery",1,["fe_common::db::InternFileLookupQuery"]],["impl UnwindSafe for InternFileQuery",1,["fe_common::db::InternFileQuery"]],["impl UnwindSafe for SourceDbGroupStorage__",1,["fe_common::db::SourceDbGroupStorage__"]],["impl UnwindSafe for SourceDbStorage",1,["fe_common::db::SourceDbStorage"]],["impl UnwindSafe for TestDb",1,["fe_common::db::TestDb"]],["impl UnwindSafe for Diagnostic",1,["fe_common::diagnostics::Diagnostic"]],["impl UnwindSafe for Label",1,["fe_common::diagnostics::Label"]],["impl UnwindSafe for File",1,["fe_common::files::File"]],["impl UnwindSafe for SourceFileId",1,["fe_common::files::SourceFileId"]],["impl UnwindSafe for Span",1,["fe_common::span::Span"]],["impl UnwindSafe for BuildFiles",1,["fe_common::utils::files::BuildFiles"]],["impl UnwindSafe for Dependency",1,["fe_common::utils::files::Dependency"]],["impl UnwindSafe for GitDependency",1,["fe_common::utils::files::GitDependency"]],["impl UnwindSafe for LocalDependency",1,["fe_common::utils::files::LocalDependency"]],["impl UnwindSafe for ProjectFiles",1,["fe_common::utils::files::ProjectFiles"]],["impl UnwindSafe for Diff",1,["fe_common::utils::ron::Diff"]],["impl<'a> UnwindSafe for Literal<'a>",1,["fe_common::numeric::Literal"]]]],["fe_compiler_test_utils",[["impl UnwindSafe for ContractHarness",1,["fe_compiler_test_utils::ContractHarness"]],["impl UnwindSafe for ExecutionOutput",1,["fe_compiler_test_utils::ExecutionOutput"]],["impl UnwindSafe for GasRecord",1,["fe_compiler_test_utils::GasRecord"]],["impl UnwindSafe for GasReporter",1,["fe_compiler_test_utils::GasReporter"]],["impl UnwindSafe for NumericAbiTokenBounds",1,["fe_compiler_test_utils::NumericAbiTokenBounds"]],["impl UnwindSafe for Runtime",1,["fe_compiler_test_utils::Runtime"]],["impl UnwindSafe for SolidityCompileError",1,["fe_compiler_test_utils::SolidityCompileError"]]]],["fe_driver",[["impl UnwindSafe for CompileError",1,["fe_driver::CompileError"]],["impl UnwindSafe for CompiledContract",1,["fe_driver::CompiledContract"]],["impl UnwindSafe for CompiledModule",1,["fe_driver::CompiledModule"]]]],["fe_mir",[["impl UnwindSafe for PostIDom",1,["fe_mir::analysis::post_domtree::PostIDom"]],["impl UnwindSafe for CursorLocation",1,["fe_mir::ir::body_cursor::CursorLocation"]],["impl UnwindSafe for ConstantValue",1,["fe_mir::ir::constant::ConstantValue"]],["impl UnwindSafe for Linkage",1,["fe_mir::ir::function::Linkage"]],["impl UnwindSafe for BinOp",1,["fe_mir::ir::inst::BinOp"]],["impl UnwindSafe for CallType",1,["fe_mir::ir::inst::CallType"]],["impl UnwindSafe for CastKind",1,["fe_mir::ir::inst::CastKind"]],["impl UnwindSafe for InstKind",1,["fe_mir::ir::inst::InstKind"]],["impl UnwindSafe for UnOp",1,["fe_mir::ir::inst::UnOp"]],["impl UnwindSafe for YulIntrinsicOp",1,["fe_mir::ir::inst::YulIntrinsicOp"]],["impl UnwindSafe for TypeKind",1,["fe_mir::ir::types::TypeKind"]],["impl UnwindSafe for AssignableValue",1,["fe_mir::ir::value::AssignableValue"]],["impl UnwindSafe for Value",1,["fe_mir::ir::value::Value"]],["impl UnwindSafe for ControlFlowGraph",1,["fe_mir::analysis::cfg::ControlFlowGraph"]],["impl UnwindSafe for DFSet",1,["fe_mir::analysis::domtree::DFSet"]],["impl UnwindSafe for DomTree",1,["fe_mir::analysis::domtree::DomTree"]],["impl UnwindSafe for Loop",1,["fe_mir::analysis::loop_tree::Loop"]],["impl UnwindSafe for LoopTree",1,["fe_mir::analysis::loop_tree::LoopTree"]],["impl UnwindSafe for PostDomTree",1,["fe_mir::analysis::post_domtree::PostDomTree"]],["impl UnwindSafe for MirDbGroupStorage__",1,["fe_mir::db::MirDbGroupStorage__"]],["impl UnwindSafe for MirDbStorage",1,["fe_mir::db::MirDbStorage"]],["impl UnwindSafe for MirInternConstLookupQuery",1,["fe_mir::db::MirInternConstLookupQuery"]],["impl UnwindSafe for MirInternConstQuery",1,["fe_mir::db::MirInternConstQuery"]],["impl UnwindSafe for MirInternFunctionLookupQuery",1,["fe_mir::db::MirInternFunctionLookupQuery"]],["impl UnwindSafe for MirInternFunctionQuery",1,["fe_mir::db::MirInternFunctionQuery"]],["impl UnwindSafe for MirInternTypeLookupQuery",1,["fe_mir::db::MirInternTypeLookupQuery"]],["impl UnwindSafe for MirInternTypeQuery",1,["fe_mir::db::MirInternTypeQuery"]],["impl UnwindSafe for MirLowerContractAllFunctionsQuery",1,["fe_mir::db::MirLowerContractAllFunctionsQuery"]],["impl UnwindSafe for MirLowerEnumAllFunctionsQuery",1,["fe_mir::db::MirLowerEnumAllFunctionsQuery"]],["impl UnwindSafe for MirLowerModuleAllFunctionsQuery",1,["fe_mir::db::MirLowerModuleAllFunctionsQuery"]],["impl UnwindSafe for MirLowerStructAllFunctionsQuery",1,["fe_mir::db::MirLowerStructAllFunctionsQuery"]],["impl UnwindSafe for MirLoweredConstantQuery",1,["fe_mir::db::MirLoweredConstantQuery"]],["impl UnwindSafe for MirLoweredFuncBodyQuery",1,["fe_mir::db::MirLoweredFuncBodyQuery"]],["impl UnwindSafe for MirLoweredFuncSignatureQuery",1,["fe_mir::db::MirLoweredFuncSignatureQuery"]],["impl UnwindSafe for MirLoweredMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredMonomorphizedFuncSignatureQuery"]],["impl UnwindSafe for MirLoweredPseudoMonomorphizedFuncSignatureQuery",1,["fe_mir::db::MirLoweredPseudoMonomorphizedFuncSignatureQuery"]],["impl UnwindSafe for MirLoweredTypeQuery",1,["fe_mir::db::MirLoweredTypeQuery"]],["impl UnwindSafe for NewDb",1,["fe_mir::db::NewDb"]],["impl UnwindSafe for BasicBlock",1,["fe_mir::ir::basic_block::BasicBlock"]],["impl UnwindSafe for BodyBuilder",1,["fe_mir::ir::body_builder::BodyBuilder"]],["impl UnwindSafe for BodyOrder",1,["fe_mir::ir::body_order::BodyOrder"]],["impl UnwindSafe for Constant",1,["fe_mir::ir::constant::Constant"]],["impl UnwindSafe for ConstantId",1,["fe_mir::ir::constant::ConstantId"]],["impl UnwindSafe for BodyDataStore",1,["fe_mir::ir::function::BodyDataStore"]],["impl UnwindSafe for FunctionBody",1,["fe_mir::ir::function::FunctionBody"]],["impl UnwindSafe for FunctionId",1,["fe_mir::ir::function::FunctionId"]],["impl UnwindSafe for FunctionParam",1,["fe_mir::ir::function::FunctionParam"]],["impl UnwindSafe for FunctionSignature",1,["fe_mir::ir::function::FunctionSignature"]],["impl UnwindSafe for Inst",1,["fe_mir::ir::inst::Inst"]],["impl UnwindSafe for SwitchTable",1,["fe_mir::ir::inst::SwitchTable"]],["impl UnwindSafe for SourceInfo",1,["fe_mir::ir::SourceInfo"]],["impl UnwindSafe for ArrayDef",1,["fe_mir::ir::types::ArrayDef"]],["impl UnwindSafe for EnumDef",1,["fe_mir::ir::types::EnumDef"]],["impl UnwindSafe for EnumVariant",1,["fe_mir::ir::types::EnumVariant"]],["impl UnwindSafe for EventDef",1,["fe_mir::ir::types::EventDef"]],["impl UnwindSafe for MapDef",1,["fe_mir::ir::types::MapDef"]],["impl UnwindSafe for StructDef",1,["fe_mir::ir::types::StructDef"]],["impl UnwindSafe for TupleDef",1,["fe_mir::ir::types::TupleDef"]],["impl UnwindSafe for Type",1,["fe_mir::ir::types::Type"]],["impl UnwindSafe for TypeId",1,["fe_mir::ir::types::TypeId"]],["impl UnwindSafe for Local",1,["fe_mir::ir::value::Local"]],["impl<'a> !UnwindSafe for BodyCursor<'a>",1,["fe_mir::ir::body_cursor::BodyCursor"]],["impl<'a> UnwindSafe for BranchInfo<'a>",1,["fe_mir::ir::inst::BranchInfo"]],["impl<'a> UnwindSafe for CfgPostOrder<'a>",1,["fe_mir::analysis::cfg::CfgPostOrder"]],["impl<'a, 'b> UnwindSafe for BlocksInLoopPostOrder<'a, 'b>",1,["fe_mir::analysis::loop_tree::BlocksInLoopPostOrder"]],["impl<'a, T> !UnwindSafe for IterMutBase<'a, T>",1,["fe_mir::ir::inst::IterMutBase"]],["impl<'a, T> UnwindSafe for IterBase<'a, T>",1,["fe_mir::ir::inst::IterBase"]]]],["fe_parser",[["impl UnwindSafe for BinOperator",1,["fe_parser::ast::BinOperator"]],["impl UnwindSafe for BoolOperator",1,["fe_parser::ast::BoolOperator"]],["impl UnwindSafe for CompOperator",1,["fe_parser::ast::CompOperator"]],["impl UnwindSafe for ContractStmt",1,["fe_parser::ast::ContractStmt"]],["impl UnwindSafe for Expr",1,["fe_parser::ast::Expr"]],["impl UnwindSafe for FuncStmt",1,["fe_parser::ast::FuncStmt"]],["impl UnwindSafe for FunctionArg",1,["fe_parser::ast::FunctionArg"]],["impl UnwindSafe for GenericArg",1,["fe_parser::ast::GenericArg"]],["impl UnwindSafe for GenericParameter",1,["fe_parser::ast::GenericParameter"]],["impl UnwindSafe for LiteralPattern",1,["fe_parser::ast::LiteralPattern"]],["impl UnwindSafe for ModuleStmt",1,["fe_parser::ast::ModuleStmt"]],["impl UnwindSafe for Pattern",1,["fe_parser::ast::Pattern"]],["impl UnwindSafe for TypeDesc",1,["fe_parser::ast::TypeDesc"]],["impl UnwindSafe for UnaryOperator",1,["fe_parser::ast::UnaryOperator"]],["impl UnwindSafe for UseTree",1,["fe_parser::ast::UseTree"]],["impl UnwindSafe for VarDeclTarget",1,["fe_parser::ast::VarDeclTarget"]],["impl UnwindSafe for VariantKind",1,["fe_parser::ast::VariantKind"]],["impl UnwindSafe for TokenKind",1,["fe_parser::lexer::token::TokenKind"]],["impl UnwindSafe for CallArg",1,["fe_parser::ast::CallArg"]],["impl UnwindSafe for ConstantDecl",1,["fe_parser::ast::ConstantDecl"]],["impl UnwindSafe for Contract",1,["fe_parser::ast::Contract"]],["impl UnwindSafe for Enum",1,["fe_parser::ast::Enum"]],["impl UnwindSafe for Field",1,["fe_parser::ast::Field"]],["impl UnwindSafe for Function",1,["fe_parser::ast::Function"]],["impl UnwindSafe for FunctionSignature",1,["fe_parser::ast::FunctionSignature"]],["impl UnwindSafe for Impl",1,["fe_parser::ast::Impl"]],["impl UnwindSafe for MatchArm",1,["fe_parser::ast::MatchArm"]],["impl UnwindSafe for Module",1,["fe_parser::ast::Module"]],["impl UnwindSafe for Path",1,["fe_parser::ast::Path"]],["impl UnwindSafe for Pragma",1,["fe_parser::ast::Pragma"]],["impl UnwindSafe for Struct",1,["fe_parser::ast::Struct"]],["impl UnwindSafe for Trait",1,["fe_parser::ast::Trait"]],["impl UnwindSafe for TypeAlias",1,["fe_parser::ast::TypeAlias"]],["impl UnwindSafe for Use",1,["fe_parser::ast::Use"]],["impl UnwindSafe for Variant",1,["fe_parser::ast::Variant"]],["impl UnwindSafe for NodeId",1,["fe_parser::node::NodeId"]],["impl UnwindSafe for ParseFailed",1,["fe_parser::parser::ParseFailed"]],["impl<'a> UnwindSafe for Lexer<'a>",1,["fe_parser::lexer::Lexer"]],["impl<'a> UnwindSafe for Token<'a>",1,["fe_parser::lexer::token::Token"]],["impl<'a> UnwindSafe for Parser<'a>",1,["fe_parser::parser::Parser"]],["impl<T> UnwindSafe for Node<T>
where\n T: UnwindSafe,
",1,["fe_parser::node::Node"]]]],["fe_test_runner",[["impl UnwindSafe for TestSink",1,["fe_test_runner::TestSink"]]]],["fe_yulc",[["impl UnwindSafe for ContractBytecode",1,["fe_yulc::ContractBytecode"]],["impl UnwindSafe for YulcError",1,["fe_yulc::YulcError"]]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1987,4254,71454,9034,9404,2731,1057,25116,14108,359,684]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/core/str/traits/trait.FromStr.js b/compiler-docs/trait.impl/core/str/traits/trait.FromStr.js new file mode 100644 index 0000000000..98b38c489e --- /dev/null +++ b/compiler-docs/trait.impl/core/str/traits/trait.FromStr.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl FromStr for ContractTypeMethod"],["impl FromStr for GlobalFunction"],["impl FromStr for Intrinsic"],["impl FromStr for ValueMethod"],["impl FromStr for Base"],["impl FromStr for GenericType"],["impl FromStr for Integer"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2153]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/context/trait.AnalyzerContext.js b/compiler-docs/trait.impl/fe_analyzer/context/trait.AnalyzerContext.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/context/trait.AnalyzerContext.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/db/trait.AnalyzerDb.js b/compiler-docs/trait.impl/fe_analyzer/db/trait.AnalyzerDb.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/db/trait.AnalyzerDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/display/trait.DisplayWithDb.js b/compiler-docs/trait.impl/fe_analyzer/display/trait.DisplayWithDb.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/display/trait.DisplayWithDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/display/trait.Displayable.js b/compiler-docs/trait.impl/fe_analyzer/display/trait.Displayable.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/display/trait.Displayable.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/namespace/items/trait.DiagnosticSink.js b/compiler-docs/trait.impl/fe_analyzer/namespace/items/trait.DiagnosticSink.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/namespace/items/trait.DiagnosticSink.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_analyzer/namespace/types/trait.TypeDowncast.js b/compiler-docs/trait.impl/fe_analyzer/namespace/types/trait.TypeDowncast.js new file mode 100644 index 0000000000..c053db89e8 --- /dev/null +++ b/compiler-docs/trait.impl/fe_analyzer/namespace/types/trait.TypeDowncast.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[18]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_codegen/db/trait.CodegenDb.js b/compiler-docs/trait.impl/fe_codegen/db/trait.CodegenDb.js new file mode 100644 index 0000000000..897df81853 --- /dev/null +++ b/compiler-docs/trait.impl/fe_codegen/db/trait.CodegenDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_codegen",[]],["fe_driver",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[17,17]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_codegen/yul/runtime/trait.RuntimeProvider.js b/compiler-docs/trait.impl/fe_codegen/yul/runtime/trait.RuntimeProvider.js new file mode 100644 index 0000000000..cb3e71a2f3 --- /dev/null +++ b/compiler-docs/trait.impl/fe_codegen/yul/runtime/trait.RuntimeProvider.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_codegen",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[17]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/db/trait.SourceDb.js b/compiler-docs/trait.impl/fe_common/db/trait.SourceDb.js new file mode 100644 index 0000000000..187398caea --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/db/trait.SourceDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[16]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/db/trait.Upcast.js b/compiler-docs/trait.impl/fe_common/db/trait.Upcast.js new file mode 100644 index 0000000000..7712c94f41 --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/db/trait.Upcast.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Upcast<dyn SourceDb> for TestDb"]]],["fe_codegen",[["impl Upcast<dyn SourceDb> for Db"],["impl Upcast<dyn MirDb> for Db"],["impl Upcast<dyn AnalyzerDb> for Db"]]],["fe_mir",[["impl Upcast<dyn AnalyzerDb> for NewDb"],["impl Upcast<dyn SourceDb> for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[378,940,299]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/db/trait.UpcastMut.js b/compiler-docs/trait.impl/fe_common/db/trait.UpcastMut.js new file mode 100644 index 0000000000..461c741975 --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/db/trait.UpcastMut.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl UpcastMut<dyn SourceDb> for TestDb"]]],["fe_codegen",[["impl UpcastMut<dyn SourceDb> for Db"],["impl UpcastMut<dyn MirDb> for Db"],["impl UpcastMut<dyn AnalyzerDb> for Db"]]],["fe_mir",[["impl UpcastMut<dyn AnalyzerDb> for NewDb"],["impl UpcastMut<dyn SourceDb> for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[387,967,305]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/span/trait.Spanned.js b/compiler-docs/trait.impl/fe_common/span/trait.Spanned.js new file mode 100644 index 0000000000..06c1666b74 --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/span/trait.Spanned.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_parser",[["impl Spanned for ContractStmt"],["impl Spanned for GenericArg"],["impl Spanned for GenericParameter"],["impl Spanned for ModuleStmt"],["impl<T> Spanned for Node<T>"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[1282]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/utils/files/trait.DependencyResolver.js b/compiler-docs/trait.impl/fe_common/utils/files/trait.DependencyResolver.js new file mode 100644 index 0000000000..187398caea --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/utils/files/trait.DependencyResolver.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[16]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_common/utils/humanize/trait.Pluralizable.js b/compiler-docs/trait.impl/fe_common/utils/humanize/trait.Pluralizable.js new file mode 100644 index 0000000000..187398caea --- /dev/null +++ b/compiler-docs/trait.impl/fe_common/utils/humanize/trait.Pluralizable.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[16]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_compiler_test_utils/trait.ToBeBytes.js b/compiler-docs/trait.impl/fe_compiler_test_utils/trait.ToBeBytes.js new file mode 100644 index 0000000000..f82a3c94fe --- /dev/null +++ b/compiler-docs/trait.impl/fe_compiler_test_utils/trait.ToBeBytes.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_compiler_test_utils",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[29]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_mir/db/trait.MirDb.js b/compiler-docs/trait.impl/fe_mir/db/trait.MirDb.js new file mode 100644 index 0000000000..9b3bc41fa5 --- /dev/null +++ b/compiler-docs/trait.impl/fe_mir/db/trait.MirDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_mir",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[13]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/fe_mir/pretty_print/trait.PrettyPrint.js b/compiler-docs/trait.impl/fe_mir/pretty_print/trait.PrettyPrint.js new file mode 100644 index 0000000000..9b3bc41fa5 --- /dev/null +++ b/compiler-docs/trait.impl/fe_mir/pretty_print/trait.PrettyPrint.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_mir",[]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[13]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/logos/trait.Logos.js b/compiler-docs/trait.impl/logos/trait.Logos.js new file mode 100644 index 0000000000..1d8bba7869 --- /dev/null +++ b/compiler-docs/trait.impl/logos/trait.Logos.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_parser",[["impl<'s> Logos<'s> for TokenKind"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[174]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/interned/trait.InternKey.js b/compiler-docs/trait.impl/salsa/interned/trait.InternKey.js new file mode 100644 index 0000000000..916d5613ec --- /dev/null +++ b/compiler-docs/trait.impl/salsa/interned/trait.InternKey.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl InternKey for AttributeId"],["impl InternKey for ContractFieldId"],["impl InternKey for ContractId"],["impl InternKey for EnumId"],["impl InternKey for EnumVariantId"],["impl InternKey for FunctionId"],["impl InternKey for FunctionSigId"],["impl InternKey for ImplId"],["impl InternKey for IngotId"],["impl InternKey for ModuleConstantId"],["impl InternKey for ModuleId"],["impl InternKey for StructFieldId"],["impl InternKey for StructId"],["impl InternKey for TraitId"],["impl InternKey for TypeAliasId"],["impl InternKey for TypeId"]]],["fe_common",[["impl InternKey for SourceFileId"]]],["fe_mir",[["impl InternKey for ConstantId"],["impl InternKey for FunctionId"],["impl InternKey for TypeId"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2849,174,472]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseOps.js b/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseOps.js new file mode 100644 index 0000000000..8986c29d92 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseOps.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl DatabaseOps for TestDb"]]],["fe_codegen",[["impl DatabaseOps for Db"]]],["fe_common",[["impl DatabaseOps for TestDb"]]],["fe_mir",[["impl DatabaseOps for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[157,143,152,140]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseStorageTypes.js b/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseStorageTypes.js new file mode 100644 index 0000000000..48982de73b --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.DatabaseStorageTypes.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl DatabaseStorageTypes for TestDb"]]],["fe_codegen",[["impl DatabaseStorageTypes for Db"]]],["fe_common",[["impl DatabaseStorageTypes for TestDb"]]],["fe_mir",[["impl DatabaseStorageTypes for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[166,152,161,149]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.HasQueryGroup.js b/compiler-docs/trait.impl/salsa/plumbing/trait.HasQueryGroup.js new file mode 100644 index 0000000000..49efd8078d --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.HasQueryGroup.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl HasQueryGroup<AnalyzerDbStorage> for TestDb"],["impl HasQueryGroup<SourceDbStorage> for TestDb"]]],["fe_codegen",[["impl HasQueryGroup<CodegenDbStorage> for Db"],["impl HasQueryGroup<SourceDbStorage> for Db"],["impl HasQueryGroup<MirDbStorage> for Db"],["impl HasQueryGroup<AnalyzerDbStorage> for Db"]]],["fe_common",[["impl HasQueryGroup<SourceDbStorage> for TestDb"]]],["fe_mir",[["impl HasQueryGroup<MirDbStorage> for NewDb"],["impl HasQueryGroup<AnalyzerDbStorage> for NewDb"],["impl HasQueryGroup<SourceDbStorage> for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[601,979,299,578]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.QueryFunction.js b/compiler-docs/trait.impl/salsa/plumbing/trait.QueryFunction.js new file mode 100644 index 0000000000..0383a25e51 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.QueryFunction.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl QueryFunction for AllImplsQuery"],["impl QueryFunction for ContractAllFieldsQuery"],["impl QueryFunction for ContractAllFunctionsQuery"],["impl QueryFunction for ContractCallFunctionQuery"],["impl QueryFunction for ContractDependencyGraphQuery"],["impl QueryFunction for ContractFieldMapQuery"],["impl QueryFunction for ContractFieldTypeQuery"],["impl QueryFunction for ContractFunctionMapQuery"],["impl QueryFunction for ContractInitFunctionQuery"],["impl QueryFunction for ContractPublicFunctionMapQuery"],["impl QueryFunction for ContractRuntimeDependencyGraphQuery"],["impl QueryFunction for EnumAllFunctionsQuery"],["impl QueryFunction for EnumAllVariantsQuery"],["impl QueryFunction for EnumDependencyGraphQuery"],["impl QueryFunction for EnumFunctionMapQuery"],["impl QueryFunction for EnumVariantKindQuery"],["impl QueryFunction for EnumVariantMapQuery"],["impl QueryFunction for FunctionBodyQuery"],["impl QueryFunction for FunctionDependencyGraphQuery"],["impl QueryFunction for FunctionSignatureQuery"],["impl QueryFunction for FunctionSigsQuery"],["impl QueryFunction for ImplAllFunctionsQuery"],["impl QueryFunction for ImplForQuery"],["impl QueryFunction for ImplFunctionMapQuery"],["impl QueryFunction for IngotModulesQuery"],["impl QueryFunction for IngotRootModuleQuery"],["impl QueryFunction for ModuleAllImplsQuery"],["impl QueryFunction for ModuleAllItemsQuery"],["impl QueryFunction for ModuleConstantTypeQuery"],["impl QueryFunction for ModuleConstantValueQuery"],["impl QueryFunction for ModuleConstantsQuery"],["impl QueryFunction for ModuleContractsQuery"],["impl QueryFunction for ModuleFilePathQuery"],["impl QueryFunction for ModuleImplMapQuery"],["impl QueryFunction for ModuleIsIncompleteQuery"],["impl QueryFunction for ModuleItemMapQuery"],["impl QueryFunction for ModuleParentModuleQuery"],["impl QueryFunction for ModuleParseQuery"],["impl QueryFunction for ModuleStructsQuery"],["impl QueryFunction for ModuleSubmodulesQuery"],["impl QueryFunction for ModuleTestsQuery"],["impl QueryFunction for ModuleUsedItemMapQuery"],["impl QueryFunction for StructAllFieldsQuery"],["impl QueryFunction for StructAllFunctionsQuery"],["impl QueryFunction for StructDependencyGraphQuery"],["impl QueryFunction for StructFieldMapQuery"],["impl QueryFunction for StructFieldTypeQuery"],["impl QueryFunction for StructFunctionMapQuery"],["impl QueryFunction for TraitAllFunctionsQuery"],["impl QueryFunction for TraitFunctionMapQuery"],["impl QueryFunction for TraitIsImplementedForQuery"],["impl QueryFunction for TypeAliasTypeQuery"]]],["fe_codegen",[["impl QueryFunction for CodegenAbiContractQuery"],["impl QueryFunction for CodegenAbiEventQuery"],["impl QueryFunction for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl QueryFunction for CodegenAbiFunctionQuery"],["impl QueryFunction for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl QueryFunction for CodegenAbiModuleEventsQuery"],["impl QueryFunction for CodegenAbiTypeMaximumSizeQuery"],["impl QueryFunction for CodegenAbiTypeMinimumSizeQuery"],["impl QueryFunction for CodegenAbiTypeQuery"],["impl QueryFunction for CodegenConstantStringSymbolNameQuery"],["impl QueryFunction for CodegenContractDeployerSymbolNameQuery"],["impl QueryFunction for CodegenContractSymbolNameQuery"],["impl QueryFunction for CodegenFunctionSymbolNameQuery"],["impl QueryFunction for CodegenLegalizedBodyQuery"],["impl QueryFunction for CodegenLegalizedSignatureQuery"],["impl QueryFunction for CodegenLegalizedTypeQuery"]]],["fe_common",[["impl QueryFunction for FileLineStartsQuery"],["impl QueryFunction for FileNameQuery"]]],["fe_mir",[["impl QueryFunction for MirLowerContractAllFunctionsQuery"],["impl QueryFunction for MirLowerEnumAllFunctionsQuery"],["impl QueryFunction for MirLowerModuleAllFunctionsQuery"],["impl QueryFunction for MirLowerStructAllFunctionsQuery"],["impl QueryFunction for MirLoweredConstantQuery"],["impl QueryFunction for MirLoweredFuncBodyQuery"],["impl QueryFunction for MirLoweredFuncSignatureQuery"],["impl QueryFunction for MirLoweredMonomorphizedFuncSignatureQuery"],["impl QueryFunction for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl QueryFunction for MirLoweredTypeQuery"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[9777,3373,352,2068]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/plumbing/trait.QueryGroup.js b/compiler-docs/trait.impl/salsa/plumbing/trait.QueryGroup.js new file mode 100644 index 0000000000..701404f2c8 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/plumbing/trait.QueryGroup.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl QueryGroup for AnalyzerDbStorage"]]],["fe_codegen",[["impl QueryGroup for CodegenDbStorage"]]],["fe_common",[["impl QueryGroup for SourceDbStorage"]]],["fe_mir",[["impl QueryGroup for MirDbStorage"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[189,184,178,160]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/trait.Database.js b/compiler-docs/trait.impl/salsa/trait.Database.js new file mode 100644 index 0000000000..9d979f48e8 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/trait.Database.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Database for TestDb"]]],["fe_codegen",[["impl Database for Db"]]],["fe_common",[["impl Database for TestDb"]]],["fe_mir",[["impl Database for NewDb"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[154,140,149,137]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/trait.Query.js b/compiler-docs/trait.impl/salsa/trait.Query.js new file mode 100644 index 0000000000..20b262e023 --- /dev/null +++ b/compiler-docs/trait.impl/salsa/trait.Query.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl Query for AllImplsQuery"],["impl Query for ContractAllFieldsQuery"],["impl Query for ContractAllFunctionsQuery"],["impl Query for ContractCallFunctionQuery"],["impl Query for ContractDependencyGraphQuery"],["impl Query for ContractFieldMapQuery"],["impl Query for ContractFieldTypeQuery"],["impl Query for ContractFunctionMapQuery"],["impl Query for ContractInitFunctionQuery"],["impl Query for ContractPublicFunctionMapQuery"],["impl Query for ContractRuntimeDependencyGraphQuery"],["impl Query for EnumAllFunctionsQuery"],["impl Query for EnumAllVariantsQuery"],["impl Query for EnumDependencyGraphQuery"],["impl Query for EnumFunctionMapQuery"],["impl Query for EnumVariantKindQuery"],["impl Query for EnumVariantMapQuery"],["impl Query for FunctionBodyQuery"],["impl Query for FunctionDependencyGraphQuery"],["impl Query for FunctionSignatureQuery"],["impl Query for FunctionSigsQuery"],["impl Query for ImplAllFunctionsQuery"],["impl Query for ImplForQuery"],["impl Query for ImplFunctionMapQuery"],["impl Query for IngotExternalIngotsQuery"],["impl Query for IngotFilesQuery"],["impl Query for IngotModulesQuery"],["impl Query for IngotRootModuleQuery"],["impl Query for InternAttributeLookupQuery"],["impl Query for InternAttributeQuery"],["impl Query for InternContractFieldLookupQuery"],["impl Query for InternContractFieldQuery"],["impl Query for InternContractLookupQuery"],["impl Query for InternContractQuery"],["impl Query for InternEnumLookupQuery"],["impl Query for InternEnumQuery"],["impl Query for InternEnumVariantLookupQuery"],["impl Query for InternEnumVariantQuery"],["impl Query for InternFunctionLookupQuery"],["impl Query for InternFunctionQuery"],["impl Query for InternFunctionSigLookupQuery"],["impl Query for InternFunctionSigQuery"],["impl Query for InternImplLookupQuery"],["impl Query for InternImplQuery"],["impl Query for InternIngotLookupQuery"],["impl Query for InternIngotQuery"],["impl Query for InternModuleConstLookupQuery"],["impl Query for InternModuleConstQuery"],["impl Query for InternModuleLookupQuery"],["impl Query for InternModuleQuery"],["impl Query for InternStructFieldLookupQuery"],["impl Query for InternStructFieldQuery"],["impl Query for InternStructLookupQuery"],["impl Query for InternStructQuery"],["impl Query for InternTraitLookupQuery"],["impl Query for InternTraitQuery"],["impl Query for InternTypeAliasLookupQuery"],["impl Query for InternTypeAliasQuery"],["impl Query for InternTypeLookupQuery"],["impl Query for InternTypeQuery"],["impl Query for ModuleAllImplsQuery"],["impl Query for ModuleAllItemsQuery"],["impl Query for ModuleConstantTypeQuery"],["impl Query for ModuleConstantValueQuery"],["impl Query for ModuleConstantsQuery"],["impl Query for ModuleContractsQuery"],["impl Query for ModuleFilePathQuery"],["impl Query for ModuleImplMapQuery"],["impl Query for ModuleIsIncompleteQuery"],["impl Query for ModuleItemMapQuery"],["impl Query for ModuleParentModuleQuery"],["impl Query for ModuleParseQuery"],["impl Query for ModuleStructsQuery"],["impl Query for ModuleSubmodulesQuery"],["impl Query for ModuleTestsQuery"],["impl Query for ModuleUsedItemMapQuery"],["impl Query for RootIngotQuery"],["impl Query for StructAllFieldsQuery"],["impl Query for StructAllFunctionsQuery"],["impl Query for StructDependencyGraphQuery"],["impl Query for StructFieldMapQuery"],["impl Query for StructFieldTypeQuery"],["impl Query for StructFunctionMapQuery"],["impl Query for TraitAllFunctionsQuery"],["impl Query for TraitFunctionMapQuery"],["impl Query for TraitIsImplementedForQuery"],["impl Query for TypeAliasTypeQuery"]]],["fe_codegen",[["impl Query for CodegenAbiContractQuery"],["impl Query for CodegenAbiEventQuery"],["impl Query for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl Query for CodegenAbiFunctionQuery"],["impl Query for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl Query for CodegenAbiModuleEventsQuery"],["impl Query for CodegenAbiTypeMaximumSizeQuery"],["impl Query for CodegenAbiTypeMinimumSizeQuery"],["impl Query for CodegenAbiTypeQuery"],["impl Query for CodegenConstantStringSymbolNameQuery"],["impl Query for CodegenContractDeployerSymbolNameQuery"],["impl Query for CodegenContractSymbolNameQuery"],["impl Query for CodegenFunctionSymbolNameQuery"],["impl Query for CodegenLegalizedBodyQuery"],["impl Query for CodegenLegalizedSignatureQuery"],["impl Query for CodegenLegalizedTypeQuery"]]],["fe_common",[["impl Query for FileContentQuery"],["impl Query for FileLineStartsQuery"],["impl Query for FileNameQuery"],["impl Query for InternFileLookupQuery"],["impl Query for InternFileQuery"]]],["fe_mir",[["impl Query for MirInternConstLookupQuery"],["impl Query for MirInternConstQuery"],["impl Query for MirInternFunctionLookupQuery"],["impl Query for MirInternFunctionQuery"],["impl Query for MirInternTypeLookupQuery"],["impl Query for MirInternTypeQuery"],["impl Query for MirLowerContractAllFunctionsQuery"],["impl Query for MirLowerEnumAllFunctionsQuery"],["impl Query for MirLowerModuleAllFunctionsQuery"],["impl Query for MirLowerStructAllFunctionsQuery"],["impl Query for MirLoweredConstantQuery"],["impl Query for MirLoweredFuncBodyQuery"],["impl Query for MirLoweredFuncSignatureQuery"],["impl Query for MirLoweredMonomorphizedFuncSignatureQuery"],["impl Query for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl Query for MirLoweredTypeQuery"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[15674,3245,828,3032]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/salsa/trait.QueryDb.js b/compiler-docs/trait.impl/salsa/trait.QueryDb.js new file mode 100644 index 0000000000..68b28559ab --- /dev/null +++ b/compiler-docs/trait.impl/salsa/trait.QueryDb.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl<'d> QueryDb<'d> for AllImplsQuery"],["impl<'d> QueryDb<'d> for ContractAllFieldsQuery"],["impl<'d> QueryDb<'d> for ContractAllFunctionsQuery"],["impl<'d> QueryDb<'d> for ContractCallFunctionQuery"],["impl<'d> QueryDb<'d> for ContractDependencyGraphQuery"],["impl<'d> QueryDb<'d> for ContractFieldMapQuery"],["impl<'d> QueryDb<'d> for ContractFieldTypeQuery"],["impl<'d> QueryDb<'d> for ContractFunctionMapQuery"],["impl<'d> QueryDb<'d> for ContractInitFunctionQuery"],["impl<'d> QueryDb<'d> for ContractPublicFunctionMapQuery"],["impl<'d> QueryDb<'d> for ContractRuntimeDependencyGraphQuery"],["impl<'d> QueryDb<'d> for EnumAllFunctionsQuery"],["impl<'d> QueryDb<'d> for EnumAllVariantsQuery"],["impl<'d> QueryDb<'d> for EnumDependencyGraphQuery"],["impl<'d> QueryDb<'d> for EnumFunctionMapQuery"],["impl<'d> QueryDb<'d> for EnumVariantKindQuery"],["impl<'d> QueryDb<'d> for EnumVariantMapQuery"],["impl<'d> QueryDb<'d> for FunctionBodyQuery"],["impl<'d> QueryDb<'d> for FunctionDependencyGraphQuery"],["impl<'d> QueryDb<'d> for FunctionSignatureQuery"],["impl<'d> QueryDb<'d> for FunctionSigsQuery"],["impl<'d> QueryDb<'d> for ImplAllFunctionsQuery"],["impl<'d> QueryDb<'d> for ImplForQuery"],["impl<'d> QueryDb<'d> for ImplFunctionMapQuery"],["impl<'d> QueryDb<'d> for IngotExternalIngotsQuery"],["impl<'d> QueryDb<'d> for IngotFilesQuery"],["impl<'d> QueryDb<'d> for IngotModulesQuery"],["impl<'d> QueryDb<'d> for IngotRootModuleQuery"],["impl<'d> QueryDb<'d> for InternAttributeLookupQuery"],["impl<'d> QueryDb<'d> for InternAttributeQuery"],["impl<'d> QueryDb<'d> for InternContractFieldLookupQuery"],["impl<'d> QueryDb<'d> for InternContractFieldQuery"],["impl<'d> QueryDb<'d> for InternContractLookupQuery"],["impl<'d> QueryDb<'d> for InternContractQuery"],["impl<'d> QueryDb<'d> for InternEnumLookupQuery"],["impl<'d> QueryDb<'d> for InternEnumQuery"],["impl<'d> QueryDb<'d> for InternEnumVariantLookupQuery"],["impl<'d> QueryDb<'d> for InternEnumVariantQuery"],["impl<'d> QueryDb<'d> for InternFunctionLookupQuery"],["impl<'d> QueryDb<'d> for InternFunctionQuery"],["impl<'d> QueryDb<'d> for InternFunctionSigLookupQuery"],["impl<'d> QueryDb<'d> for InternFunctionSigQuery"],["impl<'d> QueryDb<'d> for InternImplLookupQuery"],["impl<'d> QueryDb<'d> for InternImplQuery"],["impl<'d> QueryDb<'d> for InternIngotLookupQuery"],["impl<'d> QueryDb<'d> for InternIngotQuery"],["impl<'d> QueryDb<'d> for InternModuleConstLookupQuery"],["impl<'d> QueryDb<'d> for InternModuleConstQuery"],["impl<'d> QueryDb<'d> for InternModuleLookupQuery"],["impl<'d> QueryDb<'d> for InternModuleQuery"],["impl<'d> QueryDb<'d> for InternStructFieldLookupQuery"],["impl<'d> QueryDb<'d> for InternStructFieldQuery"],["impl<'d> QueryDb<'d> for InternStructLookupQuery"],["impl<'d> QueryDb<'d> for InternStructQuery"],["impl<'d> QueryDb<'d> for InternTraitLookupQuery"],["impl<'d> QueryDb<'d> for InternTraitQuery"],["impl<'d> QueryDb<'d> for InternTypeAliasLookupQuery"],["impl<'d> QueryDb<'d> for InternTypeAliasQuery"],["impl<'d> QueryDb<'d> for InternTypeLookupQuery"],["impl<'d> QueryDb<'d> for InternTypeQuery"],["impl<'d> QueryDb<'d> for ModuleAllImplsQuery"],["impl<'d> QueryDb<'d> for ModuleAllItemsQuery"],["impl<'d> QueryDb<'d> for ModuleConstantTypeQuery"],["impl<'d> QueryDb<'d> for ModuleConstantValueQuery"],["impl<'d> QueryDb<'d> for ModuleConstantsQuery"],["impl<'d> QueryDb<'d> for ModuleContractsQuery"],["impl<'d> QueryDb<'d> for ModuleFilePathQuery"],["impl<'d> QueryDb<'d> for ModuleImplMapQuery"],["impl<'d> QueryDb<'d> for ModuleIsIncompleteQuery"],["impl<'d> QueryDb<'d> for ModuleItemMapQuery"],["impl<'d> QueryDb<'d> for ModuleParentModuleQuery"],["impl<'d> QueryDb<'d> for ModuleParseQuery"],["impl<'d> QueryDb<'d> for ModuleStructsQuery"],["impl<'d> QueryDb<'d> for ModuleSubmodulesQuery"],["impl<'d> QueryDb<'d> for ModuleTestsQuery"],["impl<'d> QueryDb<'d> for ModuleUsedItemMapQuery"],["impl<'d> QueryDb<'d> for RootIngotQuery"],["impl<'d> QueryDb<'d> for StructAllFieldsQuery"],["impl<'d> QueryDb<'d> for StructAllFunctionsQuery"],["impl<'d> QueryDb<'d> for StructDependencyGraphQuery"],["impl<'d> QueryDb<'d> for StructFieldMapQuery"],["impl<'d> QueryDb<'d> for StructFieldTypeQuery"],["impl<'d> QueryDb<'d> for StructFunctionMapQuery"],["impl<'d> QueryDb<'d> for TraitAllFunctionsQuery"],["impl<'d> QueryDb<'d> for TraitFunctionMapQuery"],["impl<'d> QueryDb<'d> for TraitIsImplementedForQuery"],["impl<'d> QueryDb<'d> for TypeAliasTypeQuery"]]],["fe_codegen",[["impl<'d> QueryDb<'d> for CodegenAbiContractQuery"],["impl<'d> QueryDb<'d> for CodegenAbiEventQuery"],["impl<'d> QueryDb<'d> for CodegenAbiFunctionArgumentMaximumSizeQuery"],["impl<'d> QueryDb<'d> for CodegenAbiFunctionQuery"],["impl<'d> QueryDb<'d> for CodegenAbiFunctionReturnMaximumSizeQuery"],["impl<'d> QueryDb<'d> for CodegenAbiModuleEventsQuery"],["impl<'d> QueryDb<'d> for CodegenAbiTypeMaximumSizeQuery"],["impl<'d> QueryDb<'d> for CodegenAbiTypeMinimumSizeQuery"],["impl<'d> QueryDb<'d> for CodegenAbiTypeQuery"],["impl<'d> QueryDb<'d> for CodegenConstantStringSymbolNameQuery"],["impl<'d> QueryDb<'d> for CodegenContractDeployerSymbolNameQuery"],["impl<'d> QueryDb<'d> for CodegenContractSymbolNameQuery"],["impl<'d> QueryDb<'d> for CodegenFunctionSymbolNameQuery"],["impl<'d> QueryDb<'d> for CodegenLegalizedBodyQuery"],["impl<'d> QueryDb<'d> for CodegenLegalizedSignatureQuery"],["impl<'d> QueryDb<'d> for CodegenLegalizedTypeQuery"]]],["fe_common",[["impl<'d> QueryDb<'d> for FileContentQuery"],["impl<'d> QueryDb<'d> for FileLineStartsQuery"],["impl<'d> QueryDb<'d> for FileNameQuery"],["impl<'d> QueryDb<'d> for InternFileLookupQuery"],["impl<'d> QueryDb<'d> for InternFileQuery"]]],["fe_mir",[["impl<'d> QueryDb<'d> for MirInternConstLookupQuery"],["impl<'d> QueryDb<'d> for MirInternConstQuery"],["impl<'d> QueryDb<'d> for MirInternFunctionLookupQuery"],["impl<'d> QueryDb<'d> for MirInternFunctionQuery"],["impl<'d> QueryDb<'d> for MirInternTypeLookupQuery"],["impl<'d> QueryDb<'d> for MirInternTypeQuery"],["impl<'d> QueryDb<'d> for MirLowerContractAllFunctionsQuery"],["impl<'d> QueryDb<'d> for MirLowerEnumAllFunctionsQuery"],["impl<'d> QueryDb<'d> for MirLowerModuleAllFunctionsQuery"],["impl<'d> QueryDb<'d> for MirLowerStructAllFunctionsQuery"],["impl<'d> QueryDb<'d> for MirLoweredConstantQuery"],["impl<'d> QueryDb<'d> for MirLoweredFuncBodyQuery"],["impl<'d> QueryDb<'d> for MirLoweredFuncSignatureQuery"],["impl<'d> QueryDb<'d> for MirLoweredMonomorphizedFuncSignatureQuery"],["impl<'d> QueryDb<'d> for MirLoweredPseudoMonomorphizedFuncSignatureQuery"],["impl<'d> QueryDb<'d> for MirLoweredTypeQuery"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[17588,3597,938,3384]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/serde/de/trait.Deserialize.js b/compiler-docs/trait.impl/serde/de/trait.Deserialize.js new file mode 100644 index 0000000000..33626d588d --- /dev/null +++ b/compiler-docs/trait.impl/serde/de/trait.Deserialize.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_common",[["impl<'de> Deserialize<'de> for SourceFileId"],["impl<'de> Deserialize<'de> for Span"]]],["fe_parser",[["impl<'de> Deserialize<'de> for BinOperator"],["impl<'de> Deserialize<'de> for BoolOperator"],["impl<'de> Deserialize<'de> for CompOperator"],["impl<'de> Deserialize<'de> for ContractStmt"],["impl<'de> Deserialize<'de> for Expr"],["impl<'de> Deserialize<'de> for FuncStmt"],["impl<'de> Deserialize<'de> for FunctionArg"],["impl<'de> Deserialize<'de> for GenericArg"],["impl<'de> Deserialize<'de> for GenericParameter"],["impl<'de> Deserialize<'de> for LiteralPattern"],["impl<'de> Deserialize<'de> for ModuleStmt"],["impl<'de> Deserialize<'de> for Pattern"],["impl<'de> Deserialize<'de> for TypeDesc"],["impl<'de> Deserialize<'de> for UnaryOperator"],["impl<'de> Deserialize<'de> for UseTree"],["impl<'de> Deserialize<'de> for VarDeclTarget"],["impl<'de> Deserialize<'de> for VariantKind"],["impl<'de> Deserialize<'de> for CallArg"],["impl<'de> Deserialize<'de> for ConstantDecl"],["impl<'de> Deserialize<'de> for Contract"],["impl<'de> Deserialize<'de> for Enum"],["impl<'de> Deserialize<'de> for Field"],["impl<'de> Deserialize<'de> for Function"],["impl<'de> Deserialize<'de> for FunctionSignature"],["impl<'de> Deserialize<'de> for Impl"],["impl<'de> Deserialize<'de> for MatchArm"],["impl<'de> Deserialize<'de> for Module"],["impl<'de> Deserialize<'de> for Path"],["impl<'de> Deserialize<'de> for Pragma"],["impl<'de> Deserialize<'de> for Struct"],["impl<'de> Deserialize<'de> for Trait"],["impl<'de> Deserialize<'de> for TypeAlias"],["impl<'de> Deserialize<'de> for Use"],["impl<'de> Deserialize<'de> for Variant"],["impl<'de, T> Deserialize<'de> for Node<T>
where\n T: Deserialize<'de>,
"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[608,10656]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/serde/ser/trait.Serialize.js b/compiler-docs/trait.impl/serde/ser/trait.Serialize.js new file mode 100644 index 0000000000..61028f8102 --- /dev/null +++ b/compiler-docs/trait.impl/serde/ser/trait.Serialize.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_abi",[["impl Serialize for AbiFunctionType"],["impl Serialize for StateMutability"],["impl Serialize for AbiType"],["impl Serialize for AbiContract"],["impl Serialize for AbiEvent"],["impl Serialize for AbiEventField"],["impl Serialize for AbiFunction"],["impl Serialize for AbiTupleField"]]],["fe_common",[["impl Serialize for Span"]]],["fe_parser",[["impl Serialize for BinOperator"],["impl Serialize for BoolOperator"],["impl Serialize for CompOperator"],["impl Serialize for ContractStmt"],["impl Serialize for Expr"],["impl Serialize for FuncStmt"],["impl Serialize for FunctionArg"],["impl Serialize for GenericArg"],["impl Serialize for GenericParameter"],["impl Serialize for LiteralPattern"],["impl Serialize for ModuleStmt"],["impl Serialize for Pattern"],["impl Serialize for TypeDesc"],["impl Serialize for UnaryOperator"],["impl Serialize for UseTree"],["impl Serialize for VarDeclTarget"],["impl Serialize for VariantKind"],["impl Serialize for CallArg"],["impl Serialize for ConstantDecl"],["impl Serialize for Contract"],["impl Serialize for Enum"],["impl Serialize for Field"],["impl Serialize for Function"],["impl Serialize for FunctionSignature"],["impl Serialize for Impl"],["impl Serialize for MatchArm"],["impl Serialize for Module"],["impl Serialize for Path"],["impl Serialize for Pragma"],["impl Serialize for Struct"],["impl Serialize for Trait"],["impl Serialize for TypeAlias"],["impl Serialize for Use"],["impl Serialize for Variant"],["impl<T> Serialize for Node<T>
where\n T: Serialize,
"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[2273,268,9737]} \ No newline at end of file diff --git a/compiler-docs/trait.impl/strum/trait.IntoEnumIterator.js b/compiler-docs/trait.impl/strum/trait.IntoEnumIterator.js new file mode 100644 index 0000000000..87c57ca65b --- /dev/null +++ b/compiler-docs/trait.impl/strum/trait.IntoEnumIterator.js @@ -0,0 +1,9 @@ +(function() { + var implementors = Object.fromEntries([["fe_analyzer",[["impl IntoEnumIterator for GlobalFunction"],["impl IntoEnumIterator for Intrinsic"],["impl IntoEnumIterator for GenericType"],["impl IntoEnumIterator for Integer"]]]]); + if (window.register_implementors) { + window.register_implementors(implementors); + } else { + window.pending_implementors = implementors; + } +})() +//{"start":57,"fragment_lengths":[702]} \ No newline at end of file diff --git a/compiler-docs/type.impl/core/result/enum.Result.js b/compiler-docs/type.impl/core/result/enum.Result.js new file mode 100644 index 0000000000..4d956f9ddf --- /dev/null +++ b/compiler-docs/type.impl/core/result/enum.Result.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_parser",[["
1.0.0 · Source§

impl<T, E> Clone for Result<T, E>
where\n T: Clone,\n E: Clone,

Source§

fn clone(&self) -> Result<T, E>

Returns a duplicate of the value. Read more
Source§

fn clone_from(&mut self, source: &Result<T, E>)

Performs copy-assignment from source. Read more
","Clone","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Debug for Result<T, E>
where\n T: Debug,\n E: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","fe_parser::parser::ParseResult"],["
Source§

impl<'de, T, E> Deserialize<'de> for Result<T, E>
where\n T: Deserialize<'de>,\n E: Deserialize<'de>,

Source§

fn deserialize<D>(\n deserializer: D,\n) -> Result<Result<T, E>, <D as Deserializer<'de>>::Error>
where\n D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
","Deserialize<'de>","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<A, E, V> FromIterator<Result<A, E>> for Result<V, E>
where\n V: FromIterator<A>,

Source§

fn from_iter<I>(iter: I) -> Result<V, E>
where\n I: IntoIterator<Item = Result<A, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err occur, a\ncontainer with the values of each Result is returned.

\n

Here is an example which increments every integer in a vector,\nchecking for overflow:

\n\n
let v = vec![1, 2];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_add(1).ok_or(\"Overflow!\")\n).collect();\nassert_eq!(res, Ok(vec![2, 3]));
\n

Here is another example that tries to subtract one from another list\nof integers, this time checking for underflow:

\n\n
let v = vec![1, 2, 0];\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32|\n    x.checked_sub(1).ok_or(\"Underflow!\")\n).collect();\nassert_eq!(res, Err(\"Underflow!\"));
\n

Here is a variation on the previous example, showing that no\nfurther elements are taken from iter after the first Err.

\n\n
let v = vec![3, 2, 1, 10];\nlet mut shared = 0;\nlet res: Result<Vec<u32>, &'static str> = v.iter().map(|x: &u32| {\n    shared += x;\n    x.checked_sub(2).ok_or(\"Underflow!\")\n}).collect();\nassert_eq!(res, Err(\"Underflow!\"));\nassert_eq!(shared, 6);
\n

Since the third element caused an underflow, no further elements were taken,\nso the final value of shared is 6 (= 3 + 2 + 1), not 16.

\n
","FromIterator>","fe_parser::parser::ParseResult"],["
Source§

impl<T, E, F> FromResidual<Result<Infallible, E>> for Result<T, F>
where\n F: From<E>,

Source§

fn from_residual(residual: Result<Infallible, E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","fe_parser::parser::ParseResult"],["
Source§

impl<T, E, F> FromResidual<Yeet<E>> for Result<T, F>
where\n F: From<E>,

Source§

fn from_residual(_: Yeet<E>) -> Result<T, F>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from a compatible Residual type. Read more
","FromResidual>","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Hash for Result<T, E>
where\n T: Hash,\n E: Hash,

Source§

fn hash<__H>(&self, state: &mut __H)
where\n __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> IntoIterator for Result<T, E>

Source§

fn into_iter(self) -> IntoIter<T>

Returns a consuming iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(5);\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, [5]);\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nlet v: Vec<u32> = x.into_iter().collect();\nassert_eq!(v, []);
\n
Source§

type Item = T

The type of the elements being iterated over.
Source§

type IntoIter = IntoIter<T>

Which kind of iterator are we turning this into?
","IntoIterator","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Ord for Result<T, E>
where\n T: Ord,\n E: Ord,

Source§

fn cmp(&self, other: &Result<T, E>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized,

Restrict a value to a certain interval. Read more
","Ord","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> PartialEq for Result<T, E>
where\n T: PartialEq,\n E: PartialEq,

Source§

fn eq(&self, other: &Result<T, E>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient,\nand should not be overridden without very good reason.
","PartialEq","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> PartialOrd for Result<T, E>
where\n T: PartialOrd,\n E: PartialOrd,

Source§

fn partial_cmp(&self, other: &Result<T, E>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the\n<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the >\noperator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by\nthe >= operator. Read more
","PartialOrd","fe_parser::parser::ParseResult"],["
1.16.0 · Source§

impl<T, U, E> Product<Result<U, E>> for Result<T, E>
where\n T: Product<U>,

Source§

fn product<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the product of all elements is returned.

\n
§Examples
\n

This multiplies each number in a vector of strings,\nif a string could not be parsed the operation returns Err:

\n\n
let nums = vec![\"5\", \"10\", \"1\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert_eq!(total, Ok(100));\nlet nums = vec![\"5\", \"10\", \"one\", \"2\"];\nlet total: Result<usize, _> = nums.iter().map(|w| w.parse::<usize>()).product();\nassert!(total.is_err());
\n
","Product>","fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Residual<T> for Result<Infallible, E>

Source§

type TryType = Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2_residual)
The “return” type of this meta-function.
","Residual","fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<&T, E>

1.59.0 (const: 1.83.0) · Source

pub const fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · Source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let val = 12;\nlet x: Result<&i32, i32> = Ok(&val);\nassert_eq!(x, Ok(&12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<&mut T, E>

1.59.0 (const: 1.83.0) · Source

pub const fn copied(self) -> Result<T, E>
where\n T: Copy,

Maps a Result<&mut T, E> to a Result<T, E> by copying the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet copied = x.copied();\nassert_eq!(copied, Ok(12));
\n
1.59.0 · Source

pub fn cloned(self) -> Result<T, E>
where\n T: Clone,

Maps a Result<&mut T, E> to a Result<T, E> by cloning the contents of the\nOk part.

\n
§Examples
\n
let mut val = 12;\nlet x: Result<&mut i32, i32> = Ok(&mut val);\nassert_eq!(x, Ok(&mut 12));\nlet cloned = x.cloned();\nassert_eq!(cloned, Ok(12));
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<Option<T>, E>

1.33.0 (const: 1.83.0) · Source

pub const fn transpose(self) -> Option<Result<T, E>>

Transposes a Result of an Option into an Option of a Result.

\n

Ok(None) will be mapped to None.\nOk(Some(_)) and Err(_) will be mapped to Some(Ok(_)) and Some(Err(_)).

\n
§Examples
\n
#[derive(Debug, Eq, PartialEq)]\nstruct SomeErr;\n\nlet x: Result<Option<i32>, SomeErr> = Ok(Some(5));\nlet y: Option<Result<i32, SomeErr>> = Some(Ok(5));\nassert_eq!(x.transpose(), y);
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<Result<T, E>, E>

1.89.0 (const: 1.89.0) · Source

pub const fn flatten(self) -> Result<T, E>

Converts from Result<Result<T, E>, E> to Result<T, E>

\n
§Examples
\n
let x: Result<Result<&'static str, u32>, u32> = Ok(Ok(\"hello\"));\nassert_eq!(Ok(\"hello\"), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Ok(Err(6));\nassert_eq!(Err(6), x.flatten());\n\nlet x: Result<Result<&'static str, u32>, u32> = Err(6);\nassert_eq!(Err(6), x.flatten());
\n

Flattening only removes one level of nesting at a time:

\n\n
let x: Result<Result<Result<&'static str, u32>, u32>, u32> = Ok(Ok(Ok(\"hello\")));\nassert_eq!(Ok(Ok(\"hello\")), x.flatten());\nassert_eq!(Ok(\"hello\"), x.flatten().flatten());
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Result<T, E>

1.0.0 (const: 1.48.0) · Source

pub const fn is_ok(&self) -> bool

Returns true if the result is Ok.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_ok(), true);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_ok(), false);
\n
1.70.0 · Source

pub fn is_ok_and(self, f: impl FnOnce(T) -> bool) -> bool

Returns true if the result is Ok and the value inside of it matches a predicate.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.is_ok_and(|x| x > 1), true);\n\nlet x: Result<u32, &str> = Ok(0);\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<u32, &str> = Err(\"hey\");\nassert_eq!(x.is_ok_and(|x| x > 1), false);\n\nlet x: Result<String, &str> = Ok(\"ownership\".to_string());\nassert_eq!(x.as_ref().is_ok_and(|x| x.len() > 1), true);\nprintln!(\"still alive {:?}\", x);
\n
1.0.0 (const: 1.48.0) · Source

pub const fn is_err(&self) -> bool

Returns true if the result is Err.

\n
§Examples
\n
let x: Result<i32, &str> = Ok(-3);\nassert_eq!(x.is_err(), false);\n\nlet x: Result<i32, &str> = Err(\"Some error message\");\nassert_eq!(x.is_err(), true);
\n
1.70.0 · Source

pub fn is_err_and(self, f: impl FnOnce(E) -> bool) -> bool

Returns true if the result is Err and the value inside of it matches a predicate.

\n
§Examples
\n
use std::io::{Error, ErrorKind};\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::NotFound, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), true);\n\nlet x: Result<u32, Error> = Err(Error::new(ErrorKind::PermissionDenied, \"!\"));\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, Error> = Ok(123);\nassert_eq!(x.is_err_and(|x| x.kind() == ErrorKind::NotFound), false);\n\nlet x: Result<u32, String> = Err(\"ownership\".to_string());\nassert_eq!(x.as_ref().is_err_and(|x| x.len() > 1), true);\nprintln!(\"still alive {:?}\", x);
\n
1.0.0 · Source

pub fn ok(self) -> Option<T>

Converts from Result<T, E> to Option<T>.

\n

Converts self into an Option<T>, consuming self,\nand discarding the error, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.ok(), Some(2));\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.ok(), None);
\n
1.0.0 · Source

pub fn err(self) -> Option<E>

Converts from Result<T, E> to Option<E>.

\n

Converts self into an Option<E>, consuming self,\nand discarding the success value, if any.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.err(), None);\n\nlet x: Result<u32, &str> = Err(\"Nothing here\");\nassert_eq!(x.err(), Some(\"Nothing here\"));
\n
1.0.0 (const: 1.48.0) · Source

pub const fn as_ref(&self) -> Result<&T, &E>

Converts from &Result<T, E> to Result<&T, &E>.

\n

Produces a new Result, containing a reference\ninto the original, leaving the original in place.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.as_ref(), Ok(&2));\n\nlet x: Result<u32, &str> = Err(\"Error\");\nassert_eq!(x.as_ref(), Err(&\"Error\"));
\n
1.0.0 (const: 1.83.0) · Source

pub const fn as_mut(&mut self) -> Result<&mut T, &mut E>

Converts from &mut Result<T, E> to Result<&mut T, &mut E>.

\n
§Examples
\n
fn mutate(r: &mut Result<i32, i32>) {\n    match r.as_mut() {\n        Ok(v) => *v = 42,\n        Err(e) => *e = 0,\n    }\n}\n\nlet mut x: Result<i32, i32> = Ok(2);\nmutate(&mut x);\nassert_eq!(x.unwrap(), 42);\n\nlet mut x: Result<i32, i32> = Err(13);\nmutate(&mut x);\nassert_eq!(x.unwrap_err(), 0);
\n
1.0.0 · Source

pub fn map<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> U,

Maps a Result<T, E> to Result<U, E> by applying a function to a\ncontained Ok value, leaving an Err value untouched.

\n

This function can be used to compose the results of two functions.

\n
§Examples
\n

Print the numbers on each line of a string multiplied by two.

\n\n
let line = \"1\\n2\\n3\\n4\\n\";\n\nfor num in line.lines() {\n    match num.parse::<i32>().map(|i| i * 2) {\n        Ok(n) => println!(\"{n}\"),\n        Err(..) => {}\n    }\n}
\n
1.41.0 · Source

pub fn map_or<U, F>(self, default: U, f: F) -> U
where\n F: FnOnce(T) -> U,

Returns the provided default (if Err), or\napplies a function to the contained value (if Ok).

\n

Arguments passed to map_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use map_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let x: Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or(42, |v| v.len()), 3);\n\nlet x: Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or(42, |v| v.len()), 42);
\n
1.41.0 · Source

pub fn map_or_else<U, D, F>(self, default: D, f: F) -> U
where\n D: FnOnce(E) -> U,\n F: FnOnce(T) -> U,

Maps a Result<T, E> to U by applying fallback function default to\na contained Err value, or function f to a contained Ok value.

\n

This function can be used to unpack a successful result\nwhile handling an error.

\n
§Examples
\n
let k = 21;\n\nlet x : Result<_, &str> = Ok(\"foo\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 3);\n\nlet x : Result<&str, _> = Err(\"bar\");\nassert_eq!(x.map_or_else(|e| k * 2, |v| v.len()), 42);
\n
Source

pub fn map_or_default<U, F>(self, f: F) -> U
where\n U: Default,\n F: FnOnce(T) -> U,

🔬This is a nightly-only experimental API. (result_option_map_or_default)

Maps a Result<T, E> to a U by applying function f to the contained\nvalue if the result is Ok, otherwise if Err, returns the\ndefault value for the type U.

\n
§Examples
\n
#![feature(result_option_map_or_default)]\n\nlet x: Result<_, &str> = Ok(\"foo\");\nlet y: Result<&str, _> = Err(\"bar\");\n\nassert_eq!(x.map_or_default(|x| x.len()), 3);\nassert_eq!(y.map_or_default(|y| y.len()), 0);
\n
1.0.0 · Source

pub fn map_err<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> F,

Maps a Result<T, E> to Result<T, F> by applying a function to a\ncontained Err value, leaving an Ok value untouched.

\n

This function can be used to pass through a successful result while handling\nan error.

\n
§Examples
\n
fn stringify(x: u32) -> String { format!(\"error code: {x}\") }\n\nlet x: Result<u32, u32> = Ok(2);\nassert_eq!(x.map_err(stringify), Ok(2));\n\nlet x: Result<u32, u32> = Err(13);\nassert_eq!(x.map_err(stringify), Err(\"error code: 13\".to_string()));
\n
1.76.0 · Source

pub fn inspect<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&T),

Calls a function with a reference to the contained value if Ok.

\n

Returns the original result.

\n
§Examples
\n
let x: u8 = \"4\"\n    .parse::<u8>()\n    .inspect(|x| println!(\"original: {x}\"))\n    .map(|x| x.pow(3))\n    .expect(\"failed to parse number\");
\n
1.76.0 · Source

pub fn inspect_err<F>(self, f: F) -> Result<T, E>
where\n F: FnOnce(&E),

Calls a function with a reference to the contained value if Err.

\n

Returns the original result.

\n
§Examples
\n
use std::{fs, io};\n\nfn read() -> io::Result<String> {\n    fs::read_to_string(\"address.txt\")\n        .inspect_err(|e| eprintln!(\"failed to read file: {e}\"))\n}
\n
1.47.0 · Source

pub fn as_deref(&self) -> Result<&<T as Deref>::Target, &E>
where\n T: Deref,

Converts from Result<T, E> (or &Result<T, E>) to Result<&<T as Deref>::Target, &E>.

\n

Coerces the Ok variant of the original Result via Deref\nand returns the new Result.

\n
§Examples
\n
let x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&str, &u32> = Ok(\"hello\");\nassert_eq!(x.as_deref(), y);\n\nlet x: Result<String, u32> = Err(42);\nlet y: Result<&str, &u32> = Err(&42);\nassert_eq!(x.as_deref(), y);
\n
1.47.0 · Source

pub fn as_deref_mut(&mut self) -> Result<&mut <T as Deref>::Target, &mut E>
where\n T: DerefMut,

Converts from Result<T, E> (or &mut Result<T, E>) to Result<&mut <T as DerefMut>::Target, &mut E>.

\n

Coerces the Ok variant of the original Result via DerefMut\nand returns the new Result.

\n
§Examples
\n
let mut s = \"HELLO\".to_string();\nlet mut x: Result<String, u32> = Ok(\"hello\".to_string());\nlet y: Result<&mut str, &mut u32> = Ok(&mut s);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);\n\nlet mut i = 42;\nlet mut x: Result<String, u32> = Err(42);\nlet y: Result<&mut str, &mut u32> = Err(&mut i);\nassert_eq!(x.as_deref_mut().map(|x| { x.make_ascii_uppercase(); x }), y);
\n
1.0.0 · Source

pub fn iter(&self) -> Iter<'_, T>

Returns an iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(7);\nassert_eq!(x.iter().next(), Some(&7));\n\nlet x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter().next(), None);
\n
1.0.0 · Source

pub fn iter_mut(&mut self) -> IterMut<'_, T>

Returns a mutable iterator over the possibly contained value.

\n

The iterator yields one value if the result is Result::Ok, otherwise none.

\n
§Examples
\n
let mut x: Result<u32, &str> = Ok(7);\nmatch x.iter_mut().next() {\n    Some(v) => *v = 40,\n    None => {},\n}\nassert_eq!(x, Ok(40));\n\nlet mut x: Result<u32, &str> = Err(\"nothing!\");\nassert_eq!(x.iter_mut().next(), None);
\n
1.4.0 · Source

pub fn expect(self, msg: &str) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nInstead, prefer to use pattern matching and handle the Err\ncase explicitly, or call unwrap_or, unwrap_or_else, or\nunwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message including the\npassed message, and the content of the Err.

\n
§Examples
\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.expect(\"Testing expect\"); // panics with `Testing expect: emergency failure`
\n
§Recommended Message Style
\n

We recommend that expect messages are used to describe the reason you\nexpect the Result should be Ok.

\n\n
let path = std::env::var(\"IMPORTANT_PATH\")\n    .expect(\"env variable `IMPORTANT_PATH` should be set by `wrapper_script.sh`\");
\n

Hint: If you’re having trouble remembering how to phrase expect\nerror messages remember to focus on the word “should” as in “env\nvariable should be set by blah” or “the given binary should be available\nand executable by the current user”.

\n

For more detail on expect message styles and the reasoning behind our recommendation please\nrefer to the section on “Common Message\nStyles” in the\nstd::error module docs.

\n
1.0.0 · Source

pub fn unwrap(self) -> T
where\n E: Debug,

Returns the contained Ok value, consuming the self value.

\n

Because this function may panic, its use is generally discouraged.\nPanics are meant for unrecoverable errors, and\nmay abort the entire program.

\n

Instead, prefer to use the ? (try) operator, or pattern matching\nto handle the Err case explicitly, or call unwrap_or,\nunwrap_or_else, or unwrap_or_default.

\n
§Panics
\n

Panics if the value is an Err, with a panic message provided by the\nErr’s value.

\n
§Examples
\n

Basic usage:

\n\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(x.unwrap(), 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nx.unwrap(); // panics with `emergency failure`
\n
1.16.0 · Source

pub fn unwrap_or_default(self) -> T
where\n T: Default,

Returns the contained Ok value or a default

\n

Consumes the self argument then, if Ok, returns the contained\nvalue, otherwise if Err, returns the default value for that\ntype.

\n
§Examples
\n

Converts a string to an integer, turning poorly-formed strings\ninto 0 (the default value for integers). parse converts\na string to any other type that implements FromStr, returning an\nErr on error.

\n\n
let good_year_from_input = \"1909\";\nlet bad_year_from_input = \"190blarg\";\nlet good_year = good_year_from_input.parse().unwrap_or_default();\nlet bad_year = bad_year_from_input.parse().unwrap_or_default();\n\nassert_eq!(1909, good_year);\nassert_eq!(0, bad_year);
\n
1.17.0 · Source

pub fn expect_err(self, msg: &str) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a panic message including the\npassed message, and the content of the Ok.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(10);\nx.expect_err(\"Testing expect_err\"); // panics with `Testing expect_err: 10`
\n
1.0.0 · Source

pub fn unwrap_err(self) -> E
where\n T: Debug,

Returns the contained Err value, consuming the self value.

\n
§Panics
\n

Panics if the value is an Ok, with a custom panic message provided\nby the Ok’s value.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nx.unwrap_err(); // panics with `2`
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(x.unwrap_err(), \"emergency failure\");
\n
Source

pub const fn into_ok(self) -> T
where\n E: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Ok value, but never panics.

\n

Unlike unwrap, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap as a maintainability safeguard that will fail\nto compile if the error type of the Result is later changed\nto an error that can actually occur.

\n
§Examples
\n
\nfn only_good_news() -> Result<String, !> {\n    Ok(\"this is fine\".into())\n}\n\nlet s: String = only_good_news().into_ok();\nprintln!(\"{s}\");
\n
Source

pub const fn into_err(self) -> E
where\n T: Into<!>,

🔬This is a nightly-only experimental API. (unwrap_infallible)

Returns the contained Err value, but never panics.

\n

Unlike unwrap_err, this method is known to never panic on the\nresult types it is implemented for. Therefore, it can be used\ninstead of unwrap_err as a maintainability safeguard that will fail\nto compile if the ok type of the Result is later changed\nto a type that can actually occur.

\n
§Examples
\n
\nfn only_bad_news() -> Result<!, String> {\n    Err(\"Oops, it failed\".into())\n}\n\nlet error: String = only_bad_news().into_err();\nprintln!(\"{error}\");
\n
1.0.0 · Source

pub fn and<U>(self, res: Result<U, E>) -> Result<U, E>

Returns res if the result is Ok, otherwise returns the Err value of self.

\n

Arguments passed to and are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use and_then, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<&str, &str> = Ok(\"foo\");\nassert_eq!(x.and(y), Err(\"early error\"));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<&str, &str> = Err(\"late error\");\nassert_eq!(x.and(y), Err(\"not a 2\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<&str, &str> = Ok(\"different result type\");\nassert_eq!(x.and(y), Ok(\"different result type\"));
\n
1.0.0 · Source

pub fn and_then<U, F>(self, op: F) -> Result<U, E>
where\n F: FnOnce(T) -> Result<U, E>,

Calls op if the result is Ok, otherwise returns the Err value of self.

\n

This function can be used for control flow based on Result values.

\n
§Examples
\n
fn sq_then_to_string(x: u32) -> Result<String, &'static str> {\n    x.checked_mul(x).map(|sq| sq.to_string()).ok_or(\"overflowed\")\n}\n\nassert_eq!(Ok(2).and_then(sq_then_to_string), Ok(4.to_string()));\nassert_eq!(Ok(1_000_000).and_then(sq_then_to_string), Err(\"overflowed\"));\nassert_eq!(Err(\"not a number\").and_then(sq_then_to_string), Err(\"not a number\"));
\n

Often used to chain fallible operations that may return Err.

\n\n
use std::{io::ErrorKind, path::Path};\n\n// Note: on Windows \"/\" maps to \"C:\\\"\nlet root_modified_time = Path::new(\"/\").metadata().and_then(|md| md.modified());\nassert!(root_modified_time.is_ok());\n\nlet should_fail = Path::new(\"/bad/path\").metadata().and_then(|md| md.modified());\nassert!(should_fail.is_err());\nassert_eq!(should_fail.unwrap_err().kind(), ErrorKind::NotFound);
\n
1.0.0 · Source

pub fn or<F>(self, res: Result<T, F>) -> Result<T, F>

Returns res if the result is Err, otherwise returns the Ok value of self.

\n

Arguments passed to or are eagerly evaluated; if you are passing the\nresult of a function call, it is recommended to use or_else, which is\nlazily evaluated.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"early error\");\nlet y: Result<u32, &str> = Ok(2);\nassert_eq!(x.or(y), Ok(2));\n\nlet x: Result<u32, &str> = Err(\"not a 2\");\nlet y: Result<u32, &str> = Err(\"late error\");\nassert_eq!(x.or(y), Err(\"late error\"));\n\nlet x: Result<u32, &str> = Ok(2);\nlet y: Result<u32, &str> = Ok(100);\nassert_eq!(x.or(y), Ok(2));
\n
1.0.0 · Source

pub fn or_else<F, O>(self, op: O) -> Result<T, F>
where\n O: FnOnce(E) -> Result<T, F>,

Calls op if the result is Err, otherwise returns the Ok value of self.

\n

This function can be used for control flow based on result values.

\n
§Examples
\n
fn sq(x: u32) -> Result<u32, u32> { Ok(x * x) }\nfn err(x: u32) -> Result<u32, u32> { Err(x) }\n\nassert_eq!(Ok(2).or_else(sq).or_else(sq), Ok(2));\nassert_eq!(Ok(2).or_else(err).or_else(sq), Ok(2));\nassert_eq!(Err(3).or_else(sq).or_else(err), Ok(9));\nassert_eq!(Err(3).or_else(err).or_else(err), Err(3));
\n
1.0.0 · Source

pub fn unwrap_or(self, default: T) -> T

Returns the contained Ok value or a provided default.

\n

Arguments passed to unwrap_or are eagerly evaluated; if you are passing\nthe result of a function call, it is recommended to use unwrap_or_else,\nwhich is lazily evaluated.

\n
§Examples
\n
let default = 2;\nlet x: Result<u32, &str> = Ok(9);\nassert_eq!(x.unwrap_or(default), 9);\n\nlet x: Result<u32, &str> = Err(\"error\");\nassert_eq!(x.unwrap_or(default), default);
\n
1.0.0 · Source

pub fn unwrap_or_else<F>(self, op: F) -> T
where\n F: FnOnce(E) -> T,

Returns the contained Ok value or computes it from a closure.

\n
§Examples
\n
fn count(x: &str) -> usize { x.len() }\n\nassert_eq!(Ok(2).unwrap_or_else(count), 2);\nassert_eq!(Err(\"foo\").unwrap_or_else(count), 3);
\n
1.58.0 · Source

pub unsafe fn unwrap_unchecked(self) -> T

Returns the contained Ok value, consuming the self value,\nwithout checking that the value is not an Err.

\n
§Safety
\n

Calling this method on an Err is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nassert_eq!(unsafe { x.unwrap_unchecked() }, 2);
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nunsafe { x.unwrap_unchecked(); } // Undefined behavior!
\n
1.58.0 · Source

pub unsafe fn unwrap_err_unchecked(self) -> E

Returns the contained Err value, consuming the self value,\nwithout checking that the value is not an Ok.

\n
§Safety
\n

Calling this method on an Ok is undefined behavior.

\n
§Examples
\n
let x: Result<u32, &str> = Ok(2);\nunsafe { x.unwrap_err_unchecked() }; // Undefined behavior!
\n\n
let x: Result<u32, &str> = Err(\"emergency failure\");\nassert_eq!(unsafe { x.unwrap_err_unchecked() }, \"emergency failure\");
\n
",0,"fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Serialize for Result<T, E>
where\n T: Serialize,\n E: Serialize,

Source§

fn serialize<S>(\n &self,\n serializer: S,\n) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where\n S: Serializer,

Serialize this value into the given Serde serializer. Read more
","Serialize","fe_parser::parser::ParseResult"],["
1.16.0 · Source§

impl<T, U, E> Sum<Result<U, E>> for Result<T, E>
where\n T: Sum<U>,

Source§

fn sum<I>(iter: I) -> Result<T, E>
where\n I: Iterator<Item = Result<U, E>>,

Takes each element in the Iterator: if it is an Err, no further\nelements are taken, and the Err is returned. Should no Err\noccur, the sum of all elements is returned.

\n
§Examples
\n

This sums up every integer in a vector, rejecting the sum if a negative\nelement is encountered:

\n\n
let f = |&x: &i32| if x < 0 { Err(\"Negative element found\") } else { Ok(x) };\nlet v = vec![1, 2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Ok(3));\nlet v = vec![1, -2];\nlet res: Result<i32, _> = v.iter().map(f).sum();\nassert_eq!(res, Err(\"Negative element found\"));
\n
","Sum>","fe_parser::parser::ParseResult"],["
1.61.0 · Source§

impl<T, E> Termination for Result<T, E>
where\n T: Termination,\n E: Debug,

Source§

fn report(self) -> ExitCode

Is called to get the representation of the value as status code.\nThis status code is returned to the operating system.
","Termination","fe_parser::parser::ParseResult"],["
Source§

impl<T, E> Try for Result<T, E>

Source§

type Output = T

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value produced by ? when not short-circuiting.
Source§

type Residual = Result<Infallible, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
The type of the value passed to FromResidual::from_residual\nas part of ? when short-circuiting. Read more
Source§

fn from_output(output: <Result<T, E> as Try>::Output) -> Result<T, E>

🔬This is a nightly-only experimental API. (try_trait_v2)
Constructs the type from its Output type. Read more
Source§

fn branch(\n self,\n) -> ControlFlow<<Result<T, E> as Try>::Residual, <Result<T, E> as Try>::Output>

🔬This is a nightly-only experimental API. (try_trait_v2)
Used in ? to decide whether the operator should produce a value\n(because this returned ControlFlow::Continue)\nor propagate a value back to the caller\n(because this returned ControlFlow::Break). Read more
","Try","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Copy for Result<T, E>
where\n T: Copy,\n E: Copy,

","Copy","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> Eq for Result<T, E>
where\n T: Eq,\n E: Eq,

","Eq","fe_parser::parser::ParseResult"],["
1.0.0 · Source§

impl<T, E> StructuralPartialEq for Result<T, E>

","StructuralPartialEq","fe_parser::parser::ParseResult"],["
Source§

impl<T, E> UseCloned for Result<T, E>
where\n T: UseCloned,\n E: UseCloned,

","UseCloned","fe_parser::parser::ParseResult"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[169651]} \ No newline at end of file diff --git a/compiler-docs/type.impl/evm/backend/memory/struct.MemoryBackend.js b/compiler-docs/type.impl/evm/backend/memory/struct.MemoryBackend.js new file mode 100644 index 0000000000..2a9ee96c83 --- /dev/null +++ b/compiler-docs/type.impl/evm/backend/memory/struct.MemoryBackend.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_compiler_test_utils",[["
§

impl<'vicinity> ApplyBackend for MemoryBackend<'vicinity>

§

fn apply<A, I, L>(&mut self, values: A, logs: L, delete_empty: bool)
where\n A: IntoIterator<Item = Apply<I>>,\n I: IntoIterator<Item = (H256, H256)>,\n L: IntoIterator<Item = Log>,

Apply given values and logs at backend.
","ApplyBackend","fe_compiler_test_utils::Backend"],["
§

impl<'vicinity> Backend for MemoryBackend<'vicinity>

§

fn gas_price(&self) -> U256

Gas price. Unused for London.
§

fn origin(&self) -> H160

Origin.
§

fn block_hash(&self, number: U256) -> H256

Environmental block hash.
§

fn block_number(&self) -> U256

Environmental block number.
§

fn block_coinbase(&self) -> H160

Environmental coinbase.
§

fn block_timestamp(&self) -> U256

Environmental block timestamp.
§

fn block_difficulty(&self) -> U256

Environmental block difficulty.
§

fn block_gas_limit(&self) -> U256

Environmental block gas limit.
§

fn block_base_fee_per_gas(&self) -> U256

Environmental block base fee.
§

fn chain_id(&self) -> U256

Environmental chain ID.
§

fn exists(&self, address: H160) -> bool

Whether account at address exists.
§

fn basic(&self, address: H160) -> Basic

Get basic account information.
§

fn code(&self, address: H160) -> Vec<u8>

Get account code.
§

fn storage(&self, address: H160, index: H256) -> H256

Get storage value of address at index.
§

fn original_storage(&self, address: H160, index: H256) -> Option<H256>

Get original storage value of address at index, if available.
","Backend","fe_compiler_test_utils::Backend"],["
§

impl<'vicinity> Clone for MemoryBackend<'vicinity>

§

fn clone(&self) -> MemoryBackend<'vicinity>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","fe_compiler_test_utils::Backend"],["
§

impl<'vicinity> Debug for MemoryBackend<'vicinity>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","fe_compiler_test_utils::Backend"],["
§

impl<'vicinity> MemoryBackend<'vicinity>

pub fn new(\n vicinity: &'vicinity MemoryVicinity,\n state: BTreeMap<H160, MemoryAccount>,\n) -> MemoryBackend<'vicinity>

Create a new memory backend.

\n

pub fn state(&self) -> &BTreeMap<H160, MemoryAccount>

Get the underlying BTreeMap storing the state.

\n

pub fn state_mut(&mut self) -> &mut BTreeMap<H160, MemoryAccount>

Get a mutable reference to the underlying BTreeMap storing the state.

\n
",0,"fe_compiler_test_utils::Backend"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[13399]} \ No newline at end of file diff --git a/compiler-docs/type.impl/evm/executor/stack/executor/struct.StackExecutor.js b/compiler-docs/type.impl/evm/executor/stack/executor/struct.StackExecutor.js new file mode 100644 index 0000000000..617b65c448 --- /dev/null +++ b/compiler-docs/type.impl/evm/executor/stack/executor/struct.StackExecutor.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_compiler_test_utils",[["
§

impl<'config, 'precompiles, S, P> Handler for StackExecutor<'config, 'precompiles, S, P>
where\n S: StackState<'config>,\n P: PrecompileSet,

§

type CreateInterrupt = Infallible

Type of CREATE interrupt.
§

type CreateFeedback = Infallible

Feedback value for CREATE interrupt.
§

type CallInterrupt = Infallible

Type of CALL interrupt.
§

type CallFeedback = Infallible

Feedback value of CALL interrupt.
§

fn balance(&self, address: H160) -> U256

Get balance of address.
§

fn code_size(&self, address: H160) -> U256

Get code size of address.
§

fn code_hash(&self, address: H160) -> H256

Get code hash of address.
§

fn code(&self, address: H160) -> Vec<u8>

Get code of address.
§

fn storage(&self, address: H160, index: H256) -> H256

Get storage value of address at index.
§

fn original_storage(&self, address: H160, index: H256) -> H256

Get original storage value of address at index.
§

fn exists(&self, address: H160) -> bool

Check whether an address exists.
§

fn is_cold(&self, address: H160, maybe_index: Option<H256>) -> bool

Checks if the address or (address, index) pair has been previously accessed\n(or set in accessed_addresses / accessed_storage_keys via an access list\ntransaction).\nReferences: Read more
§

fn gas_left(&self) -> U256

Get the gas left value.
§

fn gas_price(&self) -> U256

Get the gas price value.
§

fn origin(&self) -> H160

Get execution origin.
§

fn block_hash(&self, number: U256) -> H256

Get environmental block hash.
§

fn block_number(&self) -> U256

Get environmental block number.
§

fn block_coinbase(&self) -> H160

Get environmental coinbase.
§

fn block_timestamp(&self) -> U256

Get environmental block timestamp.
§

fn block_difficulty(&self) -> U256

Get environmental block difficulty.
§

fn block_gas_limit(&self) -> U256

Get environmental gas limit.
§

fn block_base_fee_per_gas(&self) -> U256

Environmental block base fee.
§

fn chain_id(&self) -> U256

Get environmental chain ID.
§

fn deleted(&self, address: H160) -> bool

Check whether an address has already been deleted.
§

fn set_storage(\n &mut self,\n address: H160,\n index: H256,\n value: H256,\n) -> Result<(), ExitError>

Set storage value of address at index.
§

fn log(\n &mut self,\n address: H160,\n topics: Vec<H256>,\n data: Vec<u8>,\n) -> Result<(), ExitError>

Create a log owned by address with given topics and data.
§

fn mark_delete(&mut self, address: H160, target: H160) -> Result<(), ExitError>

Mark an address to be deleted, with funds transferred to target.
§

fn create(\n &mut self,\n caller: H160,\n scheme: CreateScheme,\n value: U256,\n init_code: Vec<u8>,\n target_gas: Option<u64>,\n) -> Capture<(ExitReason, Option<H160>, Vec<u8>), <StackExecutor<'config, 'precompiles, S, P> as Handler>::CreateInterrupt>

Invoke a create operation.
§

fn call(\n &mut self,\n code_address: H160,\n transfer: Option<Transfer>,\n input: Vec<u8>,\n target_gas: Option<u64>,\n is_static: bool,\n context: Context,\n) -> Capture<(ExitReason, Vec<u8>), <StackExecutor<'config, 'precompiles, S, P> as Handler>::CallInterrupt>

Invoke a call operation.
§

fn pre_validate(\n &mut self,\n context: &Context,\n opcode: Opcode,\n stack: &Stack,\n) -> Result<(), ExitError>

Pre-validation step for the runtime.
§

fn create_feedback(\n &mut self,\n _feedback: Self::CreateFeedback,\n) -> Result<(), ExitError>

Feed in create feedback.
§

fn call_feedback(\n &mut self,\n _feedback: Self::CallFeedback,\n) -> Result<(), ExitError>

Feed in call feedback.
§

fn other(\n &mut self,\n opcode: Opcode,\n _stack: &mut Machine,\n) -> Result<(), ExitError>

Handle other unknown external opcodes.
","Handler","fe_compiler_test_utils::Executor"],["
§

impl<'config, 'precompiles, S, P> StackExecutor<'config, 'precompiles, S, P>
where\n S: StackState<'config>,\n P: PrecompileSet,

pub fn config(&self) -> &'config Config

Return a reference of the Config.

\n

pub fn precompiles(&self) -> &'precompiles P

Return a reference to the precompile set.

\n

pub fn new_with_precompiles(\n state: S,\n config: &'config Config,\n precompile_set: &'precompiles P,\n) -> StackExecutor<'config, 'precompiles, S, P>

Create a new stack-based executor with given precompiles.

\n

pub fn state(&self) -> &S

pub fn state_mut(&mut self) -> &mut S

pub fn into_state(self) -> S

pub fn enter_substate(&mut self, gas_limit: u64, is_static: bool)

Create a substate executor from the current executor.

\n

pub fn exit_substate(&mut self, kind: StackExitKind) -> Result<(), ExitError>

Exit a substate. Panic if it results an empty substate stack.

\n

pub fn execute(&mut self, runtime: &mut Runtime<'_>) -> ExitReason

Execute the runtime until it returns.

\n

pub fn gas(&self) -> u64

Get remaining gas.

\n

pub fn transact_create(\n &mut self,\n caller: H160,\n value: U256,\n init_code: Vec<u8>,\n gas_limit: u64,\n access_list: Vec<(H160, Vec<H256>)>,\n) -> (ExitReason, Vec<u8>)

Execute a CREATE transaction.

\n

pub fn transact_create2(\n &mut self,\n caller: H160,\n value: U256,\n init_code: Vec<u8>,\n salt: H256,\n gas_limit: u64,\n access_list: Vec<(H160, Vec<H256>)>,\n) -> (ExitReason, Vec<u8>)

Execute a CREATE2 transaction.

\n

pub fn transact_call(\n &mut self,\n caller: H160,\n address: H160,\n value: U256,\n data: Vec<u8>,\n gas_limit: u64,\n access_list: Vec<(H160, Vec<H256>)>,\n) -> (ExitReason, Vec<u8>)

Execute a CALL transaction with a given caller, address, value and\ngas limit and data.

\n

Takes in an additional access_list parameter for EIP-2930 which was\nintroduced in the Ethereum Berlin hard fork. If you do not wish to use\nthis functionality, just pass in an empty vector.

\n

pub fn used_gas(&self) -> u64

Get used gas for the current executor, given the price.

\n

pub fn fee(&self, price: U256) -> U256

Get fee needed for the current executor, given the price.

\n

pub fn nonce(&self, address: H160) -> U256

Get account nonce.

\n

pub fn create_address(&self, scheme: CreateScheme) -> H160

Get the create address from given scheme.

\n

pub fn initialize_with_access_list(\n &mut self,\n access_list: Vec<(H160, Vec<H256>)>,\n)

",0,"fe_compiler_test_utils::Executor"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[28839]} \ No newline at end of file diff --git a/compiler-docs/type.impl/evm/executor/stack/memory/struct.MemoryStackState.js b/compiler-docs/type.impl/evm/executor/stack/memory/struct.MemoryStackState.js new file mode 100644 index 0000000000..3055e552dc --- /dev/null +++ b/compiler-docs/type.impl/evm/executor/stack/memory/struct.MemoryStackState.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_compiler_test_utils",[["
§

impl<'backend, 'config, B> Backend for MemoryStackState<'backend, 'config, B>
where\n B: Backend,

§

fn gas_price(&self) -> U256

Gas price. Unused for London.
§

fn origin(&self) -> H160

Origin.
§

fn block_hash(&self, number: U256) -> H256

Environmental block hash.
§

fn block_number(&self) -> U256

Environmental block number.
§

fn block_coinbase(&self) -> H160

Environmental coinbase.
§

fn block_timestamp(&self) -> U256

Environmental block timestamp.
§

fn block_difficulty(&self) -> U256

Environmental block difficulty.
§

fn block_gas_limit(&self) -> U256

Environmental block gas limit.
§

fn block_base_fee_per_gas(&self) -> U256

Environmental block base fee.
§

fn chain_id(&self) -> U256

Environmental chain ID.
§

fn exists(&self, address: H160) -> bool

Whether account at address exists.
§

fn basic(&self, address: H160) -> Basic

Get basic account information.
§

fn code(&self, address: H160) -> Vec<u8>

Get account code.
§

fn storage(&self, address: H160, key: H256) -> H256

Get storage value of address at index.
§

fn original_storage(&self, address: H160, key: H256) -> Option<H256>

Get original storage value of address at index, if available.
","Backend","fe_compiler_test_utils::StackState"],["
§

impl<'backend, 'config, B> Clone for MemoryStackState<'backend, 'config, B>
where\n B: Clone,

§

fn clone(&self) -> MemoryStackState<'backend, 'config, B>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","fe_compiler_test_utils::StackState"],["
§

impl<'backend, 'config, B> Debug for MemoryStackState<'backend, 'config, B>
where\n B: Debug,

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","fe_compiler_test_utils::StackState"],["
§

impl<'backend, 'config, B> MemoryStackState<'backend, 'config, B>
where\n B: Backend,

pub fn new(\n metadata: StackSubstateMetadata<'config>,\n backend: &'backend B,\n) -> MemoryStackState<'backend, 'config, B>

pub fn account_mut(&mut self, address: H160) -> &mut MemoryStackAccount

Returns a mutable reference to an account given its address

\n

pub fn deconstruct(\n self,\n) -> (impl IntoIterator<Item = Apply<impl IntoIterator<Item = (H256, H256)>>>, impl IntoIterator<Item = Log>)

pub fn withdraw(&mut self, address: H160, value: U256) -> Result<(), ExitError>

pub fn deposit(&mut self, address: H160, value: U256)

",0,"fe_compiler_test_utils::StackState"],["
§

impl<'backend, 'config, B> StackState<'config> for MemoryStackState<'backend, 'config, B>
where\n B: Backend,

§

fn metadata(&self) -> &StackSubstateMetadata<'config>

§

fn metadata_mut(&mut self) -> &mut StackSubstateMetadata<'config>

§

fn enter(&mut self, gas_limit: u64, is_static: bool)

§

fn exit_commit(&mut self) -> Result<(), ExitError>

§

fn exit_revert(&mut self) -> Result<(), ExitError>

§

fn exit_discard(&mut self) -> Result<(), ExitError>

§

fn is_empty(&self, address: H160) -> bool

§

fn deleted(&self, address: H160) -> bool

§

fn is_cold(&self, address: H160) -> bool

§

fn is_storage_cold(&self, address: H160, key: H256) -> bool

§

fn inc_nonce(&mut self, address: H160)

§

fn set_storage(&mut self, address: H160, key: H256, value: H256)

§

fn reset_storage(&mut self, address: H160)

§

fn log(&mut self, address: H160, topics: Vec<H256>, data: Vec<u8>)

§

fn set_deleted(&mut self, address: H160)

§

fn set_code(&mut self, address: H160, code: Vec<u8>)

§

fn transfer(&mut self, transfer: Transfer) -> Result<(), ExitError>

§

fn reset_balance(&mut self, address: H160)

§

fn touch(&mut self, address: H160)

","StackState<'config>","fe_compiler_test_utils::StackState"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[19968]} \ No newline at end of file diff --git a/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterBase.js b/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterBase.js new file mode 100644 index 0000000000..3bf04605e4 --- /dev/null +++ b/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterBase.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_mir",[["
Source§

impl<'a, T> Iterator for IterBase<'a, T>
where\n T: Copy,

Source§

type Item = T

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>(\n &mut self,\n) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where\n Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where\n Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where\n Self: Sized,

Creates an iterator starting at the same point, but stepping by\nthe given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where\n Self: Sized,\n Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent\nitems of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where\n Self: Sized,\n G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator\nbetween adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each\nelement. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where\n Self: Sized,\n F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element\nshould be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where\n Self: Sized,

Creates an iterator which gives the current iteration count as well as\nthe next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where\n Self: Sized,

Creates an iterator which can use the peek and peek_mut methods\nto look at the next element of the iterator without consuming it. See\ntheir documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where\n Self: Sized,\n P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where\n Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where\n Self: Sized,

Creates an iterator that yields the first n elements, or fewer\nif the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but\nunlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where\n Self: Sized,\n U: IntoIterator,\n F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where\n Self: Sized,\n Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where\n Self: Sized,\n F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over\nself and returns an iterator over the outputs of f. Like slice::windows(),\nthe windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where\n Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where\n B: FromIterator<Self::Item>,\n Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>(\n &mut self,\n) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where\n Self: Sized,\n Self::Item: Try,\n <Self::Item as Try>::Residual: Residual<B>,\n B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if\na failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where\n E: Extend<Self::Item>,\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate,\nsuch that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

An iterator method that applies a function as long as it returns\nsuccessfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where\n Self: Sized,\n F: FnMut(Self::Item) -> R,\n R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the\niterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation,\nreturning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing\noperation. Read more
Source§

fn try_reduce<R>(\n &mut self,\n f: impl FnMut(Self::Item, Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where\n Self: Sized,\n R: Try<Output = Self::Item>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the\nclosure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns\nthe first non-none result. Read more
Source§

fn try_find<R>(\n &mut self,\n f: impl FnMut(&Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where\n Self: Sized,\n R: Try<Output = bool>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns\nthe first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where\n Self: Sized,\n Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where\n Self: Sized,\n Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the\nspecified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the\nspecified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the\nspecified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the\nspecified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,\n Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where\n T: Copy + 'a,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where\n T: Clone + 'a,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where\n Self: Sized,\n S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where\n Self: Sized,\n P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where\n I: IntoIterator<Item = Self::Item>,\n Self::Item: Ord,\n Self: Sized,

Lexicographically compares the elements of this Iterator with those\nof another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Lexicographically compares the PartialOrd elements of\nthis Iterator with those of another. The comparison works like short-circuit\nevaluation, returning a result without comparing the remaining elements.\nAs soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are equal to those of\nanother. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of\nanother with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are not equal to those of\nanother. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where\n Self: Sized,\n Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> K,\n K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction\nfunction. Read more
","Iterator","fe_mir::ir::inst::BlockIter","fe_mir::ir::inst::ValueIter"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[136579]} \ No newline at end of file diff --git a/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterMutBase.js b/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterMutBase.js new file mode 100644 index 0000000000..0db44dc298 --- /dev/null +++ b/compiler-docs/type.impl/fe_mir/ir/inst/enum.IterMutBase.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_mir",[["
Source§

impl<'a, T> Iterator for IterMutBase<'a, T>

Source§

type Item = &'a mut T

The type of the elements being iterated over.
Source§

fn next(&mut self) -> Option<Self::Item>

Advances the iterator and returns the next value. Read more
Source§

fn next_chunk<const N: usize>(\n &mut self,\n) -> Result<[Self::Item; N], IntoIter<Self::Item, N>>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_next_chunk)
Advances the iterator and returns an array containing the next N values. Read more
1.0.0 · Source§

fn size_hint(&self) -> (usize, Option<usize>)

Returns the bounds on the remaining length of the iterator. Read more
1.0.0 · Source§

fn count(self) -> usize
where\n Self: Sized,

Consumes the iterator, counting the number of iterations and returning it. Read more
1.0.0 · Source§

fn last(self) -> Option<Self::Item>
where\n Self: Sized,

Consumes the iterator, returning the last element. Read more
Source§

fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>

🔬This is a nightly-only experimental API. (iter_advance_by)
Advances the iterator by n elements. Read more
1.0.0 · Source§

fn nth(&mut self, n: usize) -> Option<Self::Item>

Returns the nth element of the iterator. Read more
1.28.0 · Source§

fn step_by(self, step: usize) -> StepBy<Self>
where\n Self: Sized,

Creates an iterator starting at the same point, but stepping by\nthe given amount at each iteration. Read more
1.0.0 · Source§

fn chain<U>(self, other: U) -> Chain<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator<Item = Self::Item>,

Takes two iterators and creates a new iterator over both in sequence. Read more
1.0.0 · Source§

fn zip<U>(self, other: U) -> Zip<Self, <U as IntoIterator>::IntoIter>
where\n Self: Sized,\n U: IntoIterator,

‘Zips up’ two iterators into a single iterator of pairs. Read more
Source§

fn intersperse(self, separator: Self::Item) -> Intersperse<Self>
where\n Self: Sized,\n Self::Item: Clone,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places a copy of separator between adjacent\nitems of the original iterator. Read more
Source§

fn intersperse_with<G>(self, separator: G) -> IntersperseWith<Self, G>
where\n Self: Sized,\n G: FnMut() -> Self::Item,

🔬This is a nightly-only experimental API. (iter_intersperse)
Creates a new iterator which places an item generated by separator\nbetween adjacent items of the original iterator. Read more
1.0.0 · Source§

fn map<B, F>(self, f: F) -> Map<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> B,

Takes a closure and creates an iterator which calls that closure on each\nelement. Read more
1.21.0 · Source§

fn for_each<F>(self, f: F)
where\n Self: Sized,\n F: FnMut(Self::Item),

Calls a closure on each element of an iterator. Read more
1.0.0 · Source§

fn filter<P>(self, predicate: P) -> Filter<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator which uses a closure to determine if an element\nshould be yielded. Read more
1.0.0 · Source§

fn filter_map<B, F>(self, f: F) -> FilterMap<Self, F>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both filters and maps. Read more
1.0.0 · Source§

fn enumerate(self) -> Enumerate<Self>
where\n Self: Sized,

Creates an iterator which gives the current iteration count as well as\nthe next value. Read more
1.0.0 · Source§

fn peekable(self) -> Peekable<Self>
where\n Self: Sized,

Creates an iterator which can use the peek and peek_mut methods\nto look at the next element of the iterator without consuming it. See\ntheir documentation for more information. Read more
1.0.0 · Source§

fn skip_while<P>(self, predicate: P) -> SkipWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that skips elements based on a predicate. Read more
1.0.0 · Source§

fn take_while<P>(self, predicate: P) -> TakeWhile<Self, P>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Creates an iterator that yields elements based on a predicate. Read more
1.57.0 · Source§

fn map_while<B, P>(self, predicate: P) -> MapWhile<Self, P>
where\n Self: Sized,\n P: FnMut(Self::Item) -> Option<B>,

Creates an iterator that both yields elements based on a predicate and maps. Read more
1.0.0 · Source§

fn skip(self, n: usize) -> Skip<Self>
where\n Self: Sized,

Creates an iterator that skips the first n elements. Read more
1.0.0 · Source§

fn take(self, n: usize) -> Take<Self>
where\n Self: Sized,

Creates an iterator that yields the first n elements, or fewer\nif the underlying iterator ends sooner. Read more
1.0.0 · Source§

fn scan<St, B, F>(self, initial_state: St, f: F) -> Scan<Self, St, F>
where\n Self: Sized,\n F: FnMut(&mut St, Self::Item) -> Option<B>,

An iterator adapter which, like fold, holds internal state, but\nunlike fold, produces a new iterator. Read more
1.0.0 · Source§

fn flat_map<U, F>(self, f: F) -> FlatMap<Self, U, F>
where\n Self: Sized,\n U: IntoIterator,\n F: FnMut(Self::Item) -> U,

Creates an iterator that works like map, but flattens nested structure. Read more
1.29.0 · Source§

fn flatten(self) -> Flatten<Self>
where\n Self: Sized,\n Self::Item: IntoIterator,

Creates an iterator that flattens nested structure. Read more
Source§

fn map_windows<F, R, const N: usize>(self, f: F) -> MapWindows<Self, F, N>
where\n Self: Sized,\n F: FnMut(&[Self::Item; N]) -> R,

🔬This is a nightly-only experimental API. (iter_map_windows)
Calls the given function f for each contiguous window of size N over\nself and returns an iterator over the outputs of f. Like slice::windows(),\nthe windows during mapping overlap as well. Read more
1.0.0 · Source§

fn fuse(self) -> Fuse<Self>
where\n Self: Sized,

Creates an iterator which ends after the first None. Read more
1.0.0 · Source§

fn inspect<F>(self, f: F) -> Inspect<Self, F>
where\n Self: Sized,\n F: FnMut(&Self::Item),

Does something with each element of an iterator, passing the value on. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where\n Self: Sized,

Creates a “by reference” adapter for this instance of Iterator. Read more
1.0.0 · Source§

fn collect<B>(self) -> B
where\n B: FromIterator<Self::Item>,\n Self: Sized,

Transforms an iterator into a collection. Read more
Source§

fn try_collect<B>(\n &mut self,\n) -> <<Self::Item as Try>::Residual as Residual<B>>::TryType
where\n Self: Sized,\n Self::Item: Try,\n <Self::Item as Try>::Residual: Residual<B>,\n B: FromIterator<<Self::Item as Try>::Output>,

🔬This is a nightly-only experimental API. (iterator_try_collect)
Fallibly transforms an iterator into a collection, short circuiting if\na failure is encountered. Read more
Source§

fn collect_into<E>(self, collection: &mut E) -> &mut E
where\n E: Extend<Self::Item>,\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_collect_into)
Collects all the items from an iterator into a collection. Read more
1.0.0 · Source§

fn partition<B, F>(self, f: F) -> (B, B)
where\n Self: Sized,\n B: Default + Extend<Self::Item>,\n F: FnMut(&Self::Item) -> bool,

Consumes an iterator, creating two collections from it. Read more
Source§

fn is_partitioned<P>(self, predicate: P) -> bool
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_is_partitioned)
Checks if the elements of this iterator are partitioned according to the given predicate,\nsuch that all those that return true precede all those that return false. Read more
1.27.0 · Source§

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> R,\n R: Try<Output = B>,

An iterator method that applies a function as long as it returns\nsuccessfully, producing a single, final value. Read more
1.27.0 · Source§

fn try_for_each<F, R>(&mut self, f: F) -> R
where\n Self: Sized,\n F: FnMut(Self::Item) -> R,\n R: Try<Output = ()>,

An iterator method that applies a fallible function to each item in the\niterator, stopping at the first error and returning that error. Read more
1.0.0 · Source§

fn fold<B, F>(self, init: B, f: F) -> B
where\n Self: Sized,\n F: FnMut(B, Self::Item) -> B,

Folds every element into an accumulator by applying an operation,\nreturning the final result. Read more
1.51.0 · Source§

fn reduce<F>(self, f: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(Self::Item, Self::Item) -> Self::Item,

Reduces the elements to a single one, by repeatedly applying a reducing\noperation. Read more
Source§

fn try_reduce<R>(\n &mut self,\n f: impl FnMut(Self::Item, Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<<R as Try>::Output>>>::TryType
where\n Self: Sized,\n R: Try<Output = Self::Item>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (iterator_try_reduce)
Reduces the elements to a single one by repeatedly applying a reducing operation. If the\nclosure returns a failure, the failure is propagated back to the caller immediately. Read more
1.0.0 · Source§

fn all<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if every element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn any<F>(&mut self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> bool,

Tests if any element of the iterator matches a predicate. Read more
1.0.0 · Source§

fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
where\n Self: Sized,\n P: FnMut(&Self::Item) -> bool,

Searches for an element of an iterator that satisfies a predicate. Read more
1.30.0 · Source§

fn find_map<B, F>(&mut self, f: F) -> Option<B>
where\n Self: Sized,\n F: FnMut(Self::Item) -> Option<B>,

Applies function to the elements of iterator and returns\nthe first non-none result. Read more
Source§

fn try_find<R>(\n &mut self,\n f: impl FnMut(&Self::Item) -> R,\n) -> <<R as Try>::Residual as Residual<Option<Self::Item>>>::TryType
where\n Self: Sized,\n R: Try<Output = bool>,\n <R as Try>::Residual: Residual<Option<Self::Item>>,

🔬This is a nightly-only experimental API. (try_find)
Applies function to the elements of iterator and returns\nthe first true result or the first error. Read more
1.0.0 · Source§

fn position<P>(&mut self, predicate: P) -> Option<usize>
where\n Self: Sized,\n P: FnMut(Self::Item) -> bool,

Searches for an element in an iterator, returning its index. Read more
1.0.0 · Source§

fn max(self) -> Option<Self::Item>
where\n Self: Sized,\n Self::Item: Ord,

Returns the maximum element of an iterator. Read more
1.0.0 · Source§

fn min(self) -> Option<Self::Item>
where\n Self: Sized,\n Self::Item: Ord,

Returns the minimum element of an iterator. Read more
1.6.0 · Source§

fn max_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the maximum value from the\nspecified function. Read more
1.15.0 · Source§

fn max_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the maximum value with respect to the\nspecified comparison function. Read more
1.6.0 · Source§

fn min_by_key<B, F>(self, f: F) -> Option<Self::Item>
where\n B: Ord,\n Self: Sized,\n F: FnMut(&Self::Item) -> B,

Returns the element that gives the minimum value from the\nspecified function. Read more
1.15.0 · Source§

fn min_by<F>(self, compare: F) -> Option<Self::Item>
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> Ordering,

Returns the element that gives the minimum value with respect to the\nspecified comparison function. Read more
1.0.0 · Source§

fn unzip<A, B, FromA, FromB>(self) -> (FromA, FromB)
where\n FromA: Default + Extend<A>,\n FromB: Default + Extend<B>,\n Self: Sized + Iterator<Item = (A, B)>,

Converts an iterator of pairs into a pair of containers. Read more
1.36.0 · Source§

fn copied<'a, T>(self) -> Copied<Self>
where\n T: Copy + 'a,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which copies all of its elements. Read more
1.0.0 · Source§

fn cloned<'a, T>(self) -> Cloned<Self>
where\n T: Clone + 'a,\n Self: Sized + Iterator<Item = &'a T>,

Creates an iterator which clones all of its elements. Read more
Source§

fn array_chunks<const N: usize>(self) -> ArrayChunks<Self, N>
where\n Self: Sized,

🔬This is a nightly-only experimental API. (iter_array_chunks)
Returns an iterator over N elements of the iterator at a time. Read more
1.11.0 · Source§

fn sum<S>(self) -> S
where\n Self: Sized,\n S: Sum<Self::Item>,

Sums the elements of an iterator. Read more
1.11.0 · Source§

fn product<P>(self) -> P
where\n Self: Sized,\n P: Product<Self::Item>,

Iterates over the entire iterator, multiplying all the elements Read more
1.5.0 · Source§

fn cmp<I>(self, other: I) -> Ordering
where\n I: IntoIterator<Item = Self::Item>,\n Self::Item: Ord,\n Self: Sized,

Lexicographically compares the elements of this Iterator with those\nof another. Read more
Source§

fn cmp_by<I, F>(self, other: I, cmp: F) -> Ordering
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Ordering,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn partial_cmp<I>(self, other: I) -> Option<Ordering>
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Lexicographically compares the PartialOrd elements of\nthis Iterator with those of another. The comparison works like short-circuit\nevaluation, returning a result without comparing the remaining elements.\nAs soon as an order can be determined, the evaluation stops and a result is returned. Read more
Source§

fn partial_cmp_by<I, F>(self, other: I, partial_cmp: F) -> Option<Ordering>
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> Option<Ordering>,

🔬This is a nightly-only experimental API. (iter_order_by)
Lexicographically compares the elements of this Iterator with those\nof another with respect to the specified comparison function. Read more
1.5.0 · Source§

fn eq<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are equal to those of\nanother. Read more
Source§

fn eq_by<I, F>(self, other: I, eq: F) -> bool
where\n Self: Sized,\n I: IntoIterator,\n F: FnMut(Self::Item, <I as IntoIterator>::Item) -> bool,

🔬This is a nightly-only experimental API. (iter_order_by)
Determines if the elements of this Iterator are equal to those of\nanother with respect to the specified equality function. Read more
1.5.0 · Source§

fn ne<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialEq<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are not equal to those of\nanother. Read more
1.5.0 · Source§

fn lt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless than those of another. Read more
1.5.0 · Source§

fn le<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\nless or equal to those of another. Read more
1.5.0 · Source§

fn gt<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than those of another. Read more
1.5.0 · Source§

fn ge<I>(self, other: I) -> bool
where\n I: IntoIterator,\n Self::Item: PartialOrd<<I as IntoIterator>::Item>,\n Self: Sized,

Determines if the elements of this Iterator are lexicographically\ngreater than or equal to those of another. Read more
1.82.0 · Source§

fn is_sorted(self) -> bool
where\n Self: Sized,\n Self::Item: PartialOrd,

Checks if the elements of this iterator are sorted. Read more
1.82.0 · Source§

fn is_sorted_by<F>(self, compare: F) -> bool
where\n Self: Sized,\n F: FnMut(&Self::Item, &Self::Item) -> bool,

Checks if the elements of this iterator are sorted using the given comparator function. Read more
1.82.0 · Source§

fn is_sorted_by_key<F, K>(self, f: F) -> bool
where\n Self: Sized,\n F: FnMut(Self::Item) -> K,\n K: PartialOrd,

Checks if the elements of this iterator are sorted using the given key extraction\nfunction. Read more
","Iterator","fe_mir::ir::inst::ValueIterMut"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[136503]} \ No newline at end of file diff --git a/compiler-docs/type.impl/id_arena/struct.Id.js b/compiler-docs/type.impl/id_arena/struct.Id.js new file mode 100644 index 0000000000..34a903bd96 --- /dev/null +++ b/compiler-docs/type.impl/id_arena/struct.Id.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_mir",[["
§

impl<T> Clone for Id<T>

§

fn clone(&self) -> Id<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
","Clone","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Debug for Id<T>

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
","Debug","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Hash for Id<T>

§

fn hash<H>(&self, h: &mut H)
where\n H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where\n H: Hasher,\n Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
","Hash","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Id<T>

pub fn index(&self) -> usize

Get the index within the arena that this id refers to.

\n
",0,"fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Ord for Id<T>

§

fn cmp(&self, rhs: &Id<T>) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where\n Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where\n Self: Sized,

Restrict a value to a certain interval. Read more
","Ord","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> PartialEq for Id<T>

§

fn eq(&self, rhs: &Id<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient,\nand should not be overridden without very good reason.
","PartialEq","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> PartialOrd for Id<T>

§

fn partial_cmp(&self, rhs: &Id<T>) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the\n<= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the >\noperator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by\nthe >= operator. Read more
","PartialOrd","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Copy for Id<T>

","Copy","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"],["
§

impl<T> Eq for Id<T>

","Eq","fe_mir::analysis::loop_tree::LoopId","fe_mir::ir::basic_block::BasicBlockId","fe_mir::ir::inst::InstId","fe_mir::ir::value::ValueId"]]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[19913]} \ No newline at end of file diff --git a/compiler-docs/type.impl/petgraph/graphmap/type.DiGraphMap.js b/compiler-docs/type.impl/petgraph/graphmap/type.DiGraphMap.js new file mode 100644 index 0000000000..52ccb596fe --- /dev/null +++ b/compiler-docs/type.impl/petgraph/graphmap/type.DiGraphMap.js @@ -0,0 +1,9 @@ +(function() { + var type_impls = Object.fromEntries([["fe_analyzer",[]]]); + if (window.register_type_impls) { + window.register_type_impls(type_impls); + } else { + window.pending_type_impls = type_impls; + } +})() +//{"start":55,"fragment_lengths":[18]} \ No newline at end of file diff --git a/crates/bench/Cargo.toml b/crates/bench/Cargo.toml deleted file mode 100644 index c3a4d25c59..0000000000 --- a/crates/bench/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "fe-bench" -version = "26.0.0-alpha.7" -edition.workspace = true - -[dev-dependencies] -criterion = "0.5" -walkdir = "2.4" - -[dependencies] -driver.workspace = true -parser.workspace = true -common.workspace = true -camino.workspace = true -url.workspace = true -tracing.workspace = true - -[[bench]] -name = "analysis" -harness = false diff --git a/crates/bench/benches/analysis.rs b/crates/bench/benches/analysis.rs deleted file mode 100644 index 4fddc91b53..0000000000 --- a/crates/bench/benches/analysis.rs +++ /dev/null @@ -1,88 +0,0 @@ -use camino::{Utf8Path, Utf8PathBuf}; -use common::{ - InputDb, - stdlib::{HasBuiltinCore, HasBuiltinStd}, -}; -use criterion::{Criterion, SamplingMode, criterion_group, criterion_main}; -use driver::DriverDataBase; -use url::Url; -use walkdir::WalkDir; - -use parser::parse_source_file; - -fn diagnostics(c: &mut Criterion) { - let mut g = c.benchmark_group("analysis"); - g.sampling_mode(SamplingMode::Flat); - - g.bench_function("analyze corelib", |b| { - b.iter_with_large_drop(|| { - let db = DriverDataBase::default(); - let core = db.builtin_core(); - db.run_on_ingot(core); - db - }); - }); - - g.bench_function("analyze stdlib", |b| { - b.iter_with_large_drop(|| { - let db = DriverDataBase::default(); - let std_ingot = db.builtin_std(); - db.run_on_ingot(std_ingot); - db - }); - }); - - let files = test_files("../uitest/fixtures/".into()); - - g.bench_function("uitest parsing", |b| { - b.iter(|| { - for (_, content) in &files { - parse_source_file(content); - } - }) - }); - - g.bench_function("uitest diagnostics", |b| { - b.iter_with_large_drop(|| { - let mut db = DriverDataBase::default(); - for (path, content) in &files { - let ingot = db - .workspace() - .touch( - &mut db, - Url::from_file_path(path).unwrap(), - Some(content.clone()), - ) - .containing_ingot(&db) - .expect("standalone ingot should exist"); - let file = ingot.root_file(&db).expect("root file should exist"); - let top_mod = db.top_mod(file); - - db.run_on_top_mod(top_mod); - } - db - }); - }); - - g.finish(); -} - -fn test_files(path: &Utf8Path) -> Vec<(Utf8PathBuf, String)> { - let manifest_dir = env!("CARGO_MANIFEST_DIR"); - - let test_dir = Utf8Path::new(manifest_dir).join(path); - - WalkDir::new(test_dir) - .into_iter() - .filter_map(|e| e.ok()) - .filter(|e| e.path().extension().is_some_and(|ext| ext == "fe")) - .map(|e| { - let path = Utf8PathBuf::from_path_buf(e.into_path()).unwrap(); - let content = std::fs::read_to_string(&path).unwrap(); - (path, content) - }) - .collect() -} - -criterion_group!(benches, diagnostics); -criterion_main!(benches); diff --git a/crates/bench/src/main.rs b/crates/bench/src/main.rs deleted file mode 100644 index 933fe4285e..0000000000 --- a/crates/bench/src/main.rs +++ /dev/null @@ -1,5 +0,0 @@ -use tracing::error; - -fn main() { - error!("run `cargo bench`"); -} diff --git a/crates/codegen/Cargo.toml b/crates/codegen/Cargo.toml deleted file mode 100644 index 580ae627b4..0000000000 --- a/crates/codegen/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "fe-codegen" -version = "26.0.0-alpha.7" -edition.workspace = true - -[dependencies] -driver = { path = "../driver", package = "fe-driver" } -mir = { path = "../mir", package = "fe-mir" } -hir.workspace = true -common.workspace = true -hex = "0.4" -num-bigint.workspace = true -rustc-hash.workspace = true -sonatina-ir.workspace = true -sonatina-triple.workspace = true -sonatina-codegen.workspace = true -sonatina-verifier.workspace = true -smallvec1.workspace = true -tracing.workspace = true - -[dev-dependencies] -dir-test.workspace = true -test-utils.workspace = true -url.workspace = true -hir = { workspace = true, features = ["testutils"] } diff --git a/crates/codegen/build.rs b/crates/codegen/build.rs deleted file mode 100644 index 648995ee97..0000000000 --- a/crates/codegen/build.rs +++ /dev/null @@ -1,23 +0,0 @@ -use std::path::Path; - -fn main() { - // Ensure fixture edits rerun codegen tests by explicitly watching each file. - watch_dir_recursively(Path::new("tests/fixtures")); -} - -fn watch_dir_recursively(dir: &Path) { - let Ok(entries) = std::fs::read_dir(dir) else { - return; - }; - - for entry in entries.flatten() { - let path = entry.path(); - if path.is_dir() { - watch_dir_recursively(&path); - continue; - } - if let Some(path_str) = path.to_str() { - println!("cargo:rerun-if-changed={path_str}"); - } - } -} diff --git a/crates/codegen/src/backend.rs b/crates/codegen/src/backend.rs deleted file mode 100644 index be24468558..0000000000 --- a/crates/codegen/src/backend.rs +++ /dev/null @@ -1,362 +0,0 @@ -//! Backend abstraction for multi-target code generation. -//! -//! This module defines the [`Backend`] trait that all code generation backends implement. -//! Fe supports multiple backends: -//! - [`YulBackend`]: Emits Yul text for compilation via solc (default) -//! - [`SonatinaBackend`]: Direct EVM bytecode generation via Sonatina IR (WIP) - -use driver::DriverDataBase; -use hir::hir_def::TopLevelMod; -use mir::layout::TargetDataLayout; -use std::fmt; - -/// Optimization level for code generation. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] -pub enum OptLevel { - /// No optimization — maximum debuggability. - O0, - /// Balanced optimization (default). - #[default] - O1, - /// Aggressive optimization. - O2, -} - -impl std::str::FromStr for OptLevel { - type Err = String; - - fn from_str(s: &str) -> Result { - match s { - "0" => Ok(OptLevel::O0), - "1" => Ok(OptLevel::O1), - "2" => Ok(OptLevel::O2), - _ => Err(format!( - "unknown optimization level: {s} (expected '0', '1', or '2')" - )), - } - } -} - -impl OptLevel { - /// Whether the solc Yul optimizer should be enabled for this level. - pub fn yul_optimize(&self) -> bool { - !matches!(self, OptLevel::O0) - } -} - -impl fmt::Display for OptLevel { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - OptLevel::O0 => write!(f, "0"), - OptLevel::O1 => write!(f, "1"), - OptLevel::O2 => write!(f, "2"), - } - } -} - -/// Output produced by a backend compilation. -#[derive(Debug, Clone)] -pub enum BackendOutput { - /// Yul text output (to be compiled by solc). - Yul { source: String, solc_optimize: bool }, - /// Raw EVM bytecode. - Bytecode(Vec), -} - -impl BackendOutput { - /// Returns the Yul text if this is a Yul output. - pub fn as_yul(&self) -> Option<&str> { - match self { - BackendOutput::Yul { source, .. } => Some(source), - _ => None, - } - } - - /// Returns whether the solc optimizer should be enabled for this Yul output. - pub fn yul_solc_optimize(&self) -> Option { - match self { - BackendOutput::Yul { solc_optimize, .. } => Some(*solc_optimize), - _ => None, - } - } - - /// Returns the bytecode if this is a Bytecode output. - pub fn as_bytecode(&self) -> Option<&[u8]> { - match self { - BackendOutput::Bytecode(b) => Some(b), - _ => None, - } - } - - /// Consumes self and returns the Yul text if this is a Yul output. - pub fn into_yul(self) -> Option { - match self { - BackendOutput::Yul { source, .. } => Some(source), - _ => None, - } - } - - /// Consumes self and returns the bytecode if this is a Bytecode output. - pub fn into_bytecode(self) -> Option> { - match self { - BackendOutput::Bytecode(b) => Some(b), - _ => None, - } - } -} - -/// Error type for backend compilation failures. -#[derive(Debug)] -pub enum BackendError { - /// MIR lowering failed. - MirLower(mir::MirLowerError), - /// Yul emission failed. - Yul(crate::yul::YulError), - /// Sonatina compilation failed. - Sonatina(String), -} - -impl fmt::Display for BackendError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - BackendError::MirLower(err) => write!(f, "{err}"), - BackendError::Yul(err) => write!(f, "{err}"), - BackendError::Sonatina(msg) => write!(f, "sonatina error: {msg}"), - } - } -} - -impl std::error::Error for BackendError {} - -impl From for BackendError { - fn from(err: mir::MirLowerError) -> Self { - BackendError::MirLower(err) - } -} - -impl From for BackendError { - fn from(err: crate::yul::YulError) -> Self { - BackendError::Yul(err) - } -} - -impl From for BackendError { - fn from(err: crate::EmitModuleError) -> Self { - match err { - crate::EmitModuleError::MirLower(e) => BackendError::MirLower(e), - crate::EmitModuleError::Yul(e) => BackendError::Yul(e), - } - } -} - -/// A code generation backend that transforms HIR modules to target output. -/// -/// Backends are responsible for: -/// 1. Lowering the HIR module to MIR -/// 2. Translating MIR to target-specific IR (if any) -/// 3. Producing the final output (Yul text or bytecode) -pub trait Backend { - /// Returns the human-readable name of this backend. - fn name(&self) -> &'static str; - - /// Compiles a top-level module to backend output. - /// - /// # Arguments - /// * `db` - Driver database for compiler queries - /// * `top_mod` - The HIR module to compile - /// * `layout` - Target data layout for type sizing - /// * `opt_level` - Optimization level for code generation - /// - /// # Returns - /// The compiled output or an error. - fn compile( - &self, - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - layout: TargetDataLayout, - opt_level: OptLevel, - ) -> Result; -} - -/// Available backend implementations. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] -pub enum BackendKind { - /// Yul backend (emits Yul text for solc). - Yul, - /// Sonatina backend (direct EVM bytecode generation). - #[default] - Sonatina, -} - -impl BackendKind { - /// Returns the name of this backend kind. - pub fn name(&self) -> &'static str { - match self { - BackendKind::Yul => "yul", - BackendKind::Sonatina => "sonatina", - } - } - - /// Creates a boxed backend instance for this kind. - pub fn create(&self) -> Box { - match self { - BackendKind::Yul => Box::new(YulBackend), - BackendKind::Sonatina => Box::new(SonatinaBackend), - } - } -} - -impl std::str::FromStr for BackendKind { - type Err = String; - - fn from_str(s: &str) -> Result { - match s.to_lowercase().as_str() { - "yul" => Ok(BackendKind::Yul), - "sonatina" => Ok(BackendKind::Sonatina), - _ => Err(format!( - "unknown backend: {s} (expected 'yul' or 'sonatina')" - )), - } - } -} - -/// Yul backend implementation. -/// -/// This wraps the existing Yul emitter to implement the [`Backend`] trait. -/// Output is Yul text that can be compiled by solc. -#[derive(Debug, Clone, Copy, Default)] -pub struct YulBackend; - -impl Backend for YulBackend { - fn name(&self) -> &'static str { - "yul" - } - - fn compile( - &self, - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - layout: TargetDataLayout, - opt_level: OptLevel, - ) -> Result { - let yul = crate::emit_module_yul_with_layout(db, top_mod, layout)?; - Ok(BackendOutput::Yul { - source: yul, - solc_optimize: opt_level.yul_optimize(), - }) - } -} - -/// Sonatina backend implementation. -/// -/// This backend produces EVM bytecode directly via Sonatina IR, -/// bypassing the need for solc. -#[derive(Debug, Clone, Copy, Default)] -pub struct SonatinaBackend; - -impl Backend for SonatinaBackend { - fn name(&self) -> &'static str { - "sonatina" - } - - fn compile( - &self, - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - layout: TargetDataLayout, - opt_level: OptLevel, - ) -> Result { - use sonatina_codegen::isa::evm::EvmBackend; - use sonatina_codegen::object::{CompileOptions, compile_object}; - use sonatina_ir::object::{Directive, SectionRef}; - - // Lower to Sonatina IR - let mut module = crate::sonatina::compile_module(db, top_mod, layout)?; - crate::sonatina::ensure_module_sonatina_ir_valid(&module)?; - - // Run the optimization pipeline based on opt_level. - match opt_level { - OptLevel::O0 => { /* no optimization */ } - OptLevel::O1 => sonatina_codegen::optim::Pipeline::balanced().run(&mut module), - OptLevel::O2 => sonatina_codegen::optim::Pipeline::aggressive().run(&mut module), - } - if opt_level != OptLevel::O0 { - crate::sonatina::ensure_module_sonatina_ir_valid(&module)?; - } - - // Check if there are any objects to compile - if module.objects.is_empty() { - return Err(BackendError::Sonatina( - "no objects to compile (module has no functions?)".to_string(), - )); - } - - // Create the EVM backend for codegen - let isa = crate::sonatina::create_evm_isa(); - let evm_backend = EvmBackend::new(isa); - - // Find root objects (not referenced by any other object's Embed directives). - let mut referenced_objects = std::collections::BTreeSet::new(); - for object in module.objects.values() { - for section in &object.sections { - for directive in §ion.directives { - let Directive::Embed(embed) = directive else { - continue; - }; - let SectionRef::External { object, .. } = &embed.source else { - continue; - }; - referenced_objects.insert(object.0.as_str().to_string()); - } - } - } - - let mut roots: Vec = module - .objects - .keys() - .filter(|name| !referenced_objects.contains(*name)) - .cloned() - .collect(); - roots.sort(); - - if roots.is_empty() { - return Err(BackendError::Sonatina( - "failed to select root object (all objects are referenced)".to_string(), - )); - } - - // Pick the primary root for output: prefer "Contract", otherwise first root. - let object_name = if roots.iter().any(|n| n == "Contract") { - "Contract".to_string() - } else { - roots[0].clone() - }; - - // Compile all root objects so codegen errors in any root are caught. - let opts: CompileOptions<_> = CompileOptions::default(); - let mut primary_artifact = None; - for root in &roots { - let artifact = - compile_object(&module, &evm_backend, root, &opts).map_err(|errors| { - let msg = errors - .iter() - .map(|e| format!("{:?}", e)) - .collect::>() - .join("; "); - BackendError::Sonatina(msg) - })?; - if *root == object_name { - primary_artifact = Some(artifact); - } - } - let artifact = primary_artifact.expect("primary root was in roots list"); - - // Extract bytecode from the runtime section - let section_name = sonatina_ir::object::SectionName::from("runtime"); - let runtime_section = artifact.sections.get(§ion_name).ok_or_else(|| { - BackendError::Sonatina("compiled object has no runtime section".to_string()) - })?; - - Ok(BackendOutput::Bytecode(runtime_section.bytes.clone())) - } -} diff --git a/crates/codegen/src/lib.rs b/crates/codegen/src/lib.rs deleted file mode 100644 index 9027ca7a31..0000000000 --- a/crates/codegen/src/lib.rs +++ /dev/null @@ -1,18 +0,0 @@ -mod backend; -mod sonatina; -mod yul; - -pub use backend::{ - Backend, BackendError, BackendKind, BackendOutput, OptLevel, SonatinaBackend, YulBackend, -}; -pub use sonatina::{ - DebugOutputSink, LowerError, SonatinaContractBytecode, SonatinaTestDebugConfig, - emit_ingot_sonatina_bytecode, emit_mir_module_sonatina_ir_optimized, - emit_module_sonatina_bytecode, emit_module_sonatina_ir, emit_module_sonatina_ir_optimized, - emit_test_module_sonatina, validate_module_sonatina_ir, -}; -pub use yul::{ - EmitModuleError, ExpectedRevert, TestMetadata, TestModuleOutput, YulError, emit_ingot_yul, - emit_ingot_yul_with_layout, emit_module_yul, emit_module_yul_with_layout, emit_test_module_yul, - emit_test_module_yul_with_layout, -}; diff --git a/crates/codegen/src/sonatina/lower.rs b/crates/codegen/src/sonatina/lower.rs deleted file mode 100644 index 31e27f6f19..0000000000 --- a/crates/codegen/src/sonatina/lower.rs +++ /dev/null @@ -1,2215 +0,0 @@ -//! Instruction-level lowering from MIR to Sonatina IR. -//! -//! Contains all `lower_*` free functions that operate on `LowerCtx`. - -use driver::DriverDataBase; -use hir::analysis::ty::adt_def::AdtRef; -use hir::analysis::ty::ty_def::{PrimTy, TyBase, TyData}; -use hir::hir_def::expr::{ArithBinOp, BinOp, CompBinOp, LogicalBinOp, UnOp}; -use hir::projection::{IndexSource, Projection}; -use mir::ir::{AddressSpaceKind, IntrinsicOp, Place, SyntheticValue}; -use mir::layout; -use mir::layout::TargetDataLayout; -use num_bigint::BigUint; -use rustc_hash::FxHashMap; -use smallvec1::SmallVec; -use sonatina_ir::{ - BlockId, GlobalVariableData, I256, Immediate, Linkage, Type, ValueId, - global_variable::GvInitializer, - inst::{ - arith::{Add, Mul, Neg, Shl, Shr, Sub}, - cast::{IntToPtr, PtrToInt, Sext, Trunc, Zext}, - cmp::{Eq, Gt, IsZero, Lt, Ne}, - control_flow::{Br, Call, Jump, Return}, - data::{Gep, Mload, Mstore, SymAddr, SymSize, SymbolRef}, - evm::{ - EvmAddMod, EvmAddress, EvmBaseFee, EvmBlockHash, EvmCall, EvmCallValue, - EvmCalldataCopy, EvmCalldataLoad, EvmCalldataSize, EvmCaller, EvmChainId, EvmCodeCopy, - EvmCodeSize, EvmCoinBase, EvmCreate, EvmCreate2, EvmDelegateCall, EvmExp, EvmGas, - EvmGasLimit, EvmInvalid, EvmKeccak256, EvmLog0, EvmLog1, EvmLog2, EvmLog3, EvmLog4, - EvmMalloc, EvmMsize, EvmMstore8, EvmMulMod, EvmNumber, EvmOrigin, EvmPrevRandao, - EvmReturn, EvmReturnDataCopy, EvmReturnDataSize, EvmRevert, EvmSelfBalance, - EvmSelfDestruct, EvmSload, EvmSstore, EvmStaticCall, EvmStop, EvmTimestamp, EvmTload, - EvmTstore, EvmUdiv, EvmUmod, - }, - logic::{And, Not, Or, Xor}, - }, - module::FuncRef, - object::EmbedSymbol, -}; - -use super::{LowerCtx, LowerError, is_erased_runtime_ty, types}; - -/// Lower a MIR instruction. -pub(super) fn lower_instruction<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - inst: &mir::MirInst<'db>, -) -> Result<(), LowerError> { - use mir::MirInst; - - match inst { - MirInst::Assign { dest, rvalue, .. } => { - if let mir::Rvalue::Alloc { address_space } = rvalue { - let Some(dest_local) = dest else { - return Err(LowerError::Internal( - "alloc rvalue without destination local".to_string(), - )); - }; - let value = lower_alloc(ctx, *dest_local, *address_space)?; - let dest_var = ctx.local_vars.get(dest_local).copied().ok_or_else(|| { - LowerError::Internal(format!("missing SSA variable for local {dest_local:?}")) - })?; - ctx.fb.def_var(dest_var, value); - return Ok(()); - } - - if let mir::Rvalue::ConstAggregate { data, .. } = rvalue { - let Some(dest_local) = dest else { - return Err(LowerError::Internal( - "ConstAggregate without destination local".to_string(), - )); - }; - let value = lower_const_aggregate(ctx, data)?; - let dest_var = ctx.local_vars.get(dest_local).copied().ok_or_else(|| { - LowerError::Internal(format!("missing SSA variable for local {dest_local:?}")) - })?; - ctx.fb.def_var(dest_var, value); - return Ok(()); - } - - let result = lower_rvalue(ctx, rvalue)?; - if let (Some(dest_local), Some(result_val)) = (dest, result) { - let dest_var = ctx.local_vars.get(dest_local).copied().ok_or_else(|| { - LowerError::Internal(format!("missing SSA variable for local {dest_local:?}")) - })?; - // Apply from_word conversion for Load operations - let converted = if matches!(rvalue, mir::Rvalue::Load { .. }) { - let dest_ty = ctx - .body - .locals - .get(dest_local.index()) - .map(|l| l.ty) - .ok_or_else(|| { - LowerError::Internal(format!("missing local type for {dest_local:?}")) - })?; - apply_from_word(ctx.fb, ctx.db, result_val, dest_ty, ctx.is) - } else { - result_val - }; - ctx.fb.def_var(dest_var, converted); - } - } - MirInst::Store { place, value, .. } => { - lower_store_inst(ctx, place, *value)?; - } - MirInst::InitAggregate { place, inits, .. } => { - for (path, value) in inits { - let mut target = place.clone(); - for proj in path.iter() { - target.projection.push(proj.clone()); - } - lower_store_inst(ctx, &target, *value)?; - } - } - MirInst::SetDiscriminant { place, variant, .. } => { - let val = ctx.fb.make_imm_value(I256::from(variant.idx as u64)); - store_word_to_place(ctx, place, val)?; - } - MirInst::BindValue { value, .. } => { - // Ensure the value is lowered and cached - let _ = lower_value(ctx, *value)?; - } - } - - Ok(()) -} - -/// Lower a MIR rvalue to a Sonatina value. -fn lower_rvalue<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - rvalue: &mir::Rvalue<'db>, -) -> Result, LowerError> { - use mir::Rvalue; - - match rvalue { - Rvalue::ZeroInit => { - // Create a zero constant - let zero = ctx.fb.make_imm_value(I256::zero()); - Ok(Some(zero)) - } - Rvalue::Value(value_id) => { - let val = lower_value(ctx, *value_id)?; - Ok(Some(val)) - } - Rvalue::Call(call) => { - // Get the callee function reference - let callee_name = call.resolved_name.as_ref().ok_or_else(|| { - LowerError::Unsupported("call without resolved symbol name".to_string()) - })?; - - if call.effect_args.is_empty() { - // `std::evm::ops` externs (Yul builtins). - // - // These are declared in Fe as `extern`, so they do not have MIR bodies. The Yul - // backend emits them as builtins; the Sonatina backend must lower them directly. - match callee_name.as_str() { - // Logs - "log0" | "log1" | "log2" | "log3" | "log4" => { - let mut args = Vec::with_capacity(call.args.len()); - for &arg in &call.args { - args.push(lower_value(ctx, arg)?); - } - match (callee_name.as_str(), args.as_slice()) { - ("log0", [offset, len]) => { - ctx.fb - .insert_inst_no_result(EvmLog0::new(ctx.is, *offset, *len)); - return Ok(None); - } - ("log1", [offset, len, topic0]) => { - ctx.fb.insert_inst_no_result(EvmLog1::new( - ctx.is, *offset, *len, *topic0, - )); - return Ok(None); - } - ("log2", [offset, len, topic0, topic1]) => { - ctx.fb.insert_inst_no_result(EvmLog2::new( - ctx.is, *offset, *len, *topic0, *topic1, - )); - return Ok(None); - } - ("log3", [offset, len, topic0, topic1, topic2]) => { - ctx.fb.insert_inst_no_result(EvmLog3::new( - ctx.is, *offset, *len, *topic0, *topic1, *topic2, - )); - return Ok(None); - } - ("log4", [offset, len, topic0, topic1, topic2, topic3]) => { - ctx.fb.insert_inst_no_result(EvmLog4::new( - ctx.is, *offset, *len, *topic0, *topic1, *topic2, *topic3, - )); - return Ok(None); - } - _ => { - return Err(LowerError::Internal(format!( - "{callee_name} expects {} args, got {}", - match callee_name.as_str() { - "log0" => 2, - "log1" => 3, - "log2" => 4, - "log3" => 5, - "log4" => 6, - _ => unreachable!(), - }, - args.len() - ))); - } - } - } - - // Environment - "address" => { - return Ok(Some( - ctx.fb.insert_inst(EvmAddress::new(ctx.is), Type::I256), - )); - } - "callvalue" => { - return Ok(Some( - ctx.fb.insert_inst(EvmCallValue::new(ctx.is), Type::I256), - )); - } - "origin" => { - return Ok(Some(ctx.fb.insert_inst(EvmOrigin::new(ctx.is), Type::I256))); - } - "gasprice" => { - return Err(LowerError::Unsupported( - "gasprice is not supported by the Sonatina backend".to_string(), - )); - } - "coinbase" => { - return Ok(Some( - ctx.fb.insert_inst(EvmCoinBase::new(ctx.is), Type::I256), - )); - } - "timestamp" => { - return Ok(Some( - ctx.fb.insert_inst(EvmTimestamp::new(ctx.is), Type::I256), - )); - } - "number" => { - return Ok(Some(ctx.fb.insert_inst(EvmNumber::new(ctx.is), Type::I256))); - } - "prevrandao" => { - return Ok(Some( - ctx.fb.insert_inst(EvmPrevRandao::new(ctx.is), Type::I256), - )); - } - "gaslimit" => { - return Ok(Some( - ctx.fb.insert_inst(EvmGasLimit::new(ctx.is), Type::I256), - )); - } - "chainid" => { - return Ok(Some( - ctx.fb.insert_inst(EvmChainId::new(ctx.is), Type::I256), - )); - } - "basefee" => { - return Ok(Some( - ctx.fb.insert_inst(EvmBaseFee::new(ctx.is), Type::I256), - )); - } - "selfbalance" => { - return Ok(Some( - ctx.fb.insert_inst(EvmSelfBalance::new(ctx.is), Type::I256), - )); - } - "blockhash" => { - let [block] = call.args.as_slice() else { - return Err(LowerError::Internal( - "blockhash requires 1 argument".to_string(), - )); - }; - let block = lower_value(ctx, *block)?; - return Ok(Some( - ctx.fb - .insert_inst(EvmBlockHash::new(ctx.is, block), Type::I256), - )); - } - "gas" => return Ok(Some(ctx.fb.insert_inst(EvmGas::new(ctx.is), Type::I256))), - - // Memory size - "msize" => { - return Ok(Some(ctx.fb.insert_inst(EvmMsize::new(ctx.is), Type::I256))); - } - - // Calls / create - "create" => { - let [val, offset, len] = call.args.as_slice() else { - return Err(LowerError::Internal( - "create requires 3 arguments".to_string(), - )); - }; - let val = lower_value(ctx, *val)?; - let offset = lower_value(ctx, *offset)?; - let len = lower_value(ctx, *len)?; - return Ok(Some(ctx.fb.insert_inst( - EvmCreate::new(ctx.is, val, offset, len), - Type::I256, - ))); - } - "create2" => { - let [val, offset, len, salt] = call.args.as_slice() else { - return Err(LowerError::Internal( - "create2 requires 4 arguments".to_string(), - )); - }; - let val = lower_value(ctx, *val)?; - let offset = lower_value(ctx, *offset)?; - let len = lower_value(ctx, *len)?; - let salt = lower_value(ctx, *salt)?; - return Ok(Some(ctx.fb.insert_inst( - EvmCreate2::new(ctx.is, val, offset, len, salt), - Type::I256, - ))); - } - "call" => { - let [gas, addr, val, arg_offset, arg_len, ret_offset, ret_len] = - call.args.as_slice() - else { - return Err(LowerError::Internal( - "call requires 7 arguments".to_string(), - )); - }; - let gas = lower_value(ctx, *gas)?; - let addr = lower_value(ctx, *addr)?; - let val = lower_value(ctx, *val)?; - let arg_offset = lower_value(ctx, *arg_offset)?; - let arg_len = lower_value(ctx, *arg_len)?; - let ret_offset = lower_value(ctx, *ret_offset)?; - let ret_len = lower_value(ctx, *ret_len)?; - return Ok(Some(ctx.fb.insert_inst( - EvmCall::new( - ctx.is, gas, addr, val, arg_offset, arg_len, ret_offset, ret_len, - ), - Type::I256, - ))); - } - "staticcall" => { - let [gas, addr, arg_offset, arg_len, ret_offset, ret_len] = - call.args.as_slice() - else { - return Err(LowerError::Internal( - "staticcall requires 6 arguments".to_string(), - )); - }; - let gas = lower_value(ctx, *gas)?; - let addr = lower_value(ctx, *addr)?; - let arg_offset = lower_value(ctx, *arg_offset)?; - let arg_len = lower_value(ctx, *arg_len)?; - let ret_offset = lower_value(ctx, *ret_offset)?; - let ret_len = lower_value(ctx, *ret_len)?; - return Ok(Some(ctx.fb.insert_inst( - EvmStaticCall::new( - ctx.is, gas, addr, arg_offset, arg_len, ret_offset, ret_len, - ), - Type::I256, - ))); - } - "delegatecall" => { - let [gas, addr, arg_offset, arg_len, ret_offset, ret_len] = - call.args.as_slice() - else { - return Err(LowerError::Internal( - "delegatecall requires 6 arguments".to_string(), - )); - }; - let gas = lower_value(ctx, *gas)?; - let addr = lower_value(ctx, *addr)?; - let arg_offset = lower_value(ctx, *arg_offset)?; - let arg_len = lower_value(ctx, *arg_len)?; - let ret_offset = lower_value(ctx, *ret_offset)?; - let ret_len = lower_value(ctx, *ret_len)?; - return Ok(Some(ctx.fb.insert_inst( - EvmDelegateCall::new( - ctx.is, gas, addr, arg_offset, arg_len, ret_offset, ret_len, - ), - Type::I256, - ))); - } - _ => {} - } - } - - // Special-case a few thin std wrappers that are semantically EVM opcodes. - // - // These wrappers show up as regular MIR functions (not `extern`), but in the Sonatina - // backend we prefer to lower them directly to opcodes to avoid depending on internal - // call return-value plumbing for correctness. - if call.effect_args.is_empty() { - match callee_name.as_str() { - "alloc" => { - let [size] = call.args.as_slice() else { - return Err(LowerError::Internal( - "alloc expects 1 argument (size)".to_string(), - )); - }; - let size_ty = ctx - .body - .values - .get(size.index()) - .ok_or_else(|| { - LowerError::Internal("unknown call argument".to_string()) - })? - .ty; - if is_erased_runtime_ty(ctx.db, ctx.target_layout, size_ty) { - return Err(LowerError::Internal( - "alloc size argument unexpectedly erased".to_string(), - )); - } - let size = lower_value(ctx, *size)?; - return Ok(Some(emit_evm_malloc_word_addr(ctx.fb, size, ctx.is))); - } - "evm_create_create_raw" => { - let mut lowered = Vec::new(); - for &arg in &call.args { - let arg_ty = ctx - .body - .values - .get(arg.index()) - .ok_or_else(|| { - LowerError::Internal("unknown call argument".to_string()) - })? - .ty; - if is_erased_runtime_ty(ctx.db, ctx.target_layout, arg_ty) { - continue; - } - lowered.push(lower_value(ctx, arg)?); - } - - let [val, offset, len] = lowered.as_slice() else { - return Err(LowerError::Internal(format!( - "{callee_name} expects 3 args (value, offset, len) after ZST erasure, got {}", - lowered.len() - ))); - }; - return Ok(Some(ctx.fb.insert_inst( - EvmCreate::new(ctx.is, *val, *offset, *len), - Type::I256, - ))); - } - "evm_create_create2_raw" => { - let mut lowered = Vec::new(); - for &arg in &call.args { - let arg_ty = ctx - .body - .values - .get(arg.index()) - .ok_or_else(|| { - LowerError::Internal("unknown call argument".to_string()) - })? - .ty; - if is_erased_runtime_ty(ctx.db, ctx.target_layout, arg_ty) { - continue; - } - lowered.push(lower_value(ctx, arg)?); - } - - let [val, offset, len, salt] = lowered.as_slice() else { - return Err(LowerError::Internal(format!( - "{callee_name} expects 4 args (value, offset, len, salt) after ZST erasure, got {}", - lowered.len() - ))); - }; - return Ok(Some(ctx.fb.insert_inst( - EvmCreate2::new(ctx.is, *val, *offset, *len, *salt), - Type::I256, - ))); - } - _ => {} - } - } - - let func_ref = ctx - .name_map - .get(callee_name) - .ok_or_else(|| LowerError::Internal(format!("unknown function: {callee_name}")))?; - - let args = lower_call_args( - ctx, - callee_name, - &call.args, - &call.effect_args, - *func_ref, - "call", - )?; - - // Emit call instruction with proper return type - let call_inst = Call::new(ctx.is, *func_ref, args.into()); - let callee_returns = - ctx.returns_value_map - .get(callee_name) - .copied() - .ok_or_else(|| { - LowerError::Internal(format!( - "missing return type metadata for function: {callee_name}" - )) - })?; - if callee_returns { - let result = ctx.fb.insert_inst(call_inst, types::word_type()); - Ok(Some(result)) - } else { - // Unit-returning calls don't produce a value - ctx.fb.insert_inst_no_result(call_inst); - Ok(None) - } - } - Rvalue::Intrinsic { op, args } => lower_intrinsic(ctx, *op, args), - Rvalue::Load { place } => { - let addr = lower_place_address(ctx, place)?; - let addr_space = ctx.body.place_address_space(place); - - let result = match addr_space { - AddressSpaceKind::Memory => { - let load = Mload::new(ctx.is, addr, Type::I256); - ctx.fb.insert_inst(load, Type::I256) - } - AddressSpaceKind::Storage => { - let load = EvmSload::new(ctx.is, addr); - ctx.fb.insert_inst(load, Type::I256) - } - AddressSpaceKind::TransientStorage => { - let load = EvmTload::new(ctx.is, addr); - ctx.fb.insert_inst(load, Type::I256) - } - AddressSpaceKind::Calldata => { - let load = EvmCalldataLoad::new(ctx.is, addr); - ctx.fb.insert_inst(load, Type::I256) - } - }; - Ok(Some(result)) - } - Rvalue::Alloc { .. } => Err(LowerError::Internal( - "Alloc rvalue should be handled directly in Assign lowering".to_string(), - )), - Rvalue::ConstAggregate { .. } => Err(LowerError::Unsupported( - "ConstAggregate not yet supported in Sonatina backend".to_string(), - )), - } -} - -/// Lower call arguments (regular + effect), applying the runtime parameter mask or -/// filtering erased types, then zero-padding to match the callee signature width. -fn lower_call_args<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - callee_name: &str, - regular_args: &[mir::ValueId], - effect_args: &[mir::ValueId], - func_ref: FuncRef, - context: &str, -) -> Result, LowerError> { - let mut args = Vec::with_capacity(regular_args.len() + effect_args.len()); - if let Some(mask) = ctx.runtime_param_masks.get(callee_name) { - let all_args: Vec<_> = regular_args - .iter() - .chain(effect_args.iter()) - .copied() - .collect(); - if mask.len() != all_args.len() { - return Err(LowerError::Internal(format!( - "{context} to `{callee_name}` has mismatched arg mask length (mask={}, call_args={})", - mask.len(), - all_args.len() - ))); - } - for (keep, arg) in mask.iter().zip(all_args) { - if !*keep { - continue; - } - args.push(lower_value(ctx, arg)?); - } - } else { - // Fallback for callees without a declared signature/mask (e.g. externs). - for &arg in regular_args { - let arg_ty = ctx - .body - .values - .get(arg.index()) - .ok_or_else(|| LowerError::Internal("unknown call argument".to_string()))? - .ty; - if is_erased_runtime_ty(ctx.db, ctx.target_layout, arg_ty) { - continue; - } - args.push(lower_value(ctx, arg)?); - } - for &effect_arg in effect_args { - let arg_ty = ctx - .body - .values - .get(effect_arg.index()) - .ok_or_else(|| LowerError::Internal("unknown call effect argument".to_string()))? - .ty; - if is_erased_runtime_ty(ctx.db, ctx.target_layout, arg_ty) { - continue; - } - args.push(lower_value(ctx, effect_arg)?); - } - } - - let expected_argc = ctx - .fb - .module_builder - .ctx - .func_sig(func_ref, |sig| sig.args().len()); - if args.len() > expected_argc { - return Err(LowerError::Internal(format!( - "{context} to `{callee_name}` has too many args (got {}, expected {expected_argc})", - args.len() - ))); - } - while args.len() < expected_argc { - args.push(ctx.fb.make_imm_value(I256::zero())); - } - - Ok(args) -} - -/// Lower a MIR value to a Sonatina value. -fn lower_value<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - value_id: mir::ValueId, -) -> Result { - let value_data = ctx.body.values.get(value_id.index()).ok_or_else(|| { - LowerError::Internal(format!("unknown MIR value id {}", value_id.index())) - })?; - - // Note: We intentionally avoid caching lowered MIR values across the function. - // - // Sonatina's SSA builder may rewrite/remove placeholder `phi`s during sealing; caching a value - // that (transitively) comes from `use_var` can leave us holding a `ValueId` whose defining - // instruction was removed from the layout, producing malformed IR. - // - // This can be revisited once we have a robust notion of which MIR values are stable across - // blocks after SSA sealing. - lower_value_origin(ctx, value_data) -} - -/// Lower a MIR value origin to a Sonatina value. -fn lower_value_origin<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - value_data: &mir::ValueData<'db>, -) -> Result { - use mir::ValueOrigin; - let origin = &value_data.origin; - - match origin { - ValueOrigin::Synthetic(syn) => match syn { - SyntheticValue::Int(n) => { - let i256_val = biguint_to_i256(n); - Ok(ctx.fb.make_imm_value(i256_val)) - } - SyntheticValue::Bool(b) => { - let val = if *b { I256::one() } else { I256::zero() }; - Ok(ctx.fb.make_imm_value(val)) - } - SyntheticValue::Bytes(bytes) => { - // Convert bytes to I256 (left-padded to 32 bytes) - let i256_val = bytes_to_i256(bytes); - Ok(ctx.fb.make_imm_value(i256_val)) - } - }, - ValueOrigin::Local(local_id) | ValueOrigin::PlaceRoot(local_id) => { - let var = ctx.local_vars.get(local_id).copied().ok_or_else(|| { - LowerError::Internal(format!("SSA variable not found for local {local_id:?}")) - })?; - Ok(ctx.fb.use_var(var)) - } - ValueOrigin::Unit => { - // Unit is represented as 0 - Ok(ctx.fb.make_imm_value(I256::zero())) - } - ValueOrigin::Unary { op, inner } => { - let inner_val = lower_value(ctx, *inner)?; - lower_unary_op(ctx.fb, *op, inner_val, ctx.is) - } - ValueOrigin::Binary { op, lhs, rhs } => { - let lhs_val = lower_value(ctx, *lhs)?; - let rhs_val = lower_value(ctx, *rhs)?; - lower_binary_op(ctx.fb, *op, lhs_val, rhs_val, ctx.is) - } - ValueOrigin::TransparentCast { value } => { - // Transparent cast just passes through the inner value - lower_value(ctx, *value) - } - ValueOrigin::ControlFlowResult { expr } => { - // ControlFlowResult values should be converted to Local values during MIR lowering. - // If we reach here, it means MIR lowering didn't properly handle this case. - Err(LowerError::Internal(format!( - "ControlFlowResult value reached codegen without being converted to Local (expr={expr:?})" - ))) - } - ValueOrigin::PlaceRef(place) => { - if value_data.repr.address_space().is_none() - && let Some((_, inner_ty)) = value_data.ty.as_capability(ctx.db) - { - return load_place_typed(ctx, place, inner_ty); - } - lower_place_address(ctx, place) - } - ValueOrigin::MoveOut { place } => { - if value_data.repr.address_space().is_some() { - lower_place_address(ctx, place) - } else { - load_place_typed(ctx, place, value_data.ty) - } - } - ValueOrigin::FieldPtr(field_ptr) => { - let base = lower_value(ctx, field_ptr.base)?; - if field_ptr.offset_bytes == 0 { - Ok(base) - } else { - let offset = match field_ptr.addr_space { - AddressSpaceKind::Memory | AddressSpaceKind::Calldata => field_ptr.offset_bytes, - AddressSpaceKind::Storage | AddressSpaceKind::TransientStorage => { - field_ptr.offset_bytes / 32 - } - }; - let offset_val = ctx.fb.make_imm_value(I256::from(offset as u64)); - Ok(ctx - .fb - .insert_inst(Add::new(ctx.is, base, offset_val), Type::I256)) - } - } - ValueOrigin::FuncItem(_) => { - // Function items are zero-sized and should never be used as runtime values. - // If we reach here, MIR lowering failed to eliminate this usage. - Err(LowerError::Internal( - "FuncItem value reached codegen - should be zero-sized".to_string(), - )) - } - ValueOrigin::Expr(_) => { - // Unlowered expressions shouldn't reach codegen - Err(LowerError::Internal( - "unlowered expression in codegen".to_string(), - )) - } - } -} - -/// Lower a unary operation. -fn lower_unary_op( - fb: &mut sonatina_ir::builder::FunctionBuilder, - op: UnOp, - inner: ValueId, - is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, -) -> Result { - match op { - UnOp::Not => { - // Logical not: normalize to i1, then keep Fe's word-level bool representation. - let is_zero = fb.insert_inst(IsZero::new(is, inner), Type::I1); - let result = fb.insert_inst(Zext::new(is, is_zero, Type::I256), Type::I256); - Ok(result) - } - UnOp::Minus => { - // Arithmetic negation - let result = fb.insert_inst(Neg::new(is, inner), Type::I256); - Ok(result) - } - UnOp::BitNot => { - // Bitwise not - let result = fb.insert_inst(Not::new(is, inner), Type::I256); - Ok(result) - } - UnOp::Plus => { - // Unary plus is a no-op - Ok(inner) - } - UnOp::Mut | UnOp::Ref => Ok(inner), - } -} - -/// Lower a binary operation. -fn lower_binary_op( - fb: &mut sonatina_ir::builder::FunctionBuilder, - op: BinOp, - lhs: ValueId, - rhs: ValueId, - is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, -) -> Result { - match op { - BinOp::Arith(arith_op) => lower_arith_op(fb, arith_op, lhs, rhs, is), - BinOp::Comp(comp_op) => lower_comp_op(fb, comp_op, lhs, rhs, is), - BinOp::Logical(log_op) => lower_logical_op(fb, log_op, lhs, rhs, is), - BinOp::Index => { - // Index operations are handled via projections, not as binary ops - Err(LowerError::Unsupported("index binary op".to_string())) - } - } -} - -/// Lower an arithmetic binary operation. -fn lower_arith_op( - fb: &mut sonatina_ir::builder::FunctionBuilder, - op: ArithBinOp, - lhs: ValueId, - rhs: ValueId, - is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, -) -> Result { - let result = match op { - ArithBinOp::Add => fb.insert_inst(Add::new(is, lhs, rhs), Type::I256), - ArithBinOp::Sub => fb.insert_inst(Sub::new(is, lhs, rhs), Type::I256), - ArithBinOp::Mul => fb.insert_inst(Mul::new(is, lhs, rhs), Type::I256), - ArithBinOp::Div => fb.insert_inst(EvmUdiv::new(is, lhs, rhs), Type::I256), - ArithBinOp::Rem => fb.insert_inst(EvmUmod::new(is, lhs, rhs), Type::I256), - ArithBinOp::Pow => fb.insert_inst(EvmExp::new(is, lhs, rhs), Type::I256), - // Shl/Shr take (bits, value). - ArithBinOp::LShift => fb.insert_inst(Shl::new(is, rhs, lhs), Type::I256), - ArithBinOp::RShift => fb.insert_inst(Shr::new(is, rhs, lhs), Type::I256), - ArithBinOp::BitOr => fb.insert_inst(Or::new(is, lhs, rhs), Type::I256), - ArithBinOp::BitXor => fb.insert_inst(Xor::new(is, lhs, rhs), Type::I256), - ArithBinOp::BitAnd => fb.insert_inst(And::new(is, lhs, rhs), Type::I256), - ArithBinOp::Range => { - // Range is handled at HIR level, shouldn't reach MIR binary ops - return Err(LowerError::Unsupported("range operator".to_string())); - } - }; - Ok(result) -} - -/// Lower a comparison binary operation. -fn lower_comp_op( - fb: &mut sonatina_ir::builder::FunctionBuilder, - op: CompBinOp, - lhs: ValueId, - rhs: ValueId, - is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, -) -> Result { - let result = match op { - CompBinOp::Eq => { - let eq = fb.insert_inst(Eq::new(is, lhs, rhs), Type::I1); - fb.insert_inst(Zext::new(is, eq, Type::I256), Type::I256) - } - CompBinOp::NotEq => { - // neq = iszero(eq(lhs, rhs)) - let eq_result = fb.insert_inst(Eq::new(is, lhs, rhs), Type::I1); - let neq_i1 = fb.insert_inst(IsZero::new(is, eq_result), Type::I1); - fb.insert_inst(Zext::new(is, neq_i1, Type::I256), Type::I256) - } - CompBinOp::Lt => { - let lt = fb.insert_inst(Lt::new(is, lhs, rhs), Type::I1); - fb.insert_inst(Zext::new(is, lt, Type::I256), Type::I256) - } - CompBinOp::LtEq => { - // lhs <= rhs <==> !(lhs > rhs) - let gt_result = fb.insert_inst(Gt::new(is, lhs, rhs), Type::I1); - let lte_i1 = fb.insert_inst(IsZero::new(is, gt_result), Type::I1); - fb.insert_inst(Zext::new(is, lte_i1, Type::I256), Type::I256) - } - CompBinOp::Gt => { - let gt = fb.insert_inst(Gt::new(is, lhs, rhs), Type::I1); - fb.insert_inst(Zext::new(is, gt, Type::I256), Type::I256) - } - CompBinOp::GtEq => { - // lhs >= rhs <==> !(lhs < rhs) - let lt_result = fb.insert_inst(Lt::new(is, lhs, rhs), Type::I1); - let gte_i1 = fb.insert_inst(IsZero::new(is, lt_result), Type::I1); - fb.insert_inst(Zext::new(is, gte_i1, Type::I256), Type::I256) - } - }; - Ok(result) -} - -/// Lower a logical binary operation. -fn lower_logical_op( - fb: &mut sonatina_ir::builder::FunctionBuilder, - op: LogicalBinOp, - lhs: ValueId, - rhs: ValueId, - is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, -) -> Result { - // Logical ops work on booleans (I1), but we use I256 for EVM - let result = match op { - LogicalBinOp::And => fb.insert_inst(And::new(is, lhs, rhs), Type::I256), - LogicalBinOp::Or => fb.insert_inst(Or::new(is, lhs, rhs), Type::I256), - }; - Ok(result) -} - -/// Lower a MIR intrinsic operation. -fn lower_intrinsic<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - op: IntrinsicOp, - args: &[mir::ValueId], -) -> Result, LowerError> { - if matches!(op, IntrinsicOp::CurrentCodeRegionLen) { - if !args.is_empty() { - return Err(LowerError::Internal( - "current_code_region_len requires 0 arguments".to_string(), - )); - } - return Ok(Some(ctx.fb.insert_inst( - SymSize::new(ctx.is, SymbolRef::CurrentSection), - Type::I256, - ))); - } - - if matches!( - op, - IntrinsicOp::CodeRegionOffset | IntrinsicOp::CodeRegionLen - ) { - let [func_item] = args else { - return Err(LowerError::Internal( - "code region intrinsics require 1 argument".to_string(), - )); - }; - let value_data = ctx - .body - .values - .get(func_item.index()) - .ok_or_else(|| LowerError::Internal("unknown code region argument".to_string()))?; - let symbol = match &value_data.origin { - mir::ValueOrigin::FuncItem(root) => root.symbol.as_deref().ok_or_else(|| { - LowerError::Unsupported( - "code region function item is missing a resolved symbol".to_string(), - ) - })?, - _ => { - return Err(LowerError::Unsupported( - "code region intrinsic argument must be a function item".to_string(), - )); - } - }; - - let embed_sym = EmbedSymbol::from(symbol.to_string()); - let sym = SymbolRef::Embed(embed_sym); - return match op { - IntrinsicOp::CodeRegionOffset => Ok(Some( - ctx.fb.insert_inst(SymAddr::new(ctx.is, sym), Type::I256), - )), - IntrinsicOp::CodeRegionLen => Ok(Some( - ctx.fb.insert_inst(SymSize::new(ctx.is, sym), Type::I256), - )), - _ => unreachable!(), - }; - } - - // Lower all arguments first - let mut lowered_args = Vec::with_capacity(args.len()); - for &arg in args { - let val = lower_value(ctx, arg)?; - lowered_args.push(val); - } - - match op { - IntrinsicOp::AddrOf => { - let Some(&arg) = lowered_args.first() else { - return Err(LowerError::Internal( - "addr_of requires 1 argument".to_string(), - )); - }; - Ok(Some(arg)) - } - IntrinsicOp::Alloc => { - let [size] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "alloc requires 1 argument (size)".to_string(), - )); - }; - Ok(Some(emit_evm_malloc_word_addr(ctx.fb, *size, ctx.is))) - } - IntrinsicOp::Mload => { - let Some(&addr) = lowered_args.first() else { - return Err(LowerError::Internal( - "mload requires address argument".to_string(), - )); - }; - Ok(Some(ctx.fb.insert_inst( - Mload::new(ctx.is, addr, Type::I256), - Type::I256, - ))) - } - IntrinsicOp::Mstore => { - let [addr, val] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "mstore requires 2 arguments".to_string(), - )); - }; - ctx.fb - .insert_inst_no_result(Mstore::new(ctx.is, *addr, *val, Type::I256)); - Ok(None) - } - IntrinsicOp::Mstore8 => { - let [addr, val] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "mstore8 requires 2 arguments".to_string(), - )); - }; - ctx.fb - .insert_inst_no_result(EvmMstore8::new(ctx.is, *addr, *val)); - Ok(None) - } - IntrinsicOp::Sload => { - let Some(&key) = lowered_args.first() else { - return Err(LowerError::Internal( - "sload requires 1 argument".to_string(), - )); - }; - Ok(Some( - ctx.fb.insert_inst(EvmSload::new(ctx.is, key), Type::I256), - )) - } - IntrinsicOp::Sstore => { - let [key, val] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "sstore requires 2 arguments".to_string(), - )); - }; - ctx.fb - .insert_inst_no_result(EvmSstore::new(ctx.is, *key, *val)); - Ok(None) - } - IntrinsicOp::Calldataload => { - let Some(&offset) = lowered_args.first() else { - return Err(LowerError::Internal( - "calldataload requires 1 argument".to_string(), - )); - }; - Ok(Some(ctx.fb.insert_inst( - EvmCalldataLoad::new(ctx.is, offset), - Type::I256, - ))) - } - IntrinsicOp::Calldatasize => Ok(Some( - ctx.fb.insert_inst(EvmCalldataSize::new(ctx.is), Type::I256), - )), - IntrinsicOp::Calldatacopy => { - let [dst, offset, len] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "calldatacopy requires 3 arguments".to_string(), - )); - }; - ctx.fb - .insert_inst_no_result(EvmCalldataCopy::new(ctx.is, *dst, *offset, *len)); - Ok(None) - } - IntrinsicOp::Returndatasize => Ok(Some( - ctx.fb - .insert_inst(EvmReturnDataSize::new(ctx.is), Type::I256), - )), - IntrinsicOp::Returndatacopy => { - let [dst, offset, len] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "returndatacopy requires 3 arguments".to_string(), - )); - }; - ctx.fb - .insert_inst_no_result(EvmReturnDataCopy::new(ctx.is, *dst, *offset, *len)); - Ok(None) - } - IntrinsicOp::Codesize => Ok(Some( - ctx.fb.insert_inst(EvmCodeSize::new(ctx.is), Type::I256), - )), - IntrinsicOp::Codecopy => { - let [dst, offset, len] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "codecopy requires 3 arguments".to_string(), - )); - }; - ctx.fb - .insert_inst_no_result(EvmCodeCopy::new(ctx.is, *dst, *offset, *len)); - Ok(None) - } - IntrinsicOp::CodeRegionOffset - | IntrinsicOp::CodeRegionLen - | IntrinsicOp::CurrentCodeRegionLen => { - unreachable!("code region intrinsics are handled in the early return above") - } - IntrinsicOp::Keccak => { - let [addr, len] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "keccak requires 2 arguments".to_string(), - )); - }; - Ok(Some(ctx.fb.insert_inst( - EvmKeccak256::new(ctx.is, *addr, *len), - Type::I256, - ))) - } - IntrinsicOp::Addmod => { - let [a, b, m] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "addmod requires 3 arguments".to_string(), - )); - }; - Ok(Some(ctx.fb.insert_inst( - EvmAddMod::new(ctx.is, *a, *b, *m), - Type::I256, - ))) - } - IntrinsicOp::Mulmod => { - let [a, b, m] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "mulmod requires 3 arguments".to_string(), - )); - }; - Ok(Some(ctx.fb.insert_inst( - EvmMulMod::new(ctx.is, *a, *b, *m), - Type::I256, - ))) - } - IntrinsicOp::Caller => Ok(Some(ctx.fb.insert_inst(EvmCaller::new(ctx.is), Type::I256))), - IntrinsicOp::ReturnData | IntrinsicOp::Revert => Err(LowerError::Internal( - "terminating intrinsic must be lowered as Terminator::TerminatingCall".to_string(), - )), - } -} - -/// Convert a BigUint to I256. -fn biguint_to_i256(n: &BigUint) -> I256 { - // Convert to bytes and then to I256 - let bytes = n.to_bytes_be(); - if bytes.is_empty() { - return I256::zero(); - } - // Pad to 32 bytes (right-aligned for big-endian) - let mut padded = [0u8; 32]; - let start = 32usize.saturating_sub(bytes.len()); - let copy_len = bytes.len().min(32); - padded[start..start + copy_len].copy_from_slice(&bytes[bytes.len() - copy_len..]); - I256::from_be_bytes(&padded) -} - -/// Convert bytes to I256. -/// -/// Matches Yul's `0x...` literal semantics by interpreting the bytes as a big-endian integer. -fn bytes_to_i256(bytes: &[u8]) -> I256 { - let mut padded = [0u8; 32]; - let copy_len = bytes.len().min(32); - let start = 32 - copy_len; - padded[start..start + copy_len].copy_from_slice(&bytes[bytes.len() - copy_len..]); - I256::from_be_bytes(&padded) -} - -/// Returns the Sonatina Type for a Fe primitive type, or None if not a sub-word type. -fn prim_to_sonatina_type(prim: PrimTy) -> Option { - match prim { - PrimTy::Bool => Some(Type::I1), - PrimTy::U8 | PrimTy::I8 => Some(Type::I8), - PrimTy::U16 | PrimTy::I16 => Some(Type::I16), - PrimTy::U32 | PrimTy::I32 => Some(Type::I32), - PrimTy::U64 | PrimTy::I64 => Some(Type::I64), - PrimTy::U128 | PrimTy::I128 => Some(Type::I128), - // Full-width types don't need conversion - PrimTy::U256 - | PrimTy::I256 - | PrimTy::Usize - | PrimTy::Isize - | PrimTy::View - | PrimTy::BorrowMut - | PrimTy::BorrowRef => None, - // Non-scalar types - PrimTy::String | PrimTy::Array | PrimTy::Tuple(_) | PrimTy::Ptr => None, - } -} - -/// Returns true if the primitive type is signed. -fn prim_is_signed(prim: PrimTy) -> bool { - matches!( - prim, - PrimTy::I8 - | PrimTy::I16 - | PrimTy::I32 - | PrimTy::I64 - | PrimTy::I128 - | PrimTy::I256 - | PrimTy::Isize - ) -} - -/// Applies `from_word` conversion after loading a value. -/// -/// This mirrors the stdlib `WordRepr::from_word` semantics: -/// - bool: convert to 0 or 1 -/// - unsigned sub-word: mask to appropriate width -/// - signed sub-word: mask then sign-extend -fn apply_from_word<'db, C: sonatina_ir::func_cursor::FuncCursor>( - fb: &mut sonatina_ir::builder::FunctionBuilder, - db: &'db DriverDataBase, - raw_value: ValueId, - ty: hir::analysis::ty::ty_def::TyId<'db>, - is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, -) -> ValueId { - let ty = mir::repr::word_conversion_leaf_ty(db, ty); - let base_ty = ty.base_ty(db); - - if let TyData::TyBase(TyBase::Prim(prim)) = base_ty.data(db) { - match prim { - PrimTy::Bool => { - // bool: value != 0 → 0 or 1 - let zero = fb.make_imm_value(I256::zero()); - let cmp = Ne::new(is, raw_value, zero); - let bool_val = fb.insert_inst(cmp, Type::I1); - // Extend back to I256 - let ext = Zext::new(is, bool_val, Type::I256); - fb.insert_inst(ext, Type::I256) - } - _ => { - if let Some(small_ty) = prim_to_sonatina_type(*prim) { - // Truncate to small type then extend back - let trunc = Trunc::new(is, raw_value, small_ty); - let truncated = fb.insert_inst(trunc, small_ty); - - if prim_is_signed(*prim) { - let ext = Sext::new(is, truncated, Type::I256); - fb.insert_inst(ext, Type::I256) - } else { - let ext = Zext::new(is, truncated, Type::I256); - fb.insert_inst(ext, Type::I256) - } - } else { - // Full-width type, no conversion needed - raw_value - } - } - } - } else { - // Non-primitive type, no conversion - raw_value - } -} - -/// Applies `to_word` conversion before storing a value. -/// -/// This mirrors the stdlib `WordRepr::to_word` semantics: -/// - bool: convert to 0 or 1 -/// - unsigned sub-word: mask to appropriate width -/// - signed: no conversion needed (already sign-extended) -fn apply_to_word<'db, C: sonatina_ir::func_cursor::FuncCursor>( - fb: &mut sonatina_ir::builder::FunctionBuilder, - db: &'db DriverDataBase, - value: ValueId, - ty: hir::analysis::ty::ty_def::TyId<'db>, - is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, -) -> ValueId { - let ty = mir::repr::word_conversion_leaf_ty(db, ty); - let base_ty = ty.base_ty(db); - - if let TyData::TyBase(TyBase::Prim(prim)) = base_ty.data(db) { - match prim { - PrimTy::Bool => { - // bool: value != 0 → 0 or 1 - let zero = fb.make_imm_value(I256::zero()); - let cmp = Ne::new(is, value, zero); - let bool_val = fb.insert_inst(cmp, Type::I1); - let ext = Zext::new(is, bool_val, Type::I256); - fb.insert_inst(ext, Type::I256) - } - PrimTy::U8 | PrimTy::U16 | PrimTy::U32 | PrimTy::U64 | PrimTy::U128 => { - // Unsigned: truncate then zero-extend to mask high bits - if let Some(small_ty) = prim_to_sonatina_type(*prim) { - let trunc = Trunc::new(is, value, small_ty); - let truncated = fb.insert_inst(trunc, small_ty); - let ext = Zext::new(is, truncated, Type::I256); - fb.insert_inst(ext, Type::I256) - } else { - value - } - } - // Signed types and full-width types don't need conversion - _ => value, - } - } else { - // Non-primitive type, no conversion - value - } -} - -/// Maps a Fe type to a sonatina struct/array type for GEP-based addressing. -/// -/// Returns `Some(Type)` for types that can be represented as sonatina compound types -/// (structs, tuples, arrays of such). Returns `None` for types where we should fall -/// back to manual offset arithmetic (enums, zero-sized types, plain scalars). -/// -/// Uses a cache to avoid creating duplicate struct type definitions. The cache is keyed -/// by the Fe `TyId` debug representation (salsa-interned, so stable within a session). -fn fe_ty_to_sonatina<'db, C: sonatina_ir::func_cursor::FuncCursor>( - fb: &mut sonatina_ir::builder::FunctionBuilder, - db: &'db DriverDataBase, - target_layout: &TargetDataLayout, - ty: hir::analysis::ty::ty_def::TyId<'db>, - cache: &mut FxHashMap>, - name_counter: &mut usize, -) -> Option { - let cache_key = format!("{ty:?}"); - if let Some(cached) = cache.get(&cache_key) { - return *cached; - } - - let result = fe_ty_to_sonatina_inner(fb, db, target_layout, ty, cache, name_counter); - cache.insert(cache_key, result); - result -} - -fn fe_ty_to_sonatina_inner<'db, C: sonatina_ir::func_cursor::FuncCursor>( - fb: &mut sonatina_ir::builder::FunctionBuilder, - db: &'db DriverDataBase, - target_layout: &TargetDataLayout, - ty: hir::analysis::ty::ty_def::TyId<'db>, - cache: &mut FxHashMap>, - name_counter: &mut usize, -) -> Option { - if is_erased_runtime_ty(db, target_layout, ty) { - return Some(Type::Unit); - } - - let base_ty = ty.base_ty(db); - match base_ty.data(db) { - TyData::TyBase(TyBase::Prim(prim)) => match prim { - // Scalars: all map to I256 on EVM - PrimTy::Bool - | PrimTy::U8 - | PrimTy::I8 - | PrimTy::U16 - | PrimTy::I16 - | PrimTy::U32 - | PrimTy::I32 - | PrimTy::U64 - | PrimTy::I64 - | PrimTy::U128 - | PrimTy::I128 - | PrimTy::U256 - | PrimTy::I256 - | PrimTy::Usize - | PrimTy::Isize - | PrimTy::Ptr - | PrimTy::View - | PrimTy::BorrowMut - | PrimTy::BorrowRef => Some(Type::I256), - PrimTy::String => None, - PrimTy::Tuple(_) => { - let field_tys = ty.field_types(db); - if field_tys.is_empty() { - return Some(Type::Unit); - } - let mut sonatina_fields = Vec::with_capacity(field_tys.len()); - for ft in &field_tys { - sonatina_fields.push(fe_ty_to_sonatina( - fb, - db, - target_layout, - *ft, - cache, - name_counter, - )?); - } - let id = *name_counter; - *name_counter += 1; - Some(fb.declare_struct_type(&format!("__fe_tuple_{id}"), &sonatina_fields, false)) - } - PrimTy::Array => { - let elem_ty = layout::array_elem_ty(db, ty)?; - let len = layout::array_len(db, ty)?; - let sonatina_elem = - fe_ty_to_sonatina(fb, db, target_layout, elem_ty, cache, name_counter)?; - Some(fb.declare_array_type(sonatina_elem, len)) - } - }, - TyData::TyBase(TyBase::Adt(adt_def)) => { - match adt_def.adt_ref(db) { - AdtRef::Struct(_) => { - let field_tys = ty.field_types(db); - let mut sonatina_fields = Vec::with_capacity(field_tys.len()); - for ft in &field_tys { - sonatina_fields.push(fe_ty_to_sonatina( - fb, - db, - target_layout, - *ft, - cache, - name_counter, - )?); - } - let name = adt_def - .adt_ref(db) - .name(db) - .map(|id| id.data(db).to_string()) - .unwrap_or_else(|| "anon".to_string()); - let id = *name_counter; - *name_counter += 1; - Some(fb.declare_struct_type( - &format!("__fe_{name}_{id}"), - &sonatina_fields, - false, - )) - } - // Enums: fall back to manual arithmetic - AdtRef::Enum(_) => None, - } - } - TyData::TyBase(TyBase::Contract(_)) | TyData::TyBase(TyBase::Func(_)) => Some(Type::Unit), - _ => None, - } -} - -/// Checks whether a projection chain is eligible for GEP-based addressing. -/// -/// Returns true when all projections are Field or Index (no VariantField, Discriminant, or Deref). -fn projections_eligible_for_gep(place: &Place<'_>) -> bool { - place - .projection - .iter() - .all(|p| matches!(p, Projection::Field(_) | Projection::Index(_))) -} - -/// Computes the address for a place by walking the projection path. -/// -/// For memory, computes byte offsets. For storage, computes slot offsets. -/// Returns a Sonatina ValueId representing the final address. -fn lower_place_address<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - place: &Place<'db>, -) -> Result { - let base_val = lower_value(ctx, place.base)?; - - if place.projection.is_empty() { - return Ok(base_val); - } - - // Get the base value's type to navigate projections - let base_value = ctx.body.values.get(place.base.index()).ok_or_else(|| { - LowerError::Internal(format!( - "unknown MIR place base value {}", - place.base.index() - )) - })?; - let current_ty = base_value.ty; - if is_erased_runtime_ty(ctx.db, ctx.target_layout, current_ty) { - return Ok(base_val); - } - - let is_slot_addressed = matches!( - ctx.body.place_address_space(place), - AddressSpaceKind::Storage | AddressSpaceKind::TransientStorage - ); - - // Use GEP for memory-addressed places where all projections are Field or Index - if !is_slot_addressed - && projections_eligible_for_gep(place) - && let Some(sonatina_ty) = fe_ty_to_sonatina( - ctx.fb, - ctx.db, - ctx.target_layout, - current_ty, - ctx.gep_type_cache, - ctx.gep_name_counter, - ) - { - return lower_place_address_gep(ctx, place, base_val, current_ty, sonatina_ty); - } - - // Fall back to manual offset arithmetic - lower_place_address_arithmetic(ctx, place, base_val, current_ty, is_slot_addressed) -} - -/// GEP-based place address computation for memory-addressed struct/array paths. -fn lower_place_address_gep<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - place: &Place<'db>, - base_val: ValueId, - base_fe_ty: hir::analysis::ty::ty_def::TyId<'db>, - base_sonatina_ty: Type, -) -> Result { - let ptr_ty = ctx.fb.ptr_type(base_sonatina_ty); - - // IntToPtr: cast I256 base address to typed pointer - let typed_ptr = ctx - .fb - .insert_inst(IntToPtr::new(ctx.is, base_val, ptr_ty), ptr_ty); - - // Build GEP index list, tracking types through the chain - let mut gep_values: SmallVec<[ValueId; 8]> = SmallVec::new(); - gep_values.push(typed_ptr); - - // Initial dereference index (standard GEP convention: index 0 dereferences the pointer) - let zero = ctx.fb.make_imm_value(I256::zero()); - gep_values.push(zero); - - let mut current_fe_ty = base_fe_ty; - let mut current_sonatina_ty = base_sonatina_ty; - - for proj in place.projection.iter() { - match proj { - Projection::Field(field_idx) => { - let idx_val = ctx.fb.make_imm_value(I256::from(*field_idx as u64)); - gep_values.push(idx_val); - - // Navigate Fe type - let field_types = current_fe_ty.field_types(ctx.db); - current_fe_ty = *field_types.get(*field_idx).ok_or_else(|| { - LowerError::Unsupported(format!("gep: field {field_idx} out of bounds")) - })?; - - // Navigate sonatina type to the field's type - current_sonatina_ty = - sonatina_struct_field_ty(ctx, current_sonatina_ty, *field_idx)?; - } - Projection::Index(idx_source) => { - let idx_val = match idx_source { - IndexSource::Constant(idx) => ctx.fb.make_imm_value(I256::from(*idx as u64)), - IndexSource::Dynamic(value_id) => lower_value(ctx, *value_id)?, - }; - gep_values.push(idx_val); - - // Navigate Fe type - current_fe_ty = layout::array_elem_ty(ctx.db, current_fe_ty).ok_or_else(|| { - LowerError::Unsupported("gep: array index on non-array type".to_string()) - })?; - - // Navigate sonatina type to array element - current_sonatina_ty = sonatina_array_elem_ty(ctx, current_sonatina_ty)?; - } - _ => unreachable!("projections_eligible_for_gep ensures only Field/Index"), - } - } - - // The GEP result is a pointer to the final element type - let result_ptr_ty = ctx.fb.ptr_type(current_sonatina_ty); - let gep_result = ctx - .fb - .insert_inst(Gep::new(ctx.is, gep_values), result_ptr_ty); - - // PtrToInt: cast back to I256 for mload/mstore - let result = ctx - .fb - .insert_inst(PtrToInt::new(ctx.is, gep_result, Type::I256), Type::I256); - - Ok(result) -} - -/// Resolves the sonatina type of a struct field by index. -fn sonatina_struct_field_ty( - ctx: &mut LowerCtx<'_, '_, C>, - struct_ty: Type, - field_idx: usize, -) -> Result { - let fields = ctx - .fb - .module_builder - .ctx - .with_ty_store(|s| s.struct_def(struct_ty).map(|sd| sd.fields.clone())); - match fields { - Some(f) => f.get(field_idx).copied().ok_or_else(|| { - LowerError::Internal(format!( - "gep: sonatina struct field {field_idx} out of bounds" - )) - }), - None => Err(LowerError::Internal( - "gep: expected sonatina struct type for Field projection".to_string(), - )), - } -} - -/// Resolves the sonatina element type of an array type. -fn sonatina_array_elem_ty( - ctx: &mut LowerCtx<'_, '_, C>, - array_ty: Type, -) -> Result { - let elem = ctx - .fb - .module_builder - .ctx - .with_ty_store(|s| s.array_def(array_ty).map(|(elem, _len)| elem)); - match elem { - Some(e) => Ok(e), - None => Err(LowerError::Internal( - "gep: expected sonatina array type for Index projection".to_string(), - )), - } -} - -/// Manual offset arithmetic path for place address computation. -/// Used for storage-addressed places and any memory path with enum projections. -fn lower_place_address_arithmetic<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - place: &Place<'db>, - mut base_val: ValueId, - mut current_ty: hir::analysis::ty::ty_def::TyId<'db>, - is_slot_addressed: bool, -) -> Result { - let mut total_offset: usize = 0; - - for proj in place.projection.iter() { - match proj { - Projection::Field(field_idx) => { - // Use slot-based offsets for storage, byte-based for memory - total_offset += if is_slot_addressed { - layout::field_offset_slots(ctx.db, current_ty, *field_idx) - } else { - layout::field_offset_memory_in( - ctx.db, - ctx.target_layout, - current_ty, - *field_idx, - ) - }; - // Update current type to the field's type - let field_types = current_ty.field_types(ctx.db); - current_ty = *field_types.get(*field_idx).ok_or_else(|| { - LowerError::Unsupported(format!("projection: field {field_idx} out of bounds")) - })?; - } - Projection::VariantField { - variant, - enum_ty, - field_idx, - } => { - // Skip discriminant then compute field offset - if is_slot_addressed { - total_offset += 1; // discriminant takes one slot - total_offset += - layout::variant_field_offset_slots(ctx.db, *enum_ty, *variant, *field_idx); - } else { - total_offset += ctx.target_layout.discriminant_size_bytes; - total_offset += layout::variant_field_offset_memory_in( - ctx.db, - ctx.target_layout, - *enum_ty, - *variant, - *field_idx, - ); - } - // Update current type to the field's type - let ctor = hir::analysis::ty::simplified_pattern::ConstructorKind::Variant( - *variant, *enum_ty, - ); - let field_types = ctor.field_types(ctx.db); - current_ty = *field_types.get(*field_idx).ok_or_else(|| { - LowerError::Unsupported(format!( - "projection: variant field {field_idx} out of bounds" - )) - })?; - } - Projection::Discriminant => { - // Discriminant is at offset 0, just update the type - current_ty = hir::analysis::ty::ty_def::TyId::new( - ctx.db, - hir::analysis::ty::ty_def::TyData::TyBase( - hir::analysis::ty::ty_def::TyBase::Prim( - hir::analysis::ty::ty_def::PrimTy::U256, - ), - ), - ); - } - Projection::Index(idx_source) => { - let stride = if is_slot_addressed { - layout::array_elem_stride_slots(ctx.db, current_ty) - } else { - layout::array_elem_stride_memory_in(ctx.db, ctx.target_layout, current_ty) - } - .ok_or_else(|| { - LowerError::Unsupported("projection: array index on non-array type".to_string()) - })?; - - match idx_source { - IndexSource::Constant(idx) => { - total_offset += idx * stride; - } - IndexSource::Dynamic(value_id) => { - // Flush accumulated offset first - if total_offset != 0 { - let offset_val = ctx.fb.make_imm_value(I256::from(total_offset as u64)); - base_val = ctx - .fb - .insert_inst(Add::new(ctx.is, base_val, offset_val), Type::I256); - total_offset = 0; - } - // Compute dynamic index offset: idx * stride - let idx_val = lower_value(ctx, *value_id)?; - let offset_val = if stride == 1 { - idx_val - } else { - let stride_val = ctx.fb.make_imm_value(I256::from(stride as u64)); - ctx.fb - .insert_inst(Mul::new(ctx.is, idx_val, stride_val), Type::I256) - }; - base_val = ctx - .fb - .insert_inst(Add::new(ctx.is, base_val, offset_val), Type::I256); - } - } - - // Update current type to element type - let elem_ty = layout::array_elem_ty(ctx.db, current_ty).ok_or_else(|| { - LowerError::Unsupported("projection: array index on non-array type".to_string()) - })?; - current_ty = elem_ty; - } - Projection::Deref => { - return Err(LowerError::Unsupported( - "projection: pointer dereference not implemented".to_string(), - )); - } - } - } - - // Add any remaining accumulated offset - if total_offset != 0 { - let offset_val = ctx.fb.make_imm_value(I256::from(total_offset as u64)); - base_val = ctx - .fb - .insert_inst(Add::new(ctx.is, base_val, offset_val), Type::I256); - } - - Ok(base_val) -} - -/// Lower a block terminator. -/// -/// If `is_entry` is true, `Return` terminators emit `evm_stop` instead of internal `Return`, -/// since the entry function is executed directly by the EVM and must halt with an EVM opcode. -pub(super) fn lower_terminator<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - term: &mir::Terminator<'db>, -) -> Result<(), LowerError> { - use mir::Terminator; - - match term { - Terminator::Return { value: ret_val, .. } => { - if ctx.is_entry { - // Entry function: emit evm_stop to halt EVM execution. - // Any return value is ignored since the entry function should have - // already written return data via evm_return if needed. - ctx.fb.insert_inst_no_result(EvmStop::new(ctx.is)); - } else { - // Non-entry function: emit internal Return for function call semantics. - let ret_sonatina = if let Some(v) = ret_val { - Some(lower_value(ctx, *v)?) - } else { - None - }; - ctx.fb - .insert_inst_no_result(Return::new(ctx.is, ret_sonatina)); - } - } - Terminator::Goto { target, .. } => { - let target_block = ctx.block_map[target]; - ctx.fb - .insert_inst_no_result(Jump::new(ctx.is, target_block)); - } - Terminator::Branch { - cond, - then_bb, - else_bb, - .. - } => { - let cond_val = lower_value(ctx, *cond)?; - let cond_i1 = condition_to_i1(ctx.fb, cond_val, ctx.is); - let then_block = ctx.block_map[then_bb]; - let else_block = ctx.block_map[else_bb]; - // Br: cond, nz_dest (then), z_dest (else) - ctx.fb - .insert_inst_no_result(Br::new(ctx.is, cond_i1, then_block, else_block)); - } - Terminator::Switch { - discr, - targets, - default, - .. - } => { - let discr_val = lower_value(ctx, *discr)?; - let default_block = ctx.block_map[default]; - - // NOTE: Sonatina's current EVM backend `BrTable` lowering is broken (it does not - // compare against the scrutinee). Lower to a chain of `Eq` + `Br` instead. - if targets.is_empty() { - ctx.fb - .insert_inst_no_result(Jump::new(ctx.is, default_block)); - return Ok(()); - } - - let mut cases = Vec::with_capacity(targets.len()); - for target in targets { - let value = ctx - .fb - .make_imm_value(biguint_to_i256(&target.value.as_biguint())); - let dest = ctx.block_map[&target.block]; - cases.push((value, dest)); - } - - // Create additional compare blocks as needed. - let mut compare_blocks = Vec::with_capacity(cases.len().saturating_sub(1)); - for _ in 0..cases.len().saturating_sub(1) { - compare_blocks.push(ctx.fb.append_block()); - } - - for (case_idx, (case_value, case_dest)) in cases.into_iter().enumerate() { - if case_idx > 0 { - ctx.fb.switch_to_block(compare_blocks[case_idx - 1]); - } - - let else_dest = if case_idx + 1 < compare_blocks.len() + 1 { - compare_blocks[case_idx] - } else { - default_block - }; - let cond = ctx - .fb - .insert_inst(Eq::new(ctx.is, discr_val, case_value), Type::I1); - ctx.fb - .insert_inst_no_result(Br::new(ctx.is, cond, case_dest, else_dest)); - } - } - Terminator::TerminatingCall { call, .. } => match call { - mir::TerminatingCall::Call(call) => { - let callee_name = call.resolved_name.as_ref().ok_or_else(|| { - LowerError::Unsupported("terminating call without resolved name".to_string()) - })?; - - if call.effect_args.is_empty() { - match callee_name.as_str() { - "stop" => { - if !call.args.is_empty() { - return Err(LowerError::Internal( - "stop takes no arguments".to_string(), - )); - } - ctx.fb.insert_inst_no_result(EvmStop::new(ctx.is)); - return Ok(()); - } - "selfdestruct" => { - let [addr] = call.args.as_slice() else { - return Err(LowerError::Internal( - "selfdestruct requires 1 argument".to_string(), - )); - }; - let addr = lower_value(ctx, *addr)?; - ctx.fb - .insert_inst_no_result(EvmSelfDestruct::new(ctx.is, addr)); - return Ok(()); - } - _ => {} - } - } - - let func_ref = ctx.name_map.get(callee_name).ok_or_else(|| { - LowerError::Internal(format!("unknown function: {callee_name}")) - })?; - - let args = lower_call_args( - ctx, - callee_name, - &call.args, - &call.effect_args, - *func_ref, - "terminating call", - )?; - - ctx.fb - .insert_inst_no_result(Call::new(ctx.is, *func_ref, args.into())); - ctx.fb.insert_inst_no_result(EvmInvalid::new(ctx.is)); - } - mir::TerminatingCall::Intrinsic { op, args } => { - let mut lowered_args = Vec::with_capacity(args.len()); - for &arg in args { - lowered_args.push(lower_value(ctx, arg)?); - } - match op { - IntrinsicOp::ReturnData => { - let [addr, len] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "return_data requires 2 arguments".to_string(), - )); - }; - ctx.fb - .insert_inst_no_result(EvmReturn::new(ctx.is, *addr, *len)); - } - IntrinsicOp::Revert => { - let [addr, len] = lowered_args.as_slice() else { - return Err(LowerError::Internal( - "revert requires 2 arguments".to_string(), - )); - }; - ctx.fb - .insert_inst_no_result(EvmRevert::new(ctx.is, *addr, *len)); - } - _ => { - return Err(LowerError::Unsupported(format!( - "terminating intrinsic: {:?}", - op - ))); - } - } - } - }, - Terminator::Unreachable { .. } => { - // Emit INVALID opcode (0xFE) - this consumes all gas and reverts - ctx.fb.insert_inst_no_result(EvmInvalid::new(ctx.is)); - } - } - - Ok(()) -} - -fn lower_alloc( - ctx: &mut LowerCtx<'_, '_, C>, - dest: mir::LocalId, - address_space: AddressSpaceKind, -) -> Result { - if !matches!(address_space, AddressSpaceKind::Memory) { - return Err(LowerError::Unsupported( - "alloc is only supported for memory".to_string(), - )); - } - - let alloc_ty = ctx - .body - .locals - .get(dest.index()) - .ok_or_else(|| LowerError::Internal(format!("unknown local: {dest:?}")))? - .ty; - - let Some(size_bytes) = layout::ty_memory_size_or_word_in(ctx.db, ctx.target_layout, alloc_ty) - else { - return Err(LowerError::Unsupported(format!( - "cannot determine allocation size for `{}`", - alloc_ty.pretty_print(ctx.db) - ))); - }; - - if size_bytes == 0 { - return Ok(ctx.fb.make_imm_value(I256::zero())); - } - - // Use Sonatina's EvmMalloc to allocate memory. This delegates memory management - // to Sonatina's codegen, avoiding conflicts with its stack frame handling. - let size_val = ctx.fb.make_imm_value(I256::from(size_bytes as u64)); - let ptr = emit_evm_malloc_word_addr(ctx.fb, size_val, ctx.is); - - Ok(ptr) -} - -fn lower_store_inst<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - place: &Place<'db>, - value: mir::ValueId, -) -> Result<(), LowerError> { - let value_data = ctx - .body - .values - .get(value.index()) - .ok_or_else(|| LowerError::Internal(format!("unknown value: {value:?}")))?; - let value_ty = value_data.ty; - if is_erased_runtime_ty(ctx.db, ctx.target_layout, value_ty) { - return Ok(()); - } - - if value_data.repr.is_ref() { - let src_place = mir::ir::Place::new(value, mir::ir::MirProjectionPath::new()); - deep_copy_from_places(ctx, place, &src_place, value_ty)?; - return Ok(()); - } - - let raw_val = lower_value(ctx, value)?; - let val = apply_to_word(ctx.fb, ctx.db, raw_val, value_ty, ctx.is); - store_word_to_place(ctx, place, val) -} - -fn store_word_to_place<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - place: &Place<'db>, - val: ValueId, -) -> Result<(), LowerError> { - let addr = lower_place_address(ctx, place)?; - match ctx.body.place_address_space(place) { - AddressSpaceKind::Memory => { - ctx.fb - .insert_inst_no_result(Mstore::new(ctx.is, addr, val, Type::I256)); - } - AddressSpaceKind::Storage => { - ctx.fb - .insert_inst_no_result(EvmSstore::new(ctx.is, addr, val)); - } - AddressSpaceKind::TransientStorage => { - ctx.fb - .insert_inst_no_result(EvmTstore::new(ctx.is, addr, val)); - } - AddressSpaceKind::Calldata => { - return Err(LowerError::Unsupported("store to calldata".to_string())); - } - } - Ok(()) -} - -fn load_place_typed<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - place: &Place<'db>, - loaded_ty: hir::analysis::ty::ty_def::TyId<'db>, -) -> Result { - if is_erased_runtime_ty(ctx.db, ctx.target_layout, loaded_ty) { - return Ok(ctx.fb.make_imm_value(I256::zero())); - } - - let addr = lower_place_address(ctx, place)?; - let raw = match ctx.body.place_address_space(place) { - AddressSpaceKind::Memory => ctx - .fb - .insert_inst(Mload::new(ctx.is, addr, Type::I256), Type::I256), - AddressSpaceKind::Storage => ctx.fb.insert_inst(EvmSload::new(ctx.is, addr), Type::I256), - AddressSpaceKind::TransientStorage => { - ctx.fb.insert_inst(EvmTload::new(ctx.is, addr), Type::I256) - } - AddressSpaceKind::Calldata => ctx - .fb - .insert_inst(EvmCalldataLoad::new(ctx.is, addr), Type::I256), - }; - Ok(apply_from_word(ctx.fb, ctx.db, raw, loaded_ty, ctx.is)) -} - -fn deep_copy_from_places<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - dst_place: &Place<'db>, - src_place: &Place<'db>, - value_ty: hir::analysis::ty::ty_def::TyId<'db>, -) -> Result<(), LowerError> { - if is_erased_runtime_ty(ctx.db, ctx.target_layout, value_ty) { - return Ok(()); - } - - if value_ty.is_array(ctx.db) { - let Some(len) = layout::array_len(ctx.db, value_ty) else { - return Err(LowerError::Unsupported( - "array store requires a constant length".into(), - )); - }; - let elem_ty = layout::array_elem_ty(ctx.db, value_ty) - .ok_or_else(|| LowerError::Unsupported("array store requires element type".into()))?; - for idx in 0..len { - let dst_elem = extend_place(dst_place, Projection::Index(IndexSource::Constant(idx))); - let src_elem = extend_place(src_place, Projection::Index(IndexSource::Constant(idx))); - deep_copy_from_places(ctx, &dst_elem, &src_elem, elem_ty)?; - } - return Ok(()); - } - - if value_ty.field_count(ctx.db) > 0 { - for (field_idx, field_ty) in value_ty.field_types(ctx.db).iter().copied().enumerate() { - let dst_field = extend_place(dst_place, Projection::Field(field_idx)); - let src_field = extend_place(src_place, Projection::Field(field_idx)); - deep_copy_from_places(ctx, &dst_field, &src_field, field_ty)?; - } - return Ok(()); - } - - if value_ty - .adt_ref(ctx.db) - .is_some_and(|adt| matches!(adt, AdtRef::Enum(_))) - { - return deep_copy_enum_from_places(ctx, dst_place, src_place, value_ty); - } - - let loaded = load_place_typed(ctx, src_place, value_ty)?; - let stored = apply_to_word(ctx.fb, ctx.db, loaded, value_ty, ctx.is); - store_word_to_place(ctx, dst_place, stored) -} - -fn deep_copy_enum_from_places<'db, C: sonatina_ir::func_cursor::FuncCursor>( - ctx: &mut LowerCtx<'_, 'db, C>, - dst_place: &Place<'db>, - src_place: &Place<'db>, - enum_ty: hir::analysis::ty::ty_def::TyId<'db>, -) -> Result<(), LowerError> { - let Some(adt_def) = enum_ty.adt_def(ctx.db) else { - return Err(LowerError::Unsupported( - "enum store requires enum adt".into(), - )); - }; - let AdtRef::Enum(enm) = adt_def.adt_ref(ctx.db) else { - return Err(LowerError::Unsupported( - "enum store requires enum adt".into(), - )); - }; - - // Copy discriminant first. - let discr_ty = - hir::analysis::ty::ty_def::TyId::new(ctx.db, TyData::TyBase(TyBase::Prim(PrimTy::U256))); - let discr = load_place_typed(ctx, src_place, discr_ty)?; - store_word_to_place(ctx, dst_place, discr)?; - - let origin_block = ctx - .fb - .current_block() - .ok_or_else(|| LowerError::Internal("missing current block".to_string()))?; - let cont_block = ctx.fb.append_block(); - - let variants = adt_def.fields(ctx.db); - let mut cases: Vec<(ValueId, BlockId)> = Vec::with_capacity(variants.len()); - let mut case_blocks = Vec::with_capacity(variants.len()); - for (idx, _) in variants.iter().enumerate() { - let case_block = ctx.fb.append_block(); - case_blocks.push(case_block); - cases.push((ctx.fb.make_imm_value(I256::from(idx as u64)), case_block)); - } - - ctx.fb.switch_to_block(origin_block); - if cases.is_empty() { - ctx.fb.insert_inst_no_result(Jump::new(ctx.is, cont_block)); - } else { - let mut compare_blocks = Vec::with_capacity(cases.len().saturating_sub(1)); - for _ in 0..cases.len().saturating_sub(1) { - compare_blocks.push(ctx.fb.append_block()); - } - - for (case_idx, (case_value, case_dest)) in cases.into_iter().enumerate() { - if case_idx > 0 { - ctx.fb.switch_to_block(compare_blocks[case_idx - 1]); - } - - let else_dest = if case_idx + 1 < compare_blocks.len() + 1 { - compare_blocks[case_idx] - } else { - cont_block - }; - let cond = ctx - .fb - .insert_inst(Eq::new(ctx.is, discr, case_value), Type::I1); - ctx.fb - .insert_inst_no_result(Br::new(ctx.is, cond, case_dest, else_dest)); - } - } - - for (idx, case_block) in case_blocks.into_iter().enumerate() { - ctx.fb.switch_to_block(case_block); - let enum_variant = hir::hir_def::EnumVariant::new(enm, idx); - let ctor = - hir::analysis::ty::simplified_pattern::ConstructorKind::Variant(enum_variant, enum_ty); - for (field_idx, field_ty) in ctor.field_types(ctx.db).iter().copied().enumerate() { - let proj = Projection::VariantField { - variant: enum_variant, - enum_ty, - field_idx, - }; - let dst_field = extend_place(dst_place, proj.clone()); - let src_field = extend_place(src_place, proj); - deep_copy_from_places(ctx, &dst_field, &src_field, field_ty)?; - } - ctx.fb.insert_inst_no_result(Jump::new(ctx.is, cont_block)); - } - - ctx.fb.switch_to_block(cont_block); - Ok(()) -} - -fn extend_place<'db>(place: &Place<'db>, proj: mir::ir::MirProjection<'db>) -> Place<'db> { - let mut path = place.projection.clone(); - path.push(proj); - Place::new(place.base, path) -} - -fn condition_to_i1( - fb: &mut sonatina_ir::builder::FunctionBuilder, - cond: ValueId, - is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, -) -> ValueId { - if fb.type_of(cond) == Type::I1 { - cond - } else { - let zero = fb.make_imm_value(I256::zero()); - fb.insert_inst(Ne::new(is, cond, zero), Type::I1) - } -} - -fn emit_evm_malloc_word_addr( - fb: &mut sonatina_ir::builder::FunctionBuilder, - size: ValueId, - is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, -) -> ValueId { - let ptr_ty = fb.ptr_type(Type::I8); - let ptr = fb.insert_inst(EvmMalloc::new(is, size), ptr_ty); - fb.insert_inst(PtrToInt::new(is, ptr, Type::I256), Type::I256) -} - -/// Lower a `ConstAggregate` by registering a global data section and using CODECOPY. -/// -/// Registers the constant bytes as a Sonatina global variable (data section), -/// then emits: malloc → symaddr → symsize → codecopy. This is the Sonatina -/// equivalent of Yul's datacopy/dataoffset/datasize pattern. -fn lower_const_aggregate( - ctx: &mut LowerCtx<'_, '_, C>, - data: &[u8], -) -> Result { - let gv_ref = if let Some(&existing) = ctx.const_data_globals.get(data) { - existing - } else { - // Build array initializer from raw bytes (each element is one byte) - let elems: Vec = data - .iter() - .map(|&b| GvInitializer::make_imm(Immediate::I8(b as i8))) - .collect(); - let array_init = GvInitializer::make_array(elems); - - // Register as a const global variable - let label = format!("__fe_const_data_{}", *ctx.data_global_counter); - *ctx.data_global_counter += 1; - let array_ty = ctx - .fb - .module_builder - .declare_array_type(Type::I8, data.len()); - let gv_data = GlobalVariableData::constant(label, array_ty, Linkage::Private, array_init); - let gv_ref = ctx.fb.module_builder.declare_gv(gv_data); - ctx.const_data_globals.insert(data.to_vec(), gv_ref); - ctx.data_globals.push(gv_ref); - gv_ref - }; - - // Emit: malloc + codecopy - let size_val = ctx.fb.make_imm_value(I256::from(data.len() as u64)); - let ptr = emit_evm_malloc_word_addr(ctx.fb, size_val, ctx.is); - let sym = SymbolRef::Global(gv_ref); - let code_offset = ctx - .fb - .insert_inst(SymAddr::new(ctx.is, sym.clone()), Type::I256); - let code_size = ctx.fb.insert_inst(SymSize::new(ctx.is, sym), Type::I256); - ctx.fb - .insert_inst_no_result(EvmCodeCopy::new(ctx.is, ptr, code_offset, code_size)); - - Ok(ptr) -} diff --git a/crates/codegen/src/sonatina/mod.rs b/crates/codegen/src/sonatina/mod.rs deleted file mode 100644 index eb4b767edf..0000000000 --- a/crates/codegen/src/sonatina/mod.rs +++ /dev/null @@ -1,1264 +0,0 @@ -//! Sonatina backend for direct EVM bytecode generation. -//! -//! This module translates Fe MIR to Sonatina IR, which is then compiled -//! to EVM bytecode without going through Yul/solc. - -mod lower; -mod tests; -mod types; - -use crate::{BackendError, OptLevel}; -use common::ingot::Ingot; -use driver::DriverDataBase; -use hir::hir_def::TopLevelMod; -use mir::{MirModule, layout, layout::TargetDataLayout, lower_ingot, lower_module}; -use rustc_hash::{FxHashMap, FxHashSet}; -use sonatina_ir::{ - BlockId, GlobalVariableRef, I256, Module, Signature, Type, ValueId, - builder::{ModuleBuilder, Variable}, - func_cursor::InstInserter, - inst::{control_flow::Call, evm::EvmStop}, - ir_writer::ModuleWriter, - isa::{Isa, evm::Evm}, - module::{FuncRef, ModuleCtx}, - object::{Directive, Embed, EmbedSymbol, Object, ObjectName, Section, SectionName, SectionRef}, -}; -use sonatina_triple::{Architecture, EvmVersion, OperatingSystem, TargetTriple, Vendor}; -use std::collections::BTreeMap; -pub use tests::{DebugOutputSink, SonatinaTestDebugConfig, emit_test_module_sonatina}; - -/// Error type for Sonatina lowering failures. -#[derive(Debug)] -pub enum LowerError { - /// MIR lowering failed. - MirLower(mir::MirLowerError), - /// Unsupported MIR construct. - Unsupported(String), - /// Internal error. - Internal(String), -} - -impl std::fmt::Display for LowerError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - LowerError::MirLower(e) => write!(f, "MIR lowering failed: {e}"), - LowerError::Unsupported(msg) => write!(f, "unsupported: {msg}"), - LowerError::Internal(msg) => write!(f, "internal error: {msg}"), - } - } -} - -impl std::error::Error for LowerError {} - -impl From for LowerError { - fn from(e: mir::MirLowerError) -> Self { - LowerError::MirLower(e) - } -} - -impl From for BackendError { - fn from(e: LowerError) -> Self { - BackendError::Sonatina(e.to_string()) - } -} - -/// Creates a Sonatina EVM ISA for the target. -pub(crate) fn create_evm_isa() -> Evm { - let triple = TargetTriple::new( - Architecture::Evm, - Vendor::Ethereum, - OperatingSystem::Evm(EvmVersion::Osaka), - ); - Evm::new(triple) -} - -/// Contract bytecode output produced by the Sonatina backend. -#[derive(Debug, Clone)] -pub struct SonatinaContractBytecode { - pub deploy: Vec, - pub runtime: Vec, -} - -pub(super) fn is_erased_runtime_ty( - db: &DriverDataBase, - target_layout: &TargetDataLayout, - ty: hir::analysis::ty::ty_def::TyId<'_>, -) -> bool { - layout::ty_size_bytes_in(db, target_layout, ty).is_some_and(|s| s == 0) -} - -#[derive(Debug, Clone)] -enum ContractObjectSelection { - PrimaryRootAndDeps, - RootAndDeps(String), - All, -} - -/// Compiles a Fe module to Sonatina IR. -pub fn compile_module( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - layout: TargetDataLayout, -) -> Result { - // Lower HIR to MIR - let mir_module = lower_module(db, top_mod)?; - - compile_mir_module( - db, - &mir_module, - layout, - ContractObjectSelection::PrimaryRootAndDeps, - ) -} - -fn compile_mir_module<'db>( - db: &'db DriverDataBase, - mir_module: &MirModule<'db>, - layout: TargetDataLayout, - selection: ContractObjectSelection, -) -> Result { - // Create Sonatina module - let isa = create_evm_isa(); - let ctx = ModuleCtx::new(&isa); - let module_builder = ModuleBuilder::new(ctx); - - // Create lowerer and process module - let mut lowerer = ModuleLowerer::new(db, module_builder, mir_module, &isa, layout, selection); - lowerer.lower()?; - - Ok(lowerer.finish()) -} - -/// Compiles a Fe module to Sonatina IR and returns the human-readable text representation. -/// -/// This is useful for snapshot testing and debugging the IR output. -pub fn emit_module_sonatina_ir( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, -) -> Result { - let layout = layout::EVM_LAYOUT; - let module = compile_module(db, top_mod, layout)?; - let mut writer = ModuleWriter::new(&module); - Ok(writer.dump_string()) -} - -/// Compiles a Fe module to optimized Sonatina IR and returns the human-readable text representation. -/// -/// Optimization level and contract selection match [`emit_module_sonatina_bytecode`]. -pub fn emit_module_sonatina_ir_optimized( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - opt_level: OptLevel, - contract: Option<&str>, -) -> Result { - let mir_module = lower_module(db, top_mod)?; - emit_mir_module_sonatina_ir_optimized(db, &mir_module, opt_level, contract) -} - -/// Compiles a Fe module to Sonatina IR and returns a validation report. -/// -/// This is intended for debugging malformed IR: it checks that every `ValueId` used as an operand -/// refers to a defining instruction that is still present in the function layout. -pub fn validate_module_sonatina_ir( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, -) -> Result { - let layout = layout::EVM_LAYOUT; - let module = compile_module(db, top_mod, layout)?; - Ok(validate_sonatina_module_layout(&module)) -} - -/// Compiles a Fe module to EVM bytecode using the Sonatina backend. -/// -/// When `contract` is `Some`, only that contract is compiled (along with any transitive contract -/// dependencies needed to resolve `code_region_offset/len`). When `None`, all contracts are -/// compiled. -pub fn emit_module_sonatina_bytecode( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - opt_level: OptLevel, - contract: Option<&str>, -) -> Result, LowerError> { - let mir_module = lower_module(db, top_mod)?; - emit_mir_module_sonatina_bytecode(db, &mir_module, opt_level, contract) -} - -/// Compiles an entire ingot (all source files) to EVM bytecode using the Sonatina backend. -/// -/// See [`emit_module_sonatina_bytecode`] for contract selection semantics. -pub fn emit_ingot_sonatina_bytecode( - db: &DriverDataBase, - ingot: Ingot<'_>, - opt_level: OptLevel, - contract: Option<&str>, -) -> Result, LowerError> { - let mir_module = lower_ingot(db, ingot)?; - emit_mir_module_sonatina_bytecode(db, &mir_module, opt_level, contract) -} - -fn emit_mir_module_sonatina_bytecode<'db>( - db: &'db DriverDataBase, - mir_module: &MirModule<'db>, - opt_level: OptLevel, - contract: Option<&str>, -) -> Result, LowerError> { - use sonatina_codegen::isa::evm::EvmBackend; - use sonatina_codegen::object::{CompileOptions, compile_object}; - - let (module, target_contracts) = - compile_mir_module_for_sonatina_output(db, mir_module, opt_level, contract)?; - - let isa = create_evm_isa(); - let backend = EvmBackend::new(isa); - let opts: CompileOptions<_> = CompileOptions::default(); - - let init_section_name = SectionName::from("init"); - let runtime_section_name = SectionName::from("runtime"); - - let mut out = BTreeMap::new(); - for contract_name in target_contracts { - let artifact = - compile_object(&module, &backend, &contract_name, &opts).map_err(|errors| { - let msg = errors - .iter() - .map(|e| format!("{:?}", e)) - .collect::>() - .join("; "); - LowerError::Internal(msg) - })?; - - let deploy = artifact - .sections - .get(&init_section_name) - .ok_or_else(|| { - LowerError::Internal(format!( - "compiled object `{contract_name}` has no init section" - )) - })? - .bytes - .clone(); - - let runtime = artifact - .sections - .get(&runtime_section_name) - .ok_or_else(|| { - LowerError::Internal(format!( - "compiled object `{contract_name}` has no runtime section" - )) - })? - .bytes - .clone(); - - out.insert(contract_name, SonatinaContractBytecode { deploy, runtime }); - } - - Ok(out) -} - -/// Compiles a lowered MIR module to optimized Sonatina IR. -pub fn emit_mir_module_sonatina_ir_optimized<'db>( - db: &'db DriverDataBase, - mir_module: &MirModule<'db>, - opt_level: OptLevel, - contract: Option<&str>, -) -> Result { - let (module, _) = compile_mir_module_for_sonatina_output(db, mir_module, opt_level, contract)?; - let mut writer = ModuleWriter::new(&module); - Ok(writer.dump_string()) -} - -fn compile_mir_module_for_sonatina_output<'db>( - db: &'db DriverDataBase, - mir_module: &MirModule<'db>, - opt_level: OptLevel, - contract: Option<&str>, -) -> Result<(Module, Vec), LowerError> { - use mir::analysis::build_contract_graph; - - let contract_graph = build_contract_graph(&mir_module.functions); - let mut contract_names: Vec = contract_graph.contracts.keys().cloned().collect(); - contract_names.sort(); - - if let Some(contract) = contract - && !contract_graph.contracts.contains_key(contract) - { - return Err(LowerError::Internal(format!( - "contract `{contract}` not found" - ))); - } - - let target_contracts: Vec = match contract { - Some(name) => vec![name.to_string()], - None => contract_names, - }; - - let selection = match contract { - Some(name) => ContractObjectSelection::RootAndDeps(name.to_string()), - None => ContractObjectSelection::All, - }; - - let mut module = compile_mir_module(db, mir_module, layout::EVM_LAYOUT, selection)?; - ensure_module_sonatina_ir_valid(&module)?; - - match opt_level { - OptLevel::O0 => {} - OptLevel::O1 => sonatina_codegen::optim::Pipeline::balanced().run(&mut module), - OptLevel::O2 => sonatina_codegen::optim::Pipeline::aggressive().run(&mut module), - } - if opt_level != OptLevel::O0 { - ensure_module_sonatina_ir_valid(&module)?; - } - - Ok((module, target_contracts)) -} - -pub(crate) fn ensure_module_sonatina_ir_valid(module: &Module) -> Result<(), LowerError> { - let report = validate_sonatina_module_layout(module); - if report.trim() == "ok" { - return Ok(()); - } - - Err(LowerError::Internal(format!( - "invalid Sonatina IR emitted by Fe:\n{report}" - ))) -} - -fn validate_sonatina_module_layout(module: &Module) -> String { - use std::fmt::Write as _; - - let mut out = String::new(); - let mut any = false; - - for func in module.funcs() { - let name = module.ctx.func_sig(func, |sig| sig.name().to_string()); - - let (dangling, total) = module.func_store.view(func, |function| { - use sonatina_ir::ir_writer::{FuncWriteCtx, IrWrite as _}; - - let write_inst = |inst: sonatina_ir::InstId| -> String { - let ctx = FuncWriteCtx::new(function, func); - let mut buf = Vec::new(); - let _ = inst.write(&mut buf, &ctx); - String::from_utf8_lossy(&buf).into_owned() - }; - - let mut total_operands: usize = 0; - let mut dangling_operands: Vec<( - ValueId, - sonatina_ir::InstId, - String, - sonatina_ir::InstId, - String, - )> = Vec::new(); - - for block in function.layout.iter_block() { - for inst in function.layout.iter_inst(block) { - let user_dbg = write_inst(inst); - function.dfg.inst(inst).for_each_value(&mut |operand| { - total_operands += 1; - let sonatina_ir::Value::Inst { inst: def_inst, .. } = - function.dfg.value(operand) - else { - return; - }; - if !function.layout.is_inst_inserted(*def_inst) { - let def_dbg = write_inst(*def_inst); - dangling_operands.push(( - operand, - *def_inst, - def_dbg, - inst, - user_dbg.clone(), - )); - } - }); - } - } - - (dangling_operands, total_operands) - }); - - if dangling.is_empty() { - continue; - } - any = true; - let _ = writeln!( - &mut out, - "=== {name} ===\ninvalid_operands: {}/{}\n", - dangling.len(), - total - ); - for (operand, def_inst, def_dbg, user_inst, user_dbg) in dangling { - let _ = writeln!( - &mut out, - "- operand={operand:?} def_inst={def_inst:?} def={def_dbg} used_by={user_inst:?} user={user_dbg}" - ); - } - out.push('\n'); - } - - if !any { - out.push_str("ok\n"); - } - out -} - -/// Lowers an entire MIR module to Sonatina IR. -struct ModuleLowerer<'db, 'a> { - db: &'db DriverDataBase, - builder: ModuleBuilder, - mir: &'a MirModule<'db>, - isa: &'a Evm, - target_layout: TargetDataLayout, - contract_selection: ContractObjectSelection, - /// Maps function indices to Sonatina function references. - func_map: FxHashMap, - /// Maps function symbol names to Sonatina function references. - name_map: FxHashMap, - /// Maps function symbol names to whether they return a value. - returns_value_map: FxHashMap, - /// Maps function symbol names to a parameter mask indicating which MIR arguments are - /// runtime-visible (not erased) and therefore must be passed on the EVM stack. - /// - /// The mask is in the same order as `param_locals` followed by `effect_param_locals`. - runtime_param_masks: FxHashMap>, - /// Indices of functions executed directly by the EVM (empty stack). - /// - /// These entry functions emit `evm_stop` instead of internal `Return`. - entry_func_idxs: FxHashSet, - /// Cache for Fe type → sonatina type mapping (GEP support). - gep_type_cache: FxHashMap>, - /// Counter for generating unique sonatina struct type names. - gep_name_counter: usize, - /// Global variables registered for constant aggregate data sections. - data_globals: Vec, - /// Data globals keyed by function symbol that introduced them. - /// - /// Used to scope section directives to region-reachable functions only. - data_globals_by_symbol: FxHashMap>, - /// Counter for generating unique data global names. - data_global_counter: usize, -} - -impl<'db, 'a> ModuleLowerer<'db, 'a> { - fn new( - db: &'db DriverDataBase, - builder: ModuleBuilder, - mir: &'a MirModule<'db>, - isa: &'a Evm, - target_layout: TargetDataLayout, - contract_selection: ContractObjectSelection, - ) -> Self { - Self { - db, - builder, - mir, - isa, - target_layout, - contract_selection, - func_map: FxHashMap::default(), - name_map: FxHashMap::default(), - returns_value_map: FxHashMap::default(), - runtime_param_masks: FxHashMap::default(), - entry_func_idxs: FxHashSet::default(), - gep_type_cache: FxHashMap::default(), - gep_name_counter: 0, - data_globals: Vec::new(), - data_globals_by_symbol: FxHashMap::default(), - data_global_counter: 0, - } - } - - /// Lower the entire module. - fn lower(&mut self) -> Result<(), LowerError> { - // First pass: declare runtime-relevant functions. - self.declare_functions()?; - - // Identify entry functions so lowering can emit evm_stop for entries. - self.identify_entry_functions()?; - - // Second pass: lower function bodies (populates data_globals). - self.lower_functions()?; - - // Third pass: create objects with data directives (needs data_globals). - self.create_objects()?; - - Ok(()) - } - - /// Consume the lowerer and return the built module. - fn finish(self) -> Module { - self.builder.build() - } - - /// Declare all functions in the module. - fn declare_functions(&mut self) -> Result<(), LowerError> { - for (idx, func) in self.mir.functions.iter().enumerate() { - if func.symbol_name.is_empty() { - continue; - } - let name = &func.symbol_name; - let (sig, mask) = self.lower_signature_and_mask(func)?; - - let func_ref = self.builder.declare_function(sig).map_err(|e| { - LowerError::Internal(format!("failed to declare function {name}: {e}")) - })?; - - self.func_map.insert(idx, func_ref); - self.name_map.insert(name.clone(), func_ref); - self.returns_value_map - .insert(name.clone(), func.returns_value); - self.runtime_param_masks.insert(name.clone(), mask); - } - Ok(()) - } - - /// Lower function signatures. - fn lower_signature_and_mask( - &self, - func: &mir::MirFunction<'db>, - ) -> Result<(Signature, Vec), LowerError> { - use mir::ir::{ContractFunctionKind, MirFunctionOrigin, SyntheticId}; - - let name = &func.symbol_name; - let linkage = match func.origin { - MirFunctionOrigin::Hir(hir_func) => { - if hir_func.vis(self.db).is_pub() { - sonatina_ir::Linkage::Public - } else { - sonatina_ir::Linkage::Private - } - } - MirFunctionOrigin::Synthetic(_) => sonatina_ir::Linkage::Private, - }; - - // Contract init/runtime entrypoints are executed directly by the EVM with an empty stack. - // Even though MIR models them as taking effect args (e.g. `StorPtr`), we cannot - // expose those as real EVM stack parameters at entry. - let is_contract_entry = func.contract_function.as_ref().is_some_and(|cf| { - matches!( - cf.kind, - ContractFunctionKind::Init | ContractFunctionKind::Runtime - ) - }) || matches!( - func.origin, - MirFunctionOrigin::Synthetic( - SyntheticId::ContractInitEntrypoint(_) | SyntheticId::ContractRuntimeEntrypoint(_) - ) - ); - - // Compute which MIR parameters are runtime-visible (stack words). - // Entry functions have no parameters since the EVM starts with an empty stack. - let mut mask = Vec::new(); - if is_contract_entry { - // Keep it empty; callers should never pass arguments to EVM entrypoints. - } else { - for local_id in func.body.param_locals.iter().copied() { - let local_ty = func - .body - .locals - .get(local_id.index()) - .ok_or_else(|| { - LowerError::Internal(format!("unknown param local: {local_id:?}")) - })? - .ty; - mask.push(!is_erased_runtime_ty( - self.db, - &self.target_layout, - local_ty, - )); - } - for local_id in func.body.effect_param_locals.iter().copied() { - let local_ty = func - .body - .locals - .get(local_id.index()) - .ok_or_else(|| { - LowerError::Internal(format!("unknown effect param local: {local_id:?}")) - })? - .ty; - mask.push(!is_erased_runtime_ty( - self.db, - &self.target_layout, - local_ty, - )); - } - } - - // Convert parameter types - all EVM parameters are 256-bit words. - let mut params = Vec::new(); - for keep in &mask { - if *keep { - params.push(types::word_type()); - } - } - - // Convert return type - use Unit if function doesn't return a value - let ret_ty = if func.returns_value { - types::word_type() // TODO: proper return type lowering - } else { - types::unit_type() - }; - - Ok((Signature::new(name, linkage, ¶ms, ret_ty), mask)) - } - - /// Lower all function bodies. - fn lower_functions(&mut self) -> Result<(), LowerError> { - for (idx, func) in self.mir.functions.iter().enumerate() { - let Some(&func_ref) = self.func_map.get(&idx) else { - continue; - }; - let is_entry = self.entry_func_idxs.contains(&idx); - self.lower_function(func_ref, func, is_entry)?; - } - Ok(()) - } - - /// Compute which contracts are needed for compilation: the primary contract - /// and its transitive dependencies. Returns `(primary_name, needed_set)`. - fn needed_contracts( - &self, - contract_graph: &mir::analysis::ContractGraph, - ) -> Result<(String, FxHashSet), LowerError> { - use mir::analysis::{ContractRegion, ContractRegionKind}; - use std::collections::VecDeque; - - let select_primary = || -> Result { - let mut referenced: FxHashSet = FxHashSet::default(); - for (from_region, deps) in &contract_graph.region_deps { - for dep in deps { - if dep.contract_name != from_region.contract_name { - referenced.insert(dep.contract_name.clone()); - } - } - } - let mut roots: Vec = contract_graph - .contracts - .keys() - .filter(|n| !referenced.contains(*n)) - .cloned() - .collect(); - roots.sort(); - roots - .into_iter() - .next() - .or_else(|| { - let mut names: Vec = contract_graph.contracts.keys().cloned().collect(); - names.sort(); - names.into_iter().next() - }) - .ok_or_else(|| { - LowerError::Internal("contract graph is unexpectedly empty".to_string()) - }) - }; - - let primary = match &self.contract_selection { - ContractObjectSelection::PrimaryRootAndDeps => select_primary()?, - ContractObjectSelection::RootAndDeps(root) => { - if !contract_graph.contracts.contains_key(root.as_str()) { - return Err(LowerError::Internal(format!("unknown contract `{root}`"))); - } - root.clone() - } - ContractObjectSelection::All => select_primary()?, - }; - - let needed: FxHashSet = match &self.contract_selection { - ContractObjectSelection::All => contract_graph.contracts.keys().cloned().collect(), - _ => { - let mut needed = FxHashSet::default(); - let mut queue = VecDeque::new(); - queue.push_back(primary.clone()); - while let Some(name) = queue.pop_front() { - if !needed.insert(name.clone()) { - continue; - } - for kind in [ContractRegionKind::Init, ContractRegionKind::Deployed] { - let region = ContractRegion { - contract_name: name.clone(), - kind, - }; - if let Some(deps) = contract_graph.region_deps.get(®ion) { - for dep in deps { - if dep.contract_name != name { - queue.push_back(dep.contract_name.clone()); - } - } - } - } - } - needed - } - }; - - Ok((primary, needed)) - } - - /// Identify which functions are contract entry points so their Return - /// terminators can be lowered as `evm_stop`. Must run before `lower_functions`. - fn identify_entry_functions(&mut self) -> Result<(), LowerError> { - use mir::analysis::build_contract_graph; - - let contract_graph = build_contract_graph(&self.mir.functions); - if contract_graph.contracts.is_empty() { - return Ok(()); - } - - let (_primary, needed_contracts) = self.needed_contracts(&contract_graph)?; - - let mut func_idx_by_symbol: FxHashMap<&str, usize> = FxHashMap::default(); - for (idx, func) in self.mir.functions.iter().enumerate() { - if self.func_map.contains_key(&idx) { - func_idx_by_symbol.insert(func.symbol_name.as_str(), idx); - } - } - - for (contract_name, info) in &contract_graph.contracts { - if !needed_contracts.contains(contract_name) { - continue; - } - if let Some(symbol) = info.deployed_symbol.as_deref() - && let Some(&idx) = func_idx_by_symbol.get(symbol) - { - self.entry_func_idxs.insert(idx); - } - if let Some(symbol) = info.init_symbol.as_deref() - && let Some(&idx) = func_idx_by_symbol.get(symbol) - { - self.entry_func_idxs.insert(idx); - } - } - - Ok(()) - } - - /// Create Sonatina objects for the module. - /// - /// Objects define how code is organized for compilation. Each object - /// has sections (like "runtime" and "init") that contain function entries. - /// - /// For contract runtime entrypoints: The entry function emits `evm_stop` instead of - /// internal `Return` since contract dispatchers handle return data via `evm_return`. - /// - /// For simple test files (no explicit contract): A wrapper function calls the entry - /// and then does `evm_stop`, preserving internal function call semantics. - fn create_objects(&mut self) -> Result<(), LowerError> { - use mir::analysis::build_contract_graph; - - let contract_graph = build_contract_graph(&self.mir.functions); - if !contract_graph.contracts.is_empty() { - return self.create_contract_objects(&contract_graph); - } - - // No contract annotations: fall back to compiling a single "main" entry. This is used by - // snapshot tests for simple files and debugging. - let Some((entry_idx, entry_mir_func)) = self - .mir - .functions - .iter() - .enumerate() - .find(|(idx, _)| self.func_map.contains_key(idx)) - else { - // No functions to compile - this is valid for empty modules. - return Ok(()); - }; - - let entry_ref = self.func_map[&entry_idx]; - let wrapper_ref = self.create_entry_wrapper(entry_ref, entry_mir_func)?; - let mut directives = vec![Directive::Entry(wrapper_ref)]; - for &gv in &self.data_globals { - directives.push(Directive::Data(gv)); - } - - let object = Object { - name: ObjectName::from("Contract"), - sections: vec![Section { - name: SectionName::from("runtime"), - directives, - }], - }; - - self.builder - .declare_object(object) - .map_err(|e| LowerError::Internal(format!("failed to declare object: {e}")))?; - - Ok(()) - } - - fn create_contract_objects( - &mut self, - contract_graph: &mir::analysis::ContractGraph, - ) -> Result<(), LowerError> { - use mir::analysis::{ContractRegion, ContractRegionKind}; - - let (primary_contract, needed_contracts) = self.needed_contracts(contract_graph)?; - let mut needed_contracts = needed_contracts; - - // Assign stable object names for each needed contract. - let mut contract_object_names: FxHashMap = FxHashMap::default(); - let mut ordered_contracts: Vec = needed_contracts.drain().collect(); - ordered_contracts.sort(); - for contract in &ordered_contracts { - let object_name = ObjectName::from(contract.clone()); - contract_object_names.insert(contract.clone(), object_name); - } - - // Emit the primary object first for readability, then all remaining contracts. - ordered_contracts.retain(|c| c != &primary_contract); - ordered_contracts.insert(0, primary_contract.clone()); - - for contract_name in ordered_contracts { - let object_name = contract_object_names - .get(&contract_name) - .cloned() - .ok_or_else(|| { - LowerError::Internal(format!("missing object name for `{contract_name}`")) - })?; - - let Some(info) = contract_graph.contracts.get(&contract_name) else { - return Err(LowerError::Internal(format!( - "missing contract info for `{contract_name}`" - ))); - }; - - let init_section_name = SectionName::from("init"); - let runtime_section_name = SectionName::from("runtime"); - - let mut sections = Vec::new(); - - let runtime_symbol = info.deployed_symbol.as_deref(); - if let Some(runtime_symbol) = runtime_symbol { - let runtime_ref = *self.name_map.get(runtime_symbol).ok_or_else(|| { - LowerError::Internal(format!( - "unknown contract runtime entrypoint symbol: `{runtime_symbol}`" - )) - })?; - let region = ContractRegion { - contract_name: contract_name.clone(), - kind: ContractRegionKind::Deployed, - }; - let deps = contract_graph - .region_deps - .get(®ion) - .cloned() - .unwrap_or_default(); - let mut directives = vec![Directive::Entry(runtime_ref)]; - for gv in self.reachable_data_globals_for_region(contract_graph, ®ion) { - directives.push(Directive::Data(gv)); - } - directives.extend(Self::build_embed_directives( - &contract_name, - ContractRegionKind::Deployed, - &deps, - &contract_object_names, - contract_graph, - &init_section_name, - &runtime_section_name, - )?); - - sections.push(Section { - name: runtime_section_name.clone(), - directives, - }); - } - - if let Some(init_symbol) = info.init_symbol.as_deref() { - let init_ref = *self.name_map.get(init_symbol).ok_or_else(|| { - LowerError::Internal(format!( - "unknown contract init entrypoint symbol: `{init_symbol}`" - )) - })?; - let region = ContractRegion { - contract_name: contract_name.clone(), - kind: ContractRegionKind::Init, - }; - let mut deps = contract_graph - .region_deps - .get(®ion) - .cloned() - .unwrap_or_default(); - - // The init section must embed the runtime section so `code_region_offset/len` - // for the runtime root can be lowered via `symaddr/symsize`. - if info.deployed_symbol.is_some() { - deps.insert(ContractRegion { - contract_name: contract_name.clone(), - kind: ContractRegionKind::Deployed, - }); - } - - let mut directives = vec![Directive::Entry(init_ref)]; - for gv in self.reachable_data_globals_for_region(contract_graph, ®ion) { - directives.push(Directive::Data(gv)); - } - directives.extend(Self::build_embed_directives( - &contract_name, - ContractRegionKind::Init, - &deps, - &contract_object_names, - contract_graph, - &init_section_name, - &runtime_section_name, - )?); - - sections.push(Section { - name: init_section_name, - directives, - }); - } - - // Ensure section order is stable (init before runtime). - sections.sort_by(|a, b| a.name.0.cmp(&b.name.0)); - - self.builder - .declare_object(Object { - name: object_name, - sections, - }) - .map_err(|e| LowerError::Internal(format!("failed to declare object: {e}")))?; - } - - Ok(()) - } - - /// Collects constant-data globals used by functions reachable from `region`. - fn reachable_data_globals_for_region( - &self, - contract_graph: &mir::analysis::ContractGraph, - region: &mir::analysis::ContractRegion, - ) -> Vec { - let Some(reachable_symbols) = contract_graph.region_reachable.get(region) else { - return Vec::new(); - }; - - let mut symbols: Vec<_> = reachable_symbols.iter().cloned().collect(); - symbols.sort(); - - let mut globals = Vec::new(); - let mut seen = FxHashSet::default(); - for symbol in symbols { - if let Some(symbol_globals) = self.data_globals_by_symbol.get(&symbol) { - for &gv in symbol_globals { - if seen.insert(gv) { - globals.push(gv); - } - } - } - } - globals - } - - fn build_embed_directives( - current_contract: &str, - current_kind: mir::analysis::ContractRegionKind, - deps: &FxHashSet, - contract_object_names: &FxHashMap, - contract_graph: &mir::analysis::ContractGraph, - init_section_name: &SectionName, - runtime_section_name: &SectionName, - ) -> Result, LowerError> { - use mir::analysis::{ContractRegion, ContractRegionKind}; - - let mut deps: Vec = deps.iter().cloned().collect(); - deps.sort(); - deps.dedup(); - - let mut directives = Vec::new(); - for dep in deps { - if dep.contract_name == current_contract && dep.kind == current_kind { - continue; - } - - let Some(dep_info) = contract_graph.contracts.get(&dep.contract_name) else { - return Err(LowerError::Internal(format!( - "code region dep refers to unknown contract `{}`", - dep.contract_name - ))); - }; - - let (dep_symbol, dep_section) = match dep.kind { - ContractRegionKind::Init => ( - dep_info.init_symbol.as_ref().ok_or_else(|| { - LowerError::Internal(format!( - "contract `{}` has no init entrypoint symbol", - dep.contract_name - )) - })?, - init_section_name.clone(), - ), - ContractRegionKind::Deployed => ( - dep_info.deployed_symbol.as_ref().ok_or_else(|| { - LowerError::Internal(format!( - "contract `{}` has no runtime entrypoint symbol", - dep.contract_name - )) - })?, - runtime_section_name.clone(), - ), - }; - - let source = if dep.contract_name == current_contract { - SectionRef::Local(dep_section) - } else { - let object = contract_object_names - .get(&dep.contract_name) - .cloned() - .ok_or_else(|| { - LowerError::Internal(format!( - "missing object name for dependent contract `{}`", - dep.contract_name - )) - })?; - SectionRef::External { - object, - section: dep_section, - } - }; - - directives.push(Directive::Embed(Embed { - source, - as_symbol: EmbedSymbol::from(dep_symbol.clone()), - })); - } - - Ok(directives) - } - - /// Create a wrapper entrypoint for simple test files (non-contract modules). - /// - /// The wrapper calls the actual entry function and then halts with `evm_stop`. - /// This is needed because the entry function uses internal `Return` which requires - /// a return address on the stack (pushed by `Call`). - fn create_entry_wrapper( - &mut self, - entry_ref: FuncRef, - entry_mir_func: &mir::MirFunction<'db>, - ) -> Result { - const WRAPPER_NAME: &str = "__fe_sonatina_entry"; - if self.name_map.contains_key(WRAPPER_NAME) { - return Err(LowerError::Internal(format!( - "entry wrapper name collision: `{WRAPPER_NAME}`" - ))); - } - - let sig = Signature::new( - WRAPPER_NAME, - sonatina_ir::Linkage::Public, - &[], - types::unit_type(), - ); - let func_ref = self.builder.declare_function(sig).map_err(|e| { - LowerError::Internal(format!( - "failed to declare entry wrapper `{WRAPPER_NAME}`: {e}" - )) - })?; - - let mut fb = self.builder.func_builder::(func_ref); - let is = self.isa.inst_set(); - - let entry_block = fb.append_block(); - fb.switch_to_block(entry_block); - - // Pass zero for all arguments (regular + effect params). Test entry functions - // generally don't use effect params meaningfully. - let argc = entry_mir_func - .body - .param_locals - .iter() - .chain(entry_mir_func.body.effect_param_locals.iter()) - .copied() - .filter(|local_id| { - let local_ty = entry_mir_func - .body - .locals - .get(local_id.index()) - .map(|l| l.ty); - let Some(local_ty) = local_ty else { - return true; - }; - !is_erased_runtime_ty(self.db, &self.target_layout, local_ty) - }) - .count(); - let mut args = Vec::with_capacity(argc); - for _ in 0..argc { - args.push(fb.make_imm_value(I256::zero())); - } - - let call_inst = Call::new(is, entry_ref, args.into()); - if entry_mir_func.returns_value { - let _ = fb.insert_inst(call_inst, types::word_type()); - } else { - fb.insert_inst_no_result(call_inst); - } - - fb.insert_inst_no_result(EvmStop::new(is)); - fb.seal_all(); - fb.finish(); - - Ok(func_ref) - } - - /// Lower a single function body. - /// - /// If `is_entry` is true, this is the entry function executed directly by the EVM. - /// Entry functions emit `evm_stop` instead of internal `Return` for their terminators. - fn lower_function( - &mut self, - func_ref: FuncRef, - func: &mir::MirFunction<'db>, - is_entry: bool, - ) -> Result<(), LowerError> { - let data_globals_before = self.data_globals.len(); - - let mut fb = self.builder.func_builder::(func_ref); - let is = self.isa.inst_set(); - - // Maps MIR block IDs to Sonatina block IDs - let mut block_map: FxHashMap = FxHashMap::default(); - - // Maps MIR local IDs to Sonatina SSA variables. - let mut local_vars: FxHashMap = FxHashMap::default(); - for (idx, _local) in func.body.locals.iter().enumerate() { - let local_id = mir::LocalId(idx as u32); - let var = fb.declare_var(types::word_type()); - local_vars.insert(local_id, var); - } - - // Create blocks - for (idx, _block) in func.body.blocks.iter().enumerate() { - let block_id = mir::BasicBlockId(idx as u32); - let sonatina_block = fb.append_block(); - block_map.insert(block_id, sonatina_block); - } - - // Get the entry block and its Sonatina equivalent. - // Sonatina's Layout::append_block sets `entry_block` to the first block appended, - // so the iteration order above (MIR block 0 first) guarantees the entry is correct. - let entry_block = func.body.entry; - let sonatina_entry = block_map[&entry_block]; - - // Map function arguments to parameter locals (regular params + effect params). - fb.switch_to_block(sonatina_entry); - let all_param_locals: Vec<_> = func - .body - .param_locals - .iter() - .chain(func.body.effect_param_locals.iter()) - .copied() - .collect(); - - if is_entry { - // Entry functions have no Sonatina parameters (EVM starts with empty stack). - // Initialize all param locals to zero - effect params are erased at runtime - // and regular params shouldn't exist for entry functions. - for local_id in all_param_locals { - let var = local_vars.get(&local_id).copied().ok_or_else(|| { - LowerError::Internal(format!( - "missing SSA variable for param local {local_id:?}" - )) - })?; - let zero = fb.make_imm_value(I256::zero()); - fb.def_var(var, zero); - } - } else { - // Non-entry functions: map actual arguments to param locals. - let args = fb.args().to_vec(); - let mut arg_iter = args.into_iter(); - let zero = fb.make_imm_value(I256::zero()); - for local_id in all_param_locals { - let var = local_vars.get(&local_id).copied().ok_or_else(|| { - LowerError::Internal(format!( - "missing SSA variable for param local {local_id:?}" - )) - })?; - - let local_ty = func - .body - .locals - .get(local_id.index()) - .ok_or_else(|| { - LowerError::Internal(format!("unknown param local: {local_id:?}")) - })? - .ty; - if is_erased_runtime_ty(self.db, &self.target_layout, local_ty) { - fb.def_var(var, zero); - continue; - } - - let arg_val = arg_iter.next().unwrap_or(zero); - fb.def_var(var, arg_val); - } - } - - { - let mut const_data_globals = FxHashMap::default(); - let mut ctx = LowerCtx { - fb: &mut fb, - db: self.db, - target_layout: &self.target_layout, - body: &func.body, - local_vars: &local_vars, - name_map: &self.name_map, - returns_value_map: &self.returns_value_map, - runtime_param_masks: &self.runtime_param_masks, - block_map: &block_map, - is, - is_entry, - gep_type_cache: &mut self.gep_type_cache, - gep_name_counter: &mut self.gep_name_counter, - data_globals: &mut self.data_globals, - data_global_counter: &mut self.data_global_counter, - const_data_globals: &mut const_data_globals, - }; - - for (idx, block) in ctx.body.blocks.iter().enumerate() { - let block_id = mir::BasicBlockId(idx as u32); - let sonatina_block = ctx.block_map[&block_id]; - ctx.fb.switch_to_block(sonatina_block); - - for inst in block.insts.iter() { - lower::lower_instruction(&mut ctx, inst)?; - } - - lower::lower_terminator(&mut ctx, &block.terminator)?; - } - - ctx.fb.seal_all(); - } - fb.finish(); - - if self.data_globals.len() > data_globals_before { - self.data_globals_by_symbol.insert( - func.symbol_name.clone(), - self.data_globals[data_globals_before..].to_vec(), - ); - } - - Ok(()) - } -} -/// Shared context threaded through all lowering functions. -pub(super) struct LowerCtx<'a, 'db, C: sonatina_ir::func_cursor::FuncCursor> { - pub(super) fb: &'a mut sonatina_ir::builder::FunctionBuilder, - pub(super) db: &'db DriverDataBase, - pub(super) target_layout: &'a TargetDataLayout, - pub(super) body: &'a mir::MirBody<'db>, - pub(super) local_vars: &'a FxHashMap, - pub(super) name_map: &'a FxHashMap, - pub(super) returns_value_map: &'a FxHashMap, - pub(super) runtime_param_masks: &'a FxHashMap>, - pub(super) block_map: &'a FxHashMap, - pub(super) is: &'a sonatina_ir::inst::evm::inst_set::EvmInstSet, - pub(super) is_entry: bool, - /// Cache for Fe type → sonatina type mapping (GEP support). - pub(super) gep_type_cache: &'a mut FxHashMap>, - /// Counter for generating unique sonatina struct type names. - pub(super) gep_name_counter: &'a mut usize, - /// Collected global variable refs for constant aggregate data sections. - pub(super) data_globals: &'a mut Vec, - /// Counter for generating unique data global names. - pub(super) data_global_counter: &'a mut usize, - /// Per-function dedupe for constant aggregate payloads. - pub(super) const_data_globals: &'a mut FxHashMap, GlobalVariableRef>, -} diff --git a/crates/codegen/src/sonatina/tests.rs b/crates/codegen/src/sonatina/tests.rs deleted file mode 100644 index 1b332a31b1..0000000000 --- a/crates/codegen/src/sonatina/tests.rs +++ /dev/null @@ -1,1078 +0,0 @@ -use driver::DriverDataBase; -use hir::hir_def::{ItemKind, TopLevelMod}; -use mir::analysis::{CallGraph, build_call_graph, reachable_functions}; -use mir::{ - MirFunction, MirInst, Rvalue, - ir::{IntrinsicOp, MirFunctionOrigin}, - layout, lower_ingot, -}; -use rustc_hash::{FxHashMap, FxHashSet}; -use sonatina_codegen::{ - domtree::DomTree, - isa::evm::EvmBackend, - liveness::Liveness, - machinst::lower::{LowerBackend, SectionLoweringCtx}, - object::{CompileOptions, ObjectArtifact, SymbolId, compile_all_objects}, - stackalloc::StackifyBuilder, -}; -use sonatina_ir::{ - I256, Module, Signature, Type, - builder::ModuleBuilder, - cfg::ControlFlowGraph, - func_cursor::InstInserter, - inst::{control_flow::Call, evm::EvmStop}, - ir_writer::{FuncWriteCtx, FunctionSignature, IrWrite}, - isa::Isa, - module::{FuncRef, ModuleCtx}, - object::{Directive, Embed, EmbedSymbol, Object, ObjectName, Section, SectionName, SectionRef}, -}; -use sonatina_verifier::{VerificationLevel, VerifierConfig}; -use std::io::Write as _; - -use crate::{ExpectedRevert, OptLevel, TestMetadata, TestModuleOutput}; - -use super::{ContractObjectSelection, LowerError, ModuleLowerer}; - -#[derive(Debug, Clone)] -pub struct SonatinaTestDebugConfig { - pub symtab_output: Option, - pub evm_debug_output: Option, - pub emit_observability: bool, - pub runtime_byte_offsets: Vec, - pub stackify_reach_depth: u8, -} - -impl Default for SonatinaTestDebugConfig { - fn default() -> Self { - Self { - symtab_output: None, - evm_debug_output: None, - emit_observability: false, - runtime_byte_offsets: Vec::new(), - stackify_reach_depth: 16, - } - } -} - -#[derive(Debug, Clone)] -pub struct DebugOutputSink { - pub path: Option, - pub write_stderr: bool, -} - -impl Default for DebugOutputSink { - fn default() -> Self { - Self { - path: None, - write_stderr: true, - } - } -} - -pub fn emit_test_module_sonatina( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - opt_level: OptLevel, - debug: &SonatinaTestDebugConfig, -) -> Result { - let ingot = top_mod.ingot(db); - let mir_module = lower_ingot(db, ingot)?; - let tests = collect_tests(db, &mir_module.functions); - - if tests.is_empty() { - return Ok(TestModuleOutput { tests: Vec::new() }); - } - - let call_graph = build_call_graph(&mir_module.functions); - let funcs_by_symbol = build_funcs_by_symbol(&mir_module.functions); - - let code_region_roots = collect_code_region_roots(&mir_module.functions); - let code_region_sections = code_region_roots - .iter() - .map(|sym| (sym.clone(), code_region_section_name(sym))) - .collect::>(); - - // Validate roots exist in the lowered module. - for root in &code_region_roots { - if !funcs_by_symbol.contains_key(root.as_str()) { - return Err(LowerError::Internal(format!( - "code region root `{root}` has no MIR function" - ))); - } - } - - // Precompute region reachability + region deps (for nested embeds). - let mut region_reachable: FxHashMap> = FxHashMap::default(); - let mut region_deps: FxHashMap> = FxHashMap::default(); - for root in &code_region_roots { - let reachable = reachable_functions(&call_graph, root); - let deps = collect_code_region_deps(&reachable, &funcs_by_symbol); - region_reachable.insert(root.clone(), reachable); - region_deps.insert(root.clone(), deps); - } - - // Detect cycles among region embeds early (Sonatina's embed mechanism expands bytes). - detect_code_region_cycles(®ion_deps)?; - - let mut module = compile_test_objects( - db, - &mir_module, - &tests, - &call_graph, - &funcs_by_symbol, - &code_region_roots, - &code_region_sections, - ®ion_reachable, - ®ion_deps, - )?; - super::ensure_module_sonatina_ir_valid(&module)?; - run_sonatina_optimization_pipeline(&mut module, opt_level); - super::ensure_module_sonatina_ir_valid(&module)?; - - // Compile all objects at once to avoid repeated prepare_section mutations - // on shared functions. compile_all_objects builds a single section cache - // so each function is lowered exactly once. - let all_artifacts = compile_all_objects_for_tests(&module, debug)?; - - let mut output_tests = Vec::with_capacity(tests.len()); - for test in tests { - let runtime = - extract_runtime_from_artifact(&module, &all_artifacts, &test.object_name, debug)?; - let init_bytecode = wrap_as_init_code(&runtime.bytes); - - output_tests.push(TestMetadata { - display_name: test.display_name, - hir_name: test.hir_name, - symbol_name: test.symbol_name, - object_name: test.object_name, - yul: String::new(), - bytecode: init_bytecode, - sonatina_observability_text: runtime.observability_text, - sonatina_observability_json: runtime.observability_json, - value_param_count: test.value_param_count, - effect_param_count: test.effect_param_count, - expected_revert: test.expected_revert.clone(), - }); - } - - Ok(TestModuleOutput { - tests: output_tests, - }) -} - -fn run_sonatina_optimization_pipeline(module: &mut Module, opt_level: OptLevel) { - match opt_level { - OptLevel::O0 => { /* no optimization */ } - OptLevel::O1 => sonatina_codegen::optim::Pipeline::balanced().run(module), - OptLevel::O2 => sonatina_codegen::optim::Pipeline::aggressive().run(module), - } -} - -#[derive(Debug, Clone)] -struct TestInfo { - hir_name: String, - display_name: String, - symbol_name: String, - object_name: String, - value_param_count: usize, - effect_param_count: usize, - expected_revert: Option, -} - -fn collect_tests(db: &DriverDataBase, functions: &[MirFunction<'_>]) -> Vec { - let mut tests: Vec = functions - .iter() - .filter_map(|mir_func| { - let MirFunctionOrigin::Hir(hir_func) = mir_func.origin else { - return None; - }; - let attrs = ItemKind::from(hir_func).attrs(db)?; - let test_attr = attrs.get_attr(db, "test")?; - - let expected_revert = if test_attr.has_arg(db, "should_revert") { - Some(ExpectedRevert::Any) - } else { - None - }; - - let hir_name = hir_func - .name(db) - .to_opt() - .map(|n| n.data(db).to_string()) - .unwrap_or_else(|| "".to_string()); - let value_param_count = mir_func.body.param_locals.len(); - let effect_param_count = mir_func.body.effect_param_locals.len(); - Some(TestInfo { - hir_name, - display_name: String::new(), - symbol_name: mir_func.symbol_name.clone(), - object_name: String::new(), - value_param_count, - effect_param_count, - expected_revert, - }) - }) - .collect(); - - assign_test_display_names(&mut tests); - assign_test_object_names(&mut tests); - tests -} - -fn assign_test_display_names(tests: &mut [TestInfo]) { - let mut name_counts: FxHashMap = FxHashMap::default(); - for test in tests.iter() { - *name_counts.entry(test.hir_name.clone()).or_insert(0) += 1; - } - for test in tests.iter_mut() { - let count = name_counts.get(&test.hir_name).copied().unwrap_or(0); - if count > 1 { - test.display_name = format!("{} [{}]", test.hir_name, test.symbol_name); - } else { - test.display_name = test.hir_name.clone(); - } - } -} - -fn assign_test_object_names(tests: &mut [TestInfo]) { - let mut groups: FxHashMap> = FxHashMap::default(); - for (idx, test) in tests.iter().enumerate() { - let base = format!("test_{}", sanitize_symbol(&test.display_name)); - groups.entry(base).or_default().push(idx); - } - for (base, mut indices) in groups { - if indices.len() == 1 { - let idx = indices[0]; - tests[idx].object_name = base; - continue; - } - indices.sort_by(|a, b| tests[*a].display_name.cmp(&tests[*b].display_name)); - for (suffix, idx) in indices.into_iter().enumerate() { - tests[idx].object_name = format!("{base}_{}", suffix + 1); - } - } -} - -fn sanitize_symbol(component: &str) -> String { - component - .chars() - .map(|ch| if ch.is_ascii_alphanumeric() { ch } else { '_' }) - .collect() -} - -fn build_funcs_by_symbol<'a>( - functions: &'a [MirFunction<'a>], -) -> FxHashMap<&'a str, &'a MirFunction<'a>> { - functions - .iter() - .map(|func| (func.symbol_name.as_str(), func)) - .collect() -} - -fn runtime_argc(db: &DriverDataBase, func: &MirFunction<'_>) -> usize { - func.body - .param_locals - .iter() - .chain(func.body.effect_param_locals.iter()) - .copied() - .filter(|local_id| { - let local_ty = func.body.locals.get(local_id.index()).map(|l| l.ty); - let Some(local_ty) = local_ty else { - return true; - }; - layout::ty_size_bytes_in(db, &layout::EVM_LAYOUT, local_ty).is_none_or(|s| s != 0) - }) - .count() -} - -fn collect_code_region_roots(functions: &[MirFunction<'_>]) -> Vec { - let mut roots = FxHashSet::default(); - for func in functions { - if func.contract_function.is_some() { - roots.insert(func.symbol_name.clone()); - } - for block in &func.body.blocks { - for inst in &block.insts { - let MirInst::Assign { - rvalue: - Rvalue::Intrinsic { - op: IntrinsicOp::CodeRegionOffset | IntrinsicOp::CodeRegionLen, - args, - }, - .. - } = inst - else { - continue; - }; - let Some(arg) = args.first().copied() else { - continue; - }; - let mir::ValueOrigin::FuncItem(target) = &func.body.value(arg).origin else { - continue; - }; - let Some(symbol) = &target.symbol else { - continue; - }; - roots.insert(symbol.clone()); - } - } - } - let mut out: Vec<_> = roots.into_iter().collect(); - out.sort(); - out -} - -fn collect_code_region_deps( - reachable: &FxHashSet, - funcs_by_symbol: &FxHashMap<&str, &MirFunction<'_>>, -) -> FxHashSet { - let mut deps = FxHashSet::default(); - for symbol in reachable { - let Some(func) = funcs_by_symbol.get(symbol.as_str()).copied() else { - continue; - }; - for block in &func.body.blocks { - for inst in &block.insts { - let MirInst::Assign { - rvalue: - Rvalue::Intrinsic { - op: IntrinsicOp::CodeRegionOffset | IntrinsicOp::CodeRegionLen, - args, - }, - .. - } = inst - else { - continue; - }; - let Some(arg) = args.first().copied() else { - continue; - }; - let mir::ValueOrigin::FuncItem(target) = &func.body.value(arg).origin else { - continue; - }; - let Some(target_symbol) = &target.symbol else { - continue; - }; - deps.insert(target_symbol.clone()); - } - } - } - deps -} - -fn detect_code_region_cycles( - graph: &FxHashMap>, -) -> Result<(), LowerError> { - #[derive(Clone, Copy, PartialEq, Eq)] - enum Mark { - Visiting, - Visited, - } - - fn dfs( - node: &str, - graph: &FxHashMap>, - marks: &mut FxHashMap, - stack: &mut Vec, - ) -> Result<(), LowerError> { - match marks.get(node).copied() { - Some(Mark::Visited) => return Ok(()), - Some(Mark::Visiting) => { - let start = stack.iter().position(|n| n == node).unwrap_or(0); - let mut cycle = stack[start..].to_vec(); - cycle.push(node.to_string()); - return Err(LowerError::Unsupported(format!( - "cycle detected in code region graph: {}", - cycle.join(" -> ") - ))); - } - None => {} - } - - marks.insert(node.to_string(), Mark::Visiting); - stack.push(node.to_string()); - if let Some(deps) = graph.get(node) { - let mut deps: Vec = deps.iter().cloned().collect(); - deps.sort(); - for dep in deps { - if dep == node { - continue; - } - dfs(&dep, graph, marks, stack)?; - } - } - stack.pop(); - marks.insert(node.to_string(), Mark::Visited); - Ok(()) - } - - let mut marks = FxHashMap::default(); - let mut stack = Vec::new(); - let mut nodes: Vec = graph.keys().cloned().collect(); - nodes.sort(); - for node in nodes { - dfs(&node, graph, &mut marks, &mut stack)?; - } - Ok(()) -} - -fn code_region_section_name(symbol: &str) -> SectionName { - SectionName::from(format!("code_region_{}", sanitize_symbol(symbol))) -} - -#[allow(clippy::too_many_arguments)] -fn compile_test_objects( - db: &DriverDataBase, - mir_module: &mir::MirModule<'_>, - tests: &[TestInfo], - call_graph: &CallGraph, - funcs_by_symbol: &FxHashMap<&str, &MirFunction<'_>>, - code_region_roots: &[String], - code_region_sections: &FxHashMap, - region_reachable: &FxHashMap>, - region_deps: &FxHashMap>, -) -> Result { - let isa = super::create_evm_isa(); - let ctx = ModuleCtx::new(&isa); - let builder = ModuleBuilder::new(ctx); - - let mut lowerer = ModuleLowerer::new( - db, - builder, - mir_module, - &isa, - layout::EVM_LAYOUT, - ContractObjectSelection::All, - ); - lowerer.declare_all_functions_for_tests()?; - - let code_regions_object = create_code_regions_object( - &mut lowerer, - funcs_by_symbol, - code_region_roots, - code_region_sections, - region_reachable, - region_deps, - )?; - lowerer - .builder - .declare_object(code_regions_object) - .map_err(|e| LowerError::Internal(format!("failed to declare CodeRegions object: {e}")))?; - - for test in tests { - let object = create_test_object( - &mut lowerer, - funcs_by_symbol, - call_graph, - test, - code_region_sections, - )?; - lowerer.builder.declare_object(object).map_err(|e| { - LowerError::Internal(format!( - "failed to declare test object `{}`: {e}", - test.object_name - )) - })?; - } - - lowerer.lower_functions()?; - Ok(lowerer.finish()) -} - -fn create_code_regions_object( - lowerer: &mut ModuleLowerer<'_, '_>, - funcs_by_symbol: &FxHashMap<&str, &MirFunction<'_>>, - code_region_roots: &[String], - code_region_sections: &FxHashMap, - _region_reachable: &FxHashMap>, - region_deps: &FxHashMap>, -) -> Result { - let object_name = ObjectName::from("CodeRegions"); - let mut sections = Vec::with_capacity(code_region_roots.len()); - - for root in code_region_roots { - let Some(&root_func) = funcs_by_symbol.get(root.as_str()) else { - return Err(LowerError::Internal(format!( - "missing MIR function for code region root `{root}`" - ))); - }; - let root_ref = *lowerer - .name_map - .get(root) - .ok_or_else(|| LowerError::Internal(format!("unknown function: {root}")))?; - - let wrapper_name = format!("__fe_sonatina_code_region_entry_{}", sanitize_symbol(root)); - let argc = runtime_argc(lowerer.db, root_func); - let wrapper_ref = lowerer.create_call_and_stop_wrapper( - &wrapper_name, - root_ref, - argc, - root_func.returns_value, - )?; - - let section_name = code_region_sections - .get(root) - .cloned() - .ok_or_else(|| LowerError::Internal(format!("missing section name for `{root}`")))?; - - let mut directives = vec![Directive::Entry(wrapper_ref), Directive::Include(root_ref)]; - - let deps = region_deps.get(root).cloned().unwrap_or_default(); - let mut deps: Vec = deps.into_iter().collect(); - deps.sort(); - for dep in deps { - if dep == *root { - continue; - } - let dep_section = code_region_sections.get(&dep).cloned().ok_or_else(|| { - LowerError::Internal(format!( - "code region `{root}` depends on `{dep}`, but `{dep}` is not a known region root" - )) - })?; - directives.push(Directive::Embed(Embed { - source: SectionRef::Local(dep_section), - as_symbol: EmbedSymbol::from(dep), - })); - } - - sections.push(Section { - name: section_name, - directives, - }); - } - - Ok(Object { - name: object_name, - sections, - }) -} - -fn create_test_object( - lowerer: &mut ModuleLowerer<'_, '_>, - funcs_by_symbol: &FxHashMap<&str, &MirFunction<'_>>, - call_graph: &CallGraph, - test: &TestInfo, - code_region_sections: &FxHashMap, -) -> Result { - let Some(&test_func) = funcs_by_symbol.get(test.symbol_name.as_str()) else { - return Err(LowerError::Internal(format!( - "missing MIR function for test `{}`", - test.symbol_name - ))); - }; - - let test_ref = *lowerer - .name_map - .get(&test.symbol_name) - .ok_or_else(|| LowerError::Internal(format!("unknown function: {}", test.symbol_name)))?; - - let wrapper_name = format!("__fe_sonatina_test_entry_{}", test.object_name); - let argc = runtime_argc(lowerer.db, test_func); - let wrapper_ref = lowerer.create_call_and_stop_wrapper( - &wrapper_name, - test_ref, - argc, - test_func.returns_value, - )?; - - let reachable = reachable_functions(call_graph, &test.symbol_name); - let deps = collect_code_region_deps(&reachable, funcs_by_symbol); - - let mut directives = vec![Directive::Entry(wrapper_ref), Directive::Include(test_ref)]; - - let code_regions_obj = ObjectName::from("CodeRegions"); - let mut deps: Vec = deps.into_iter().collect(); - deps.sort(); - for dep in deps { - let dep_section = code_region_sections.get(&dep).cloned().ok_or_else(|| { - LowerError::Internal(format!( - "test `{}` depends on code region `{dep}`, but `{dep}` is not a known region root", - test.symbol_name - )) - })?; - directives.push(Directive::Embed(Embed { - source: SectionRef::External { - object: code_regions_obj.clone(), - section: dep_section, - }, - as_symbol: EmbedSymbol::from(dep), - })); - } - - Ok(Object { - name: ObjectName::from(test.object_name.clone()), - sections: vec![Section { - name: SectionName::from("runtime"), - directives, - }], - }) -} - -impl<'db, 'a> ModuleLowerer<'db, 'a> { - fn declare_all_functions_for_tests(&mut self) -> Result<(), LowerError> { - for (idx, func) in self.mir.functions.iter().enumerate() { - if func.symbol_name.is_empty() { - continue; - } - - let name = &func.symbol_name; - let linkage = sonatina_ir::Linkage::Public; - - let mut params = Vec::new(); - let mut mask = Vec::new(); - for local_id in func.body.param_locals.iter().copied() { - let local_ty = func - .body - .locals - .get(local_id.index()) - .ok_or_else(|| { - LowerError::Internal(format!("unknown param local: {local_id:?}")) - })? - .ty; - if layout::ty_size_bytes_in(self.db, &layout::EVM_LAYOUT, local_ty) - .is_some_and(|s| s == 0) - { - mask.push(false); - continue; - } - mask.push(true); - params.push(super::types::word_type()); - } - for local_id in func.body.effect_param_locals.iter().copied() { - let local_ty = func - .body - .locals - .get(local_id.index()) - .ok_or_else(|| { - LowerError::Internal(format!("unknown effect param local: {local_id:?}")) - })? - .ty; - if layout::ty_size_bytes_in(self.db, &layout::EVM_LAYOUT, local_ty) - .is_some_and(|s| s == 0) - { - mask.push(false); - continue; - } - mask.push(true); - params.push(super::types::word_type()); - } - - let ret_ty = if func.returns_value { - super::types::word_type() - } else { - super::types::unit_type() - }; - - let sig = Signature::new(name, linkage, ¶ms, ret_ty); - let func_ref = self.builder.declare_function(sig).map_err(|e| { - LowerError::Internal(format!("failed to declare function {name}: {e}")) - })?; - - self.func_map.insert(idx, func_ref); - self.name_map.insert(name.clone(), func_ref); - self.returns_value_map - .insert(name.clone(), func.returns_value); - self.runtime_param_masks.insert(name.clone(), mask); - } - Ok(()) - } - - fn create_call_and_stop_wrapper( - &mut self, - wrapper_name: &str, - callee_ref: sonatina_ir::module::FuncRef, - callee_argc: usize, - callee_returns_value: bool, - ) -> Result { - if self.name_map.contains_key(wrapper_name) { - return Err(LowerError::Internal(format!( - "wrapper name collision: `{wrapper_name}`" - ))); - } - - let sig = Signature::new( - wrapper_name, - sonatina_ir::Linkage::Public, - &[], - super::types::unit_type(), - ); - let func_ref = self.builder.declare_function(sig).map_err(|e| { - LowerError::Internal(format!("failed to declare wrapper `{wrapper_name}`: {e}")) - })?; - - let mut fb = self.builder.func_builder::(func_ref); - let is = self.isa.inst_set(); - - let entry_block = fb.append_block(); - fb.switch_to_block(entry_block); - - let mut args = Vec::with_capacity(callee_argc); - for _ in 0..callee_argc { - args.push(fb.make_imm_value(I256::zero())); - } - - let call_inst = Call::new(is, callee_ref, args.into()); - if callee_returns_value { - let _ = fb.insert_inst(call_inst, Type::I256); - } else { - fb.insert_inst_no_result(call_inst); - } - - fb.insert_inst_no_result(EvmStop::new(is)); - fb.seal_all(); - fb.finish(); - - Ok(func_ref) - } -} - -struct RuntimeCompileOutput { - bytes: Vec, - observability_text: Option, - observability_json: Option, -} - -/// Compile all objects in the module at once so that shared functions are -/// lowered exactly once (avoiding accumulated mutations from repeated -/// `prepare_section` calls). -fn compile_all_objects_for_tests( - module: &Module, - debug: &SonatinaTestDebugConfig, -) -> Result, LowerError> { - let isa = super::create_evm_isa(); - let backend = EvmBackend::new(isa); - - let mut opts: CompileOptions<_> = CompileOptions::default(); - let mut verifier_cfg = VerifierConfig::for_level(VerificationLevel::Full); - verifier_cfg.allow_detached_entities = true; - opts.verifier_cfg = verifier_cfg; - opts.emit_observability = debug.emit_observability; - - compile_all_objects(module, &backend, &opts).map_err(|errors| { - let msg = errors - .iter() - .map(|e| format!("{:?}", e)) - .collect::>() - .join("; "); - LowerError::Internal(msg) - }) -} - -/// Extract the runtime section for a specific object from pre-compiled artifacts. -fn extract_runtime_from_artifact( - module: &Module, - all_artifacts: &[ObjectArtifact], - object_name: &str, - debug: &SonatinaTestDebugConfig, -) -> Result { - let artifact = all_artifacts - .iter() - .find(|a| a.object.0.as_str() == object_name) - .ok_or_else(|| { - LowerError::Internal(format!( - "compiled object `{object_name}` not found in artifacts" - )) - })?; - - let section_name = SectionName::from("runtime"); - let runtime_section = artifact.sections.get(§ion_name).ok_or_else(|| { - LowerError::Internal(format!( - "compiled object `{object_name}` has no runtime section" - )) - })?; - - let mut runtime_funcs: Vec<(u32, FuncRef)> = Vec::new(); - for (sym, def) in &runtime_section.symtab { - if let SymbolId::Func(func_ref) = sym { - runtime_funcs.push((def.offset, *func_ref)); - } - } - runtime_funcs.sort_by_key(|(offset, _)| *offset); - let mut ordered_runtime_funcs = Vec::with_capacity(runtime_funcs.len()); - let mut seen_runtime_funcs: FxHashSet = FxHashSet::default(); - for (_, func_ref) in runtime_funcs { - if seen_runtime_funcs.insert(func_ref) { - ordered_runtime_funcs.push(func_ref); - } - } - - if let Some(sink) = &debug.symtab_output { - let mut defs: Vec<(u32, u32, String)> = Vec::new(); - for (sym, def) in &runtime_section.symtab { - let name = match sym { - SymbolId::Func(func_ref) => { - module.ctx.func_sig(*func_ref, |sig| sig.name().to_string()) - } - SymbolId::Global(gv) => format!("{gv:?}"), - SymbolId::Embed(embed) => format!("&{}", embed.0.as_str()), - SymbolId::CurrentSection => "".to_string(), - }; - defs.push((def.offset, def.size, name)); - } - defs.sort_by_key(|(offset, _, _)| *offset); - - let mut out = String::new(); - out.push_str(&format!( - "SONATINA SYMTAB object={object_name} section=runtime bytes={}\n", - runtime_section.bytes.len() - )); - for (offset, size, name) in defs { - out.push_str(&format!(" off={offset:>6} size={size:>6} {name}\n")); - } - emit_debug_output(sink, &out); - } - - if let Some(sink) = &debug.evm_debug_output - && let Err(err) = - emit_runtime_evm_debug(module, object_name, &ordered_runtime_funcs, debug, sink) - { - tracing::warn!("failed to write Sonatina EVM debug output for `{object_name}`: {err}",); - } - - for &offset in &debug.runtime_byte_offsets { - match runtime_section.bytes.get(offset) { - Some(byte) => tracing::debug!( - "SONATINA BYTE object={object_name} section=runtime off={offset} byte=0x{byte:02x}" - ), - None => tracing::warn!( - "SONATINA BYTE object={object_name} section=runtime off={offset} (out of bounds, len={})", - runtime_section.bytes.len() - ), - } - } - - let observability_text = artifact.observability_text(); - let observability_json = artifact.observability_json(); - - Ok(RuntimeCompileOutput { - bytes: runtime_section.bytes.clone(), - observability_text, - observability_json, - }) -} - -fn emit_runtime_evm_debug( - module: &Module, - object_name: &str, - funcs: &[FuncRef], - debug: &SonatinaTestDebugConfig, - sink: &DebugOutputSink, -) -> Result<(), LowerError> { - let (object_name_ref, section_name, embed_symbols) = - runtime_section_lowering_inputs(module, object_name)?; - if funcs.is_empty() { - return Err(LowerError::Internal(format!( - "runtime section for `{object_name}` has no lowered functions in compiled artifact" - ))); - } - - let isa = super::create_evm_isa(); - let backend = EvmBackend::new(isa); - - let section_ctx = SectionLoweringCtx { - object: &object_name_ref, - section: §ion_name, - embed_symbols: &embed_symbols, - }; - backend.prepare_section(module, funcs, §ion_ctx); - - let mut out = Vec::new(); - writeln!( - &mut out, - "SONATINA EVM DEBUG object={} section={}", - object_name_ref.0.as_str(), - section_name.0.as_str(), - ) - .unwrap(); - writeln!(&mut out).unwrap(); - - for &func in funcs { - let lowered = backend - .lower_function(module, func, §ion_ctx) - .map_err(|err| { - let func_name = module.ctx.func_sig(func, |sig| sig.name().to_string()); - LowerError::Internal(format!( - "failed to lower `{func_name}` for Sonatina EVM debug output: {err}" - )) - })?; - - let reach_depth = debug.stackify_reach_depth.clamp(1, 16); - let (stackify_dump, lowered_dump) = - module - .func_store - .view(func, |function| -> Result<(String, String), LowerError> { - let mut cfg = ControlFlowGraph::new(); - cfg.compute(function); - - let mut liveness = Liveness::new(); - liveness.compute(function, &cfg); - let mut dom = DomTree::new(); - dom.compute(&cfg); - - let (_alloc, stackify_trace) = - StackifyBuilder::new(function, &cfg, &dom, &liveness, reach_depth) - .compute_with_trace(); - - let ctx = FuncWriteCtx::new(function, func); - - let mut stackify_buf = Vec::new(); - write!(&mut stackify_buf, "// ").unwrap(); - FunctionSignature - .write(&mut stackify_buf, &ctx) - .map_err(|err| { - LowerError::Internal(format!( - "failed to render stackify signature for `{object_name}`: {err}" - )) - })?; - writeln!(&mut stackify_buf).unwrap(); - writeln!(&mut stackify_buf, "{stackify_trace}").unwrap(); - - let mut lowered_buf = Vec::new(); - lowered.vcode.write(&mut lowered_buf, &ctx).map_err(|err| { - LowerError::Internal(format!( - "failed to render lowered EVM vcode for `{object_name}`: {err}" - )) - })?; - writeln!(&mut lowered_buf).unwrap(); - - let stackify_dump = String::from_utf8(stackify_buf).map_err(|err| { - LowerError::Internal(format!( - "invalid UTF-8 while rendering stackify trace for `{object_name}`: {err}" - )) - })?; - let lowered_dump = String::from_utf8(lowered_buf).map_err(|err| { - LowerError::Internal(format!( - "invalid UTF-8 while rendering lowered EVM vcode for `{object_name}`: {err}" - )) - })?; - - Ok((stackify_dump, lowered_dump)) - })?; - - out.extend_from_slice(stackify_dump.as_bytes()); - out.extend_from_slice(lowered_dump.as_bytes()); - } - - let rendered = String::from_utf8(out).map_err(|err| { - LowerError::Internal(format!( - "invalid UTF-8 while rendering Sonatina EVM debug output for `{object_name}`: {err}" - )) - })?; - emit_debug_output(sink, &rendered); - - Ok(()) -} - -fn runtime_section_lowering_inputs( - module: &Module, - object_name: &str, -) -> Result<(ObjectName, SectionName, Vec), LowerError> { - let Some(object) = module.objects.get(object_name) else { - return Err(LowerError::Internal(format!( - "missing Sonatina object `{object_name}` while preparing EVM debug output" - ))); - }; - - let Some(runtime_section) = object - .sections - .iter() - .find(|section| section.name.0.as_str() == "runtime") - else { - return Err(LowerError::Internal(format!( - "object `{object_name}` has no runtime section while preparing EVM debug output" - ))); - }; - - let mut embed_symbols = Vec::new(); - for directive in &runtime_section.directives { - match directive { - Directive::Entry(_) | Directive::Include(_) => {} - Directive::Embed(embed) => embed_symbols.push(embed.as_symbol.clone()), - Directive::Data(_) => {} - } - } - - Ok(( - object.name.clone(), - runtime_section.name.clone(), - embed_symbols, - )) -} - -fn emit_debug_output(sink: &DebugOutputSink, contents: &str) { - if let Some(path) = &sink.path { - match std::fs::OpenOptions::new() - .create(true) - .append(true) - .open(path) - .and_then(|mut f| f.write_all(contents.as_bytes())) - { - Ok(()) => {} - Err(err) => { - tracing::error!( - "failed to write Sonatina debug output `{}`: {err}", - path.display() - ); - tracing::debug!("{contents}"); - return; - } - } - } - - if sink.write_stderr { - tracing::debug!("{contents}"); - } -} - -fn wrap_as_init_code(runtime: &[u8]) -> Vec { - // Minimal initcode: - // CODECOPY(0, , ) - // RETURN(0, ) - // with the runtime appended after the init. - // - // PUSHn - // PUSH2 - // PUSH1 0 - // CODECOPY - // PUSHn - // PUSH1 0 - // RETURN - fn push_u256(mut value: usize) -> Vec { - let mut bytes = Vec::new(); - while value > 0 { - bytes.push((value & 0xff) as u8); - value >>= 8; - } - if bytes.is_empty() { - bytes.push(0); - } - bytes.reverse(); - let n = bytes.len(); - debug_assert!((1..=32).contains(&n)); - let opcode = 0x5f + (n as u8); - let mut out = Vec::with_capacity(1 + n); - out.push(opcode); - out.extend(bytes); - out - } - - let len_push = push_u256(runtime.len()); - - let mut init = Vec::with_capacity(32 + runtime.len()); - init.extend(len_push.clone()); - init.push(0x61); // PUSH2 - let off_pos = init.len(); - init.extend([0u8, 0u8]); // filled in later - init.extend([0x60, 0x00]); // PUSH1 0 - init.push(0x39); // CODECOPY - init.extend(len_push); - init.extend([0x60, 0x00]); // PUSH1 0 - init.push(0xf3); // RETURN - - let off = init.len(); - init[off_pos] = ((off >> 8) & 0xff) as u8; - init[off_pos + 1] = (off & 0xff) as u8; - - init.extend_from_slice(runtime); - init -} diff --git a/crates/codegen/src/sonatina/types.rs b/crates/codegen/src/sonatina/types.rs deleted file mode 100644 index f3cd820c0a..0000000000 --- a/crates/codegen/src/sonatina/types.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! Type mapping from Fe MIR to Sonatina IR types. - -use sonatina_ir::Type; - -/// Returns the Sonatina type for an EVM word (256 bits). -pub fn word_type() -> Type { - Type::I256 -} - -/// Returns the unit type (for functions returning nothing). -pub fn unit_type() -> Type { - Type::Unit -} diff --git a/crates/codegen/src/yul/doc.rs b/crates/codegen/src/yul/doc.rs deleted file mode 100644 index 0e8a0d0446..0000000000 --- a/crates/codegen/src/yul/doc.rs +++ /dev/null @@ -1,62 +0,0 @@ -/// Simple document tree used to build readable Yul output with indentation. -#[derive(Clone)] -pub(super) enum YulDoc { - /// Single line of text. - Line(String), - /// Block with standard indentation (used for most control flow constructs). - Block { caption: String, body: Vec }, - /// Block whose contents need wider indentation (useful for `switch case` formatting). - WideBlock { caption: String, body: Vec }, -} - -impl YulDoc { - /// Convenience helper for creating a `Line`. - pub(super) fn line(text: impl Into) -> Self { - YulDoc::Line(text.into()) - } - - /// Convenience helper for creating a `Block`. - pub(super) fn block(caption: impl Into, body: Vec) -> Self { - YulDoc::Block { - caption: caption.into(), - body, - } - } - - /// Convenience helper for creating a `WideBlock`. - pub(super) fn wide_block(caption: impl Into, body: Vec) -> Self { - YulDoc::WideBlock { - caption: caption.into(), - body, - } - } -} - -/// Recursively renders a YulDoc tree into formatted lines with the requested indentation. -pub(super) fn render_docs(nodes: &[YulDoc], indent: usize, out: &mut Vec) { - for node in nodes { - match node { - YulDoc::Line(text) => { - if text.is_empty() { - out.push(String::new()); - } else { - out.push(format!("{}{}", " ".repeat(indent), text)); - } - } - YulDoc::Block { caption, body } => { - let indent_str = " ".repeat(indent); - out.push(format!("{}{caption}{{", indent_str)); - render_docs(body, indent + 2, out); - out.push(format!("{}{}", indent_str, "}")); - } - YulDoc::WideBlock { caption, body } => { - let indent_str = " ".repeat(indent); - out.push(format!("{}{caption}{{", indent_str)); - render_docs(body, indent + 4, out); - // maintain the leading spaces that were in caption - let close_pad: String = caption.chars().take_while(|c| c.is_whitespace()).collect(); - out.push(format!("{}{}{}", indent_str, close_pad, "}")); - } - } - } -} diff --git a/crates/codegen/src/yul/emitter/control_flow.rs b/crates/codegen/src/yul/emitter/control_flow.rs deleted file mode 100644 index 769cb36537..0000000000 --- a/crates/codegen/src/yul/emitter/control_flow.rs +++ /dev/null @@ -1,667 +0,0 @@ -//! Helpers for lowering MIR control-flow constructs into Yul blocks. - -use mir::{ - BasicBlockId, LoopInfo, Terminator, ValueId, - ir::{IntrinsicValue, SwitchTarget, SwitchValue}, -}; -use rustc_hash::{FxHashMap, FxHashSet}; - -use crate::yul::{ - doc::{YulDoc, render_docs}, - errors::YulError, - state::BlockState, -}; - -use super::function::FunctionEmitter; - -/// Captures the `break`/`continue` destinations for loop lowering. -#[derive(Clone, Copy)] -pub(super) struct LoopEmitCtx { - continue_target: BasicBlockId, - break_target: BasicBlockId, - implicit_continue: Option, -} - -/// Shared mutable context passed through control-flow helpers. -pub(super) struct BlockEmitCtx<'state, 'docs, 'stop> { - pub(super) loop_ctx: Option, - pub(super) state: &'state mut BlockState, - pub(super) docs: &'docs mut Vec, - pub(super) stop_blocks: &'stop [BasicBlockId], -} - -impl<'state, 'docs, 'stop> BlockEmitCtx<'state, 'docs, 'stop> { - /// Convenience helper for cloning the block state. - fn cloned_state(&self) -> BlockState { - self.state.clone() - } -} - -impl<'db> FunctionEmitter<'db> { - /// Returns true when `block` is used as loop-control target for the active loop. - fn is_loop_control_target(&self, loop_ctx: Option, block: BasicBlockId) -> bool { - loop_ctx.is_some_and(|loop_ctx| { - block == loop_ctx.break_target - || block == loop_ctx.continue_target - || loop_ctx.implicit_continue == Some(block) - }) - } - - /// Emits the Yul docs for a basic block starting without any active loop context. - /// - /// * `block_id` - Entry block to render. - /// * `state` - Current SSA-like binding state. - /// - /// Returns the rendered statements for the block. - pub(super) fn emit_block( - &mut self, - block_id: BasicBlockId, - state: &mut BlockState, - ) -> Result, YulError> { - self.emit_block_internal(block_id, None, state, &[]) - } - - /// Core implementation shared by the various block emitters. - /// - /// * `block_id` - Entry block. - /// * `loop_ctx` - Optional surrounding loop context. - /// * `state` - Current binding state. - /// * `stop_blocks` - Blocks to skip. - /// - /// Returns the rendered statements produced while traversing the block. - fn emit_block_internal( - &mut self, - block_id: BasicBlockId, - loop_ctx: Option, - state: &mut BlockState, - stop_blocks: &[BasicBlockId], - ) -> Result, YulError> { - if stop_blocks.contains(&block_id) { - return Ok(Vec::new()); - } - let block = self - .mir_func - .body - .blocks - .get(block_id.index()) - .ok_or_else(|| YulError::Unsupported("invalid block".into()))?; - - let mut docs = self.render_statements(&block.insts, state)?; - { - let mut ctx = BlockEmitCtx { - loop_ctx, - state, - docs: &mut docs, - stop_blocks, - }; - self.emit_block_terminator(block_id, &block.terminator, &mut ctx)?; - } - Ok(docs) - } - - /// Renders the control-flow terminator for a block after its linear statements. - /// - /// * `block_id` - Current block emitting statements. - /// * `terminator` - MIR terminator describing the outgoing control flow. - /// * `ctx` - Shared mutable context spanning the block's docs and bindings. - fn emit_block_terminator( - &mut self, - block_id: BasicBlockId, - terminator: &Terminator<'db>, - ctx: &mut BlockEmitCtx<'_, '_, '_>, - ) -> Result<(), YulError> { - match terminator { - Terminator::Return { - value: Some(val), .. - } => { - self.emit_return_with_value(*val, ctx.docs, ctx.state)?; - ctx.docs.push(YulDoc::line("leave")); - Ok(()) - } - Terminator::Return { value: None, .. } => { - if self.returns_value() { - ctx.docs.push(YulDoc::line("ret := 0")); - } - ctx.docs.push(YulDoc::line("leave")); - Ok(()) - } - Terminator::TerminatingCall { call, .. } => match call { - mir::TerminatingCall::Call(call) => { - let call_expr = self.lower_call_value(call, ctx.state)?; - ctx.docs.push(YulDoc::line(call_expr)); - Ok(()) - } - mir::TerminatingCall::Intrinsic { op, args } => { - let intr = IntrinsicValue { - op: *op, - args: args.clone(), - }; - if let Some(doc) = self.lower_intrinsic_stmt(&intr, ctx.state)? { - ctx.docs.push(doc); - Ok(()) - } else { - Err(YulError::Unsupported( - "terminating intrinsic must be statement-like".into(), - )) - } - } - }, - Terminator::Branch { - cond, - then_bb, - else_bb, - .. - } => self.emit_branch_terminator(*cond, *then_bb, *else_bb, ctx), - Terminator::Switch { - discr, - targets, - default, - .. - } => self.emit_switch_terminator(block_id, *discr, targets, *default, ctx), - Terminator::Goto { target, .. } => self.emit_goto_terminator(block_id, *target, ctx), - Terminator::Unreachable { .. } => Ok(()), - } - } - - /// Emits a return terminator. When the function has no return value, this merely - /// evaluates the expression for side effects. - /// - /// * `value_id` - MIR value selected by the `return` terminator. - /// * `docs` - Doc list collecting emitted statements. - /// * `state` - Binding table used when lowering the return expression. - /// - /// Returns an error if the return value could not be lowered. - fn emit_return_with_value( - &mut self, - value_id: ValueId, - docs: &mut Vec, - state: &mut BlockState, - ) -> Result<(), YulError> { - if !self.returns_value() { - return Ok(()); - } - let expr = self.lower_value(value_id, state)?; - docs.push(YulDoc::line(format!("ret := {expr}"))); - Ok(()) - } - - /// Lowers an `if cond -> then else` branch terminator into Yul conditionals. - /// - /// * `cond` - MIR value representing the branch predicate. - /// * `then_bb` / `else_bb` - Successor blocks for each branch. - /// * `ctx` - Shared block context containing loop metadata and bindings. - fn emit_branch_terminator( - &mut self, - cond: ValueId, - then_bb: BasicBlockId, - else_bb: BasicBlockId, - ctx: &mut BlockEmitCtx<'_, '_, '_>, - ) -> Result<(), YulError> { - let cond_expr = self.lower_value(cond, ctx.state)?; - let cond_temp = ctx.state.alloc_local(); - ctx.docs - .push(YulDoc::line(format!("let {cond_temp} := {cond_expr}"))); - let loop_ctx = ctx.loop_ctx; - let then_term = &self - .mir_func - .body - .blocks - .get(then_bb.index()) - .ok_or_else(|| YulError::Unsupported("invalid then block".into()))? - .terminator; - let else_term = &self - .mir_func - .body - .blocks - .get(else_bb.index()) - .ok_or_else(|| YulError::Unsupported("invalid else block".into()))? - .terminator; - - let then_target = match then_term { - Terminator::Goto { target, .. } => Some(*target), - _ => None, - }; - let else_target = match else_term { - Terminator::Goto { target, .. } => Some(*target), - _ => None, - }; - - // Common patterns: - // - if-without-else: then -> goto else_bb, else_bb is the join. - // - if/else: then -> goto join, else -> goto join. - let mut join = if then_target == Some(else_bb) { - Some(else_bb) - } else if else_target == Some(then_bb) { - Some(then_bb) - } else if then_target.is_some_and(|then| else_target == Some(then)) { - then_target - } else { - None - }; - if join.is_some_and(|join| self.is_loop_control_target(loop_ctx, join)) { - join = None; - } - let emit_false_branch = !(join == Some(else_bb) && then_target == Some(else_bb)); - - let then_exits = - join != Some(then_bb) && matches!(then_term, Terminator::TerminatingCall { .. }); - let else_exits = - join != Some(else_bb) && matches!(else_term, Terminator::TerminatingCall { .. }); - - let mut then_state = ctx.cloned_state(); - let mut else_state = ctx.cloned_state(); - let mut branch_stops = ctx.stop_blocks.to_vec(); - if let Some(join) = join - && !branch_stops.contains(&join) - { - branch_stops.push(join); - } - if emit_false_branch && (then_exits || else_exits) { - if then_exits { - let then_docs = - self.emit_block_internal(then_bb, loop_ctx, &mut then_state, &branch_stops)?; - ctx.docs - .push(YulDoc::block(format!("if {cond_temp} "), then_docs)); - - let fallthrough_docs = - self.emit_block_internal(else_bb, loop_ctx, ctx.state, ctx.stop_blocks)?; - ctx.docs.extend(fallthrough_docs); - return Ok(()); - } - - let else_docs = - self.emit_block_internal(else_bb, loop_ctx, &mut else_state, &branch_stops)?; - ctx.docs - .push(YulDoc::block(format!("if iszero({cond_temp}) "), else_docs)); - - let fallthrough_docs = - self.emit_block_internal(then_bb, loop_ctx, ctx.state, ctx.stop_blocks)?; - ctx.docs.extend(fallthrough_docs); - return Ok(()); - } - - let then_docs = - self.emit_block_internal(then_bb, loop_ctx, &mut then_state, &branch_stops)?; - ctx.docs - .push(YulDoc::block(format!("if {cond_temp} "), then_docs)); - if emit_false_branch { - let else_docs = - self.emit_block_internal(else_bb, loop_ctx, &mut else_state, &branch_stops)?; - ctx.docs - .push(YulDoc::block(format!("if iszero({cond_temp}) "), else_docs)); - } - - if let Some(join) = join - && !ctx.stop_blocks.contains(&join) - { - let join_docs = self.emit_block_internal(join, loop_ctx, ctx.state, ctx.stop_blocks)?; - ctx.docs.extend(join_docs); - } - Ok(()) - } - - /// Emits a `switch` terminator. - /// - /// * `discr` - MIR value containing the discriminant expression. - /// * `targets` - All concrete switch targets. - /// * `default` - Default target block. - /// * `ctx` - Shared block context reused across successor emission. - fn emit_switch_terminator( - &mut self, - block_id: BasicBlockId, - discr: ValueId, - targets: &[SwitchTarget], - default: BasicBlockId, - ctx: &mut BlockEmitCtx<'_, '_, '_>, - ) -> Result<(), YulError> { - let discr_expr = self.lower_value(discr, ctx.state)?; - let mut join = self.switch_join_candidate(block_id, ctx.stop_blocks); - if join.is_some_and(|join| self.is_loop_control_target(ctx.loop_ctx, join)) { - join = None; - } - let mut switch_stops = ctx.stop_blocks.to_vec(); - if let Some(join) = join - && !switch_stops.contains(&join) - { - switch_stops.push(join); - } - - ctx.docs.push(YulDoc::line(format!("switch {discr_expr}"))); - let loop_ctx = ctx.loop_ctx; - - for target in targets { - let mut case_state = ctx.cloned_state(); - let literal = switch_value_literal(&target.value); - let case_docs = - self.emit_block_internal(target.block, loop_ctx, &mut case_state, &switch_stops)?; - ctx.docs - .push(YulDoc::wide_block(format!(" case {literal} "), case_docs)); - } - - let mut default_state = ctx.cloned_state(); - let default_docs = - self.emit_block_internal(default, loop_ctx, &mut default_state, &switch_stops)?; - ctx.docs - .push(YulDoc::wide_block(" default ", default_docs)); - - if let Some(join) = join - && !ctx.stop_blocks.contains(&join) - { - let join_docs = self.emit_block_internal(join, loop_ctx, ctx.state, ctx.stop_blocks)?; - ctx.docs.extend(join_docs); - } - Ok(()) - } - - fn switch_join_candidate( - &self, - root: BasicBlockId, - stop_blocks: &[BasicBlockId], - ) -> Option { - if let Some(join) = self.ipdom(root) - && !stop_blocks.contains(&join) - { - return Some(join); - } - - let mut visited: FxHashSet = FxHashSet::default(); - let mut stack = vec![root]; - let mut goto_targets: FxHashMap = FxHashMap::default(); - - while let Some(block_id) = stack.pop() { - if stop_blocks.contains(&block_id) || !visited.insert(block_id) { - continue; - } - - let Some(block) = self.mir_func.body.blocks.get(block_id.index()) else { - continue; - }; - - match &block.terminator { - Terminator::Goto { target, .. } => { - if stop_blocks.contains(target) - || self.mir_func.body.loop_headers.contains_key(target) - { - continue; - } - *goto_targets.entry(*target).or_default() += 1; - } - Terminator::Branch { - then_bb, else_bb, .. - } => { - stack.push(*then_bb); - stack.push(*else_bb); - } - Terminator::Switch { - targets, default, .. - } => { - stack.extend(targets.iter().map(|target| target.block)); - stack.push(*default); - } - Terminator::Return { .. } - | Terminator::TerminatingCall { .. } - | Terminator::Unreachable { .. } => {} - } - } - - if goto_targets.len() == 1 { - return goto_targets.keys().next().copied(); - } - - goto_targets - .into_iter() - .max_by_key(|(_, count)| *count) - .and_then(|(block, count)| (count >= 2).then_some(block)) - } - - /// Handles `goto` terminators, translating loop jumps into `break`/`continue` - /// and recursively emitting successor blocks otherwise. - /// - /// * `block_id` - Current block index (used for implicit continues). - /// * `target` - Destination block selected by the `goto`. - /// * `ctx` - Shared context holding the current bindings and docs. - fn emit_goto_terminator( - &mut self, - block_id: BasicBlockId, - target: BasicBlockId, - ctx: &mut BlockEmitCtx<'_, '_, '_>, - ) -> Result<(), YulError> { - if ctx.stop_blocks.contains(&target) { - return Ok(()); - } - if let Some(loop_ctx) = ctx.loop_ctx { - if target == loop_ctx.continue_target { - if loop_ctx.implicit_continue == Some(block_id) { - return Ok(()); - } - ctx.docs.push(YulDoc::line("continue")); - return Ok(()); - } - if target == loop_ctx.break_target { - ctx.docs.push(YulDoc::line("break")); - return Ok(()); - } - } - - if let Some(loop_info) = self.loop_info(target) { - let mut loop_state = ctx.cloned_state(); - let (loop_doc, exit_block) = - self.emit_loop(target, loop_info, &mut loop_state, ctx.stop_blocks)?; - ctx.docs.push(loop_doc); - let after_docs = - self.emit_block_internal(exit_block, ctx.loop_ctx, ctx.state, ctx.stop_blocks)?; - ctx.docs.extend(after_docs); - return Ok(()); - } - let next_docs = - self.emit_block_internal(target, ctx.loop_ctx, ctx.state, ctx.stop_blocks)?; - ctx.docs.extend(next_docs); - Ok(()) - } - - /// Looks up metadata about the loop that starts at `header`, if it exists. - /// Fetches MIR loop metadata for the requested header block. - /// - /// * `header` - Loop header to query. - /// - /// Returns the associated [`LoopInfo`] when the MIR builder recorded one. - fn loop_info(&self, header: BasicBlockId) -> Option { - self.mir_func.body.loop_headers.get(&header).copied() - } - - /// Emits a Yul `for` loop for the given header block and returns the exit block. - /// - /// * `header` - Loop header block chosen by MIR. - /// * `info` - Loop metadata describing body/backedge/exit blocks. - /// * `state` - Mutable binding state used while rendering body and exit. - /// - /// Returns the loop doc plus the block ID that execution continues at after the loop exits. - fn emit_loop( - &mut self, - header: BasicBlockId, - info: LoopInfo, - state: &mut BlockState, - stop_blocks: &[BasicBlockId], - ) -> Result<(YulDoc, BasicBlockId), YulError> { - fn docs_inline(docs: &[YulDoc]) -> String { - let mut lines = Vec::new(); - render_docs(docs, 0, &mut lines); - lines - .into_iter() - .map(|line| line.trim().to_string()) - .filter(|line| !line.is_empty()) - .collect::>() - .join(" ") - } - - let block = self - .mir_func - .body - .blocks - .get(header.index()) - .ok_or_else(|| YulError::Unsupported("invalid loop header".into()))?; - let branch_header = match block.terminator { - Terminator::Branch { - cond, - then_bb, - else_bb, - .. - } => Some((cond, then_bb, else_bb)), - _ => None, - }; - - // Init block: - // - Prefer dedicated init_block when present. - // - For for-like loops with explicit post blocks, fall back to header statements. - // - For while-like loops (no post block), keep init empty and evaluate header in-loop. - let header_docs = self.render_statements(&block.insts, state)?; - let init_block_str = if let Some(init_bb) = info.init_block { - let init_block_data = self - .mir_func - .body - .blocks - .get(init_bb.index()) - .ok_or_else(|| YulError::Unsupported("invalid init block".into()))?; - let init_docs = self.render_statements(&init_block_data.insts, state)?; - let init_inline = docs_inline(&init_docs); - if init_inline.is_empty() { - "{ }".to_string() - } else { - format!("{{ {init_inline} }}") - } - } else if info.post_block.is_some() { - let init_inline = docs_inline(&header_docs); - if init_inline.is_empty() { - "{ }".to_string() - } else { - format!("{{ {init_inline} }}") - } - } else { - "{ }".to_string() - }; - - // Loops without an explicit post block are while-like. Emit them as: - // `for 1 { } {
; if !cond { break }; }` - // - // This keeps header/condition evaluation in one place and avoids replaying - // header setup inside Yul's `post` clause. - if info.post_block.is_none() { - if let Some((cond, then_bb, else_bb)) = branch_header - && then_bb == info.body - && else_bb == info.exit - { - let cond_expr = self.lower_value(cond, state)?; - let loop_ctx = LoopEmitCtx { - continue_target: header, - break_target: info.exit, - implicit_continue: info.backedge, - }; - - let mut body_stops = stop_blocks.to_vec(); - if let Some(init_bb) = info.init_block { - body_stops.push(init_bb); - } - let body_docs = - self.emit_block_internal(info.body, Some(loop_ctx), state, &body_stops)?; - - let mut while_body_docs = header_docs; - while_body_docs.push(YulDoc::block( - format!("if iszero({cond_expr}) "), - vec![YulDoc::line("break")], - )); - while_body_docs.extend(body_docs); - - let loop_doc = - YulDoc::block(format!("for {init_block_str} 1 {{ }} "), while_body_docs); - return Ok((loop_doc, info.exit)); - } - - // Complex loop headers (e.g. decision-tree based `while let`) may start - // with a jump/switch CFG instead of a single branch. Emit the full loop CFG - // inside a Yul `for` body and rely on loop-context mapping for break/continue. - let loop_ctx = LoopEmitCtx { - continue_target: header, - break_target: info.exit, - implicit_continue: info.backedge, - }; - - let mut body_stops = stop_blocks.to_vec(); - if let Some(init_bb) = info.init_block { - body_stops.push(init_bb); - } - let while_body_docs = - self.emit_block_internal(header, Some(loop_ctx), state, &body_stops)?; - let loop_doc = YulDoc::block(format!("for {init_block_str} 1 {{ }} "), while_body_docs); - return Ok((loop_doc, info.exit)); - } - - let Some((cond, then_bb, else_bb)) = branch_header else { - return Err(YulError::Unsupported( - "loop header missing branch terminator".into(), - )); - }; - if then_bb != info.body || else_bb != info.exit { - return Err(YulError::Unsupported( - "loop metadata inconsistent with terminator".into(), - )); - } - let cond_expr = self.lower_value(cond, state)?; - - // For-loops with explicit post blocks map directly to Yul `for`. - let post_block_str = if let Some(post_bb) = info.post_block { - let post_block_data = self - .mir_func - .body - .blocks - .get(post_bb.index()) - .ok_or_else(|| YulError::Unsupported("invalid post block".into()))?; - let post_docs = self.render_statements(&post_block_data.insts, state)?; - let post_inline = docs_inline(&post_docs); - if post_inline.is_empty() { - "{ }".to_string() - } else { - format!("{{ {post_inline} }}") - } - } else { - unreachable!("guarded above") - }; - - // Continue target is the post block if present, otherwise the header - let continue_target = info.post_block.unwrap_or(header); - let loop_ctx = LoopEmitCtx { - continue_target, - break_target: info.exit, - implicit_continue: info.backedge, - }; - - // Stop at init and post blocks when emitting body (they're handled separately) - let mut body_stops = stop_blocks.to_vec(); - if let Some(init_bb) = info.init_block { - body_stops.push(init_bb); - } - if let Some(post_bb) = info.post_block { - body_stops.push(post_bb); - } - let body_docs = self.emit_block_internal(info.body, Some(loop_ctx), state, &body_stops)?; - - let loop_doc = YulDoc::block( - format!("for {init_block_str} {cond_expr} {post_block_str} "), - body_docs, - ); - Ok((loop_doc, info.exit)) - } -} - -/// Translates MIR switch literal kinds into their Yul literal strings. -/// -/// * `value` - Switch value representation. -/// -/// Returns the string literal used inside the `switch`. -fn switch_value_literal(value: &SwitchValue) -> String { - match value { - SwitchValue::Bool(true) => "1".into(), - SwitchValue::Bool(false) => "0".into(), - SwitchValue::Int(int) => int.to_string(), - SwitchValue::Enum(val) => val.to_string(), - } -} diff --git a/crates/codegen/src/yul/emitter/expr.rs b/crates/codegen/src/yul/emitter/expr.rs deleted file mode 100644 index 53dea86d52..0000000000 --- a/crates/codegen/src/yul/emitter/expr.rs +++ /dev/null @@ -1,656 +0,0 @@ -//! Expression and value lowering helpers shared across the Yul emitter. - -use common::ingot::IngotKind; -use hir::analysis::ty::simplified_pattern::ConstructorKind; -use hir::analysis::ty::ty_def::{PrimTy, TyBase, TyData, TyId}; -use hir::hir_def::{ - CallableDef, - expr::{ArithBinOp, BinOp, CompBinOp, LogicalBinOp, UnOp}, -}; -use hir::projection::{IndexSource, Projection}; -use hir::span::LazySpan; -use mir::{ - CallOrigin, ValueId, ValueOrigin, - ir::{FieldPtrOrigin, MirFunctionOrigin, Place, SyntheticValue}, - layout, -}; - -use crate::yul::state::BlockState; - -use super::{ - YulError, - function::FunctionEmitter, - util::{function_name, is_std_evm_ops, prefix_yul_name}, -}; - -impl<'db> FunctionEmitter<'db> { - fn format_hir_expr_context(&self, expr: hir::hir_def::ExprId) -> String { - let Some(body) = (match self.mir_func.origin { - MirFunctionOrigin::Hir(func) => func.body(self.db), - MirFunctionOrigin::Synthetic(_) => None, - }) else { - return format!( - "func={} expr={expr:?} (missing HIR body)", - self.mir_func.symbol_name - ); - }; - - let span = expr.span(body).resolve(self.db); - let span_context = if let Some(span) = span { - let path = span - .file - .path(self.db) - .as_ref() - .map(|p| p.to_string()) - .unwrap_or_else(|| "".into()); - let start: usize = u32::from(span.range.start()) as usize; - let text = span.file.text(self.db); - let (mut line, mut col) = (1usize, 1usize); - for byte in text.as_bytes().iter().take(start) { - if *byte == b'\n' { - line += 1; - col = 1; - } else { - col += 1; - } - } - format!("{path}:{line}:{col}") - } else { - "".into() - }; - - let expr_data = match expr.data(self.db, body) { - hir::hir_def::Partial::Present(expr_data) => match expr_data { - hir::hir_def::Expr::Path(path) => path - .to_opt() - .map(|path| format!("Path({})", path.pretty_print(self.db))) - .unwrap_or_else(|| "Path()".into()), - hir::hir_def::Expr::Call(callee, args) => { - let callee_data = match callee.data(self.db, body) { - hir::hir_def::Partial::Present(hir::hir_def::Expr::Path(path)) => path - .to_opt() - .map(|path| format!("Path({})", path.pretty_print(self.db))) - .unwrap_or_else(|| "Path()".into()), - hir::hir_def::Partial::Present(other) => format!("{other:?}"), - hir::hir_def::Partial::Absent => "".into(), - }; - format!("Call({callee:?} {callee_data}, {args:?})") - } - hir::hir_def::Expr::MethodCall(receiver, method, _, args) => { - let method_name = method - .to_opt() - .map(|id| id.data(self.db).to_string()) - .unwrap_or_else(|| "".into()); - format!("MethodCall({receiver:?}, {method_name}, {args:?})") - } - other => format!("{other:?}"), - }, - hir::hir_def::Partial::Absent => "".into(), - }; - - format!( - "func={} expr={expr:?} at {}: {}", - self.mir_func.symbol_name, span_context, expr_data - ) - } - - /// Lowers a MIR `ValueId` into a Yul expression string. - /// - /// * `value_id` - Identifier selecting the MIR value. - /// * `state` - Current bindings for previously-evaluated expressions. - /// - /// Returns the Yul expression referencing the value or an error if unsupported. - pub(super) fn lower_value( - &self, - value_id: ValueId, - state: &BlockState, - ) -> Result { - // Check if this value was already bound to a temp in the current scope - if let Some(temp) = state.value_temp(value_id.index()) { - return Ok(temp.clone()); - } - let value = self.mir_func.body.value(value_id); - match &value.origin { - ValueOrigin::Expr(expr) => unreachable!( - "unlowered HIR expression reached codegen (MIR lowering should have failed earlier): {}", - self.format_hir_expr_context(*expr) - ), - ValueOrigin::ControlFlowResult { expr } => unreachable!( - "control-flow result value reached codegen without binding (MIR lowering should have inserted/used a temp): {}", - self.format_hir_expr_context(*expr) - ), - ValueOrigin::Unit => Ok("0".into()), - ValueOrigin::Unary { op, inner } => { - let value = self.lower_value(*inner, state)?; - match op { - UnOp::Minus => Ok(format!("sub(0, {value})")), - UnOp::Not => Ok(format!("iszero({value})")), - UnOp::Plus => Ok(value), - UnOp::BitNot => Ok(format!("not({value})")), - UnOp::Mut => todo!(), - UnOp::Ref => todo!(), - } - } - ValueOrigin::Binary { op, lhs, rhs } => { - let left = self.lower_value(*lhs, state)?; - let right = self.lower_value(*rhs, state)?; - match op { - BinOp::Arith(op) => match op { - ArithBinOp::Add => Ok(format!("add({left}, {right})")), - ArithBinOp::Sub => Ok(format!("sub({left}, {right})")), - ArithBinOp::Mul => Ok(format!("mul({left}, {right})")), - ArithBinOp::Div => Ok(format!("div({left}, {right})")), - ArithBinOp::Rem => Ok(format!("mod({left}, {right})")), - ArithBinOp::Pow => Ok(format!("exp({left}, {right})")), - ArithBinOp::LShift => Ok(format!("shl({right}, {left})")), - ArithBinOp::RShift => Ok(format!("shr({right}, {left})")), - ArithBinOp::BitAnd => Ok(format!("and({left}, {right})")), - ArithBinOp::BitOr => Ok(format!("or({left}, {right})")), - ArithBinOp::BitXor => Ok(format!("xor({left}, {right})")), - // Range should be lowered to Range type construction before codegen - ArithBinOp::Range => { - todo!( - "Range operator should be handled during type checking/MIR lowering" - ) - } - }, - BinOp::Comp(op) => { - let expr = match op { - CompBinOp::Eq => format!("eq({left}, {right})"), - CompBinOp::NotEq => format!("iszero(eq({left}, {right}))"), - CompBinOp::Lt => format!("lt({left}, {right})"), - CompBinOp::LtEq => format!("iszero(gt({left}, {right}))"), - CompBinOp::Gt => format!("gt({left}, {right})"), - CompBinOp::GtEq => format!("iszero(lt({left}, {right}))"), - }; - Ok(expr) - } - BinOp::Logical(op) => { - let func = match op { - LogicalBinOp::And => "and", - LogicalBinOp::Or => "or", - }; - Ok(format!("{func}({left}, {right})")) - } - BinOp::Index => Err(YulError::Unsupported( - "index expressions should be lowered to places before codegen".into(), - )), - } - } - ValueOrigin::Local(local) => { - if let Some(name) = state.resolve_local(*local) { - return Ok(name); - } - - let local_data = self.mir_func.body.local(*local); - let is_param = self.mir_func.body.param_locals.contains(local); - let is_effect = self.mir_func.body.effect_param_locals.contains(local); - if is_effect && self.mir_func.contract_function.is_some() { - // Contract entrypoints lower host/effect handles as compile-time symbols - // rather than runtime parameters. - return Ok("0".into()); - } - - Err(YulError::Unsupported(format!( - "unbound MIR local reached codegen (func={}, local=l{} `{}`, ty={}, param={is_param}, effect={is_effect})", - self.mir_func.symbol_name, - local.index(), - local_data.name, - local_data.ty.pretty_print(self.db), - ))) - } - ValueOrigin::PlaceRoot(_) => Err(YulError::Unsupported( - "capability-stage place root reached codegen".into(), - )), - ValueOrigin::FuncItem(_) => { - debug_assert!( - layout::is_zero_sized_ty_in(self.db, &self.layout, value.ty), - "function item values should be zero-sized (ty={})", - value.ty.pretty_print(self.db) - ); - Ok("0".into()) - } - ValueOrigin::Synthetic(synth) => self.lower_synthetic_value(synth), - ValueOrigin::FieldPtr(field_ptr) => self.lower_field_ptr(field_ptr, state), - ValueOrigin::PlaceRef(place) => { - if value.repr.address_space().is_none() - && let Some((_, inner_ty)) = value.ty.as_capability(self.db) - { - return self.lower_place_load(place, inner_ty, state); - } - self.lower_place_ref(place, state) - } - ValueOrigin::MoveOut { place } => { - if value.repr.address_space().is_some() { - self.lower_place_ref(place, state) - } else { - self.lower_place_load(place, value.ty, state) - } - } - ValueOrigin::TransparentCast { value } => self.lower_value(*value, state), - } - } - - /// Lowers a MIR call into a Yul function invocation. - /// - /// * `call` - Call origin describing the callee and arguments. - /// * `state` - Binding state used to lower argument expressions. - /// - /// Returns the Yul invocation string for the call. - pub(super) fn lower_call_value( - &self, - call: &CallOrigin<'_>, - state: &BlockState, - ) -> Result { - if let Some(target) = call.hir_target.as_ref() - && matches!( - target.callable_def.ingot(self.db).kind(self.db), - IngotKind::Core - ) - && target.callable_def.name(self.db).is_some_and(|name| { - matches!(name.data(self.db).as_str(), "__as_bytes" | "__keccak256") - }) - { - return Err(YulError::Unsupported( - "core::keccak requires a compile-time constant value".into(), - )); - } - - if call - .hir_target - .as_ref() - .and_then(|target| target.callable_def.name(self.db)) - .is_some_and(|name| name.data(self.db) == "contract_field_slot") - { - return Err(YulError::Unsupported( - "`contract_field_slot` must be constant-folded before codegen".into(), - )); - } - - let is_evm_op = match call.hir_target.as_ref() { - Some(target) => { - matches!( - target.callable_def, - CallableDef::Func(func) if is_std_evm_ops(self.db, func) - ) - } - None => false, - }; - let callee = if let Some(name) = &call.resolved_name { - name.clone() - } else { - let Some(target) = call.hir_target.as_ref() else { - return Err(YulError::Unsupported( - "call is missing a resolved symbol name".into(), - )); - }; - match target.callable_def { - CallableDef::Func(func) => function_name(self.db, func), - CallableDef::VariantCtor(_) => { - return Err(YulError::Unsupported( - "callable without hir function definition is not supported yet".into(), - )); - } - } - }; - let callee = if is_evm_op { - callee - } else { - prefix_yul_name(&callee) - }; - let mut lowered_args = Vec::with_capacity(call.args.len()); - for &arg in &call.args { - lowered_args.push(self.lower_value(arg, state)?); - } - for &arg in &call.effect_args { - lowered_args.push(self.lower_value(arg, state)?); - } - if lowered_args.is_empty() { - Ok(format!("{callee}()")) - } else { - Ok(format!("{callee}({})", lowered_args.join(", "))) - } - } - - /// Lowers special MIR synthetic values such as constants into Yul expressions. - /// - /// * `value` - Synthetic value emitted during MIR construction. - /// - /// Returns the literal Yul expression for the synthetic value. - fn lower_synthetic_value(&self, value: &SyntheticValue) -> Result { - match value { - SyntheticValue::Int(int) => Ok(int.to_string()), - SyntheticValue::Bool(flag) => Ok(if *flag { "1" } else { "0" }.into()), - SyntheticValue::Bytes(bytes) => Ok(format!("0x{}", hex::encode(bytes))), - } - } - - /// Lowers a FieldPtr (pointer arithmetic for nested struct access) into a Yul add expression. - /// - /// * `field_ptr` - The FieldPtrOrigin containing base pointer and offset. - /// * `state` - Current bindings for previously-evaluated expressions. - /// - /// Returns a Yul expression representing `base + offset`. - fn lower_field_ptr( - &self, - field_ptr: &FieldPtrOrigin, - state: &BlockState, - ) -> Result { - let base = self.lower_value(field_ptr.base, state)?; - if field_ptr.offset_bytes == 0 { - Ok(base) - } else { - let offset = match field_ptr.addr_space { - mir::ir::AddressSpaceKind::Memory | mir::ir::AddressSpaceKind::Calldata => { - field_ptr.offset_bytes - } - mir::ir::AddressSpaceKind::Storage - | mir::ir::AddressSpaceKind::TransientStorage => field_ptr.offset_bytes / 32, - }; - Ok(format!("add({}, {})", base, offset)) - } - } - - /// Lowers a PlaceLoad (load value from a place with projection path). - /// - /// Walks the projection path to compute the byte offset from the base, - /// then emits a load instruction based on the address space, applying - /// the appropriate type conversion (masking, sign extension, etc.). - pub(super) fn lower_place_load( - &self, - place: &Place<'db>, - loaded_ty: TyId<'db>, - state: &BlockState, - ) -> Result { - if layout::ty_size_bytes_in(self.db, &self.layout, loaded_ty).is_some_and(|size| size == 0) - { - return Ok("0".into()); - } - - let addr = self.lower_place_address(place, state)?; - let raw_load = match self.mir_func.body.place_address_space(place) { - mir::ir::AddressSpaceKind::Memory => format!("mload({addr})"), - mir::ir::AddressSpaceKind::Calldata => format!("calldataload({addr})"), - mir::ir::AddressSpaceKind::Storage => format!("sload({addr})"), - mir::ir::AddressSpaceKind::TransientStorage => format!("tload({addr})"), - }; - - // Apply type-specific conversion (std::evm::word::WordRepr::from_word equivalent) - Ok(self.apply_from_word_conversion(&raw_load, loaded_ty)) - } - - /// Applies the `WordRepr::from_word` conversion for a given type. - /// - /// This mirrors the stdlib word-conversion semantics defined in: - /// - `ingots/std/src/evm/word.fe` (`WordRepr` trait) - /// - /// Conversion rules: - /// - bool: word != 0 - /// - u8/u16/u32/u64/u128: mask to appropriate width - /// - u256: identity - /// - i8/i16/i32/i64/i128/i256: sign extension - /// - /// NOTE: This is a single source of truth for codegen. If the stdlib word - /// conversion semantics change, this function must be updated to match. - fn apply_from_word_conversion(&self, raw_load: &str, ty: TyId<'db>) -> String { - let ty = mir::repr::word_conversion_leaf_ty(self.db, ty); - let base_ty = ty.base_ty(self.db); - if let TyData::TyBase(TyBase::Prim(prim)) = base_ty.data(self.db) { - match prim { - PrimTy::Bool => { - // bool: iszero(eq(word, 0)) which is equivalent to word != 0 - format!("iszero(eq({raw_load}, 0))") - } - PrimTy::U8 => format!("and({raw_load}, 0xff)"), - PrimTy::U16 => format!("and({raw_load}, 0xffff)"), - PrimTy::U32 => format!("and({raw_load}, 0xffffffff)"), - PrimTy::U64 => format!("and({raw_load}, 0xffffffffffffffff)"), - PrimTy::U128 => { - format!("and({raw_load}, 0xffffffffffffffffffffffffffffffff)") - } - PrimTy::U256 | PrimTy::Usize => { - // No conversion needed for full-width unsigned - raw_load.to_string() - } - PrimTy::I8 => { - // Sign extension for i8 - format!("signextend(0, and({raw_load}, 0xff))") - } - PrimTy::I16 => { - format!("signextend(1, and({raw_load}, 0xffff))") - } - PrimTy::I32 => { - format!("signextend(3, and({raw_load}, 0xffffffff))") - } - PrimTy::I64 => { - format!("signextend(7, and({raw_load}, 0xffffffffffffffff))") - } - PrimTy::I128 => { - format!("signextend(15, and({raw_load}, 0xffffffffffffffffffffffffffffffff))") - } - PrimTy::I256 | PrimTy::Isize => { - // Full-width signed doesn't need masking, sign is already there - raw_load.to_string() - } - // Aggregate/pointer-like types - no conversion - PrimTy::String - | PrimTy::Array - | PrimTy::Tuple(_) - | PrimTy::Ptr - | PrimTy::View - | PrimTy::BorrowMut - | PrimTy::BorrowRef => raw_load.to_string(), - } - } else { - // Non-primitive types (aggregates, etc.) - no conversion - raw_load.to_string() - } - } - - /// Applies the `WordRepr::to_word` conversion for a given type. - pub(super) fn apply_to_word_conversion(&self, raw_value: &str, ty: TyId<'db>) -> String { - let ty = mir::repr::word_conversion_leaf_ty(self.db, ty); - let base_ty = ty.base_ty(self.db); - if let TyData::TyBase(TyBase::Prim(prim)) = base_ty.data(self.db) { - match prim { - PrimTy::Bool => format!("iszero(iszero({raw_value}))"), - PrimTy::U8 => format!("and({raw_value}, 0xff)"), - PrimTy::U16 => format!("and({raw_value}, 0xffff)"), - PrimTy::U32 => format!("and({raw_value}, 0xffffffff)"), - PrimTy::U64 => format!("and({raw_value}, 0xffffffffffffffff)"), - PrimTy::U128 => { - format!("and({raw_value}, 0xffffffffffffffffffffffffffffffff)") - } - PrimTy::U256 | PrimTy::Usize => raw_value.to_string(), - PrimTy::I8 - | PrimTy::I16 - | PrimTy::I32 - | PrimTy::I64 - | PrimTy::I128 - | PrimTy::I256 - | PrimTy::Isize => raw_value.to_string(), - PrimTy::String - | PrimTy::Array - | PrimTy::Tuple(_) - | PrimTy::Ptr - | PrimTy::View - | PrimTy::BorrowMut - | PrimTy::BorrowRef => raw_value.to_string(), - } - } else { - raw_value.to_string() - } - } - - /// Lowers a PlaceRef (reference to a place with projection path). - /// - /// Walks the projection path to compute the byte offset from the base, - /// returning the pointer without loading. - pub(super) fn lower_place_ref( - &self, - place: &Place<'db>, - state: &BlockState, - ) -> Result { - self.lower_place_address(place, state) - } - - /// Computes the address for a place by walking the projection path. - /// - /// Returns a Yul expression representing the memory/storage address. - /// For memory, computes byte offsets. For storage, computes slot offsets. - fn lower_place_address( - &self, - place: &Place<'db>, - state: &BlockState, - ) -> Result { - let base_value = self.mir_func.body.value(place.base); - let mut base_expr = if let ValueOrigin::Local(local) = &base_value.origin - && base_value.repr.is_ref() - && let Some(spill) = self.mir_func.body.spill_slots.get(local) - { - state.resolve_local(*spill).ok_or_else(|| { - let local_data = self.mir_func.body.local(*spill); - YulError::Unsupported(format!( - "unbound MIR spill slot local reached codegen (func={}, local=l{} `{}`, ty={})", - self.mir_func.symbol_name, - spill.index(), - local_data.name, - local_data.ty.pretty_print(self.db), - )) - })? - } else { - self.lower_value(place.base, state)? - }; - - if place.projection.is_empty() { - return Ok(base_expr); - } - - // Get the base value's type to navigate projections - let mut current_ty = base_value.ty; - let mut total_offset: usize = 0; - let is_slot_addressed = matches!( - self.mir_func.body.place_address_space(place), - mir::ir::AddressSpaceKind::Storage | mir::ir::AddressSpaceKind::TransientStorage - ); - - for proj in place.projection.iter() { - match proj { - Projection::Field(field_idx) => { - let field_types = current_ty.field_types(self.db); - if field_types.is_empty() { - return Err(YulError::Unsupported(format!( - "place projection: no field types for type but accessing field {}", - field_idx - ))); - } - // Use slot-based offsets for storage, byte-based for memory - total_offset += if is_slot_addressed { - layout::field_offset_slots(self.db, current_ty, *field_idx) - } else { - layout::field_offset_memory_in( - self.db, - &self.layout, - current_ty, - *field_idx, - ) - }; - // Update current type to the field's type - current_ty = *field_types.get(*field_idx).ok_or_else(|| { - YulError::Unsupported(format!( - "place projection: target field {} out of bounds (have {} fields)", - field_idx, - field_types.len() - )) - })?; - } - Projection::VariantField { - variant, - enum_ty, - field_idx, - } => { - // Skip discriminant then compute field offset - // Use slot-based offsets for storage, byte-based for memory - if is_slot_addressed { - total_offset += 1; - total_offset += layout::variant_field_offset_slots( - self.db, *enum_ty, *variant, *field_idx, - ); - } else { - total_offset += self.layout.discriminant_size_bytes; - total_offset += layout::variant_field_offset_memory_in( - self.db, - &self.layout, - *enum_ty, - *variant, - *field_idx, - ); - } - // Update current type to the field's type - let ctor = ConstructorKind::Variant(*variant, *enum_ty); - let field_types = ctor.field_types(self.db); - current_ty = *field_types.get(*field_idx).ok_or_else(|| { - YulError::Unsupported(format!( - "place projection: target variant field {} out of bounds (have {} fields)", - field_idx, - field_types.len() - )) - })?; - } - Projection::Discriminant => { - current_ty = TyId::new(self.db, TyData::TyBase(TyBase::Prim(PrimTy::U256))); - } - Projection::Index(idx_source) => { - let stride = if is_slot_addressed { - layout::array_elem_stride_slots(self.db, current_ty) - } else { - layout::array_elem_stride_memory_in(self.db, &self.layout, current_ty) - } - .ok_or_else(|| { - YulError::Unsupported( - "place projection: array index access on non-array type".to_string(), - ) - })?; - - match idx_source { - IndexSource::Constant(idx) => { - total_offset += idx * stride; - } - IndexSource::Dynamic(value_id) => { - if total_offset != 0 { - base_expr = format!("add({base_expr}, {total_offset})"); - total_offset = 0; - } - let idx_expr = self.lower_value(*value_id, state)?; - let offset_expr = if stride == 1 { - idx_expr - } else { - format!("mul({idx_expr}, {stride})") - }; - base_expr = format!("add({base_expr}, {offset_expr})"); - } - } - - // Update current type to the element type. - let (base_ty, args) = current_ty.decompose_ty_app(self.db); - if !base_ty.is_array(self.db) || args.is_empty() { - return Err(YulError::Unsupported( - "place projection: array index on non-array type".to_string(), - )); - } - current_ty = args[0]; - } - Projection::Deref => { - return Err(YulError::Unsupported( - "place projection: pointer dereference not yet implemented".to_string(), - )); - } - } - } - - if total_offset != 0 { - base_expr = format!("add({base_expr}, {total_offset})"); - } - Ok(base_expr) - } -} diff --git a/crates/codegen/src/yul/emitter/function.rs b/crates/codegen/src/yul/emitter/function.rs deleted file mode 100644 index 04ffe44092..0000000000 --- a/crates/codegen/src/yul/emitter/function.rs +++ /dev/null @@ -1,260 +0,0 @@ -use driver::DriverDataBase; -use mir::layout::TargetDataLayout; -use mir::{BasicBlockId, MirBackend, MirFunction, MirStage, Terminator, ir::MirFunctionOrigin}; -use rustc_hash::{FxHashMap, FxHashSet}; - -use crate::yul::{doc::YulDoc, errors::YulError, state::BlockState}; - -use super::util::{function_name, prefix_yul_name}; - -/// A data region collected during Yul emission (for data sections). -#[derive(Debug, Clone)] -pub(super) struct YulDataRegion { - pub label: String, - pub bytes: Vec, -} - -/// Emits Yul for a single MIR function. -pub(super) struct FunctionEmitter<'db> { - pub(super) db: &'db DriverDataBase, - pub(super) mir_func: &'db MirFunction<'db>, - /// Mapping from monomorphized function symbols to code region labels. - pub(super) code_regions: &'db FxHashMap, - pub(super) layout: TargetDataLayout, - ipdom: Vec>, - /// Data regions collected during emission. - data_region_counter: u32, - /// Reuse labels for identical payloads so we don't emit duplicate data sections. - data_region_labels: FxHashMap, String>, - pub(super) data_regions: Vec, -} - -impl<'db> FunctionEmitter<'db> { - /// Constructs a new emitter for the given MIR function. - /// - /// * `db` - Driver database providing access to bodies and type info. - /// * `mir_func` - MIR function to lower into Yul. - /// - /// Returns the initialized emitter or [`YulError::MissingBody`] if the - /// function lacks a body. - pub(super) fn new( - db: &'db DriverDataBase, - mir_func: &'db MirFunction<'db>, - code_regions: &'db FxHashMap, - layout: TargetDataLayout, - ) -> Result { - mir_func - .body - .assert_stage(MirStage::Repr(MirBackend::EvmYul)); - if let MirFunctionOrigin::Hir(func) = mir_func.origin - && func.body(db).is_none() - { - return Err(YulError::MissingBody(function_name(db, func))); - } - let ipdom = compute_immediate_postdominators(&mir_func.body); - Ok(Self { - db, - mir_func, - code_regions, - layout, - ipdom, - data_region_counter: 0, - data_region_labels: FxHashMap::default(), - data_regions: Vec::new(), - }) - } - - pub(super) fn ipdom(&self, block: BasicBlockId) -> Option { - self.ipdom.get(block.index()).copied().flatten() - } - - /// Registers constant aggregate data and returns a unique label for the data section. - /// - /// Labels include the function's symbol name to ensure global uniqueness - /// across functions within the same Yul object. - pub(super) fn register_data_region(&mut self, bytes: Vec) -> String { - if let Some(label) = self.data_region_labels.get(bytes.as_slice()) { - return label.clone(); - } - let label = format!( - "data_{}_{}", - self.mir_func.symbol_name, self.data_region_counter - ); - self.data_region_counter += 1; - self.data_region_labels.insert(bytes.clone(), label.clone()); - self.data_regions.push(YulDataRegion { - label: label.clone(), - bytes, - }); - label - } - - /// Produces the final Yul docs for the current MIR function. - pub(super) fn emit_doc(mut self) -> Result<(Vec, Vec), YulError> { - let func_name = prefix_yul_name(&self.mir_func.symbol_name); - let (param_names, mut state) = self.init_entry_state(); - let body_docs = self.emit_block(self.mir_func.body.entry, &mut state)?; - let function_doc = YulDoc::block( - format!( - "{} ", - self.format_function_signature(&func_name, ¶m_names) - ), - body_docs, - ); - Ok((vec![function_doc], self.data_regions)) - } - - /// Initializes the `BlockState` with parameter bindings. - /// - /// Returns: - /// - the Yul function parameter names (in signature order) - /// - the initial block state mapping MIR locals to those names - fn init_entry_state(&self) -> (Vec, BlockState) { - let mut state = BlockState::new(); - let mut params_out = Vec::new(); - let mut used_names = FxHashSet::default(); - for &local in &self.mir_func.body.param_locals { - let raw_name = self.mir_func.body.local(local).name.clone(); - let name = unique_yul_name(&raw_name, &mut used_names); - params_out.push(name.clone()); - state.insert_local(local, name); - } - if self.mir_func.contract_function.is_none() { - for &local in &self.mir_func.body.effect_param_locals { - let raw_name = self.mir_func.body.local(local).name.clone(); - let binding = unique_yul_name(&raw_name, &mut used_names); - params_out.push(binding.clone()); - state.insert_local(local, binding); - } - } - (params_out, state) - } - - /// Returns true if the Fe function has a return type. - pub(super) fn returns_value(&self) -> bool { - self.mir_func.returns_value - } - - /// Formats the Fe function name and parameters into a Yul signature. - fn format_function_signature(&self, func_name: &str, params: &[String]) -> String { - let params_str = params.join(", "); - let ret_suffix = if self.returns_value() { " -> ret" } else { "" }; - if params.is_empty() { - format!("function {func_name}(){ret_suffix}") - } else { - format!("function {func_name}({params_str}){ret_suffix}") - } - } -} - -fn unique_yul_name(raw_name: &str, used: &mut FxHashSet) -> String { - let base = format!("${raw_name}"); - let mut candidate = base.clone(); - let mut suffix = 0; - while used.contains(&candidate) { - suffix += 1; - candidate = format!("{base}_{suffix}"); - } - used.insert(candidate.clone()); - candidate -} - -fn compute_immediate_postdominators(body: &mir::MirBody<'_>) -> Vec> { - let blocks_len = body.blocks.len(); - let exit = blocks_len; - let node_count = blocks_len + 1; - let words = node_count.div_ceil(64); - let last_mask = if node_count.is_multiple_of(64) { - !0u64 - } else { - (1u64 << (node_count % 64)) - 1 - }; - - fn set_bit(bits: &mut [u64], idx: usize) { - bits[idx / 64] |= 1u64 << (idx % 64); - } - - fn clear_bit(bits: &mut [u64], idx: usize) { - bits[idx / 64] &= !(1u64 << (idx % 64)); - } - - fn has_bit(bits: &[u64], idx: usize) -> bool { - (bits[idx / 64] & (1u64 << (idx % 64))) != 0 - } - - fn popcount(bits: &[u64]) -> u32 { - bits.iter().map(|w| w.count_ones()).sum() - } - - let mut postdom: Vec> = vec![vec![0u64; words]; node_count]; - for (idx, p) in postdom.iter_mut().enumerate() { - if idx == exit { - set_bit(p, exit); - } else { - p.fill(!0u64); - *p.last_mut().expect("postdom bitset") &= last_mask; - } - } - - let mut changed = true; - while changed { - changed = false; - for b in 0..blocks_len { - let successors: Vec = match &body.blocks[b].terminator { - Terminator::Goto { target, .. } => vec![target.index()], - Terminator::Branch { - then_bb, else_bb, .. - } => vec![then_bb.index(), else_bb.index()], - Terminator::Switch { - targets, default, .. - } => { - let mut s: Vec<_> = targets.iter().map(|t| t.block.index()).collect(); - s.push(default.index()); - s - } - Terminator::Return { .. } - | Terminator::TerminatingCall { .. } - | Terminator::Unreachable { .. } => vec![exit], - }; - - let mut new_bits = vec![!0u64; words]; - new_bits[words - 1] &= last_mask; - for succ in successors { - for w in 0..words { - new_bits[w] &= postdom[succ][w]; - } - } - new_bits[words - 1] &= last_mask; - set_bit(&mut new_bits, b); - - if new_bits != postdom[b] { - postdom[b] = new_bits; - changed = true; - } - } - } - - let mut ipdom = vec![None; blocks_len]; - for b in 0..blocks_len { - let mut candidates = postdom[b].clone(); - clear_bit(&mut candidates, b); - clear_bit(&mut candidates, exit); - - let mut best = None; - let mut best_size = 0u32; - #[allow(clippy::needless_range_loop)] - for c in 0..blocks_len { - if !has_bit(&candidates, c) { - continue; - } - let size = popcount(&postdom[c]); - if size > best_size || (size == best_size && best.is_some_and(|best| c < best)) { - best = Some(c); - best_size = size; - } - } - ipdom[b] = best.map(|idx| BasicBlockId(idx as u32)); - } - - ipdom -} diff --git a/crates/codegen/src/yul/emitter/mod.rs b/crates/codegen/src/yul/emitter/mod.rs deleted file mode 100644 index ea62937aae..0000000000 --- a/crates/codegen/src/yul/emitter/mod.rs +++ /dev/null @@ -1,33 +0,0 @@ -use std::fmt; - -use crate::yul::errors::YulError; - -pub use module::{ - ExpectedRevert, TestMetadata, TestModuleOutput, emit_ingot_yul, emit_ingot_yul_with_layout, - emit_module_yul, emit_module_yul_with_layout, emit_test_module_yul, - emit_test_module_yul_with_layout, -}; - -mod control_flow; -mod expr; -mod function; -mod module; -mod statements; -mod util; - -#[derive(Debug)] -pub enum EmitModuleError { - MirLower(mir::MirLowerError), - Yul(YulError), -} - -impl fmt::Display for EmitModuleError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - EmitModuleError::MirLower(err) => write!(f, "{err}"), - EmitModuleError::Yul(err) => write!(f, "{err}"), - } - } -} - -impl std::error::Error for EmitModuleError {} diff --git a/crates/codegen/src/yul/emitter/module.rs b/crates/codegen/src/yul/emitter/module.rs deleted file mode 100644 index a4cb6fe38c..0000000000 --- a/crates/codegen/src/yul/emitter/module.rs +++ /dev/null @@ -1,1330 +0,0 @@ -//! Module-level Yul emission helpers (functions + code regions). - -use common::ingot::Ingot; -use driver::DriverDataBase; -use hir::HirDb; -use hir::analysis::HirAnalysisDb; -use hir::hir_def::{ItemKind, TopLevelMod}; -use mir::analysis::{ - CallGraph, ContractRegion, ContractRegionKind, build_call_graph, build_contract_graph, - reachable_functions, -}; -use mir::{ - MirFunction, MirInst, MirModule, Rvalue, ValueOrigin, - ir::{IntrinsicOp, MirFunctionOrigin}, - layout::{self, TargetDataLayout}, - lower_ingot, lower_module, -}; -use rustc_hash::{FxHashMap, FxHashSet}; -use std::{collections::VecDeque, sync::Arc}; - -use crate::yul::doc::{YulDoc, render_docs}; -use crate::yul::errors::YulError; - -use super::{ - EmitModuleError, - function::{FunctionEmitter, YulDataRegion}, - util::{function_name, prefix_yul_name}, -}; - -/// Metadata describing a single emitted test object. -#[derive(Debug, Clone)] -pub struct TestMetadata { - pub display_name: String, - pub hir_name: String, - pub symbol_name: String, - pub object_name: String, - pub yul: String, - /// Backend-produced init bytecode (used by the Sonatina `fe test` backend). - /// - /// When emitting Yul, this is left empty and the runner compiles `yul` via `solc`. - pub bytecode: Vec, - /// Optional Sonatina object-level observability text snapshot. - pub sonatina_observability_text: Option, - /// Optional Sonatina object-level observability JSON snapshot. - pub sonatina_observability_json: Option, - pub value_param_count: usize, - pub effect_param_count: usize, - pub expected_revert: Option, -} - -/// Describes the expected revert behavior for a test. -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum ExpectedRevert { - /// Test should revert with any data. - Any, - // Future phases: - // ExactData(Vec), - // Selector([u8; 4]), -} - -/// Output returned by `emit_test_module_yul`. -#[derive(Debug, Clone)] -pub struct TestModuleOutput { - pub tests: Vec, -} - -/// Emits Yul for every function in the lowered MIR module. -/// -/// * `db` - Driver database used to query compiler facts. -/// * `top_mod` - Root module to lower. -/// -/// Returns a single Yul string containing all lowered functions followed by any -/// auto-generated code regions, or [`EmitModuleError`] if MIR lowering or Yul -/// emission fails. -pub fn emit_module_yul( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, -) -> Result { - emit_module_yul_with_layout(db, top_mod, layout::EVM_LAYOUT) -} - -pub fn emit_module_yul_with_layout( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - layout: TargetDataLayout, -) -> Result { - let module = lower_module(db, top_mod).map_err(EmitModuleError::MirLower)?; - emit_lowered_module_yul_with_layout(db, &module, layout) -} - -/// Emits Yul for every function in an ingot (across all source files). -pub fn emit_ingot_yul(db: &DriverDataBase, ingot: Ingot<'_>) -> Result { - emit_ingot_yul_with_layout(db, ingot, layout::EVM_LAYOUT) -} - -pub fn emit_ingot_yul_with_layout( - db: &DriverDataBase, - ingot: Ingot<'_>, - layout: TargetDataLayout, -) -> Result { - let module = lower_ingot(db, ingot).map_err(EmitModuleError::MirLower)?; - emit_lowered_module_yul_with_layout(db, &module, layout) -} - -fn emit_lowered_module_yul_with_layout( - db: &DriverDataBase, - module: &MirModule<'_>, - layout: TargetDataLayout, -) -> Result { - let contract_graph = build_contract_graph(&module.functions); - - let mut code_regions = FxHashMap::default(); - for (name, entry) in &contract_graph.contracts { - if let Some(init) = &entry.init_symbol { - code_regions.insert(init.clone(), name.clone()); - } - if let Some(runtime) = &entry.deployed_symbol { - code_regions.insert(runtime.clone(), format!("{name}_deployed")); - } - } - let code_region_roots = collect_code_region_roots(db, &module.functions); - for root in &code_region_roots { - if code_regions.contains_key(root) { - continue; - } - code_regions - .entry(root.clone()) - .or_insert_with(|| format!("code_region_{}", sanitize_symbol(root))); - } - let code_regions = Arc::new(code_regions); - - // Emit Yul docs for each function - let mut function_docs: Vec<(Vec, Vec)> = - Vec::with_capacity(module.functions.len()); - for func in module.functions.iter() { - let emitter = - FunctionEmitter::new(db, func, &code_regions, layout).map_err(EmitModuleError::Yul)?; - let is_test = match func.origin { - MirFunctionOrigin::Hir(hir_func) => ItemKind::from(hir_func) - .attrs(db) - .is_some_and(|attrs| attrs.has_attr(db, "test")), - MirFunctionOrigin::Synthetic(_) => false, - }; - if is_test { - validate_test_function(db, func, emitter.returns_value())?; - } - let (docs, data_regions) = emitter.emit_doc().map_err(EmitModuleError::Yul)?; - function_docs.push((docs, data_regions)); - } - - // Index function docs by symbol for region assembly. - let mut docs_by_symbol = FxHashMap::default(); - for (idx, func) in module.functions.iter().enumerate() { - let (docs, data_regions) = &function_docs[idx]; - docs_by_symbol.insert( - func.symbol_name.clone(), - FunctionDocInfo { - docs: docs.clone(), - data_regions: data_regions.clone(), - }, - ); - } - - let mut contract_deps: FxHashMap> = FxHashMap::default(); - let mut referenced_contracts = FxHashSet::default(); - for (from_region, deps) in &contract_graph.region_deps { - for dep in deps { - if dep.contract_name != from_region.contract_name { - referenced_contracts.insert(dep.contract_name.clone()); - contract_deps - .entry(from_region.contract_name.clone()) - .or_default() - .insert(dep.contract_name.clone()); - } - } - } - - let mut root_contracts: Vec<_> = contract_graph - .contracts - .keys() - .filter(|name| !referenced_contracts.contains(*name)) - .cloned() - .collect(); - root_contracts.sort(); - - // Ensure the contract dependency graph is rooted; otherwise we'd silently omit contracts or - // fall back to emitting raw functions (which breaks `dataoffset/datasize` scoping). - if !contract_graph.contracts.is_empty() { - let mut visited = FxHashSet::default(); - let mut queue = VecDeque::new(); - for name in &root_contracts { - queue.push_back(name.clone()); - } - while let Some(name) = queue.pop_front() { - if !visited.insert(name.clone()) { - continue; - } - if let Some(deps) = contract_deps.get(&name) { - for dep in deps { - queue.push_back(dep.clone()); - } - } - } - if visited.len() != contract_graph.contracts.len() { - let mut missing: Vec<_> = contract_graph - .contracts - .keys() - .filter(|name| !visited.contains(*name)) - .cloned() - .collect(); - missing.sort(); - return Err(EmitModuleError::Yul(YulError::Unsupported(format!( - "contract region graph is not rooted (cycle likely); unreachable contracts: {}", - missing.join(", ") - )))); - } - } - - let mut docs = Vec::new(); - for name in root_contracts { - let mut stack = Vec::new(); - docs.push( - emit_contract_init_object(&name, &contract_graph, &docs_by_symbol, &mut stack) - .map_err(EmitModuleError::Yul)?, - ); - } - - // Free-function code regions not tied to contract entrypoints. - let call_graph = build_call_graph(&module.functions); - for root in code_region_roots { - if contract_graph.symbol_to_region.contains_key(&root) { - continue; - } - let Some(label) = code_regions.get(&root) else { - continue; - }; - let reachable = reachable_functions(&call_graph, &root); - let mut region_docs = Vec::new(); - let mut data_regions = Vec::new(); - let mut seen_labels = FxHashSet::default(); - let mut symbols: Vec<_> = reachable.into_iter().collect(); - symbols.sort(); - for symbol in symbols { - if let Some(info) = docs_by_symbol.get(&symbol) { - region_docs.extend(info.docs.clone()); - for dr in &info.data_regions { - if seen_labels.insert(dr.label.clone()) { - data_regions.push(dr.clone()); - } - } - } - } - let mut components = vec![YulDoc::block("code ", region_docs)]; - components.extend(emit_data_sections(&data_regions)); - docs.push(YulDoc::block(format!("object \"{label}\" "), components)); - } - - // If nothing was emitted (no regions), fall back to top-level functions. - if docs.is_empty() { - // Collect all data regions from all functions - let mut all_data_regions = Vec::new(); - let mut seen_labels = FxHashSet::default(); - for info in docs_by_symbol.values() { - for dr in &info.data_regions { - if seen_labels.insert(dr.label.clone()) { - all_data_regions.push(dr.clone()); - } - } - } - for (func_docs, _) in function_docs { - docs.extend(func_docs); - } - // If there are data regions but no contract objects, we need to wrap in an object - if !all_data_regions.is_empty() { - let mut components = vec![YulDoc::block("code ", docs)]; - components.extend(emit_data_sections(&all_data_regions)); - docs = vec![YulDoc::block("object \"main\" ", components)]; - } - } - - let mut lines = Vec::new(); - render_docs(&docs, 0, &mut lines); - Ok(join_lines(lines)) -} - -/// Emits Yul objects that can execute `#[test]` functions directly. -/// -/// * `db` - Driver database used to query compiler facts. -/// * `top_mod` - Root module to lower. -/// -/// Returns test Yul output plus metadata mapping display names to test objects. -pub fn emit_test_module_yul( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, -) -> Result { - emit_test_module_yul_with_layout(db, top_mod, layout::EVM_LAYOUT) -} - -pub fn emit_test_module_yul_with_layout( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - layout: TargetDataLayout, -) -> Result { - let ingot = top_mod.ingot(db); - let module = lower_ingot(db, ingot).map_err(EmitModuleError::MirLower)?; - - let contract_graph = build_contract_graph(&module.functions); - - let mut code_regions = FxHashMap::default(); - for (name, entry) in &contract_graph.contracts { - if let Some(init) = &entry.init_symbol { - code_regions.insert(init.clone(), name.clone()); - } - if let Some(runtime) = &entry.deployed_symbol { - code_regions.insert(runtime.clone(), format!("{name}_deployed")); - } - } - let code_region_roots = collect_code_region_roots(db, &module.functions); - for root in &code_region_roots { - if code_regions.contains_key(root) { - continue; - } - code_regions - .entry(root.clone()) - .or_insert_with(|| format!("code_region_{}", sanitize_symbol(root))); - } - let code_regions = Arc::new(code_regions); - - // Emit Yul docs for each function - let mut function_docs: Vec<(Vec, Vec)> = - Vec::with_capacity(module.functions.len()); - for func in module.functions.iter() { - let emitter = - FunctionEmitter::new(db, func, &code_regions, layout).map_err(EmitModuleError::Yul)?; - let is_test = match func.origin { - MirFunctionOrigin::Hir(hir_func) => ItemKind::from(hir_func) - .attrs(db) - .is_some_and(|attrs| attrs.has_attr(db, "test")), - MirFunctionOrigin::Synthetic(_) => false, - }; - if is_test { - validate_test_function(db, func, emitter.returns_value())?; - } - let (docs, data_regions) = emitter.emit_doc().map_err(EmitModuleError::Yul)?; - function_docs.push((docs, data_regions)); - } - - // Index function docs by symbol for region assembly. - let mut docs_by_symbol = FxHashMap::default(); - for (idx, func) in module.functions.iter().enumerate() { - let (docs, data_regions) = &function_docs[idx]; - docs_by_symbol.insert( - func.symbol_name.clone(), - FunctionDocInfo { - docs: docs.clone(), - data_regions: data_regions.clone(), - }, - ); - } - - let call_graph = build_call_graph(&module.functions); - - let mut tests = collect_test_infos(db, &module.functions); - if tests.is_empty() { - return Ok(TestModuleOutput { tests: Vec::new() }); - } - assign_test_display_names(&mut tests); - assign_test_object_names(&mut tests); - - let test_symbols: FxHashSet<_> = tests.iter().map(|test| test.symbol_name.clone()).collect(); - let funcs_by_symbol = build_funcs_by_symbol(&module.functions); - - let mut output_tests = Vec::new(); - for test in tests { - let deps = collect_test_dependencies( - &funcs_by_symbol, - &call_graph, - &contract_graph, - &test.symbol_name, - &test_symbols, - ); - let contract_docs = emit_contract_docs(&contract_graph, &docs_by_symbol, &deps.contracts)?; - let code_region_docs = emit_code_region_docs( - &call_graph, - &deps.code_region_roots, - &contract_graph, - &code_regions, - &docs_by_symbol, - &test_symbols, - ); - let mut dependency_docs = Vec::new(); - dependency_docs.extend(contract_docs); - dependency_docs.extend(code_region_docs); - let doc = emit_test_object(&call_graph, &docs_by_symbol, &dependency_docs, &test)?; - let mut lines = Vec::new(); - render_docs(std::slice::from_ref(&doc), 0, &mut lines); - let yul = join_lines(lines); - output_tests.push(TestMetadata { - display_name: test.display_name, - hir_name: test.hir_name, - symbol_name: test.symbol_name, - object_name: test.object_name, - yul, - bytecode: Vec::new(), - sonatina_observability_text: None, - sonatina_observability_json: None, - value_param_count: test.value_param_count, - effect_param_count: test.effect_param_count, - expected_revert: test.expected_revert, - }); - } - - Ok(TestModuleOutput { - tests: output_tests, - }) -} - -/// Joins rendered lines while trimming trailing whitespace-only entries. -/// -/// * `lines` - Vector of rendered Yul lines. -/// -/// Returns the normalized Yul output string. -fn join_lines(mut lines: Vec) -> String { - while lines.last().is_some_and(|line| line.is_empty()) { - lines.pop(); - } - lines.join("\n") -} - -/// Collects all function symbols referenced by `code_region` intrinsics, contract -/// entrypoints, and `#[test]` functions. -/// -/// * `db` - HIR database used to read attributes. -/// * `functions` - Monomorphized MIR functions to scan. -/// -/// Returns a sorted list of symbol names that define code-region roots. -fn collect_code_region_roots(db: &dyn HirDb, functions: &[MirFunction<'_>]) -> Vec { - let mut roots = FxHashSet::default(); - for func in functions { - // Contract entrypoints are code region roots - if func.contract_function.is_some() { - roots.insert(func.symbol_name.clone()); - } - - // #[test] functions are code region roots - if let MirFunctionOrigin::Hir(hir_func) = func.origin - && ItemKind::from(hir_func) - .attrs(db) - .is_some_and(|attrs| attrs.has_attr(db, "test")) - { - roots.insert(func.symbol_name.clone()); - } - - // Functions referenced by code_region intrinsics are roots - for block in &func.body.blocks { - for inst in &block.insts { - if let mir::MirInst::Assign { - rvalue: mir::Rvalue::Intrinsic { op, args }, - .. - } = inst - && matches!( - *op, - mir::ir::IntrinsicOp::CodeRegionOffset - | mir::ir::IntrinsicOp::CodeRegionLen - ) - && args.len() == 1 - && let Some(arg) = args.first().copied() - && let mir::ValueOrigin::FuncItem(target) = &func.body.value(arg).origin - && let Some(symbol) = &target.symbol - { - roots.insert(symbol.clone()); - } - } - } - } - let mut out: Vec<_> = roots.into_iter().collect(); - out.sort(); - out -} - -/// Replace any non-alphanumeric characters with `_` so the label is a valid Yul identifier. -/// -/// * `component` - Raw symbol component to sanitize. -/// -/// Returns a sanitized string suitable for use as a Yul identifier. -fn sanitize_symbol(component: &str) -> String { - component - .chars() - .map(|ch| if ch.is_ascii_alphanumeric() { ch } else { '_' }) - .collect() -} - -struct FunctionDocInfo { - docs: Vec, - /// Data regions collected during emission for Yul data sections. - data_regions: Vec, -} - -struct TestInfo { - hir_name: String, - display_name: String, - symbol_name: String, - object_name: String, - value_param_count: usize, - effect_param_count: usize, - expected_revert: Option, -} - -/// Dependency set required to emit a single test object. -struct TestDependencies { - contracts: FxHashSet, - code_region_roots: Vec, -} - -/// Collects metadata for each `#[test]` function in the lowered module. -/// -/// * `db` - HIR database used to read attributes and names. -/// * `functions` - Monomorphized MIR functions to scan. -/// -/// Returns a list of test info entries with placeholder names filled in. -fn collect_test_infos(db: &dyn HirDb, functions: &[MirFunction<'_>]) -> Vec { - functions - .iter() - .filter_map(|mir_func| { - let MirFunctionOrigin::Hir(hir_func) = mir_func.origin else { - return None; - }; - let attrs = ItemKind::from(hir_func).attrs(db)?; - let test_attr = attrs.get_attr(db, "test")?; - - // Check for #[test(should_revert)] - let expected_revert = if test_attr.has_arg(db, "should_revert") { - Some(ExpectedRevert::Any) - } else { - None - }; - - let hir_name = hir_func - .name(db) - .to_opt() - .map(|n| n.data(db).to_string()) - .unwrap_or_else(|| "".to_string()); - let value_param_count = mir_func.body.param_locals.len(); - let effect_param_count = if mir_func.contract_function.is_none() { - mir_func.body.effect_param_locals.len() - } else { - 0 - }; - Some(TestInfo { - hir_name, - display_name: String::new(), - symbol_name: mir_func.symbol_name.clone(), - object_name: String::new(), - value_param_count, - effect_param_count, - expected_revert, - }) - }) - .collect() -} - -/// Validates that a `#[test]` function conforms to runner constraints. -/// -/// * `db` - Driver database used for name lookup. -/// * `mir_func` - MIR function to validate. -/// * `returns_value` - Whether the function has a non-unit return type. -/// -/// Returns `Ok(())` when valid or an [`EmitModuleError`] describing the issue. -fn validate_test_function( - db: &DriverDataBase, - mir_func: &MirFunction<'_>, - returns_value: bool, -) -> Result<(), EmitModuleError> { - let MirFunctionOrigin::Hir(hir_func) = mir_func.origin else { - return Err(EmitModuleError::Yul(YulError::Unsupported( - "invalid #[test] function: synthetic MIR functions cannot be tests".into(), - ))); - }; - - let name = function_name(db, hir_func); - if mir_func.contract_function.is_some() { - return Err(EmitModuleError::Yul(YulError::Unsupported(format!( - "invalid #[test] function `{name}`: contract entrypoints cannot be tests" - )))); - } - if !is_free_test_function(db, hir_func) { - return Err(EmitModuleError::Yul(YulError::Unsupported(format!( - "invalid #[test] function `{name}`: tests must be free functions (not in contracts or impls)" - )))); - } - if returns_value { - return Err(EmitModuleError::Yul(YulError::Unsupported(format!( - "invalid #[test] function `{name}`: tests must not return a value" - )))); - } - Ok(()) -} - -/// Returns true if a test function is free (not inside a contract/impl/trait). -/// -/// * `db` - HIR database for scope queries. -/// * `func` - HIR function to inspect. -fn is_free_test_function(db: &dyn HirAnalysisDb, func: hir::hir_def::Func<'_>) -> bool { - if func.is_associated_func(db) { - return false; - } - let Some(scope) = func.scope().parent(db) else { - return true; - }; - match scope { - hir::hir_def::scope_graph::ScopeId::Item(item) => !matches!(item, ItemKind::Contract(_)), - _ => true, - } -} - -/// Assigns human-readable display names and disambiguates duplicates. -/// -/// * `tests` - Mutable list of test info entries to update. -/// -/// Returns nothing; updates `tests` in place. -fn assign_test_display_names(tests: &mut [TestInfo]) { - let mut name_counts: FxHashMap = FxHashMap::default(); - for test in tests.iter() { - *name_counts.entry(test.hir_name.clone()).or_insert(0) += 1; - } - for test in tests.iter_mut() { - let count = name_counts.get(&test.hir_name).copied().unwrap_or(0); - if count > 1 { - test.display_name = format!("{} [{}]", test.hir_name, test.symbol_name); - } else { - test.display_name = test.hir_name.clone(); - } - } -} - -/// Assigns unique Yul object names for each test, suffixing collisions. -/// -/// * `tests` - Mutable list of test info entries to update. -/// -/// Returns nothing; updates `tests` in place. -fn assign_test_object_names(tests: &mut [TestInfo]) { - let mut groups: FxHashMap> = FxHashMap::default(); - for (idx, test) in tests.iter().enumerate() { - let base = format!("test_{}", sanitize_symbol(&test.display_name)); - groups.entry(base).or_default().push(idx); - } - for (base, mut indices) in groups { - if indices.len() == 1 { - let idx = indices[0]; - tests[idx].object_name = base; - continue; - } - indices.sort_by(|a, b| tests[*a].display_name.cmp(&tests[*b].display_name)); - for (suffix, idx) in indices.into_iter().enumerate() { - tests[idx].object_name = format!("{base}_{}", suffix + 1); - } - } -} - -/// Builds a lookup table from symbol name to MIR function. -/// -/// * `functions` - Monomorphized MIR functions to index. -/// -/// Returns a map keyed by symbol name. -fn build_funcs_by_symbol<'a>( - functions: &'a [MirFunction<'a>], -) -> FxHashMap> { - functions - .iter() - .map(|func| (func.symbol_name.clone(), func)) - .collect() -} - -/// Collects contracts and code-region roots needed to emit a single test object. -/// -/// * `funcs_by_symbol` - Lookup from symbol name to MIR function. -/// * `call_graph` - Module call graph for reachability. -/// * `contract_graph` - Contract region dependency graph. -/// * `test_symbol` - Symbol name for the test entrypoint. -/// * `test_symbols` - Set of all test symbols (used to avoid recursion). -/// -/// Returns the dependency set required by the test. -fn collect_test_dependencies( - funcs_by_symbol: &FxHashMap>, - call_graph: &CallGraph, - contract_graph: &mir::analysis::ContractGraph, - test_symbol: &str, - test_symbols: &FxHashSet, -) -> TestDependencies { - let mut contract_regions = FxHashSet::default(); - let mut code_region_roots = FxHashSet::default(); - let mut queue = VecDeque::new(); - - let reachable = reachable_functions(call_graph, test_symbol); - for symbol in &reachable { - if let Some(region) = contract_graph.symbol_to_region.get(symbol) { - contract_regions.insert(region.clone()); - } - let Some(func) = funcs_by_symbol.get(symbol) else { - continue; - }; - collect_code_region_targets( - func, - contract_graph, - test_symbols, - &mut queue, - &mut contract_regions, - ); - } - - while let Some(root) = queue.pop_front() { - if contract_graph.symbol_to_region.contains_key(&root) { - if let Some(region) = contract_graph.symbol_to_region.get(&root) { - contract_regions.insert(region.clone()); - } - continue; - } - if test_symbols.contains(&root) { - continue; - } - if !code_region_roots.insert(root.clone()) { - continue; - } - let reachable_root = reachable_functions(call_graph, &root); - for symbol in &reachable_root { - if let Some(region) = contract_graph.symbol_to_region.get(symbol) { - contract_regions.insert(region.clone()); - } - let Some(func) = funcs_by_symbol.get(symbol) else { - continue; - }; - collect_code_region_targets( - func, - contract_graph, - test_symbols, - &mut queue, - &mut contract_regions, - ); - } - } - - let mut region_queue: VecDeque<_> = contract_regions.iter().cloned().collect(); - while let Some(region) = region_queue.pop_front() { - let Some(deps) = contract_graph.region_deps.get(®ion) else { - continue; - }; - for dep in deps { - if contract_regions.insert(dep.clone()) { - region_queue.push_back(dep.clone()); - } - } - } - - let mut contracts = FxHashSet::default(); - for region in contract_regions { - contracts.insert(region.contract_name); - } - - let mut code_region_roots: Vec<_> = code_region_roots.into_iter().collect(); - code_region_roots.sort(); - - TestDependencies { - contracts, - code_region_roots, - } -} - -/// Scans a function for `code_region_offset/len` intrinsics and queues targets. -/// -/// * `func` - MIR function to scan. -/// * `contract_graph` - Contract region lookup for code region symbols. -/// * `test_symbols` - Set of test symbols to skip as code region roots. -/// * `queue` - Worklist of code region roots to process. -/// * `contract_regions` - Output set of referenced contract regions. -/// -/// Returns nothing; updates `queue` and `contract_regions`. -fn collect_code_region_targets( - func: &MirFunction<'_>, - contract_graph: &mir::analysis::ContractGraph, - test_symbols: &FxHashSet, - queue: &mut VecDeque, - contract_regions: &mut FxHashSet, -) { - for block in &func.body.blocks { - for inst in &block.insts { - let MirInst::Assign { - rvalue: - Rvalue::Intrinsic { - op: IntrinsicOp::CodeRegionLen | IntrinsicOp::CodeRegionOffset, - args, - }, - .. - } = inst - else { - continue; - }; - let Some(arg) = args.first().copied() else { - continue; - }; - let ValueOrigin::FuncItem(target) = &func.body.value(arg).origin else { - continue; - }; - let Some(target_symbol) = &target.symbol else { - continue; - }; - if let Some(region) = contract_graph.symbol_to_region.get(target_symbol) { - contract_regions.insert(region.clone()); - } else if !test_symbols.contains(target_symbol) { - queue.push_back(target_symbol.clone()); - } - } - } -} - -/// Emits Yul docs for the included contract init/deployed objects. -/// -/// * `contract_graph` - Contract region dependency graph. -/// * `docs_by_symbol` - Map from function symbol to emitted Yul docs. -/// * `included_contracts` - Contract names to include in the output. -/// -/// Returns Yul docs for the root contract objects or an [`EmitModuleError`]. -fn emit_contract_docs( - contract_graph: &mir::analysis::ContractGraph, - docs_by_symbol: &FxHashMap, - included_contracts: &FxHashSet, -) -> Result, EmitModuleError> { - if included_contracts.is_empty() { - return Ok(Vec::new()); - } - let mut contract_deps: FxHashMap> = FxHashMap::default(); - let mut referenced_contracts = FxHashSet::default(); - for (from_region, deps) in &contract_graph.region_deps { - if !included_contracts.contains(&from_region.contract_name) { - continue; - } - for dep in deps { - if dep.contract_name != from_region.contract_name - && included_contracts.contains(&dep.contract_name) - { - referenced_contracts.insert(dep.contract_name.clone()); - contract_deps - .entry(from_region.contract_name.clone()) - .or_default() - .insert(dep.contract_name.clone()); - } - } - } - - let mut root_contracts: Vec<_> = included_contracts - .iter() - .filter(|name| !referenced_contracts.contains(*name)) - .cloned() - .collect(); - root_contracts.sort(); - - if !included_contracts.is_empty() { - let mut visited = FxHashSet::default(); - let mut queue = VecDeque::new(); - for name in &root_contracts { - queue.push_back(name.clone()); - } - while let Some(name) = queue.pop_front() { - if !visited.insert(name.clone()) { - continue; - } - if let Some(deps) = contract_deps.get(&name) { - for dep in deps { - queue.push_back(dep.clone()); - } - } - } - if visited.len() != included_contracts.len() { - let mut missing: Vec<_> = contract_graph - .contracts - .keys() - .filter(|name| included_contracts.contains(*name)) - .filter(|name| !visited.contains(*name)) - .cloned() - .collect(); - missing.sort(); - return Err(EmitModuleError::Yul(YulError::Unsupported(format!( - "contract region graph is not rooted (cycle likely); unreachable contracts: {}", - missing.join(", ") - )))); - } - } - - let mut docs = Vec::new(); - for name in root_contracts { - if !contract_graph.contracts.contains_key(&name) { - continue; - } - let mut stack = Vec::new(); - docs.push( - emit_contract_init_object(&name, contract_graph, docs_by_symbol, &mut stack) - .map_err(EmitModuleError::Yul)?, - ); - } - Ok(docs) -} - -/// Emits Yul docs for standalone code regions reachable from the provided roots. -/// -/// * `call_graph` - Module call graph for reachability. -/// * `code_region_roots` - Root symbols to emit as code-region objects. -/// * `contract_graph` - Contract region graph used to skip contract entrypoints. -/// * `code_regions` - Mapping from symbol name to object label. -/// * `docs_by_symbol` - Map from function symbol to emitted Yul docs. -/// * `skip_roots` - Symbols to omit (e.g., test entrypoints). -/// -/// Returns the Yul docs for each emitted code-region object. -fn emit_code_region_docs( - call_graph: &CallGraph, - code_region_roots: &[String], - contract_graph: &mir::analysis::ContractGraph, - code_regions: &FxHashMap, - docs_by_symbol: &FxHashMap, - skip_roots: &FxHashSet, -) -> Vec { - let mut docs = Vec::new(); - for root in code_region_roots { - if skip_roots.contains(root) { - continue; - } - if contract_graph.symbol_to_region.contains_key(root) { - continue; - } - let Some(label) = code_regions.get(root) else { - continue; - }; - let reachable = reachable_functions(call_graph, root); - let mut region_docs = Vec::new(); - let mut seen_labels = FxHashSet::default(); - let mut data_regions = Vec::new(); - let mut symbols: Vec<_> = reachable.into_iter().collect(); - symbols.sort(); - for symbol in symbols { - if let Some(info) = docs_by_symbol.get(&symbol) { - region_docs.extend(info.docs.clone()); - for dr in &info.data_regions { - if seen_labels.insert(dr.label.clone()) { - data_regions.push(dr.clone()); - } - } - } - } - let mut components = vec![YulDoc::block("code ", region_docs)]; - components.extend(emit_data_sections(&data_regions)); - docs.push(YulDoc::block(format!("object \"{label}\" "), components)); - } - docs -} - -/// Emits a runnable Yul object for a single test, including dependencies. -/// -/// * `call_graph` - Module call graph for reachability. -/// * `docs_by_symbol` - Map from function symbol to emitted Yul docs. -/// * `dependency_docs` - Yul docs for contract/code-region dependencies. -/// * `test` - Test metadata describing the entrypoint and arity. -/// -/// Returns the assembled Yul doc tree for the test object. -fn emit_test_object( - call_graph: &CallGraph, - docs_by_symbol: &FxHashMap, - dependency_docs: &[YulDoc], - test: &TestInfo, -) -> Result { - let reachable = reachable_functions(call_graph, &test.symbol_name); - let mut symbols: Vec<_> = reachable.into_iter().collect(); - symbols.sort(); - - let mut runtime_docs = Vec::new(); - let mut data_regions = Vec::new(); - let mut seen_labels = FxHashSet::default(); - for symbol in symbols { - if let Some(info) = docs_by_symbol.get(&symbol) { - runtime_docs.extend(info.docs.clone()); - // Collect data regions from reachable functions - for dr in &info.data_regions { - if seen_labels.insert(dr.label.clone()) { - data_regions.push(dr.clone()); - } - } - } - } - - let total_param_count = test.value_param_count + test.effect_param_count; - let call_args = format_call_args(total_param_count); - let test_symbol = prefix_yul_name(&test.symbol_name); - if call_args.is_empty() { - runtime_docs.push(YulDoc::line(format!("{test_symbol}()"))); - } else { - runtime_docs.push(YulDoc::line(format!("{test_symbol}({call_args})"))); - } - runtime_docs.push(YulDoc::line("return(0, 0)")); - - let mut runtime_components = vec![YulDoc::block("code ", runtime_docs)]; - for doc in dependency_docs { - runtime_components.push(YulDoc::line(String::new())); - runtime_components.push(doc.clone()); - } - - // Emit data sections in the runtime object - runtime_components.extend(emit_data_sections(&data_regions)); - - let runtime_obj = YulDoc::block("object \"runtime\" ", runtime_components); - - let mut components = vec![YulDoc::block( - "code ", - vec![ - YulDoc::line("datacopy(0, dataoffset(\"runtime\"), datasize(\"runtime\"))"), - YulDoc::line("return(0, datasize(\"runtime\"))"), - ], - )]; - components.push(YulDoc::line(String::new())); - components.push(runtime_obj); - - Ok(YulDoc::block( - format!("object \"{}\" ", test.object_name), - components, - )) -} - -/// Formats a comma-separated list of zero literals for the given arity. -/// -/// * `count` - Number of arguments to generate. -/// -/// Returns the argument list string or an empty string when `count` is zero. -fn format_call_args(count: usize) -> String { - if count == 0 { - return String::new(); - } - std::iter::repeat_n("0", count) - .collect::>() - .join(", ") -} - -/// Emits the contract init object and its direct region dependencies. -/// -/// * `name` - Contract name to emit. -/// * `graph` - Contract region dependency graph. -/// * `docs_by_symbol` - Map from function symbol to emitted Yul docs. -/// * `stack` - Region stack used for cycle detection. -/// -/// Returns the Yul doc for the init object or a [`YulError`]. -fn emit_contract_init_object( - name: &str, - graph: &mir::analysis::ContractGraph, - docs_by_symbol: &FxHashMap, - stack: &mut Vec, -) -> Result { - let entry = graph - .contracts - .get(name) - .ok_or_else(|| YulError::Unsupported(format!("missing contract info for `{name}`")))?; - let region = ContractRegion { - contract_name: name.to_string(), - kind: ContractRegionKind::Init, - }; - push_region(stack, ®ion)?; - - let mut components = Vec::new(); - - let mut init_docs = Vec::new(); - if let Some(symbol) = &entry.init_symbol { - init_docs.extend(reachable_docs_for_region(graph, ®ion, docs_by_symbol)); - let symbol = prefix_yul_name(symbol); - init_docs.push(YulDoc::line(format!("{symbol}()"))); - } - components.push(YulDoc::block("code ", init_docs)); - - // Always emit the deployed object (if present) for the contract itself. - if entry.deployed_symbol.is_some() { - components.push(YulDoc::line(String::new())); - components.push(emit_contract_deployed_object( - name, - graph, - docs_by_symbol, - stack, - )?); - } - - // Emit direct region dependencies as children of the init object. These must be direct - // children to satisfy Yul `dataoffset/datasize` scoping rules. - let deps = graph.region_deps.get(®ion).cloned().unwrap_or_default(); - let mut deps: Vec<_> = deps - .into_iter() - .filter(|dep| { - !(dep.contract_name == name && matches!(dep.kind, ContractRegionKind::Deployed)) - }) - .collect(); - deps.sort(); - for dep in deps { - components.push(emit_region_object(&dep, graph, docs_by_symbol, stack)?); - } - - // Emit data sections for this region (large const strings/arrays) - let data_regions = reachable_data_regions_for_region(graph, ®ion, docs_by_symbol); - components.extend(emit_data_sections(&data_regions)); - - pop_region(stack, ®ion); - Ok(YulDoc::block(format!("object \"{name}\" "), components)) -} - -/// Emits the deployed/runtime object for a contract. -/// -/// * `contract_name` - Contract name to emit. -/// * `graph` - Contract region dependency graph. -/// * `docs_by_symbol` - Map from function symbol to emitted Yul docs. -/// * `stack` - Region stack used for cycle detection. -/// -/// Returns the Yul doc for the deployed object or a [`YulError`]. -fn emit_contract_deployed_object( - contract_name: &str, - graph: &mir::analysis::ContractGraph, - docs_by_symbol: &FxHashMap, - stack: &mut Vec, -) -> Result { - let entry = graph.contracts.get(contract_name).ok_or_else(|| { - YulError::Unsupported(format!("missing contract info for `{contract_name}`")) - })?; - let Some(symbol) = &entry.deployed_symbol else { - return Err(YulError::Unsupported(format!( - "missing deployed entrypoint for `{contract_name}`" - ))); - }; - - let region = ContractRegion { - contract_name: contract_name.to_string(), - kind: ContractRegionKind::Deployed, - }; - push_region(stack, ®ion)?; - - let mut runtime_docs = Vec::new(); - runtime_docs.extend(reachable_docs_for_region(graph, ®ion, docs_by_symbol)); - let symbol = prefix_yul_name(symbol); - runtime_docs.push(YulDoc::line(format!("{symbol}()"))); - runtime_docs.push(YulDoc::line("return(0, 0)")); - - let mut components = vec![YulDoc::block("code ", runtime_docs)]; - - let deps = graph.region_deps.get(®ion).cloned().unwrap_or_default(); - let mut deps: Vec<_> = deps.into_iter().collect(); - deps.sort(); - for dep in deps { - components.push(emit_region_object(&dep, graph, docs_by_symbol, stack)?); - } - - // Emit data sections for this region (large const strings/arrays) - let data_regions = reachable_data_regions_for_region(graph, ®ion, docs_by_symbol); - components.extend(emit_data_sections(&data_regions)); - - pop_region(stack, ®ion); - Ok(YulDoc::block( - format!("object \"{contract_name}_deployed\" "), - components, - )) -} - -/// Dispatches region emission based on the region kind. -/// -/// * `region` - Target contract region. -/// * `graph` - Contract region dependency graph. -/// * `docs_by_symbol` - Map from function symbol to emitted Yul docs. -/// * `stack` - Region stack used for cycle detection. -/// -/// Returns the Yul doc for the requested region. -fn emit_region_object( - region: &ContractRegion, - graph: &mir::analysis::ContractGraph, - docs_by_symbol: &FxHashMap, - stack: &mut Vec, -) -> Result { - match region.kind { - ContractRegionKind::Init => { - emit_contract_init_object(®ion.contract_name, graph, docs_by_symbol, stack) - } - ContractRegionKind::Deployed => { - emit_contract_deployed_object(®ion.contract_name, graph, docs_by_symbol, stack) - } - } -} - -/// Collects emitted Yul docs for symbols reachable from a contract region. -/// -/// * `graph` - Contract region dependency graph. -/// * `region` - Region whose reachable symbols should be emitted. -/// * `docs_by_symbol` - Map from function symbol to emitted Yul docs. -/// -/// Returns the Yul docs in stable symbol order. -fn reachable_docs_for_region( - graph: &mir::analysis::ContractGraph, - region: &ContractRegion, - docs_by_symbol: &FxHashMap, -) -> Vec { - let mut docs = Vec::new(); - let Some(reachable) = graph.region_reachable.get(region) else { - return docs; - }; - let mut symbols: Vec<_> = reachable.iter().cloned().collect(); - symbols.sort(); - for symbol in symbols { - if let Some(info) = docs_by_symbol.get(&symbol) { - docs.extend(info.docs.clone()); - } - } - docs -} - -/// Pushes a region onto the stack, reporting cycles as errors. -/// -/// * `stack` - Active region stack used for cycle detection. -/// * `region` - Region to push onto the stack. -/// -/// Returns `Ok(())` or a [`YulError`] when a cycle is detected. -fn push_region(stack: &mut Vec, region: &ContractRegion) -> Result<(), YulError> { - if stack.iter().any(|r| r == region) { - let mut cycle = stack - .iter() - .map(|r| format!("{}::{:?}", r.contract_name, r.kind)) - .collect::>(); - cycle.push(format!("{}::{:?}", region.contract_name, region.kind)); - return Err(YulError::Unsupported(format!( - "cycle detected in contract region graph: {}", - cycle.join(" -> ") - ))); - } - stack.push(region.clone()); - Ok(()) -} - -/// Pops the last region and asserts it matches `region`. -/// -/// * `stack` - Active region stack. -/// * `region` - Region expected at the top of the stack. -/// -/// Returns nothing. -fn pop_region(stack: &mut Vec, region: &ContractRegion) { - let popped = stack.pop(); - debug_assert_eq!(popped.as_ref(), Some(region)); -} - -/// Collects data regions for symbols reachable from a contract region. -/// -/// * `graph` - Contract region dependency graph. -/// * `region` - Region whose data regions should be collected. -/// * `docs_by_symbol` - Map from function symbol to emitted Yul docs and data regions. -/// -/// Returns the data regions in stable symbol order, deduplicated by label. -fn reachable_data_regions_for_region( - graph: &mir::analysis::ContractGraph, - region: &ContractRegion, - docs_by_symbol: &FxHashMap, -) -> Vec { - let mut data_regions = Vec::new(); - let mut seen_labels = FxHashSet::default(); - let Some(reachable) = graph.region_reachable.get(region) else { - return data_regions; - }; - let mut symbols: Vec<_> = reachable.iter().cloned().collect(); - symbols.sort(); - for symbol in symbols { - if let Some(info) = docs_by_symbol.get(&symbol) { - for dr in &info.data_regions { - if seen_labels.insert(dr.label.clone()) { - data_regions.push(dr.clone()); - } - } - } - } - data_regions -} - -/// Emits Yul data sections for a list of data region definitions. -/// -/// * `data_regions` - Data regions to emit. -/// -/// Returns Yul docs for each data section. -fn emit_data_sections(data_regions: &[YulDataRegion]) -> Vec { - data_regions - .iter() - .map(|dr| { - YulDoc::line(format!( - "data \"{}\" hex\"{}\"", - dr.label, - hex::encode(&dr.bytes) - )) - }) - .collect() -} - -#[cfg(test)] -mod tests { - use super::{TestInfo, assign_test_object_names}; - - /// Ensures test object names are disambiguated with numeric suffixes. - #[test] - fn test_object_name_collision_suffixes() { - let mut tests = vec![ - TestInfo { - hir_name: "foo".to_string(), - display_name: "foo bar".to_string(), - symbol_name: "sym1".to_string(), - object_name: String::new(), - value_param_count: 0, - effect_param_count: 0, - expected_revert: None, - }, - TestInfo { - hir_name: "foo_bar".to_string(), - display_name: "foo_bar".to_string(), - symbol_name: "sym2".to_string(), - object_name: String::new(), - value_param_count: 0, - effect_param_count: 0, - expected_revert: None, - }, - ]; - - assign_test_object_names(&mut tests); - - let mut by_name = tests - .into_iter() - .map(|test| (test.display_name, test.object_name)) - .collect::>(); - - assert_eq!(by_name.remove("foo bar").as_deref(), Some("test_foo_bar_1")); - assert_eq!(by_name.remove("foo_bar").as_deref(), Some("test_foo_bar_2")); - } -} diff --git a/crates/codegen/src/yul/emitter/statements.rs b/crates/codegen/src/yul/emitter/statements.rs deleted file mode 100644 index eac56f32ee..0000000000 --- a/crates/codegen/src/yul/emitter/statements.rs +++ /dev/null @@ -1,778 +0,0 @@ -//! Helpers for lowering linear MIR statements into Yul docs. -//! -//! The functions defined in this module operate within `FunctionEmitter` and walk -//! straight-line MIR instructions (non-terminators) to produce Yul statements. - -use hir::projection::Projection; -use mir::ir::{IntrinsicOp, IntrinsicValue}; -use mir::{self, LocalId, MirProjectionPath, ValueId, layout}; - -use crate::yul::{doc::YulDoc, state::BlockState}; - -use super::{YulError, function::FunctionEmitter}; - -impl<'db> FunctionEmitter<'db> { - /// Lowers a linear sequence of MIR instructions into Yul docs. - /// - /// * `insts` - MIR instructions belonging to the current block. - /// * `state` - Mutable binding table shared across the block. - /// - /// Returns all emitted Yul statements prior to the block terminator. - pub(super) fn render_statements( - &mut self, - insts: &[mir::MirInst<'db>], - state: &mut BlockState, - ) -> Result, YulError> { - let mut docs = Vec::new(); - for inst in insts { - self.emit_inst(&mut docs, inst, state)?; - } - Ok(docs) - } - - /// Dispatches an individual MIR instruction to the appropriate lowering helper. - /// - /// * `docs` - Accumulator that stores every emitted Yul statement. - /// * `inst` - Instruction being lowered. - /// * `state` - Mutable per-block binding state shared across helpers. - /// - /// Returns `Ok(())` once the instruction has been lowered. - fn emit_inst( - &mut self, - docs: &mut Vec, - inst: &mir::MirInst<'db>, - state: &mut BlockState, - ) -> Result<(), YulError> { - match inst { - mir::MirInst::Assign { dest, rvalue, .. } => { - self.emit_assign_inst(docs, *dest, rvalue, state)? - } - mir::MirInst::BindValue { value, .. } => { - self.emit_bind_value_inst(docs, *value, state)? - } - mir::MirInst::Store { place, value, .. } => { - self.emit_store_inst(docs, place, *value, state)? - } - mir::MirInst::InitAggregate { place, inits, .. } => { - self.emit_init_aggregate_inst(docs, place, inits, state)? - } - mir::MirInst::SetDiscriminant { place, variant, .. } => { - self.emit_set_discriminant_inst(docs, place, *variant, state)? - } - } - Ok(()) - } - - fn emit_assign_inst( - &mut self, - docs: &mut Vec, - dest: Option, - rvalue: &mir::ir::Rvalue<'db>, - state: &mut BlockState, - ) -> Result<(), YulError> { - match rvalue { - mir::ir::Rvalue::ZeroInit => { - let Some(dest) = dest else { - return Err(YulError::Unsupported( - "zero init without destination".into(), - )); - }; - let (yul_name, declared) = self.resolve_local_for_write(dest, state)?; - if declared { - docs.push(YulDoc::line(format!("let {yul_name} := 0"))); - } else { - docs.push(YulDoc::line(format!("{yul_name} := 0"))); - } - } - mir::ir::Rvalue::Value(value_id) => { - if let Some(dest) = dest { - let rhs = self.lower_value(*value_id, state)?; - let (yul_name, declared) = self.resolve_local_for_write(dest, state)?; - if declared { - docs.push(YulDoc::line(format!("let {yul_name} := {rhs}"))); - } else { - docs.push(YulDoc::line(format!("{yul_name} := {rhs}"))); - } - } else { - self.emit_eval_inst(docs, *value_id, state)?; - } - } - mir::ir::Rvalue::Call(call) => self.emit_call_inst(docs, dest, call, state)?, - mir::ir::Rvalue::Intrinsic { op, args } => { - self.emit_intrinsic_inst(docs, dest, *op, args, state)? - } - mir::ir::Rvalue::Load { place } => { - let Some(dest) = dest else { - return Err(YulError::Unsupported("load without destination".into())); - }; - self.emit_load_inst(docs, dest, place, state)? - } - mir::ir::Rvalue::Alloc { address_space } => { - let Some(dest) = dest else { - return Err(YulError::Unsupported("alloc without destination".into())); - }; - self.emit_alloc_inst(docs, dest, *address_space, state)? - } - mir::ir::Rvalue::ConstAggregate { data, .. } => { - let Some(dest) = dest else { - return Err(YulError::Unsupported( - "const_aggregate without destination".into(), - )); - }; - self.emit_const_aggregate_inst(docs, dest, data, state)? - } - } - Ok(()) - } - - /// Emits an expression statement whose value is not reused. - /// - /// * `docs` - Accumulator for any generated docs. - /// * `value` - MIR value used for the expression statement. - /// * `state` - Block state containing active bindings. - /// - /// Refrains from re-emitting expressions consumed elsewhere and returns `Ok(())` - /// after optionally pushing a doc. - fn emit_eval_inst( - &mut self, - docs: &mut Vec, - value: ValueId, - state: &mut BlockState, - ) -> Result<(), YulError> { - if state.value_temp(value.index()).is_some() { - return Ok(()); - } - - let expr = self.lower_value(value, state)?; - docs.push(YulDoc::line(format!("pop({expr})"))); - Ok(()) - } - - fn resolve_local_for_write( - &self, - local: LocalId, - state: &mut BlockState, - ) -> Result<(String, bool), YulError> { - if let Some(existing) = state.local(local) { - if !self.mir_func.body.local(local).is_mut { - return Err(YulError::Unsupported( - "assignment to immutable local".into(), - )); - } - return Ok((existing, false)); - } - let temp = state.alloc_local(); - state.insert_local(local, temp.clone()); - Ok((temp, true)) - } - - fn emit_call_inst( - &mut self, - docs: &mut Vec, - dest: Option, - call: &mir::CallOrigin<'db>, - state: &mut BlockState, - ) -> Result<(), YulError> { - let call_expr = self.lower_call_value(call, state)?; - if let Some(dest) = dest { - let (yul_name, declared) = self.resolve_local_for_write(dest, state)?; - if declared { - docs.push(YulDoc::line(format!("let {yul_name} := {call_expr}"))); - } else { - docs.push(YulDoc::line(format!("{yul_name} := {call_expr}"))); - } - } else { - docs.push(YulDoc::line(call_expr)); - } - Ok(()) - } - - fn emit_bind_value_inst( - &mut self, - docs: &mut Vec, - value: ValueId, - state: &mut BlockState, - ) -> Result<(), YulError> { - if state.value_temp(value.index()).is_some() { - return Ok(()); - } - - let temp = state.alloc_local(); - let lowered = self.lower_value(value, state)?; - state.insert_value_temp(value.index(), temp.clone()); - docs.push(YulDoc::line(format!("let {temp} := {lowered}"))); - Ok(()) - } - - fn emit_alloc_value( - &self, - docs: &mut Vec, - name: &str, - size_bytes: usize, - declare: bool, - ) { - let size = size_bytes.to_string(); - if declare { - docs.push(YulDoc::line(format!("let {name} := mload(0x40)"))); - } else { - docs.push(YulDoc::line(format!("{name} := mload(0x40)"))); - } - docs.push(YulDoc::block( - format!("if iszero({name}) "), - vec![YulDoc::line(format!("{name} := 0x80"))], - )); - docs.push(YulDoc::line(format!("mstore(0x40, add({name}, {size}))"))); - } - - fn emit_alloc_inst( - &mut self, - docs: &mut Vec, - dest: LocalId, - address_space: mir::ir::AddressSpaceKind, - state: &mut BlockState, - ) -> Result<(), YulError> { - if !matches!(address_space, mir::ir::AddressSpaceKind::Memory) { - return Err(YulError::Unsupported( - "alloc is only supported for memory".into(), - )); - } - let ty = self.mir_func.body.local(dest).ty; - let Some(size_bytes) = layout::ty_memory_size_or_word_in(self.db, &self.layout, ty) else { - return Err(YulError::Unsupported(format!( - "cannot determine allocation size for `{}`", - ty.pretty_print(self.db) - ))); - }; - let (yul_name, declared) = self.resolve_local_for_write(dest, state)?; - self.emit_alloc_value(docs, &yul_name, size_bytes, declared); - Ok(()) - } - - /// Emits a constant aggregate by registering data for a Yul data section - /// and copying it into allocated memory. - fn emit_const_aggregate_inst( - &mut self, - docs: &mut Vec, - dest: LocalId, - data: &[u8], - state: &mut BlockState, - ) -> Result<(), YulError> { - let label = self.register_data_region(data.to_vec()); - let size = data.len(); - let (yul_name, declared) = self.resolve_local_for_write(dest, state)?; - // Allocate memory for the data - self.emit_alloc_value(docs, &yul_name, size, declared); - // Copy data from bytecode to memory - docs.push(YulDoc::line(format!( - "datacopy({yul_name}, dataoffset(\"{label}\"), datasize(\"{label}\"))" - ))); - Ok(()) - } - - fn emit_load_inst( - &mut self, - docs: &mut Vec, - dest: LocalId, - place: &mir::ir::Place<'db>, - state: &mut BlockState, - ) -> Result<(), YulError> { - let ty = self.mir_func.body.local(dest).ty; - let rhs = self.lower_place_load(place, ty, state)?; - let (yul_name, declared) = self.resolve_local_for_write(dest, state)?; - if declared { - docs.push(YulDoc::line(format!("let {yul_name} := {rhs}"))); - } else { - docs.push(YulDoc::line(format!("{yul_name} := {rhs}"))); - } - Ok(()) - } - - fn emit_store_inst( - &mut self, - docs: &mut Vec, - place: &mir::ir::Place<'db>, - value: ValueId, - state: &mut BlockState, - ) -> Result<(), YulError> { - let value_data = self.mir_func.body.value(value); - let value_ty = value_data.ty; - if layout::ty_size_bytes_in(self.db, &self.layout, value_ty).is_some_and(|size| size == 0) { - return Ok(()); - } - if value_data.repr.is_ref() { - if state.value_temp(value.index()).is_none() { - let rhs = self.lower_value(value, state)?; - let temp = state.alloc_local(); - state.insert_value_temp(value.index(), temp.clone()); - docs.push(YulDoc::line(format!("let {temp} := {rhs}"))); - } - let src_place = mir::ir::Place::new(value, MirProjectionPath::new()); - return self.emit_store_from_places(docs, place, &src_place, value_ty, state); - } - - let addr = self.lower_place_ref(place, state)?; - let rhs = self.lower_value(value, state)?; - let stored = self.apply_to_word_conversion(&rhs, value_ty); - let space = self.mir_func.body.place_address_space(place); - docs.push(YulDoc::line(Self::yul_store(space, &addr, &stored))); - Ok(()) - } - - fn emit_init_aggregate_inst( - &mut self, - docs: &mut Vec, - place: &mir::ir::Place<'db>, - inits: &[(MirProjectionPath<'db>, ValueId)], - state: &mut BlockState, - ) -> Result<(), YulError> { - for (path, value) in inits { - let mut target = place.clone(); - for proj in path.iter() { - target = self.extend_place(&target, proj.clone()); - } - self.emit_store_inst(docs, &target, *value, state)?; - } - Ok(()) - } - - fn emit_store_from_places( - &mut self, - docs: &mut Vec, - dst_place: &mir::ir::Place<'db>, - src_place: &mir::ir::Place<'db>, - value_ty: hir::analysis::ty::ty_def::TyId<'db>, - state: &mut BlockState, - ) -> Result<(), YulError> { - if layout::ty_size_bytes_in(self.db, &self.layout, value_ty).is_some_and(|size| size == 0) { - return Ok(()); - } - if value_ty.is_array(self.db) { - let Some(len) = layout::array_len(self.db, value_ty) else { - return Err(YulError::Unsupported( - "array store requires a constant length".into(), - )); - }; - let elem_ty = layout::array_elem_ty(self.db, value_ty) - .ok_or_else(|| YulError::Unsupported("array store requires element type".into()))?; - for idx in 0..len { - let dst_elem = self.extend_place( - dst_place, - Projection::Index(hir::projection::IndexSource::Constant(idx)), - ); - let src_elem = self.extend_place( - src_place, - Projection::Index(hir::projection::IndexSource::Constant(idx)), - ); - self.emit_store_from_places(docs, &dst_elem, &src_elem, elem_ty, state)?; - } - return Ok(()); - } - - if value_ty.field_count(self.db) > 0 { - let field_tys = value_ty.field_types(self.db); - for (field_idx, field_ty) in field_tys.into_iter().enumerate() { - let dst_field = self.extend_place(dst_place, Projection::Field(field_idx)); - let src_field = self.extend_place(src_place, Projection::Field(field_idx)); - self.emit_store_from_places(docs, &dst_field, &src_field, field_ty, state)?; - } - return Ok(()); - } - - if value_ty - .adt_ref(self.db) - .is_some_and(|adt| matches!(adt, hir::analysis::ty::adt_def::AdtRef::Enum(_))) - { - return self.emit_enum_store(docs, dst_place, src_place, value_ty, state); - } - - let addr = self.lower_place_ref(dst_place, state)?; - let rhs = self.lower_place_load(src_place, value_ty, state)?; - let stored = self.apply_to_word_conversion(&rhs, value_ty); - let space = self.mir_func.body.place_address_space(dst_place); - docs.push(YulDoc::line(Self::yul_store(space, &addr, &stored))); - Ok(()) - } - - fn emit_enum_store( - &mut self, - docs: &mut Vec, - dst_place: &mir::ir::Place<'db>, - src_place: &mir::ir::Place<'db>, - enum_ty: hir::analysis::ty::ty_def::TyId<'db>, - state: &mut BlockState, - ) -> Result<(), YulError> { - let src_addr = self.lower_place_ref(src_place, state)?; - let dst_addr = self.lower_place_ref(dst_place, state)?; - let src_space = self.mir_func.body.place_address_space(src_place); - let dst_space = self.mir_func.body.place_address_space(dst_place); - let discr = Self::yul_load(src_space, &src_addr); - let discr_temp = state.alloc_local(); - docs.push(YulDoc::line(format!("let {discr_temp} := {discr}"))); - docs.push(YulDoc::line(Self::yul_store( - dst_space, - &dst_addr, - &discr_temp, - ))); - - let Some(adt_def) = enum_ty.adt_def(self.db) else { - return Err(YulError::Unsupported("enum store requires enum adt".into())); - }; - let hir::analysis::ty::adt_def::AdtRef::Enum(enm) = adt_def.adt_ref(self.db) else { - return Err(YulError::Unsupported("enum store requires enum adt".into())); - }; - - docs.push(YulDoc::line(format!("switch {discr_temp}"))); - let variants = adt_def.fields(self.db); - for (idx, _) in variants.iter().enumerate() { - let enum_variant = hir::hir_def::EnumVariant::new(enm, idx); - let ctor = hir::analysis::ty::simplified_pattern::ConstructorKind::Variant( - enum_variant, - enum_ty, - ); - let field_tys = ctor.field_types(self.db); - let mut case_docs = Vec::new(); - for (field_idx, field_ty) in field_tys.iter().enumerate() { - let proj = Projection::VariantField { - variant: enum_variant, - enum_ty, - field_idx, - }; - let dst_field = self.extend_place(dst_place, proj.clone()); - let src_field = self.extend_place(src_place, proj); - self.emit_store_from_places( - &mut case_docs, - &dst_field, - &src_field, - *field_ty, - state, - )?; - } - let literal = idx as u64; - docs.push(YulDoc::wide_block(format!(" case {literal} "), case_docs)); - } - docs.push(YulDoc::wide_block(" default ", Vec::new())); - Ok(()) - } - - fn emit_set_discriminant_inst( - &mut self, - docs: &mut Vec, - place: &mir::ir::Place<'db>, - variant: hir::hir_def::EnumVariant<'db>, - state: &mut BlockState, - ) -> Result<(), YulError> { - let addr = self.lower_place_ref(place, state)?; - let value = (variant.idx as u64).to_string(); - let space = self.mir_func.body.place_address_space(place); - docs.push(YulDoc::line(Self::yul_store(space, &addr, &value))); - Ok(()) - } - - fn extend_place( - &self, - place: &mir::ir::Place<'db>, - proj: Projection< - hir::analysis::ty::ty_def::TyId<'db>, - hir::hir_def::EnumVariant<'db>, - ValueId, - >, - ) -> mir::ir::Place<'db> { - let mut path = place.projection.clone(); - path.push(proj); - mir::ir::Place::new(place.base, path) - } - - fn yul_store(space: mir::ir::AddressSpaceKind, addr: &str, value: &str) -> String { - match space { - mir::ir::AddressSpaceKind::Memory => format!("mstore({addr}, {value})"), - mir::ir::AddressSpaceKind::Calldata => unreachable!("write to calldata"), - mir::ir::AddressSpaceKind::Storage => format!("sstore({addr}, {value})"), - mir::ir::AddressSpaceKind::TransientStorage => format!("tstore({addr}, {value})"), - } - } - - fn yul_load(space: mir::ir::AddressSpaceKind, addr: &str) -> String { - match space { - mir::ir::AddressSpaceKind::Memory => format!("mload({addr})"), - mir::ir::AddressSpaceKind::Calldata => format!("calldataload({addr})"), - mir::ir::AddressSpaceKind::Storage => format!("sload({addr})"), - mir::ir::AddressSpaceKind::TransientStorage => format!("tload({addr})"), - } - } - - /// Emits Yul for an intrinsic instruction. - /// - /// * `docs` - Collection to append the statement to when one is emitted. - /// * `dest` - Optional destination local (value-returning intrinsics only). - /// * `op` - Intrinsic opcode. - /// * `args` - MIR value arguments. - /// * `state` - Block-local bindings used to lower the arguments. - /// - /// Returns `Ok(())` once the intrinsic (if applicable) has been appended. - fn emit_intrinsic_inst( - &mut self, - docs: &mut Vec, - dest: Option, - op: IntrinsicOp, - args: &[ValueId], - state: &mut BlockState, - ) -> Result<(), YulError> { - if matches!(op, IntrinsicOp::Alloc) { - return self.emit_evm_alloc_intrinsic(docs, dest, args, state); - } - - let intr = IntrinsicValue { - op, - args: args.to_vec(), - }; - if let Some(dest) = dest { - let expr = self.lower_intrinsic_value(&intr, state)?; - let (yul_name, declared) = self.resolve_local_for_write(dest, state)?; - if declared { - docs.push(YulDoc::line(format!("let {yul_name} := {expr}"))); - } else { - docs.push(YulDoc::line(format!("{yul_name} := {expr}"))); - } - return Ok(()); - } - - if intr.op.returns_value() { - let expr = self.lower_intrinsic_value(&intr, state)?; - docs.push(YulDoc::line(format!("pop({expr})"))); - return Ok(()); - } - - if let Some(doc) = self.lower_intrinsic_stmt(&intr, state)? { - docs.push(doc); - } - Ok(()) - } - - fn emit_evm_alloc_intrinsic( - &mut self, - docs: &mut Vec, - dest: Option, - args: &[ValueId], - state: &mut BlockState, - ) -> Result<(), YulError> { - debug_assert_eq!(args.len(), 1, "alloc intrinsic expects 1 argument"); - let (ptr, declared) = match dest { - Some(dest) => self.resolve_local_for_write(dest, state)?, - None => (state.alloc_local(), true), - }; - - let size = self.lower_value(args[0], state)?; - // If we're assigning back into an existing local, avoid clobbering the size expression - // (e.g. `x = alloc(x)`). - let size = if !declared { - let size_tmp = state.alloc_local(); - docs.push(YulDoc::line(format!("let {size_tmp} := {size}"))); - size_tmp - } else { - size - }; - - if declared { - docs.push(YulDoc::line(format!("let {ptr} := mload(64)"))); - } else { - docs.push(YulDoc::line(format!("{ptr} := mload(64)"))); - } - docs.push(YulDoc::block( - format!("if iszero({ptr}) "), - vec![YulDoc::line(format!("{ptr} := 0x80"))], - )); - docs.push(YulDoc::line(format!("mstore(64, add({ptr}, {size}))"))); - Ok(()) - } - - /// Converts intrinsic value-producing operations (`mload`/`sload`) into Yul. - /// - /// * `intr` - Intrinsic call metadata containing opcode and arguments. - /// * `state` - Read-only block state needed to lower arguments. - /// - /// Returns the Yul expression describing the intrinsic invocation. - pub(super) fn lower_intrinsic_value( - &self, - intr: &IntrinsicValue, - state: &BlockState, - ) -> Result { - if !intr.op.returns_value() { - return Err(YulError::Unsupported( - "intrinsic does not yield a value".into(), - )); - } - if matches!(intr.op, IntrinsicOp::Alloc) { - return Err(YulError::Unsupported( - "alloc intrinsic must be emitted as a statement".into(), - )); - } - if matches!(intr.op, IntrinsicOp::AddrOf) { - let args = self.lower_intrinsic_args(intr, state)?; - debug_assert_eq!(args.len(), 1, "addr_of expects 1 argument"); - return Ok(args.into_iter().next().expect("addr_of expects 1 argument")); - } - if matches!( - intr.op, - IntrinsicOp::CodeRegionOffset | IntrinsicOp::CodeRegionLen - ) { - return self.lower_code_region_query(intr); - } - if matches!(intr.op, IntrinsicOp::CurrentCodeRegionLen) { - return self.lower_current_code_region_len(intr); - } - let args = self.lower_intrinsic_args(intr, state)?; - Ok(format!( - "{}({})", - self.intrinsic_name(intr.op), - args.join(", ") - )) - } - - /// Lowers `code_region_offset/len` into `dataoffset/datasize`. - fn lower_code_region_query(&self, intr: &IntrinsicValue) -> Result { - debug_assert_eq!( - intr.args.len(), - 1, - "code region intrinsic expects 1 argument" - ); - let mut arg = intr.args[0]; - while let mir::ValueOrigin::TransparentCast { value } = - &self.mir_func.body.value(arg).origin - { - arg = *value; - } - let symbol = match &self.mir_func.body.value(arg).origin { - mir::ValueOrigin::FuncItem(root) => root.symbol.as_deref().ok_or_else(|| { - YulError::Unsupported( - "code region function item is missing a resolved symbol".into(), - ) - })?, - _ => { - return Err(YulError::Unsupported( - "code region intrinsic argument must be a function item".into(), - )); - } - }; - let label = self.code_regions.get(symbol).ok_or_else(|| { - YulError::Unsupported(format!("no code region available for `{symbol}`")) - })?; - let op = match intr.op { - IntrinsicOp::CodeRegionOffset => "dataoffset", - IntrinsicOp::CodeRegionLen => "datasize", - _ => unreachable!(), - }; - Ok(format!("{op}(\"{label}\")")) - } - - /// Lowers `current_code_region_len` into `datasize("")`. - fn lower_current_code_region_len(&self, intr: &IntrinsicValue) -> Result { - if !intr.args.is_empty() { - return Err(YulError::Unsupported( - "current code region len intrinsic expects 0 arguments".into(), - )); - } - - let Some(label) = self.code_regions.get(&self.mir_func.symbol_name) else { - return Err(YulError::Unsupported(format!( - "current_code_region_len is only supported in code region root functions; `{}` is not a root", - self.mir_func.symbol_name - ))); - }; - Ok(format!("datasize(\"{label}\")")) - } - - /// Converts intrinsic statement operations (`mstore`, …) into Yul. - /// - /// * `intr` - Intrinsic call metadata describing the opcode and args. - /// * `state` - Block state needed to lower the intrinsic operands. - /// - /// Returns the emitted doc when the intrinsic performs work. - pub(super) fn lower_intrinsic_stmt( - &self, - intr: &IntrinsicValue, - state: &BlockState, - ) -> Result, YulError> { - if intr.op.returns_value() { - return Ok(None); - } - let args = self.lower_intrinsic_args(intr, state)?; - let line = match intr.op { - IntrinsicOp::Mstore => { - format!("mstore({}, {})", args[0], args[1]) - } - IntrinsicOp::Mstore8 => { - format!("mstore8({}, {})", args[0], args[1]) - } - IntrinsicOp::Sstore => { - format!("sstore({}, {})", args[0], args[1]) - } - IntrinsicOp::ReturnData => { - format!("return({}, {})", args[0], args[1]) - } - IntrinsicOp::Revert => { - format!("revert({}, {})", args[0], args[1]) - } - IntrinsicOp::Codecopy => { - format!("codecopy({}, {}, {})", args[0], args[1], args[2]) - } - IntrinsicOp::Calldatacopy => { - format!("calldatacopy({}, {}, {})", args[0], args[1], args[2]) - } - IntrinsicOp::Returndatacopy => { - format!("returndatacopy({}, {}, {})", args[0], args[1], args[2]) - } - _ => unreachable!(), - }; - Ok(Some(YulDoc::line(line))) - } - - /// Lowers all intrinsic arguments into Yul expressions. - /// - /// * `intr` - Intrinsic call describing the operands. - /// * `state` - Block state used to lower each operand. - /// - /// Returns the lowered argument list in call order. - fn lower_intrinsic_args( - &self, - intr: &IntrinsicValue, - state: &BlockState, - ) -> Result, YulError> { - intr.args - .iter() - .map(|arg| self.lower_value(*arg, state)) - .collect() - } - - /// Returns the Yul builtin name for an intrinsic opcode. - /// - /// * `op` - Intrinsic opcode to translate. - /// - /// Returns the canonical Yul mnemonic corresponding to the opcode. - fn intrinsic_name(&self, op: IntrinsicOp) -> &'static str { - match op { - IntrinsicOp::Alloc => "alloc", - IntrinsicOp::Mload => "mload", - IntrinsicOp::Calldataload => "calldataload", - IntrinsicOp::Calldatacopy => "calldatacopy", - IntrinsicOp::Calldatasize => "calldatasize", - IntrinsicOp::Returndatacopy => "returndatacopy", - IntrinsicOp::Returndatasize => "returndatasize", - IntrinsicOp::AddrOf => "addr_of", - IntrinsicOp::Mstore => "mstore", - IntrinsicOp::Mstore8 => "mstore8", - IntrinsicOp::Sload => "sload", - IntrinsicOp::Sstore => "sstore", - IntrinsicOp::ReturnData => "return", - IntrinsicOp::Revert => "revert", - IntrinsicOp::Codecopy => "codecopy", - IntrinsicOp::Codesize => "codesize", - IntrinsicOp::CodeRegionOffset => "code_region_offset", - IntrinsicOp::CodeRegionLen => "code_region_len", - IntrinsicOp::CurrentCodeRegionLen => "current_code_region_len", - IntrinsicOp::Keccak => "keccak256", - IntrinsicOp::Addmod => "addmod", - IntrinsicOp::Mulmod => "mulmod", - IntrinsicOp::Caller => "caller", - } - } -} diff --git a/crates/codegen/src/yul/emitter/util.rs b/crates/codegen/src/yul/emitter/util.rs deleted file mode 100644 index 42b0e249f2..0000000000 --- a/crates/codegen/src/yul/emitter/util.rs +++ /dev/null @@ -1,56 +0,0 @@ -//! Shared utility helpers used across the Yul emitter modules. - -use driver::DriverDataBase; -use hir::hir_def::{Func, HirIngot, item::ItemKind, scope_graph::ScopeId}; - -pub(super) fn prefix_yul_name(name: &str) -> String { - if name.starts_with('$') { - name.to_string() - } else { - format!("${name}") - } -} - -pub(super) fn is_std_evm_ops(db: &DriverDataBase, func: Func<'_>) -> bool { - if func.body(db).is_some() { - return false; - } - - let ingot = func.top_mod(db).ingot(db); - let root_mod = ingot.root_mod(db); - - let mut path = Vec::new(); - let mut scope = func.scope(); - while let Some(parent) = scope.parent_module(db) { - match parent { - ScopeId::Item(ItemKind::Mod(mod_)) => { - if let Some(name) = mod_.name(db).to_opt() { - path.push(name.data(db).to_string()); - } - } - ScopeId::Item(ItemKind::TopMod(top_mod)) => { - if top_mod != root_mod { - path.push(top_mod.name(db).data(db).to_string()); - } - } - _ => {} - } - scope = parent; - } - path.reverse(); - - path.last().is_some_and(|seg| seg == "ops") - && path.iter().rev().nth(1).is_some_and(|seg| seg == "evm") -} - -/// Returns the display name of a function or `` if one does not exist. -/// -/// * `func` - HIR function to name. -/// -/// Returns the display string used for diagnostics and Yul names. -pub(super) fn function_name(db: &DriverDataBase, func: Func<'_>) -> String { - func.name(db) - .to_opt() - .map(|id| id.data(db).to_string()) - .unwrap_or_else(|| "".into()) -} diff --git a/crates/codegen/src/yul/errors.rs b/crates/codegen/src/yul/errors.rs deleted file mode 100644 index 3ce0aa014f..0000000000 --- a/crates/codegen/src/yul/errors.rs +++ /dev/null @@ -1,21 +0,0 @@ -use std::fmt; - -/// Errors that can happen while emitting Yul. -#[derive(Debug)] -pub enum YulError { - /// Raised when a function declaration lacks a body in HIR. - MissingBody(String), - /// Raised for features the Yul backend does not yet support. - Unsupported(String), -} - -impl fmt::Display for YulError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - YulError::MissingBody(name) => write!(f, "function `{name}` does not have a body"), - YulError::Unsupported(msg) => write!(f, "{msg}"), - } - } -} - -impl std::error::Error for YulError {} diff --git a/crates/codegen/src/yul/mod.rs b/crates/codegen/src/yul/mod.rs deleted file mode 100644 index c9a99aa2bc..0000000000 --- a/crates/codegen/src/yul/mod.rs +++ /dev/null @@ -1,11 +0,0 @@ -mod doc; -mod emitter; -mod errors; -mod state; - -pub use emitter::{ - EmitModuleError, ExpectedRevert, TestMetadata, TestModuleOutput, emit_ingot_yul, - emit_ingot_yul_with_layout, emit_module_yul, emit_module_yul_with_layout, emit_test_module_yul, - emit_test_module_yul_with_layout, -}; -pub use errors::YulError; diff --git a/crates/codegen/src/yul/state.rs b/crates/codegen/src/yul/state.rs deleted file mode 100644 index 69b9a09406..0000000000 --- a/crates/codegen/src/yul/state.rs +++ /dev/null @@ -1,59 +0,0 @@ -use std::rc::Rc; - -use mir::LocalId; -use rustc_hash::FxHashMap; -use std::cell::Cell; - -/// Tracks the mapping between Fe bindings and their Yul local names within a block. -#[derive(Clone)] -pub(super) struct BlockState { - locals: FxHashMap, - next_local: Rc>, - /// Mapping from MIR ValueId index to Yul temp name for values bound in this scope. - value_temps: FxHashMap, -} - -impl BlockState { - /// Creates a fresh state with no locals registered. - pub(super) fn new() -> Self { - Self { - locals: FxHashMap::default(), - next_local: Rc::new(Cell::new(0)), - value_temps: FxHashMap::default(), - } - } - - /// Caches the Yul temp name for a MIR value. - pub(super) fn insert_value_temp(&mut self, value_idx: usize, temp: String) { - self.value_temps.insert(value_idx, temp); - } - - /// Returns the cached Yul temp name for a MIR value, if it exists. - pub(super) fn value_temp(&self, value_idx: usize) -> Option<&String> { - self.value_temps.get(&value_idx) - } - - /// Allocates a new temporary Yul variable name. - pub(super) fn alloc_local(&mut self) -> String { - let current = self.next_local.get(); - let name = format!("v{}", current); - self.next_local.set(current + 1); - name - } - - /// Inserts or updates the mapping for a MIR local to a Yul name/expression. - pub(super) fn insert_local(&mut self, local: LocalId, name: String) -> String { - self.locals.insert(local, name.clone()); - name - } - - /// Returns the known Yul name for a local, if it exists. - pub(super) fn local(&self, local: LocalId) -> Option { - self.locals.get(&local).cloned() - } - - /// Resolves a local to its lowered Yul name/expression. - pub(super) fn resolve_local(&self, local: LocalId) -> Option { - self.local(local) - } -} diff --git a/crates/codegen/tests/fixtures/alloc.fe b/crates/codegen/tests/fixtures/alloc.fe deleted file mode 100644 index 126e71ecde..0000000000 --- a/crates/codegen/tests/fixtures/alloc.fe +++ /dev/null @@ -1,9 +0,0 @@ -use std::evm::alloc - -pub fn bump(size: u256) -> u256 { - alloc(size) -} - -pub fn bump_const() -> u256 { - alloc(64) -} diff --git a/crates/codegen/tests/fixtures/alloc.snap b/crates/codegen/tests/fixtures/alloc.snap deleted file mode 100644 index a8a669de54..0000000000 --- a/crates/codegen/tests/fixtures/alloc.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/alloc.fe ---- -function $bump($size) -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, $size)) - ret := v0 - leave -} -function $bump_const() -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, 64)) - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/alloc_self_assign.fe b/crates/codegen/tests/fixtures/alloc_self_assign.fe deleted file mode 100644 index aaaebbd853..0000000000 --- a/crates/codegen/tests/fixtures/alloc_self_assign.fe +++ /dev/null @@ -1,7 +0,0 @@ -use std::evm::alloc - -pub fn bump_self_assign(size: u256) -> u256 { - let mut x: u256 = size - x = alloc(x) - x -} diff --git a/crates/codegen/tests/fixtures/alloc_self_assign.snap b/crates/codegen/tests/fixtures/alloc_self_assign.snap deleted file mode 100644 index e5c5ab73f2..0000000000 --- a/crates/codegen/tests/fixtures/alloc_self_assign.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/alloc_self_assign.fe ---- -function $bump_self_assign($size) -> ret { - let v0 := $size - let v1 := mload(64) - if iszero(v1) { - v1 := 0x80 - } - mstore(64, add(v1, v0)) - v0 := v1 - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/arg_bindings.fe b/crates/codegen/tests/fixtures/arg_bindings.fe deleted file mode 100644 index 8e191dbfeb..0000000000 --- a/crates/codegen/tests/fixtures/arg_bindings.fe +++ /dev/null @@ -1,4 +0,0 @@ -pub fn arg_bindings(x: u64, y: u64) -> u64 { - let z = x + y - z -} diff --git a/crates/codegen/tests/fixtures/arg_bindings.snap b/crates/codegen/tests/fixtures/arg_bindings.snap deleted file mode 100644 index 40aa2f548a..0000000000 --- a/crates/codegen/tests/fixtures/arg_bindings.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/arg_bindings.fe ---- -function $arg_bindings($x, $y) -> ret { - let v0 := add($x, $y) - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/array_literal.fe b/crates/codegen/tests/fixtures/array_literal.fe deleted file mode 100644 index a531c2c440..0000000000 --- a/crates/codegen/tests/fixtures/array_literal.fe +++ /dev/null @@ -1,13 +0,0 @@ -pub fn large_array_literal() -> [u8; 64] { - let arr: [u8; 64] = [ - 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 - ] - arr -} diff --git a/crates/codegen/tests/fixtures/array_literal.snap b/crates/codegen/tests/fixtures/array_literal.snap deleted file mode 100644 index 25cf9adcdc..0000000000 --- a/crates/codegen/tests/fixtures/array_literal.snap +++ /dev/null @@ -1,21 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/array_literal.fe ---- -object "main" { - code { - function $large_array_literal() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 2048)) - datacopy(v0, dataoffset("data_large_array_literal_0"), datasize("data_large_array_literal_0")) - let v1 := v0 - ret := v1 - leave - } - } - data "data_large_array_literal_0" hex"000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040" -} diff --git a/crates/codegen/tests/fixtures/array_mut.fe b/crates/codegen/tests/fixtures/array_mut.fe deleted file mode 100644 index 5442ea4d63..0000000000 --- a/crates/codegen/tests/fixtures/array_mut.fe +++ /dev/null @@ -1,4 +0,0 @@ -pub fn array_mut(x: u8) -> [u8; 4] { - let arr: [u8; 4] = [x, 2, 3, 4] - arr -} diff --git a/crates/codegen/tests/fixtures/array_mut.snap b/crates/codegen/tests/fixtures/array_mut.snap deleted file mode 100644 index 0ffbc31d5b..0000000000 --- a/crates/codegen/tests/fixtures/array_mut.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/array_mut.fe ---- -function $array_mut($x) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 128)) - mstore(v0, and($x, 0xff)) - mstore(add(v0, 32), and(2, 0xff)) - mstore(add(v0, 64), and(3, 0xff)) - mstore(add(v0, 96), and(4, 0xff)) - let v1 := v0 - ret := v1 - leave -} diff --git a/crates/codegen/tests/fixtures/aug_assign.fe b/crates/codegen/tests/fixtures/aug_assign.fe deleted file mode 100644 index 89597ec401..0000000000 --- a/crates/codegen/tests/fixtures/aug_assign.fe +++ /dev/null @@ -1,6 +0,0 @@ -pub fn aug_assign(x: u64, y: u64) -> u64 { - let mut acc: u64 = x; - acc += y; - acc *= 2; - acc / 2 -} diff --git a/crates/codegen/tests/fixtures/aug_assign.snap b/crates/codegen/tests/fixtures/aug_assign.snap deleted file mode 100644 index 36a3d8559a..0000000000 --- a/crates/codegen/tests/fixtures/aug_assign.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/aug_assign.fe ---- -function $aug_assign($x, $y) -> ret { - let v0 := $x - v0 := add(v0, $y) - v0 := mul(v0, 2) - ret := div(v0, 2) - leave -} diff --git a/crates/codegen/tests/fixtures/aug_assign_bit_ops.fe b/crates/codegen/tests/fixtures/aug_assign_bit_ops.fe deleted file mode 100644 index 36025c507c..0000000000 --- a/crates/codegen/tests/fixtures/aug_assign_bit_ops.fe +++ /dev/null @@ -1,10 +0,0 @@ -pub fn aug_assign_bit_ops(x: u256, y: u256) -> u256 { - let mut acc: u256 = x; - acc **= y; - acc <<= 3; - acc >>= 1; - acc &= 0xff; - acc |= 1; - acc ^= 2; - acc -} diff --git a/crates/codegen/tests/fixtures/aug_assign_bit_ops.snap b/crates/codegen/tests/fixtures/aug_assign_bit_ops.snap deleted file mode 100644 index 5cd03efd9d..0000000000 --- a/crates/codegen/tests/fixtures/aug_assign_bit_ops.snap +++ /dev/null @@ -1,17 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/aug_assign_bit_ops.fe ---- -function $aug_assign_bit_ops($x, $y) -> ret { - let v0 := $x - v0 := exp(v0, $y) - v0 := shl(3, v0) - v0 := shr(1, v0) - v0 := and(v0, 255) - v0 := or(v0, 1) - v0 := xor(v0, 2) - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/bit_and.fe b/crates/codegen/tests/fixtures/bit_and.fe deleted file mode 100644 index 65934aafbd..0000000000 --- a/crates/codegen/tests/fixtures/bit_and.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub fn bit_and() -> u64 { - 1 & 2 -} diff --git a/crates/codegen/tests/fixtures/bit_and.snap b/crates/codegen/tests/fixtures/bit_and.snap deleted file mode 100644 index b400af0b83..0000000000 --- a/crates/codegen/tests/fixtures/bit_and.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/bit_and.fe ---- -function $bit_and() -> ret { - ret := and(1, 2) - leave -} diff --git a/crates/codegen/tests/fixtures/bit_ops.fe b/crates/codegen/tests/fixtures/bit_ops.fe deleted file mode 100644 index adc684cfa3..0000000000 --- a/crates/codegen/tests/fixtures/bit_ops.fe +++ /dev/null @@ -1,12 +0,0 @@ -pub fn bit_ops(x: u256, y: u256) -> (u256, u256, u256, u256, u256) { - let and_v = x & y; - let or_v = x | y; - let xor_v = x ^ y; - let shl_v = x << 8; - let shr_v = x >> 2; - (and_v, or_v, xor_v, shl_v, shr_v) -} - -pub fn pow_op(x: u256, y: u256) -> u256 { - x ** y -} diff --git a/crates/codegen/tests/fixtures/bit_ops.snap b/crates/codegen/tests/fixtures/bit_ops.snap deleted file mode 100644 index 1b6d6b83be..0000000000 --- a/crates/codegen/tests/fixtures/bit_ops.snap +++ /dev/null @@ -1,29 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/bit_ops.fe ---- -function $bit_ops($x, $y) -> ret { - let v0 := and($x, $y) - let v1 := or($x, $y) - let v2 := xor($x, $y) - let v3 := shl(8, $x) - let v4 := shr(2, $x) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 160)) - mstore(v5, v0) - mstore(add(v5, 32), v1) - mstore(add(v5, 64), v2) - mstore(add(v5, 96), v3) - mstore(add(v5, 128), v4) - ret := v5 - leave -} -function $pow_op($x, $y) -> ret { - ret := exp($x, $y) - leave -} diff --git a/crates/codegen/tests/fixtures/bitnot.fe b/crates/codegen/tests/fixtures/bitnot.fe deleted file mode 100644 index 37f38a5199..0000000000 --- a/crates/codegen/tests/fixtures/bitnot.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub fn bit_not(x: u256) -> u256 { - ~x -} diff --git a/crates/codegen/tests/fixtures/bitnot.snap b/crates/codegen/tests/fixtures/bitnot.snap deleted file mode 100644 index de38a14a01..0000000000 --- a/crates/codegen/tests/fixtures/bitnot.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/bitnot.fe ---- -function $bit_not($x) -> ret { - ret := not($x) - leave -} diff --git a/crates/codegen/tests/fixtures/block_expr.fe b/crates/codegen/tests/fixtures/block_expr.fe deleted file mode 100644 index 6abc40faaf..0000000000 --- a/crates/codegen/tests/fixtures/block_expr.fe +++ /dev/null @@ -1,5 +0,0 @@ -pub fn block_expr() -> u64 { - { - 1 + 2 - } -} diff --git a/crates/codegen/tests/fixtures/block_expr.snap b/crates/codegen/tests/fixtures/block_expr.snap deleted file mode 100644 index 83d8bc0cea..0000000000 --- a/crates/codegen/tests/fixtures/block_expr.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/block_expr.fe ---- -function $block_expr() -> ret { - ret := add(1, 2) - leave -} diff --git a/crates/codegen/tests/fixtures/bool_literal.fe b/crates/codegen/tests/fixtures/bool_literal.fe deleted file mode 100644 index a9fbf25da8..0000000000 --- a/crates/codegen/tests/fixtures/bool_literal.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub fn bool_literal() -> bool { - true -} diff --git a/crates/codegen/tests/fixtures/bool_literal.snap b/crates/codegen/tests/fixtures/bool_literal.snap deleted file mode 100644 index 43309573d4..0000000000 --- a/crates/codegen/tests/fixtures/bool_literal.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/bool_literal.fe ---- -function $bool_literal() -> ret { - ret := 1 - leave -} diff --git a/crates/codegen/tests/fixtures/borrow_handles_readback.fe b/crates/codegen/tests/fixtures/borrow_handles_readback.fe deleted file mode 100644 index 2c794e7958..0000000000 --- a/crates/codegen/tests/fixtures/borrow_handles_readback.fe +++ /dev/null @@ -1,6 +0,0 @@ -pub fn borrow_handles_readback() -> u256 { - let mut x: u256 = 0 - let p: mut u256 = mut x - p = 5 - x -} diff --git a/crates/codegen/tests/fixtures/borrow_handles_readback.snap b/crates/codegen/tests/fixtures/borrow_handles_readback.snap deleted file mode 100644 index 9084a98006..0000000000 --- a/crates/codegen/tests/fixtures/borrow_handles_readback.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/borrow_handles_readback.fe ---- -function $borrow_handles_readback() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 32)) - let v1 := 0 - mstore(v0, v1) - let v2 := v0 - mstore(v2, 5) - v1 := 5 - ret := v1 - leave -} diff --git a/crates/codegen/tests/fixtures/borrow_storage_field_handle.fe b/crates/codegen/tests/fixtures/borrow_storage_field_handle.fe deleted file mode 100644 index 13d10917f4..0000000000 --- a/crates/codegen/tests/fixtures/borrow_storage_field_handle.fe +++ /dev/null @@ -1,11 +0,0 @@ -struct CoinStore { - alice: u256, -} - -fn borrow_storage_field_handle() -> u256 - uses (store: mut CoinStore) -{ - let p: mut u256 = mut store.alice - p += 1 - store.alice -} diff --git a/crates/codegen/tests/fixtures/borrow_storage_field_handle.snap b/crates/codegen/tests/fixtures/borrow_storage_field_handle.snap deleted file mode 100644 index 860cb21617..0000000000 --- a/crates/codegen/tests/fixtures/borrow_storage_field_handle.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/borrow_storage_field_handle.fe ---- -function $borrow_storage_field_handle__StorPtr_CoinStore___ba1c0d0726e89ba2($store) -> ret { - let v0 := $store - let v1 := v0 - let v2 := sload(v1) - sstore(v1, add(v2, 1)) - let v3 := sload($store) - ret := v3 - leave -} diff --git a/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.fe b/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.fe deleted file mode 100644 index 120ffb4cd0..0000000000 --- a/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.fe +++ /dev/null @@ -1,42 +0,0 @@ -// Demonstrates a known miscompile: passing a storage-backed by-ref provider as a trait effect -// causes the callee to treat it as a memory pointer (defaulting by-ref providers to `mem`). - -trait Ctx { - fn sum(self) -> u256 -} - -struct Pair { - a: u256, - b: u256, -} - -impl Ctx for Pair { - fn sum(self) -> u256 { - self.a + self.b - } -} - -fn use_ctx() -> u256 uses (ctx: Ctx) { - ctx.sum() -} - -msg Msg { - #[selector = 1] - Go -> u256 -} - -pub contract ByRefTraitProviderStorageBug { - ctx: Pair - - init() uses (mut ctx) { - ctx = Pair { a: 40, b: 2 } - } - - recv Msg { - Go -> u256 uses (ctx) { - with (ctx) { - use_ctx() - } - } - } -} diff --git a/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.snap b/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.snap deleted file mode 100644 index b37ac280d5..0000000000 --- a/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.snap +++ /dev/null @@ -1,330 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/by_ref_trait_provider_storage_bug.fe ---- -object "ByRefTraitProviderStorageBug" { - code { - function $__ByRefTraitProviderStorageBug_init() { - let v0 := $init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(0, 0) - let v1 := dataoffset("ByRefTraitProviderStorageBug_deployed") - let v2 := datasize("ByRefTraitProviderStorageBug_deployed") - let v3 := datasize("ByRefTraitProviderStorageBug") - let v4 := codesize() - let v5 := lt(v4, v3) - if v5 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - let v6 := sub(v4, v3) - let v7 := mload(64) - if iszero(v7) { - v7 := 0x80 - } - mstore(64, add(v7, v6)) - codecopy(v7, v3, v6) - let v8 := mload(0x40) - if iszero(v8) { - v8 := 0x80 - } - mstore(0x40, add(v8, 64)) - mstore(v8, v7) - mstore(add(v8, 32), v6) - let v9 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v8) - $__ByRefTraitProviderStorageBug_init_contract(v0) - codecopy(0, v1, v2) - return(0, v2) - } - function $__ByRefTraitProviderStorageBug_init_contract($ctx) { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, 40) - mstore(add(v0, 32), 2) - let v1 := v0 - sstore($ctx, mload(v1)) - sstore(add($ctx, 1), mload(add(v1, 32))) - leave - } - function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - let v1 := $input - mstore(v0, mload(v1)) - mstore(add(v0, 32), mload(add(v1, 32))) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(0, $slot) - ret := v0 - leave - } - function $init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140($self, $slot) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 128)) - let v2 := v0 - mstore(v1, mload(v2)) - mstore(add(v1, 32), mload(add(v2, 32))) - mstore(add(v1, 64), mload(add(v2, 64))) - mstore(add(v1, 96), 0) - ret := v1 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140($raw) -> ret { - ret := $raw - leave - } - $__ByRefTraitProviderStorageBug_init() - } - - object "ByRefTraitProviderStorageBug_deployed" { - code { - function $__ByRefTraitProviderStorageBug_recv_0_0($args, $ctx) -> ret { - let v0 := $ctx - let v1 := $use_ctx_eff0_stor__Pair_h956dff41e88ee341__acec41afdc898140(v0) - ret := v1 - leave - } - function $__ByRefTraitProviderStorageBug_runtime() { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140(0, 0) - let v1 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v2 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v1 - case 1 { - $go_h50739b8917c22b82_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v2) - let v3 := $__ByRefTraitProviderStorageBug_recv_0_0(0, v0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(0, v3) - } - default { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes($self, $ptr, $len) { - return($ptr, $len) - } - function $go_h50739b8917c22b82_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum_stor_arg0_root_stor($self) -> ret { - let v0 := sload($self) - let v1 := sload(add($self, 1)) - ret := add(v0, v1) - leave - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> ret { - let v0 := $solencoder_h1b9228b90dad6928_new() - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave - } - function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140($raw) -> ret { - ret := $raw - leave - } - function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - function $use_ctx_eff0_stor__Pair_h956dff41e88ee341__acec41afdc898140($ctx) -> ret { - let v0 := $pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum_stor_arg0_root_stor($ctx) - ret := v0 - leave - } - $__ByRefTraitProviderStorageBug_runtime() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/caller.fe b/crates/codegen/tests/fixtures/caller.fe deleted file mode 100644 index 97652b8944..0000000000 --- a/crates/codegen/tests/fixtures/caller.fe +++ /dev/null @@ -1,5 +0,0 @@ -use std::evm::{Address, Ctx} - -fn who_called() -> Address uses (ctx: Ctx) { - ctx.caller() -} diff --git a/crates/codegen/tests/fixtures/caller.snap b/crates/codegen/tests/fixtures/caller.snap deleted file mode 100644 index b65c1cfe3d..0000000000 --- a/crates/codegen/tests/fixtures/caller.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/caller.fe ---- -function $who_called__Evm_hef0af3106e109414__3af54274b2985741($ctx) -> ret { - let v0 := caller() - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/cast_u8_usize_cmp.fe b/crates/codegen/tests/fixtures/cast_u8_usize_cmp.fe deleted file mode 100644 index c452b9ccd4..0000000000 --- a/crates/codegen/tests/fixtures/cast_u8_usize_cmp.fe +++ /dev/null @@ -1,13 +0,0 @@ -pub fn cast_u8_usize_cmp(indices: [u8; 8], i: usize, j: usize) -> u8 { - let path = indices[i] - if j < path as usize { - return 1 - } - if j == path as usize { - return 2 - } - if j > path as usize { - return 3 - } - 0 -} diff --git a/crates/codegen/tests/fixtures/cast_u8_usize_cmp.snap b/crates/codegen/tests/fixtures/cast_u8_usize_cmp.snap deleted file mode 100644 index 1c5f8ea88e..0000000000 --- a/crates/codegen/tests/fixtures/cast_u8_usize_cmp.snap +++ /dev/null @@ -1,31 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/cast_u8_usize_cmp.fe ---- -function $cast_u8_usize_cmp($indices, $i, $j) -> ret { - let v0 := and(mload(add($indices, mul($i, 32))), 0xff) - let v1 := lt($j, v0) - if v1 { - ret := 1 - leave - } - if iszero(v1) { - let v2 := eq($j, v0) - if v2 { - ret := 2 - leave - } - if iszero(v2) { - let v3 := gt($j, v0) - if v3 { - ret := 3 - leave - } - if iszero(v3) { - ret := 0 - leave - } - } - } -} diff --git a/crates/codegen/tests/fixtures/code_region.fe b/crates/codegen/tests/fixtures/code_region.fe deleted file mode 100644 index 6726346ad5..0000000000 --- a/crates/codegen/tests/fixtures/code_region.fe +++ /dev/null @@ -1,67 +0,0 @@ -use std::evm::{Create, Evm, RawMem, RawOps} - -#[contract_init(Foo)] -fn init() uses (evm: mut Evm) { - { // create child contract - let len = evm.code_region_len(child_init) - let offset = evm.code_region_offset(child_init) - let dest = with (RawMem = evm) { allocate(bytes: len) } - evm.codecopy(dest, offset, len) - evm.create2_raw(value: 0, offset, len: len, salt: 0x1234) - } - - let len = evm.code_region_len(runtime) - let offset = evm.code_region_offset(runtime) - let dest = with (RawMem = evm) { allocate(bytes: len) } - evm.codecopy(dest, offset, len) - evm.return_data(dest, len) -} - -#[contract_runtime(Foo)] -fn runtime() uses (evm: mut Evm) { - with (RawOps = evm) { - match read_selector() { - 0x12345678 => { transfer() } - 0x23456789 => { balance() } - _ => {} - } - } - evm.return_data(0,0) -} - -#[contract_init(Child)] -fn child_init() uses (evm: mut Evm) { - let len = evm.code_region_len(child_runtime) - let offset = evm.code_region_offset(child_runtime) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(Child)] -fn child_runtime() uses (evm: mut Evm) { - evm.calldatacopy(dest: 0, offset: 0, len: 4) - evm.return_data(0, 4) -} - -fn allocate(bytes: u256) -> u256 uses (mem: mut RawMem) { - let mut ptr = mem.mload(0x40) - if ptr == 0 { - ptr = 0x60 - } - mem.mstore(0x40, ptr + bytes) - ptr -} - -fn balance() uses (ops: RawOps) { - ops.return_data(0, 0) -} - -fn transfer() uses (ops: RawOps) { - ops.return_data(0, 0) -} - -pub fn read_selector() -> u256 uses (ops: RawOps) { - let word = ops.calldataload(0) - // Shift right by 224 bits to keep only the first four bytes. - word >> 224 -} diff --git a/crates/codegen/tests/fixtures/code_region.snap b/crates/codegen/tests/fixtures/code_region.snap deleted file mode 100644 index 32ac758ca9..0000000000 --- a/crates/codegen/tests/fixtures/code_region.snap +++ /dev/null @@ -1,94 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/code_region.fe ---- -object "Foo" { - code { - function $allocate__Evm_hef0af3106e109414__3af54274b2985741($bytes, $mem) -> ret { - let v0 := mload(64) - let v1 := eq(v0, 0) - if v1 { - v0 := 96 - } - mstore(64, add(v0, $bytes)) - ret := v0 - leave - } - function $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor($self, $value, $offset, $len, $salt) -> ret { - let v0 := create2($value, $offset, $len, $salt) - ret := v0 - leave - } - function $init__StorPtr_Evm___207f35a85ac4062e() { - let v0 := datasize("Child") - let v1 := dataoffset("Child") - let v2 := $allocate__Evm_hef0af3106e109414__3af54274b2985741(v0, 0) - let v3 := v2 - codecopy(v3, v1, v0) - let v4 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor(0, 0, v1, v0, 4660) - pop(v4) - let v5 := datasize("Foo_deployed") - let v6 := dataoffset("Foo_deployed") - let v7 := $allocate__Evm_hef0af3106e109414__3af54274b2985741(v5, 0) - let v8 := v7 - codecopy(v8, v6, v5) - return(v8, v5) - } - $init__StorPtr_Evm___207f35a85ac4062e() - } - - object "Foo_deployed" { - code { - function $balance__Evm_hef0af3106e109414__3af54274b2985741($ops) { - return(0, 0) - } - function $read_selector__Evm_hef0af3106e109414__3af54274b2985741($ops) -> ret { - let v0 := calldataload(0) - ret := shr(224, v0) - leave - } - function $runtime__StorPtr_Evm___207f35a85ac4062e() { - let v0 := $read_selector__Evm_hef0af3106e109414__3af54274b2985741(0) - switch v0 - case 305419896 { - $transfer__Evm_hef0af3106e109414__3af54274b2985741(0) - } - case 591751049 { - $balance__Evm_hef0af3106e109414__3af54274b2985741(0) - } - default { - } - return(0, 0) - } - function $transfer__Evm_hef0af3106e109414__3af54274b2985741($ops) { - return(0, 0) - } - $runtime__StorPtr_Evm___207f35a85ac4062e() - return(0, 0) - } - } - object "Child" { - code { - function $child_init__StorPtr_Evm___207f35a85ac4062e() { - let v0 := datasize("Child_deployed") - let v1 := dataoffset("Child_deployed") - codecopy(0, v1, v0) - return(0, v0) - } - $child_init__StorPtr_Evm___207f35a85ac4062e() - } - - object "Child_deployed" { - code { - function $child_runtime__StorPtr_Evm___207f35a85ac4062e() { - calldatacopy(0, 0, 4) - return(0, 4) - } - $child_runtime__StorPtr_Evm___207f35a85ac4062e() - return(0, 0) - } - } - } -} diff --git a/crates/codegen/tests/fixtures/code_region_qualified.fe b/crates/codegen/tests/fixtures/code_region_qualified.fe deleted file mode 100644 index 65ec013674..0000000000 --- a/crates/codegen/tests/fixtures/code_region_qualified.fe +++ /dev/null @@ -1,14 +0,0 @@ -use std::evm::Evm - -#[contract_init(Foo)] -fn init() uses (evm: mut Evm) { - let len = evm.code_region_len(self::runtime) - let offset = evm.code_region_offset(self::runtime) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(Foo)] -fn runtime() uses (evm: mut Evm) { - evm.return_data(0, 0) -} diff --git a/crates/codegen/tests/fixtures/code_region_qualified.snap b/crates/codegen/tests/fixtures/code_region_qualified.snap deleted file mode 100644 index 8201ac6d6e..0000000000 --- a/crates/codegen/tests/fixtures/code_region_qualified.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/code_region_qualified.fe ---- -object "Foo" { - code { - function $init__StorPtr_Evm___207f35a85ac4062e() { - let v0 := datasize("Foo_deployed") - let v1 := dataoffset("Foo_deployed") - codecopy(0, v1, v0) - return(0, v0) - } - $init__StorPtr_Evm___207f35a85ac4062e() - } - - object "Foo_deployed" { - code { - function $runtime__StorPtr_Evm___207f35a85ac4062e() { - return(0, 0) - } - $runtime__StorPtr_Evm___207f35a85ac4062e() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/comparison_ops.fe b/crates/codegen/tests/fixtures/comparison_ops.fe deleted file mode 100644 index 99616f731e..0000000000 --- a/crates/codegen/tests/fixtures/comparison_ops.fe +++ /dev/null @@ -1,7 +0,0 @@ -pub fn comparison_ops() -> (bool, bool, bool, bool, bool, bool) { - // TODO: 1u256 syntax - let one: u256 = 1 - let two: u256 = 2 - let three: u256 = 3 - (one == one, one != two, one < two, two <= two, three > two, three >= three) -} diff --git a/crates/codegen/tests/fixtures/comparison_ops.snap b/crates/codegen/tests/fixtures/comparison_ops.snap deleted file mode 100644 index fb270d32d1..0000000000 --- a/crates/codegen/tests/fixtures/comparison_ops.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/comparison_ops.fe ---- -function $comparison_ops() -> ret { - let v0 := 1 - let v1 := 2 - let v2 := 3 - let v3 := mload(0x40) - if iszero(v3) { - v3 := 0x80 - } - mstore(0x40, add(v3, 192)) - mstore(v3, iszero(iszero(eq(v0, v0)))) - mstore(add(v3, 32), iszero(iszero(iszero(eq(v0, v1))))) - mstore(add(v3, 64), iszero(iszero(lt(v0, v1)))) - mstore(add(v3, 96), iszero(iszero(iszero(gt(v1, v1))))) - mstore(add(v3, 128), iszero(iszero(gt(v2, v1)))) - mstore(add(v3, 160), iszero(iszero(iszero(lt(v2, v2))))) - ret := v3 - leave -} diff --git a/crates/codegen/tests/fixtures/const_array.fe b/crates/codegen/tests/fixtures/const_array.fe deleted file mode 100644 index 1e2caa6087..0000000000 --- a/crates/codegen/tests/fixtures/const_array.fe +++ /dev/null @@ -1,5 +0,0 @@ -const VALS: [u256; 3] = [10, 20, 30] - -pub fn sum_two(i: usize, j: usize) -> u256 { - VALS[i] + VALS[j] -} diff --git a/crates/codegen/tests/fixtures/const_array.snap b/crates/codegen/tests/fixtures/const_array.snap deleted file mode 100644 index be2aafbf1c..0000000000 --- a/crates/codegen/tests/fixtures/const_array.snap +++ /dev/null @@ -1,40 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/const_array.fe ---- -object "main" { - code { - function $sum_two($i, $j) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - datacopy(v0, dataoffset("data_sum_two_0"), datasize("data_sum_two_0")) - let v1 := mload(add(v0, mul($i, 32))) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - datacopy(v2, dataoffset("data_sum_two_0"), datasize("data_sum_two_0")) - let v3 := mload(add(v2, mul($j, 32))) - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 - } - mstore(0x40, add(v4, 96)) - datacopy(v4, dataoffset("data_sum_two_0"), datasize("data_sum_two_0")) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 96)) - datacopy(v5, dataoffset("data_sum_two_0"), datasize("data_sum_two_0")) - ret := add(v1, v3) - leave - } - } - data "data_sum_two_0" hex"000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e" -} diff --git a/crates/codegen/tests/fixtures/const_array_add.fe b/crates/codegen/tests/fixtures/const_array_add.fe deleted file mode 100644 index bdf0a1fe3f..0000000000 --- a/crates/codegen/tests/fixtures/const_array_add.fe +++ /dev/null @@ -1,5 +0,0 @@ -const C: [u256; 3] = [10, 20, 30] - -pub fn get_sum() -> u256 { - return 1 + C[0] -} diff --git a/crates/codegen/tests/fixtures/const_array_add.snap b/crates/codegen/tests/fixtures/const_array_add.snap deleted file mode 100644 index c540495ff6..0000000000 --- a/crates/codegen/tests/fixtures/const_array_add.snap +++ /dev/null @@ -1,21 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/const_array_add.fe ---- -object "main" { - code { - function $get_sum() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - datacopy(v0, dataoffset("data_get_sum_0"), datasize("data_get_sum_0")) - let v1 := mload(v0) - ret := add(1, v1) - leave - } - } - data "data_get_sum_0" hex"000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e" -} diff --git a/crates/codegen/tests/fixtures/const_array_addmod.fe b/crates/codegen/tests/fixtures/const_array_addmod.fe deleted file mode 100644 index 0c596e3d44..0000000000 --- a/crates/codegen/tests/fixtures/const_array_addmod.fe +++ /dev/null @@ -1,7 +0,0 @@ -use std::evm::ops::addmod - -const C: [u256; 3] = [10, 20, 30] - -pub fn get_sum() -> u256 { - return addmod(1, C[0], 100) -} diff --git a/crates/codegen/tests/fixtures/const_array_addmod.snap b/crates/codegen/tests/fixtures/const_array_addmod.snap deleted file mode 100644 index 9cdfaba5a5..0000000000 --- a/crates/codegen/tests/fixtures/const_array_addmod.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/const_array_addmod.fe ---- -object "main" { - code { - function $get_sum() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - datacopy(v0, dataoffset("data_get_sum_0"), datasize("data_get_sum_0")) - let v1 := mload(v0) - let v2 := addmod(1, v1, 100) - ret := v2 - leave - } - } - data "data_get_sum_0" hex"000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001e" -} diff --git a/crates/codegen/tests/fixtures/const_array_branch.fe b/crates/codegen/tests/fixtures/const_array_branch.fe deleted file mode 100644 index 0bb9f9de9a..0000000000 --- a/crates/codegen/tests/fixtures/const_array_branch.fe +++ /dev/null @@ -1,9 +0,0 @@ -const C: [u256; 1] = [1] - -pub fn const_array_branch(flag: bool) -> u256 { - if flag { - C[0] - } else { - C[0] - } -} diff --git a/crates/codegen/tests/fixtures/const_array_branch.snap b/crates/codegen/tests/fixtures/const_array_branch.snap deleted file mode 100644 index ce306739c3..0000000000 --- a/crates/codegen/tests/fixtures/const_array_branch.snap +++ /dev/null @@ -1,49 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/const_array_branch.fe ---- -object "main" { - code { - function $const_array_branch($flag) -> ret { - let v0 := 0 - let v1 := $flag - if v1 { - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 32)) - datacopy(v2, dataoffset("data_const_array_branch_0"), datasize("data_const_array_branch_0")) - let v3 := mload(v2) - v0 := v3 - } - if iszero(v1) { - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 - } - mstore(0x40, add(v4, 32)) - datacopy(v4, dataoffset("data_const_array_branch_0"), datasize("data_const_array_branch_0")) - let v5 := mload(v4) - v0 := v5 - } - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 - } - mstore(0x40, add(v6, 32)) - datacopy(v6, dataoffset("data_const_array_branch_0"), datasize("data_const_array_branch_0")) - let v7 := mload(0x40) - if iszero(v7) { - v7 := 0x80 - } - mstore(0x40, add(v7, 32)) - datacopy(v7, dataoffset("data_const_array_branch_0"), datasize("data_const_array_branch_0")) - ret := v0 - leave - } - } - data "data_const_array_branch_0" hex"0000000000000000000000000000000000000000000000000000000000000001" -} diff --git a/crates/codegen/tests/fixtures/const_fn_mapping_slot_hash.fe b/crates/codegen/tests/fixtures/const_fn_mapping_slot_hash.fe deleted file mode 100644 index 46203d79af..0000000000 --- a/crates/codegen/tests/fixtures/const_fn_mapping_slot_hash.fe +++ /dev/null @@ -1,13 +0,0 @@ -use core::intrinsic - -// Real-world use case: computing a Solidity-style mapping slot hash at compile time. -// Equivalent to `keccak256(abi.encode(key, slot))`. -const BALANCES_SLOT: u256 = { - let words: [u256; 2] = [0x1111111111111111111111111111111111111111, 7] - let bytes: [u8; 64] = intrinsic::__as_bytes(words) - intrinsic::__keccak256(bytes) -} - -fn main() -> u256 { - BALANCES_SLOT -} diff --git a/crates/codegen/tests/fixtures/const_fn_mapping_slot_hash.snap b/crates/codegen/tests/fixtures/const_fn_mapping_slot_hash.snap deleted file mode 100644 index e557ea1a28..0000000000 --- a/crates/codegen/tests/fixtures/const_fn_mapping_slot_hash.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/const_fn_mapping_slot_hash.fe ---- -function $main() -> ret { - ret := 3253375974595066614526584426541216327299611994431550246078837110170861790149 - leave -} diff --git a/crates/codegen/tests/fixtures/const_fn_packed_config.fe b/crates/codegen/tests/fixtures/const_fn_packed_config.fe deleted file mode 100644 index 2ffc3579ab..0000000000 --- a/crates/codegen/tests/fixtures/const_fn_packed_config.fe +++ /dev/null @@ -1,34 +0,0 @@ -// Real-world use case: packing configuration data into a single word at compile -// time, which can then be stored in a single storage slot for cheaper runtime -// reads. -// -// This exercises CTFE support for: -// - `match` in `const fn` -// - tuple destructuring in `let` bindings -const fn token_params(kind: u8) -> (u8, u16) { - match kind { - 0 => (18, 30), - 1 => (6, 5), - _ => (18, 0), - } -} - -const fn pack_config(decimals: u8, paused: bool, fee_bps: u16) -> u256 { - let paused_bit: u256 = if paused { 1 } else { 0 } - let decimals: u256 = decimals as u256 - let fee_bps: u256 = fee_bps as u256 - - // [paused:1][decimals:8][fee_bps:16] - (paused_bit << 24) | (decimals << 16) | fee_bps -} - -const fn packed_token_config(kind: u8, paused: bool) -> u256 { - let (decimals, fee_bps) = token_params(kind) - pack_config(decimals, paused, fee_bps) -} - -const CONFIG: u256 = packed_token_config(0, false) - -fn main() -> u256 { - CONFIG -} diff --git a/crates/codegen/tests/fixtures/const_fn_packed_config.snap b/crates/codegen/tests/fixtures/const_fn_packed_config.snap deleted file mode 100644 index 738d2225eb..0000000000 --- a/crates/codegen/tests/fixtures/const_fn_packed_config.snap +++ /dev/null @@ -1,71 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/const_fn_packed_config.fe ---- -function $token_params($kind) -> ret { - let v0 := 0 - switch $kind - case 0 { - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, and(18, 0xff)) - mstore(add(v1, 32), and(30, 0xffff)) - v0 := v1 - } - case 1 { - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, and(6, 0xff)) - mstore(add(v2, 32), and(5, 0xffff)) - v0 := v2 - } - default { - let v3 := mload(0x40) - if iszero(v3) { - v3 := 0x80 - } - mstore(0x40, add(v3, 64)) - mstore(v3, and(18, 0xff)) - mstore(add(v3, 32), and(0, 0xffff)) - v0 := v3 - } - ret := v0 - leave -} -function $pack_config($decimals, $paused, $fee_bps) -> ret { - let v0 := 0 - let v1 := $paused - if v1 { - v0 := 1 - } - if iszero(v1) { - v0 := 0 - } - let v2 := v0 - let v3 := $decimals - let v4 := $fee_bps - ret := or(or(shl(24, v2), shl(16, v3)), v4) - leave -} -function $packed_token_config($kind, $paused) -> ret { - let v0 := $token_params($kind) - let v1 := and(mload(v0), 0xff) - let v2 := v1 - let v3 := and(mload(add(v0, 32)), 0xffff) - let v4 := v3 - let v5 := $pack_config(v2, $paused, v4) - ret := v5 - leave -} -function $main() -> ret { - ret := 1179678 - leave -} diff --git a/crates/codegen/tests/fixtures/const_keccak.fe b/crates/codegen/tests/fixtures/const_keccak.fe deleted file mode 100644 index fed9b2e17e..0000000000 --- a/crates/codegen/tests/fixtures/const_keccak.fe +++ /dev/null @@ -1,5 +0,0 @@ -const HASH: u256 = core::keccak("hello") - -fn main() -> u256 { - HASH -} diff --git a/crates/codegen/tests/fixtures/const_keccak.snap b/crates/codegen/tests/fixtures/const_keccak.snap deleted file mode 100644 index 0b96e2aefd..0000000000 --- a/crates/codegen/tests/fixtures/const_keccak.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/const_keccak.fe ---- -function $main() -> ret { - ret := 12910348618308260923200348219926901280687058984330794534952861439530514639560 - leave -} diff --git a/crates/codegen/tests/fixtures/const_nested_u8_array.fe b/crates/codegen/tests/fixtures/const_nested_u8_array.fe deleted file mode 100644 index 9e03c72a0f..0000000000 --- a/crates/codegen/tests/fixtures/const_nested_u8_array.fe +++ /dev/null @@ -1,5 +0,0 @@ -const C: [[u8; 2]; 2] = [[1, 2], [3, 4]] - -pub fn const_nested_u8_array() -> u8 { - C[1][0] -} diff --git a/crates/codegen/tests/fixtures/const_nested_u8_array.snap b/crates/codegen/tests/fixtures/const_nested_u8_array.snap deleted file mode 100644 index 7a102a03f3..0000000000 --- a/crates/codegen/tests/fixtures/const_nested_u8_array.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/const_nested_u8_array.fe ---- -object "main" { - code { - function $const_nested_u8_array() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 128)) - datacopy(v0, dataoffset("data_const_nested_u8_array_0"), datasize("data_const_nested_u8_array_0")) - let v1 := and(mload(add(v0, 64)), 0xff) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 128)) - datacopy(v2, dataoffset("data_const_nested_u8_array_0"), datasize("data_const_nested_u8_array_0")) - ret := v1 - leave - } - } - data "data_const_nested_u8_array_0" hex"0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004" -} diff --git a/crates/codegen/tests/fixtures/contract_dispatch.fe b/crates/codegen/tests/fixtures/contract_dispatch.fe deleted file mode 100644 index 7c57af6cfd..0000000000 --- a/crates/codegen/tests/fixtures/contract_dispatch.fe +++ /dev/null @@ -1,8 +0,0 @@ -fn emit_code() -> u64 { - 1 -} - -#[contract_runtime(MinimalDispatcher)] -fn dispatch() { - let _value: u64 = emit_code() -} diff --git a/crates/codegen/tests/fixtures/contract_dispatch.snap b/crates/codegen/tests/fixtures/contract_dispatch.snap deleted file mode 100644 index 3575c075e7..0000000000 --- a/crates/codegen/tests/fixtures/contract_dispatch.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/contract_dispatch.fe ---- -object "MinimalDispatcher" { - code { - } - - object "MinimalDispatcher_deployed" { - code { - function $dispatch() { - let v0 := $emit_code() - leave - } - function $emit_code() -> ret { - ret := 1 - leave - } - $dispatch() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/create_contract.fe b/crates/codegen/tests/fixtures/create_contract.fe deleted file mode 100644 index b2b04f383f..0000000000 --- a/crates/codegen/tests/fixtures/create_contract.fe +++ /dev/null @@ -1,35 +0,0 @@ -use std::evm::{Address, Create} - -msg FactoryMsg { - #[selector = 1] - Deploy { x: u256, y: u256 } -> Address, - - #[selector = 2] - Deploy2 { x: u256, y: u256, salt: u256 } -> Address, -} - -pub struct Pair { - x: u256, - y: u256, -} - -pub contract Child { - state: Pair - - init(x: u256, y: u256) uses (mut state) { - state.x = x - state.y = y - } -} - -pub contract Factory uses (create: mut Create) { - recv FactoryMsg { - Deploy { x, y } -> Address uses (mut create) { - create.create(value: 0, args: (x, y)) - } - - Deploy2 { x, y, salt } -> Address uses (mut create) { - create.create2(value: 0, args: (x, y), salt: salt) - } - } -} diff --git a/crates/codegen/tests/fixtures/create_contract.snap b/crates/codegen/tests/fixtures/create_contract.snap deleted file mode 100644 index 386600841f..0000000000 --- a/crates/codegen/tests/fixtures/create_contract.snap +++ /dev/null @@ -1,662 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/create_contract.fe ---- -object "Factory" { - code { - function $__Factory_init() { - let v0 := dataoffset("Factory_deployed") - let v1 := datasize("Factory_deployed") - codecopy(0, v0, v1) - return(0, v1) - } - $__Factory_init() - } - - object "Factory_deployed" { - code { - function $__Child_init_code_len() -> ret { - let v0 := datasize("Child") - ret := v0 - leave - } - function $__Child_init_code_offset() -> ret { - let v0 := dataoffset("Child") - ret := v0 - leave - } - function $__Factory_recv_0_0($args, $create) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 - } - mstore(0x40, add(v4, 64)) - mstore(v4, v1) - mstore(add(v4, 32), v3) - let v5 := $create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed($create, 0, v4) - ret := v5 - leave - } - function $__Factory_recv_0_1($args, $create) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - let v4 := mload(add($args, 64)) - let v5 := v4 - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 - } - mstore(0x40, add(v6, 64)) - mstore(v6, v1) - mstore(add(v6, 32), v3) - let v7 := $create2_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed($create, 0, v6, v5) - ret := v7 - leave - } - function $__Factory_runtime() { - let v0 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v1 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v0 - case 1 { - let v2 := $deploy_h5c6b1804553edb1_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v1) - let v3 := $__Factory_recv_0_0(v2, 0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c(0, v3) - } - case 2 { - let v4 := $deploy2_ha2b981aa2f8bf9fd_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v1) - let v5 := $__Factory_recv_0_1(v4, 0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c(0, v5) - } - default { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - } - function $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($self, $e) { - let v0 := mload($self) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0, $e) - let v1 := mload(add($self, 32)) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v1, $e) - leave - } - function $address_h257056268eac7027_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $create2_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed($self, $value, $args, $salt) -> ret { - let v0 := $__Child_init_code_len() - let v1 := $__Child_init_code_offset() - let v2 := 64 - let v3 := add(v0, v2) - let v4 := mload(64) - if iszero(v4) { - v4 := 0x80 - } - mstore(64, add(v4, v3)) - codecopy(v4, v1, v0) - let v5 := add(v4, v0) - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 - } - mstore(0x40, add(v6, 96)) - mstore(v6, v5) - mstore(add(v6, 32), v5) - mstore(add(v6, 64), add(v5, v2)) - let v7 := v6 - $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($args, v7) - let v8 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor($self, $value, v4, v3, $salt) - let v9 := eq(v8, 0) - if v9 { - let v10 := returndatasize() - let v11 := mload(64) - if iszero(v11) { - v11 := 0x80 - } - mstore(64, add(v11, v10)) - returndatacopy(v11, 0, v10) - revert(v11, v10) - } - ret := v8 - leave - } - function $create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed($self, $value, $args) -> ret { - let v0 := $__Child_init_code_len() - let v1 := $__Child_init_code_offset() - let v2 := 64 - let v3 := add(v0, v2) - let v4 := mload(64) - if iszero(v4) { - v4 := 0x80 - } - mstore(64, add(v4, v3)) - codecopy(v4, v1, v0) - let v5 := add(v4, v0) - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 - } - mstore(0x40, add(v6, 96)) - mstore(v6, v5) - mstore(add(v6, 32), v5) - mstore(add(v6, 64), add(v5, v2)) - let v7 := v6 - $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($args, v7) - let v8 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor($self, $value, v4, v3) - let v9 := eq(v8, 0) - if v9 { - let v10 := returndatasize() - let v11 := mload(64) - if iszero(v11) { - v11 := 0x80 - } - mstore(64, add(v11, v10)) - returndatacopy(v11, 0, v10) - revert(v11, v10) - } - ret := v8 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $deploy2_ha2b981aa2f8bf9fd_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v3 := mload(0x40) - if iszero(v3) { - v3 := 0x80 - } - mstore(0x40, add(v3, 96)) - mstore(v3, v0) - mstore(add(v3, 32), v1) - mstore(add(v3, 64), v2) - ret := v3 - leave - } - function $deploy_h5c6b1804553edb1_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - ret := v2 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes($self, $ptr, $len) { - return($ptr, $len) - } - function $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor($self, $value, $offset, $len, $salt) -> ret { - let v0 := create2($value, $offset, $len, $salt) - ret := v0 - leave - } - function $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor($self, $value, $offset, $len) -> ret { - let v0 := create($value, $offset, $len) - ret := v0 - leave - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $address_h257056268eac7027_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> ret { - let v0 := $solencoder_h1b9228b90dad6928_new() - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self) -> ret { - let v0 := mload($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := mload(add($self, 32)) - let v3 := add(v2, 32) - let v4 := mload(add($self, 32)) - let v5 := lt(v3, v4) - if v5 { - revert(0, 0) - } - let v6 := gt(v3, v1) - if v6 { - revert(0, 0) - } - let v7 := mload($self) - let v8 := mload(add($self, 32)) - let v9 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v7, v8) - mstore(add($self, 32), v3) - ret := v9 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave - } - function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($d) - ret := v0 - leave - } - function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - $__Factory_runtime() - return(0, 0) - } - object "Child" { - code { - function $__Child_init() { - let v0 := $init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(0, 0) - let v1 := dataoffset("Child_deployed") - let v2 := datasize("Child_deployed") - let v3 := datasize("Child") - let v4 := codesize() - let v5 := lt(v4, v3) - if v5 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - let v6 := sub(v4, v3) - let v7 := mload(64) - if iszero(v7) { - v7 := 0x80 - } - mstore(64, add(v7, v6)) - codecopy(v7, v3, v6) - let v8 := mload(0x40) - if iszero(v8) { - v8 := 0x80 - } - mstore(0x40, add(v8, 64)) - mstore(v8, v7) - mstore(add(v8, 32), v6) - let v9 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v8) - let v10 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v9) - let v11 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v9) - $__Child_init_contract(v10, v11, v0) - codecopy(0, v1, v2) - return(0, v2) - } - function $__Child_init_contract($x, $y, $state) { - sstore($state, $x) - sstore(add($state, 1), $y) - leave - } - function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - let v1 := $input - mstore(v0, mload(v1)) - mstore(add(v0, 32), mload(add(v1, 32))) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(0, $slot) - ret := v0 - leave - } - function $init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140($self, $slot) - ret := v0 - leave - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := mload(add($self, 32)) - ret := v0 - leave - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := mload($self) - let v1 := add(v0, $byte_offset) - let v2 := mload(v1) - ret := v2 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { - let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) - let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { - revert(0, 0) - } - let v5 := gt(v2, v0) - if v5 { - revert(0, 0) - } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 128)) - let v2 := v0 - mstore(v1, mload(v2)) - mstore(add(v1, 32), mload(add(v2, 32))) - mstore(add(v1, 64), mload(add(v2, 64))) - mstore(add(v1, 96), 0) - ret := v1 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140($raw) -> ret { - ret := $raw - leave - } - function $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($d) - ret := v0 - leave - } - $__Child_init() - } - - object "Child_deployed" { - code { - function $__Child_runtime() { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140(0, 0) - let v1 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v2 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v1 - default { - } - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140($raw) -> ret { - ret := $raw - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - $__Child_runtime() - return(0, 0) - } - } - } - } -} diff --git a/crates/codegen/tests/fixtures/effect_ptr_calldata_domain.fe b/crates/codegen/tests/fixtures/effect_ptr_calldata_domain.fe deleted file mode 100644 index 4ca945a247..0000000000 --- a/crates/codegen/tests/fixtures/effect_ptr_calldata_domain.fe +++ /dev/null @@ -1,10 +0,0 @@ -fn read_x() -> u256 uses (x: u256) { - x -} - -fn test_calldata_ptr_domain() { - let c = std::evm::CalldataPtr { offset: 0 } - with (c) { - let _v = read_x() - } -} diff --git a/crates/codegen/tests/fixtures/effect_ptr_calldata_domain.snap b/crates/codegen/tests/fixtures/effect_ptr_calldata_domain.snap deleted file mode 100644 index 49ce185c16..0000000000 --- a/crates/codegen/tests/fixtures/effect_ptr_calldata_domain.snap +++ /dev/null @@ -1,21 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/effect_ptr_calldata_domain.fe ---- -function $read_x__StorPtr_u256___64779554cfbf0358($x) -> ret { - let v0 := sload($x) - ret := v0 - leave -} -function $test_calldata_ptr_domain() { - let v0 := 0 - let v1 := v0 - let v2 := $read_x__CalldataPtr_u256___1e20dc3e834a8f96(v1) - leave -} -function $read_x__CalldataPtr_u256___1e20dc3e834a8f96($x) -> ret { - let v0 := calldataload($x) - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/effect_ptr_domains.fe b/crates/codegen/tests/fixtures/effect_ptr_domains.fe deleted file mode 100644 index 62a96ee62c..0000000000 --- a/crates/codegen/tests/fixtures/effect_ptr_domains.fe +++ /dev/null @@ -1,28 +0,0 @@ -use std::evm::{MemPtr, RawMem, RawStorage, StorPtr} - -struct Foo { - a: u256, - b: u256, -} - -fn bump() uses (foo: mut Foo) { - foo.a = foo.a + 1 - foo.b = foo.b + 2 -} - -fn test_effect_ptr_domains() uses (st: mut RawStorage, mem: mut RawMem) { - let mp: MemPtr = mem.mem_ptr(0x100) - with (mp) { - bump() - } - - let sp: StorPtr = st.stor_ptr(0) - with (sp) { - bump() - } - - let mut foo = Foo { a: 10, b: 20 } - with (foo) { - bump() - } -} diff --git a/crates/codegen/tests/fixtures/effect_ptr_domains.snap b/crates/codegen/tests/fixtures/effect_ptr_domains.snap deleted file mode 100644 index 14cbba7ee0..0000000000 --- a/crates/codegen/tests/fixtures/effect_ptr_domains.snap +++ /dev/null @@ -1,57 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/effect_ptr_domains.fe ---- -function $bump__StorPtr_Foo___3698cc3c4b2626e3($foo) { - let v0 := sload($foo) - sstore($foo, add(v0, 1)) - let v1 := sload(add($foo, 1)) - sstore(add($foo, 1), add(v1, 2)) - leave -} -function $test_effect_ptr_domains__Evm_hef0af3106e109414_Evm_hef0af3106e109414__7ab75559784fbc59($st, $mem) { - let v0 := $mem_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d($mem, 256) - let v1 := v0 - $bump__MemPtr_Foo___cdd30998d577b6ea(v1) - let v2 := $stor_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d($st, 0) - let v3 := v2 - $bump__StorPtr_Foo___3698cc3c4b2626e3(v3) - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 - } - mstore(0x40, add(v4, 64)) - mstore(v4, 10) - mstore(add(v4, 32), 20) - let v5 := v4 - let v6 := v5 - $bump__MemPtr_Foo___cdd30998d577b6ea(v5) - leave -} -function $mem_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d($self, $addr) -> ret { - let v0 := $memptr_t__hf71ec14ffe47fb3f_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($addr) - ret := v0 - leave -} -function $bump__MemPtr_Foo___cdd30998d577b6ea($foo) { - let v0 := mload($foo) - mstore($foo, add(v0, 1)) - let v1 := mload(add($foo, 32)) - mstore(add($foo, 32), add(v1, 2)) - leave -} -function $stor_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($slot) - ret := v0 - leave -} -function $memptr_t__hf71ec14ffe47fb3f_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($raw) -> ret { - ret := $raw - leave -} -function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($raw) -> ret { - ret := $raw - leave -} diff --git a/crates/codegen/tests/fixtures/enum_variant_contract.fe b/crates/codegen/tests/fixtures/enum_variant_contract.fe deleted file mode 100644 index e9ade19416..0000000000 --- a/crates/codegen/tests/fixtures/enum_variant_contract.fe +++ /dev/null @@ -1,62 +0,0 @@ -use std::evm::{Evm, RawMem, RawOps} - -enum MyOption { - None, - Some(u256), -} - -fn abi_encode_u256(value: u256) -> ! uses (ops: mut RawOps) { - let ptr: u256 = 0 - ops.mstore(ptr, value) - ops.return_data(ptr, 32) -} - -#[contract_init(EnumContract)] -fn init() uses (evm: mut Evm) { - let len = evm.code_region_len(runtime) - let offset = evm.code_region_offset(runtime) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(EnumContract)] -fn runtime() uses (evm: mut Evm) { - let selector = evm.calldataload(0) >> 224 - - // make_some(uint256) -> returns the value back - // Selector: keccak256("make_some(uint256)")[:4] = 0x6c56cb0c - if selector == 0x6c56cb0c { - let value = evm.calldataload(4) - let opt = MyOption::Some(value) - let result = match opt { - MyOption::Some(val) => val - MyOption::None => 0 - } - with (RawOps = evm) { abi_encode_u256(value: result) } - } - - // make_none() -> returns 0 - // Selector: keccak256("make_none()")[:4] = 0x455dd373 - if selector == 0x455dd373 { - let opt = MyOption::None - let result = match opt { - MyOption::Some(val) => val - MyOption::None => 0 - } - with (RawOps = evm) { abi_encode_u256(value: result) } - } - - // is_some_check(uint256) -> returns 1 if constructed as Some - // Selector: keccak256("is_some_check(uint256)")[:4] = 0xd4eee422 - if selector == 0xd4eee422 { - let value = evm.calldataload(4) - let opt = MyOption::Some(value) - let result = match opt { - MyOption::Some(_) => 1 - MyOption::None => 0 - } - with (RawOps = evm) { abi_encode_u256(value: result) } - } - - evm.return_data(0, 0) -} diff --git a/crates/codegen/tests/fixtures/enum_variant_contract.snap b/crates/codegen/tests/fixtures/enum_variant_contract.snap deleted file mode 100644 index edad8d817d..0000000000 --- a/crates/codegen/tests/fixtures/enum_variant_contract.snap +++ /dev/null @@ -1,114 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/enum_variant_contract.fe ---- -object "EnumContract" { - code { - function $init__StorPtr_Evm___207f35a85ac4062e() { - let v0 := datasize("EnumContract_deployed") - let v1 := dataoffset("EnumContract_deployed") - codecopy(0, v1, v0) - return(0, v0) - } - $init__StorPtr_Evm___207f35a85ac4062e() - } - - object "EnumContract_deployed" { - code { - function $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741($value, $ops) { - let v0 := 0 - mstore(v0, $value) - return(v0, 32) - } - function $runtime__StorPtr_Evm___207f35a85ac4062e() { - let v0 := calldataload(0) - let v1 := shr(224, v0) - let v2 := eq(v1, 1817627404) - if v2 { - let v3 := calldataload(4) - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 - } - mstore(0x40, add(v4, 64)) - mstore(v4, 1) - mstore(add(v4, 32), v3) - let v5 := 0 - let v6 := mload(v4) - switch v6 - case 1 { - let v7 := mload(add(v4, 32)) - let v8 := v7 - v5 := v8 - } - case 0 { - v5 := 0 - } - default { - } - let v9 := v4 - let v10 := v5 - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v10, 0) - } - if iszero(v2) { - let v11 := eq(v1, 1163776883) - if v11 { - let v12 := mload(0x40) - if iszero(v12) { - v12 := 0x80 - } - mstore(0x40, add(v12, 64)) - mstore(v12, 0) - let v13 := 0 - let v14 := mload(v12) - switch v14 - case 1 { - let v15 := mload(add(v12, 32)) - let v16 := v15 - v13 := v16 - } - case 0 { - v13 := 0 - } - default { - } - let v17 := v12 - let v18 := v13 - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v18, 0) - } - if iszero(v11) { - let v19 := eq(v1, 3572425762) - if iszero(v19) { - return(0, 0) - } - let v20 := calldataload(4) - let v21 := mload(0x40) - if iszero(v21) { - v21 := 0x80 - } - mstore(0x40, add(v21, 64)) - mstore(v21, 1) - mstore(add(v21, 32), v20) - let v22 := 0 - let v23 := mload(v21) - switch v23 - case 1 { - v22 := 1 - } - case 0 { - v22 := 0 - } - default { - } - let v24 := v22 - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v24, 0) - } - } - } - $runtime__StorPtr_Evm___207f35a85ac4062e() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/erc20.fe b/crates/codegen/tests/fixtures/erc20.fe deleted file mode 100644 index 6475272f8d..0000000000 --- a/crates/codegen/tests/fixtures/erc20.fe +++ /dev/null @@ -1,256 +0,0 @@ -use std::evm::{Address, Ctx, StorageMap, assert} -use std::evm::effects::Log -use std::abi::sol - -// roles -const MINTER: u256 = 1 -const BURNER: u256 = 2 - -pub contract CoolCoin uses (ctx: mut Ctx, log: mut Log) { - // Storage fields. These act as effects within the contract. - mut store: TokenStore, - mut auth: AccessControl, - - // Initialize the token with name, symbol, decimals, and initial supply - init(initial_supply: u256, owner: Address) - uses (mut store, mut auth, mut ctx, mut log) - { - auth.grant(role: MINTER, to: owner) - auth.grant(role: BURNER, to: owner) - - if initial_supply > 0 { - mint(to: owner, amount: initial_supply) - } - } - - recv Erc20 { - Transfer { to, amount } -> bool uses (ctx, mut store, mut log) { - transfer(from: ctx.caller(), to, amount) - true - } - - Approve { spender, amount } -> bool uses (ctx, mut store, mut log) { - approve(owner: ctx.caller(), spender, amount) - true - } - - TransferFrom { from, to, amount } -> bool uses (ctx, mut store, mut log) { - spend_allowance(owner: from, spender: ctx.caller(), amount) - transfer(from, to, amount) - true - } - - BalanceOf { account } -> u256 uses store { - store.balances.get(account) - } - - Allowance { owner, spender } -> u256 uses (store) { - store.allowances.get((owner, spender)) - } - - TotalSupply {} -> u256 uses store { - store.total_supply - } - - Name {} -> String<32> { "CoolCoin" } - Symbol {} -> String<8> { "COOL" } - Decimals {} -> u8 { 18 } - } - - // Extended functionality (minting and burning) - recv Erc20Extended { - Mint { to, amount } -> bool uses (ctx, mut store, mut log, auth) { - auth.require(role: MINTER) - mint(to, amount) - true - } - - // Burns tokens from caller's balance - Burn { amount } -> bool uses (ctx, mut store, mut log) { - burn(from: ctx.caller(), amount) - true - } - - // Burns tokens from an account using allowance (requires BURNER or allowance) - BurnFrom { from, amount } -> bool uses (ctx, mut store, mut log) { - spend_allowance(owner: from, spender: ctx.caller(), amount) - burn(from, amount) - true - } - - IncreaseAllowance { spender, added_value } -> bool - uses (ctx, mut store, mut log) - { - let owner = ctx.caller() - let current = store.allowances.get((owner, spender)) - approve(owner, spender, amount: current + added_value) - true - } - - DecreaseAllowance { spender, subtracted_value } -> bool - uses (ctx, mut store, mut log) { - let owner = ctx.caller() - let current = store.allowances.get((owner, spender)) - assert(current >= subtracted_value) - approve(owner, spender, amount: current - subtracted_value) - true - } - } -} - -fn transfer(from: Address, to: Address, amount: u256) - uses (store: mut TokenStore, log: mut Log) -{ - assert(from != Address::zero()) - assert(to != Address::zero()) - - let from_balance = store.balances.get(from) - assert(from_balance >= amount) - - store.balances.set(from, from_balance - amount) - store.balances.set(to, store.balances.get(to) + amount) - - log.emit(TransferEvent { from, to, value: amount }) -} - -fn mint(to: Address, amount: u256) - uses (store: mut TokenStore, log: mut Log) -{ - assert(to != Address::zero()) - - store.total_supply += amount - store.balances.set(to, store.balances.get(to) + amount) - - log.emit(TransferEvent { from: Address::zero(), to, value: amount }) -} - -fn burn(from: Address, amount: u256) - uses (store: mut TokenStore, log: mut Log) -{ - assert(from != Address::zero()) - - let from_balance = store.balances.get(from) - assert(from_balance >= amount) - - store.balances.set(from, from_balance - amount) - store.total_supply -= amount - - log.emit(TransferEvent { from, to: Address::zero(), value: amount }) -} - -fn approve(owner: Address, spender: Address, amount: u256) - uses (store: mut TokenStore, log: mut Log) -{ - assert(owner != Address::zero()) - assert(spender != Address::zero()) - - store.allowances.set((owner, spender), amount) - - log.emit(ApprovalEvent { owner, spender, value: amount }) -} - -// Internal function to spend allowance -fn spend_allowance(owner: Address, spender: Address, amount: u256) - uses (store: mut TokenStore) -{ - let current = store.allowances.get((owner, spender)) - // if current != u256::MAX { // TODO: define ::MAX constants - assert(current >= amount) - store.allowances.set((owner, spender), current - amount) - // } -} - -struct TokenStore { - total_supply: u256, - balances: StorageMap, - allowances: StorageMap<(Address, Address), u256>, -} - -pub struct AccessControl { - roles: StorageMap<(u256, Address), bool>, -} - -impl AccessControl { - pub fn has_role(self, role: u256, account: Address) -> bool { - self.roles.get((role, account)) - } - - pub fn require(self, role: u256) uses (ctx: Ctx) { - assert(self.roles.get((role, ctx.caller())) == true) - } - - pub fn grant(mut self, role: u256, to: Address) { - self.roles.set((role, to), true) - } - - pub fn revoke(mut self, role: u256, from: Address) { - self.roles.set((role, from), false) - } -} - -// ERC20 standard message types -msg Erc20 { - #[selector = sol("name()")] - Name -> String<32>, - - #[selector = sol("symbol()")] - Symbol -> String<8>, - - #[selector = sol("decimals()")] - Decimals -> u8, - - #[selector = sol("totalSupply()")] - TotalSupply -> u256, - - #[selector = sol("balanceOf(address)")] - BalanceOf { account: Address } -> u256, - - #[selector = sol("allowance(address,address)")] - Allowance { owner: Address, spender: Address } -> u256, - - #[selector = sol("transfer(address,uint256)")] - Transfer { to: Address, amount: u256 } -> bool, - - #[selector = sol("approve(address,uint256)")] - Approve { spender: Address, amount: u256 } -> bool, - - #[selector = sol("transferFrom(address,address,uint256)")] - TransferFrom { from: Address, to: Address, amount: u256 } -> bool, -} - -// Extended ERC20 message types (minting, burning, allowance helpers) -msg Erc20Extended { - #[selector = sol("mint(address,uint256)")] - Mint { to: Address, amount: u256 } -> bool, - - #[selector = sol("burn(uint256)")] - Burn { amount: u256 } -> bool, - - #[selector = sol("burnFrom(address,uint256)")] - BurnFrom { from: Address, amount: u256 } -> bool, - - #[selector = sol("increaseAllowance(address,uint256)")] - IncreaseAllowance { spender: Address, added_value: u256 } -> bool, - - #[selector = sol("decreaseAllowance(address,uint256)")] - DecreaseAllowance { spender: Address, subtracted_value: u256 } -> bool, -} - -// ERC20 events -#[event] -struct TransferEvent { - #[indexed] - from: Address, - #[indexed] - to: Address, - value: u256, -} - -#[event] -struct ApprovalEvent { - #[indexed] - owner: Address, - #[indexed] - spender: Address, - value: u256, -} diff --git a/crates/codegen/tests/fixtures/erc20.snap b/crates/codegen/tests/fixtures/erc20.snap deleted file mode 100644 index 6d12b14cdc..0000000000 --- a/crates/codegen/tests/fixtures/erc20.snap +++ /dev/null @@ -1,1374 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/erc20.fe ---- -object "CoolCoin" { - code { - function $__CoolCoin_init() { - let v0 := $init_field__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5(0, 0) - let v1 := $init_field__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961(0, 3) - let v2 := dataoffset("CoolCoin_deployed") - let v3 := datasize("CoolCoin_deployed") - let v4 := datasize("CoolCoin") - let v5 := codesize() - let v6 := lt(v5, v4) - if v6 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - let v7 := sub(v5, v4) - let v8 := mload(64) - if iszero(v8) { - v8 := 0x80 - } - mstore(64, add(v8, v7)) - codecopy(v8, v4, v7) - let v9 := mload(0x40) - if iszero(v9) { - v9 := 0x80 - } - mstore(0x40, add(v9, 64)) - mstore(v9, v8) - mstore(add(v9, 32), v7) - let v10 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v9) - let v11 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v10) - let v12 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v10) - $__CoolCoin_init_contract(v11, v12, v0, v1, 0, 0) - codecopy(0, v2, v3) - return(0, v3) - } - function $__CoolCoin_init_contract($initial_supply, $owner, $store, $auth, $ctx, $log) { - $accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef($auth, 1, $owner) - $accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef($auth, 2, $owner) - let v0 := gt($initial_supply, 0) - if v0 { - $mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb($owner, $initial_supply, $store, $log) - } - leave - } - function $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df($ptr, $self) -> ret { - let v0 := mload($self) - let v1 := $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, v0) - let v2 := mload(add($self, 32)) - let v3 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(add($ptr, v1), v2) - ret := add(v1, v3) - leave - } - function $accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef($self, $role, $to) { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $role) - mstore(add(v0, 32), $to) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8(0, v0, 1) - leave - } - function $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($d) - ret := v0 - leave - } - function $address_h257056268eac7027_eq_h14b330e44530c410_eq($self, $other) -> ret { - ret := eq($self, $other) - leave - } - function $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { - let v0 := $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) - ret := v0 - leave - } - function $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic($self) -> ret { - ret := $self - leave - } - function $address_h257056268eac7027_zero() -> ret { - ret := 0 - leave - } - function $assert($b) { - let v0 := iszero($b) - if v0 { - revert(0, 0) - } - leave - } - function $bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_to_word($self) -> ret { - let v0 := 0 - let v1 := $self - if v1 { - v0 := 1 - } - if iszero(v1) { - v0 := 0 - } - ret := v0 - leave - } - function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - let v1 := $input - mstore(v0, mload(v1)) - mstore(add(v0, 32), mload(add(v1, 32))) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($self, $event) { - $transferevent_h1c9ba82714a4a1f0_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741($event, $self) - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_log_h22d1a10952034bae_log3_arg0_root_stor($self, $offset, $len, $topic0, $topic1, $topic2) { - log3($offset, $len, $topic0, $topic1, $topic2) - leave - } - function $init_field__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f($self, $slot) - ret := v0 - leave - } - function $init_field__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde($self, $slot) - ret := v0 - leave - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := mload(add($self, 32)) - ret := v0 - leave - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := mload($self) - let v1 := add(v0, $byte_offset) - let v2 := mload(v1) - ret := v2 - leave - } - function $mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb($to, $amount, $store, $log) { - let v0 := $address_h257056268eac7027_zero() - let v1 := $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($to, v0) - $assert(v1) - let v2 := sload($store) - sstore($store, add(v2, $amount)) - pop($store) - pop($store) - let v3 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v3, $amount)) - let v4 := $address_h257056268eac7027_zero() - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 96)) - mstore(v5, v4) - mstore(add(v5, 32), $to) - mstore(add(v5, 64), $amount) - $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v5) - leave - } - function $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($self, $other) -> ret { - let v0 := $address_h257056268eac7027_eq_h14b330e44530c410_eq($self, $other) - ret := iszero(v0) - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { - let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) - let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { - revert(0, 0) - } - let v5 := gt(v2, v0) - if v5 { - revert(0, 0) - } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 128)) - let v2 := v0 - mstore(v1, mload(v2)) - mstore(add(v1, 32), mload(add(v2, 32))) - mstore(add(v1, 64), mload(add(v2, 64))) - mstore(add(v1, 96), 0) - ret := v1 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave - } - function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($slot) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($slot) - ret := v0 - leave - } - function $storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) -> ret { - let v0 := $storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) - let v1 := sload(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3($self, $key) -> ret { - let v0 := $storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, 0) - let v1 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3($self, $key, $value) { - let v0 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($value) - $storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, 0, v0) - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8($self, $key, $value) { - let v0 := $bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_to_word($value) - $storagemap_set_word_with_salt___u256__Address___c7c570db20cdd393($key, 3, v0) - leave - } - function $storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt, $word) { - let v0 := $storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) - sstore(v0, $word) - leave - } - function $storagemap_set_word_with_salt___u256__Address___c7c570db20cdd393($key, $salt, $word) { - let v0 := $storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393($key, $salt) - sstore(v0, $word) - leave - } - function $storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, 0)) - let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 - leave - } - function $storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393($key, $salt) -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, 0)) - let v1 := $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($raw) -> ret { - ret := $raw - leave - } - function $transferevent_h1c9ba82714a4a1f0_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741($self, $log) { - let v0 := $solencoder_h1b9228b90dad6928_new() - let v1 := 32 - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, v1) - pop(v2) - let v3 := mload(add($self, 64)) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v3, v0) - let v4 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v5 := mload(v4) - let v6 := v5 - let v7 := mload(add(v4, 32)) - let v8 := v7 - let v9 := mload($self) - let v10 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v9) - let v11 := mload(add($self, 32)) - let v12 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v11) - $evm_hef0af3106e109414_log_h22d1a10952034bae_log3_arg0_root_stor($log, v6, v8, 106268374300910980166318620624040158066582587003704178075307865084173350203760, v10, v12) - leave - } - function $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($d) - ret := v0 - leave - } - function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - function $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { - mstore($ptr, $self) - ret := 32 - leave - } - function $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word($word) -> ret { - ret := $word - leave - } - function $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($self) -> ret { - ret := $self - leave - } - $__CoolCoin_init() - } - - object "CoolCoin_deployed" { - code { - function $__CoolCoin_recv_0_0($args, $ctx, $store, $log) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - let v4 := caller() - $transfer__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v4, v1, v3, $store, $log) - ret := 1 - leave - } - function $__CoolCoin_recv_0_1($args, $ctx, $store, $log) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - let v4 := caller() - $approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v4, v1, v3, $store, $log) - ret := 1 - leave - } - function $__CoolCoin_recv_0_2($args, $ctx, $store, $log) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - let v4 := mload(add($args, 64)) - let v5 := v4 - let v6 := caller() - $spend_allowance__0_1_StorPtr_TokenStore_0__1____d3adca980e228028(v1, v6, v5, $store) - $transfer__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v1, v3, v5, $store, $log) - ret := 1 - leave - } - function $__CoolCoin_recv_0_3($args, $store) -> ret { - let v0 := $args - pop($store) - let v1 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, v0) - ret := v1 - leave - } - function $__CoolCoin_recv_0_4($args, $store) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - pop($store) - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 - } - mstore(0x40, add(v4, 64)) - mstore(v4, v1) - mstore(add(v4, 32), v3) - let v5 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v4) - ret := v5 - leave - } - function $__CoolCoin_recv_0_5($args, $store) -> ret { - let v0 := sload($store) - ret := v0 - leave - } - function $__CoolCoin_recv_0_6($args) -> ret { - ret := 0x436f6f6c436f696e - leave - } - function $__CoolCoin_recv_0_7($args) -> ret { - ret := 0x434f4f4c - leave - } - function $__CoolCoin_recv_0_8($args) -> ret { - ret := 18 - leave - } - function $__CoolCoin_recv_1_0($args, $ctx, $store, $log, $auth) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - $accesscontrol____h4c85da5bbb505ade_require_stor_arg0_root_stor__3_Evm_hef0af3106e109414__5baaa260f0d18873($auth, 1, $ctx) - $mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v1, v3, $store, $log) - ret := 1 - leave - } - function $__CoolCoin_recv_1_1($args, $ctx, $store, $log) -> ret { - let v0 := $args - let v1 := caller() - $burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v1, v0, $store, $log) - ret := 1 - leave - } - function $__CoolCoin_recv_1_2($args, $ctx, $store, $log) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - let v4 := caller() - $spend_allowance__0_1_StorPtr_TokenStore_0__1____d3adca980e228028(v1, v4, v3, $store) - $burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v1, v3, $store, $log) - ret := 1 - leave - } - function $__CoolCoin_recv_1_3($args, $ctx, $store, $log) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - let v4 := caller() - pop($store) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 64)) - mstore(v5, v4) - mstore(add(v5, 32), v1) - let v6 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v5) - $approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v4, v1, add(v6, v3), $store, $log) - ret := 1 - leave - } - function $__CoolCoin_recv_1_4($args, $ctx, $store, $log) -> ret { - let v0 := mload($args) - let v1 := v0 - let v2 := mload(add($args, 32)) - let v3 := v2 - let v4 := caller() - pop($store) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 64)) - mstore(v5, v4) - mstore(add(v5, 32), v1) - let v6 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v5) - $assert(iszero(lt(v6, v3))) - $approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v4, v1, sub(v6, v3), $store, $log) - ret := 1 - leave - } - function $__CoolCoin_runtime() { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde(0, 0) - let v1 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f(0, 3) - let v2 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v3 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v2 - case 2835717307 { - let v4 := $transfer_h13f5ec5985ebba60_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v5 := $__CoolCoin_recv_0_0(v4, 0, v0, 0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(0, v5) - } - case 157198259 { - let v6 := $approve_h90175fc19dafde67_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v7 := $__CoolCoin_recv_0_1(v6, 0, v0, 0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(0, v7) - } - case 599290589 { - let v8 := $transferfrom_h939549e4bad999e8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v9 := $__CoolCoin_recv_0_2(v8, 0, v0, 0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(0, v9) - } - case 1889567281 { - let v10 := $balanceof_hf830ebedc81244a7_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v11 := $__CoolCoin_recv_0_3(v10, v0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(0, v11) - } - case 3714247998 { - let v12 := $allowance_h4bb1267f662bd2a8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v13 := $__CoolCoin_recv_0_4(v12, v0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(0, v13) - } - case 404098525 { - $totalsupply_h6bf4f2c3498c901c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v14 := $__CoolCoin_recv_0_5(0, v0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(0, v14) - } - case 117300739 { - $name_h327e3db4a53b027e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v15 := $__CoolCoin_recv_0_6(0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_32___7798a45a8b22b7ed(0, v15) - } - case 2514000705 { - $symbol_h6dabcb627bde53b9_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v16 := $__CoolCoin_recv_0_7(0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_8___99627a2b067a3b64(0, v16) - } - case 826074471 { - $decimals_h247e095089bd9dcb_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v17 := $__CoolCoin_recv_0_8(0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u8__5f40d25b4a1c5efd(0, v17) - } - case 1086394137 { - let v18 := $mint_ha2f94817be433a2e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v19 := $__CoolCoin_recv_1_0(v18, 0, v0, 0, v1) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(0, v19) - } - case 1117154408 { - let v20 := $burn_h25a61f4466d20eed_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v21 := $__CoolCoin_recv_1_1(v20, 0, v0, 0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(0, v21) - } - case 2043438992 { - let v22 := $burnfrom_ha9fb0972f143e40c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v23 := $__CoolCoin_recv_1_2(v22, 0, v0, 0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(0, v23) - } - case 961581905 { - let v24 := $increaseallowance_h9840135eaea36633_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v25 := $__CoolCoin_recv_1_3(v24, 0, v0, 0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(0, v25) - } - case 2757214935 { - let v26 := $decreaseallowance_h635474f45639c83d_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v27 := $__CoolCoin_recv_1_4(v26, 0, v0, 0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(0, v27) - } - default { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - } - function $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($ptr, $self) -> ret { - let v0 := mload($self) - let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, v0) - let v2 := mload(add($self, 32)) - let v3 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(add($ptr, v1), v2) - ret := add(v1, v3) - leave - } - function $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df($ptr, $self) -> ret { - let v0 := mload($self) - let v1 := $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, v0) - let v2 := mload(add($self, 32)) - let v3 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(add($ptr, v1), v2) - ret := add(v1, v3) - leave - } - function $accesscontrol____h4c85da5bbb505ade_require_stor_arg0_root_stor__3_Evm_hef0af3106e109414__5baaa260f0d18873($self, $role, $ctx) { - let v0 := caller() - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, $role) - mstore(add(v1, 32), v0) - let v2 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8(0, v1) - $assert(eq(v2, 1)) - leave - } - function $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($d) - ret := v0 - leave - } - function $address_h257056268eac7027_eq_h14b330e44530c410_eq($self, $other) -> ret { - ret := eq($self, $other) - leave - } - function $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { - let v0 := $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) - ret := v0 - leave - } - function $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic($self) -> ret { - ret := $self - leave - } - function $address_h257056268eac7027_zero() -> ret { - ret := 0 - leave - } - function $allowance_h4bb1267f662bd2a8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - ret := v2 - leave - } - function $approvalevent_h313d94630b6580e5_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741($self, $log) { - let v0 := $solencoder_h1b9228b90dad6928_new() - let v1 := 32 - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, v1) - pop(v2) - let v3 := mload(add($self, 64)) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v3, v0) - let v4 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v5 := mload(v4) - let v6 := v5 - let v7 := mload(add(v4, 32)) - let v8 := v7 - let v9 := mload($self) - let v10 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v9) - let v11 := mload(add($self, 32)) - let v12 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v11) - $evm_hef0af3106e109414_log_h22d1a10952034bae_log3_arg0_root_stor($log, v6, v8, 3682740849240848158437977969522068712009226744993583420104789809440898259342, v10, v12) - leave - } - function $approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb($owner, $spender, $amount, $store, $log) { - let v0 := $address_h257056268eac7027_zero() - let v1 := $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($owner, v0) - $assert(v1) - let v2 := $address_h257056268eac7027_zero() - let v3 := $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($spender, v2) - $assert(v3) - pop($store) - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 - } - mstore(0x40, add(v4, 64)) - mstore(v4, $owner) - mstore(add(v4, 32), $spender) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v4, $amount) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 96)) - mstore(v5, $owner) - mstore(add(v5, 32), $spender) - mstore(add(v5, 64), $amount) - $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_ApprovalEvent_h313d94630b6580e5__2946163026d92694($log, v5) - leave - } - function $approve_h90175fc19dafde67_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - ret := v2 - leave - } - function $assert($b) { - let v0 := iszero($b) - if v0 { - revert(0, 0) - } - leave - } - function $balanceof_hf830ebedc81244a7_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - ret := v0 - leave - } - function $bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - let v0 := $self - if v0 { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, 1) - } - if iszero(v0) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, 0) - } - leave - } - function $bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_from_word($word) -> ret { - ret := iszero(eq($word, 0)) - leave - } - function $burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb($from, $amount, $store, $log) { - let v0 := $address_h257056268eac7027_zero() - let v1 := $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($from, v0) - $assert(v1) - pop($store) - let v2 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from) - $assert(iszero(lt(v2, $amount))) - pop($store) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, sub(v2, $amount)) - let v3 := sload($store) - sstore($store, sub(v3, $amount)) - let v4 := $address_h257056268eac7027_zero() - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 96)) - mstore(v5, $from) - mstore(add(v5, 32), v4) - mstore(add(v5, 64), $amount) - $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v5) - leave - } - function $burn_h25a61f4466d20eed_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - ret := v0 - leave - } - function $burnfrom_ha9fb0972f143e40c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - ret := v2 - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $decimals_h247e095089bd9dcb_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $decreaseallowance_h635474f45639c83d_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - ret := v2 - leave - } - function $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_ApprovalEvent_h313d94630b6580e5__2946163026d92694($self, $event) { - $approvalevent_h313d94630b6580e5_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741($event, $self) - leave - } - function $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($self, $event) { - $transferevent_h1c9ba82714a4a1f0_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741($event, $self) - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes($self, $ptr, $len) { - return($ptr, $len) - } - function $evm_hef0af3106e109414_log_h22d1a10952034bae_log3_arg0_root_stor($self, $offset, $len, $topic0, $topic1, $topic2) { - log3($offset, $len, $topic0, $topic1, $topic2) - leave - } - function $increaseallowance_h9840135eaea36633_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - ret := v2 - leave - } - function $mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb($to, $amount, $store, $log) { - let v0 := $address_h257056268eac7027_zero() - let v1 := $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($to, v0) - $assert(v1) - let v2 := sload($store) - sstore($store, add(v2, $amount)) - pop($store) - pop($store) - let v3 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v3, $amount)) - let v4 := $address_h257056268eac7027_zero() - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 96)) - mstore(v5, v4) - mstore(add(v5, 32), $to) - mstore(add(v5, 64), $amount) - $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v5) - leave - } - function $mint_ha2f94817be433a2e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - ret := v2 - leave - } - function $name_h327e3db4a53b027e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($self, $other) -> ret { - let v0 := $address_h257056268eac7027_eq_h14b330e44530c410_eq($self, $other) - ret := iszero(v0) - leave - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_32___7798a45a8b22b7ed($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_8___99627a2b067a3b64($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u8__5f40d25b4a1c5efd($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $u8_hbc9d6eeaea22ffb5_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> ret { - let v0 := $solencoder_h1b9228b90dad6928_new() - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self) -> ret { - let v0 := mload($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := mload(add($self, 32)) - let v3 := add(v2, 32) - let v4 := mload(add($self, 32)) - let v5 := lt(v3, v4) - if v5 { - revert(0, 0) - } - let v6 := gt(v3, v1) - if v6 { - revert(0, 0) - } - let v7 := mload($self) - let v8 := mload(add($self, 32)) - let v9 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v7, v8) - mstore(add($self, 32), v3) - ret := v9 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave - } - function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $spend_allowance__0_1_StorPtr_TokenStore_0__1____d3adca980e228028($owner, $spender, $amount, $store) { - pop($store) - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $owner) - mstore(add(v0, 32), $spender) - let v1 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v0) - $assert(iszero(lt(v1, $amount))) - pop($store) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, $owner) - mstore(add(v2, 32), $spender) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v2, sub(v1, $amount)) - leave - } - function $stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($slot) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($slot) - ret := v0 - leave - } - function $storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) -> ret { - let v0 := $storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) - let v1 := sload(v0) - ret := v1 - leave - } - function $storagemap_get_word_with_salt___Address__Address___c32d499da259c78e($key, $salt) -> ret { - let v0 := $storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e($key, $salt) - let v1 := sload(v0) - ret := v1 - leave - } - function $storagemap_get_word_with_salt___u256__Address___c7c570db20cdd393($key, $salt) -> ret { - let v0 := $storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393($key, $salt) - let v1 := sload(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3($self, $key) -> ret { - let v0 := $storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, 0) - let v1 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f($self, $key) -> ret { - let v0 := $storagemap_get_word_with_salt___Address__Address___c32d499da259c78e($key, 1) - let v1 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8($self, $key) -> ret { - let v0 := $storagemap_get_word_with_salt___u256__Address___c7c570db20cdd393($key, 3) - let v1 := $bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_from_word(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3($self, $key, $value) { - let v0 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($value) - $storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, 0, v0) - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f($self, $key, $value) { - let v0 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($value) - $storagemap_set_word_with_salt___Address__Address___c32d499da259c78e($key, 1, v0) - leave - } - function $storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt, $word) { - let v0 := $storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) - sstore(v0, $word) - leave - } - function $storagemap_set_word_with_salt___Address__Address___c32d499da259c78e($key, $salt, $word) { - let v0 := $storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e($key, $salt) - sstore(v0, $word) - leave - } - function $storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, 0)) - let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 - leave - } - function $storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e($key, $salt) -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, 0)) - let v1 := $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 - leave - } - function $storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393($key, $salt) -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, 0)) - let v1 := $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($raw) -> ret { - ret := $raw - leave - } - function $string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed($self, $e) { - let v0 := $self - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, v0) - leave - } - function $symbol_h6dabcb627bde53b9_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $totalsupply_h6bf4f2c3498c901c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $transfer__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb($from, $to, $amount, $store, $log) { - let v0 := $address_h257056268eac7027_zero() - let v1 := $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($from, v0) - $assert(v1) - let v2 := $address_h257056268eac7027_zero() - let v3 := $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($to, v2) - $assert(v3) - pop($store) - let v4 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from) - $assert(iszero(lt(v4, $amount))) - pop($store) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, sub(v4, $amount)) - pop($store) - pop($store) - let v5 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v5, $amount)) - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 - } - mstore(0x40, add(v6, 96)) - mstore(v6, $from) - mstore(add(v6, 32), $to) - mstore(add(v6, 64), $amount) - $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v6) - leave - } - function $transfer_h13f5ec5985ebba60_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - ret := v2 - leave - } - function $transferevent_h1c9ba82714a4a1f0_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741($self, $log) { - let v0 := $solencoder_h1b9228b90dad6928_new() - let v1 := 32 - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, v1) - pop(v2) - let v3 := mload(add($self, 64)) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v3, v0) - let v4 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v5 := mload(v4) - let v6 := v5 - let v7 := mload(add(v4, 32)) - let v8 := v7 - let v9 := mload($self) - let v10 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v9) - let v11 := mload(add($self, 32)) - let v12 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v11) - $evm_hef0af3106e109414_log_h22d1a10952034bae_log3_arg0_root_stor($log, v6, v8, 106268374300910980166318620624040158066582587003704178075307865084173350203760, v10, v12) - leave - } - function $transferfrom_h939549e4bad999e8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v1 := $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v2 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - let v3 := mload(0x40) - if iszero(v3) { - v3 := 0x80 - } - mstore(0x40, add(v3, 96)) - mstore(v3, v0) - mstore(add(v3, 32), v1) - mstore(add(v3, 64), v2) - ret := v3 - leave - } - function $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($d) - ret := v0 - leave - } - function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { - mstore($ptr, $self) - ret := 32 - leave - } - function $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word($word) -> ret { - ret := $word - leave - } - function $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - function $u8_hbc9d6eeaea22ffb5_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - $__CoolCoin_runtime() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/erc20_low_level.fe b/crates/codegen/tests/fixtures/erc20_low_level.fe deleted file mode 100644 index b16923e721..0000000000 --- a/crates/codegen/tests/fixtures/erc20_low_level.fe +++ /dev/null @@ -1,186 +0,0 @@ -use std::evm::{Address, Ctx, Evm, RawMem, RawOps, RawStorage, StorageMap, StorPtr} - -// Helpers --------------------------------------------------------------- - -const BALANCES_SALT: u256 = 0 -const ALLOWANCES_SALT: u256 = 1 - -fn abi_encode_u256(value: u256) -> ! uses (ops: mut RawOps) { - ops.mstore(0, value) - ops.return_data(0, 32) -} - -fn abi_encode_string(word: u256, len: u256) -> ! uses (ops: mut RawOps) { - // ABI encoding for a single dynamic string literal - ops.mstore(0, 32) // offset to data - ops.mstore(32, len) // string length - ops.mstore(64, word) - ops.return_data(0, 96) -} - -// ERC20 storage --------------------------------------------------------- - -struct Erc20 { - balances: StorageMap, - allowances: StorageMap<(Address, Address), u256>, - supply: u256, - owner: Address, -} - -impl Erc20 { - - fn balance_of(self, addr: Address) -> u256 { - self.balances.get(key: addr) - } - - fn allowance(self, owner: Address, spender: Address) -> u256 { - self.allowances.get(key: (owner, spender)) - } - - fn approve(mut self, owner: Address, spender: Address, value: u256) { - self.allowances.set(key: (owner, spender), value: value) - } - - fn total_supply(self) -> u256 { - self.supply - } - - fn set_owner_once(mut self, owner: Address) uses (ops: RawOps) { - if self.owner != Address::zero() { - ops.revert(0, 0) - } - self.owner = owner - } - - fn transfer(mut self, from: Address, to: Address, amount: u256) uses (ops: RawOps) { - let from_bal = self.balance_of(addr: from) - if from_bal < amount { - ops.revert(0, 0) - } - let to_bal = self.balance_of(addr: to) - self.balances.set(key: from, value: from_bal - amount) - self.balances.set(key: to, value: to_bal + amount) - } - - fn transfer_from(mut self, owner: Address, to: Address, amount: u256) uses (ctx: Ctx, ops: RawOps) { - let spender = ctx.caller() - let allowed = self.allowance(owner: owner, spender: spender) - if allowed < amount { - ops.revert(0, 0) - } - self.transfer(from: owner, to: to, amount: amount) - self.allowances.set(key: (owner, spender), value: allowed - amount) - } - - fn mint(mut self, to: Address, amount: u256) uses (ctx: Ctx, ops: RawOps) { - let caller = ctx.caller() - if caller != self.owner { - ops.revert(0, 0) - } - let bal = self.balance_of(addr: to) - self.balances.set(key: to, value: bal + amount) - self.supply = self.supply + amount - } -} - -fn do_init() uses (erc20: mut Erc20, ctx: Ctx, ops: RawOps) { - erc20.set_owner_once(owner: ctx.caller()) -} - -fn balance_of(addr: Address) -> u256 uses (erc20: Erc20) { - erc20.balances.get(key: addr) -} - -fn allowance(owner: Address, spender: Address) -> u256 uses (erc20: Erc20) { - erc20.allowances.get(key: (owner, spender)) -} - -fn transfer(to: Address, amount: u256) -> u256 uses (erc20: mut Erc20, ctx: Ctx, ops: RawOps) { - erc20.transfer(from: ctx.caller(), to: to, amount: amount) - 1 -} - -fn approve(spender: Address, amount: u256) -> u256 uses (erc20: mut Erc20, ctx: Ctx) { - erc20.approve(owner: ctx.caller(), spender: spender, value: amount) - 1 -} - -fn transfer_from(from: Address, to: Address, amount: u256) -> u256 uses (erc20: mut Erc20, ctx: Ctx, ops: RawOps) { - erc20.transfer_from(owner: from, to: to, amount: amount) - 1 -} - -fn mint(to: Address, amount: u256) -> u256 uses (erc20: mut Erc20, ctx: Ctx, ops: RawOps) { - erc20.mint(to: to, amount: amount) - 1 -} - -// Entry points ---------------------------------------------------------- - -#[contract_init(Erc20Contract)] -fn init() uses (evm: mut Evm) { - let mut erc20: StorPtr> = evm.stor_ptr(0) - with (erc20, Ctx = evm, RawOps = evm) { - do_init() - } - let len = evm.code_region_len(runtime) - let offset = evm.code_region_offset(runtime) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(Erc20Contract)] -fn runtime() uses (evm: mut Evm) { - let mut erc20: StorPtr> = evm.stor_ptr(0) - let selector = evm.calldataload(0) >> 224 - with (erc20, Ctx = evm, RawOps = evm) { - match selector { - 0x70a08231 => { // balanceOf(address) - let owner = Address { inner: evm.calldataload(4) } - abi_encode_u256(value: balance_of(addr: owner)) - } - 0xdd62ed3e => { // allowance(address,address) - let owner = Address { inner: evm.calldataload(4) } - let spender = Address { inner: evm.calldataload(36) } - abi_encode_u256(value: allowance(owner: owner, spender: spender)) - } - 0x06fdde03 => { // name() - abi_encode_string( - word: 0x4665546f6b656e00000000000000000000000000000000000000000000000000, - len: 7, - ) - } - 0x95d89b41 => { // symbol() - abi_encode_string( - word: 0x4645540000000000000000000000000000000000000000000000000000000000, - len: 3, - ) - } - 0x313ce567 => { // decimals() - abi_encode_u256(value: 18) - } - 0xa9059cbb => { // transfer(address,uint256) - let to = Address { inner: evm.calldataload(4) } - let amount = evm.calldataload(36) - abi_encode_u256(value: transfer(to: to, amount: amount)) - } - 0x095ea7b3 => { // approve(address,uint256) - let spender = Address { inner: evm.calldataload(4) } - let amount = evm.calldataload(36) - abi_encode_u256(value: approve(spender: spender, amount: amount)) - } - 0x23b872dd => { // transferFrom(address,address,uint256) - let from = Address { inner: evm.calldataload(4) } - let to = Address { inner: evm.calldataload(36) } - let amount = evm.calldataload(68) - abi_encode_u256(value: transfer_from(from: from, to: to, amount: amount)) - } - 0x40c10f19 => { // mint(address,uint256) - let to = Address { inner: evm.calldataload(4) } - let amount = evm.calldataload(36) - abi_encode_u256(value: mint(to: to, amount: amount)) - } - _ => evm.revert(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/erc20_low_level.snap b/crates/codegen/tests/fixtures/erc20_low_level.snap deleted file mode 100644 index 90e9dc4fee..0000000000 --- a/crates/codegen/tests/fixtures/erc20_low_level.snap +++ /dev/null @@ -1,370 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/erc20_low_level.fe ---- -object "Erc20Contract" { - code { - function $address_h257056268eac7027_eq_h14b330e44530c410_eq_stor_arg0_root_stor($self, $other) -> ret { - ret := eq($self, $other) - leave - } - function $address_h257056268eac7027_zero() -> ret { - ret := 0 - leave - } - function $do_init__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb($erc20, $ctx, $ops) { - let v0 := caller() - $erc20_______h94f6fe6e679122ca_set_owner_once_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($erc20, v0, $ops) - leave - } - function $erc20_______h94f6fe6e679122ca_set_owner_once_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($self, $owner, $ops) { - let v0 := sload(add($self, 1)) - let v1 := $address_h257056268eac7027_zero() - let v2 := $ne_stor_arg0_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0, v1) - let v3 := v2 - if v3 { - revert(0, 0) - } - sstore(add($self, 1), $owner) - leave - } - function $init__StorPtr_Evm___207f35a85ac4062e() { - let v0 := $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd(0, 0) - let v1 := v0 - $do_init__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v1, 0, 0) - let v2 := datasize("Erc20Contract_deployed") - let v3 := dataoffset("Erc20Contract_deployed") - codecopy(0, v3, v2) - return(0, v2) - } - function $ne_stor_arg0_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($self, $other) -> ret { - let v0 := $address_h257056268eac7027_eq_h14b330e44530c410_eq_stor_arg0_root_stor($self, $other) - ret := iszero(v0) - leave - } - function $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703($raw) -> ret { - ret := $raw - leave - } - $init__StorPtr_Evm___207f35a85ac4062e() - } - - object "Erc20Contract_deployed" { - code { - function $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($ptr, $self) -> ret { - let v0 := mload($self) - let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, v0) - let v2 := mload(add($self, 32)) - let v3 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(add($ptr, v1), v2) - ret := add(v1, v3) - leave - } - function $abi_encode_string__Evm_hef0af3106e109414__3af54274b2985741($word, $len, $ops) { - mstore(0, 32) - mstore(32, $len) - mstore(64, $word) - return(0, 96) - } - function $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741($value, $ops) { - mstore(0, $value) - return(0, 32) - } - function $address_h257056268eac7027_eq_h14b330e44530c410_eq_arg1_root_stor($self, $other) -> ret { - ret := eq($self, $other) - leave - } - function $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { - let v0 := $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) - ret := v0 - leave - } - function $allowance__0_1_StorPtr_Erc20_0__1____896784bc09903ba1($owner, $spender, $erc20) -> ret { - pop($erc20) - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $owner) - mstore(add(v0, 32), $spender) - let v1 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v0) - ret := v1 - leave - } - function $approve__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414__68ea22e02fe2444b($spender, $amount, $erc20, $ctx) -> ret { - let v0 := caller() - $erc20_______h94f6fe6e679122ca_approve_stor_arg0_root_stor__0_1__e4c8be10cab939c2($erc20, v0, $spender, $amount) - ret := 1 - leave - } - function $balance_of__0_1_StorPtr_Erc20_0__1____896784bc09903ba1($addr, $erc20) -> ret { - pop($erc20) - let v0 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $addr) - ret := v0 - leave - } - function $erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $owner, $spender) -> ret { - pop($self) - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $owner) - mstore(add(v0, 32), $spender) - let v1 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v0) - ret := v1 - leave - } - function $erc20_______h94f6fe6e679122ca_approve_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $owner, $spender, $value) { - pop($self) - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $owner) - mstore(add(v0, 32), $spender) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v0, $value) - leave - } - function $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $addr) -> ret { - pop($self) - let v0 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $addr) - ret := v0 - leave - } - function $erc20_______h94f6fe6e679122ca_mint_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee($self, $to, $amount, $ctx, $ops) { - let v0 := caller() - let v1 := sload(add($self, 1)) - let v2 := $ne_arg1_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0, v1) - let v3 := v2 - if v3 { - revert(0, 0) - } - let v4 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $to) - pop($self) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v4, $amount)) - let v5 := sload($self) - sstore($self, add(v5, $amount)) - leave - } - function $erc20_______h94f6fe6e679122ca_transfer_from_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee($self, $owner, $to, $amount, $ctx, $ops) { - let v0 := caller() - let v1 := $erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $owner, v0) - let v2 := lt(v1, $amount) - if v2 { - revert(0, 0) - } - $erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($self, $owner, $to, $amount, $ops) - pop($self) - let v3 := mload(0x40) - if iszero(v3) { - v3 := 0x80 - } - mstore(0x40, add(v3, 64)) - mstore(v3, $owner) - mstore(add(v3, 32), v0) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v3, sub(v1, $amount)) - leave - } - function $erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($self, $from, $to, $amount, $ops) { - let v0 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $from) - let v1 := lt(v0, $amount) - if v1 { - revert(0, 0) - } - let v2 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $to) - pop($self) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, sub(v0, $amount)) - pop($self) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v2, $amount)) - leave - } - function $mint__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb($to, $amount, $erc20, $ctx, $ops) -> ret { - $erc20_______h94f6fe6e679122ca_mint_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee($erc20, $to, $amount, $ctx, $ops) - ret := 1 - leave - } - function $ne_arg1_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($self, $other) -> ret { - let v0 := $address_h257056268eac7027_eq_h14b330e44530c410_eq_arg1_root_stor($self, $other) - ret := iszero(v0) - leave - } - function $runtime__StorPtr_Evm___207f35a85ac4062e() { - let v0 := $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd(0, 0) - let v1 := calldataload(0) - let v2 := shr(224, v1) - let v3 := v0 - switch v2 - case 1889567281 { - let v4 := calldataload(4) - let v5 := v4 - let v6 := $balance_of__0_1_StorPtr_Erc20_0__1____896784bc09903ba1(v5, v3) - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v6, 0) - } - case 3714247998 { - let v7 := calldataload(4) - let v8 := v7 - let v9 := calldataload(36) - let v10 := v9 - let v11 := $allowance__0_1_StorPtr_Erc20_0__1____896784bc09903ba1(v8, v10, v3) - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v11, 0) - } - case 117300739 { - $abi_encode_string__Evm_hef0af3106e109414__3af54274b2985741(31840933704928615426292613906591192052886564858731089189578963311002547912704, 7, 0) - } - case 2514000705 { - $abi_encode_string__Evm_hef0af3106e109414__3af54274b2985741(31784391594991486112232083260356792451358613714049171750120207607087736291328, 3, 0) - } - case 826074471 { - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(18, 0) - } - case 2835717307 { - let v12 := calldataload(4) - let v13 := v12 - let v14 := calldataload(36) - let v15 := $transfer__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v13, v14, v3, 0, 0) - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v15, 0) - } - case 157198259 { - let v16 := calldataload(4) - let v17 := v16 - let v18 := calldataload(36) - let v19 := $approve__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414__68ea22e02fe2444b(v17, v18, v3, 0) - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v19, 0) - } - case 599290589 { - let v20 := calldataload(4) - let v21 := v20 - let v22 := calldataload(36) - let v23 := v22 - let v24 := calldataload(68) - let v25 := $transfer_from__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v21, v23, v24, v3, 0, 0) - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v25, 0) - } - case 1086394137 { - let v26 := calldataload(4) - let v27 := v26 - let v28 := calldataload(36) - let v29 := $mint__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v27, v28, v3, 0, 0) - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v29, 0) - } - default { - revert(0, 0) - } - } - function $stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703($slot) - ret := v0 - leave - } - function $storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) -> ret { - let v0 := $storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) - let v1 := sload(v0) - ret := v1 - leave - } - function $storagemap_get_word_with_salt___Address__Address___c32d499da259c78e($key, $salt) -> ret { - let v0 := $storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e($key, $salt) - let v1 := sload(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3($self, $key) -> ret { - let v0 := $storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, 0) - let v1 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f($self, $key) -> ret { - let v0 := $storagemap_get_word_with_salt___Address__Address___c32d499da259c78e($key, 1) - let v1 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3($self, $key, $value) { - let v0 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($value) - $storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, 0, v0) - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f($self, $key, $value) { - let v0 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($value) - $storagemap_set_word_with_salt___Address__Address___c32d499da259c78e($key, 1, v0) - leave - } - function $storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt, $word) { - let v0 := $storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) - sstore(v0, $word) - leave - } - function $storagemap_set_word_with_salt___Address__Address___c32d499da259c78e($key, $salt, $word) { - let v0 := $storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e($key, $salt) - sstore(v0, $word) - leave - } - function $storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29($key, $salt) -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, 0)) - let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 - leave - } - function $storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e($key, $salt) -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, 0)) - let v1 := $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703($raw) -> ret { - ret := $raw - leave - } - function $transfer__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb($to, $amount, $erc20, $ctx, $ops) -> ret { - let v0 := caller() - $erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($erc20, v0, $to, $amount, $ops) - ret := 1 - leave - } - function $transfer_from__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb($from, $to, $amount, $erc20, $ctx, $ops) -> ret { - $erc20_______h94f6fe6e679122ca_transfer_from_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee($erc20, $from, $to, $amount, $ctx, $ops) - ret := 1 - leave - } - function $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { - mstore($ptr, $self) - ret := 32 - leave - } - function $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word($word) -> ret { - ret := $word - leave - } - function $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($self) -> ret { - ret := $self - leave - } - $runtime__StorPtr_Evm___207f35a85ac4062e() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/event_logging.fe b/crates/codegen/tests/fixtures/event_logging.fe deleted file mode 100644 index 118797d2b1..0000000000 --- a/crates/codegen/tests/fixtures/event_logging.fe +++ /dev/null @@ -1,15 +0,0 @@ -use std::evm::{Address, Evm, Event} - -#[event] -struct Transfer { - #[indexed] - from: Address, - #[indexed] - to: Address, - amount: u256, -} - -fn emit_transfer(evm: mut Evm, from: Address, to: Address, amount: u256) { - let e = Transfer { from, to, amount } - e.emit(evm) -} diff --git a/crates/codegen/tests/fixtures/event_logging.snap b/crates/codegen/tests/fixtures/event_logging.snap deleted file mode 100644 index f948a3bc62..0000000000 --- a/crates/codegen/tests/fixtures/event_logging.snap +++ /dev/null @@ -1,98 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/event_logging.fe ---- -function $emit_transfer($evm, $from, $to, $amount) { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, $from) - mstore(add(v0, 32), $to) - mstore(add(v0, 64), $amount) - let v1 := v0 - $transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741(v1, $evm) - leave -} -function $transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741($self, $log) { - let v0 := $solencoder_h1b9228b90dad6928_new() - let v1 := 32 - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, v1) - pop(v2) - let v3 := mload(add($self, 64)) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v3, v0) - let v4 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v5 := mload(v4) - let v6 := v5 - let v7 := mload(add(v4, 32)) - let v8 := v7 - let v9 := mload($self) - let v10 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v9) - let v11 := mload(add($self, 32)) - let v12 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v11) - $evm_hef0af3106e109414_log_h22d1a10952034bae_log3($log, v6, v8, 100389287136786176327247604509743168900146139575972864366142685224231313322991, v10, v12) - leave -} -function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave -} -function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave -} -function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave -} -function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave -} -function $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic($self) -> ret { - ret := $self - leave -} -function $evm_hef0af3106e109414_log_h22d1a10952034bae_log3($self, $offset, $len, $topic0, $topic1, $topic2) { - log3($offset, $len, $topic0, $topic1, $topic2) - leave -} -function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave -} diff --git a/crates/codegen/tests/fixtures/event_logging_via_log.fe b/crates/codegen/tests/fixtures/event_logging_via_log.fe deleted file mode 100644 index d92c4e39de..0000000000 --- a/crates/codegen/tests/fixtures/event_logging_via_log.fe +++ /dev/null @@ -1,14 +0,0 @@ -use std::evm::{Address, Evm, Log} - -#[event] -struct Transfer { - #[indexed] - from: Address, - #[indexed] - to: Address, - amount: u256, -} - -fn emit_transfer(evm: mut Evm, from: Address, to: Address, amount: u256) { - evm.emit(Transfer { from, to, amount }) -} diff --git a/crates/codegen/tests/fixtures/event_logging_via_log.snap b/crates/codegen/tests/fixtures/event_logging_via_log.snap deleted file mode 100644 index ad475867a7..0000000000 --- a/crates/codegen/tests/fixtures/event_logging_via_log.snap +++ /dev/null @@ -1,101 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/event_logging_via_log.fe ---- -function $emit_transfer($evm, $from, $to, $amount) { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, $from) - mstore(add(v0, 32), $to) - mstore(add(v0, 64), $amount) - $emit__Evm_hef0af3106e109414_Transfer_h628c212e2bb5f76f__243b05efdcd63652($evm, v0) - leave -} -function $emit__Evm_hef0af3106e109414_Transfer_h628c212e2bb5f76f__243b05efdcd63652($self, $event) { - $transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741($event, $self) - leave -} -function $transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741($self, $log) { - let v0 := $solencoder_h1b9228b90dad6928_new() - let v1 := 32 - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, v1) - pop(v2) - let v3 := mload(add($self, 64)) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v3, v0) - let v4 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v5 := mload(v4) - let v6 := v5 - let v7 := mload(add(v4, 32)) - let v8 := v7 - let v9 := mload($self) - let v10 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v9) - let v11 := mload(add($self, 32)) - let v12 := $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v11) - $evm_hef0af3106e109414_log_h22d1a10952034bae_log3($log, v6, v8, 100389287136786176327247604509743168900146139575972864366142685224231313322991, v10, v12) - leave -} -function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave -} -function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave -} -function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave -} -function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave -} -function $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic($self) -> ret { - ret := $self - leave -} -function $evm_hef0af3106e109414_log_h22d1a10952034bae_log3($self, $offset, $len, $topic0, $topic1, $topic2) { - log3($offset, $len, $topic0, $topic1, $topic2) - leave -} -function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave -} diff --git a/crates/codegen/tests/fixtures/for_array.fe b/crates/codegen/tests/fixtures/for_array.fe deleted file mode 100644 index 15903f5b7c..0000000000 --- a/crates/codegen/tests/fixtures/for_array.fe +++ /dev/null @@ -1,13 +0,0 @@ -// For loop over a large array (uses while-style loop, not unrolled) -pub fn for_array_sum() -> u64 { - let arr: [u64; 25] = [ - 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 - ] - let mut sum: u64 = 0 - for elem in arr { - sum = sum + elem - } - sum -} diff --git a/crates/codegen/tests/fixtures/for_array.snap b/crates/codegen/tests/fixtures/for_array.snap deleted file mode 100644 index 214715c9b3..0000000000 --- a/crates/codegen/tests/fixtures/for_array.snap +++ /dev/null @@ -1,38 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/for_array.fe ---- -object "main" { - code { - function $for_array_sum() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 800)) - datacopy(v0, dataoffset("data_for_array_sum_0"), datasize("data_for_array_sum_0")) - let v1 := v0 - let v2 := 0 - let v3 := 0 - let v4 := $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_25__540b817a073b29f5(v1) - for { } lt(v3, v4) { v3 := add(v3, 1) } { - let v5 := $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_25__540b817a073b29f5(v1, v3) - let v6 := v5 - v2 := add(v2, v6) - } - ret := v2 - leave - } - function $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_25__540b817a073b29f5($self) -> ret { - ret := 25 - leave - } - function $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_25__540b817a073b29f5($self, $i) -> ret { - let v0 := and(mload(add($self, mul($i, 32))), 0xffffffffffffffff) - ret := v0 - leave - } - } - data "data_for_array_sum_0" hex"000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019" -} diff --git a/crates/codegen/tests/fixtures/for_array_large.fe b/crates/codegen/tests/fixtures/for_array_large.fe deleted file mode 100644 index 6c091990a0..0000000000 --- a/crates/codegen/tests/fixtures/for_array_large.fe +++ /dev/null @@ -1,9 +0,0 @@ -// For loop over a large array (>= 10 elements) should NOT auto-unroll -pub fn for_array_large_sum() -> u64 { - let arr: [u64; 10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - let mut sum: u64 = 0 - for elem in arr { - sum = sum + elem - } - sum -} diff --git a/crates/codegen/tests/fixtures/for_array_large.snap b/crates/codegen/tests/fixtures/for_array_large.snap deleted file mode 100644 index 44f159165d..0000000000 --- a/crates/codegen/tests/fixtures/for_array_large.snap +++ /dev/null @@ -1,38 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/for_array_large.fe ---- -object "main" { - code { - function $for_array_large_sum() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 320)) - datacopy(v0, dataoffset("data_for_array_large_sum_0"), datasize("data_for_array_large_sum_0")) - let v1 := v0 - let v2 := 0 - let v3 := 0 - let v4 := $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_10__2b47acd750beacf4(v1) - for { } lt(v3, v4) { v3 := add(v3, 1) } { - let v5 := $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_10__2b47acd750beacf4(v1, v3) - let v6 := v5 - v2 := add(v2, v6) - } - ret := v2 - leave - } - function $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_10__2b47acd750beacf4($self) -> ret { - ret := 10 - leave - } - function $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_10__2b47acd750beacf4($self, $i) -> ret { - let v0 := and(mload(add($self, mul($i, 32))), 0xffffffffffffffff) - ret := v0 - leave - } - } - data "data_for_array_large_sum_0" hex"000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a" -} diff --git a/crates/codegen/tests/fixtures/for_range.fe b/crates/codegen/tests/fixtures/for_range.fe deleted file mode 100644 index 0000e28b05..0000000000 --- a/crates/codegen/tests/fixtures/for_range.fe +++ /dev/null @@ -1,10 +0,0 @@ -// For loop over a range -pub fn for_range_sum() -> usize { - let mut sum: usize = 0 - let start: usize = 0 - let end: usize = 10 - for i in start..end { - sum = sum + i - } - sum -} diff --git a/crates/codegen/tests/fixtures/for_range.snap b/crates/codegen/tests/fixtures/for_range.snap deleted file mode 100644 index 3d051357c9..0000000000 --- a/crates/codegen/tests/fixtures/for_range.snap +++ /dev/null @@ -1,48 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/for_range.fe ---- -function $for_range_sum() -> ret { - let v0 := 0 - let v1 := 0 - let v2 := 10 - let v3 := mload(0x40) - if iszero(v3) { - v3 := 0x80 - } - mstore(0x40, add(v3, 64)) - mstore(v3, v1) - mstore(add(v3, 32), v2) - let v4 := 0 - let v5 := $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len(v3) - for { } lt(v4, v5) { v4 := add(v4, 1) } { - let v6 := $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get(v3, v4) - let v7 := v6 - v0 := add(v0, v7) - } - ret := v0 - leave -} -function $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len($self) -> ret { - let v0 := 0 - let v1 := mload(add($self, 32)) - let v2 := mload($self) - let v3 := lt(v1, v2) - if v3 { - v0 := 0 - } - if iszero(v3) { - let v4 := mload(add($self, 32)) - let v5 := mload($self) - v0 := sub(v4, v5) - } - ret := v0 - leave -} -function $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get($self, $i) -> ret { - let v0 := mload($self) - ret := add(v0, $i) - leave -} diff --git a/crates/codegen/tests/fixtures/full_contract.fe b/crates/codegen/tests/fixtures/full_contract.fe deleted file mode 100644 index 5980c92e0d..0000000000 --- a/crates/codegen/tests/fixtures/full_contract.fe +++ /dev/null @@ -1,54 +0,0 @@ -use std::evm::{Evm, RawMem, RawOps} - -struct Point { x: u256, y: u256 } -struct Square { side: u256 } - -impl Point { - fn area(self) -> u256 { - self.x * self.y - } -} - -impl Square { - fn area(self) -> u256 { - let side = self.side - side * side - } -} - -fn abi_encode(value: u256) -> ! uses (ops: mut RawOps) { - let ptr: u256 = 0 - ops.mstore(ptr, value) - ops.return_data(ptr, 32) -} - -#[contract_init(ShapeDispatcher)] -fn init() uses (evm: mut Evm) { - let len = evm.code_region_len(dispatch) - let offset = evm.code_region_offset(dispatch) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(ShapeDispatcher)] -fn dispatch() uses (evm: mut Evm) { - let selector = evm.calldataload(0) >> 224 - if selector == 0x090251bf { - let x = evm.calldataload(4) - let y = evm.calldataload(36) - let mut p = Point { x: x, y: y } - p.x = p.x + 1 - p.y = p.y + 2 - let value = p.area() - with (RawOps = evm) { abi_encode(value) } - } - if selector == 0x7b292909 { - let side = evm.calldataload(4) - let mut s = Square { side: side } - s.side = s.side + 3 - let value = s.area() - with (RawOps = evm) { abi_encode(value) } - } - - evm.return_data(0, 0) -} diff --git a/crates/codegen/tests/fixtures/full_contract.snap b/crates/codegen/tests/fixtures/full_contract.snap deleted file mode 100644 index decbda7fa7..0000000000 --- a/crates/codegen/tests/fixtures/full_contract.snap +++ /dev/null @@ -1,72 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/full_contract.fe ---- -object "ShapeDispatcher" { - code { - function $init__StorPtr_Evm___207f35a85ac4062e() { - let v0 := datasize("ShapeDispatcher_deployed") - let v1 := dataoffset("ShapeDispatcher_deployed") - codecopy(0, v1, v0) - return(0, v0) - } - $init__StorPtr_Evm___207f35a85ac4062e() - } - - object "ShapeDispatcher_deployed" { - code { - function $abi_encode__Evm_hef0af3106e109414__3af54274b2985741($value, $ops) { - let v0 := 0 - mstore(v0, $value) - return(v0, 32) - } - function $dispatch__StorPtr_Evm___207f35a85ac4062e() { - let v0 := calldataload(0) - let v1 := shr(224, v0) - let v2 := eq(v1, 151146943) - if v2 { - let v3 := calldataload(4) - let v4 := calldataload(36) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 64)) - mstore(v5, v3) - mstore(add(v5, 32), v4) - let v6 := v5 - let v7 := mload(v6) - mstore(v6, add(v7, 1)) - let v8 := mload(add(v6, 32)) - mstore(add(v6, 32), add(v8, 2)) - let v9 := $point_hac92469562809d28_area(v6) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v9, 0) - } - let v10 := eq(v1, 2066295049) - if v10 { - let v11 := calldataload(4) - let v12 := v11 - v12 := add(v12, 3) - let v13 := $square_h97afaa872b6ea17e_area(v12) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v13, 0) - } - return(0, 0) - } - function $point_hac92469562809d28_area($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 32)) - ret := mul(v0, v1) - leave - } - function $square_h97afaa872b6ea17e_area($self) -> ret { - let v0 := $self - ret := mul(v0, v0) - leave - } - $dispatch__StorPtr_Evm___207f35a85ac4062e() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/function_call.fe b/crates/codegen/tests/fixtures/function_call.fe deleted file mode 100644 index fb16d9efcc..0000000000 --- a/crates/codegen/tests/fixtures/function_call.fe +++ /dev/null @@ -1,7 +0,0 @@ -pub fn add_one(x: u64) -> u64 { - x + 1 -} - -pub fn call_add_one() -> u64 { - add_one(5) -} diff --git a/crates/codegen/tests/fixtures/function_call.snap b/crates/codegen/tests/fixtures/function_call.snap deleted file mode 100644 index 0ceb3f4f3d..0000000000 --- a/crates/codegen/tests/fixtures/function_call.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/function_call.fe ---- -function $add_one($x) -> ret { - ret := add($x, 1) - leave -} -function $call_add_one() -> ret { - let v0 := $add_one(5) - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/generic_identity.fe b/crates/codegen/tests/fixtures/generic_identity.fe deleted file mode 100644 index b2b9e40c4f..0000000000 --- a/crates/codegen/tests/fixtures/generic_identity.fe +++ /dev/null @@ -1,13 +0,0 @@ -fn identity(value: own T) -> T { - value -} - -fn call_identity_u32() -> u32 { - let val = identity(7); - val -} - -fn call_identity_bool() -> bool { - let val = identity(true); - val -} diff --git a/crates/codegen/tests/fixtures/generic_identity.snap b/crates/codegen/tests/fixtures/generic_identity.snap deleted file mode 100644 index a48af960c2..0000000000 --- a/crates/codegen/tests/fixtures/generic_identity.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/generic_identity.fe ---- -function $call_identity_u32() -> ret { - let v0 := $identity__u32__20aa0c10687491ad(7) - ret := v0 - leave -} -function $call_identity_bool() -> ret { - let v0 := $identity__bool__947c0c03c59c6f07(1) - ret := v0 - leave -} -function $identity__u32__20aa0c10687491ad($value) -> ret { - ret := $value - leave -} -function $identity__bool__947c0c03c59c6f07($value) -> ret { - ret := $value - leave -} diff --git a/crates/codegen/tests/fixtures/high_level_contract.fe b/crates/codegen/tests/fixtures/high_level_contract.fe deleted file mode 100644 index 216f20ef08..0000000000 --- a/crates/codegen/tests/fixtures/high_level_contract.fe +++ /dev/null @@ -1,36 +0,0 @@ -msg EchoMsg { - #[selector = 1] - Answer -> u256, - #[selector = 2] - Echo { x: u256 } -> u256, - #[selector = 3] - GetX -> u256 -} - -pub struct Foo { - x: u256, - y: u256, -} - -pub contract EchoContract { - state: Foo - - init(x: u256, y: u256) uses (mut state) { - state.x = x - state.y = y - } - - recv EchoMsg { - Answer -> u256 { - 42 - } - - Echo { x } -> u256 { - x - } - - GetX -> u256 uses (state) { - state.x - } - } -} diff --git a/crates/codegen/tests/fixtures/high_level_contract.snap b/crates/codegen/tests/fixtures/high_level_contract.snap deleted file mode 100644 index 0a14758bcd..0000000000 --- a/crates/codegen/tests/fixtures/high_level_contract.snap +++ /dev/null @@ -1,401 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/high_level_contract.fe ---- -object "EchoContract" { - code { - function $__EchoContract_init() { - let v0 := $init_field__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(0, 0) - let v1 := dataoffset("EchoContract_deployed") - let v2 := datasize("EchoContract_deployed") - let v3 := datasize("EchoContract") - let v4 := codesize() - let v5 := lt(v4, v3) - if v5 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - let v6 := sub(v4, v3) - let v7 := mload(64) - if iszero(v7) { - v7 := 0x80 - } - mstore(64, add(v7, v6)) - codecopy(v7, v3, v6) - let v8 := mload(0x40) - if iszero(v8) { - v8 := 0x80 - } - mstore(0x40, add(v8, 64)) - mstore(v8, v7) - mstore(add(v8, 32), v6) - let v9 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v8) - let v10 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v9) - let v11 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v9) - $__EchoContract_init_contract(v10, v11, v0) - codecopy(0, v1, v2) - return(0, v2) - } - function $__EchoContract_init_contract($x, $y, $state) { - sstore($state, $x) - sstore(add($state, 1), $y) - leave - } - function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - let v1 := $input - mstore(v0, mload(v1)) - mstore(add(v0, 32), mload(add(v1, 32))) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(0, $slot) - ret := v0 - leave - } - function $init_field__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($self, $slot) - ret := v0 - leave - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := mload(add($self, 32)) - ret := v0 - leave - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := mload($self) - let v1 := add(v0, $byte_offset) - let v2 := mload(v1) - ret := v2 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { - let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) - let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { - revert(0, 0) - } - let v5 := gt(v2, v0) - if v5 { - revert(0, 0) - } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 128)) - let v2 := v0 - mstore(v1, mload(v2)) - mstore(add(v1, 32), mload(add(v2, 32))) - mstore(add(v1, 64), mload(add(v2, 64))) - mstore(add(v1, 96), 0) - ret := v1 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($raw) -> ret { - ret := $raw - leave - } - function $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($d) - ret := v0 - leave - } - $__EchoContract_init() - } - - object "EchoContract_deployed" { - code { - function $__EchoContract_recv_0_0($args) -> ret { - ret := 42 - leave - } - function $__EchoContract_recv_0_1($args) -> ret { - let v0 := $args - ret := v0 - leave - } - function $__EchoContract_recv_0_2($args, $state) -> ret { - let v0 := sload($state) - ret := v0 - leave - } - function $__EchoContract_runtime() { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26(0, 0) - let v1 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v2 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v1 - case 1 { - $answer_he729876072a4af6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v2) - let v3 := $__EchoContract_recv_0_0(0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(0, v3) - } - case 2 { - let v4 := $echo_h9f932a87feb06bd2_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v2) - let v5 := $__EchoContract_recv_0_1(v4) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(0, v5) - } - case 3 { - $getx_hdbb0a53a8b757989_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v2) - let v6 := $__EchoContract_recv_0_2(0, v0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(0, v6) - } - default { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - } - function $answer_he729876072a4af6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $echo_h9f932a87feb06bd2_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { - let v0 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes($self, $ptr, $len) { - return($ptr, $len) - } - function $getx_hdbb0a53a8b757989_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> ret { - let v0 := $solencoder_h1b9228b90dad6928_new() - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self) -> ret { - let v0 := mload($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := mload(add($self, 32)) - let v3 := add(v2, 32) - let v4 := mload(add($self, 32)) - let v5 := lt(v3, v4) - if v5 { - revert(0, 0) - } - let v6 := gt(v3, v1) - if v6 { - revert(0, 0) - } - let v7 := mload($self) - let v8 := mload(add($self, 32)) - let v9 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v7, v8) - mstore(add($self, 32), v3) - ret := v9 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave - } - function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26($raw) -> ret { - ret := $raw - leave - } - function $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($d) - ret := v0 - leave - } - function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - $__EchoContract_runtime() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/if_else.fe b/crates/codegen/tests/fixtures/if_else.fe deleted file mode 100644 index 9336073a3d..0000000000 --- a/crates/codegen/tests/fixtures/if_else.fe +++ /dev/null @@ -1,11 +0,0 @@ -pub fn if_else(cond: bool) -> u64 { - if cond { - helper(1) - } else { - helper(2) - } -} - -fn helper(_ x: u64) -> u64 { - x + 1 -} diff --git a/crates/codegen/tests/fixtures/if_else.snap b/crates/codegen/tests/fixtures/if_else.snap deleted file mode 100644 index 0d5525e4cc..0000000000 --- a/crates/codegen/tests/fixtures/if_else.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/if_else.fe ---- -function $if_else($cond) -> ret { - let v0 := 0 - let v1 := $cond - if v1 { - let v2 := $helper(1) - v0 := v2 - } - if iszero(v1) { - let v3 := $helper(2) - v0 := v3 - } - ret := v0 - leave -} -function $helper($x) -> ret { - ret := add($x, 1) - leave -} diff --git a/crates/codegen/tests/fixtures/init_args_with_child_dep.fe b/crates/codegen/tests/fixtures/init_args_with_child_dep.fe deleted file mode 100644 index 46eeab3044..0000000000 --- a/crates/codegen/tests/fixtures/init_args_with_child_dep.fe +++ /dev/null @@ -1,11 +0,0 @@ -use std::evm::Create - -pub contract Child { - init(x: u256, y: u256) {} -} - -pub contract Parent uses (create: mut Create) { - init(seed: u256) uses (mut create) { - create.create(value: 0, args: (seed, seed)) - } -} diff --git a/crates/codegen/tests/fixtures/init_args_with_child_dep.snap b/crates/codegen/tests/fixtures/init_args_with_child_dep.snap deleted file mode 100644 index 5941175cfb..0000000000 --- a/crates/codegen/tests/fixtures/init_args_with_child_dep.snap +++ /dev/null @@ -1,527 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/init_args_with_child_dep.fe ---- -object "Parent" { - code { - function $__Child_init_code_len() -> ret { - let v0 := datasize("Child") - ret := v0 - leave - } - function $__Child_init_code_offset() -> ret { - let v0 := dataoffset("Child") - ret := v0 - leave - } - function $__Parent_init() { - let v0 := dataoffset("Parent_deployed") - let v1 := datasize("Parent_deployed") - let v2 := datasize("Parent") - let v3 := codesize() - let v4 := lt(v3, v2) - if v4 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - let v5 := sub(v3, v2) - let v6 := mload(64) - if iszero(v6) { - v6 := 0x80 - } - mstore(64, add(v6, v5)) - codecopy(v6, v2, v5) - let v7 := mload(0x40) - if iszero(v7) { - v7 := 0x80 - } - mstore(0x40, add(v7, 64)) - mstore(v7, v6) - mstore(add(v7, 32), v5) - let v8 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v7) - let v9 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v8) - $__Parent_init_contract(v9, 0) - codecopy(0, v0, v1) - return(0, v1) - } - function $__Parent_init_contract($seed, $create) { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $seed) - mstore(add(v0, 32), $seed) - let v1 := $create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed($create, 0, v0) - leave - } - function $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($self, $e) { - let v0 := mload($self) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0, $e) - let v1 := mload(add($self, 32)) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v1, $e) - leave - } - function $create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed($self, $value, $args) -> ret { - let v0 := $__Child_init_code_len() - let v1 := $__Child_init_code_offset() - let v2 := 64 - let v3 := add(v0, v2) - let v4 := mload(64) - if iszero(v4) { - v4 := 0x80 - } - mstore(64, add(v4, v3)) - codecopy(v4, v1, v0) - let v5 := add(v4, v0) - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 - } - mstore(0x40, add(v6, 96)) - mstore(v6, v5) - mstore(add(v6, 32), v5) - mstore(add(v6, 64), add(v5, v2)) - let v7 := v6 - $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($args, v7) - let v8 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor($self, $value, v4, v3) - let v9 := eq(v8, 0) - if v9 { - let v10 := returndatasize() - let v11 := mload(64) - if iszero(v11) { - v11 := 0x80 - } - mstore(64, add(v11, v10)) - returndatacopy(v11, 0, v10) - revert(v11, v10) - } - ret := v8 - leave - } - function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - let v1 := $input - mstore(v0, mload(v1)) - mstore(add(v0, 32), mload(add(v1, 32))) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor($self, $value, $offset, $len) -> ret { - let v0 := create($value, $offset, $len) - ret := v0 - leave - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := mload(add($self, 32)) - ret := v0 - leave - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := mload($self) - let v1 := add(v0, $byte_offset) - let v2 := mload(v1) - ret := v2 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { - let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) - let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { - revert(0, 0) - } - let v5 := gt(v2, v0) - if v5 { - revert(0, 0) - } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 128)) - let v2 := v0 - mstore(v1, mload(v2)) - mstore(add(v1, 32), mload(add(v2, 32))) - mstore(add(v1, 64), mload(add(v2, 64))) - mstore(add(v1, 96), 0) - ret := v1 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave - } - function $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($d) - ret := v0 - leave - } - function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - $__Parent_init() - } - - object "Parent_deployed" { - code { - function $__Parent_runtime() { - let v0 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v1 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v0 - default { - } - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - $__Parent_runtime() - return(0, 0) - } - } - object "Child" { - code { - function $__Child_init() { - let v0 := dataoffset("Child_deployed") - let v1 := datasize("Child_deployed") - let v2 := datasize("Child") - let v3 := codesize() - let v4 := lt(v3, v2) - if v4 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - let v5 := sub(v3, v2) - let v6 := mload(64) - if iszero(v6) { - v6 := 0x80 - } - mstore(64, add(v6, v5)) - codecopy(v6, v2, v5) - let v7 := mload(0x40) - if iszero(v7) { - v7 := 0x80 - } - mstore(0x40, add(v7, 64)) - mstore(v7, v6) - mstore(add(v7, 32), v5) - let v8 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v7) - let v9 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v8) - let v10 := $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v8) - $__Child_init_contract(v9, v10) - codecopy(0, v0, v1) - return(0, v1) - } - function $__Child_init_contract($x, $y) { - leave - } - function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - let v1 := $input - mstore(v0, mload(v1)) - mstore(add(v0, 32), mload(add(v1, 32))) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := mload(add($self, 32)) - ret := v0 - leave - } - function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := mload($self) - let v1 := add(v0, $byte_offset) - let v2 := mload(v1) - ret := v2 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { - let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) - let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { - revert(0, 0) - } - let v5 := gt(v2, v0) - if v5 { - revert(0, 0) - } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 128)) - let v2 := v0 - mstore(v1, mload(v2)) - mstore(add(v1, 32), mload(add(v2, 32))) - mstore(add(v1, 64), mload(add(v2, 64))) - mstore(add(v1, 96), 0) - ret := v1 - leave - } - function $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6($d) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($d) - ret := v0 - leave - } - $__Child_init() - } - - object "Child_deployed" { - code { - function $__Child_runtime() { - let v0 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v1 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v0 - default { - } - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - $__Child_runtime() - return(0, 0) - } - } - } -} diff --git a/crates/codegen/tests/fixtures/intrinsic_ops.fe b/crates/codegen/tests/fixtures/intrinsic_ops.fe deleted file mode 100644 index 47d6c1d6f0..0000000000 --- a/crates/codegen/tests/fixtures/intrinsic_ops.fe +++ /dev/null @@ -1,29 +0,0 @@ -use std::evm::{RawMem, RawOps, RawStorage} - -pub fn load_word(ptr: u256) -> u256 uses (mem: RawMem) { - mem.mload(ptr) -} - -pub fn store_word(ptr: u256, value: u256) uses (mem: mut RawMem) { - mem.mstore(ptr, value) -} - -pub fn store_byte(ptr: u256, value: u8) uses (mem: mut RawMem) { - mem.mstore8(ptr, value) -} - -pub fn load_slot(slot: u256) -> u256 uses (sto: RawStorage) { - sto.sload(slot) -} - -pub fn store_slot(slot: u256, value: u256) uses (sto: mut RawStorage) { - sto.sstore(slot, value) -} - -pub fn load_calldata(offset: u256) -> u256 uses (ops: RawOps) { - ops.calldataload(offset) -} - -pub fn finish(ptr: u256, len: u256) uses (ops: RawOps) { - ops.return_data(ptr, len) -} diff --git a/crates/codegen/tests/fixtures/intrinsic_ops.snap b/crates/codegen/tests/fixtures/intrinsic_ops.snap deleted file mode 100644 index ecf6717d37..0000000000 --- a/crates/codegen/tests/fixtures/intrinsic_ops.snap +++ /dev/null @@ -1,36 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/intrinsic_ops.fe ---- -function $load_word__Evm_hef0af3106e109414__3af54274b2985741($ptr, $mem) -> ret { - let v0 := mload($ptr) - ret := v0 - leave -} -function $store_word__Evm_hef0af3106e109414__3af54274b2985741($ptr, $value, $mem) { - mstore($ptr, $value) - leave -} -function $store_byte__Evm_hef0af3106e109414__3af54274b2985741($ptr, $value, $mem) { - mstore8($ptr, $value) - leave -} -function $load_slot__Evm_hef0af3106e109414__3af54274b2985741($slot, $sto) -> ret { - let v0 := sload($slot) - ret := v0 - leave -} -function $store_slot__Evm_hef0af3106e109414__3af54274b2985741($slot, $value, $sto) { - sstore($slot, $value) - leave -} -function $load_calldata__Evm_hef0af3106e109414__3af54274b2985741($offset, $ops) -> ret { - let v0 := calldataload($offset) - ret := v0 - leave -} -function $finish__Evm_hef0af3106e109414__3af54274b2985741($ptr, $len, $ops) { - return($ptr, $len) -} diff --git a/crates/codegen/tests/fixtures/keccak_in_fn.fe b/crates/codegen/tests/fixtures/keccak_in_fn.fe deleted file mode 100644 index 7c8fdb4fd1..0000000000 --- a/crates/codegen/tests/fixtures/keccak_in_fn.fe +++ /dev/null @@ -1,3 +0,0 @@ -fn main() -> u256 { - core::keccak("hello") -} diff --git a/crates/codegen/tests/fixtures/keccak_in_fn.snap b/crates/codegen/tests/fixtures/keccak_in_fn.snap deleted file mode 100644 index 4135693778..0000000000 --- a/crates/codegen/tests/fixtures/keccak_in_fn.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/keccak_in_fn.fe ---- -function $main() -> ret { - ret := 12910348618308260923200348219926901280687058984330794534952861439530514639560 - leave -} diff --git a/crates/codegen/tests/fixtures/keccak_intrinsic.fe b/crates/codegen/tests/fixtures/keccak_intrinsic.fe deleted file mode 100644 index 72efe56640..0000000000 --- a/crates/codegen/tests/fixtures/keccak_intrinsic.fe +++ /dev/null @@ -1,5 +0,0 @@ -use std::evm::RawOps - -pub fn hash(ptr: u256, len: u256) -> u256 uses (ops: RawOps) { - ops.keccak256(ptr, len) -} diff --git a/crates/codegen/tests/fixtures/keccak_intrinsic.snap b/crates/codegen/tests/fixtures/keccak_intrinsic.snap deleted file mode 100644 index d58808c9fa..0000000000 --- a/crates/codegen/tests/fixtures/keccak_intrinsic.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/keccak_intrinsic.fe ---- -function $hash__Evm_hef0af3106e109414__3af54274b2985741($ptr, $len, $ops) -> ret { - let v0 := keccak256($ptr, $len) - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/layout/enum_nested.fe b/crates/codegen/tests/fixtures/layout/enum_nested.fe deleted file mode 100644 index fd599fc796..0000000000 --- a/crates/codegen/tests/fixtures/layout/enum_nested.fe +++ /dev/null @@ -1,12 +0,0 @@ -// Test layout of enums with aggregate payloads - -struct Point { - x: u64, - y: u64, -} - -enum Shape { - Empty, - Circle(u64), - Rectangle(Point) -} diff --git a/crates/codegen/tests/fixtures/layout/enum_nested.snap b/crates/codegen/tests/fixtures/layout/enum_nested.snap deleted file mode 100644 index a4544ad063..0000000000 --- a/crates/codegen/tests/fixtures/layout/enum_nested.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: crates/hir/tests/layout.rs -assertion_line: 144 -expression: report -input_file: test_files/layout/enum_nested.fe ---- -struct Point: - size: 16 bytes - fields: - [0]: offset=0, size=8 - [1]: offset=8, size=8 -enum Shape: - size: 48 bytes - discriminant: 32 bytes - variants: - Empty: (unit) - Circle: - [0]: offset=32, size=8 - Rectangle: - [0]: offset=32, size=16 diff --git a/crates/codegen/tests/fixtures/layout/enum_simple.fe b/crates/codegen/tests/fixtures/layout/enum_simple.fe deleted file mode 100644 index 3de6e82af2..0000000000 --- a/crates/codegen/tests/fixtures/layout/enum_simple.fe +++ /dev/null @@ -1,18 +0,0 @@ -// Test layout of simple enums - -enum UnitOnly { - A, - B, - C -} - -enum WithPayload { - None, - Some(u256) -} - -enum MultiField { - Empty, - One(u8), - Two(u8, u16) -} diff --git a/crates/codegen/tests/fixtures/layout/enum_simple.snap b/crates/codegen/tests/fixtures/layout/enum_simple.snap deleted file mode 100644 index ff8a9bef08..0000000000 --- a/crates/codegen/tests/fixtures/layout/enum_simple.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: crates/hir/tests/layout.rs -assertion_line: 144 -expression: report -input_file: test_files/layout/enum_simple.fe ---- -enum UnitOnly: - size: 32 bytes - discriminant: 32 bytes - variants: - A: (unit) - B: (unit) - C: (unit) -enum WithPayload: - size: 64 bytes - discriminant: 32 bytes - variants: - None: (unit) - Some: - [0]: offset=32, size=32 -enum MultiField: - size: 35 bytes - discriminant: 32 bytes - variants: - Empty: (unit) - One: - [0]: offset=32, size=1 - Two: - [0]: offset=32, size=1 - [1]: offset=33, size=2 diff --git a/crates/codegen/tests/fixtures/layout/mixed_sizes.fe b/crates/codegen/tests/fixtures/layout/mixed_sizes.fe deleted file mode 100644 index d1996a83ab..0000000000 --- a/crates/codegen/tests/fixtures/layout/mixed_sizes.fe +++ /dev/null @@ -1,18 +0,0 @@ -// Test packed layout with mixed field sizes - -struct PackedSmall { - a: u8, - b: u8, - c: u8, -} - -struct PackedMixed { - small1: u8, - big: u256, - small2: u8, -} - -struct ReverseMixed { - big: u256, - small: u8, -} diff --git a/crates/codegen/tests/fixtures/layout/mixed_sizes.snap b/crates/codegen/tests/fixtures/layout/mixed_sizes.snap deleted file mode 100644 index 760dfa3df0..0000000000 --- a/crates/codegen/tests/fixtures/layout/mixed_sizes.snap +++ /dev/null @@ -1,23 +0,0 @@ ---- -source: crates/hir/tests/layout.rs -assertion_line: 144 -expression: report -input_file: test_files/layout/mixed_sizes.fe ---- -struct PackedSmall: - size: 3 bytes - fields: - [0]: offset=0, size=1 - [1]: offset=1, size=1 - [2]: offset=2, size=1 -struct PackedMixed: - size: 34 bytes - fields: - [0]: offset=0, size=1 - [1]: offset=1, size=32 - [2]: offset=33, size=1 -struct ReverseMixed: - size: 33 bytes - fields: - [0]: offset=0, size=32 - [1]: offset=32, size=1 diff --git a/crates/codegen/tests/fixtures/layout/primitives.fe b/crates/codegen/tests/fixtures/layout/primitives.fe deleted file mode 100644 index 4b4566d8cc..0000000000 --- a/crates/codegen/tests/fixtures/layout/primitives.fe +++ /dev/null @@ -1,24 +0,0 @@ -// Test layout of primitive types in structs - -struct SingleU8 { - a: u8, -} - -struct SingleU256 { - a: u256, -} - -struct MixedPrimitives { - a: u8, - b: u16, - c: u32, - d: u64, - e: u128, - f: u256, -} - -struct Bools { - a: bool, - b: bool, - c: bool, -} diff --git a/crates/codegen/tests/fixtures/layout/primitives.snap b/crates/codegen/tests/fixtures/layout/primitives.snap deleted file mode 100644 index d7370fa5d7..0000000000 --- a/crates/codegen/tests/fixtures/layout/primitives.snap +++ /dev/null @@ -1,29 +0,0 @@ ---- -source: crates/hir/tests/layout.rs -assertion_line: 144 -expression: report -input_file: test_files/layout/primitives.fe ---- -struct SingleU8: - size: 1 bytes - fields: - [0]: offset=0, size=1 -struct SingleU256: - size: 32 bytes - fields: - [0]: offset=0, size=32 -struct MixedPrimitives: - size: 63 bytes - fields: - [0]: offset=0, size=1 - [1]: offset=1, size=2 - [2]: offset=3, size=4 - [3]: offset=7, size=8 - [4]: offset=15, size=16 - [5]: offset=31, size=32 -struct Bools: - size: 3 bytes - fields: - [0]: offset=0, size=1 - [1]: offset=1, size=1 - [2]: offset=2, size=1 diff --git a/crates/codegen/tests/fixtures/layout/range_bounds.fe b/crates/codegen/tests/fixtures/layout/range_bounds.fe deleted file mode 100644 index ebca8b7f7a..0000000000 --- a/crates/codegen/tests/fixtures/layout/range_bounds.fe +++ /dev/null @@ -1,19 +0,0 @@ -use core::{Range, Known, Unknown} - -struct WrapZero { - left: u256, - range: Range, Known<4>>, - right: u256, -} - -struct WrapOne { - left: u256, - range: Range, Unknown>, - right: u256, -} - -struct WrapTwo { - left: u256, - range: Range, - right: u256, -} diff --git a/crates/codegen/tests/fixtures/layout/range_bounds.snap b/crates/codegen/tests/fixtures/layout/range_bounds.snap deleted file mode 100644 index d6c19baf29..0000000000 --- a/crates/codegen/tests/fixtures/layout/range_bounds.snap +++ /dev/null @@ -1,23 +0,0 @@ ---- -source: crates/codegen/tests/layout.rs -expression: report -input_file: tests/fixtures/layout/range_bounds.fe ---- -struct WrapZero: - size: 64 bytes - fields: - [0]: offset=0, size=32 - [1]: offset=32, size=0 - [2]: offset=32, size=32 -struct WrapOne: - size: 96 bytes - fields: - [0]: offset=0, size=32 - [1]: offset=32, size=32 - [2]: offset=64, size=32 -struct WrapTwo: - size: 128 bytes - fields: - [0]: offset=0, size=32 - [1]: offset=32, size=64 - [2]: offset=96, size=32 diff --git a/crates/codegen/tests/fixtures/layout/struct_nested.fe b/crates/codegen/tests/fixtures/layout/struct_nested.fe deleted file mode 100644 index c9b531810d..0000000000 --- a/crates/codegen/tests/fixtures/layout/struct_nested.fe +++ /dev/null @@ -1,17 +0,0 @@ -// Test layout of nested structs - -struct Inner { - x: u8, - y: u8, -} - -struct Outer { - inner: Inner, - z: u256, -} - -struct DeepNest { - a: Inner, - b: Inner, - c: u8, -} diff --git a/crates/codegen/tests/fixtures/layout/struct_nested.snap b/crates/codegen/tests/fixtures/layout/struct_nested.snap deleted file mode 100644 index d6bc0a4e6f..0000000000 --- a/crates/codegen/tests/fixtures/layout/struct_nested.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: crates/hir/tests/layout.rs -assertion_line: 144 -expression: report -input_file: test_files/layout/struct_nested.fe ---- -struct Inner: - size: 2 bytes - fields: - [0]: offset=0, size=1 - [1]: offset=1, size=1 -struct Outer: - size: 34 bytes - fields: - [0]: offset=0, size=2 - [1]: offset=2, size=32 -struct DeepNest: - size: 5 bytes - fields: - [0]: offset=0, size=2 - [1]: offset=2, size=2 - [2]: offset=4, size=1 diff --git a/crates/codegen/tests/fixtures/literal_add.fe b/crates/codegen/tests/fixtures/literal_add.fe deleted file mode 100644 index 78302b6a13..0000000000 --- a/crates/codegen/tests/fixtures/literal_add.fe +++ /dev/null @@ -1,8 +0,0 @@ -fn main() -> u64 { - let x: u64 = add(10, 20) - x -} - -const fn add(a: u64, b: u64) -> u64 { - a + b -} diff --git a/crates/codegen/tests/fixtures/literal_add.snap b/crates/codegen/tests/fixtures/literal_add.snap deleted file mode 100644 index e749ba1abb..0000000000 --- a/crates/codegen/tests/fixtures/literal_add.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/literal_add.fe ---- -function $main() -> ret { - let v0 := $add(10, 20) - ret := v0 - leave -} -function $add($a, $b) -> ret { - ret := add($a, $b) - leave -} diff --git a/crates/codegen/tests/fixtures/literal_sub.fe b/crates/codegen/tests/fixtures/literal_sub.fe deleted file mode 100644 index b527d67ba4..0000000000 --- a/crates/codegen/tests/fixtures/literal_sub.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub fn literal_sub() -> u64 { - 1 - 2 -} diff --git a/crates/codegen/tests/fixtures/literal_sub.snap b/crates/codegen/tests/fixtures/literal_sub.snap deleted file mode 100644 index 8fb0d7f1a8..0000000000 --- a/crates/codegen/tests/fixtures/literal_sub.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/literal_sub.fe ---- -function $literal_sub() -> ret { - ret := sub(1, 2) - leave -} diff --git a/crates/codegen/tests/fixtures/local_bindings.fe b/crates/codegen/tests/fixtures/local_bindings.fe deleted file mode 100644 index 2de0417dd5..0000000000 --- a/crates/codegen/tests/fixtures/local_bindings.fe +++ /dev/null @@ -1,5 +0,0 @@ -pub fn local_bindings() -> u64 { - let x: u64 = 1 + 2 - let y = 3 - y -} diff --git a/crates/codegen/tests/fixtures/local_bindings.snap b/crates/codegen/tests/fixtures/local_bindings.snap deleted file mode 100644 index 1e79743024..0000000000 --- a/crates/codegen/tests/fixtures/local_bindings.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/local_bindings.fe ---- -function $local_bindings() -> ret { - let v0 := add(1, 2) - let v1 := 3 - ret := v1 - leave -} diff --git a/crates/codegen/tests/fixtures/logical_ops.fe b/crates/codegen/tests/fixtures/logical_ops.fe deleted file mode 100644 index 5dc641ded7..0000000000 --- a/crates/codegen/tests/fixtures/logical_ops.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub fn logical_ops() -> bool { - true && false -} diff --git a/crates/codegen/tests/fixtures/logical_ops.snap b/crates/codegen/tests/fixtures/logical_ops.snap deleted file mode 100644 index f9a3f0be3b..0000000000 --- a/crates/codegen/tests/fixtures/logical_ops.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/logical_ops.fe ---- -function $logical_ops() -> ret { - ret := and(1, 0) - leave -} diff --git a/crates/codegen/tests/fixtures/match_enum.fe b/crates/codegen/tests/fixtures/match_enum.fe deleted file mode 100644 index a64c3c467c..0000000000 --- a/crates/codegen/tests/fixtures/match_enum.fe +++ /dev/null @@ -1,14 +0,0 @@ -enum MyEnum { - A, - B, - C, -} - -pub fn match_enum(e: MyEnum) -> u8 { - match e { - MyEnum::A => 1, - MyEnum::B => 2, - MyEnum::C => 3, - _ => 4, - } -} diff --git a/crates/codegen/tests/fixtures/match_enum.snap b/crates/codegen/tests/fixtures/match_enum.snap deleted file mode 100644 index d080e99c66..0000000000 --- a/crates/codegen/tests/fixtures/match_enum.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/match_enum.fe ---- -function $match_enum($e) -> ret { - let v0 := 0 - let v1 := mload($e) - switch v1 - case 0 { - v0 := 1 - } - case 1 { - v0 := 2 - } - case 2 { - v0 := 3 - } - default { - v0 := 4 - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/match_enum_with_data.fe b/crates/codegen/tests/fixtures/match_enum_with_data.fe deleted file mode 100644 index 4836efb7b9..0000000000 --- a/crates/codegen/tests/fixtures/match_enum_with_data.fe +++ /dev/null @@ -1,16 +0,0 @@ - -enum MyOption { - None, - Some(u64), -} - -pub fn make_some(value: u64) -> MyOption { - MyOption::Some(value) -} - -pub fn match_option(opt: own MyOption) -> u64 { - match opt { - MyOption::Some(value) => value, - MyOption::None => 0, - } -} diff --git a/crates/codegen/tests/fixtures/match_enum_with_data.snap b/crates/codegen/tests/fixtures/match_enum_with_data.snap deleted file mode 100644 index 07169ff89c..0000000000 --- a/crates/codegen/tests/fixtures/match_enum_with_data.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_enum_with_data.fe ---- -function $make_some($value) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, 1) - mstore(add(v0, 32), and($value, 0xffffffffffffffff)) - ret := v0 - leave -} -function $match_option($opt) -> ret { - let v0 := 0 - let v1 := mload($opt) - switch v1 - case 1 { - let v2 := and(mload(add($opt, 32)), 0xffffffffffffffff) - let v3 := v2 - v0 := v3 - } - case 0 { - v0 := 0 - } - default { - } - let v4 := $opt - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/match_fn_call.fe b/crates/codegen/tests/fixtures/match_fn_call.fe deleted file mode 100644 index ccb21ffa3f..0000000000 --- a/crates/codegen/tests/fixtures/match_fn_call.fe +++ /dev/null @@ -1,15 +0,0 @@ -use std::evm::RawOps - -fn example() -> u256 uses (ops: RawOps) { - match read_selector() { - 0x12345678 => 1, - 0x23456789 => 2, - _ => 3, - } -} - -pub fn read_selector() -> u256 uses (ops: RawOps) { - let word = ops.calldataload(0) - // Shift right by 224 bits to keep only the first four bytes. - word >> 224 -} diff --git a/crates/codegen/tests/fixtures/match_fn_call.snap b/crates/codegen/tests/fixtures/match_fn_call.snap deleted file mode 100644 index c03b95a877..0000000000 --- a/crates/codegen/tests/fixtures/match_fn_call.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_fn_call.fe ---- -function $example__Evm_hef0af3106e109414__3af54274b2985741($ops) -> ret { - let v0 := $read_selector__Evm_hef0af3106e109414__3af54274b2985741($ops) - let v1 := 0 - switch v0 - case 305419896 { - v1 := 1 - } - case 591751049 { - v1 := 2 - } - default { - v1 := 3 - } - ret := v1 - leave -} -function $read_selector__Evm_hef0af3106e109414__3af54274b2985741($ops) -> ret { - let v0 := calldataload(0) - ret := shr(224, v0) - leave -} diff --git a/crates/codegen/tests/fixtures/match_literal.fe b/crates/codegen/tests/fixtures/match_literal.fe deleted file mode 100644 index 1344e8400f..0000000000 --- a/crates/codegen/tests/fixtures/match_literal.fe +++ /dev/null @@ -1,102 +0,0 @@ -pub fn match_bool(e: bool) -> u64 { - match e { - true => 1, - _ => 2, - } -} - -pub fn match_u8(e: u8) -> u8 { - match e { - 0 => 1, - 255 => 2, - _ => 3, - } -} - -pub fn match_u16(e: u16) -> u16 { - match e { - 0x1234 => 1, - 0xabcd => 2, - _ => 3, - } -} - -pub fn match_u32(e: u32) -> u32 { - match e { - 0xdeadbeef => 1, - 0xcafebabe => 2, - _ => 3, - } -} - -pub fn match_u64(e: u64) -> u64 { - match e { - 0 => 1, - 0xffffffffffffffff => 2, - _ => 3, - } -} - -pub fn match_u128(e: u128) -> u128 { - match e { - 0 => 1, - 0xffffffffffffffffffffffffffffffff => 2, - _ => 3, - } -} - -pub fn match_u256(e: u256) -> u256 { - match e { - 0 => 1, - 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff => 2, - _ => 3, - } -} - -pub fn match_i8(e: i8) -> i8 { - match e { - 0 => 1, - 99 => 2, - _ => 3, - } -} - -pub fn match_i16(e: i16) -> i16 { - match e { - 0 => 1, - 32000 => 2, - _ => 3, - } -} - -pub fn match_i32(e: i32) -> i32 { - match e { - 0 => 1, - 2000000000 => 2, - _ => 3, - } -} - -pub fn match_i64(e: i64) -> i64 { - match e { - 0 => 1, - 9223372036854775807 => 2, - _ => 3, - } -} - -pub fn match_i128(e: i128) -> i128 { - match e { - 0 => 1, - 170141183460469231731687303715884105727 => 2, - _ => 3, - } -} - -pub fn match_i256(e: i256) -> i256 { - match e { - 0 => 1, - 115792089237316195423570985008687907853269984665640564039457584007913129639935 => 2, - _ => 3, - } -} diff --git a/crates/codegen/tests/fixtures/match_literal.snap b/crates/codegen/tests/fixtures/match_literal.snap deleted file mode 100644 index cbf881ac52..0000000000 --- a/crates/codegen/tests/fixtures/match_literal.snap +++ /dev/null @@ -1,198 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/match_literal.fe ---- -function $match_bool($e) -> ret { - let v0 := 0 - switch $e - case 1 { - v0 := 1 - } - default { - v0 := 2 - } - ret := v0 - leave -} -function $match_u8($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 255 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_u16($e) -> ret { - let v0 := 0 - switch $e - case 4660 { - v0 := 1 - } - case 43981 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_u32($e) -> ret { - let v0 := 0 - switch $e - case 3735928559 { - v0 := 1 - } - case 3405691582 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_u64($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 18446744073709551615 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_u128($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 340282366920938463463374607431768211455 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_u256($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 115792089237316195423570985008687907853269984665640564039457584007913129639935 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_i8($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 99 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_i16($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 32000 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_i32($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 2000000000 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_i64($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 9223372036854775807 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_i128($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 170141183460469231731687303715884105727 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $match_i256($e) -> ret { - let v0 := 0 - switch $e - case 0 { - v0 := 1 - } - case 115792089237316195423570985008687907853269984665640564039457584007913129639935 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/match_mixed_return.fe b/crates/codegen/tests/fixtures/match_mixed_return.fe deleted file mode 100644 index 33f13f83a8..0000000000 --- a/crates/codegen/tests/fixtures/match_mixed_return.fe +++ /dev/null @@ -1,15 +0,0 @@ -enum E { - A, - B, -} - -fn f(e: E) -> u256 { - // Mixed arms: one returns, one continues. Code after the match should be skipped for E::A. - let x = match e { - E::A => { return 0 } - E::B => { 1 } - } - - // If lowering is wrong, this runs even for E::A; we expect only the B arm to reach here. - x + 1 -} diff --git a/crates/codegen/tests/fixtures/match_mixed_return.snap b/crates/codegen/tests/fixtures/match_mixed_return.snap deleted file mode 100644 index cb7949a764..0000000000 --- a/crates/codegen/tests/fixtures/match_mixed_return.snap +++ /dev/null @@ -1,23 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/match_mixed_return.fe ---- -function $f($e) -> ret { - let v0 := 0 - let v1 := mload($e) - switch v1 - case 0 { - ret := 0 - leave - } - case 1 { - v0 := 1 - } - default { - } - let v2 := v0 - ret := add(v2, 1) - leave -} diff --git a/crates/codegen/tests/fixtures/match_nested_default.fe b/crates/codegen/tests/fixtures/match_nested_default.fe deleted file mode 100644 index 5c1b064421..0000000000 --- a/crates/codegen/tests/fixtures/match_nested_default.fe +++ /dev/null @@ -1,52 +0,0 @@ -enum Inner { - A, - B, - C -} - -enum Outer { - First(Inner), - Second(Inner) -} - -// Nested defaults: wildcard catches both outer and inner defaults -pub fn nested_with_defaults(o: Outer) -> u8 { - match o { - Outer::First(Inner::A) => 1 - Outer::Second(Inner::B) => 2 - _ => 0 - } -} - -// Specific outer, wildcard inner - the bug case! -// Outer::First(_) should match First(B) and First(C), returning 2 -// _ should only match Second variants, returning 3 -pub fn outer_specific_inner_wildcard(o: Outer) -> u8 { - match o { - Outer::First(Inner::A) => 1 - Outer::First(_) => 2 - _ => 3 - } -} - -// Deep nesting with wildcards at multiple levels -enum Deep { - Wrap(Outer) -} - -pub fn deeply_nested_wildcard(d: Deep) -> u8 { - match d { - Deep::Wrap(Outer::First(Inner::A)) => 1 - _ => 0 - } -} - -// Exhaustive inner match with outer wildcard -pub fn exhaustive_inner_outer_wildcard(o: Outer) -> u8 { - match o { - Outer::First(Inner::A) => 1 - Outer::First(Inner::B) => 2 - Outer::First(Inner::C) => 3 - _ => 0 - } -} diff --git a/crates/codegen/tests/fixtures/match_nested_default.snap b/crates/codegen/tests/fixtures/match_nested_default.snap deleted file mode 100644 index ec147e115d..0000000000 --- a/crates/codegen/tests/fixtures/match_nested_default.snap +++ /dev/null @@ -1,113 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_nested_default.fe ---- -function $nested_with_defaults($o) -> ret { - let v0 := 0 - let v1 := $o - let v2 := mload(v1) - switch v2 - case 0 { - let v3 := mload(add(v1, 32)) - switch v3 - case 0 { - v0 := 1 - } - default { - v0 := 0 - } - } - case 1 { - let v4 := mload(add(v1, 32)) - switch v4 - case 1 { - v0 := 2 - } - default { - v0 := 0 - } - } - default { - v0 := 0 - } - ret := v0 - leave -} -function $outer_specific_inner_wildcard($o) -> ret { - let v0 := 0 - let v1 := $o - let v2 := mload(v1) - switch v2 - case 0 { - let v3 := mload(add(v1, 32)) - switch v3 - case 0 { - v0 := 1 - } - default { - v0 := 2 - } - } - default { - v0 := 3 - } - ret := v0 - leave -} -function $deeply_nested_wildcard($d) -> ret { - let v0 := 0 - let v1 := $d - let v2 := mload(v1) - switch v2 - case 0 { - let v3 := mload(add(v1, 32)) - switch v3 - case 0 { - let v4 := mload(add(v1, 64)) - switch v4 - case 0 { - v0 := 1 - } - default { - v0 := 0 - } - } - default { - v0 := 0 - } - } - default { - v0 := 0 - } - ret := v0 - leave -} -function $exhaustive_inner_outer_wildcard($o) -> ret { - let v0 := 0 - let v1 := $o - let v2 := mload(v1) - switch v2 - case 0 { - let v3 := mload(add(v1, 32)) - switch v3 - case 0 { - v0 := 1 - } - case 1 { - v0 := 2 - } - case 2 { - v0 := 3 - } - default { - v0 := 0 - } - } - default { - v0 := 0 - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/match_nested_enum.fe b/crates/codegen/tests/fixtures/match_nested_enum.fe deleted file mode 100644 index eab3ec83b1..0000000000 --- a/crates/codegen/tests/fixtures/match_nested_enum.fe +++ /dev/null @@ -1,19 +0,0 @@ - -enum Inner { - Unit, - Value(u8) -} - -enum Outer { - First(Inner), - Second(u8) -} - -// Test nested enum pattern matching with bindings -pub fn match_nested_enum(outer: own Outer) -> u8 { - match outer { - Outer::First(Inner::Unit) => 0 - Outer::First(Inner::Value(x)) => x - Outer::Second(y) => y - } -} diff --git a/crates/codegen/tests/fixtures/match_nested_enum.snap b/crates/codegen/tests/fixtures/match_nested_enum.snap deleted file mode 100644 index b5e658cbbd..0000000000 --- a/crates/codegen/tests/fixtures/match_nested_enum.snap +++ /dev/null @@ -1,35 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_nested_enum.fe ---- -function $match_nested_enum($outer) -> ret { - let v0 := 0 - let v1 := mload($outer) - switch v1 - case 0 { - let v2 := mload(add($outer, 32)) - switch v2 - case 0 { - v0 := 0 - } - case 1 { - let v3 := and(mload(add($outer, 64)), 0xff) - let v4 := v3 - v0 := v4 - } - default { - } - } - case 1 { - let v5 := and(mload(add($outer, 32)), 0xff) - let v6 := v5 - v0 := v6 - } - default { - } - let v7 := $outer - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/match_newtype_nested.fe b/crates/codegen/tests/fixtures/match_newtype_nested.fe deleted file mode 100644 index 08ac0c5bae..0000000000 --- a/crates/codegen/tests/fixtures/match_newtype_nested.fe +++ /dev/null @@ -1,19 +0,0 @@ -struct B { - inner: u256, -} - -struct A { - inner: B, -} - -pub fn match_newtype_nested(a: own A) -> u256 { - match a { - A { inner: B { inner: 0 } } => 0, - A { inner: B { inner: x } } => x, - } -} - -fn f() -> u256 { - let a = A { inner: B { inner: 10 }} - match_newtype_nested(a) -} diff --git a/crates/codegen/tests/fixtures/match_newtype_nested.snap b/crates/codegen/tests/fixtures/match_newtype_nested.snap deleted file mode 100644 index 86f287a925..0000000000 --- a/crates/codegen/tests/fixtures/match_newtype_nested.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_newtype_nested.fe ---- -function $match_newtype_nested($a) -> ret { - let v0 := 0 - switch $a - case 0 { - v0 := 0 - } - default { - let v1 := $a - v0 := v1 - } - let v2 := $a - ret := v0 - leave -} -function $f() -> ret { - let v0 := 10 - let v1 := $match_newtype_nested(v0) - ret := v1 - leave -} diff --git a/crates/codegen/tests/fixtures/match_return.fe b/crates/codegen/tests/fixtures/match_return.fe deleted file mode 100644 index 712fd15608..0000000000 --- a/crates/codegen/tests/fixtures/match_return.fe +++ /dev/null @@ -1,10 +0,0 @@ -use std::evm::RawOps - -enum E { A, B } - -fn f(e: E) uses (ops: RawOps) { - match e { - E::A => { ops.return_data(0, 0) } - E::B => { ops.return_data(0, 0) } - } -} diff --git a/crates/codegen/tests/fixtures/match_return.snap b/crates/codegen/tests/fixtures/match_return.snap deleted file mode 100644 index ce89c9cd11..0000000000 --- a/crates/codegen/tests/fixtures/match_return.snap +++ /dev/null @@ -1,18 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_return.fe ---- -function $f__Evm_hef0af3106e109414__3af54274b2985741($e, $ops) { - let v0 := mload($e) - switch v0 - case 0 { - return(0, 0) - } - case 1 { - return(0, 0) - } - default { - } -} diff --git a/crates/codegen/tests/fixtures/match_struct.fe b/crates/codegen/tests/fixtures/match_struct.fe deleted file mode 100644 index d5aefde30a..0000000000 --- a/crates/codegen/tests/fixtures/match_struct.fe +++ /dev/null @@ -1,24 +0,0 @@ -// Test struct pattern matching -// This exercises struct field decomposition in decision trees - -struct Point { - x: u8, - y: u8, -} - -pub fn match_struct_fields(p: Point) -> u8 { - match ref p { - Point { x: 0, y: 0 } => 0, - Point { x: 0, y } => y, - Point { x, y: 0 } => x, - Point { x, y } => x + y, - } -} - -pub fn match_struct_wildcard(p: Point) -> u8 { - match ref p { - Point { x: 0, y: _ } => 1, - Point { x: _, y: 0 } => 2, - _ => 3, - } -} diff --git a/crates/codegen/tests/fixtures/match_struct.snap b/crates/codegen/tests/fixtures/match_struct.snap deleted file mode 100644 index 90d119ad21..0000000000 --- a/crates/codegen/tests/fixtures/match_struct.snap +++ /dev/null @@ -1,59 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_struct.fe ---- -function $match_struct_fields($p) -> ret { - let v0 := 0 - let v1 := $p - let v2 := and(mload(add(v1, 32)), 0xff) - switch v2 - case 0 { - let v3 := and(mload(v1), 0xff) - switch v3 - case 0 { - v0 := 0 - } - default { - let v4 := and(mload(v1), 0xff) - v0 := v4 - } - } - default { - let v5 := and(mload(v1), 0xff) - switch v5 - case 0 { - let v6 := and(mload(add(v1, 32)), 0xff) - v0 := v6 - } - default { - let v7 := and(mload(add(v1, 32)), 0xff) - let v8 := and(mload(v1), 0xff) - v0 := add(v8, v7) - } - } - ret := v0 - leave -} -function $match_struct_wildcard($p) -> ret { - let v0 := 0 - let v1 := $p - let v2 := and(mload(v1), 0xff) - switch v2 - case 0 { - v0 := 1 - } - default { - let v3 := and(mload(add(v1, 32)), 0xff) - switch v3 - case 0 { - v0 := 2 - } - default { - v0 := 3 - } - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/match_tuple.fe b/crates/codegen/tests/fixtures/match_tuple.fe deleted file mode 100644 index 26da26ec16..0000000000 --- a/crates/codegen/tests/fixtures/match_tuple.fe +++ /dev/null @@ -1,27 +0,0 @@ -// Test basic tuple pattern matching -// This exercises decision tree occurrence paths for tuple decomposition - -pub fn match_bool_tuple(t: (bool, bool)) -> u8 { - match t { - (true, true) => 3, - (true, false) => 2, - (false, true) => 1, - (false, false) => 0, - } -} - -pub fn match_tuple_with_wildcard(t: (bool, bool)) -> u8 { - match t { - (true, _) => 1, - (false, _) => 0, - } -} - -pub fn match_mixed_tuple(t: (bool, u8)) -> u8 { - match t { - (true, 0) => 10, - (true, 1) => 11, - (true, _) => 12, - (false, _) => 0, - } -} diff --git a/crates/codegen/tests/fixtures/match_tuple.snap b/crates/codegen/tests/fixtures/match_tuple.snap deleted file mode 100644 index a19e56997a..0000000000 --- a/crates/codegen/tests/fixtures/match_tuple.snap +++ /dev/null @@ -1,81 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_tuple.fe ---- -function $match_bool_tuple($t) -> ret { - let v0 := 0 - let v1 := $t - let v2 := iszero(eq(mload(add(v1, 32)), 0)) - switch v2 - case 1 { - let v3 := iszero(eq(mload(v1), 0)) - switch v3 - case 1 { - v0 := 3 - } - case 0 { - v0 := 1 - } - default { - } - } - case 0 { - let v4 := iszero(eq(mload(v1), 0)) - switch v4 - case 1 { - v0 := 2 - } - case 0 { - v0 := 0 - } - default { - } - } - default { - } - ret := v0 - leave -} -function $match_tuple_with_wildcard($t) -> ret { - let v0 := 0 - let v1 := iszero(eq(mload($t), 0)) - switch v1 - case 1 { - v0 := 1 - } - case 0 { - v0 := 0 - } - default { - } - ret := v0 - leave -} -function $match_mixed_tuple($t) -> ret { - let v0 := 0 - let v1 := $t - let v2 := iszero(eq(mload(v1), 0)) - switch v2 - case 1 { - let v3 := and(mload(add(v1, 32)), 0xff) - switch v3 - case 0 { - v0 := 10 - } - case 1 { - v0 := 11 - } - default { - v0 := 12 - } - } - case 0 { - v0 := 0 - } - default { - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/match_tuple_binding.fe b/crates/codegen/tests/fixtures/match_tuple_binding.fe deleted file mode 100644 index 0123b98194..0000000000 --- a/crates/codegen/tests/fixtures/match_tuple_binding.fe +++ /dev/null @@ -1,18 +0,0 @@ -// Test tuple pattern matching WITH variable bindings -// This exercises decision tree leaf.bindings for tuple elements - -pub fn match_tuple_extract(t: own (u8, u8)) -> u8 { - match t { - (0, y) => y, - (x, 0) => x, - (a, b) => a + b, - } -} - -pub fn match_nested_extract(t: own ((u8, u8), u8)) -> u8 { - match t { - ((0, 0), z) => z, - ((x, y), 0) => x + y, - ((a, _), c) => a + c, - } -} diff --git a/crates/codegen/tests/fixtures/match_tuple_binding.snap b/crates/codegen/tests/fixtures/match_tuple_binding.snap deleted file mode 100644 index b3cafac12d..0000000000 --- a/crates/codegen/tests/fixtures/match_tuple_binding.snap +++ /dev/null @@ -1,88 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_tuple_binding.fe ---- -function $match_tuple_extract($t) -> ret { - let v0 := 0 - let v1 := and(mload($t), 0xff) - switch v1 - case 0 { - let v2 := and(mload(add($t, 32)), 0xff) - let v3 := v2 - v0 := v3 - } - default { - let v4 := and(mload(add($t, 32)), 0xff) - switch v4 - case 0 { - let v5 := and(mload($t), 0xff) - let v6 := v5 - v0 := v6 - } - default { - let v7 := and(mload($t), 0xff) - let v8 := v7 - let v9 := and(mload(add($t, 32)), 0xff) - let v10 := v9 - v0 := add(v8, v10) - } - } - let v11 := $t - ret := v0 - leave -} -function $match_nested_extract($t) -> ret { - let v0 := 0 - let v1 := and(mload(add($t, 32)), 0xff) - switch v1 - case 0 { - let v2 := and(mload($t), 0xff) - switch v2 - case 0 { - let v3 := and(mload(add($t, 64)), 0xff) - let v4 := v3 - v0 := v4 - } - default { - let v5 := and(mload(add($t, 64)), 0xff) - switch v5 - case 0 { - let v6 := and(mload(add($t, 32)), 0xff) - let v7 := v6 - let v8 := and(mload($t), 0xff) - let v9 := v8 - v0 := add(v9, v7) - } - default { - let v10 := and(mload($t), 0xff) - let v11 := v10 - let v12 := and(mload(add($t, 64)), 0xff) - let v13 := v12 - v0 := add(v11, v13) - } - } - } - default { - let v14 := and(mload(add($t, 64)), 0xff) - switch v14 - case 0 { - let v15 := and(mload(add($t, 32)), 0xff) - let v16 := v15 - let v17 := and(mload($t), 0xff) - let v18 := v17 - v0 := add(v18, v16) - } - default { - let v19 := and(mload($t), 0xff) - let v20 := v19 - let v21 := and(mload(add($t, 64)), 0xff) - let v22 := v21 - v0 := add(v20, v22) - } - } - let v23 := $t - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/match_tuple_nested.fe b/crates/codegen/tests/fixtures/match_tuple_nested.fe deleted file mode 100644 index 720401ac58..0000000000 --- a/crates/codegen/tests/fixtures/match_tuple_nested.fe +++ /dev/null @@ -1,20 +0,0 @@ -// Test nested tuple pattern matching -// This exercises multi-level occurrence paths - -pub fn match_nested_tuple(t: ((bool, bool), bool)) -> u8 { - match t { - ((true, true), true) => 7, - ((true, true), false) => 6, - ((true, false), _) => 5, - ((false, _), true) => 2, - ((false, _), false) => 1, - } -} - -pub fn match_deeply_nested(t: (((bool, bool), bool), bool)) -> u8 { - match t { - (((true, true), true), true) => 15, - (((true, _), _), _) => 8, - (((false, _), _), _) => 0, - } -} diff --git a/crates/codegen/tests/fixtures/match_tuple_nested.snap b/crates/codegen/tests/fixtures/match_tuple_nested.snap deleted file mode 100644 index 6d113f6158..0000000000 --- a/crates/codegen/tests/fixtures/match_tuple_nested.snap +++ /dev/null @@ -1,86 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/match_tuple_nested.fe ---- -function $match_nested_tuple($t) -> ret { - let v0 := 0 - let v1 := $t - let v2 := iszero(eq(mload(v1), 0)) - switch v2 - case 1 { - let v3 := iszero(eq(mload(add(v1, 32)), 0)) - switch v3 - case 1 { - let v4 := iszero(eq(mload(add(v1, 64)), 0)) - switch v4 - case 1 { - v0 := 7 - } - case 0 { - v0 := 6 - } - default { - } - } - case 0 { - v0 := 5 - } - default { - } - } - case 0 { - let v5 := iszero(eq(mload(add(v1, 64)), 0)) - switch v5 - case 1 { - v0 := 2 - } - case 0 { - v0 := 1 - } - default { - } - } - default { - } - ret := v0 - leave -} -function $match_deeply_nested($t) -> ret { - let v0 := 0 - let v1 := $t - let v2 := iszero(eq(mload(v1), 0)) - switch v2 - case 1 { - let v3 := iszero(eq(mload(add(v1, 96)), 0)) - switch v3 - case 1 { - let v4 := iszero(eq(mload(add(v1, 64)), 0)) - switch v4 - case 1 { - let v5 := iszero(eq(mload(add(v1, 32)), 0)) - switch v5 - case 1 { - v0 := 15 - } - default { - v0 := 8 - } - } - default { - v0 := 8 - } - } - default { - v0 := 8 - } - } - case 0 { - v0 := 0 - } - default { - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/match_wildcard.fe b/crates/codegen/tests/fixtures/match_wildcard.fe deleted file mode 100644 index ffc43ea291..0000000000 --- a/crates/codegen/tests/fixtures/match_wildcard.fe +++ /dev/null @@ -1,30 +0,0 @@ -enum Color { - Red, - Green, - Blue -} - -// Simple wildcard as catch-all -pub fn match_with_wildcard(c: Color) -> u8 { - match c { - Color::Red => 1 - _ => 0 - } -} - -// Wildcard in the middle -pub fn wildcard_not_last(x: u8) -> u8 { - match x { - 0 => 10 - _ => 99 - } -} - -// Multiple specific cases before wildcard -pub fn multiple_before_wildcard(c: Color) -> u8 { - match c { - Color::Red => 1 - Color::Green => 2 - _ => 3 - } -} diff --git a/crates/codegen/tests/fixtures/match_wildcard.snap b/crates/codegen/tests/fixtures/match_wildcard.snap deleted file mode 100644 index 7022b6cf87..0000000000 --- a/crates/codegen/tests/fixtures/match_wildcard.snap +++ /dev/null @@ -1,47 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/match_wildcard.fe ---- -function $match_with_wildcard($c) -> ret { - let v0 := 0 - let v1 := mload($c) - switch v1 - case 0 { - v0 := 1 - } - default { - v0 := 0 - } - ret := v0 - leave -} -function $wildcard_not_last($x) -> ret { - let v0 := 0 - switch $x - case 0 { - v0 := 10 - } - default { - v0 := 99 - } - ret := v0 - leave -} -function $multiple_before_wildcard($c) -> ret { - let v0 := 0 - let v1 := mload($c) - switch v1 - case 0 { - v0 := 1 - } - case 1 { - v0 := 2 - } - default { - v0 := 3 - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/math_ops.fe b/crates/codegen/tests/fixtures/math_ops.fe deleted file mode 100644 index 398e76ce9a..0000000000 --- a/crates/codegen/tests/fixtures/math_ops.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub fn math_ops() -> u64 { - (10 - 3) * 2 / 7 % 3 -} diff --git a/crates/codegen/tests/fixtures/math_ops.snap b/crates/codegen/tests/fixtures/math_ops.snap deleted file mode 100644 index 93a3e312c3..0000000000 --- a/crates/codegen/tests/fixtures/math_ops.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/math_ops.fe ---- -function $math_ops() -> ret { - ret := mod(div(mul(sub(10, 3), 2), 7), 3) - leave -} diff --git a/crates/codegen/tests/fixtures/method_call.fe b/crates/codegen/tests/fixtures/method_call.fe deleted file mode 100644 index bd3661d8d8..0000000000 --- a/crates/codegen/tests/fixtures/method_call.fe +++ /dev/null @@ -1,20 +0,0 @@ -struct Foo {} - -fn make_value() -> u64 { - 42 -} - -impl Foo { - - pub fn gen_value(&self) -> u64 { - make_value() - } - - pub fn return_value(self) -> u64 { - self.gen_value() - } -} - -pub fn call_method(foo: Foo) -> u64 { - foo.return_value() -} diff --git a/crates/codegen/tests/fixtures/method_call.snap b/crates/codegen/tests/fixtures/method_call.snap deleted file mode 100644 index ff233a33d6..0000000000 --- a/crates/codegen/tests/fixtures/method_call.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/method_call.fe ---- -function $make_value() -> ret { - ret := 42 - leave -} -function $call_method($foo) -> ret { - let v0 := $foo_h6dbce71a6ea992b8_return_value($foo) - ret := v0 - leave -} -function $foo_h6dbce71a6ea992b8_gen_value($self) -> ret { - let v0 := $make_value() - ret := v0 - leave -} -function $foo_h6dbce71a6ea992b8_return_value($self) -> ret { - let v0 := $foo_h6dbce71a6ea992b8_gen_value($self) - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/method_infer_by_constraints.fe b/crates/codegen/tests/fixtures/method_infer_by_constraints.fe deleted file mode 100644 index 24ea767da3..0000000000 --- a/crates/codegen/tests/fixtures/method_infer_by_constraints.fe +++ /dev/null @@ -1,24 +0,0 @@ -struct S { - t: T, -} - -trait Foo { - fn foo(self) -> (T, U) -} - -impl Foo for S where T: Copy { - fn foo(self) -> (T, u64) { - (self.t, 1) - } -} - -impl Foo for S { - fn foo(self) -> (u32, u32) { - (1, 2) - } -} - -pub fn call() -> (u64, u64) { - let s: S = S { t: 10 } - s.foo() -} diff --git a/crates/codegen/tests/fixtures/method_infer_by_constraints.snap b/crates/codegen/tests/fixtures/method_infer_by_constraints.snap deleted file mode 100644 index 15b858a7cb..0000000000 --- a/crates/codegen/tests/fixtures/method_infer_by_constraints.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/method_infer_by_constraints.fe ---- -function $call() -> ret { - let v0 := 10 - let v1 := $s_t__h10779c135f64b393_foo_h6dbce71a6ea992b8_foo__u64__aee7f05a097ffa16(v0) - ret := v1 - leave -} -function $s_t__h10779c135f64b393_foo_h6dbce71a6ea992b8_foo__u64__aee7f05a097ffa16($self) -> ret { - let v0 := $self - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, and(v0, 0xffffffffffffffff)) - mstore(add(v1, 32), and(1, 0xffffffffffffffff)) - ret := v1 - leave -} diff --git a/crates/codegen/tests/fixtures/momo.fe b/crates/codegen/tests/fixtures/momo.fe deleted file mode 100644 index 66150710ae..0000000000 --- a/crates/codegen/tests/fixtures/momo.fe +++ /dev/null @@ -1,8 +0,0 @@ -struct MyStruct { - x: u8, - y: u8, -} - -pub fn read_x(val: MyStruct) -> u8 { - val.x + val.y -} diff --git a/crates/codegen/tests/fixtures/momo.snap b/crates/codegen/tests/fixtures/momo.snap deleted file mode 100644 index 7c6696683b..0000000000 --- a/crates/codegen/tests/fixtures/momo.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/momo.fe ---- -function $read_x($val) -> ret { - let v0 := and(mload($val), 0xff) - let v1 := and(mload(add($val, 32)), 0xff) - ret := add(v0, v1) - leave -} diff --git a/crates/codegen/tests/fixtures/name_collisions.fe b/crates/codegen/tests/fixtures/name_collisions.fe deleted file mode 100644 index 39467b4de5..0000000000 --- a/crates/codegen/tests/fixtures/name_collisions.fe +++ /dev/null @@ -1,230 +0,0 @@ -// This test demonstrates various name collision issues in symbol mangling. -// Each section shows a different category of collision that can produce -// invalid Yul (duplicate function definitions). - -// ============================================================================= -// 1. Module qualifier flattening collisions -// ============================================================================= -// When a base name is considered "ambiguous", mangling prefixes it with a module -// qualifier. That qualifier is computed by joining module segments with `_`. -// If two distinct module paths produce the same qualifier string, the base is -// *not* considered ambiguous and we can emit duplicate symbols. -// -// Example: `a::b` and `a_b` both qualify to `a_b`, so both functions below end -// up as `flattened_fn`. - -mod a { - pub mod b { - pub fn flattened_fn() -> u32 { - 1 - } - } -} - -mod a_b { - pub fn flattened_fn() -> u32 { - 2 - } -} - -fn test_module_qualifier_flatten_collision() -> u32 { - a::b::flattened_fn() + a_b::flattened_fn() -} - -// ============================================================================= -// 2. Type name collisions in generic mangling -// ============================================================================= -// Generic suffixes use ty.pretty_print() which for ADTs is only the bare -// identifier, so two distinct types named `S` in different modules collide. - -mod types_a { - pub struct S { - pub x: u32 - } -} - -mod types_b { - pub struct S { - pub y: u64 - } -} - -fn generic_fn(val: own T) -> T { - val -} - -fn test_generic_type_collision() -> u32 { - let a: types_a::S = types_a::S { x: 1 } - let b: types_b::S = types_b::S { y: 2 } - // Both instantiations mangle as `generic_fn__S__` even though - // they're different types - let _ = generic_fn(a) - let _ = generic_fn(b) - 42 -} - -// ============================================================================= -// 3. Impl method prefix collisions -// ============================================================================= -// associated_prefix uses ty.pretty_print() so inherent methods on same-named -// types in different modules can collide. - -mod impl_a { - pub struct Widget { - pub val: u32 - } - - impl Widget { - pub fn process(self) -> u32 { - self.val * 2 - } - } -} - -mod impl_b { - pub struct Widget { - pub val: u64 - } - - impl Widget { - pub fn process(self) -> u64 { - self.val * 3 - } - } -} - -fn test_impl_method_collision() -> u32 { - let a = impl_a::Widget { val: 10 } - let b = impl_b::Widget { val: 20 } - // Both methods mangle as `widget_process` even though they're - // on different types - let x: u32 = a.process() - let y: u64 = b.process() - x -} - -// ============================================================================= -// 4. Trait method collisions (same trait name in different modules) -// ============================================================================= -// Trait method mangling includes the trait's identifier, but not its module -// path. So two distinct traits named `Trait` in different modules collide. - -mod trait_mod_a { - pub trait Trait { - fn same_method(self) -> u32 - } -} - -mod trait_mod_b { - pub trait Trait { - fn same_method(self) -> u32 - } -} - -struct MultiTraitImpl { - pub value: u32 -} - -impl trait_mod_a::Trait for MultiTraitImpl { - fn same_method(self) -> u32 { - self.value + 1 - } -} - -impl trait_mod_b::Trait for MultiTraitImpl { - fn same_method(self) -> u32 { - self.value + 2 - } -} - -fn test_trait_method_collision() -> u32 { - let obj = MultiTraitImpl { value: 100 } - // Both trait method implementations may collide - let a: u32 = trait_mod_a::Trait::same_method(obj) - let obj2 = MultiTraitImpl { value: 100 } - let b: u32 = trait_mod_b::Trait::same_method(obj2) - a + b -} - -// ============================================================================= -// 5. Parameter vs local variable name collisions -// ============================================================================= -// alloc_local() generates names v0, v1, v2... starting from 0, regardless of -// parameter names. If a parameter is named v0, local variables will collide. - -fn param_local_collision(v0: u32) -> u32 { - // The first local variable allocated will also be named v0, - // colliding with the parameter - let x = v0 + 1 - let y = x + 2 - y -} - -fn test_param_local_collision() -> u32 { - param_local_collision(10) -} - -// ============================================================================= -// 6. Cast shim pattern collision -// ============================================================================= -// try_collapse_cast_shim is purely string-pattern based on `__{src}_as_{dst}`. -// A user-defined function matching this pattern would be "optimized away". - -fn __u32_as_u256(x: u32) -> u256 { - // This function name matches the cast shim pattern and might be - // incorrectly optimized away or have its call replaced with just - // returning the argument. - // Intentionally doing something different than a simple cast: - let result: u256 = 999 - result -} - -fn test_cast_shim_collision() -> u256 { - // This call might be incorrectly collapsed to just return 42 - // instead of calling our custom function that returns 999 - __u32_as_u256(42) -} - -// ============================================================================= -// 7. `ret` parameter name collision -// ============================================================================= -// Codegen uses a fixed return name `ret` in Yul signatures. Parameters are -// uniqued against each other, but not against this implicit return name, so a -// parameter named `ret` produces invalid Yul. - -fn ret_param_collision(ret: u32) -> u32 { - ret + 1 -} - -fn test_ret_param_collision() -> u32 { - ret_param_collision(10) -} - -// ============================================================================= -// 8. Yul reserved function name collision -// ============================================================================= -// Function symbols are not escaped against Yul reserved words/opcodes. Defining -// a function named `add` produces invalid Yul and can also shadow the builtin. - -fn add() -> u32 { - 123 -} - -fn test_yul_reserved_fn_collision() -> u32 { - add() -} - -// ============================================================================= -// Entry point that exercises all collision scenarios -// ============================================================================= -pub fn main() -> u32 { - let _ = test_module_qualifier_flatten_collision() - let _ = test_generic_type_collision() - let _ = test_impl_method_collision() - let _ = test_trait_method_collision() - let _ = test_param_local_collision() - let _ = test_cast_shim_collision() - let _ = test_ret_param_collision() - let _ = test_yul_reserved_fn_collision() - 0 -} diff --git a/crates/codegen/tests/fixtures/name_collisions.snap b/crates/codegen/tests/fixtures/name_collisions.snap deleted file mode 100644 index 9c64b86b64..0000000000 --- a/crates/codegen/tests/fixtures/name_collisions.snap +++ /dev/null @@ -1,132 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/name_collisions.fe ---- -function $a_b_h12fd23afeb13a092_flattened_fn() -> ret { - ret := 1 - leave -} -function $a_b_h948d5ab23860c017_flattened_fn() -> ret { - ret := 2 - leave -} -function $test_module_qualifier_flatten_collision() -> ret { - let v0 := $a_b_h12fd23afeb13a092_flattened_fn() - let v1 := $a_b_h948d5ab23860c017_flattened_fn() - ret := add(v0, v1) - leave -} -function $test_generic_type_collision() -> ret { - let v0 := 1 - let v1 := 2 - let v2 := $generic_fn__S_h730d9dc564aaaf27__8d32801e7ec9d42b(v0) - pop(v2) - let v3 := $generic_fn__S_h2db58d011b97b333__42a13489a1ec39e8(v1) - pop(v3) - ret := 42 - leave -} -function $test_impl_method_collision() -> ret { - let v0 := 10 - let v1 := 20 - let v2 := $widget_h8588afca9d68e578_process(v0) - let v3 := $widget_h6847c0e3e0e4aa1e_process(v1) - ret := v2 - leave -} -function $test_trait_method_collision() -> ret { - let v0 := 100 - let v1 := $multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method(v0) - let v2 := 100 - let v3 := $multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method(v2) - ret := add(v1, v3) - leave -} -function $param_local_collision($v0) -> ret { - let v0 := add($v0, 1) - let v1 := add(v0, 2) - ret := v1 - leave -} -function $test_param_local_collision() -> ret { - let v0 := $param_local_collision(10) - ret := v0 - leave -} -function $__u32_as_u256($x) -> ret { - let v0 := 999 - ret := v0 - leave -} -function $test_cast_shim_collision() -> ret { - let v0 := $__u32_as_u256(42) - ret := v0 - leave -} -function $ret_param_collision($ret) -> ret { - ret := add($ret, 1) - leave -} -function $test_ret_param_collision() -> ret { - let v0 := $ret_param_collision(10) - ret := v0 - leave -} -function $add() -> ret { - ret := 123 - leave -} -function $test_yul_reserved_fn_collision() -> ret { - let v0 := $add() - ret := v0 - leave -} -function $main() -> ret { - let v0 := $test_module_qualifier_flatten_collision() - pop(v0) - let v1 := $test_generic_type_collision() - pop(v1) - let v2 := $test_impl_method_collision() - pop(v2) - let v3 := $test_trait_method_collision() - pop(v3) - let v4 := $test_param_local_collision() - pop(v4) - let v5 := $test_cast_shim_collision() - pop(v5) - let v6 := $test_ret_param_collision() - pop(v6) - let v7 := $test_yul_reserved_fn_collision() - pop(v7) - ret := 0 - leave -} -function $widget_h8588afca9d68e578_process($self) -> ret { - let v0 := $self - ret := mul(v0, 2) - leave -} -function $widget_h6847c0e3e0e4aa1e_process($self) -> ret { - let v0 := $self - ret := mul(v0, 3) - leave -} -function $multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method($self) -> ret { - let v0 := $self - ret := add(v0, 1) - leave -} -function $multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method($self) -> ret { - let v0 := $self - ret := add(v0, 2) - leave -} -function $generic_fn__S_h730d9dc564aaaf27__8d32801e7ec9d42b($val) -> ret { - ret := $val - leave -} -function $generic_fn__S_h2db58d011b97b333__42a13489a1ec39e8($val) -> ret { - ret := $val - leave -} diff --git a/crates/codegen/tests/fixtures/nested_struct.fe b/crates/codegen/tests/fixtures/nested_struct.fe deleted file mode 100644 index ff135065ec..0000000000 --- a/crates/codegen/tests/fixtures/nested_struct.fe +++ /dev/null @@ -1,67 +0,0 @@ -use std::evm::{Evm, RawMem, RawOps, RawStorage, StorPtr} - -struct Inner { - value: u256, -} - -struct Outer { - inner: Inner, -} - -struct MemOuter { - inner: Inner, -} - -fn abi_encode(value: u256) -> ! uses (ops: mut RawOps) { - ops.mstore(0, value) - ops.return_data(0, 32) -} - -fn read_inner() -> u256 - uses (outer: Outer) -{ - outer.inner.value -} - -fn write_inner(value: u256) - uses (outer: mut Outer) -{ - outer.inner.value = value -} - -fn mem_read(value: u256) -> u256 { - let mut tmp = MemOuter { inner: Inner { value: 0 } } - tmp.inner.value = value - tmp.inner.value -} - -#[contract_init(NestedStruct)] -fn init() uses (evm: mut Evm) { - let len = evm.code_region_len(runtime) - let offset = evm.code_region_offset(runtime) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(NestedStruct)] -fn runtime() uses (evm: mut Evm) { - let mut outer: StorPtr = evm.stor_ptr(0) - with (outer, RawOps = evm) { - let selector = evm.calldataload(0) >> 224 - match selector { - 0xb849fac8 => { // write_inner(uint256) - let value = evm.calldataload(4) - write_inner(value) - abi_encode(value: value) - } - 0xd164e48d => { // read_inner() - abi_encode(value: read_inner()) - } - 0x806f30cd => { // mem_read(uint256) - let value = evm.calldataload(4) - abi_encode(value: mem_read(value)) - } - _ => evm.return_data(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/nested_struct.snap b/crates/codegen/tests/fixtures/nested_struct.snap deleted file mode 100644 index 90a28c1da0..0000000000 --- a/crates/codegen/tests/fixtures/nested_struct.snap +++ /dev/null @@ -1,76 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/nested_struct.fe ---- -object "NestedStruct" { - code { - function $init__StorPtr_Evm___207f35a85ac4062e() { - let v0 := datasize("NestedStruct_deployed") - let v1 := dataoffset("NestedStruct_deployed") - codecopy(0, v1, v0) - return(0, v0) - } - $init__StorPtr_Evm___207f35a85ac4062e() - } - - object "NestedStruct_deployed" { - code { - function $abi_encode__Evm_hef0af3106e109414__3af54274b2985741($value, $ops) { - mstore(0, $value) - return(0, 32) - } - function $mem_read($value) -> ret { - let v0 := 0 - v0 := $value - ret := v0 - leave - } - function $read_inner__StorPtr_Outer___dab28b9da6c3e28($outer) -> ret { - let v0 := sload($outer) - ret := v0 - leave - } - function $runtime__StorPtr_Evm___207f35a85ac4062e() { - let v0 := $stor_ptr_stor__Evm_hef0af3106e109414_Outer_hccd04e332bd35653__177c3c9a6f7ae368(0, 0) - let v1 := v0 - let v2 := calldataload(0) - let v3 := shr(224, v2) - switch v3 - case 3091856072 { - let v4 := calldataload(4) - $write_inner__StorPtr_Outer___dab28b9da6c3e28(v4, v1) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v4, 0) - } - case 3513050253 { - let v5 := $read_inner__StorPtr_Outer___dab28b9da6c3e28(v1) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v5, 0) - } - case 2154770637 { - let v6 := calldataload(4) - let v7 := $mem_read(v6) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v7, 0) - } - default { - return(0, 0) - } - } - function $stor_ptr_stor__Evm_hef0af3106e109414_Outer_hccd04e332bd35653__177c3c9a6f7ae368($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Outer_hccd04e332bd35653__f44d0100de7cf929($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Outer_hccd04e332bd35653__f44d0100de7cf929($raw) -> ret { - ret := $raw - leave - } - function $write_inner__StorPtr_Outer___dab28b9da6c3e28($value, $outer) { - sstore($outer, $value) - leave - } - $runtime__StorPtr_Evm___207f35a85ac4062e() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/newtype_field_mut_method_call.fe b/crates/codegen/tests/fixtures/newtype_field_mut_method_call.fe deleted file mode 100644 index 48fde2316b..0000000000 --- a/crates/codegen/tests/fixtures/newtype_field_mut_method_call.fe +++ /dev/null @@ -1,36 +0,0 @@ -struct Counter { - value: u256, - pad: u256, -} - -impl Counter { - fn bump(mut self) { - self.value += 1 - } -} - -struct WrapCounter { - inner: Counter, -} - -impl WrapCounter { - fn bump(mut self) { - self.inner.value += 1 - } -} - -struct Container { - pad: u256, - w: WrapCounter, -} - -pub fn newtype_field_mut_method_call(x: u256) -> u256 { - let mut c = Container { - pad: 0, - w: WrapCounter { - inner: Counter { value: x, pad: 0 }, - }, - } - c.w.bump() - c.w.inner.value -} diff --git a/crates/codegen/tests/fixtures/newtype_field_mut_method_call.snap b/crates/codegen/tests/fixtures/newtype_field_mut_method_call.snap deleted file mode 100644 index b4a0999eb0..0000000000 --- a/crates/codegen/tests/fixtures/newtype_field_mut_method_call.snap +++ /dev/null @@ -1,40 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/newtype_field_mut_method_call.fe ---- -function $newtype_field_mut_method_call($x) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $x) - mstore(add(v0, 32), 0) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 96)) - mstore(v1, 0) - let v2 := v0 - mstore(add(v1, 32), mload(v2)) - mstore(add(v1, 64), mload(add(v2, 32))) - let v3 := v1 - $wrapcounter_hbcbd3a74a267488b_bump(add(v3, 32)) - let v4 := mload(add(v3, 32)) - ret := v4 - leave -} -function $counter_h872958864d1ad471_bump($self) { - let v0 := $self - let v1 := mload(v0) - mstore(v0, add(v1, 1)) - leave -} -function $wrapcounter_hbcbd3a74a267488b_bump($self) { - let v0 := $self - let v1 := mload(v0) - mstore(v0, add(v1, 1)) - leave -} diff --git a/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.fe b/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.fe deleted file mode 100644 index 02fca54fe2..0000000000 --- a/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.fe +++ /dev/null @@ -1,27 +0,0 @@ -msg Msg { - #[selector = 1] - Bump -> u256 -} - -struct Wrap { - inner: u256, -} - -fn bump() uses (w: mut Wrap) { - w.inner += 1 -} - -pub contract NewtypeByPlaceEffectArg { - x: u256 - w: Wrap - - init() {} - - recv Msg { - Bump -> u256 uses (mut w, mut x) { - bump() - x += 1 - x - } - } -} diff --git a/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.snap b/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.snap deleted file mode 100644 index 617536eabe..0000000000 --- a/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.snap +++ /dev/null @@ -1,343 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/newtype_storage_byplace_effect_arg.fe ---- -object "NewtypeByPlaceEffectArg" { - code { - function $__NewtypeByPlaceEffectArg_init() { - let v0 := $init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(0, 0) - let v1 := $init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(0, 1) - let v2 := dataoffset("NewtypeByPlaceEffectArg_deployed") - let v3 := datasize("NewtypeByPlaceEffectArg_deployed") - let v4 := datasize("NewtypeByPlaceEffectArg") - let v5 := codesize() - let v6 := lt(v5, v4) - if v6 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - let v7 := sub(v5, v4) - let v8 := mload(64) - if iszero(v8) { - v8 := 0x80 - } - mstore(64, add(v8, v7)) - codecopy(v8, v4, v7) - let v9 := mload(0x40) - if iszero(v9) { - v9 := 0x80 - } - mstore(0x40, add(v9, 64)) - mstore(v9, v8) - mstore(add(v9, 32), v7) - let v10 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v9) - $__NewtypeByPlaceEffectArg_init_contract() - codecopy(0, v2, v3) - return(0, v3) - } - function $__NewtypeByPlaceEffectArg_init_contract() { - leave - } - function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - let v1 := $input - mstore(v0, mload(v1)) - mstore(add(v0, 32), mload(add(v1, 32))) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(0, $slot) - ret := v0 - leave - } - function $init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($self, $slot) - ret := v0 - leave - } - function $init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483($self, $slot) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 128)) - let v2 := v0 - mstore(v1, mload(v2)) - mstore(add(v1, 32), mload(add(v2, 32))) - mstore(add(v1, 64), mload(add(v2, 64))) - mstore(add(v1, 96), 0) - ret := v1 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { - ret := $raw - leave - } - $__NewtypeByPlaceEffectArg_init() - } - - object "NewtypeByPlaceEffectArg_deployed" { - code { - function $__NewtypeByPlaceEffectArg_recv_0_0($args, $w, $x) -> ret { - $bump__StorPtr_Wrap___5036bb3e02939b91($w) - let v0 := sload($x) - sstore($x, add(v0, 1)) - let v1 := sload($x) - ret := v1 - leave - } - function $__NewtypeByPlaceEffectArg_runtime() { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483(0, 0) - let v1 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd(0, 1) - let v2 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v3 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v2 - case 1 { - $bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v4 := $__NewtypeByPlaceEffectArg_recv_0_0(0, v1, v0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(0, v4) - } - default { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - } - function $bump__StorPtr_Wrap___5036bb3e02939b91($w) { - let v0 := sload($w) - sstore($w, add(v0, 1)) - leave - } - function $bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes($self, $ptr, $len) { - return($ptr, $len) - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> ret { - let v0 := $solencoder_h1b9228b90dad6928_new() - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave - } - function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { - ret := $raw - leave - } - function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - $__NewtypeByPlaceEffectArg_runtime() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.fe b/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.fe deleted file mode 100644 index 5b56097bcc..0000000000 --- a/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.fe +++ /dev/null @@ -1,28 +0,0 @@ -msg Msg { - #[selector = 1] - Bump -> u256 -} - -struct Wrap { - inner: u256, -} - -impl Wrap { - fn bump(mut self) { - self.inner += 1 - } -} - -pub contract NewtypeStorageFieldMutMethodCall { - pad: u256 - w: Wrap - - init() {} - - recv Msg { - Bump -> u256 uses (mut w) { - w.bump() - w.inner - } - } -} diff --git a/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.snap b/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.snap deleted file mode 100644 index c664bf37e6..0000000000 --- a/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.snap +++ /dev/null @@ -1,343 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/newtype_storage_field_mut_method_call.fe ---- -object "NewtypeStorageFieldMutMethodCall" { - code { - function $__NewtypeStorageFieldMutMethodCall_init() { - let v0 := $init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(0, 0) - let v1 := $init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(0, 1) - let v2 := dataoffset("NewtypeStorageFieldMutMethodCall_deployed") - let v3 := datasize("NewtypeStorageFieldMutMethodCall_deployed") - let v4 := datasize("NewtypeStorageFieldMutMethodCall") - let v5 := codesize() - let v6 := lt(v5, v4) - if v6 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - let v7 := sub(v5, v4) - let v8 := mload(64) - if iszero(v8) { - v8 := 0x80 - } - mstore(64, add(v8, v7)) - codecopy(v8, v4, v7) - let v9 := mload(0x40) - if iszero(v9) { - v9 := 0x80 - } - mstore(0x40, add(v9, 64)) - mstore(v9, v8) - mstore(add(v9, 32), v7) - let v10 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v9) - $__NewtypeStorageFieldMutMethodCall_init_contract() - codecopy(0, v2, v3) - return(0, v3) - } - function $__NewtypeStorageFieldMutMethodCall_init_contract() { - leave - } - function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - let v1 := $input - mstore(v0, mload(v1)) - mstore(add(v0, 32), mload(add(v1, 32))) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(0, $slot) - ret := v0 - leave - } - function $init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($self, $slot) - ret := v0 - leave - } - function $init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483($self, $slot) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 128)) - let v2 := v0 - mstore(v1, mload(v2)) - mstore(add(v1, 32), mload(add(v2, 32))) - mstore(add(v1, 64), mload(add(v2, 64))) - mstore(add(v1, 96), 0) - ret := v1 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { - ret := $raw - leave - } - $__NewtypeStorageFieldMutMethodCall_init() - } - - object "NewtypeStorageFieldMutMethodCall_deployed" { - code { - function $__NewtypeStorageFieldMutMethodCall_recv_0_0($args, $w) -> ret { - let v0 := sload($w) - $wrap_haf9e70905fcbd513_bump_stor_arg0_root_stor($w) - let v1 := sload($w) - ret := v1 - leave - } - function $__NewtypeStorageFieldMutMethodCall_runtime() { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483(0, 0) - let v1 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd(0, 1) - let v2 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v3 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v2 - case 1 { - $bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v4 := $__NewtypeStorageFieldMutMethodCall_recv_0_0(0, v1) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(0, v4) - } - default { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - } - function $bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes($self, $ptr, $len) { - return($ptr, $len) - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> ret { - let v0 := $solencoder_h1b9228b90dad6928_new() - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave - } - function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { - ret := $raw - leave - } - function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - function $wrap_haf9e70905fcbd513_bump_stor_arg0_root_stor($self) { - let v0 := $self - let v1 := sload($self) - sstore($self, add(v1, 1)) - leave - } - $__NewtypeStorageFieldMutMethodCall_runtime() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/newtype_u8_word_conversion.fe b/crates/codegen/tests/fixtures/newtype_u8_word_conversion.fe deleted file mode 100644 index 387d0c3a89..0000000000 --- a/crates/codegen/tests/fixtures/newtype_u8_word_conversion.fe +++ /dev/null @@ -1,14 +0,0 @@ -struct WrapU8 { - inner: u8, -} - -struct Container { - w: WrapU8, - pad: u256, -} - -pub fn newtype_u8_roundtrip(x: u8) -> u8 { - let c = Container { w: WrapU8 { inner: x }, pad: 0 } - let w = ref c.w - w.inner -} diff --git a/crates/codegen/tests/fixtures/newtype_u8_word_conversion.snap b/crates/codegen/tests/fixtures/newtype_u8_word_conversion.snap deleted file mode 100644 index def50d5d5e..0000000000 --- a/crates/codegen/tests/fixtures/newtype_u8_word_conversion.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/newtype_u8_word_conversion.fe ---- -function $newtype_u8_roundtrip($x) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, and($x, 0xff)) - mstore(add(v0, 32), 0) - let v1 := v0 - let v2 := and(mload(v1), 0xff) - let v3 := v2 - ret := v3 - leave -} diff --git a/crates/codegen/tests/fixtures/newtype_word_mut_method_call.fe b/crates/codegen/tests/fixtures/newtype_word_mut_method_call.fe deleted file mode 100644 index 24ccbb8896..0000000000 --- a/crates/codegen/tests/fixtures/newtype_word_mut_method_call.fe +++ /dev/null @@ -1,16 +0,0 @@ -struct Wrap { - inner: u256, -} - -impl Wrap { - fn bump(mut own self) -> Self { - self.inner += 1 - self - } -} - -pub fn newtype_word_mut_method_call(x: u256) -> u256 { - let w = Wrap { inner: x } - let w = w.bump() - w.inner -} diff --git a/crates/codegen/tests/fixtures/newtype_word_mut_method_call.snap b/crates/codegen/tests/fixtures/newtype_word_mut_method_call.snap deleted file mode 100644 index 475147aa46..0000000000 --- a/crates/codegen/tests/fixtures/newtype_word_mut_method_call.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/newtype_word_mut_method_call.fe ---- -function $newtype_word_mut_method_call($x) -> ret { - let v0 := $x - let v1 := $wrap_haf9e70905fcbd513_bump(v0) - ret := v1 - leave -} -function $wrap_haf9e70905fcbd513_bump($self) -> ret { - $self := add($self, 1) - ret := $self - leave -} diff --git a/crates/codegen/tests/fixtures/range_bounds.fe b/crates/codegen/tests/fixtures/range_bounds.fe deleted file mode 100644 index ccdb56a9c2..0000000000 --- a/crates/codegen/tests/fixtures/range_bounds.fe +++ /dev/null @@ -1,31 +0,0 @@ -pub fn sum_const() -> usize { - let mut sum: usize = 0 - for i in 0..4 { - sum = sum + i - } - sum -} - -pub fn sum_dynamic_end(end: usize) -> usize { - let mut sum: usize = 0 - for i in 0..end { - sum = sum + i - } - sum -} - -pub fn sum_dynamic_start(start: usize) -> usize { - let mut sum: usize = 0 - for i in start..4 { - sum = sum + i - } - sum -} - -pub fn sum_dynamic(start: usize, end: usize) -> usize { - let mut sum: usize = 0 - for i in start..end { - sum = sum + i - } - sum -} diff --git a/crates/codegen/tests/fixtures/range_bounds.snap b/crates/codegen/tests/fixtures/range_bounds.snap deleted file mode 100644 index 49c4a65311..0000000000 --- a/crates/codegen/tests/fixtures/range_bounds.snap +++ /dev/null @@ -1,138 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/range_bounds.fe ---- -function $sum_const() -> ret { - let v0 := 0 - let v1 := 0 - let v2 := $range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_len__0_4__f9605efabd18106c(0) - for { } lt(v1, v2) { v1 := add(v1, 1) } { - let v3 := $range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c(0, v1) - let v4 := v3 - v0 := add(v0, v4) - } - ret := v0 - leave -} -function $sum_dynamic_end($end) -> ret { - let v0 := 0 - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 32)) - mstore(v1, $end) - let v2 := 0 - let v3 := $range_known_const_s__usize___unknown__h4e84f6b6b8307914_seq_ha637d2df505bccf2_len__0__fc6647014fb554e5(v1) - for { } lt(v2, v3) { v2 := add(v2, 1) } { - let v4 := $range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c(v1, v2) - let v5 := v4 - v0 := add(v0, v5) - } - ret := v0 - leave -} -function $sum_dynamic_start($start) -> ret { - let v0 := 0 - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 32)) - mstore(v1, $start) - let v2 := 0 - let v3 := $range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_len__4__f248ae0e02044d7e(v1) - for { } lt(v2, v3) { v2 := add(v2, 1) } { - let v4 := $range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e(v1, v2) - let v5 := v4 - v0 := add(v0, v5) - } - ret := v0 - leave -} -function $sum_dynamic($start, $end) -> ret { - let v0 := 0 - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, $start) - mstore(add(v1, 32), $end) - let v2 := 0 - let v3 := $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len(v1) - for { } lt(v2, v3) { v2 := add(v2, 1) } { - let v4 := $range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e(v1, v2) - let v5 := v4 - v0 := add(v0, v5) - } - ret := v0 - leave -} -function $range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_len__0_4__f9605efabd18106c($self) -> ret { - let v0 := 0 - let v1 := lt(4, 0) - if v1 { - v0 := 0 - } - if iszero(v1) { - v0 := sub(4, 0) - } - ret := v0 - leave -} -function $range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c($self, $i) -> ret { - ret := add(0, $i) - leave -} -function $range_known_const_s__usize___unknown__h4e84f6b6b8307914_seq_ha637d2df505bccf2_len__0__fc6647014fb554e5($self) -> ret { - let v0 := 0 - let v1 := mload($self) - let v2 := lt(v1, 0) - if v2 { - v0 := 0 - } - if iszero(v2) { - let v3 := mload($self) - v0 := sub(v3, 0) - } - ret := v0 - leave -} -function $range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_len__4__f248ae0e02044d7e($self) -> ret { - let v0 := 0 - let v1 := mload($self) - let v2 := lt(4, v1) - if v2 { - v0 := 0 - } - if iszero(v2) { - let v3 := mload($self) - v0 := sub(4, v3) - } - ret := v0 - leave -} -function $range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e($self, $i) -> ret { - let v0 := mload($self) - ret := add(v0, $i) - leave -} -function $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len($self) -> ret { - let v0 := 0 - let v1 := mload(add($self, 32)) - let v2 := mload($self) - let v3 := lt(v1, v2) - if v3 { - v0 := 0 - } - if iszero(v3) { - let v4 := mload(add($self, 32)) - let v5 := mload($self) - v0 := sub(v4, v5) - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/raw_log_emit.fe b/crates/codegen/tests/fixtures/raw_log_emit.fe deleted file mode 100644 index c6be4b37b2..0000000000 --- a/crates/codegen/tests/fixtures/raw_log_emit.fe +++ /dev/null @@ -1,10 +0,0 @@ -use std::evm::{Evm, Log} - -struct Data { - a: u256, -} - -fn raw_emit(evm: mut Evm) { - let data = Data { a: 1 }; - evm.log0(offset: core::addr_of(data), len: core::size_of()) -} diff --git a/crates/codegen/tests/fixtures/raw_log_emit.snap b/crates/codegen/tests/fixtures/raw_log_emit.snap deleted file mode 100644 index a07108f1f2..0000000000 --- a/crates/codegen/tests/fixtures/raw_log_emit.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/raw_log_emit.fe ---- -function $raw_emit($evm) { - let v0 := 1 - let v1 := v0 - $evm_hef0af3106e109414_log_h22d1a10952034bae_log0($evm, v1, 32) - leave -} -function $evm_hef0af3106e109414_log_h22d1a10952034bae_log0($self, $offset, $len) { - log0($offset, $len) - leave -} diff --git a/crates/codegen/tests/fixtures/ret.fe b/crates/codegen/tests/fixtures/ret.fe deleted file mode 100644 index 84fca91b83..0000000000 --- a/crates/codegen/tests/fixtures/ret.fe +++ /dev/null @@ -1,17 +0,0 @@ -pub fn retfoo(b1: bool, x: u64) -> u64 { - if b1 { - return 0 - } - - if x < 5 { - return 1 - } - - let y = x - 1 - - if y == 42 { - return 2 - } - - y + 1 -} diff --git a/crates/codegen/tests/fixtures/ret.snap b/crates/codegen/tests/fixtures/ret.snap deleted file mode 100644 index 39c946feec..0000000000 --- a/crates/codegen/tests/fixtures/ret.snap +++ /dev/null @@ -1,32 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/ret.fe ---- -function $retfoo($b1, $x) -> ret { - let v0 := $b1 - if v0 { - ret := 0 - leave - } - if iszero(v0) { - let v1 := lt($x, 5) - if v1 { - ret := 1 - leave - } - if iszero(v1) { - let v2 := sub($x, 1) - let v3 := eq(v2, 42) - if v3 { - ret := 2 - leave - } - if iszero(v3) { - ret := add(v2, 1) - leave - } - } - } -} diff --git a/crates/codegen/tests/fixtures/revert.fe b/crates/codegen/tests/fixtures/revert.fe deleted file mode 100644 index 50b2205b3c..0000000000 --- a/crates/codegen/tests/fixtures/revert.fe +++ /dev/null @@ -1,6 +0,0 @@ -use std::evm::{RawMem, RawOps} - -fn fail() uses (ops: mut RawOps) { - ops.mstore(0, 42) - ops.revert(0, 32) -} diff --git a/crates/codegen/tests/fixtures/revert.snap b/crates/codegen/tests/fixtures/revert.snap deleted file mode 100644 index 63b63ade45..0000000000 --- a/crates/codegen/tests/fixtures/revert.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/revert.fe ---- -function $fail__Evm_hef0af3106e109414__3af54274b2985741($ops) { - mstore(0, 42) - revert(0, 32) -} diff --git a/crates/codegen/tests/fixtures/runtime_constructs/fe.toml b/crates/codegen/tests/fixtures/runtime_constructs/fe.toml deleted file mode 100644 index 84680d62b9..0000000000 --- a/crates/codegen/tests/fixtures/runtime_constructs/fe.toml +++ /dev/null @@ -1,4 +0,0 @@ -[ingot] -name = "runtime_constructs" -version = "0.1.0" - diff --git a/crates/codegen/tests/fixtures/runtime_constructs/src/child.fe b/crates/codegen/tests/fixtures/runtime_constructs/src/child.fe deleted file mode 100644 index 8cba035c13..0000000000 --- a/crates/codegen/tests/fixtures/runtime_constructs/src/child.fe +++ /dev/null @@ -1,15 +0,0 @@ -use std::evm::{Evm, RawMem} - -#[contract_init(Child)] -pub fn child_init() uses (evm: mut Evm) { - let len = evm.code_region_len(child_runtime) - let offset = evm.code_region_offset(child_runtime) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(Child)] -pub fn child_runtime() uses (evm: mut Evm) { - evm.mstore(0, 0xbeef) - evm.return_data(0, 32) -} diff --git a/crates/codegen/tests/fixtures/runtime_constructs/src/lib.fe b/crates/codegen/tests/fixtures/runtime_constructs/src/lib.fe deleted file mode 100644 index 950ab00d81..0000000000 --- a/crates/codegen/tests/fixtures/runtime_constructs/src/lib.fe +++ /dev/null @@ -1,29 +0,0 @@ -use std::evm::{Create, Evm, RawMem} - -#[contract_init(Parent)] -fn init() uses (evm: mut Evm) { - let len = evm.code_region_len(runtime) - let offset = evm.code_region_offset(runtime) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(Parent)] -fn runtime() uses (evm: mut Evm) { - let len = evm.code_region_len(child::child_init) - let offset = evm.code_region_offset(child::child_init) - let dest = with (RawMem = evm) { allocate(bytes: len) } - evm.codecopy(dest, offset, len) - let addr = evm.create2_raw(value: 0, offset: dest, len: len, salt: 0x1234) - evm.mstore(0, addr.inner) - evm.return_data(0, 32) -} - -fn allocate(bytes: u256) -> u256 uses (mem: mut RawMem) { - let mut ptr = mem.mload(0x40) - if ptr == 0 { - ptr = 0x60 - } - mem.mstore(0x40, ptr + bytes) - ptr -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/alloc.snap b/crates/codegen/tests/fixtures/sonatina_ir/alloc.snap deleted file mode 100644 index 3dab31ca6f..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/alloc.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/alloc.fe ---- -target = "evm-ethereum-osaka" - -func public %bump(v0.i256) -> i256 { - block0: - v2.*i8 = evm_malloc v0; - v3.i256 = ptr_to_int v2 i256; - return v3; -} - -func public %bump_const() -> i256 { - block0: - v2.*i8 = evm_malloc 64.i256; - v3.i256 = ptr_to_int v2 i256; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %bump 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/alloc_self_assign.snap b/crates/codegen/tests/fixtures/sonatina_ir/alloc_self_assign.snap deleted file mode 100644 index 1f3fb575aa..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/alloc_self_assign.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/alloc_self_assign.fe ---- -target = "evm-ethereum-osaka" - -func public %bump_self_assign(v0.i256) -> i256 { - block0: - v2.*i8 = evm_malloc v0; - v3.i256 = ptr_to_int v2 i256; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %bump_self_assign 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/arg_bindings.snap b/crates/codegen/tests/fixtures/sonatina_ir/arg_bindings.snap deleted file mode 100644 index 45647db50b..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/arg_bindings.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/arg_bindings.fe ---- -target = "evm-ethereum-osaka" - -func public %arg_bindings(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %arg_bindings 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/array_literal.snap b/crates/codegen/tests/fixtures/sonatina_ir/array_literal.snap deleted file mode 100644 index adc1f7e495..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/array_literal.snap +++ /dev/null @@ -1,32 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/array_literal.fe ---- -target = "evm-ethereum-osaka" - -global private const [i8; 2048] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64]; - -func public %large_array_literal() -> i256 { - block0: - v2.*i8 = evm_malloc 2048.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %large_array_literal; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - data $__fe_const_data_0; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/array_mut.snap b/crates/codegen/tests/fixtures/sonatina_ir/array_mut.snap deleted file mode 100644 index 6bc150d9d7..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/array_mut.snap +++ /dev/null @@ -1,51 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/array_mut.fe ---- -target = "evm-ethereum-osaka" - -func public %array_mut(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 128.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i8 = trunc v0 i8; - v6.i256 = zext v5 i256; - v7.*[i256; 4] = int_to_ptr v4 *[i256; 4]; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v6 i256; - v11.i8 = trunc 2.i256 i8; - v12.i256 = zext v11 i256; - v13.*[i256; 4] = int_to_ptr v4 *[i256; 4]; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v18.i8 = trunc 3.i256 i8; - v19.i256 = zext v18 i256; - v20.*[i256; 4] = int_to_ptr v4 *[i256; 4]; - v21.*i256 = gep v20 0.i256 2.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v19 i256; - v24.i8 = trunc 4.i256 i8; - v25.i256 = zext v24 i256; - v26.*[i256; 4] = int_to_ptr v4 *[i256; 4]; - v27.*i256 = gep v26 0.i256 3.i256; - v28.i256 = ptr_to_int v27 i256; - mstore v28 v25 i256; - return v4; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %array_mut 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/aug_assign.snap b/crates/codegen/tests/fixtures/sonatina_ir/aug_assign.snap deleted file mode 100644 index 36a037a6fd..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/aug_assign.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/aug_assign.fe ---- -target = "evm-ethereum-osaka" - -func public %aug_assign(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - v5.i256 = mul v3 2.i256; - v6.i256 = evm_udiv v5 2.i256; - return v6; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %aug_assign 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/aug_assign_bit_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/aug_assign_bit_ops.snap deleted file mode 100644 index 859273664a..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/aug_assign_bit_ops.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/aug_assign_bit_ops.fe ---- -target = "evm-ethereum-osaka" - -func public %aug_assign_bit_ops(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = evm_exp v0 v1; - v5.i256 = shl 3.i256 v3; - v7.i256 = shr 1.i256 v5; - v9.i256 = and v7 255.i256; - v10.i256 = or v9 1.i256; - v12.i256 = xor v10 2.i256; - return v12; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %aug_assign_bit_ops 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/bit_and.snap b/crates/codegen/tests/fixtures/sonatina_ir/bit_and.snap deleted file mode 100644 index b0f36434bd..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/bit_and.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/bit_and.fe ---- -target = "evm-ethereum-osaka" - -func public %bit_and() -> i256 { - block0: - v3.i256 = and 1.i256 2.i256; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %bit_and; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/bit_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/bit_ops.snap deleted file mode 100644 index 244dfa1a6b..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/bit_ops.snap +++ /dev/null @@ -1,59 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/bit_ops.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256, i256, i256, i256}; - -func public %bit_ops(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = and v0 v1; - v4.i256 = or v0 v1; - v5.i256 = xor v0 v1; - v7.i256 = shl 8.i256 v0; - v9.i256 = shr 2.i256 v0; - v11.*i8 = evm_malloc 160.i256; - v12.i256 = ptr_to_int v11 i256; - v13.*@__fe_tuple_0 = int_to_ptr v12 *@__fe_tuple_0; - v14.*i256 = gep v13 0.i256 0.i256; - v15.i256 = ptr_to_int v14 i256; - mstore v15 v3 i256; - v16.*@__fe_tuple_0 = int_to_ptr v12 *@__fe_tuple_0; - v18.*i256 = gep v16 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v4 i256; - v20.*@__fe_tuple_0 = int_to_ptr v12 *@__fe_tuple_0; - v21.*i256 = gep v20 0.i256 2.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v5 i256; - v23.*@__fe_tuple_0 = int_to_ptr v12 *@__fe_tuple_0; - v25.*i256 = gep v23 0.i256 3.i256; - v26.i256 = ptr_to_int v25 i256; - mstore v26 v7 i256; - v27.*@__fe_tuple_0 = int_to_ptr v12 *@__fe_tuple_0; - v29.*i256 = gep v27 0.i256 4.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 v9 i256; - return v12; -} - -func public %pow_op(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = evm_exp v0 v1; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %bit_ops 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/bitnot.snap b/crates/codegen/tests/fixtures/sonatina_ir/bitnot.snap deleted file mode 100644 index 52bfe69261..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/bitnot.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/bitnot.fe ---- -target = "evm-ethereum-osaka" - -func public %bit_not(v0.i256) -> i256 { - block0: - v2.i256 = not v0; - return v2; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %bit_not 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/block_expr.snap b/crates/codegen/tests/fixtures/sonatina_ir/block_expr.snap deleted file mode 100644 index b8446b4f9e..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/block_expr.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/block_expr.fe ---- -target = "evm-ethereum-osaka" - -func public %block_expr() -> i256 { - block0: - v3.i256 = add 1.i256 2.i256; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %block_expr; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/bool_literal.snap b/crates/codegen/tests/fixtures/sonatina_ir/bool_literal.snap deleted file mode 100644 index 05e846c2aa..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/bool_literal.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/bool_literal.fe ---- -target = "evm-ethereum-osaka" - -func public %bool_literal() -> i256 { - block0: - return 1.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %bool_literal; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/borrow_handles_readback.snap b/crates/codegen/tests/fixtures/sonatina_ir/borrow_handles_readback.snap deleted file mode 100644 index 45fa8ef9cd..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/borrow_handles_readback.snap +++ /dev/null @@ -1,29 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/borrow_handles_readback.fe ---- -target = "evm-ethereum-osaka" - -func public %borrow_handles_readback() -> i256 { - block0: - v2.*i8 = evm_malloc 32.i256; - v3.i256 = ptr_to_int v2 i256; - mstore v3 0.i256 i256; - mstore v3 5.i256 i256; - return 5.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %borrow_handles_readback; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/borrow_storage_field_handle.snap b/crates/codegen/tests/fixtures/sonatina_ir/borrow_storage_field_handle.snap deleted file mode 100644 index 88351587fd..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/borrow_storage_field_handle.snap +++ /dev/null @@ -1,29 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/borrow_storage_field_handle.fe ---- -target = "evm-ethereum-osaka" - -func private %borrow_storage_field_handle__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256) -> i256 { - block0: - v2.i256 = evm_sload v0; - v4.i256 = add v2 1.i256; - evm_sstore v0 v4; - v5.i256 = evm_sload v0; - return v5; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %borrow_storage_field_handle__StorPtr_CoinStore___ba1c0d0726e89ba2 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/by_ref_trait_provider_storage_bug.snap b/crates/codegen/tests/fixtures/sonatina_ir/by_ref_trait_provider_storage_bug.snap deleted file mode 100644 index 49854a167c..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/by_ref_trait_provider_storage_bug.snap +++ /dev/null @@ -1,518 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Pair_0 = {i256, i256}; -type @__fe_MemoryBytes_1 = {i256, i256}; -type @__fe_tuple_2 = {i256, i256}; -type @__fe_Cursor_3 = {@__fe_MemoryBytes_1, i256}; -type @__fe_SolDecoder_4 = {@__fe_Cursor_3, i256}; -type @__fe_SolEncoder_5 = {i256, i256, i256}; -type @__fe_CallData_6 = {i256}; -type @__fe_Cursor_7 = {@__fe_CallData_6, i256}; -type @__fe_SolDecoder_8 = {@__fe_Cursor_7, i256}; - -func private %pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum(v0.i256) -> i256 { - block0: - v2.*@__fe_Pair_0 = int_to_ptr v0 *@__fe_Pair_0; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_Pair_0 = int_to_ptr v0 *@__fe_Pair_0; - v8.*i256 = gep v6 0.i256 1.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.i256 = add v5 v10; - return v11; -} - -func private %__ByRefTraitProviderStorageBug_init_contract(v0.i256) { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v6.*@__fe_Pair_0 = int_to_ptr v4 *@__fe_Pair_0; - v7.*i256 = gep v6 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - mstore v8 40.i256 i256; - v10.*@__fe_Pair_0 = int_to_ptr v4 *@__fe_Pair_0; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 2.i256 i256; - v14.*@__fe_Pair_0 = int_to_ptr v4 *@__fe_Pair_0; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - evm_sstore v0 v17; - v18.*@__fe_Pair_0 = int_to_ptr v4 *@__fe_Pair_0; - v19.*i256 = gep v18 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - v21.i256 = mload v20 i256; - v22.i256 = add v0 1.i256; - evm_sstore v22 v21; - return; -} - -func private %__ByRefTraitProviderStorageBug_recv_0_0(v0.i256) -> i256 { - block0: - v2.i256 = call %use_ctx_eff0_stor__Pair_h956dff41e88ee341__acec41afdc898140 v0; - return v2; -} - -func private %__ByRefTraitProviderStorageBug_init() { - block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 0.i256; - v2.i256 = sym_addr &__ByRefTraitProviderStorageBug_runtime; - v3.i256 = sym_size &__ByRefTraitProviderStorageBug_runtime; - v4.i256 = sym_size .; - v5.i256 = evm_code_size; - v6.i1 = lt v5 v4; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v11.i256 = sub v5 v4; - v12.i256 = sub v5 v4; - v13.*i8 = evm_malloc v12; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = sub v5 v4; - evm_code_copy v14 v4 v15; - v17.*i8 = evm_malloc 64.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*@__fe_MemoryBytes_1 = int_to_ptr v18 *@__fe_MemoryBytes_1; - v20.*i256 = gep v19 0.i256 0.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v14 i256; - v22.i256 = sub v5 v4; - v23.*@__fe_MemoryBytes_1 = int_to_ptr v18 *@__fe_MemoryBytes_1; - v25.*i256 = gep v23 0.i256 1.i256; - v26.i256 = ptr_to_int v25 i256; - mstore v26 v22 i256; - v27.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v18; - call %__ByRefTraitProviderStorageBug_init_contract v1; - evm_code_copy 0.i256 v2 v3; - evm_return 0.i256 v3; -} - -func private %__ByRefTraitProviderStorageBug_runtime() { - block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 0.i256 0.i256; - v2.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v3.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v5.i1 = eq v2 1.i256; - br v5 block2 block1; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - call %go_h50739b8917c22b82_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v3; - v8.i256 = call %__ByRefTraitProviderStorageBug_recv_0_0 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v8; - evm_invalid; -} - -func private %use_ctx_eff0_stor__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256) -> i256 { - block0: - v2.i256 = call %pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum_stor_arg0_root_stor v0; - return v2; -} - -func private %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 v0 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { - block0: - evm_revert 0.i256 0.i256; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 v1; - return v3; -} - -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; - evm_invalid; - - block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; -} - -func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; -} - -func private %go_h50739b8917c22b82_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_2 = int_to_ptr v6 *@__fe_tuple_2; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_2 = int_to_ptr v6 *@__fe_tuple_2; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func private %pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum_stor_arg0_root_stor(v0.i256) -> i256 { - block0: - v2.i256 = evm_sload v0; - v4.i256 = add v0 1.i256; - v5.i256 = evm_sload v4; - v6.i256 = add v2 v5; - return v6; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.*@__fe_SolDecoder_4 = int_to_ptr v5 *@__fe_SolDecoder_4; - v11.*i256 = gep v10 0.i256 0.i256 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - v13.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; - v15.*i256 = gep v13 0.i256 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v18.*@__fe_SolDecoder_4 = int_to_ptr v5 *@__fe_SolDecoder_4; - v19.*i256 = gep v18 0.i256 0.i256 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v17 i256; - v21.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; - v22.*i256 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.*@__fe_SolDecoder_4 = int_to_ptr v5 *@__fe_SolDecoder_4; - v26.*i256 = gep v25 0.i256 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.*@__fe_SolDecoder_4 = int_to_ptr v5 *@__fe_SolDecoder_4; - v29.*i256 = gep v28 0.i256 1.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 0.i256 i256; - return v5; -} - -func private %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { - block0: - return 0.i256; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; - return v5; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { - block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { - block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i1 = eq v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - v11.*i8 = evm_malloc v1; - v12.i256 = ptr_to_int v11 i256; - v14.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v17.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v12 i256; - v21.i256 = add v12 v1; - v22.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - jump block2; - - block2: - v27.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - return v30; -} - -func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { - block0: - v2.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v12.*i8 = evm_malloc 64.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_tuple_2 = int_to_ptr v13 *@__fe_tuple_2; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v5 i256; - v17.i256 = sub v10 v5; - v18.*@__fe_tuple_2 = int_to_ptr v13 *@__fe_tuple_2; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v17 i256; - return v13; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { - block0: - evm_return v1 v2; -} - -func public %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_1 = int_to_ptr v0 *@__fe_MemoryBytes_1; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Cursor_3 = int_to_ptr v4 *@__fe_Cursor_3; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 v8 i256; - v12.*@__fe_MemoryBytes_1 = int_to_ptr v0 *@__fe_MemoryBytes_1; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.*@__fe_Cursor_3 = int_to_ptr v4 *@__fe_Cursor_3; - v18.*i256 = gep v17 0.i256 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v16 i256; - v20.*@__fe_Cursor_3 = int_to_ptr v4 *@__fe_Cursor_3; - v21.*i256 = gep v20 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 0.i256 i256; - return v4; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256) -> i256 { - block0: - return v0; -} - -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_7 = int_to_ptr v4 *@__fe_Cursor_7; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*@__fe_SolDecoder_8 = int_to_ptr v7 *@__fe_SolDecoder_8; - v13.*i256 = gep v12 0.i256 0.i256 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v11 i256; - v15.*@__fe_Cursor_7 = int_to_ptr v4 *@__fe_Cursor_7; - v17.*i256 = gep v15 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_8 = int_to_ptr v7 *@__fe_SolDecoder_8; - v21.*i256 = gep v20 0.i256 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v19 i256; - v23.*@__fe_SolDecoder_8 = int_to_ptr v7 *@__fe_SolDecoder_8; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v1 i256; - return v7; -} - -func public %solencoder_h1b9228b90dad6928_new() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_5 = int_to_ptr v3 *@__fe_SolEncoder_5; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - mstore v6 0.i256 i256; - v7.*@__fe_SolEncoder_5 = int_to_ptr v3 *@__fe_SolEncoder_5; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 0.i256 i256; - v11.*@__fe_SolEncoder_5 = int_to_ptr v3 *@__fe_SolEncoder_5; - v13.*i256 = gep v11 0.i256 2.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 0.i256 i256; - return v3; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - -func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func public %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_7 = int_to_ptr v4 *@__fe_Cursor_7; - v6.*@__fe_CallData_6 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 v0 i256; - v8.*@__fe_Cursor_7 = int_to_ptr v4 *@__fe_Cursor_7; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 0.i256 i256; - return v4; -} - -func public %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Cursor_7 = int_to_ptr v0 *@__fe_Cursor_7; - v4.*@__fe_CallData_6 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v8.*i8 = evm_malloc 64.i256; - v9.i256 = ptr_to_int v8 i256; - v10.*@__fe_Cursor_7 = int_to_ptr v9 *@__fe_Cursor_7; - v11.*@__fe_CallData_6 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v6 i256; - v13.*@__fe_Cursor_7 = int_to_ptr v9 *@__fe_Cursor_7; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v1 i256; - return v9; -} - - -object @ByRefTraitProviderStorageBug { - section init { - entry %__ByRefTraitProviderStorageBug_init; - embed .runtime as &__ByRefTraitProviderStorageBug_runtime; - } - section runtime { - entry %__ByRefTraitProviderStorageBug_runtime; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/caller.snap b/crates/codegen/tests/fixtures/sonatina_ir/caller.snap deleted file mode 100644 index 59e4dab16f..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/caller.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/caller.fe ---- -target = "evm-ethereum-osaka" - -func private %who_called__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) -> i256 { - block0: - v2.i256 = evm_caller; - return v2; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %who_called__Evm_hef0af3106e109414__3af54274b2985741 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/cast_u8_usize_cmp.snap b/crates/codegen/tests/fixtures/sonatina_ir/cast_u8_usize_cmp.snap deleted file mode 100644 index 82825fce84..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/cast_u8_usize_cmp.snap +++ /dev/null @@ -1,57 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/cast_u8_usize_cmp.fe ---- -target = "evm-ethereum-osaka" - -func public %cast_u8_usize_cmp(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - v4.*[i256; 8] = int_to_ptr v0 *[i256; 8]; - v5.*i256 = gep v4 0.i256 v1; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - v8.i8 = trunc v7 i8; - v9.i256 = zext v8 i256; - v10.i1 = lt v2 v9; - v11.i256 = zext v10 i256; - v12.i1 = ne v11 0.i256; - br v12 block1 block2; - - block1: - return 1.i256; - - block2: - v16.i1 = eq v2 v9; - v17.i256 = zext v16 i256; - v18.i1 = ne v17 0.i256; - br v18 block3 block4; - - block3: - return 2.i256; - - block4: - v22.i1 = gt v2 v9; - v23.i256 = zext v22 i256; - v24.i1 = ne v23 0.i256; - br v24 block5 block6; - - block5: - return 3.i256; - - block6: - return 0.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %cast_u8_usize_cmp 0.i256 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/code_region.snap b/crates/codegen/tests/fixtures/sonatina_ir/code_region.snap deleted file mode 100644 index 97b940515b..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/code_region.snap +++ /dev/null @@ -1,126 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/code_region.fe ---- -target = "evm-ethereum-osaka" - -func private %init__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = sym_size &child_init__StorPtr_Evm___207f35a85ac4062e; - v2.i256 = sym_addr &child_init__StorPtr_Evm___207f35a85ac4062e; - v3.i256 = call %allocate__Evm_hef0af3106e109414__3af54274b2985741 v1 0.i256; - evm_code_copy v3 v2 v1; - v5.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor 0.i256 0.i256 v2 v1 4660.i256; - v6.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; - v7.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; - v8.i256 = call %allocate__Evm_hef0af3106e109414__3af54274b2985741 v6 0.i256; - evm_code_copy v8 v7 v6; - evm_return v8 v6; -} - -func private %runtime__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = call %read_selector__Evm_hef0af3106e109414__3af54274b2985741 0.i256; - jump block5; - - block1: - call %transfer__Evm_hef0af3106e109414__3af54274b2985741 0.i256; - jump block2; - - block2: - evm_return 0.i256 0.i256; - - block3: - call %balance__Evm_hef0af3106e109414__3af54274b2985741 0.i256; - jump block2; - - block4: - jump block2; - - block5: - v5.i1 = eq v1 305419896.i256; - br v5 block1 block6; - - block6: - v6.i1 = eq v1 591751049.i256; - br v6 block3 block4; -} - -func private %child_init__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = sym_size &child_runtime__StorPtr_Evm___207f35a85ac4062e; - v2.i256 = sym_addr &child_runtime__StorPtr_Evm___207f35a85ac4062e; - evm_code_copy 0.i256 v2 v1; - evm_return 0.i256 v1; -} - -func private %child_runtime__StorPtr_Evm___207f35a85ac4062e() { - block0: - evm_calldata_copy 0.i256 0.i256 4.i256; - evm_return 0.i256 4.i256; -} - -func private %allocate__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) -> i256 { - block0: - v4.i256 = mload 64.i256 i256; - v5.i1 = eq v4 0.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - jump block2; - - block2: - v9.i256 = phi (v4 block0) (96.i256 block1); - v11.i256 = add v9 v0; - mstore 64.i256 v11 i256; - return v9; -} - -func private %balance__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) { - block0: - evm_return 0.i256 0.i256; -} - -func private %transfer__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) { - block0: - evm_return 0.i256 0.i256; -} - -func public %read_selector__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_load 0.i256; - v4.i256 = shr 224.i256 v2; - return v4; -} - -func private %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i256 { - block0: - v6.i256 = evm_create2 v1 v2 v3 v4; - return v6; -} - - -object @Child { - section init { - entry %child_init__StorPtr_Evm___207f35a85ac4062e; - embed .runtime as &child_runtime__StorPtr_Evm___207f35a85ac4062e; - } - section runtime { - entry %child_runtime__StorPtr_Evm___207f35a85ac4062e; - } -} - -object @Foo { - section init { - entry %init__StorPtr_Evm___207f35a85ac4062e; - embed @Child.init as &child_init__StorPtr_Evm___207f35a85ac4062e; - embed .runtime as &runtime__StorPtr_Evm___207f35a85ac4062e; - } - section runtime { - entry %runtime__StorPtr_Evm___207f35a85ac4062e; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/code_region_qualified.snap b/crates/codegen/tests/fixtures/sonatina_ir/code_region_qualified.snap deleted file mode 100644 index 28f44de7e7..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/code_region_qualified.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/code_region_qualified.fe ---- -target = "evm-ethereum-osaka" - -func private %init__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; - v2.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; - evm_code_copy 0.i256 v2 v1; - evm_return 0.i256 v1; -} - -func private %runtime__StorPtr_Evm___207f35a85ac4062e() { - block0: - evm_return 0.i256 0.i256; -} - - -object @Foo { - section init { - entry %init__StorPtr_Evm___207f35a85ac4062e; - embed .runtime as &runtime__StorPtr_Evm___207f35a85ac4062e; - } - section runtime { - entry %runtime__StorPtr_Evm___207f35a85ac4062e; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/comparison_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/comparison_ops.snap deleted file mode 100644 index d945fc0a1b..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/comparison_ops.snap +++ /dev/null @@ -1,79 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/comparison_ops.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256, i256, i256, i256, i256}; - -func public %comparison_ops() -> i256 { - block0: - v5.*i8 = evm_malloc 192.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i1 = eq 1.i256 1.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - v10.i256 = zext v9 i256; - v11.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v12.*i256 = gep v11 0.i256 0.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v10 i256; - v14.i1 = eq 1.i256 2.i256; - v15.i1 = is_zero v14; - v16.i256 = zext v15 i256; - v17.i1 = ne v16 0.i256; - v18.i256 = zext v17 i256; - v19.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v20.*i256 = gep v19 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v18 i256; - v22.i1 = lt 1.i256 2.i256; - v23.i256 = zext v22 i256; - v24.i1 = ne v23 0.i256; - v25.i256 = zext v24 i256; - v26.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v27.*i256 = gep v26 0.i256 2.i256; - v28.i256 = ptr_to_int v27 i256; - mstore v28 v25 i256; - v29.i1 = gt 2.i256 2.i256; - v30.i1 = is_zero v29; - v31.i256 = zext v30 i256; - v32.i1 = ne v31 0.i256; - v33.i256 = zext v32 i256; - v34.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v35.*i256 = gep v34 0.i256 3.i256; - v36.i256 = ptr_to_int v35 i256; - mstore v36 v33 i256; - v37.i1 = gt 3.i256 2.i256; - v38.i256 = zext v37 i256; - v39.i1 = ne v38 0.i256; - v40.i256 = zext v39 i256; - v41.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v43.*i256 = gep v41 0.i256 4.i256; - v44.i256 = ptr_to_int v43 i256; - mstore v44 v40 i256; - v45.i1 = lt 3.i256 3.i256; - v46.i1 = is_zero v45; - v47.i256 = zext v46 i256; - v48.i1 = ne v47 0.i256; - v49.i256 = zext v48 i256; - v50.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v52.*i256 = gep v50 0.i256 5.i256; - v53.i256 = ptr_to_int v52 i256; - mstore v53 v49 i256; - return v6; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %comparison_ops; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_array.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_array.snap deleted file mode 100644 index 830e34804c..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_array.snap +++ /dev/null @@ -1,56 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/const_array.fe ---- -target = "evm-ethereum-osaka" - -global private const [i8; 96] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30]; - -func public %sum_two(v0.i256, v1.i256) -> i256 { - block0: - v4.*i8 = evm_malloc 96.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = sym_addr $__fe_const_data_0; - v7.i256 = sym_size $__fe_const_data_0; - evm_code_copy v5 v6 v7; - v8.*[i256; 3] = int_to_ptr v5 *[i256; 3]; - v9.*i256 = gep v8 0.i256 v0; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*i8 = evm_malloc 96.i256; - v13.i256 = ptr_to_int v12 i256; - v14.i256 = sym_addr $__fe_const_data_0; - v15.i256 = sym_size $__fe_const_data_0; - evm_code_copy v13 v14 v15; - v16.*[i256; 3] = int_to_ptr v13 *[i256; 3]; - v17.*i256 = gep v16 0.i256 v1; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.*i8 = evm_malloc 96.i256; - v21.i256 = ptr_to_int v20 i256; - v22.i256 = sym_addr $__fe_const_data_0; - v23.i256 = sym_size $__fe_const_data_0; - evm_code_copy v21 v22 v23; - v24.*i8 = evm_malloc 96.i256; - v25.i256 = ptr_to_int v24 i256; - v26.i256 = sym_addr $__fe_const_data_0; - v27.i256 = sym_size $__fe_const_data_0; - evm_code_copy v25 v26 v27; - v28.i256 = add v11 v19; - return v28; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %sum_two 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - data $__fe_const_data_0; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_array_add.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_array_add.snap deleted file mode 100644 index 18b7dc33d1..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_array_add.snap +++ /dev/null @@ -1,37 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/const_array_add.fe ---- -target = "evm-ethereum-osaka" - -global private const [i8; 96] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30]; - -func public %get_sum() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.*[i256; 3] = int_to_ptr v3 *[i256; 3]; - v7.*i256 = gep v6 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v11.i256 = add 1.i256 v9; - return v11; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %get_sum; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - data $__fe_const_data_0; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_array_addmod.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_array_addmod.snap deleted file mode 100644 index 1160eb655f..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_array_addmod.snap +++ /dev/null @@ -1,37 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/const_array_addmod.fe ---- -target = "evm-ethereum-osaka" - -global private const [i8; 96] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30]; - -func public %get_sum() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.*[i256; 3] = int_to_ptr v3 *[i256; 3]; - v7.*i256 = gep v6 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v12.i256 = evm_add_mod 1.i256 v9 100.i256; - return v12; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %get_sum; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - data $__fe_const_data_0; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_array_branch.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_array_branch.snap deleted file mode 100644 index 6d035ffbe6..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_array_branch.snap +++ /dev/null @@ -1,67 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/const_array_branch.fe ---- -target = "evm-ethereum-osaka" - -global private const [i8; 32] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]; - -func public %const_array_branch(v0.i256) -> i256 { - block0: - v2.i1 = ne v0 0.i256; - br v2 block1 block2; - - block1: - v4.*i8 = evm_malloc 32.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = sym_addr $__fe_const_data_0; - v7.i256 = sym_size $__fe_const_data_0; - evm_code_copy v5 v6 v7; - v8.*[i256; 1] = int_to_ptr v5 *[i256; 1]; - v9.*i256 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - jump block3; - - block2: - v12.*i8 = evm_malloc 32.i256; - v13.i256 = ptr_to_int v12 i256; - v14.i256 = sym_addr $__fe_const_data_0; - v15.i256 = sym_size $__fe_const_data_0; - evm_code_copy v13 v14 v15; - v16.*[i256; 1] = int_to_ptr v13 *[i256; 1]; - v17.*i256 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - jump block3; - - block3: - v28.i256 = phi (v11 block1) (v19 block2); - v20.*i8 = evm_malloc 32.i256; - v21.i256 = ptr_to_int v20 i256; - v22.i256 = sym_addr $__fe_const_data_0; - v23.i256 = sym_size $__fe_const_data_0; - evm_code_copy v21 v22 v23; - v24.*i8 = evm_malloc 32.i256; - v25.i256 = ptr_to_int v24 i256; - v26.i256 = sym_addr $__fe_const_data_0; - v27.i256 = sym_size $__fe_const_data_0; - evm_code_copy v25 v26 v27; - return v28; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %const_array_branch 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - data $__fe_const_data_0; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_fn_mapping_slot_hash.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_fn_mapping_slot_hash.snap deleted file mode 100644 index 1140f1af9b..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_fn_mapping_slot_hash.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/const_fn_mapping_slot_hash.fe ---- -target = "evm-ethereum-osaka" - -func private %main() -> i256 { - block0: - return 3253375974595066614526584426541216327299611994431550246078837110170861790149.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %main; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_fn_packed_config.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_fn_packed_config.snap deleted file mode 100644 index 67a5dc8bc8..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_fn_packed_config.snap +++ /dev/null @@ -1,134 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/const_fn_packed_config.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256}; - -func private %token_params(v0.i256) -> i256 { - block0: - jump block5; - - block1: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v6.i8 = trunc 18.i256 i8; - v7.i256 = zext v6 i256; - v8.*@__fe_tuple_0 = int_to_ptr v4 *@__fe_tuple_0; - v9.*i256 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v7 i256; - v12.i16 = trunc 30.i256 i16; - v13.i256 = zext v12 i256; - v14.*@__fe_tuple_0 = int_to_ptr v4 *@__fe_tuple_0; - v16.*i256 = gep v14 0.i256 1.i256; - v17.i256 = ptr_to_int v16 i256; - mstore v17 v13 i256; - jump block2; - - block2: - v18.i256 = phi (v4 block1) (v20 block3) (v34 block4); - return v18; - - block3: - v19.*i8 = evm_malloc 64.i256; - v20.i256 = ptr_to_int v19 i256; - v22.i8 = trunc 6.i256 i8; - v23.i256 = zext v22 i256; - v24.*@__fe_tuple_0 = int_to_ptr v20 *@__fe_tuple_0; - v25.*i256 = gep v24 0.i256 0.i256; - v26.i256 = ptr_to_int v25 i256; - mstore v26 v23 i256; - v28.i16 = trunc 5.i256 i16; - v29.i256 = zext v28 i256; - v30.*@__fe_tuple_0 = int_to_ptr v20 *@__fe_tuple_0; - v31.*i256 = gep v30 0.i256 1.i256; - v32.i256 = ptr_to_int v31 i256; - mstore v32 v29 i256; - jump block2; - - block4: - v33.*i8 = evm_malloc 64.i256; - v34.i256 = ptr_to_int v33 i256; - v35.i8 = trunc 18.i256 i8; - v36.i256 = zext v35 i256; - v37.*@__fe_tuple_0 = int_to_ptr v34 *@__fe_tuple_0; - v38.*i256 = gep v37 0.i256 0.i256; - v39.i256 = ptr_to_int v38 i256; - mstore v39 v36 i256; - v40.i16 = trunc 0.i256 i16; - v41.i256 = zext v40 i256; - v42.*@__fe_tuple_0 = int_to_ptr v34 *@__fe_tuple_0; - v43.*i256 = gep v42 0.i256 1.i256; - v44.i256 = ptr_to_int v43 i256; - mstore v44 v41 i256; - jump block2; - - block5: - v46.i1 = eq v0 0.i256; - br v46 block1 block6; - - block6: - v47.i1 = eq v0 1.i256; - br v47 block3 block4; -} - -func private %pack_config(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - v4.i1 = ne v1 0.i256; - br v4 block1 block2; - - block1: - jump block3; - - block2: - jump block3; - - block3: - v6.i256 = phi (1.i256 block1) (0.i256 block2); - v10.i256 = shl 24.i256 v6; - v12.i256 = shl 16.i256 v0; - v13.i256 = or v10 v12; - v14.i256 = or v13 v2; - return v14; -} - -func private %packed_token_config(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %token_params v0; - v4.*@__fe_tuple_0 = int_to_ptr v3 *@__fe_tuple_0; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - v8.i8 = trunc v7 i8; - v9.i256 = zext v8 i256; - v10.*@__fe_tuple_0 = int_to_ptr v3 *@__fe_tuple_0; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - v14.i256 = mload v13 i256; - v15.i16 = trunc v14 i16; - v16.i256 = zext v15 i256; - v17.i256 = call %pack_config v9 v1 v16; - return v17; -} - -func private %main() -> i256 { - block0: - return 1179678.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %token_params 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_keccak.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_keccak.snap deleted file mode 100644 index 36f155a2dc..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_keccak.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/const_keccak.fe ---- -target = "evm-ethereum-osaka" - -func private %main() -> i256 { - block0: - return 12910348618308260923200348219926901280687058984330794534952861439530514639560.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %main; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_nested_u8_array.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_nested_u8_array.snap deleted file mode 100644 index b1c3fba777..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_nested_u8_array.snap +++ /dev/null @@ -1,46 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/const_nested_u8_array.fe ---- -target = "evm-ethereum-osaka" - -global private const [i8; 128] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 4]; - -func public %const_nested_u8_array() -> i256 { - block0: - v2.*i8 = evm_malloc 128.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.*[[i256; 2]; 2] = int_to_ptr v3 *[[i256; 2]; 2]; - v8.*[i256; 2] = gep v6 0.i256 1.i256; - v9.i256 = ptr_to_int v8 i256; - v10.*[i256; 2] = int_to_ptr v9 *[i256; 2]; - v11.*i256 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - v13.i256 = mload v12 i256; - v14.i8 = trunc v13 i8; - v15.i256 = zext v14 i256; - v16.*i8 = evm_malloc 128.i256; - v17.i256 = ptr_to_int v16 i256; - v18.i256 = sym_addr $__fe_const_data_0; - v19.i256 = sym_size $__fe_const_data_0; - evm_code_copy v17 v18 v19; - return v15; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %const_nested_u8_array; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - data $__fe_const_data_0; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/contract_dispatch.snap b/crates/codegen/tests/fixtures/sonatina_ir/contract_dispatch.snap deleted file mode 100644 index 9d959e5c6d..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/contract_dispatch.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/contract_dispatch.fe ---- -target = "evm-ethereum-osaka" - -func private %emit_code() -> i256 { - block0: - return 1.i256; -} - -func private %dispatch() { - block0: - v0.i256 = call %emit_code; - evm_stop; -} - - -object @MinimalDispatcher { - section runtime { - entry %dispatch; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/create_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/create_contract.snap deleted file mode 100644 index 7bb258098b..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/create_contract.snap +++ /dev/null @@ -1,884 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/create_contract.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_MemoryBytes_0 = {i256, i256}; -type @__fe_Deploy_1 = {i256, i256}; -type @__fe_tuple_2 = {i256, i256}; -type @__fe_Deploy2_3 = {i256, i256, i256}; -type @__fe_SolEncoder_4 = {i256, i256, i256}; -type @__fe_Cursor_5 = {@__fe_MemoryBytes_0, i256}; -type @__fe_SolDecoder_6 = {@__fe_Cursor_5, i256}; -type @__fe_CallData_7 = {i256}; -type @__fe_Cursor_8 = {@__fe_CallData_7, i256}; -type @__fe_SolDecoder_9 = {@__fe_Cursor_8, i256}; - -func private %__Child_init_contract(v0.i256, v1.i256, v2.i256) { - block0: - evm_sstore v2 v0; - v5.i256 = add v2 1.i256; - evm_sstore v5 v1; - return; -} - -func private %__Child_init() { - block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 0.i256; - v2.i256 = sym_addr &__Child_runtime; - v3.i256 = sym_size &__Child_runtime; - v4.i256 = sym_size .; - v5.i256 = evm_code_size; - v6.i1 = lt v5 v4; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v11.i256 = sub v5 v4; - v12.i256 = sub v5 v4; - v13.*i8 = evm_malloc v12; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = sub v5 v4; - evm_code_copy v14 v4 v15; - v17.*i8 = evm_malloc 64.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*@__fe_MemoryBytes_0 = int_to_ptr v18 *@__fe_MemoryBytes_0; - v20.*i256 = gep v19 0.i256 0.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v14 i256; - v22.i256 = sub v5 v4; - v23.*@__fe_MemoryBytes_0 = int_to_ptr v18 *@__fe_MemoryBytes_0; - v25.*i256 = gep v23 0.i256 1.i256; - v26.i256 = ptr_to_int v25 i256; - mstore v26 v22 i256; - v27.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v18; - v28.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v27; - v29.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v27; - call %__Child_init_contract v28 v29 v1; - evm_code_copy 0.i256 v2 v3; - evm_return 0.i256 v3; -} - -func private %__Child_runtime() { - block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 0.i256 0.i256; - v2.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v3.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - jump block1; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; -} - -func private %__Factory_recv_0_0(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Deploy_1 = int_to_ptr v0 *@__fe_Deploy_1; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.*@__fe_Deploy_1 = int_to_ptr v0 *@__fe_Deploy_1; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v13.*i8 = evm_malloc 64.i256; - v14.i256 = ptr_to_int v13 i256; - v15.*@__fe_tuple_2 = int_to_ptr v14 *@__fe_tuple_2; - v16.*i256 = gep v15 0.i256 0.i256; - v17.i256 = ptr_to_int v16 i256; - mstore v17 v6 i256; - v18.*@__fe_tuple_2 = int_to_ptr v14 *@__fe_tuple_2; - v19.*i256 = gep v18 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v11 i256; - v21.i256 = call %create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed v1 0.i256 v14; - return v21; -} - -func private %__Factory_recv_0_1(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Deploy2_3 = int_to_ptr v0 *@__fe_Deploy2_3; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.*@__fe_Deploy2_3 = int_to_ptr v0 *@__fe_Deploy2_3; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*@__fe_Deploy2_3 = int_to_ptr v0 *@__fe_Deploy2_3; - v14.*i256 = gep v12 0.i256 2.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v18.*i8 = evm_malloc 64.i256; - v19.i256 = ptr_to_int v18 i256; - v20.*@__fe_tuple_2 = int_to_ptr v19 *@__fe_tuple_2; - v21.*i256 = gep v20 0.i256 0.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v6 i256; - v23.*@__fe_tuple_2 = int_to_ptr v19 *@__fe_tuple_2; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v11 i256; - v26.i256 = call %create2_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed v1 0.i256 v19 v16; - return v26; -} - -func private %__Factory_init() { - block0: - v0.i256 = sym_addr &__Factory_runtime; - v1.i256 = sym_size &__Factory_runtime; - evm_code_copy 0.i256 v0 v1; - evm_return 0.i256 v1; -} - -func private %__Factory_runtime() { - block0: - v1.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v2.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v5.i1 = eq v1 1.i256; - br v5 block2 block4; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v8.i256 = call %deploy_h5c6b1804553edb1_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v2; - v9.i256 = call %__Factory_recv_0_0 v8 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c 0.i256 v9; - evm_invalid; - - block3: - v11.i256 = call %deploy2_ha2b981aa2f8bf9fd_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v2; - v12.i256 = call %__Factory_recv_0_1 v11 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c 0.i256 v12; - evm_invalid; - - block4: - v6.i1 = eq v1 2.i256; - br v6 block3 block1; -} - -func private %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 v0 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { - block0: - evm_revert 0.i256 0.i256; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 v1; - return v3; -} - -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; - evm_invalid; - - block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; -} - -func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; -} - -func private %create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - v4.i256 = call %__Child_init_code_len; - v5.i256 = call %__Child_init_code_offset; - v7.i256 = add v4 64.i256; - v8.*i8 = evm_malloc v7; - v9.i256 = ptr_to_int v8 i256; - evm_code_copy v9 v5 v4; - v10.i256 = add v9 v4; - v12.*i8 = evm_malloc 96.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_SolEncoder_4 = int_to_ptr v13 *@__fe_SolEncoder_4; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v10 i256; - v17.*@__fe_SolEncoder_4 = int_to_ptr v13 *@__fe_SolEncoder_4; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v10 i256; - v21.i256 = add v10 64.i256; - v22.*@__fe_SolEncoder_4 = int_to_ptr v13 *@__fe_SolEncoder_4; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - call %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64 v2 v13; - v26.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor v0 v1 v9 v7; - v27.i1 = eq v26 0.i256; - v28.i256 = zext v27 i256; - v29.i1 = ne v28 0.i256; - br v29 block1 block2; - - block1: - v30.i256 = evm_return_data_size; - v31.*i8 = evm_malloc v30; - v32.i256 = ptr_to_int v31 i256; - evm_return_data_copy v32 0.i256 v30; - evm_revert v32 v30; - - block2: - return v26; -} - -func private %create2_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.i256 = call %__Child_init_code_len; - v6.i256 = call %__Child_init_code_offset; - v8.i256 = add v5 64.i256; - v9.*i8 = evm_malloc v8; - v10.i256 = ptr_to_int v9 i256; - evm_code_copy v10 v6 v5; - v11.i256 = add v10 v5; - v13.*i8 = evm_malloc 96.i256; - v14.i256 = ptr_to_int v13 i256; - v15.*@__fe_SolEncoder_4 = int_to_ptr v14 *@__fe_SolEncoder_4; - v16.*i256 = gep v15 0.i256 0.i256; - v17.i256 = ptr_to_int v16 i256; - mstore v17 v11 i256; - v18.*@__fe_SolEncoder_4 = int_to_ptr v14 *@__fe_SolEncoder_4; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v11 i256; - v22.i256 = add v11 64.i256; - v23.*@__fe_SolEncoder_4 = int_to_ptr v14 *@__fe_SolEncoder_4; - v25.*i256 = gep v23 0.i256 2.i256; - v26.i256 = ptr_to_int v25 i256; - mstore v26 v22 i256; - call %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64 v2 v14; - v27.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor v0 v1 v10 v8 v3; - v28.i1 = eq v27 0.i256; - v29.i256 = zext v28 i256; - v30.i1 = ne v29 0.i256; - br v30 block1 block2; - - block1: - v31.i256 = evm_return_data_size; - v32.*i8 = evm_malloc v31; - v33.i256 = ptr_to_int v32 i256; - evm_return_data_copy v33 0.i256 v31; - evm_revert v33 v31; - - block2: - return v27; -} - -func private %deploy_h5c6b1804553edb1_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Deploy_1 = int_to_ptr v6 *@__fe_Deploy_1; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v2 i256; - v10.*@__fe_Deploy_1 = int_to_ptr v6 *@__fe_Deploy_1; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v3 i256; - return v6; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %address_h257056268eac7027_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_2 = int_to_ptr v6 *@__fe_tuple_2; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_2 = int_to_ptr v6 *@__fe_tuple_2; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func private %deploy2_ha2b981aa2f8bf9fd_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v4.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Deploy2_3 = int_to_ptr v7 *@__fe_Deploy2_3; - v9.*i256 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v2 i256; - v11.*@__fe_Deploy2_3 = int_to_ptr v7 *@__fe_Deploy2_3; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v3 i256; - v15.*@__fe_Deploy2_3 = int_to_ptr v7 *@__fe_Deploy2_3; - v17.*i256 = gep v15 0.i256 2.i256; - v18.i256 = ptr_to_int v17 i256; - mstore v18 v4 i256; - return v7; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_5 = int_to_ptr v2 *@__fe_Cursor_5; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.*@__fe_SolDecoder_6 = int_to_ptr v5 *@__fe_SolDecoder_6; - v11.*i256 = gep v10 0.i256 0.i256 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - v13.*@__fe_Cursor_5 = int_to_ptr v2 *@__fe_Cursor_5; - v15.*i256 = gep v13 0.i256 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v18.*@__fe_SolDecoder_6 = int_to_ptr v5 *@__fe_SolDecoder_6; - v19.*i256 = gep v18 0.i256 0.i256 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v17 i256; - v21.*@__fe_Cursor_5 = int_to_ptr v2 *@__fe_Cursor_5; - v22.*i256 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.*@__fe_SolDecoder_6 = int_to_ptr v5 *@__fe_SolDecoder_6; - v26.*i256 = gep v25 0.i256 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.*@__fe_SolDecoder_6 = int_to_ptr v5 *@__fe_SolDecoder_6; - v29.*i256 = gep v28 0.i256 1.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 0.i256 i256; - return v5; -} - -func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; - v3.*@__fe_Cursor_5 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_5 = int_to_ptr v4 *@__fe_Cursor_5; - v6.*@__fe_MemoryBytes_0 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = call %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len v7; - v9.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; - v10.*@__fe_Cursor_5 = gep v9 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_Cursor_5 = int_to_ptr v11 *@__fe_Cursor_5; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v18.i256 = add v16 32.i256; - v19.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; - v20.*@__fe_Cursor_5 = gep v19 0.i256 0.i256; - v21.i256 = ptr_to_int v20 i256; - v22.*@__fe_Cursor_5 = int_to_ptr v21 *@__fe_Cursor_5; - v23.*i256 = gep v22 0.i256 1.i256; - v24.i256 = ptr_to_int v23 i256; - v25.i256 = mload v24 i256; - v26.i1 = lt v18 v25; - v27.i256 = zext v26 i256; - v28.i1 = ne v27 0.i256; - br v28 block1 block3; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v30.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; - v31.*@__fe_Cursor_5 = gep v30 0.i256 0.i256; - v32.i256 = ptr_to_int v31 i256; - v33.*@__fe_Cursor_5 = int_to_ptr v32 *@__fe_Cursor_5; - v34.*i256 = gep v33 0.i256 1.i256; - v35.i256 = ptr_to_int v34 i256; - v36.i256 = mload v35 i256; - v37.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; - v38.*@__fe_Cursor_5 = gep v37 0.i256 0.i256; - v39.i256 = ptr_to_int v38 i256; - v40.*@__fe_Cursor_5 = int_to_ptr v39 *@__fe_Cursor_5; - v41.*@__fe_MemoryBytes_0 = gep v40 0.i256 0.i256; - v42.i256 = ptr_to_int v41 i256; - v43.i256 = call %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at v42 v36; - v45.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; - v46.*@__fe_Cursor_5 = gep v45 0.i256 0.i256; - v47.i256 = ptr_to_int v46 i256; - v48.*@__fe_Cursor_5 = int_to_ptr v47 *@__fe_Cursor_5; - v49.*i256 = gep v48 0.i256 1.i256; - v50.i256 = ptr_to_int v49 i256; - mstore v50 v18 i256; - return v43; - - block3: - v53.i1 = gt v18 v8; - v54.i256 = zext v53 i256; - v55.i1 = ne v54 0.i256; - br v55 block1 block2; -} - -func private %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { - block0: - return 0.i256; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; - return v5; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { - block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; -} - -func private %__Child_init_code_len() -> i256 { - block0: - v1.i256 = sym_size &__Child_init; - return v1; -} - -func private %__Child_init_code_offset() -> i256 { - block0: - v1.i256 = sym_addr &__Child_init; - return v1; -} - -func private %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64(v0.i256, v1.i256) { - block0: - v3.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v6 v1; - v7.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v11 v1; - return; -} - -func private %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.i256 = evm_create v1 v2 v3; - return v5; -} - -func private %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i256 { - block0: - v6.i256 = evm_create2 v1 v2 v3 v4; - return v6; -} - -func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - return v2; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { - block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i1 = eq v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - v11.*i8 = evm_malloc v1; - v12.i256 = ptr_to_int v11 i256; - v14.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v17.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v12 i256; - v21.i256 = add v12 v1; - v22.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - jump block2; - - block2: - v27.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - return v30; -} - -func private %address_h257056268eac7027_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { - block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v12.*i8 = evm_malloc 64.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_tuple_2 = int_to_ptr v13 *@__fe_tuple_2; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v5 i256; - v17.i256 = sub v10 v5; - v18.*@__fe_tuple_2 = int_to_ptr v13 *@__fe_tuple_2; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v17 i256; - return v13; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { - block0: - evm_return v1 v2; -} - -func public %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Cursor_5 = int_to_ptr v4 *@__fe_Cursor_5; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 v8 i256; - v12.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.*@__fe_Cursor_5 = int_to_ptr v4 *@__fe_Cursor_5; - v18.*i256 = gep v17 0.i256 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v16 i256; - v20.*@__fe_Cursor_5 = int_to_ptr v4 *@__fe_Cursor_5; - v21.*i256 = gep v20 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 0.i256 i256; - return v4; -} - -func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v2 0.i256 1.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - return v6; -} - -func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i256 = add v6 v1; - v8.i256 = add v6 v1; - v9.i256 = mload v8 i256; - return v9; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256) -> i256 { - block0: - return v0; -} - -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_8 = int_to_ptr v4 *@__fe_Cursor_8; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*@__fe_SolDecoder_9 = int_to_ptr v7 *@__fe_SolDecoder_9; - v13.*i256 = gep v12 0.i256 0.i256 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v11 i256; - v15.*@__fe_Cursor_8 = int_to_ptr v4 *@__fe_Cursor_8; - v17.*i256 = gep v15 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_9 = int_to_ptr v7 *@__fe_SolDecoder_9; - v21.*i256 = gep v20 0.i256 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v19 i256; - v23.*@__fe_SolDecoder_9 = int_to_ptr v7 *@__fe_SolDecoder_9; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v1 i256; - return v7; -} - -func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v2.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; - v3.*@__fe_Cursor_8 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_8 = int_to_ptr v4 *@__fe_Cursor_8; - v6.*@__fe_CallData_7 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v8; - v10.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; - v11.*@__fe_Cursor_8 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - v13.*@__fe_Cursor_8 = int_to_ptr v12 *@__fe_Cursor_8; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v19.i256 = add v17 32.i256; - v20.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; - v21.*@__fe_Cursor_8 = gep v20 0.i256 0.i256; - v22.i256 = ptr_to_int v21 i256; - v23.*@__fe_Cursor_8 = int_to_ptr v22 *@__fe_Cursor_8; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - v26.i256 = mload v25 i256; - v27.i1 = lt v19 v26; - v28.i256 = zext v27 i256; - v29.i1 = ne v28 0.i256; - br v29 block1 block3; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v31.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; - v32.*@__fe_Cursor_8 = gep v31 0.i256 0.i256; - v33.i256 = ptr_to_int v32 i256; - v34.*@__fe_Cursor_8 = int_to_ptr v33 *@__fe_Cursor_8; - v35.*@__fe_CallData_7 = gep v34 0.i256 0.i256; - v36.i256 = ptr_to_int v35 i256; - v37.i256 = mload v36 i256; - v38.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; - v39.*@__fe_Cursor_8 = gep v38 0.i256 0.i256; - v40.i256 = ptr_to_int v39 i256; - v41.*@__fe_Cursor_8 = int_to_ptr v40 *@__fe_Cursor_8; - v42.*i256 = gep v41 0.i256 1.i256; - v43.i256 = ptr_to_int v42 i256; - v44.i256 = mload v43 i256; - v45.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v37 v44; - v47.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; - v48.*@__fe_Cursor_8 = gep v47 0.i256 0.i256; - v49.i256 = ptr_to_int v48 i256; - v50.*@__fe_Cursor_8 = int_to_ptr v49 *@__fe_Cursor_8; - v51.*i256 = gep v50 0.i256 1.i256; - v52.i256 = ptr_to_int v51 i256; - mstore v52 v19 i256; - return v45; - - block3: - v55.i1 = gt v19 v9; - v56.i256 = zext v55 i256; - v57.i1 = ne v56 0.i256; - br v57 block1 block2; -} - -func public %solencoder_h1b9228b90dad6928_new() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - mstore v6 0.i256 i256; - v7.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 0.i256 i256; - v11.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v13.*i256 = gep v11 0.i256 2.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 0.i256 i256; - return v3; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - -func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func public %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_8 = int_to_ptr v4 *@__fe_Cursor_8; - v6.*@__fe_CallData_7 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 v0 i256; - v8.*@__fe_Cursor_8 = int_to_ptr v4 *@__fe_Cursor_8; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 0.i256 i256; - return v4; -} - -func public %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Cursor_8 = int_to_ptr v0 *@__fe_Cursor_8; - v4.*@__fe_CallData_7 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v8.*i8 = evm_malloc 64.i256; - v9.i256 = ptr_to_int v8 i256; - v10.*@__fe_Cursor_8 = int_to_ptr v9 *@__fe_Cursor_8; - v11.*@__fe_CallData_7 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v6 i256; - v13.*@__fe_Cursor_8 = int_to_ptr v9 *@__fe_Cursor_8; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v1 i256; - return v9; -} - - -object @Child { - section init { - entry %__Child_init; - embed .runtime as &__Child_runtime; - } - section runtime { - entry %__Child_runtime; - } -} - -object @Factory { - section init { - entry %__Factory_init; - embed .runtime as &__Factory_runtime; - } - section runtime { - entry %__Factory_runtime; - embed @Child.init as &__Child_init; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_calldata_domain.snap b/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_calldata_domain.snap deleted file mode 100644 index d5bbb2f8f6..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_calldata_domain.snap +++ /dev/null @@ -1,37 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/effect_ptr_calldata_domain.fe ---- -target = "evm-ethereum-osaka" - -func private %read_x__StorPtr_u256___64779554cfbf0358(v0.i256) -> i256 { - block0: - v2.i256 = evm_sload v0; - return v2; -} - -func private %test_calldata_ptr_domain() { - block0: - v1.i256 = call %read_x__CalldataPtr_u256___1e20dc3e834a8f96 0.i256; - return; -} - -func private %read_x__CalldataPtr_u256___1e20dc3e834a8f96(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_load v0; - return v2; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %read_x__StorPtr_u256___64779554cfbf0358 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_domains.snap b/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_domains.snap deleted file mode 100644 index 121d60c450..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_domains.snap +++ /dev/null @@ -1,100 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/effect_ptr_domains.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Foo_0 = {i256, i256}; - -func private %bump__StorPtr_Foo___3698cc3c4b2626e3(v0.i256) { - block0: - v2.i256 = evm_sload v0; - v4.i256 = add v2 1.i256; - evm_sstore v0 v4; - v5.i256 = add v0 1.i256; - v6.i256 = evm_sload v5; - v8.i256 = add v6 2.i256; - v9.i256 = add v0 1.i256; - evm_sstore v9 v8; - return; -} - -func private %test_effect_ptr_domains__Evm_hef0af3106e109414_Evm_hef0af3106e109414__7ab75559784fbc59(v0.i256, v1.i256) { - block0: - v4.i256 = call %mem_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d v1 256.i256; - call %bump__MemPtr_Foo___cdd30998d577b6ea v4; - v5.i256 = call %stor_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d v0 0.i256; - call %bump__StorPtr_Foo___3698cc3c4b2626e3 v5; - v7.*i8 = evm_malloc 64.i256; - v8.i256 = ptr_to_int v7 i256; - v10.*@__fe_Foo_0 = int_to_ptr v8 *@__fe_Foo_0; - v11.*i256 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 10.i256 i256; - v14.*@__fe_Foo_0 = int_to_ptr v8 *@__fe_Foo_0; - v16.*i256 = gep v14 0.i256 1.i256; - v17.i256 = ptr_to_int v16 i256; - mstore v17 20.i256 i256; - call %bump__MemPtr_Foo___cdd30998d577b6ea v8; - return; -} - -func private %mem_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %memptr_t__hf71ec14ffe47fb3f_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v1; - return v3; -} - -func private %bump__MemPtr_Foo___cdd30998d577b6ea(v0.i256) { - block0: - v2.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v7.i256 = add v5 1.i256; - v8.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; - v9.*i256 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v7 i256; - v11.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; - v12.*i256 = gep v11 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - v14.i256 = mload v13 i256; - v16.i256 = add v14 2.i256; - v17.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; - v18.*i256 = gep v17 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v16 i256; - return; -} - -func private %stor_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v1; - return v3; -} - -func private %memptr_t__hf71ec14ffe47fb3f_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26(v0.i256) -> i256 { - block0: - return v0; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26(v0.i256) -> i256 { - block0: - return v0; -} - -func public %__fe_sonatina_entry() { - block0: - call %bump__StorPtr_Foo___3698cc3c4b2626e3 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/enum_variant_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/enum_variant_contract.snap deleted file mode 100644 index 87bee68f12..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/enum_variant_contract.snap +++ /dev/null @@ -1,154 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/enum_variant_contract.fe ---- -target = "evm-ethereum-osaka" - -func private %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - mstore 0.i256 v0 i256; - evm_return 0.i256 32.i256; -} - -func private %init__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; - v2.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; - evm_code_copy 0.i256 v2 v1; - evm_return 0.i256 v1; -} - -func private %runtime__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = evm_calldata_load 0.i256; - v3.i256 = shr 224.i256 v1; - v5.i1 = eq v3 1817627404.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - v9.i256 = evm_calldata_load 4.i256; - v11.*i8 = evm_malloc 64.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 1.i256 i256; - v15.i256 = add v12 32.i256; - mstore v15 v9 i256; - jump block6; - - block2: - v18.i1 = eq v3 1163776883.i256; - v19.i256 = zext v18 i256; - v20.i1 = ne v19 0.i256; - br v20 block8 block9; - - block3: - v22.i256 = add v12 32.i256; - v23.i256 = mload v22 i256; - jump block4; - - block4: - v25.i256 = phi (v23 block3) (0.i256 block5); - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v25 0.i256; - evm_invalid; - - block5: - jump block4; - - block6: - v27.i256 = mload v12 i256; - v28.i1 = eq v27 1.i256; - br v28 block3 block22; - - block7: - evm_invalid; - - block8: - v30.*i8 = evm_malloc 64.i256; - v31.i256 = ptr_to_int v30 i256; - mstore v31 0.i256 i256; - jump block13; - - block9: - v34.i1 = eq v3 3572425762.i256; - v35.i256 = zext v34 i256; - v36.i1 = ne v35 0.i256; - br v36 block15 block16; - - block10: - v38.i256 = add v31 32.i256; - v39.i256 = mload v38 i256; - jump block11; - - block11: - v41.i256 = phi (v39 block10) (0.i256 block12); - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v41 0.i256; - evm_invalid; - - block12: - jump block11; - - block13: - v43.i256 = mload v31 i256; - v44.i1 = eq v43 1.i256; - br v44 block10 block23; - - block14: - evm_invalid; - - block15: - v46.i256 = evm_calldata_load 4.i256; - v47.*i8 = evm_malloc 64.i256; - v48.i256 = ptr_to_int v47 i256; - mstore v48 1.i256 i256; - v49.i256 = add v48 32.i256; - mstore v49 v46 i256; - jump block20; - - block16: - evm_return 0.i256 0.i256; - - block17: - jump block18; - - block18: - v50.i256 = phi (1.i256 block17) (0.i256 block19); - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v50 0.i256; - evm_invalid; - - block19: - jump block18; - - block20: - v52.i256 = mload v48 i256; - v53.i1 = eq v52 1.i256; - br v53 block17 block24; - - block21: - evm_invalid; - - block22: - v29.i1 = eq v27 0.i256; - br v29 block5 block7; - - block23: - v45.i1 = eq v43 0.i256; - br v45 block12 block14; - - block24: - v54.i1 = eq v52 0.i256; - br v54 block19 block21; -} - - -object @EnumContract { - section init { - entry %init__StorPtr_Evm___207f35a85ac4062e; - embed .runtime as &runtime__StorPtr_Evm___207f35a85ac4062e; - } - section runtime { - entry %runtime__StorPtr_Evm___207f35a85ac4062e; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/erc20.snap b/crates/codegen/tests/fixtures/sonatina_ir/erc20.snap deleted file mode 100644 index 2932c5ba23..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/erc20.snap +++ /dev/null @@ -1,1806 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/erc20.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Address_0 = {i256}; -type @__fe_Transfer_1 = {@__fe_Address_0, i256}; -type @__fe_Approve_2 = {@__fe_Address_0, i256}; -type @__fe_TransferFrom_3 = {@__fe_Address_0, @__fe_Address_0, i256}; -type @__fe_Allowance_4 = {@__fe_Address_0, @__fe_Address_0}; -type @__fe_tuple_5 = {@__fe_Address_0, @__fe_Address_0}; -type @__fe_Mint_6 = {@__fe_Address_0, i256}; -type @__fe_BurnFrom_7 = {@__fe_Address_0, i256}; -type @__fe_IncreaseAllowance_8 = {@__fe_Address_0, i256}; -type @__fe_DecreaseAllowance_9 = {@__fe_Address_0, i256}; -type @__fe_MemoryBytes_10 = {i256, i256}; -type @__fe_tuple_11 = {i256, @__fe_Address_0}; -type @__fe_TransferEvent_12 = {@__fe_Address_0, @__fe_Address_0, i256}; -type @__fe_ApprovalEvent_13 = {@__fe_Address_0, @__fe_Address_0, i256}; -type @__fe_tuple_14 = {i256, i256}; -type @__fe_Cursor_15 = {@__fe_MemoryBytes_10, i256}; -type @__fe_SolDecoder_16 = {@__fe_Cursor_15, i256}; -type @__fe_SolEncoder_17 = {i256, i256, i256}; -type @__fe_CallData_18 = {i256}; -type @__fe_Cursor_19 = {@__fe_CallData_18, i256}; -type @__fe_SolDecoder_20 = {@__fe_Cursor_19, i256}; - -func private %__CoolCoin_init_contract(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256, v5.i256) { - block0: - call %accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef v3 1.i256 v1; - call %accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef v3 2.i256 v1; - v9.i1 = gt v0 0.i256; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block1 block2; - - block1: - call %mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v1 v0 v2 v5; - jump block2; - - block2: - return; -} - -func private %__CoolCoin_recv_0_0(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v11.*i256 = gep v9 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - v13.i256 = mload v12 i256; - v14.i256 = evm_caller; - call %transfer__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v14 v8 v13 v2 v3; - return 1.i256; -} - -func private %__CoolCoin_recv_0_1(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.*@__fe_Approve_2 = int_to_ptr v0 *@__fe_Approve_2; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Approve_2 = int_to_ptr v0 *@__fe_Approve_2; - v11.*i256 = gep v9 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - v13.i256 = mload v12 i256; - v14.i256 = evm_caller; - call %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v14 v8 v13 v2 v3; - return 1.i256; -} - -func private %__CoolCoin_recv_0_2(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.*@__fe_TransferFrom_3 = int_to_ptr v0 *@__fe_TransferFrom_3; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_TransferFrom_3 = int_to_ptr v0 *@__fe_TransferFrom_3; - v11.*@__fe_Address_0 = gep v9 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - v13.i256 = mload v12 i256; - v14.*@__fe_TransferFrom_3 = int_to_ptr v0 *@__fe_TransferFrom_3; - v16.*i256 = gep v14 0.i256 2.i256; - v17.i256 = ptr_to_int v16 i256; - v18.i256 = mload v17 i256; - v19.i256 = evm_caller; - call %spend_allowance__0_1_StorPtr_TokenStore_0__1____d3adca980e228028 v8 v19 v18 v2; - call %transfer__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v8 v13 v18 v2 v3; - return 1.i256; -} - -func private %__CoolCoin_recv_0_3(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - return v3; -} - -func private %__CoolCoin_recv_0_4(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Allowance_4 = int_to_ptr v0 *@__fe_Allowance_4; - v4.*@__fe_Address_0 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.*@__fe_Allowance_4 = int_to_ptr v0 *@__fe_Allowance_4; - v9.*@__fe_Address_0 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v13.*i8 = evm_malloc 64.i256; - v14.i256 = ptr_to_int v13 i256; - v15.*@__fe_tuple_5 = int_to_ptr v14 *@__fe_tuple_5; - v16.*@__fe_Address_0 = gep v15 0.i256 0.i256; - v17.i256 = ptr_to_int v16 i256; - mstore v17 v6 i256; - v18.*@__fe_tuple_5 = int_to_ptr v14 *@__fe_tuple_5; - v19.*@__fe_Address_0 = gep v18 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v11 i256; - v21.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v14; - return v21; -} - -func private %__CoolCoin_recv_0_5(v0.i256) -> i256 { - block0: - v2.i256 = evm_sload v0; - return v2; -} - -func private %__CoolCoin_recv_0_6() -> i256 { - block0: - return 4859225033734580590.i256; -} - -func private %__CoolCoin_recv_0_7() -> i256 { - block0: - return 1129271116.i256; -} - -func private %__CoolCoin_recv_0_8() -> i256 { - block0: - return 18.i256; -} - -func private %__CoolCoin_recv_1_0(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i256 { - block0: - v6.*@__fe_Mint_6 = int_to_ptr v0 *@__fe_Mint_6; - v7.*@__fe_Address_0 = gep v6 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.*@__fe_Mint_6 = int_to_ptr v0 *@__fe_Mint_6; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - v14.i256 = mload v13 i256; - call %accesscontrol____h4c85da5bbb505ade_require_stor_arg0_root_stor__3_Evm_hef0af3106e109414__5baaa260f0d18873 v4 1.i256 v1; - call %mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v9 v14 v2 v3; - return 1.i256; -} - -func private %__CoolCoin_recv_1_1(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.i256 = evm_caller; - call %burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v5 v0 v2 v3; - return 1.i256; -} - -func private %__CoolCoin_recv_1_2(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.*@__fe_BurnFrom_7 = int_to_ptr v0 *@__fe_BurnFrom_7; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_BurnFrom_7 = int_to_ptr v0 *@__fe_BurnFrom_7; - v11.*i256 = gep v9 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - v13.i256 = mload v12 i256; - v14.i256 = evm_caller; - call %spend_allowance__0_1_StorPtr_TokenStore_0__1____d3adca980e228028 v8 v14 v13 v2; - call %burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v8 v13 v2 v3; - return 1.i256; -} - -func private %__CoolCoin_recv_1_3(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.*@__fe_IncreaseAllowance_8 = int_to_ptr v0 *@__fe_IncreaseAllowance_8; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_IncreaseAllowance_8 = int_to_ptr v0 *@__fe_IncreaseAllowance_8; - v11.*i256 = gep v9 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - v13.i256 = mload v12 i256; - v14.i256 = evm_caller; - v16.*i8 = evm_malloc 64.i256; - v17.i256 = ptr_to_int v16 i256; - v18.*@__fe_tuple_5 = int_to_ptr v17 *@__fe_tuple_5; - v19.*@__fe_Address_0 = gep v18 0.i256 0.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v14 i256; - v21.*@__fe_tuple_5 = int_to_ptr v17 *@__fe_tuple_5; - v22.*@__fe_Address_0 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - mstore v23 v8 i256; - v24.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v17; - v25.i256 = add v24 v13; - call %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v14 v8 v25 v2 v3; - return 1.i256; -} - -func private %__CoolCoin_recv_1_4(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.*@__fe_DecreaseAllowance_9 = int_to_ptr v0 *@__fe_DecreaseAllowance_9; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_DecreaseAllowance_9 = int_to_ptr v0 *@__fe_DecreaseAllowance_9; - v11.*i256 = gep v9 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - v13.i256 = mload v12 i256; - v14.i256 = evm_caller; - v16.*i8 = evm_malloc 64.i256; - v17.i256 = ptr_to_int v16 i256; - v18.*@__fe_tuple_5 = int_to_ptr v17 *@__fe_tuple_5; - v19.*@__fe_Address_0 = gep v18 0.i256 0.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v14 i256; - v21.*@__fe_tuple_5 = int_to_ptr v17 *@__fe_tuple_5; - v22.*@__fe_Address_0 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - mstore v23 v8 i256; - v24.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v17; - v25.i1 = lt v24 v13; - v26.i1 = is_zero v25; - v27.i256 = zext v26 i256; - call %assert v27; - v28.i256 = sub v24 v13; - call %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v14 v8 v28 v2 v3; - return 1.i256; -} - -func private %__CoolCoin_init() { - block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5 0.i256 0.i256; - v3.i256 = call %init_field__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961 0.i256 3.i256; - v4.i256 = sym_addr &__CoolCoin_runtime; - v5.i256 = sym_size &__CoolCoin_runtime; - v6.i256 = sym_size .; - v7.i256 = evm_code_size; - v8.i1 = lt v7 v6; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; - br v10 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v13.i256 = sub v7 v6; - v14.i256 = sub v7 v6; - v15.*i8 = evm_malloc v14; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = sub v7 v6; - evm_code_copy v16 v6 v17; - v19.*i8 = evm_malloc 64.i256; - v20.i256 = ptr_to_int v19 i256; - v21.*@__fe_MemoryBytes_10 = int_to_ptr v20 *@__fe_MemoryBytes_10; - v22.*i256 = gep v21 0.i256 0.i256; - v23.i256 = ptr_to_int v22 i256; - mstore v23 v16 i256; - v24.i256 = sub v7 v6; - v25.*@__fe_MemoryBytes_10 = int_to_ptr v20 *@__fe_MemoryBytes_10; - v27.*i256 = gep v25 0.i256 1.i256; - v28.i256 = ptr_to_int v27 i256; - mstore v28 v24 i256; - v29.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v20; - v30.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v29; - v31.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v29; - call %__CoolCoin_init_contract v30 v31 v1 v3 0.i256 0.i256; - evm_code_copy 0.i256 v4 v5; - evm_return 0.i256 v5; -} - -func private %__CoolCoin_runtime() { - block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde 0.i256 0.i256; - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f 0.i256 3.i256; - v4.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v5.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v20.i1 = eq v4 2835717307.i256; - br v20 block2 block16; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v35.i256 = call %transfer_h13f5ec5985ebba60_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v37.i256 = call %__CoolCoin_recv_0_0 v35 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v37; - evm_invalid; - - block3: - v39.i256 = call %approve_h90175fc19dafde67_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v41.i256 = call %__CoolCoin_recv_0_1 v39 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v41; - evm_invalid; - - block4: - v43.i256 = call %transferfrom_h939549e4bad999e8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v45.i256 = call %__CoolCoin_recv_0_2 v43 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v45; - evm_invalid; - - block5: - v47.i256 = call %balanceof_hf830ebedc81244a7_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v49.i256 = call %__CoolCoin_recv_0_3 v47 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v49; - evm_invalid; - - block6: - v51.i256 = call %allowance_h4bb1267f662bd2a8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v53.i256 = call %__CoolCoin_recv_0_4 v51 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v53; - evm_invalid; - - block7: - call %totalsupply_h6bf4f2c3498c901c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v56.i256 = call %__CoolCoin_recv_0_5 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v56; - evm_invalid; - - block8: - call %name_h327e3db4a53b027e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v58.i256 = call %__CoolCoin_recv_0_6; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_32___7798a45a8b22b7ed 0.i256 v58; - evm_invalid; - - block9: - call %symbol_h6dabcb627bde53b9_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v60.i256 = call %__CoolCoin_recv_0_7; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_8___99627a2b067a3b64 0.i256 v60; - evm_invalid; - - block10: - call %decimals_h247e095089bd9dcb_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v62.i256 = call %__CoolCoin_recv_0_8; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u8__5f40d25b4a1c5efd 0.i256 v62; - evm_invalid; - - block11: - v64.i256 = call %mint_ha2f94817be433a2e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v67.i256 = call %__CoolCoin_recv_1_0 v64 0.i256 v1 0.i256 v3; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v67; - evm_invalid; - - block12: - v69.i256 = call %burn_h25a61f4466d20eed_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v71.i256 = call %__CoolCoin_recv_1_1 v69 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v71; - evm_invalid; - - block13: - v73.i256 = call %burnfrom_ha9fb0972f143e40c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v75.i256 = call %__CoolCoin_recv_1_2 v73 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v75; - evm_invalid; - - block14: - v77.i256 = call %increaseallowance_h9840135eaea36633_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v79.i256 = call %__CoolCoin_recv_1_3 v77 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v79; - evm_invalid; - - block15: - v81.i256 = call %decreaseallowance_h635474f45639c83d_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v83.i256 = call %__CoolCoin_recv_1_4 v81 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v83; - evm_invalid; - - block16: - v21.i1 = eq v4 157198259.i256; - br v21 block3 block17; - - block17: - v22.i1 = eq v4 599290589.i256; - br v22 block4 block18; - - block18: - v23.i1 = eq v4 1889567281.i256; - br v23 block5 block19; - - block19: - v24.i1 = eq v4 3714247998.i256; - br v24 block6 block20; - - block20: - v25.i1 = eq v4 404098525.i256; - br v25 block7 block21; - - block21: - v26.i1 = eq v4 117300739.i256; - br v26 block8 block22; - - block22: - v27.i1 = eq v4 2514000705.i256; - br v27 block9 block23; - - block23: - v28.i1 = eq v4 826074471.i256; - br v28 block10 block24; - - block24: - v29.i1 = eq v4 1086394137.i256; - br v29 block11 block25; - - block25: - v30.i1 = eq v4 1117154408.i256; - br v30 block12 block26; - - block26: - v31.i1 = eq v4 2043438992.i256; - br v31 block13 block27; - - block27: - v32.i1 = eq v4 961581905.i256; - br v32 block14 block28; - - block28: - v33.i1 = eq v4 2757214935.i256; - br v33 block15 block1; -} - -func public %accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef(v0.i256, v1.i256, v2.i256) { - block0: - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_tuple_11 = int_to_ptr v6 *@__fe_tuple_11; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v1 i256; - v10.*@__fe_tuple_11 = int_to_ptr v6 *@__fe_tuple_11; - v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v2 i256; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8 0.i256 v6 1.i256; - return; -} - -func private %mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v0.i256, v1.i256, v2.i256, v3.i256) { - block0: - v5.i256 = call %address_h257056268eac7027_zero; - v6.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v5; - call %assert v6; - v7.i256 = evm_sload v2; - v8.i256 = add v7 v1; - evm_sstore v2 v8; - v9.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - v10.i256 = add v9 v1; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0 v10; - v11.i256 = call %address_h257056268eac7027_zero; - v13.*i8 = evm_malloc 96.i256; - v14.i256 = ptr_to_int v13 i256; - v15.*@__fe_TransferEvent_12 = int_to_ptr v14 *@__fe_TransferEvent_12; - v16.*@__fe_Address_0 = gep v15 0.i256 0.i256; - v17.i256 = ptr_to_int v16 i256; - mstore v17 v11 i256; - v18.*@__fe_TransferEvent_12 = int_to_ptr v14 *@__fe_TransferEvent_12; - v20.*@__fe_Address_0 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v0 i256; - v22.*@__fe_TransferEvent_12 = int_to_ptr v14 *@__fe_TransferEvent_12; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v1 i256; - call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63 v3 v14; - return; -} - -func private %transfer__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) { - block0: - v6.i256 = call %address_h257056268eac7027_zero; - v7.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v6; - call %assert v7; - v8.i256 = call %address_h257056268eac7027_zero; - v9.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v1 v8; - call %assert v9; - v10.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - v11.i1 = lt v10 v2; - v12.i1 = is_zero v11; - v13.i256 = zext v12 i256; - call %assert v13; - v14.i256 = sub v10 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0 v14; - v15.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1; - v16.i256 = add v15 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1 v16; - v18.*i8 = evm_malloc 96.i256; - v19.i256 = ptr_to_int v18 i256; - v20.*@__fe_TransferEvent_12 = int_to_ptr v19 *@__fe_TransferEvent_12; - v21.*@__fe_Address_0 = gep v20 0.i256 0.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v0 i256; - v23.*@__fe_TransferEvent_12 = int_to_ptr v19 *@__fe_TransferEvent_12; - v25.*@__fe_Address_0 = gep v23 0.i256 1.i256; - v26.i256 = ptr_to_int v25 i256; - mstore v26 v1 i256; - v27.*@__fe_TransferEvent_12 = int_to_ptr v19 *@__fe_TransferEvent_12; - v29.*i256 = gep v27 0.i256 2.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 v2 i256; - call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63 v4 v19; - return; -} - -func private %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) { - block0: - v6.i256 = call %address_h257056268eac7027_zero; - v7.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v6; - call %assert v7; - v8.i256 = call %address_h257056268eac7027_zero; - v9.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v1 v8; - call %assert v9; - v11.*i8 = evm_malloc 64.i256; - v12.i256 = ptr_to_int v11 i256; - v13.*@__fe_tuple_5 = int_to_ptr v12 *@__fe_tuple_5; - v14.*@__fe_Address_0 = gep v13 0.i256 0.i256; - v15.i256 = ptr_to_int v14 i256; - mstore v15 v0 i256; - v16.*@__fe_tuple_5 = int_to_ptr v12 *@__fe_tuple_5; - v18.*@__fe_Address_0 = gep v16 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v1 i256; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v12 v2; - v21.*i8 = evm_malloc 96.i256; - v22.i256 = ptr_to_int v21 i256; - v23.*@__fe_ApprovalEvent_13 = int_to_ptr v22 *@__fe_ApprovalEvent_13; - v24.*@__fe_Address_0 = gep v23 0.i256 0.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v0 i256; - v26.*@__fe_ApprovalEvent_13 = int_to_ptr v22 *@__fe_ApprovalEvent_13; - v27.*@__fe_Address_0 = gep v26 0.i256 1.i256; - v28.i256 = ptr_to_int v27 i256; - mstore v28 v1 i256; - v29.*@__fe_ApprovalEvent_13 = int_to_ptr v22 *@__fe_ApprovalEvent_13; - v31.*i256 = gep v29 0.i256 2.i256; - v32.i256 = ptr_to_int v31 i256; - mstore v32 v2 i256; - call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_ApprovalEvent_h313d94630b6580e5__2946163026d92694 v4 v22; - return; -} - -func private %spend_allowance__0_1_StorPtr_TokenStore_0__1____d3adca980e228028(v0.i256, v1.i256, v2.i256, v3.i256) { - block0: - v6.*i8 = evm_malloc 64.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_tuple_5 = int_to_ptr v7 *@__fe_tuple_5; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v0 i256; - v11.*@__fe_tuple_5 = int_to_ptr v7 *@__fe_tuple_5; - v13.*@__fe_Address_0 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v1 i256; - v15.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v7; - v16.i1 = lt v15 v2; - v17.i1 = is_zero v16; - v18.i256 = zext v17 i256; - call %assert v18; - v19.*i8 = evm_malloc 64.i256; - v20.i256 = ptr_to_int v19 i256; - v21.*@__fe_tuple_5 = int_to_ptr v20 *@__fe_tuple_5; - v22.*@__fe_Address_0 = gep v21 0.i256 0.i256; - v23.i256 = ptr_to_int v22 i256; - mstore v23 v0 i256; - v24.*@__fe_tuple_5 = int_to_ptr v20 *@__fe_tuple_5; - v25.*@__fe_Address_0 = gep v24 0.i256 1.i256; - v26.i256 = ptr_to_int v25 i256; - mstore v26 v1 i256; - v27.i256 = sub v15 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v20 v27; - return; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v1 0.i256; - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v3; - return v4; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(v0.i256, v1.i256) -> i256 { - block0: - v4.i256 = call %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256; - v5.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v4; - return v5; -} - -func public %accesscontrol____h4c85da5bbb505ade_require_stor_arg0_root_stor__3_Evm_hef0af3106e109414__5baaa260f0d18873(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = evm_caller; - v6.*i8 = evm_malloc 64.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_tuple_11 = int_to_ptr v7 *@__fe_tuple_11; - v9.*i256 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v1 i256; - v11.*@__fe_tuple_11 = int_to_ptr v7 *@__fe_tuple_11; - v13.*@__fe_Address_0 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v4 i256; - v15.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8 0.i256 v7; - v16.i1 = eq v15 1.i256; - v17.i256 = zext v16 i256; - call %assert v17; - return; -} - -func private %burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v0.i256, v1.i256, v2.i256, v3.i256) { - block0: - v5.i256 = call %address_h257056268eac7027_zero; - v6.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v5; - call %assert v6; - v7.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - v8.i1 = lt v7 v1; - v9.i1 = is_zero v8; - v10.i256 = zext v9 i256; - call %assert v10; - v11.i256 = sub v7 v1; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0 v11; - v12.i256 = evm_sload v2; - v13.i256 = sub v12 v1; - evm_sstore v2 v13; - v14.i256 = call %address_h257056268eac7027_zero; - v16.*i8 = evm_malloc 96.i256; - v17.i256 = ptr_to_int v16 i256; - v18.*@__fe_TransferEvent_12 = int_to_ptr v17 *@__fe_TransferEvent_12; - v19.*@__fe_Address_0 = gep v18 0.i256 0.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v0 i256; - v21.*@__fe_TransferEvent_12 = int_to_ptr v17 *@__fe_TransferEvent_12; - v23.*@__fe_Address_0 = gep v21 0.i256 1.i256; - v24.i256 = ptr_to_int v23 i256; - mstore v24 v14 i256; - v25.*@__fe_TransferEvent_12 = int_to_ptr v17 *@__fe_TransferEvent_12; - v27.*i256 = gep v25 0.i256 2.i256; - v28.i256 = ptr_to_int v27 i256; - mstore v28 v1 i256; - call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63 v3 v17; - return; -} - -func public %assert(v0.i256) { - block0: - v2.i1 = is_zero v0; - v3.i256 = zext v2 i256; - v4.i1 = ne v3 0.i256; - br v4 block1 block2; - - block1: - evm_revert 0.i256 0.i256; - - block2: - return; -} - -func private %init_field__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde v0 v1; - return v3; -} - -func private %init_field__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f v0 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { - block0: - evm_revert 0.i256 0.i256; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5 0.i256 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961 0.i256 v1; - return v3; -} - -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; - evm_invalid; - - block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; -} - -func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; -} - -func private %transfer_h13f5ec5985ebba60_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Transfer_1 = int_to_ptr v6 *@__fe_Transfer_1; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v2 i256; - v10.*@__fe_Transfer_1 = int_to_ptr v6 *@__fe_Transfer_1; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v3 i256; - return v6; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func private %approve_h90175fc19dafde67_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Approve_2 = int_to_ptr v6 *@__fe_Approve_2; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v2 i256; - v10.*@__fe_Approve_2 = int_to_ptr v6 *@__fe_Approve_2; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v3 i256; - return v6; -} - -func private %transferfrom_h939549e4bad999e8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v4.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_TransferFrom_3 = int_to_ptr v7 *@__fe_TransferFrom_3; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v2 i256; - v11.*@__fe_TransferFrom_3 = int_to_ptr v7 *@__fe_TransferFrom_3; - v13.*@__fe_Address_0 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v3 i256; - v15.*@__fe_TransferFrom_3 = int_to_ptr v7 *@__fe_TransferFrom_3; - v17.*i256 = gep v15 0.i256 2.i256; - v18.i256 = ptr_to_int v17 i256; - mstore v18 v4 i256; - return v7; -} - -func private %balanceof_hf830ebedc81244a7_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - return v2; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func private %allowance_h4bb1267f662bd2a8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Allowance_4 = int_to_ptr v6 *@__fe_Allowance_4; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v2 i256; - v10.*@__fe_Allowance_4 = int_to_ptr v6 *@__fe_Allowance_4; - v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v3 i256; - return v6; -} - -func private %totalsupply_h6bf4f2c3498c901c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func private %name_h327e3db4a53b027e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_32___7798a45a8b22b7ed(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func private %symbol_h6dabcb627bde53b9_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_8___99627a2b067a3b64(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func private %decimals_h247e095089bd9dcb_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u8__5f40d25b4a1c5efd(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u8_hbc9d6eeaea22ffb5_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func private %mint_ha2f94817be433a2e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Mint_6 = int_to_ptr v6 *@__fe_Mint_6; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v2 i256; - v10.*@__fe_Mint_6 = int_to_ptr v6 *@__fe_Mint_6; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v3 i256; - return v6; -} - -func private %burn_h25a61f4466d20eed_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - return v2; -} - -func private %burnfrom_ha9fb0972f143e40c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_BurnFrom_7 = int_to_ptr v6 *@__fe_BurnFrom_7; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v2 i256; - v10.*@__fe_BurnFrom_7 = int_to_ptr v6 *@__fe_BurnFrom_7; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v3 i256; - return v6; -} - -func private %increaseallowance_h9840135eaea36633_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_IncreaseAllowance_8 = int_to_ptr v6 *@__fe_IncreaseAllowance_8; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v2 i256; - v10.*@__fe_IncreaseAllowance_8 = int_to_ptr v6 *@__fe_IncreaseAllowance_8; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v3 i256; - return v6; -} - -func private %decreaseallowance_h635474f45639c83d_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_DecreaseAllowance_9 = int_to_ptr v6 *@__fe_DecreaseAllowance_9; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v2 i256; - v10.*@__fe_DecreaseAllowance_9 = int_to_ptr v6 *@__fe_DecreaseAllowance_9; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v3 i256; - return v6; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt___u256__Address___c7c570db20cdd393 v1 3.i256 v4; - return; -} - -func public %address_h257056268eac7027_zero() -> i256 { - block0: - return 0.i256; -} - -func private %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %address_h257056268eac7027_eq_h14b330e44530c410_eq v0 v1; - v4.i1 = is_zero v3; - v5.i256 = zext v4 i256; - return v5; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v1 0.i256 v4; - return; -} - -func private %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63(v0.i256, v1.i256) { - block0: - call %transferevent_h1c9ba82714a4a1f0_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741 v1 v0; - return; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256 v4; - return; -} - -func private %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_ApprovalEvent_h313d94630b6580e5__2946163026d92694(v0.i256, v1.i256) { - block0: - call %approvalevent_h313d94630b6580e5_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741 v1 v0; - return; -} - -func private %storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; - v4.i256 = evm_sload v3; - return v4; -} - -func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; - v4.i256 = evm_sload v3; - return v4; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8(v0.i256, v1.i256) -> i256 { - block0: - v4.i256 = call %storagemap_get_word_with_salt___u256__Address___c7c570db20cdd393 v1 3.i256; - v5.i256 = call %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_from_word v4; - return v5; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_15 = int_to_ptr v2 *@__fe_Cursor_15; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.*@__fe_SolDecoder_16 = int_to_ptr v5 *@__fe_SolDecoder_16; - v11.*i256 = gep v10 0.i256 0.i256 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - v13.*@__fe_Cursor_15 = int_to_ptr v2 *@__fe_Cursor_15; - v15.*i256 = gep v13 0.i256 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v18.*@__fe_SolDecoder_16 = int_to_ptr v5 *@__fe_SolDecoder_16; - v19.*i256 = gep v18 0.i256 0.i256 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v17 i256; - v21.*@__fe_Cursor_15 = int_to_ptr v2 *@__fe_Cursor_15; - v22.*i256 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.*@__fe_SolDecoder_16 = int_to_ptr v5 *@__fe_SolDecoder_16; - v26.*i256 = gep v25 0.i256 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.*@__fe_SolDecoder_16 = int_to_ptr v5 *@__fe_SolDecoder_16; - v29.*i256 = gep v28 0.i256 1.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 0.i256 i256; - return v5; -} - -func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; - v3.*@__fe_Cursor_15 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_15 = int_to_ptr v4 *@__fe_Cursor_15; - v6.*@__fe_MemoryBytes_10 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = call %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len v7; - v9.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; - v10.*@__fe_Cursor_15 = gep v9 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_Cursor_15 = int_to_ptr v11 *@__fe_Cursor_15; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v18.i256 = add v16 32.i256; - v19.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; - v20.*@__fe_Cursor_15 = gep v19 0.i256 0.i256; - v21.i256 = ptr_to_int v20 i256; - v22.*@__fe_Cursor_15 = int_to_ptr v21 *@__fe_Cursor_15; - v23.*i256 = gep v22 0.i256 1.i256; - v24.i256 = ptr_to_int v23 i256; - v25.i256 = mload v24 i256; - v26.i1 = lt v18 v25; - v27.i256 = zext v26 i256; - v28.i1 = ne v27 0.i256; - br v28 block1 block3; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v30.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; - v31.*@__fe_Cursor_15 = gep v30 0.i256 0.i256; - v32.i256 = ptr_to_int v31 i256; - v33.*@__fe_Cursor_15 = int_to_ptr v32 *@__fe_Cursor_15; - v34.*i256 = gep v33 0.i256 1.i256; - v35.i256 = ptr_to_int v34 i256; - v36.i256 = mload v35 i256; - v37.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; - v38.*@__fe_Cursor_15 = gep v37 0.i256 0.i256; - v39.i256 = ptr_to_int v38 i256; - v40.*@__fe_Cursor_15 = int_to_ptr v39 *@__fe_Cursor_15; - v41.*@__fe_MemoryBytes_10 = gep v40 0.i256 0.i256; - v42.i256 = ptr_to_int v41 i256; - v43.i256 = call %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at v42 v36; - v45.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; - v46.*@__fe_Cursor_15 = gep v45 0.i256 0.i256; - v47.i256 = ptr_to_int v46 i256; - v48.*@__fe_Cursor_15 = int_to_ptr v47 *@__fe_Cursor_15; - v49.*i256 = gep v48 0.i256 1.i256; - v50.i256 = ptr_to_int v49 i256; - mstore v50 v18 i256; - return v43; - - block3: - v53.i1 = gt v18 v8; - v54.i256 = zext v53 i256; - v55.i1 = ne v54 0.i256; - br v55 block1 block2; -} - -func private %stor_ptr__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde v1; - return v3; -} - -func private %stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { - block0: - return 0.i256; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; - return v5; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { - block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; -} - -func private %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - return v2; -} - -func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - return v2; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { - block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i1 = eq v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - v11.*i8 = evm_malloc v1; - v12.i256 = ptr_to_int v11 i256; - v14.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v17.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v12 i256; - v21.i256 = add v12 v1; - v22.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - jump block2; - - block2: - v27.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - return v30; -} - -func private %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - v3.i1 = ne v0 0.i256; - br v3 block1 block3; - - block1: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 1.i256; - jump block2; - - block2: - return; - - block3: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 0.i256; - jump block2; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { - block0: - v2.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v12.*i8 = evm_malloc 64.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_tuple_14 = int_to_ptr v13 *@__fe_tuple_14; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v5 i256; - v17.i256 = sub v10 v5; - v18.*@__fe_tuple_14 = int_to_ptr v13 *@__fe_tuple_14; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v17 i256; - return v13; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { - block0: - evm_return v1 v2; -} - -func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %u8_hbc9d6eeaea22ffb5_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_to_word(v0.i256) -> i256 { - block0: - v2.i1 = ne v0 0.i256; - br v2 block1 block2; - - block1: - jump block3; - - block2: - jump block3; - - block3: - v4.i256 = phi (1.i256 block1) (0.i256 block2); - return v4; -} - -func private %storagemap_set_word_with_salt___u256__Address___c7c570db20cdd393(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393 v0 v1; - evm_sstore v4 v2; - return; -} - -func private %address_h257056268eac7027_eq_h14b330e44530c410_eq(v0.i256, v1.i256) -> i256 { - block0: - v3.i1 = eq v0 v1; - v4.i256 = zext v3 i256; - return v4; -} - -func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; - evm_sstore v4 v2; - return; -} - -func private %transferevent_h1c9ba82714a4a1f0_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - v3.i256 = call %solencoder_h1b9228b90dad6928_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - v6.*@__fe_TransferEvent_12 = int_to_ptr v0 *@__fe_TransferEvent_12; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v10 v3; - v11.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v12.*@__fe_tuple_14 = int_to_ptr v11 *@__fe_tuple_14; - v13.*i256 = gep v12 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - v16.*@__fe_tuple_14 = int_to_ptr v11 *@__fe_tuple_14; - v18.*i256 = gep v16 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - v20.i256 = mload v19 i256; - v21.*@__fe_TransferEvent_12 = int_to_ptr v0 *@__fe_TransferEvent_12; - v22.*@__fe_Address_0 = gep v21 0.i256 0.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.i256 = call %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic v24; - v26.*@__fe_TransferEvent_12 = int_to_ptr v0 *@__fe_TransferEvent_12; - v27.*@__fe_Address_0 = gep v26 0.i256 1.i256; - v28.i256 = ptr_to_int v27 i256; - v29.i256 = mload v28 i256; - v30.i256 = call %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic v29; - call %evm_hef0af3106e109414_log_h22d1a10952034bae_log3_arg0_root_stor v1 v15 v20 -9523714936405215257252364384647749786687397661936385964149718923739779436176.i256 v25 v30; - return; -} - -func private %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; - evm_sstore v4 v2; - return; -} - -func private %approvalevent_h313d94630b6580e5_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - v3.i256 = call %solencoder_h1b9228b90dad6928_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - v6.*@__fe_ApprovalEvent_13 = int_to_ptr v0 *@__fe_ApprovalEvent_13; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v10 v3; - v11.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v12.*@__fe_tuple_14 = int_to_ptr v11 *@__fe_tuple_14; - v13.*i256 = gep v12 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - v16.*@__fe_tuple_14 = int_to_ptr v11 *@__fe_tuple_14; - v18.*i256 = gep v16 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - v20.i256 = mload v19 i256; - v21.*@__fe_ApprovalEvent_13 = int_to_ptr v0 *@__fe_ApprovalEvent_13; - v22.*@__fe_Address_0 = gep v21 0.i256 0.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.i256 = call %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic v24; - v26.*@__fe_ApprovalEvent_13 = int_to_ptr v0 *@__fe_ApprovalEvent_13; - v27.*@__fe_Address_0 = gep v26 0.i256 1.i256; - v28.i256 = ptr_to_int v27 i256; - v29.i256 = mload v28 i256; - v30.i256 = call %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic v29; - call %evm_hef0af3106e109414_log_h22d1a10952034bae_log3_arg0_root_stor v1 v15 v20 3682740849240848158437977969522068712009226744993583420104789809440898259342.i256 v25 v30; - return; -} - -func private %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v4 v0; - v6.i256 = add v4 v5; - mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; -} - -func private %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = call %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v4 v0; - v6.i256 = add v4 v5; - mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; -} - -func private %storagemap_get_word_with_salt___u256__Address___c7c570db20cdd393(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393 v0 v1; - v4.i256 = evm_sload v3; - return v4; -} - -func private %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_from_word(v0.i256) -> i256 { - block0: - v2.i1 = eq v0 0.i256; - v3.i1 = is_zero v2; - v4.i256 = zext v3 i256; - return v4; -} - -func public %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Cursor_15 = int_to_ptr v4 *@__fe_Cursor_15; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 v8 i256; - v12.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.*@__fe_Cursor_15 = int_to_ptr v4 *@__fe_Cursor_15; - v18.*i256 = gep v17 0.i256 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v16 i256; - v20.*@__fe_Cursor_15 = int_to_ptr v4 *@__fe_Cursor_15; - v21.*i256 = gep v20 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 0.i256 i256; - return v4; -} - -func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; - v4.*i256 = gep v2 0.i256 1.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - return v6; -} - -func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i256 = add v6 v1; - v8.i256 = add v6 v1; - v9.i256 = mload v8 i256; - return v9; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde(v0.i256) -> i256 { - block0: - return v0; -} - -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_19 = int_to_ptr v4 *@__fe_Cursor_19; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*@__fe_SolDecoder_20 = int_to_ptr v7 *@__fe_SolDecoder_20; - v13.*i256 = gep v12 0.i256 0.i256 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v11 i256; - v15.*@__fe_Cursor_19 = int_to_ptr v4 *@__fe_Cursor_19; - v17.*i256 = gep v15 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_20 = int_to_ptr v7 *@__fe_SolDecoder_20; - v21.*i256 = gep v20 0.i256 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v19 i256; - v23.*@__fe_SolDecoder_20 = int_to_ptr v7 *@__fe_SolDecoder_20; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v1 i256; - return v7; -} - -func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v2.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; - v3.*@__fe_Cursor_19 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_19 = int_to_ptr v4 *@__fe_Cursor_19; - v6.*@__fe_CallData_18 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v8; - v10.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; - v11.*@__fe_Cursor_19 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - v13.*@__fe_Cursor_19 = int_to_ptr v12 *@__fe_Cursor_19; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v19.i256 = add v17 32.i256; - v20.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; - v21.*@__fe_Cursor_19 = gep v20 0.i256 0.i256; - v22.i256 = ptr_to_int v21 i256; - v23.*@__fe_Cursor_19 = int_to_ptr v22 *@__fe_Cursor_19; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - v26.i256 = mload v25 i256; - v27.i1 = lt v19 v26; - v28.i256 = zext v27 i256; - v29.i1 = ne v28 0.i256; - br v29 block1 block3; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v31.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; - v32.*@__fe_Cursor_19 = gep v31 0.i256 0.i256; - v33.i256 = ptr_to_int v32 i256; - v34.*@__fe_Cursor_19 = int_to_ptr v33 *@__fe_Cursor_19; - v35.*@__fe_CallData_18 = gep v34 0.i256 0.i256; - v36.i256 = ptr_to_int v35 i256; - v37.i256 = mload v36 i256; - v38.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; - v39.*@__fe_Cursor_19 = gep v38 0.i256 0.i256; - v40.i256 = ptr_to_int v39 i256; - v41.*@__fe_Cursor_19 = int_to_ptr v40 *@__fe_Cursor_19; - v42.*i256 = gep v41 0.i256 1.i256; - v43.i256 = ptr_to_int v42 i256; - v44.i256 = mload v43 i256; - v45.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v37 v44; - v47.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; - v48.*@__fe_Cursor_19 = gep v47 0.i256 0.i256; - v49.i256 = ptr_to_int v48 i256; - v50.*@__fe_Cursor_19 = int_to_ptr v49 *@__fe_Cursor_19; - v51.*i256 = gep v50 0.i256 1.i256; - v52.i256 = ptr_to_int v51 i256; - mstore v52 v19 i256; - return v45; - - block3: - v55.i1 = gt v19 v9; - v56.i256 = zext v55 i256; - v57.i1 = ne v56 0.i256; - br v57 block1 block2; -} - -func public %solencoder_h1b9228b90dad6928_new() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_17 = int_to_ptr v3 *@__fe_SolEncoder_17; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - mstore v6 0.i256 i256; - v7.*@__fe_SolEncoder_17 = int_to_ptr v3 *@__fe_SolEncoder_17; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 0.i256 i256; - v11.*@__fe_SolEncoder_17 = int_to_ptr v3 *@__fe_SolEncoder_17; - v13.*i256 = gep v11 0.i256 2.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 0.i256 i256; - return v3; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - -func private %storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393(v0.i256, v1.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = call %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df v4 v0; - v6.i256 = add v4 v5; - mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; -} - -func private %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v0.i256) -> i256 { - block0: - return v0; -} - -func private %evm_hef0af3106e109414_log_h22d1a10952034bae_log3_arg0_root_stor(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256, v5.i256) { - block0: - evm_log3 v1 v2 v3 v4 v5; - return; -} - -func private %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v0 v1; - return v3; -} - -func private %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_tuple_5 = int_to_ptr v1 *@__fe_tuple_5; - v4.*@__fe_Address_0 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v0 v6; - v8.*@__fe_tuple_5 = int_to_ptr v1 *@__fe_tuple_5; - v10.*@__fe_Address_0 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - v12.i256 = mload v11 i256; - v13.i256 = add v0 v7; - v14.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v13 v12; - v15.i256 = add v7 v14; - return v15; -} - -func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func public %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_19 = int_to_ptr v4 *@__fe_Cursor_19; - v6.*@__fe_CallData_18 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 v0 i256; - v8.*@__fe_Cursor_19 = int_to_ptr v4 *@__fe_Cursor_19; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 0.i256 i256; - return v4; -} - -func public %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Cursor_19 = int_to_ptr v0 *@__fe_Cursor_19; - v4.*@__fe_CallData_18 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v8.*i8 = evm_malloc 64.i256; - v9.i256 = ptr_to_int v8 i256; - v10.*@__fe_Cursor_19 = int_to_ptr v9 *@__fe_Cursor_19; - v11.*@__fe_CallData_18 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v6 i256; - v13.*@__fe_Cursor_19 = int_to_ptr v9 *@__fe_Cursor_19; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v1 i256; - return v9; -} - -func private %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_tuple_11 = int_to_ptr v1 *@__fe_tuple_11; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v0 v6; - v8.*@__fe_tuple_11 = int_to_ptr v1 *@__fe_tuple_11; - v10.*@__fe_Address_0 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - v12.i256 = mload v11 i256; - v13.i256 = add v0 v7; - v14.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v13 v12; - v15.i256 = add v7 v14; - return v15; -} - -func private %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { - block0: - mstore v0 v1 i256; - return 32.i256; -} - - -object @CoolCoin { - section init { - entry %__CoolCoin_init; - embed .runtime as &__CoolCoin_runtime; - } - section runtime { - entry %__CoolCoin_runtime; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/erc20_low_level.snap b/crates/codegen/tests/fixtures/sonatina_ir/erc20_low_level.snap deleted file mode 100644 index b5237009f7..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/erc20_low_level.snap +++ /dev/null @@ -1,495 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/erc20_low_level.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Address_0 = {i256}; -type @__fe_tuple_1 = {@__fe_Address_0, @__fe_Address_0}; - -func private %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - mstore 0.i256 v0 i256; - evm_return 0.i256 32.i256; -} - -func private %abi_encode_string__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) { - block0: - mstore 0.i256 32.i256 i256; - mstore 32.i256 v1 i256; - mstore 64.i256 v0 i256; - evm_return 0.i256 96.i256; -} - -func private %init__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd 0.i256 0.i256; - call %do_init__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v1 0.i256 0.i256; - v2.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; - v3.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; - evm_code_copy 0.i256 v3 v2; - evm_return 0.i256 v2; -} - -func private %runtime__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd 0.i256 0.i256; - v2.i256 = evm_calldata_load 0.i256; - v4.i256 = shr 224.i256 v2; - jump block11; - - block1: - v6.i256 = evm_calldata_load 4.i256; - v8.i256 = call %balance_of__0_1_StorPtr_Erc20_0__1____896784bc09903ba1 v6 v1; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v8 0.i256; - evm_invalid; - - block2: - v9.i256 = evm_calldata_load 4.i256; - v11.i256 = evm_calldata_load 36.i256; - v13.i256 = call %allowance__0_1_StorPtr_Erc20_0__1____896784bc09903ba1 v9 v11 v1; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v13 0.i256; - evm_invalid; - - block3: - call %abi_encode_string__Evm_hef0af3106e109414__3af54274b2985741 31840933704928615426292613906591192052886564858731089189578963311002547912704.i256 7.i256 0.i256; - evm_invalid; - - block4: - call %abi_encode_string__Evm_hef0af3106e109414__3af54274b2985741 31784391594991486112232083260356792451358613714049171750120207607087736291328.i256 3.i256 0.i256; - evm_invalid; - - block5: - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 18.i256 0.i256; - evm_invalid; - - block6: - v19.i256 = evm_calldata_load 4.i256; - v20.i256 = evm_calldata_load 36.i256; - v22.i256 = call %transfer__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v19 v20 v1 0.i256 0.i256; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v22 0.i256; - evm_invalid; - - block7: - v23.i256 = evm_calldata_load 4.i256; - v24.i256 = evm_calldata_load 36.i256; - v26.i256 = call %approve__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414__68ea22e02fe2444b v23 v24 v1 0.i256; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v26 0.i256; - evm_invalid; - - block8: - v27.i256 = evm_calldata_load 4.i256; - v28.i256 = evm_calldata_load 36.i256; - v30.i256 = evm_calldata_load 68.i256; - v32.i256 = call %transfer_from__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v27 v28 v30 v1 0.i256 0.i256; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v32 0.i256; - evm_invalid; - - block9: - v33.i256 = evm_calldata_load 4.i256; - v34.i256 = evm_calldata_load 36.i256; - v36.i256 = call %mint__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v33 v34 v1 0.i256 0.i256; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v36 0.i256; - evm_invalid; - - block10: - evm_revert 0.i256 0.i256; - - block11: - v47.i1 = eq v4 1889567281.i256; - br v47 block1 block12; - - block12: - v48.i1 = eq v4 3714247998.i256; - br v48 block2 block13; - - block13: - v49.i1 = eq v4 117300739.i256; - br v49 block3 block14; - - block14: - v50.i1 = eq v4 2514000705.i256; - br v50 block4 block15; - - block15: - v51.i1 = eq v4 826074471.i256; - br v51 block5 block16; - - block16: - v52.i1 = eq v4 2835717307.i256; - br v52 block6 block17; - - block17: - v53.i1 = eq v4 157198259.i256; - br v53 block7 block18; - - block18: - v54.i1 = eq v4 599290589.i256; - br v54 block8 block19; - - block19: - v55.i1 = eq v4 1086394137.i256; - br v55 block9 block10; -} - -func private %stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703 v1; - return v3; -} - -func private %do_init__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = evm_caller; - call %erc20_______h94f6fe6e679122ca_set_owner_once_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2 v0 v4 v2; - return; -} - -func private %balance_of__0_1_StorPtr_Erc20_0__1____896784bc09903ba1(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - return v3; -} - -func private %allowance__0_1_StorPtr_Erc20_0__1____896784bc09903ba1(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v0 i256; - v10.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v1 i256; - v14.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v6; - return v14; -} - -func private %transfer__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i256 { - block0: - v6.i256 = evm_caller; - call %erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2 v2 v6 v0 v1 v4; - return 1.i256; -} - -func private %approve__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414__68ea22e02fe2444b(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.i256 = evm_caller; - call %erc20_______h94f6fe6e679122ca_approve_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v2 v5 v0 v1; - return 1.i256; -} - -func private %transfer_from__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256, v5.i256) -> i256 { - block0: - call %erc20_______h94f6fe6e679122ca_transfer_from_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee v3 v0 v1 v2 v4 v5; - return 1.i256; -} - -func private %mint__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i256 { - block0: - call %erc20_______h94f6fe6e679122ca_mint_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee v2 v0 v1 v3 v4; - return 1.i256; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703(v0.i256) -> i256 { - block0: - return v0; -} - -func private %erc20_______h94f6fe6e679122ca_set_owner_once_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2(v0.i256, v1.i256, v2.i256) { - block0: - v5.i256 = add v0 1.i256; - v6.i256 = evm_sload v5; - v7.i256 = call %address_h257056268eac7027_zero; - v8.i256 = call %ne_stor_arg0_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v6 v7; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v12.i256 = add v0 1.i256; - evm_sstore v12 v1; - return; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v1 0.i256; - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v3; - return v4; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(v0.i256, v1.i256) -> i256 { - block0: - v4.i256 = call %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256; - v5.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v4; - return v5; -} - -func private %erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) { - block0: - v6.i256 = call %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v1; - v7.i1 = lt v6 v3; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v12.i256 = call %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v2; - v16.i256 = sub v6 v3; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1 v16; - v17.i256 = add v12 v3; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v2 v17; - return; -} - -func private %erc20_______h94f6fe6e679122ca_approve_stor_arg0_root_stor__0_1__e4c8be10cab939c2(v0.i256, v1.i256, v2.i256, v3.i256) { - block0: - v6.*i8 = evm_malloc 64.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_tuple_1 = int_to_ptr v7 *@__fe_tuple_1; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v1 i256; - v11.*@__fe_tuple_1 = int_to_ptr v7 *@__fe_tuple_1; - v13.*@__fe_Address_0 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v2 i256; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v7 v3; - return; -} - -func private %erc20_______h94f6fe6e679122ca_transfer_from_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256, v5.i256) { - block0: - v7.i256 = evm_caller; - v8.i256 = call %erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v1 v7; - v9.i1 = lt v8 v3; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block1 block2; - - block1: - evm_revert 0.i256 0.i256; - - block2: - call %erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2 v0 v1 v2 v3 v5; - v18.*i8 = evm_malloc 64.i256; - v19.i256 = ptr_to_int v18 i256; - v20.*@__fe_tuple_1 = int_to_ptr v19 *@__fe_tuple_1; - v21.*@__fe_Address_0 = gep v20 0.i256 0.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v1 i256; - v24.*@__fe_tuple_1 = int_to_ptr v19 *@__fe_tuple_1; - v26.*@__fe_Address_0 = gep v24 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v7 i256; - v29.i256 = sub v8 v3; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v19 v29; - return; -} - -func private %erc20_______h94f6fe6e679122ca_mint_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) { - block0: - v6.i256 = evm_caller; - v8.i256 = add v0 1.i256; - v9.i256 = evm_sload v8; - v10.i256 = call %ne_arg1_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v6 v9; - v11.i1 = ne v10 0.i256; - br v11 block1 block2; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v14.i256 = call %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v1; - v16.i256 = add v14 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1 v16; - v17.i256 = evm_sload v0; - v18.i256 = add v17 v2; - evm_sstore v0 v18; - return; -} - -func public %address_h257056268eac7027_zero() -> i256 { - block0: - return 0.i256; -} - -func private %ne_stor_arg0_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %address_h257056268eac7027_eq_h14b330e44530c410_eq_stor_arg0_root_stor v0 v1; - v4.i1 = is_zero v3; - v5.i256 = zext v4 i256; - return v5; -} - -func private %storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; - v4.i256 = evm_sload v3; - return v4; -} - -func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; - v4.i256 = evm_sload v3; - return v4; -} - -func private %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1; - return v3; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v1 0.i256 v4; - return; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256 v4; - return; -} - -func private %erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v1 i256; - v10.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 v2 i256; - v14.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v6; - return v14; -} - -func private %ne_arg1_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %address_h257056268eac7027_eq_h14b330e44530c410_eq_arg1_root_stor v0 v1; - v4.i1 = is_zero v3; - v5.i256 = zext v4 i256; - return v5; -} - -func private %address_h257056268eac7027_eq_h14b330e44530c410_eq_stor_arg0_root_stor(v0.i256, v1.i256) -> i256 { - block0: - v3.i1 = eq v0 v1; - v4.i256 = zext v3 i256; - return v4; -} - -func private %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v4 v0; - v6.i256 = add v4 v5; - mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; -} - -func private %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = call %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v4 v0; - v6.i256 = add v4 v5; - mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; -} - -func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; - evm_sstore v4 v2; - return; -} - -func private %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; - evm_sstore v4 v2; - return; -} - -func private %address_h257056268eac7027_eq_h14b330e44530c410_eq_arg1_root_stor(v0.i256, v1.i256) -> i256 { - block0: - v3.i1 = eq v0 v1; - v4.i256 = zext v3 i256; - return v4; -} - -func private %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v0 v1; - return v3; -} - -func private %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_tuple_1 = int_to_ptr v1 *@__fe_tuple_1; - v4.*@__fe_Address_0 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v0 v6; - v8.*@__fe_tuple_1 = int_to_ptr v1 *@__fe_tuple_1; - v10.*@__fe_Address_0 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - v12.i256 = mload v11 i256; - v13.i256 = add v0 v7; - v14.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v13 v12; - v15.i256 = add v7 v14; - return v15; -} - -func private %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { - block0: - mstore v0 v1 i256; - return 32.i256; -} - - -object @Erc20Contract { - section init { - entry %init__StorPtr_Evm___207f35a85ac4062e; - embed .runtime as &runtime__StorPtr_Evm___207f35a85ac4062e; - } - section runtime { - entry %runtime__StorPtr_Evm___207f35a85ac4062e; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/event_logging.snap b/crates/codegen/tests/fixtures/sonatina_ir/event_logging.snap deleted file mode 100644 index 5ed7e7a6f8..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/event_logging.snap +++ /dev/null @@ -1,188 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/event_logging.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Address_0 = {i256}; -type @__fe_Transfer_1 = {@__fe_Address_0, @__fe_Address_0, i256}; -type @__fe_tuple_2 = {i256, i256}; -type @__fe_SolEncoder_3 = {i256, i256, i256}; - -func private %emit_transfer(v0.i256, v1.i256, v2.i256, v3.i256) { - block0: - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Transfer_1 = int_to_ptr v7 *@__fe_Transfer_1; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v1 i256; - v11.*@__fe_Transfer_1 = int_to_ptr v7 *@__fe_Transfer_1; - v13.*@__fe_Address_0 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v2 i256; - v15.*@__fe_Transfer_1 = int_to_ptr v7 *@__fe_Transfer_1; - v17.*i256 = gep v15 0.i256 2.i256; - v18.i256 = ptr_to_int v17 i256; - mstore v18 v3 i256; - call %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741 v7 v0; - return; -} - -func private %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - v3.i256 = call %solencoder_h1b9228b90dad6928_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - v6.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v10 v3; - v11.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v12.*@__fe_tuple_2 = int_to_ptr v11 *@__fe_tuple_2; - v13.*i256 = gep v12 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - v16.*@__fe_tuple_2 = int_to_ptr v11 *@__fe_tuple_2; - v18.*i256 = gep v16 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - v20.i256 = mload v19 i256; - v21.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v22.*@__fe_Address_0 = gep v21 0.i256 0.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.i256 = call %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic v24; - v26.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v27.*@__fe_Address_0 = gep v26 0.i256 1.i256; - v28.i256 = ptr_to_int v27 i256; - v29.i256 = mload v28 i256; - v30.i256 = call %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic v29; - call %evm_hef0af3106e109414_log_h22d1a10952034bae_log3 v1 v15 v20 -15402802100530019096323380498944738953123845089667699673314898783681816316945.i256 v25 v30; - return; -} - -func public %solencoder_h1b9228b90dad6928_new() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_3 = int_to_ptr v3 *@__fe_SolEncoder_3; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - mstore v6 0.i256 i256; - v7.*@__fe_SolEncoder_3 = int_to_ptr v3 *@__fe_SolEncoder_3; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 0.i256 i256; - v11.*@__fe_SolEncoder_3 = int_to_ptr v3 *@__fe_SolEncoder_3; - v13.*i256 = gep v11 0.i256 2.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 0.i256 i256; - return v3; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i1 = eq v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - v11.*i8 = evm_malloc v1; - v12.i256 = ptr_to_int v11 i256; - v14.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v17.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v12 i256; - v21.i256 = add v12 v1; - v22.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - jump block2; - - block2: - v27.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - return v30; -} - -func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { - block0: - v2.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v12.*i8 = evm_malloc 64.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_tuple_2 = int_to_ptr v13 *@__fe_tuple_2; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v5 i256; - v17.i256 = sub v10 v5; - v18.*@__fe_tuple_2 = int_to_ptr v13 *@__fe_tuple_2; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v17 i256; - return v13; -} - -func private %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v0.i256) -> i256 { - block0: - return v0; -} - -func private %evm_hef0af3106e109414_log_h22d1a10952034bae_log3(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256, v5.i256) { - block0: - evm_log3 v1 v2 v3 v4 v5; - return; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - -func public %__fe_sonatina_entry() { - block0: - call %emit_transfer 0.i256 0.i256 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/event_logging_via_log.snap b/crates/codegen/tests/fixtures/sonatina_ir/event_logging_via_log.snap deleted file mode 100644 index 2a42d77492..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/event_logging_via_log.snap +++ /dev/null @@ -1,194 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/event_logging_via_log.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Address_0 = {i256}; -type @__fe_Transfer_1 = {@__fe_Address_0, @__fe_Address_0, i256}; -type @__fe_tuple_2 = {i256, i256}; -type @__fe_SolEncoder_3 = {i256, i256, i256}; - -func private %emit_transfer(v0.i256, v1.i256, v2.i256, v3.i256) { - block0: - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Transfer_1 = int_to_ptr v7 *@__fe_Transfer_1; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v1 i256; - v11.*@__fe_Transfer_1 = int_to_ptr v7 *@__fe_Transfer_1; - v13.*@__fe_Address_0 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v2 i256; - v15.*@__fe_Transfer_1 = int_to_ptr v7 *@__fe_Transfer_1; - v17.*i256 = gep v15 0.i256 2.i256; - v18.i256 = ptr_to_int v17 i256; - mstore v18 v3 i256; - call %emit__Evm_hef0af3106e109414_Transfer_h628c212e2bb5f76f__243b05efdcd63652 v0 v7; - return; -} - -func private %emit__Evm_hef0af3106e109414_Transfer_h628c212e2bb5f76f__243b05efdcd63652(v0.i256, v1.i256) { - block0: - call %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741 v1 v0; - return; -} - -func private %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - v3.i256 = call %solencoder_h1b9228b90dad6928_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - v6.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v10 v3; - v11.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v12.*@__fe_tuple_2 = int_to_ptr v11 *@__fe_tuple_2; - v13.*i256 = gep v12 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - v16.*@__fe_tuple_2 = int_to_ptr v11 *@__fe_tuple_2; - v18.*i256 = gep v16 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - v20.i256 = mload v19 i256; - v21.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v22.*@__fe_Address_0 = gep v21 0.i256 0.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.i256 = call %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic v24; - v26.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v27.*@__fe_Address_0 = gep v26 0.i256 1.i256; - v28.i256 = ptr_to_int v27 i256; - v29.i256 = mload v28 i256; - v30.i256 = call %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic v29; - call %evm_hef0af3106e109414_log_h22d1a10952034bae_log3 v1 v15 v20 -15402802100530019096323380498944738953123845089667699673314898783681816316945.i256 v25 v30; - return; -} - -func public %solencoder_h1b9228b90dad6928_new() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_3 = int_to_ptr v3 *@__fe_SolEncoder_3; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - mstore v6 0.i256 i256; - v7.*@__fe_SolEncoder_3 = int_to_ptr v3 *@__fe_SolEncoder_3; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 0.i256 i256; - v11.*@__fe_SolEncoder_3 = int_to_ptr v3 *@__fe_SolEncoder_3; - v13.*i256 = gep v11 0.i256 2.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 0.i256 i256; - return v3; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i1 = eq v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - v11.*i8 = evm_malloc v1; - v12.i256 = ptr_to_int v11 i256; - v14.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v17.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v12 i256; - v21.i256 = add v12 v1; - v22.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - jump block2; - - block2: - v27.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - return v30; -} - -func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { - block0: - v2.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v12.*i8 = evm_malloc 64.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_tuple_2 = int_to_ptr v13 *@__fe_tuple_2; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v5 i256; - v17.i256 = sub v10 v5; - v18.*@__fe_tuple_2 = int_to_ptr v13 *@__fe_tuple_2; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v17 i256; - return v13; -} - -func private %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v0.i256) -> i256 { - block0: - return v0; -} - -func private %evm_hef0af3106e109414_log_h22d1a10952034bae_log3(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256, v5.i256) { - block0: - evm_log3 v1 v2 v3 v4 v5; - return; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - -func public %__fe_sonatina_entry() { - block0: - call %emit_transfer 0.i256 0.i256 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/for_array.snap b/crates/codegen/tests/fixtures/sonatina_ir/for_array.snap deleted file mode 100644 index 519ad5a45e..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/for_array.snap +++ /dev/null @@ -1,69 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/for_array.fe ---- -target = "evm-ethereum-osaka" - -global private const [i8; 800] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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, 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, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25]; - -func public %for_array_sum() -> i256 { - block0: - v2.*i8 = evm_malloc 800.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_25__540b817a073b29f5 v3; - jump block1; - - block1: - v24.i256 = phi (0.i256 block0) (v16 block3); - v7.i256 = phi (0.i256 block0) (v19 block3); - v9.i1 = lt v7 v6; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block2 block4; - - block2: - v14.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_25__540b817a073b29f5 v3 v7; - v16.i256 = add v24 v14; - jump block3; - - block3: - v19.i256 = add v7 1.i256; - jump block1; - - block4: - return v24; -} - -func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_25__540b817a073b29f5(v0.i256) -> i256 { - block0: - return 25.i256; -} - -func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_25__540b817a073b29f5(v0.i256, v1.i256) -> i256 { - block0: - v3.*[i256; 25] = int_to_ptr v0 *[i256; 25]; - v4.*i256 = gep v3 0.i256 v1; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i64 = trunc v6 i64; - v8.i256 = zext v7 i256; - return v8; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %for_array_sum; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - data $__fe_const_data_0; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/for_array_large.snap b/crates/codegen/tests/fixtures/sonatina_ir/for_array_large.snap deleted file mode 100644 index f1ce77546e..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/for_array_large.snap +++ /dev/null @@ -1,69 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/for_array_large.fe ---- -target = "evm-ethereum-osaka" - -global private const [i8; 320] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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, 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, 10]; - -func public %for_array_large_sum() -> i256 { - block0: - v2.*i8 = evm_malloc 320.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_10__2b47acd750beacf4 v3; - jump block1; - - block1: - v24.i256 = phi (0.i256 block0) (v16 block3); - v7.i256 = phi (0.i256 block0) (v19 block3); - v9.i1 = lt v7 v6; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block2 block4; - - block2: - v14.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_10__2b47acd750beacf4 v3 v7; - v16.i256 = add v24 v14; - jump block3; - - block3: - v19.i256 = add v7 1.i256; - jump block1; - - block4: - return v24; -} - -func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_10__2b47acd750beacf4(v0.i256) -> i256 { - block0: - return 10.i256; -} - -func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_10__2b47acd750beacf4(v0.i256, v1.i256) -> i256 { - block0: - v3.*[i256; 10] = int_to_ptr v0 *[i256; 10]; - v4.*i256 = gep v3 0.i256 v1; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i64 = trunc v6 i64; - v8.i256 = zext v7 i256; - return v8; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %for_array_large_sum; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - data $__fe_const_data_0; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/for_range.snap b/crates/codegen/tests/fixtures/sonatina_ir/for_range.snap deleted file mode 100644 index 2a3e4f79a9..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/for_range.snap +++ /dev/null @@ -1,83 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/for_range.fe ---- -target = "evm-ethereum-osaka" - -func public %for_range_sum() -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - mstore v4 0.i256 i256; - v6.i256 = add v4 32.i256; - mstore v6 10.i256 i256; - v7.i256 = call %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len v4; - jump block1; - - block1: - v25.i256 = phi (0.i256 block0) (v17 block3); - v8.i256 = phi (0.i256 block0) (v20 block3); - v10.i1 = lt v8 v7; - v11.i256 = zext v10 i256; - v12.i1 = ne v11 0.i256; - br v12 block2 block4; - - block2: - v15.i256 = call %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get v4 v8; - v17.i256 = add v25 v15; - jump block3; - - block3: - v20.i256 = add v8 1.i256; - jump block1; - - block4: - return v25; -} - -func private %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len(v0.i256) -> i256 { - block0: - v3.i256 = add v0 32.i256; - v4.i256 = mload v3 i256; - v5.i256 = mload v0 i256; - v6.i1 = lt v4 v5; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; - - block1: - jump block3; - - block2: - v10.i256 = add v0 32.i256; - v11.i256 = mload v10 i256; - v12.i256 = mload v0 i256; - v13.i256 = sub v11 v12; - jump block3; - - block3: - v14.i256 = phi (0.i256 block1) (v13 block2); - return v14; -} - -func private %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = mload v0 i256; - v4.i256 = add v3 v1; - return v4; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %for_range_sum; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/full_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/full_contract.snap deleted file mode 100644 index ee8ff04606..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/full_contract.snap +++ /dev/null @@ -1,114 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/full_contract.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Point_0 = {i256, i256}; - -func private %abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - mstore 0.i256 v0 i256; - evm_return 0.i256 32.i256; -} - -func private %init__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = sym_size &dispatch__StorPtr_Evm___207f35a85ac4062e; - v2.i256 = sym_addr &dispatch__StorPtr_Evm___207f35a85ac4062e; - evm_code_copy 0.i256 v2 v1; - evm_return 0.i256 v1; -} - -func private %dispatch__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = evm_calldata_load 0.i256; - v3.i256 = shr 224.i256 v1; - v5.i1 = eq v3 151146943.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - v9.i256 = evm_calldata_load 4.i256; - v11.i256 = evm_calldata_load 36.i256; - v13.*i8 = evm_malloc 64.i256; - v14.i256 = ptr_to_int v13 i256; - v15.*@__fe_Point_0 = int_to_ptr v14 *@__fe_Point_0; - v16.*i256 = gep v15 0.i256 0.i256; - v17.i256 = ptr_to_int v16 i256; - mstore v17 v9 i256; - v18.*@__fe_Point_0 = int_to_ptr v14 *@__fe_Point_0; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v11 i256; - v22.*@__fe_Point_0 = int_to_ptr v14 *@__fe_Point_0; - v23.*i256 = gep v22 0.i256 0.i256; - v24.i256 = ptr_to_int v23 i256; - v25.i256 = mload v24 i256; - v26.i256 = add v25 1.i256; - v27.*@__fe_Point_0 = int_to_ptr v14 *@__fe_Point_0; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - mstore v29 v26 i256; - v30.*@__fe_Point_0 = int_to_ptr v14 *@__fe_Point_0; - v31.*i256 = gep v30 0.i256 1.i256; - v32.i256 = ptr_to_int v31 i256; - v33.i256 = mload v32 i256; - v35.i256 = add v33 2.i256; - v36.*@__fe_Point_0 = int_to_ptr v14 *@__fe_Point_0; - v37.*i256 = gep v36 0.i256 1.i256; - v38.i256 = ptr_to_int v37 i256; - mstore v38 v35 i256; - v39.i256 = call %point_hac92469562809d28_area v14; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v39 0.i256; - evm_invalid; - - block2: - v42.i1 = eq v3 2066295049.i256; - v43.i256 = zext v42 i256; - v44.i1 = ne v43 0.i256; - br v44 block3 block4; - - block3: - v45.i256 = evm_calldata_load 4.i256; - v47.i256 = add v45 3.i256; - v48.i256 = call %square_h97afaa872b6ea17e_area v47; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v48 0.i256; - evm_invalid; - - block4: - evm_return 0.i256 0.i256; -} - -func private %point_hac92469562809d28_area(v0.i256) -> i256 { - block0: - v2.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v8.*i256 = gep v6 0.i256 1.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.i256 = mul v5 v10; - return v11; -} - -func private %square_h97afaa872b6ea17e_area(v0.i256) -> i256 { - block0: - v2.i256 = mul v0 v0; - return v2; -} - - -object @ShapeDispatcher { - section init { - entry %init__StorPtr_Evm___207f35a85ac4062e; - embed .runtime as &dispatch__StorPtr_Evm___207f35a85ac4062e; - } - section runtime { - entry %dispatch__StorPtr_Evm___207f35a85ac4062e; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/function_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/function_call.snap deleted file mode 100644 index d3649501ab..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/function_call.snap +++ /dev/null @@ -1,31 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/function_call.fe ---- -target = "evm-ethereum-osaka" - -func public %add_one(v0.i256) -> i256 { - block0: - v3.i256 = add v0 1.i256; - return v3; -} - -func public %call_add_one() -> i256 { - block0: - v2.i256 = call %add_one 5.i256; - return v2; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %add_one 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/generic_identity.snap b/crates/codegen/tests/fixtures/sonatina_ir/generic_identity.snap deleted file mode 100644 index 74545c28b8..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/generic_identity.snap +++ /dev/null @@ -1,41 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/generic_identity.fe ---- -target = "evm-ethereum-osaka" - -func private %call_identity_u32() -> i256 { - block0: - v2.i256 = call %identity__u32__20aa0c10687491ad 7.i256; - return v2; -} - -func private %call_identity_bool() -> i256 { - block0: - v2.i256 = call %identity__bool__947c0c03c59c6f07 1.i256; - return v2; -} - -func private %identity__u32__20aa0c10687491ad(v0.i256) -> i256 { - block0: - return v0; -} - -func private %identity__bool__947c0c03c59c6f07(v0.i256) -> i256 { - block0: - return v0; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %call_identity_u32; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/high_level_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/high_level_contract.snap deleted file mode 100644 index bb06a5d036..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/high_level_contract.snap +++ /dev/null @@ -1,675 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/high_level_contract.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_MemoryBytes_0 = {i256, i256}; -type @__fe_tuple_1 = {i256, i256}; -type @__fe_Cursor_2 = {@__fe_MemoryBytes_0, i256}; -type @__fe_SolDecoder_3 = {@__fe_Cursor_2, i256}; -type @__fe_SolEncoder_4 = {i256, i256, i256}; -type @__fe_CallData_5 = {i256}; -type @__fe_Cursor_6 = {@__fe_CallData_5, i256}; -type @__fe_SolDecoder_7 = {@__fe_Cursor_6, i256}; - -func private %__EchoContract_init_contract(v0.i256, v1.i256, v2.i256) { - block0: - evm_sstore v2 v0; - v5.i256 = add v2 1.i256; - evm_sstore v5 v1; - return; -} - -func private %__EchoContract_recv_0_0() -> i256 { - block0: - return 42.i256; -} - -func private %__EchoContract_recv_0_1(v0.i256) -> i256 { - block0: - return v0; -} - -func private %__EchoContract_recv_0_2(v0.i256) -> i256 { - block0: - v2.i256 = evm_sload v0; - return v2; -} - -func private %__EchoContract_init() { - block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d 0.i256 0.i256; - v2.i256 = sym_addr &__EchoContract_runtime; - v3.i256 = sym_size &__EchoContract_runtime; - v4.i256 = sym_size .; - v5.i256 = evm_code_size; - v6.i1 = lt v5 v4; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v11.i256 = sub v5 v4; - v12.i256 = sub v5 v4; - v13.*i8 = evm_malloc v12; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = sub v5 v4; - evm_code_copy v14 v4 v15; - v17.*i8 = evm_malloc 64.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*@__fe_MemoryBytes_0 = int_to_ptr v18 *@__fe_MemoryBytes_0; - v20.*i256 = gep v19 0.i256 0.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v14 i256; - v22.i256 = sub v5 v4; - v23.*@__fe_MemoryBytes_0 = int_to_ptr v18 *@__fe_MemoryBytes_0; - v25.*i256 = gep v23 0.i256 1.i256; - v26.i256 = ptr_to_int v25 i256; - mstore v26 v22 i256; - v27.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v18; - v28.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v27; - v29.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v27; - call %__EchoContract_init_contract v28 v29 v1; - evm_code_copy 0.i256 v2 v3; - evm_return 0.i256 v3; -} - -func private %__EchoContract_runtime() { - block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 0.i256 0.i256; - v2.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v3.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v7.i1 = eq v2 1.i256; - br v7 block2 block5; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - call %answer_he729876072a4af6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v3; - v11.i256 = call %__EchoContract_recv_0_0; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v11; - evm_invalid; - - block3: - v13.i256 = call %echo_h9f932a87feb06bd2_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v3; - v14.i256 = call %__EchoContract_recv_0_1 v13; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v14; - evm_invalid; - - block4: - call %getx_hdbb0a53a8b757989_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v3; - v17.i256 = call %__EchoContract_recv_0_2 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v17; - evm_invalid; - - block5: - v8.i1 = eq v2 2.i256; - br v8 block3 block6; - - block6: - v9.i1 = eq v2 3.i256; - br v9 block4 block1; -} - -func private %init_field__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v0 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { - block0: - evm_revert 0.i256 0.i256; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d 0.i256 v1; - return v3; -} - -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; - evm_invalid; - - block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; -} - -func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; -} - -func private %answer_he729876072a4af6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func private %echo_h9f932a87feb06bd2_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - return v2; -} - -func private %getx_hdbb0a53a8b757989_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v11.*i256 = gep v10 0.i256 0.i256 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - v13.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v15.*i256 = gep v13 0.i256 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v18.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v19.*i256 = gep v18 0.i256 0.i256 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v17 i256; - v21.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v22.*i256 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v26.*i256 = gep v25 0.i256 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v29.*i256 = gep v28 0.i256 1.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 0.i256 i256; - return v5; -} - -func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; - v3.*@__fe_Cursor_2 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v6.*@__fe_MemoryBytes_0 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = call %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len v7; - v9.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; - v10.*@__fe_Cursor_2 = gep v9 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_Cursor_2 = int_to_ptr v11 *@__fe_Cursor_2; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v18.i256 = add v16 32.i256; - v19.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; - v20.*@__fe_Cursor_2 = gep v19 0.i256 0.i256; - v21.i256 = ptr_to_int v20 i256; - v22.*@__fe_Cursor_2 = int_to_ptr v21 *@__fe_Cursor_2; - v23.*i256 = gep v22 0.i256 1.i256; - v24.i256 = ptr_to_int v23 i256; - v25.i256 = mload v24 i256; - v26.i1 = lt v18 v25; - v27.i256 = zext v26 i256; - v28.i1 = ne v27 0.i256; - br v28 block1 block3; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v30.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; - v31.*@__fe_Cursor_2 = gep v30 0.i256 0.i256; - v32.i256 = ptr_to_int v31 i256; - v33.*@__fe_Cursor_2 = int_to_ptr v32 *@__fe_Cursor_2; - v34.*i256 = gep v33 0.i256 1.i256; - v35.i256 = ptr_to_int v34 i256; - v36.i256 = mload v35 i256; - v37.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; - v38.*@__fe_Cursor_2 = gep v37 0.i256 0.i256; - v39.i256 = ptr_to_int v38 i256; - v40.*@__fe_Cursor_2 = int_to_ptr v39 *@__fe_Cursor_2; - v41.*@__fe_MemoryBytes_0 = gep v40 0.i256 0.i256; - v42.i256 = ptr_to_int v41 i256; - v43.i256 = call %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at v42 v36; - v45.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; - v46.*@__fe_Cursor_2 = gep v45 0.i256 0.i256; - v47.i256 = ptr_to_int v46 i256; - v48.*@__fe_Cursor_2 = int_to_ptr v47 *@__fe_Cursor_2; - v49.*i256 = gep v48 0.i256 1.i256; - v50.i256 = ptr_to_int v49 i256; - mstore v50 v18 i256; - return v43; - - block3: - v53.i1 = gt v18 v8; - v54.i256 = zext v53 i256; - v55.i1 = ne v54 0.i256; - br v55 block1 block2; -} - -func private %stor_ptr__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { - block0: - return 0.i256; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; - return v5; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { - block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { - block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i1 = eq v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - v11.*i8 = evm_malloc v1; - v12.i256 = ptr_to_int v11 i256; - v14.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v17.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v12 i256; - v21.i256 = add v12 v1; - v22.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - jump block2; - - block2: - v27.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - return v30; -} - -func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { - block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v12.*i8 = evm_malloc 64.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_tuple_1 = int_to_ptr v13 *@__fe_tuple_1; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v5 i256; - v17.i256 = sub v10 v5; - v18.*@__fe_tuple_1 = int_to_ptr v13 *@__fe_tuple_1; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v17 i256; - return v13; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { - block0: - evm_return v1 v2; -} - -func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - return v2; -} - -func public %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 v8 i256; - v12.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v18.*i256 = gep v17 0.i256 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v16 i256; - v20.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v21.*i256 = gep v20 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 0.i256 i256; - return v4; -} - -func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v2 0.i256 1.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - return v6; -} - -func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i256 = add v6 v1; - v8.i256 = add v6 v1; - v9.i256 = mload v8 i256; - return v9; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26(v0.i256) -> i256 { - block0: - return v0; -} - -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v13.*i256 = gep v12 0.i256 0.i256 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v11 i256; - v15.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v17.*i256 = gep v15 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v21.*i256 = gep v20 0.i256 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v19 i256; - v23.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v1 i256; - return v7; -} - -func public %solencoder_h1b9228b90dad6928_new() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - mstore v6 0.i256 i256; - v7.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 0.i256 i256; - v11.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v13.*i256 = gep v11 0.i256 2.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 0.i256 i256; - return v3; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - -func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v2.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; - v3.*@__fe_Cursor_6 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v8; - v10.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; - v11.*@__fe_Cursor_6 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v12 *@__fe_Cursor_6; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v19.i256 = add v17 32.i256; - v20.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; - v21.*@__fe_Cursor_6 = gep v20 0.i256 0.i256; - v22.i256 = ptr_to_int v21 i256; - v23.*@__fe_Cursor_6 = int_to_ptr v22 *@__fe_Cursor_6; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - v26.i256 = mload v25 i256; - v27.i1 = lt v19 v26; - v28.i256 = zext v27 i256; - v29.i1 = ne v28 0.i256; - br v29 block1 block3; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v31.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; - v32.*@__fe_Cursor_6 = gep v31 0.i256 0.i256; - v33.i256 = ptr_to_int v32 i256; - v34.*@__fe_Cursor_6 = int_to_ptr v33 *@__fe_Cursor_6; - v35.*@__fe_CallData_5 = gep v34 0.i256 0.i256; - v36.i256 = ptr_to_int v35 i256; - v37.i256 = mload v36 i256; - v38.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; - v39.*@__fe_Cursor_6 = gep v38 0.i256 0.i256; - v40.i256 = ptr_to_int v39 i256; - v41.*@__fe_Cursor_6 = int_to_ptr v40 *@__fe_Cursor_6; - v42.*i256 = gep v41 0.i256 1.i256; - v43.i256 = ptr_to_int v42 i256; - v44.i256 = mload v43 i256; - v45.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v37 v44; - v47.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; - v48.*@__fe_Cursor_6 = gep v47 0.i256 0.i256; - v49.i256 = ptr_to_int v48 i256; - v50.*@__fe_Cursor_6 = int_to_ptr v49 *@__fe_Cursor_6; - v51.*i256 = gep v50 0.i256 1.i256; - v52.i256 = ptr_to_int v51 i256; - mstore v52 v19 i256; - return v45; - - block3: - v55.i1 = gt v19 v9; - v56.i256 = zext v55 i256; - v57.i1 = ne v56 0.i256; - br v57 block1 block2; -} - -func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func public %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 v0 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 0.i256 i256; - return v4; -} - -func public %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v8.*i8 = evm_malloc 64.i256; - v9.i256 = ptr_to_int v8 i256; - v10.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v11.*@__fe_CallData_5 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v6 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v1 i256; - return v9; -} - - -object @EchoContract { - section init { - entry %__EchoContract_init; - embed .runtime as &__EchoContract_runtime; - } - section runtime { - entry %__EchoContract_runtime; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/if_else.snap b/crates/codegen/tests/fixtures/sonatina_ir/if_else.snap deleted file mode 100644 index 9b261d9cc7..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/if_else.snap +++ /dev/null @@ -1,44 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/if_else.fe ---- -target = "evm-ethereum-osaka" - -func public %if_else(v0.i256) -> i256 { - block0: - v2.i1 = ne v0 0.i256; - br v2 block1 block2; - - block1: - v4.i256 = call %helper 1.i256; - jump block3; - - block2: - v6.i256 = call %helper 2.i256; - jump block3; - - block3: - v7.i256 = phi (v4 block1) (v6 block2); - return v7; -} - -func private %helper(v0.i256) -> i256 { - block0: - v3.i256 = add v0 1.i256; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %if_else 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/init_args_with_child_dep.snap b/crates/codegen/tests/fixtures/sonatina_ir/init_args_with_child_dep.snap deleted file mode 100644 index 895dd23115..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/init_args_with_child_dep.snap +++ /dev/null @@ -1,560 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/init_args_with_child_dep.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_MemoryBytes_0 = {i256, i256}; -type @__fe_tuple_1 = {i256, i256}; -type @__fe_SolEncoder_2 = {i256, i256, i256}; -type @__fe_Cursor_3 = {@__fe_MemoryBytes_0, i256}; -type @__fe_SolDecoder_4 = {@__fe_Cursor_3, i256}; -type @__fe_CallData_5 = {i256}; -type @__fe_Cursor_6 = {@__fe_CallData_5, i256}; -type @__fe_SolDecoder_7 = {@__fe_Cursor_6, i256}; - -func private %__Child_init_contract(v0.i256, v1.i256) { - block0: - return; -} - -func private %__Child_init() { - block0: - v0.i256 = sym_addr &__Child_runtime; - v1.i256 = sym_size &__Child_runtime; - v2.i256 = sym_size .; - v3.i256 = evm_code_size; - v4.i1 = lt v3 v2; - v5.i256 = zext v4 i256; - v7.i1 = ne v5 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v10.i256 = sub v3 v2; - v11.i256 = sub v3 v2; - v12.*i8 = evm_malloc v11; - v13.i256 = ptr_to_int v12 i256; - v14.i256 = sub v3 v2; - evm_code_copy v13 v2 v14; - v16.*i8 = evm_malloc 64.i256; - v17.i256 = ptr_to_int v16 i256; - v18.*@__fe_MemoryBytes_0 = int_to_ptr v17 *@__fe_MemoryBytes_0; - v19.*i256 = gep v18 0.i256 0.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v13 i256; - v21.i256 = sub v3 v2; - v22.*@__fe_MemoryBytes_0 = int_to_ptr v17 *@__fe_MemoryBytes_0; - v24.*i256 = gep v22 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - v26.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v17; - v27.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v26; - v28.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v26; - call %__Child_init_contract v27 v28; - evm_code_copy 0.i256 v0 v1; - evm_return 0.i256 v1; -} - -func private %__Child_runtime() { - block0: - v1.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v2.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - jump block1; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; -} - -func private %__Parent_init_contract(v0.i256, v1.i256) { - block0: - v4.*i8 = evm_malloc 64.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; - v7.*i256 = gep v6 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - mstore v8 v0 i256; - v9.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; - v11.*i256 = gep v9 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v0 i256; - v13.i256 = call %create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed v1 0.i256 v5; - return; -} - -func private %__Parent_init() { - block0: - v0.i256 = sym_addr &__Parent_runtime; - v1.i256 = sym_size &__Parent_runtime; - v2.i256 = sym_size .; - v3.i256 = evm_code_size; - v4.i1 = lt v3 v2; - v5.i256 = zext v4 i256; - v7.i1 = ne v5 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v10.i256 = sub v3 v2; - v11.i256 = sub v3 v2; - v12.*i8 = evm_malloc v11; - v13.i256 = ptr_to_int v12 i256; - v14.i256 = sub v3 v2; - evm_code_copy v13 v2 v14; - v16.*i8 = evm_malloc 64.i256; - v17.i256 = ptr_to_int v16 i256; - v18.*@__fe_MemoryBytes_0 = int_to_ptr v17 *@__fe_MemoryBytes_0; - v19.*i256 = gep v18 0.i256 0.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v13 i256; - v21.i256 = sub v3 v2; - v22.*@__fe_MemoryBytes_0 = int_to_ptr v17 *@__fe_MemoryBytes_0; - v24.*i256 = gep v22 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - v26.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v17; - v27.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v26; - call %__Parent_init_contract v27 0.i256; - evm_code_copy 0.i256 v0 v1; - evm_return 0.i256 v1; -} - -func private %__Parent_runtime() { - block0: - v1.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v2.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - jump block1; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { - block0: - evm_revert 0.i256 0.i256; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; - evm_invalid; - - block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; -} - -func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; -} - -func private %create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - v4.i256 = call %__Child_init_code_len; - v5.i256 = call %__Child_init_code_offset; - v7.i256 = add v4 64.i256; - v8.*i8 = evm_malloc v7; - v9.i256 = ptr_to_int v8 i256; - evm_code_copy v9 v5 v4; - v10.i256 = add v9 v4; - v12.*i8 = evm_malloc 96.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_SolEncoder_2 = int_to_ptr v13 *@__fe_SolEncoder_2; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v10 i256; - v17.*@__fe_SolEncoder_2 = int_to_ptr v13 *@__fe_SolEncoder_2; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v10 i256; - v21.i256 = add v10 64.i256; - v22.*@__fe_SolEncoder_2 = int_to_ptr v13 *@__fe_SolEncoder_2; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - call %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64 v2 v13; - v26.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor v0 v1 v9 v7; - v27.i1 = eq v26 0.i256; - v28.i256 = zext v27 i256; - v29.i1 = ne v28 0.i256; - br v29 block1 block2; - - block1: - v30.i256 = evm_return_data_size; - v31.*i8 = evm_malloc v30; - v32.i256 = ptr_to_int v31 i256; - evm_return_data_copy v32 0.i256 v30; - evm_revert v32 v30; - - block2: - return v26; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.*@__fe_SolDecoder_4 = int_to_ptr v5 *@__fe_SolDecoder_4; - v11.*i256 = gep v10 0.i256 0.i256 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - v13.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; - v15.*i256 = gep v13 0.i256 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v18.*@__fe_SolDecoder_4 = int_to_ptr v5 *@__fe_SolDecoder_4; - v19.*i256 = gep v18 0.i256 0.i256 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v17 i256; - v21.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; - v22.*i256 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.*@__fe_SolDecoder_4 = int_to_ptr v5 *@__fe_SolDecoder_4; - v26.*i256 = gep v25 0.i256 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.*@__fe_SolDecoder_4 = int_to_ptr v5 *@__fe_SolDecoder_4; - v29.*i256 = gep v28 0.i256 1.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 0.i256 i256; - return v5; -} - -func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; - v3.*@__fe_Cursor_3 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_3 = int_to_ptr v4 *@__fe_Cursor_3; - v6.*@__fe_MemoryBytes_0 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = call %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len v7; - v9.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; - v10.*@__fe_Cursor_3 = gep v9 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_Cursor_3 = int_to_ptr v11 *@__fe_Cursor_3; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v18.i256 = add v16 32.i256; - v19.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; - v20.*@__fe_Cursor_3 = gep v19 0.i256 0.i256; - v21.i256 = ptr_to_int v20 i256; - v22.*@__fe_Cursor_3 = int_to_ptr v21 *@__fe_Cursor_3; - v23.*i256 = gep v22 0.i256 1.i256; - v24.i256 = ptr_to_int v23 i256; - v25.i256 = mload v24 i256; - v26.i1 = lt v18 v25; - v27.i256 = zext v26 i256; - v28.i1 = ne v27 0.i256; - br v28 block1 block3; - - block1: - evm_revert 0.i256 0.i256; - - block2: - v30.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; - v31.*@__fe_Cursor_3 = gep v30 0.i256 0.i256; - v32.i256 = ptr_to_int v31 i256; - v33.*@__fe_Cursor_3 = int_to_ptr v32 *@__fe_Cursor_3; - v34.*i256 = gep v33 0.i256 1.i256; - v35.i256 = ptr_to_int v34 i256; - v36.i256 = mload v35 i256; - v37.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; - v38.*@__fe_Cursor_3 = gep v37 0.i256 0.i256; - v39.i256 = ptr_to_int v38 i256; - v40.*@__fe_Cursor_3 = int_to_ptr v39 *@__fe_Cursor_3; - v41.*@__fe_MemoryBytes_0 = gep v40 0.i256 0.i256; - v42.i256 = ptr_to_int v41 i256; - v43.i256 = call %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at v42 v36; - v45.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; - v46.*@__fe_Cursor_3 = gep v45 0.i256 0.i256; - v47.i256 = ptr_to_int v46 i256; - v48.*@__fe_Cursor_3 = int_to_ptr v47 *@__fe_Cursor_3; - v49.*i256 = gep v48 0.i256 1.i256; - v50.i256 = ptr_to_int v49 i256; - mstore v50 v18 i256; - return v43; - - block3: - v53.i1 = gt v18 v8; - v54.i256 = zext v53 i256; - v55.i1 = ne v54 0.i256; - br v55 block1 block2; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { - block0: - return 0.i256; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; - return v5; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { - block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; -} - -func private %__Child_init_code_len() -> i256 { - block0: - v1.i256 = sym_size &__Child_init; - return v1; -} - -func private %__Child_init_code_offset() -> i256 { - block0: - v1.i256 = sym_addr &__Child_init; - return v1; -} - -func private %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64(v0.i256, v1.i256) { - block0: - v3.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v6 v1; - v7.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v11 v1; - return; -} - -func private %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.i256 = evm_create v1 v2 v3; - return v5; -} - -func public %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Cursor_3 = int_to_ptr v4 *@__fe_Cursor_3; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 v8 i256; - v12.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.*@__fe_Cursor_3 = int_to_ptr v4 *@__fe_Cursor_3; - v18.*i256 = gep v17 0.i256 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v16 i256; - v20.*@__fe_Cursor_3 = int_to_ptr v4 *@__fe_Cursor_3; - v21.*i256 = gep v20 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 0.i256 i256; - return v4; -} - -func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v2 0.i256 1.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - return v6; -} - -func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i256 = add v6 v1; - v8.i256 = add v6 v1; - v9.i256 = mload v8 i256; - return v9; -} - -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v13.*i256 = gep v12 0.i256 0.i256 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v11 i256; - v15.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v17.*i256 = gep v15 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v21.*i256 = gep v20 0.i256 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v19 i256; - v23.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v1 i256; - return v7; -} - -func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func public %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 v0 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 0.i256 i256; - return v4; -} - -func public %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v8.*i8 = evm_malloc 64.i256; - v9.i256 = ptr_to_int v8 i256; - v10.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v11.*@__fe_CallData_5 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v6 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v1 i256; - return v9; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_2 = int_to_ptr v0 *@__fe_SolEncoder_2; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_2 = int_to_ptr v0 *@__fe_SolEncoder_2; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - - -object @Child { - section init { - entry %__Child_init; - embed .runtime as &__Child_runtime; - } - section runtime { - entry %__Child_runtime; - } -} - -object @Parent { - section init { - entry %__Parent_init; - embed @Child.init as &__Child_init; - embed .runtime as &__Parent_runtime; - } - section runtime { - entry %__Parent_runtime; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/intrinsic_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/intrinsic_ops.snap deleted file mode 100644 index 7cb79be0c4..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/intrinsic_ops.snap +++ /dev/null @@ -1,60 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/intrinsic_ops.fe ---- -target = "evm-ethereum-osaka" - -func public %load_word__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = mload v0 i256; - return v3; -} - -func public %store_word__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) { - block0: - mstore v0 v1 i256; - return; -} - -func public %store_byte__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) { - block0: - evm_mstore8 v0 v1; - return; -} - -func public %load_slot__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = evm_sload v0; - return v3; -} - -func public %store_slot__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) { - block0: - evm_sstore v0 v1; - return; -} - -func public %load_calldata__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = evm_calldata_load v0; - return v3; -} - -func public %finish__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) { - block0: - evm_return v0 v1; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %load_word__Evm_hef0af3106e109414__3af54274b2985741 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/keccak_in_fn.snap b/crates/codegen/tests/fixtures/sonatina_ir/keccak_in_fn.snap deleted file mode 100644 index 868ef9bc76..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/keccak_in_fn.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/keccak_in_fn.fe ---- -target = "evm-ethereum-osaka" - -func private %main() -> i256 { - block0: - return 12910348618308260923200348219926901280687058984330794534952861439530514639560.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %main; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/keccak_intrinsic.snap b/crates/codegen/tests/fixtures/sonatina_ir/keccak_intrinsic.snap deleted file mode 100644 index 9241ef690f..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/keccak_intrinsic.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/keccak_intrinsic.fe ---- -target = "evm-ethereum-osaka" - -func public %hash__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - v4.i256 = evm_keccak256 v0 v1; - return v4; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %hash__Evm_hef0af3106e109414__3af54274b2985741 0.i256 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/literal_add.snap b/crates/codegen/tests/fixtures/sonatina_ir/literal_add.snap deleted file mode 100644 index 52af590764..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/literal_add.snap +++ /dev/null @@ -1,31 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/literal_add.fe ---- -target = "evm-ethereum-osaka" - -func private %main() -> i256 { - block0: - v3.i256 = call %add 10.i256 20.i256; - return v3; -} - -func private %add(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %main; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/literal_sub.snap b/crates/codegen/tests/fixtures/sonatina_ir/literal_sub.snap deleted file mode 100644 index 0f5e981a38..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/literal_sub.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/literal_sub.fe ---- -target = "evm-ethereum-osaka" - -func public %literal_sub() -> i256 { - block0: - v3.i256 = sub 1.i256 2.i256; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %literal_sub; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/local_bindings.snap b/crates/codegen/tests/fixtures/sonatina_ir/local_bindings.snap deleted file mode 100644 index afff427653..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/local_bindings.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/local_bindings.fe ---- -target = "evm-ethereum-osaka" - -func public %local_bindings() -> i256 { - block0: - v3.i256 = add 1.i256 2.i256; - return 3.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %local_bindings; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/logical_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/logical_ops.snap deleted file mode 100644 index 6fff44bf43..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/logical_ops.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/logical_ops.fe ---- -target = "evm-ethereum-osaka" - -func public %logical_ops() -> i256 { - block0: - v2.i256 = and 1.i256 0.i256; - return v2; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %logical_ops; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_enum.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_enum.snap deleted file mode 100644 index 3ef83e1943..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_enum.snap +++ /dev/null @@ -1,53 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_enum.fe ---- -target = "evm-ethereum-osaka" - -func public %match_enum(v0.i256) -> i256 { - block0: - jump block6; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4) (4.i256 block5); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - jump block2; - - block6: - v8.i256 = mload v0 i256; - v9.i1 = eq v8 0.i256; - br v9 block1 block7; - - block7: - v10.i1 = eq v8 1.i256; - br v10 block3 block8; - - block8: - v11.i1 = eq v8 2.i256; - br v11 block4 block5; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %match_enum 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_enum_with_data.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_enum_with_data.snap deleted file mode 100644 index fe51dde649..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_enum_with_data.snap +++ /dev/null @@ -1,63 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/match_enum_with_data.fe ---- -target = "evm-ethereum-osaka" - -func public %make_some(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - mstore v4 1.i256 i256; - v6.i64 = trunc v0 i64; - v7.i256 = zext v6 i256; - v9.i256 = add v4 32.i256; - mstore v9 v7 i256; - return v4; -} - -func public %match_option(v0.i256) -> i256 { - block0: - jump block4; - - block1: - v4.i256 = add v0 32.i256; - v5.i256 = mload v4 i256; - v6.i64 = trunc v5 i64; - v7.i256 = zext v6 i256; - jump block2; - - block2: - v9.i256 = phi (v7 block1) (0.i256 block3); - return v9; - - block3: - jump block2; - - block4: - v11.i256 = mload v0 i256; - v13.i1 = eq v11 1.i256; - br v13 block1 block6; - - block5: - evm_invalid; - - block6: - v14.i1 = eq v11 0.i256; - br v14 block3 block5; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %make_some 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_fn_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_fn_call.snap deleted file mode 100644 index b8bfa525f2..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_fn_call.snap +++ /dev/null @@ -1,53 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_fn_call.fe ---- -target = "evm-ethereum-osaka" - -func private %example__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) -> i256 { - block0: - v2.i256 = call %read_selector__Evm_hef0af3106e109414__3af54274b2985741 v0; - jump block5; - - block1: - jump block2; - - block2: - v4.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v4; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v10.i1 = eq v2 305419896.i256; - br v10 block1 block6; - - block6: - v11.i1 = eq v2 591751049.i256; - br v11 block3 block4; -} - -func public %read_selector__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_load 0.i256; - v4.i256 = shr 224.i256 v2; - return v4; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %example__Evm_hef0af3106e109414__3af54274b2985741 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_literal.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_literal.snap deleted file mode 100644 index 27a4ed11b0..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_literal.snap +++ /dev/null @@ -1,350 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_literal.fe ---- -target = "evm-ethereum-osaka" - -func public %match_bool(v0.i256) -> i256 { - block0: - jump block4; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3); - return v3; - - block3: - jump block2; - - block4: - v6.i1 = eq v0 1.i256; - br v6 block1 block3; -} - -func public %match_u8(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 255.i256; - br v9 block3 block4; -} - -func public %match_u16(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v9.i1 = eq v0 4660.i256; - br v9 block1 block6; - - block6: - v10.i1 = eq v0 43981.i256; - br v10 block3 block4; -} - -func public %match_u32(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v9.i1 = eq v0 3735928559.i256; - br v9 block1 block6; - - block6: - v10.i1 = eq v0 3405691582.i256; - br v10 block3 block4; -} - -func public %match_u64(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 18446744073709551615.i256; - br v9 block3 block4; -} - -func public %match_u128(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 340282366920938463463374607431768211455.i256; - br v9 block3 block4; -} - -func public %match_u256(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 -1.i256; - br v9 block3 block4; -} - -func public %match_i8(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 99.i256; - br v9 block3 block4; -} - -func public %match_i16(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 32000.i256; - br v9 block3 block4; -} - -func public %match_i32(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 2000000000.i256; - br v9 block3 block4; -} - -func public %match_i64(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 9223372036854775807.i256; - br v9 block3 block4; -} - -func public %match_i128(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 170141183460469231731687303715884105727.i256; - br v9 block3 block4; -} - -func public %match_i256(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v8.i1 = eq v0 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v0 -1.i256; - br v9 block3 block4; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %match_bool 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_mixed_return.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_mixed_return.snap deleted file mode 100644 index 12c48ef3b4..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_mixed_return.snap +++ /dev/null @@ -1,46 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_mixed_return.fe ---- -target = "evm-ethereum-osaka" - -func private %f(v0.i256) -> i256 { - block0: - jump block4; - - block1: - return 0.i256; - - block2: - jump block3; - - block3: - v4.i256 = add 1.i256 1.i256; - return v4; - - block4: - v6.i256 = mload v0 i256; - v7.i1 = eq v6 0.i256; - br v7 block1 block6; - - block5: - evm_invalid; - - block6: - v8.i1 = eq v6 1.i256; - br v8 block2 block5; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %f 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_nested_default.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_nested_default.snap deleted file mode 100644 index a7d3d56402..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_nested_default.snap +++ /dev/null @@ -1,159 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_nested_default.fe ---- -target = "evm-ethereum-osaka" - -func public %nested_with_defaults(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (0.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v6.i256 = mload v0 i256; - v7.i1 = eq v6 0.i256; - br v7 block6 block8; - - block6: - v11.i256 = add v0 32.i256; - v12.i256 = mload v11 i256; - v13.i1 = eq v12 0.i256; - br v13 block1 block4; - - block7: - v15.i256 = add v0 32.i256; - v16.i256 = mload v15 i256; - v17.i1 = eq v16 1.i256; - br v17 block3 block4; - - block8: - v8.i1 = eq v6 1.i256; - br v8 block7 block4; -} - -func public %outer_specific_inner_wildcard(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v7.i256 = mload v0 i256; - v8.i1 = eq v7 0.i256; - br v8 block6 block4; - - block6: - v11.i256 = add v0 32.i256; - v12.i256 = mload v11 i256; - v13.i1 = eq v12 0.i256; - br v13 block1 block3; -} - -func public %deeply_nested_wildcard(v0.i256) -> i256 { - block0: - jump block4; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (0.i256 block3); - return v3; - - block3: - jump block2; - - block4: - v5.i256 = mload v0 i256; - v6.i1 = eq v5 0.i256; - br v6 block5 block3; - - block5: - v9.i256 = add v0 32.i256; - v10.i256 = mload v9 i256; - v11.i1 = eq v10 0.i256; - br v11 block6 block3; - - block6: - v14.i256 = add v0 64.i256; - v15.i256 = mload v14 i256; - v16.i1 = eq v15 0.i256; - br v16 block1 block3; -} - -func public %exhaustive_inner_outer_wildcard(v0.i256) -> i256 { - block0: - jump block6; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4) (0.i256 block5); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - jump block2; - - block6: - v7.i256 = mload v0 i256; - v8.i1 = eq v7 0.i256; - br v8 block7 block5; - - block7: - v11.i256 = add v0 32.i256; - v12.i256 = mload v11 i256; - v13.i1 = eq v12 0.i256; - br v13 block1 block8; - - block8: - v14.i1 = eq v12 1.i256; - br v14 block3 block9; - - block9: - v15.i1 = eq v12 2.i256; - br v15 block4 block5; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %nested_with_defaults 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_nested_enum.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_nested_enum.snap deleted file mode 100644 index 0b04c10311..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_nested_enum.snap +++ /dev/null @@ -1,71 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/match_nested_enum.fe ---- -target = "evm-ethereum-osaka" - -func public %match_nested_enum(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (0.i256 block1) (v9 block3) (v15 block4); - return v3; - - block3: - v6.i256 = add v0 64.i256; - v7.i256 = mload v6 i256; - v8.i8 = trunc v7 i8; - v9.i256 = zext v8 i256; - jump block2; - - block4: - v12.i256 = add v0 32.i256; - v13.i256 = mload v12 i256; - v14.i8 = trunc v13 i8; - v15.i256 = zext v14 i256; - jump block2; - - block5: - v17.i256 = mload v0 i256; - v19.i1 = eq v17 0.i256; - br v19 block6 block9; - - block6: - v22.i256 = add v0 32.i256; - v23.i256 = mload v22 i256; - v24.i1 = eq v23 0.i256; - br v24 block1 block10; - - block7: - evm_invalid; - - block8: - evm_invalid; - - block9: - v20.i1 = eq v17 1.i256; - br v20 block4 block8; - - block10: - v25.i1 = eq v23 1.i256; - br v25 block3 block7; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %match_nested_enum 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_newtype_nested.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_newtype_nested.snap deleted file mode 100644 index 50c556e084..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_newtype_nested.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/match_newtype_nested.fe ---- -target = "evm-ethereum-osaka" - -func public %match_newtype_nested(v0.i256) -> i256 { - block0: - jump block4; - - block1: - jump block2; - - block2: - v3.i256 = phi (0.i256 block1) (v0 block3); - return v3; - - block3: - jump block2; - - block4: - v6.i1 = eq v0 0.i256; - br v6 block1 block3; -} - -func private %f() -> i256 { - block0: - v2.i256 = call %match_newtype_nested 10.i256; - return v2; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %match_newtype_nested 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_return.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_return.snap deleted file mode 100644 index 59a4699f5d..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_return.snap +++ /dev/null @@ -1,42 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_return.fe ---- -target = "evm-ethereum-osaka" - -func private %f__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - jump block3; - - block1: - evm_return 0.i256 0.i256; - - block2: - evm_return 0.i256 0.i256; - - block3: - v4.i256 = mload v0 i256; - v6.i1 = eq v4 0.i256; - br v6 block1 block5; - - block4: - evm_invalid; - - block5: - v7.i1 = eq v4 1.i256; - br v7 block2 block4; -} - -func public %__fe_sonatina_entry() { - block0: - call %f__Evm_hef0af3106e109414__3af54274b2985741 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_struct.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_struct.snap deleted file mode 100644 index 4bfff93c76..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_struct.snap +++ /dev/null @@ -1,135 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_struct.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Point_0 = {i256, i256}; - -func public %match_struct_fields(v0.i256) -> i256 { - block0: - jump block6; - - block1: - jump block2; - - block2: - v2.i256 = phi (0.i256 block1) (v10 block3) (v17 block4) (v31 block5); - return v2; - - block3: - v4.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v6.*i256 = gep v4 0.i256 1.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.i8 = trunc v8 i8; - v10.i256 = zext v9 i256; - jump block2; - - block4: - v12.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v13.*i256 = gep v12 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - v16.i8 = trunc v15 i8; - v17.i256 = zext v16 i256; - jump block2; - - block5: - v19.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v20.*i256 = gep v19 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - v22.i256 = mload v21 i256; - v23.i8 = trunc v22 i8; - v24.i256 = zext v23 i256; - v25.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v26.*i256 = gep v25 0.i256 0.i256; - v27.i256 = ptr_to_int v26 i256; - v28.i256 = mload v27 i256; - v29.i8 = trunc v28 i8; - v30.i256 = zext v29 i256; - v31.i256 = add v30 v24; - jump block2; - - block6: - v33.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v34.*i256 = gep v33 0.i256 1.i256; - v35.i256 = ptr_to_int v34 i256; - v36.i256 = mload v35 i256; - v37.i8 = trunc v36 i8; - v38.i256 = zext v37 i256; - v39.i1 = eq v38 0.i256; - br v39 block7 block8; - - block7: - v41.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v42.*i256 = gep v41 0.i256 0.i256; - v43.i256 = ptr_to_int v42 i256; - v44.i256 = mload v43 i256; - v45.i8 = trunc v44 i8; - v46.i256 = zext v45 i256; - v47.i1 = eq v46 0.i256; - br v47 block1 block4; - - block8: - v49.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v50.*i256 = gep v49 0.i256 0.i256; - v51.i256 = ptr_to_int v50 i256; - v52.i256 = mload v51 i256; - v53.i8 = trunc v52 i8; - v54.i256 = zext v53 i256; - v55.i1 = eq v54 0.i256; - br v55 block3 block5; -} - -func public %match_struct_wildcard(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v7.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.i8 = trunc v10 i8; - v12.i256 = zext v11 i256; - v13.i1 = eq v12 0.i256; - br v13 block1 block6; - - block6: - v15.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v16.*i256 = gep v15 0.i256 1.i256; - v17.i256 = ptr_to_int v16 i256; - v18.i256 = mload v17 i256; - v19.i8 = trunc v18 i8; - v20.i256 = zext v19 i256; - v21.i1 = eq v20 0.i256; - br v21 block3 block4; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %match_struct_fields 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_tuple.snap deleted file mode 100644 index 6b7f2dcc48..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple.snap +++ /dev/null @@ -1,178 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_tuple.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256}; -type @__fe_tuple_1 = {i256, i256}; - -func public %match_bool_tuple(v0.i256) -> i256 { - block0: - jump block6; - - block1: - jump block2; - - block2: - v3.i256 = phi (3.i256 block1) (2.i256 block3) (1.i256 block4) (0.i256 block5); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - jump block2; - - block6: - v7.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v8.*i256 = gep v7 0.i256 1.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.i1 = ne v10 0.i256; - v12.i256 = zext v11 i256; - v13.i1 = eq v12 1.i256; - br v13 block7 block12; - - block7: - v16.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v17.*i256 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.i1 = ne v19 0.i256; - v21.i256 = zext v20 i256; - v22.i1 = eq v21 1.i256; - br v22 block1 block13; - - block8: - evm_invalid; - - block9: - v25.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v26.*i256 = gep v25 0.i256 0.i256; - v27.i256 = ptr_to_int v26 i256; - v28.i256 = mload v27 i256; - v29.i1 = ne v28 0.i256; - v30.i256 = zext v29 i256; - v31.i1 = eq v30 1.i256; - br v31 block3 block14; - - block10: - evm_invalid; - - block11: - evm_invalid; - - block12: - v14.i1 = eq v12 0.i256; - br v14 block9 block11; - - block13: - v23.i1 = eq v21 0.i256; - br v23 block4 block8; - - block14: - v32.i1 = eq v30 0.i256; - br v32 block5 block10; -} - -func public %match_tuple_with_wildcard(v0.i256) -> i256 { - block0: - jump block4; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (0.i256 block3); - return v3; - - block3: - jump block2; - - block4: - v5.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.i1 = ne v8 0.i256; - v10.i256 = zext v9 i256; - v11.i1 = eq v10 1.i256; - br v11 block1 block6; - - block5: - evm_invalid; - - block6: - v12.i1 = eq v10 0.i256; - br v12 block3 block5; -} - -func public %match_mixed_tuple(v0.i256) -> i256 { - block0: - jump block6; - - block1: - jump block2; - - block2: - v3.i256 = phi (10.i256 block1) (11.i256 block3) (12.i256 block4) (0.i256 block5); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - jump block2; - - block6: - v7.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.i1 = ne v10 0.i256; - v12.i256 = zext v11 i256; - v14.i1 = eq v12 1.i256; - br v14 block7 block9; - - block7: - v17.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v18.*i256 = gep v17 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - v20.i256 = mload v19 i256; - v21.i8 = trunc v20 i8; - v22.i256 = zext v21 i256; - v23.i1 = eq v22 0.i256; - br v23 block1 block10; - - block8: - evm_invalid; - - block9: - v15.i1 = eq v12 0.i256; - br v15 block5 block8; - - block10: - v24.i1 = eq v22 1.i256; - br v24 block3 block4; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %match_bool_tuple 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_binding.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_binding.snap deleted file mode 100644 index 7c52f478b5..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_binding.snap +++ /dev/null @@ -1,176 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/match_tuple_binding.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256}; -type @__fe_tuple_1 = {@__fe_tuple_0, i256}; - -func public %match_tuple_extract(v0.i256) -> i256 { - block0: - jump block5; - - block1: - v3.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - v8.i8 = trunc v7 i8; - v9.i256 = zext v8 i256; - jump block2; - - block2: - v11.i256 = phi (v9 block1) (v18 block3) (v32 block4); - return v11; - - block3: - v13.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v14.*i256 = gep v13 0.i256 0.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.i8 = trunc v16 i8; - v18.i256 = zext v17 i256; - jump block2; - - block4: - v20.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v21.*i256 = gep v20 0.i256 0.i256; - v22.i256 = ptr_to_int v21 i256; - v23.i256 = mload v22 i256; - v24.i8 = trunc v23 i8; - v25.i256 = zext v24 i256; - v26.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v27.*i256 = gep v26 0.i256 1.i256; - v28.i256 = ptr_to_int v27 i256; - v29.i256 = mload v28 i256; - v30.i8 = trunc v29 i8; - v31.i256 = zext v30 i256; - v32.i256 = add v25 v31; - jump block2; - - block5: - v34.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v35.*i256 = gep v34 0.i256 0.i256; - v36.i256 = ptr_to_int v35 i256; - v37.i256 = mload v36 i256; - v38.i8 = trunc v37 i8; - v39.i256 = zext v38 i256; - v40.i1 = eq v39 0.i256; - br v40 block1 block6; - - block6: - v42.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v43.*i256 = gep v42 0.i256 1.i256; - v44.i256 = ptr_to_int v43 i256; - v45.i256 = mload v44 i256; - v46.i8 = trunc v45 i8; - v47.i256 = zext v46 i256; - v48.i1 = eq v47 0.i256; - br v48 block3 block4; -} - -func public %match_nested_extract(v0.i256) -> i256 { - block0: - jump block5; - - block1: - v3.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - v8.i8 = trunc v7 i8; - v9.i256 = zext v8 i256; - jump block2; - - block2: - v11.i256 = phi (v9 block1) (v25 block3) (v39 block4); - return v11; - - block3: - v13.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v14.*i256 = gep v13 0.i256 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.i8 = trunc v16 i8; - v18.i256 = zext v17 i256; - v19.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v20.*i256 = gep v19 0.i256 0.i256 0.i256; - v21.i256 = ptr_to_int v20 i256; - v22.i256 = mload v21 i256; - v23.i8 = trunc v22 i8; - v24.i256 = zext v23 i256; - v25.i256 = add v24 v18; - jump block2; - - block4: - v27.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v28.*i256 = gep v27 0.i256 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - v31.i8 = trunc v30 i8; - v32.i256 = zext v31 i256; - v33.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v34.*i256 = gep v33 0.i256 1.i256; - v35.i256 = ptr_to_int v34 i256; - v36.i256 = mload v35 i256; - v37.i8 = trunc v36 i8; - v38.i256 = zext v37 i256; - v39.i256 = add v32 v38; - jump block2; - - block5: - v41.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v42.*i256 = gep v41 0.i256 0.i256 1.i256; - v43.i256 = ptr_to_int v42 i256; - v44.i256 = mload v43 i256; - v45.i8 = trunc v44 i8; - v46.i256 = zext v45 i256; - v47.i1 = eq v46 0.i256; - br v47 block6 block8; - - block6: - v49.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v50.*i256 = gep v49 0.i256 0.i256 0.i256; - v51.i256 = ptr_to_int v50 i256; - v52.i256 = mload v51 i256; - v53.i8 = trunc v52 i8; - v54.i256 = zext v53 i256; - v55.i1 = eq v54 0.i256; - br v55 block1 block7; - - block7: - v57.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v58.*i256 = gep v57 0.i256 1.i256; - v59.i256 = ptr_to_int v58 i256; - v60.i256 = mload v59 i256; - v61.i8 = trunc v60 i8; - v62.i256 = zext v61 i256; - v63.i1 = eq v62 0.i256; - br v63 block3 block4; - - block8: - v65.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v66.*i256 = gep v65 0.i256 1.i256; - v67.i256 = ptr_to_int v66 i256; - v68.i256 = mload v67 i256; - v69.i8 = trunc v68 i8; - v70.i256 = zext v69 i256; - v71.i1 = eq v70 0.i256; - br v71 block3 block4; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %match_tuple_extract 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_nested.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_nested.snap deleted file mode 100644 index dbf7ce30db..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_nested.snap +++ /dev/null @@ -1,180 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_tuple_nested.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256}; -type @__fe_tuple_1 = {@__fe_tuple_0, i256}; -type @__fe_tuple_2 = {@__fe_tuple_1, i256}; - -func public %match_nested_tuple(v0.i256) -> i256 { - block0: - jump block7; - - block1: - jump block2; - - block2: - v3.i256 = phi (7.i256 block1) (6.i256 block3) (5.i256 block4) (2.i256 block5) (1.i256 block6); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - jump block2; - - block6: - jump block2; - - block7: - v9.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - v12.i256 = mload v11 i256; - v13.i1 = ne v12 0.i256; - v14.i256 = zext v13 i256; - v15.i1 = eq v14 1.i256; - br v15 block8 block15; - - block8: - v18.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v19.*i256 = gep v18 0.i256 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - v21.i256 = mload v20 i256; - v22.i1 = ne v21 0.i256; - v23.i256 = zext v22 i256; - v24.i1 = eq v23 1.i256; - br v24 block9 block16; - - block9: - v27.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v28.*i256 = gep v27 0.i256 1.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - v31.i1 = ne v30 0.i256; - v32.i256 = zext v31 i256; - v33.i1 = eq v32 1.i256; - br v33 block1 block17; - - block10: - evm_invalid; - - block11: - evm_invalid; - - block12: - v36.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v37.*i256 = gep v36 0.i256 1.i256; - v38.i256 = ptr_to_int v37 i256; - v39.i256 = mload v38 i256; - v40.i1 = ne v39 0.i256; - v41.i256 = zext v40 i256; - v42.i1 = eq v41 1.i256; - br v42 block5 block18; - - block13: - evm_invalid; - - block14: - evm_invalid; - - block15: - v16.i1 = eq v14 0.i256; - br v16 block12 block14; - - block16: - v25.i1 = eq v23 0.i256; - br v25 block4 block11; - - block17: - v34.i1 = eq v32 0.i256; - br v34 block3 block10; - - block18: - v43.i1 = eq v41 0.i256; - br v43 block6 block13; -} - -func public %match_deeply_nested(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (15.i256 block1) (8.i256 block3) (0.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v6.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.i1 = ne v9 0.i256; - v11.i256 = zext v10 i256; - v13.i1 = eq v11 1.i256; - br v13 block6 block10; - - block6: - v16.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v17.*i256 = gep v16 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.i1 = ne v19 0.i256; - v21.i256 = zext v20 i256; - v22.i1 = eq v21 1.i256; - br v22 block7 block3; - - block7: - v24.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v25.*i256 = gep v24 0.i256 0.i256 1.i256; - v26.i256 = ptr_to_int v25 i256; - v27.i256 = mload v26 i256; - v28.i1 = ne v27 0.i256; - v29.i256 = zext v28 i256; - v30.i1 = eq v29 1.i256; - br v30 block8 block3; - - block8: - v32.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v33.*i256 = gep v32 0.i256 0.i256 0.i256 1.i256; - v34.i256 = ptr_to_int v33 i256; - v35.i256 = mload v34 i256; - v36.i1 = ne v35 0.i256; - v37.i256 = zext v36 i256; - v38.i1 = eq v37 1.i256; - br v38 block1 block3; - - block9: - evm_invalid; - - block10: - v14.i1 = eq v11 0.i256; - br v14 block4 block9; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %match_nested_tuple 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_wildcard.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_wildcard.snap deleted file mode 100644 index e050577b74..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_wildcard.snap +++ /dev/null @@ -1,85 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/match_wildcard.fe ---- -target = "evm-ethereum-osaka" - -func public %match_with_wildcard(v0.i256) -> i256 { - block0: - jump block4; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (0.i256 block3); - return v3; - - block3: - jump block2; - - block4: - v5.i256 = mload v0 i256; - v6.i1 = eq v5 0.i256; - br v6 block1 block3; -} - -func public %wildcard_not_last(v0.i256) -> i256 { - block0: - jump block4; - - block1: - jump block2; - - block2: - v3.i256 = phi (10.i256 block1) (99.i256 block3); - return v3; - - block3: - jump block2; - - block4: - v6.i1 = eq v0 0.i256; - br v6 block1 block3; -} - -func public %multiple_before_wildcard(v0.i256) -> i256 { - block0: - jump block5; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); - return v3; - - block3: - jump block2; - - block4: - jump block2; - - block5: - v7.i256 = mload v0 i256; - v8.i1 = eq v7 0.i256; - br v8 block1 block6; - - block6: - v9.i1 = eq v7 1.i256; - br v9 block3 block4; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %match_with_wildcard 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/math_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/math_ops.snap deleted file mode 100644 index 84f69e15da..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/math_ops.snap +++ /dev/null @@ -1,28 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/math_ops.fe ---- -target = "evm-ethereum-osaka" - -func public %math_ops() -> i256 { - block0: - v3.i256 = sub 10.i256 3.i256; - v5.i256 = mul v3 2.i256; - v7.i256 = evm_udiv v5 7.i256; - v8.i256 = evm_umod v7 3.i256; - return v8; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %math_ops; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/method_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/method_call.snap deleted file mode 100644 index ff6aee41d4..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/method_call.snap +++ /dev/null @@ -1,43 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/method_call.fe ---- -target = "evm-ethereum-osaka" - -func private %make_value() -> i256 { - block0: - return 42.i256; -} - -func public %call_method(v0.i256) -> i256 { - block0: - v2.i256 = call %foo_h6dbce71a6ea992b8_return_value v0; - return v2; -} - -func public %foo_h6dbce71a6ea992b8_gen_value(v0.i256) -> i256 { - block0: - v2.i256 = call %make_value; - return v2; -} - -func public %foo_h6dbce71a6ea992b8_return_value(v0.i256) -> i256 { - block0: - v2.i256 = call %foo_h6dbce71a6ea992b8_gen_value v0; - return v2; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %make_value; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/method_infer_by_constraints.snap b/crates/codegen/tests/fixtures/sonatina_ir/method_infer_by_constraints.snap deleted file mode 100644 index 84f4d206a1..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/method_infer_by_constraints.snap +++ /dev/null @@ -1,46 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/method_infer_by_constraints.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256}; - -func public %call() -> i256 { - block0: - v2.i256 = call %s_t__h10779c135f64b393_foo_h6dbce71a6ea992b8_foo__u64__aee7f05a097ffa16 10.i256; - return v2; -} - -func private %s_t__h10779c135f64b393_foo_h6dbce71a6ea992b8_foo__u64__aee7f05a097ffa16(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i64 = trunc v0 i64; - v6.i256 = zext v5 i256; - v7.*@__fe_tuple_0 = int_to_ptr v4 *@__fe_tuple_0; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v6 i256; - v11.i64 = trunc 1.i256 i64; - v12.i256 = zext v11 i256; - v13.*@__fe_tuple_0 = int_to_ptr v4 *@__fe_tuple_0; - v14.*i256 = gep v13 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - mstore v15 v12 i256; - return v4; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %call; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/momo.snap b/crates/codegen/tests/fixtures/sonatina_ir/momo.snap deleted file mode 100644 index 9b9f74e205..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/momo.snap +++ /dev/null @@ -1,39 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/momo.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_MyStruct_0 = {i256, i256}; - -func public %read_x(v0.i256) -> i256 { - block0: - v2.*@__fe_MyStruct_0 = int_to_ptr v0 *@__fe_MyStruct_0; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.i8 = trunc v5 i8; - v7.i256 = zext v6 i256; - v8.*@__fe_MyStruct_0 = int_to_ptr v0 *@__fe_MyStruct_0; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - v12.i256 = mload v11 i256; - v13.i8 = trunc v12 i8; - v14.i256 = zext v13 i256; - v15.i256 = add v7 v14; - return v15; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %read_x 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/name_collisions.snap b/crates/codegen/tests/fixtures/sonatina_ir/name_collisions.snap deleted file mode 100644 index b7e0039fa5..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/name_collisions.snap +++ /dev/null @@ -1,153 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/name_collisions.fe ---- -target = "evm-ethereum-osaka" - -func public %a_b_h12fd23afeb13a092_flattened_fn() -> i256 { - block0: - return 1.i256; -} - -func public %a_b_h948d5ab23860c017_flattened_fn() -> i256 { - block0: - return 2.i256; -} - -func private %test_module_qualifier_flatten_collision() -> i256 { - block0: - v1.i256 = call %a_b_h12fd23afeb13a092_flattened_fn; - v2.i256 = call %a_b_h948d5ab23860c017_flattened_fn; - v3.i256 = add v1 v2; - return v3; -} - -func private %test_generic_type_collision() -> i256 { - block0: - v3.i256 = call %generic_fn__S_h730d9dc564aaaf27__8d32801e7ec9d42b 1.i256; - v4.i256 = call %generic_fn__S_h2db58d011b97b333__42a13489a1ec39e8 2.i256; - return 42.i256; -} - -func private %test_impl_method_collision() -> i256 { - block0: - v3.i256 = call %widget_h8588afca9d68e578_process 10.i256; - v4.i256 = call %widget_h6847c0e3e0e4aa1e_process 20.i256; - return v3; -} - -func private %test_trait_method_collision() -> i256 { - block0: - v2.i256 = call %multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method 100.i256; - v3.i256 = call %multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method 100.i256; - v4.i256 = add v2 v3; - return v4; -} - -func private %param_local_collision(v0.i256) -> i256 { - block0: - v3.i256 = add v0 1.i256; - v5.i256 = add v3 2.i256; - return v5; -} - -func private %test_param_local_collision() -> i256 { - block0: - v2.i256 = call %param_local_collision 10.i256; - return v2; -} - -func private %__u32_as_u256(v0.i256) -> i256 { - block0: - return 999.i256; -} - -func private %test_cast_shim_collision() -> i256 { - block0: - v2.i256 = call %__u32_as_u256 42.i256; - return v2; -} - -func private %ret_param_collision(v0.i256) -> i256 { - block0: - v3.i256 = add v0 1.i256; - return v3; -} - -func private %test_ret_param_collision() -> i256 { - block0: - v2.i256 = call %ret_param_collision 10.i256; - return v2; -} - -func private %add() -> i256 { - block0: - return 123.i256; -} - -func private %test_yul_reserved_fn_collision() -> i256 { - block0: - v1.i256 = call %add; - return v1; -} - -func public %main() -> i256 { - block0: - v1.i256 = call %test_module_qualifier_flatten_collision; - v2.i256 = call %test_generic_type_collision; - v3.i256 = call %test_impl_method_collision; - v4.i256 = call %test_trait_method_collision; - v5.i256 = call %test_param_local_collision; - v6.i256 = call %test_cast_shim_collision; - v7.i256 = call %test_ret_param_collision; - v8.i256 = call %test_yul_reserved_fn_collision; - return 0.i256; -} - -func public %widget_h8588afca9d68e578_process(v0.i256) -> i256 { - block0: - v3.i256 = mul v0 2.i256; - return v3; -} - -func public %widget_h6847c0e3e0e4aa1e_process(v0.i256) -> i256 { - block0: - v3.i256 = mul v0 3.i256; - return v3; -} - -func private %multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method(v0.i256) -> i256 { - block0: - v3.i256 = add v0 1.i256; - return v3; -} - -func private %multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method(v0.i256) -> i256 { - block0: - v3.i256 = add v0 2.i256; - return v3; -} - -func private %generic_fn__S_h730d9dc564aaaf27__8d32801e7ec9d42b(v0.i256) -> i256 { - block0: - return v0; -} - -func private %generic_fn__S_h2db58d011b97b333__42a13489a1ec39e8(v0.i256) -> i256 { - block0: - return v0; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %a_b_h12fd23afeb13a092_flattened_fn; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/nested_struct.snap b/crates/codegen/tests/fixtures/sonatina_ir/nested_struct.snap deleted file mode 100644 index 808aaefbe8..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/nested_struct.snap +++ /dev/null @@ -1,100 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/nested_struct.fe ---- -target = "evm-ethereum-osaka" - -func private %abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - mstore 0.i256 v0 i256; - evm_return 0.i256 32.i256; -} - -func private %read_inner__StorPtr_Outer___dab28b9da6c3e28(v0.i256) -> i256 { - block0: - v2.i256 = evm_sload v0; - return v2; -} - -func private %write_inner__StorPtr_Outer___dab28b9da6c3e28(v0.i256, v1.i256) { - block0: - evm_sstore v1 v0; - return; -} - -func private %mem_read(v0.i256) -> i256 { - block0: - return v0; -} - -func private %init__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; - v2.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; - evm_code_copy 0.i256 v2 v1; - evm_return 0.i256 v1; -} - -func private %runtime__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_Outer_hccd04e332bd35653__177c3c9a6f7ae368 0.i256 0.i256; - v2.i256 = evm_calldata_load 0.i256; - v4.i256 = shr 224.i256 v2; - jump block5; - - block1: - v6.i256 = evm_calldata_load 4.i256; - call %write_inner__StorPtr_Outer___dab28b9da6c3e28 v6 v1; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v6 0.i256; - evm_invalid; - - block2: - v9.i256 = call %read_inner__StorPtr_Outer___dab28b9da6c3e28 v1; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v9 0.i256; - evm_invalid; - - block3: - v10.i256 = evm_calldata_load 4.i256; - v11.i256 = call %mem_read v10; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v11 0.i256; - evm_invalid; - - block4: - evm_return 0.i256 0.i256; - - block5: - v16.i1 = eq v4 3091856072.i256; - br v16 block1 block6; - - block6: - v17.i1 = eq v4 3513050253.i256; - br v17 block2 block7; - - block7: - v18.i1 = eq v4 2154770637.i256; - br v18 block3 block4; -} - -func private %stor_ptr_stor__Evm_hef0af3106e109414_Outer_hccd04e332bd35653__177c3c9a6f7ae368(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Outer_hccd04e332bd35653__f44d0100de7cf929 v1; - return v3; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Outer_hccd04e332bd35653__f44d0100de7cf929(v0.i256) -> i256 { - block0: - return v0; -} - - -object @NestedStruct { - section init { - entry %init__StorPtr_Evm___207f35a85ac4062e; - embed .runtime as &runtime__StorPtr_Evm___207f35a85ac4062e; - } - section runtime { - entry %runtime__StorPtr_Evm___207f35a85ac4062e; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/newtype_field_mut_method_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/newtype_field_mut_method_call.snap deleted file mode 100644 index d3e6f7d2e9..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/newtype_field_mut_method_call.snap +++ /dev/null @@ -1,99 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/newtype_field_mut_method_call.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Counter_0 = {i256, i256}; -type @__fe_WrapCounter_1 = {@__fe_Counter_0}; -type @__fe_Container_2 = {i256, @__fe_WrapCounter_1}; - -func public %newtype_field_mut_method_call(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Counter_0 = int_to_ptr v4 *@__fe_Counter_0; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 v0 i256; - v8.*@__fe_Counter_0 = int_to_ptr v4 *@__fe_Counter_0; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 0.i256 i256; - v13.*i8 = evm_malloc 96.i256; - v14.i256 = ptr_to_int v13 i256; - v15.*@__fe_Container_2 = int_to_ptr v14 *@__fe_Container_2; - v16.*i256 = gep v15 0.i256 0.i256; - v17.i256 = ptr_to_int v16 i256; - mstore v17 0.i256 i256; - v18.*@__fe_WrapCounter_1 = int_to_ptr v4 *@__fe_WrapCounter_1; - v19.*i256 = gep v18 0.i256 0.i256 0.i256; - v20.i256 = ptr_to_int v19 i256; - v21.i256 = mload v20 i256; - v22.*@__fe_Container_2 = int_to_ptr v14 *@__fe_Container_2; - v23.*i256 = gep v22 0.i256 1.i256 0.i256 0.i256; - v24.i256 = ptr_to_int v23 i256; - mstore v24 v21 i256; - v25.*@__fe_WrapCounter_1 = int_to_ptr v4 *@__fe_WrapCounter_1; - v26.*i256 = gep v25 0.i256 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - v28.i256 = mload v27 i256; - v29.*@__fe_Container_2 = int_to_ptr v14 *@__fe_Container_2; - v30.*i256 = gep v29 0.i256 1.i256 0.i256 1.i256; - v31.i256 = ptr_to_int v30 i256; - mstore v31 v28 i256; - v32.*@__fe_Container_2 = int_to_ptr v14 *@__fe_Container_2; - v33.*@__fe_WrapCounter_1 = gep v32 0.i256 1.i256; - v34.i256 = ptr_to_int v33 i256; - call %wrapcounter_hbcbd3a74a267488b_bump v34; - v35.*@__fe_Container_2 = int_to_ptr v14 *@__fe_Container_2; - v36.*@__fe_WrapCounter_1 = gep v35 0.i256 1.i256; - v37.i256 = ptr_to_int v36 i256; - v38.*@__fe_Counter_0 = int_to_ptr v37 *@__fe_Counter_0; - v39.*i256 = gep v38 0.i256 0.i256; - v40.i256 = ptr_to_int v39 i256; - v41.i256 = mload v40 i256; - return v41; -} - -func private %counter_h872958864d1ad471_bump(v0.i256) { - block0: - v2.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v7.i256 = add v5 1.i256; - v8.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; - v9.*i256 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v7 i256; - return; -} - -func private %wrapcounter_hbcbd3a74a267488b_bump(v0.i256) { - block0: - v2.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v7.i256 = add v5 1.i256; - v8.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; - v9.*i256 = gep v8 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 v7 i256; - return; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %newtype_field_mut_method_call 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_byplace_effect_arg.snap b/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_byplace_effect_arg.snap deleted file mode 100644 index 8a7887aa56..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_byplace_effect_arg.snap +++ /dev/null @@ -1,499 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_MemoryBytes_0 = {i256, i256}; -type @__fe_tuple_1 = {i256, i256}; -type @__fe_Cursor_2 = {@__fe_MemoryBytes_0, i256}; -type @__fe_SolDecoder_3 = {@__fe_Cursor_2, i256}; -type @__fe_SolEncoder_4 = {i256, i256, i256}; -type @__fe_CallData_5 = {i256}; -type @__fe_Cursor_6 = {@__fe_CallData_5, i256}; -type @__fe_SolDecoder_7 = {@__fe_Cursor_6, i256}; - -func private %bump__StorPtr_Wrap___5036bb3e02939b91(v0.i256) { - block0: - v2.i256 = evm_sload v0; - v4.i256 = add v2 1.i256; - evm_sstore v0 v4; - return; -} - -func private %__NewtypeByPlaceEffectArg_init_contract() { - block0: - return; -} - -func private %__NewtypeByPlaceEffectArg_recv_0_0(v0.i256, v1.i256) -> i256 { - block0: - call %bump__StorPtr_Wrap___5036bb3e02939b91 v0; - v3.i256 = evm_sload v1; - v5.i256 = add v3 1.i256; - evm_sstore v1 v5; - v6.i256 = evm_sload v1; - return v6; -} - -func private %__NewtypeByPlaceEffectArg_init() { - block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 0.i256; - v3.i256 = call %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 1.i256; - v4.i256 = sym_addr &__NewtypeByPlaceEffectArg_runtime; - v5.i256 = sym_size &__NewtypeByPlaceEffectArg_runtime; - v6.i256 = sym_size .; - v7.i256 = evm_code_size; - v8.i1 = lt v7 v6; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; - br v10 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v13.i256 = sub v7 v6; - v14.i256 = sub v7 v6; - v15.*i8 = evm_malloc v14; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = sub v7 v6; - evm_code_copy v16 v6 v17; - v19.*i8 = evm_malloc 64.i256; - v20.i256 = ptr_to_int v19 i256; - v21.*@__fe_MemoryBytes_0 = int_to_ptr v20 *@__fe_MemoryBytes_0; - v22.*i256 = gep v21 0.i256 0.i256; - v23.i256 = ptr_to_int v22 i256; - mstore v23 v16 i256; - v24.i256 = sub v7 v6; - v25.*@__fe_MemoryBytes_0 = int_to_ptr v20 *@__fe_MemoryBytes_0; - v26.*i256 = gep v25 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v20; - call %__NewtypeByPlaceEffectArg_init_contract; - evm_code_copy 0.i256 v4 v5; - evm_return 0.i256 v5; -} - -func private %__NewtypeByPlaceEffectArg_runtime() { - block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 0.i256 0.i256; - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd 0.i256 1.i256; - v4.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v5.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v6.i1 = eq v4 1.i256; - br v6 block2 block1; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - call %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v10.i256 = call %__NewtypeByPlaceEffectArg_recv_0_0 v3 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v10; - evm_invalid; -} - -func private %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 v0 v1; - return v3; -} - -func private %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd v0 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { - block0: - evm_revert 0.i256 0.i256; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 v1; - return v3; -} - -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; - evm_invalid; - - block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; -} - -func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; -} - -func private %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v11.*i256 = gep v10 0.i256 0.i256 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - v13.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v15.*i256 = gep v13 0.i256 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v18.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v19.*i256 = gep v18 0.i256 0.i256 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v17 i256; - v21.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v22.*i256 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v26.*i256 = gep v25 0.i256 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v29.*i256 = gep v28 0.i256 1.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 0.i256 i256; - return v5; -} - -func private %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; -} - -func private %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { - block0: - return 0.i256; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; - return v5; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { - block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { - block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i1 = eq v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - v11.*i8 = evm_malloc v1; - v12.i256 = ptr_to_int v11 i256; - v14.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v17.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v12 i256; - v21.i256 = add v12 v1; - v22.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - jump block2; - - block2: - v27.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - return v30; -} - -func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { - block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v12.*i8 = evm_malloc 64.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_tuple_1 = int_to_ptr v13 *@__fe_tuple_1; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v5 i256; - v17.i256 = sub v10 v5; - v18.*@__fe_tuple_1 = int_to_ptr v13 *@__fe_tuple_1; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v17 i256; - return v13; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { - block0: - evm_return v1 v2; -} - -func public %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 v8 i256; - v12.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v18.*i256 = gep v17 0.i256 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v16 i256; - v20.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v21.*i256 = gep v20 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 0.i256 i256; - return v4; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483(v0.i256) -> i256 { - block0: - return v0; -} - -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v13.*i256 = gep v12 0.i256 0.i256 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v11 i256; - v15.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v17.*i256 = gep v15 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v21.*i256 = gep v20 0.i256 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v19 i256; - v23.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v1 i256; - return v7; -} - -func public %solencoder_h1b9228b90dad6928_new() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - mstore v6 0.i256 i256; - v7.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 0.i256 i256; - v11.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v13.*i256 = gep v11 0.i256 2.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 0.i256 i256; - return v3; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - -func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func public %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 v0 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 0.i256 i256; - return v4; -} - -func public %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v8.*i8 = evm_malloc 64.i256; - v9.i256 = ptr_to_int v8 i256; - v10.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v11.*@__fe_CallData_5 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v6 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v1 i256; - return v9; -} - - -object @NewtypeByPlaceEffectArg { - section init { - entry %__NewtypeByPlaceEffectArg_init; - embed .runtime as &__NewtypeByPlaceEffectArg_runtime; - } - section runtime { - entry %__NewtypeByPlaceEffectArg_runtime; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_field_mut_method_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_field_mut_method_call.snap deleted file mode 100644 index 10c815b404..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_field_mut_method_call.snap +++ /dev/null @@ -1,505 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_MemoryBytes_0 = {i256, i256}; -type @__fe_tuple_1 = {i256, i256}; -type @__fe_Cursor_2 = {@__fe_MemoryBytes_0, i256}; -type @__fe_SolDecoder_3 = {@__fe_Cursor_2, i256}; -type @__fe_SolEncoder_4 = {i256, i256, i256}; -type @__fe_CallData_5 = {i256}; -type @__fe_Cursor_6 = {@__fe_CallData_5, i256}; -type @__fe_SolDecoder_7 = {@__fe_Cursor_6, i256}; - -func private %wrap_haf9e70905fcbd513_bump(v0.i256) { - block0: - v2.i256 = mload v0 i256; - v4.i256 = add v2 1.i256; - mstore v0 v4 i256; - return; -} - -func private %__NewtypeStorageFieldMutMethodCall_init_contract() { - block0: - return; -} - -func private %__NewtypeStorageFieldMutMethodCall_recv_0_0(v0.i256) -> i256 { - block0: - v2.i256 = evm_sload v0; - call %wrap_haf9e70905fcbd513_bump_stor_arg0_root_stor v0; - v3.i256 = evm_sload v0; - return v3; -} - -func private %__NewtypeStorageFieldMutMethodCall_init() { - block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 0.i256; - v3.i256 = call %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 1.i256; - v4.i256 = sym_addr &__NewtypeStorageFieldMutMethodCall_runtime; - v5.i256 = sym_size &__NewtypeStorageFieldMutMethodCall_runtime; - v6.i256 = sym_size .; - v7.i256 = evm_code_size; - v8.i1 = lt v7 v6; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; - br v10 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v13.i256 = sub v7 v6; - v14.i256 = sub v7 v6; - v15.*i8 = evm_malloc v14; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = sub v7 v6; - evm_code_copy v16 v6 v17; - v19.*i8 = evm_malloc 64.i256; - v20.i256 = ptr_to_int v19 i256; - v21.*@__fe_MemoryBytes_0 = int_to_ptr v20 *@__fe_MemoryBytes_0; - v22.*i256 = gep v21 0.i256 0.i256; - v23.i256 = ptr_to_int v22 i256; - mstore v23 v16 i256; - v24.i256 = sub v7 v6; - v25.*@__fe_MemoryBytes_0 = int_to_ptr v20 *@__fe_MemoryBytes_0; - v26.*i256 = gep v25 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v20; - call %__NewtypeStorageFieldMutMethodCall_init_contract; - evm_code_copy 0.i256 v4 v5; - evm_return 0.i256 v5; -} - -func private %__NewtypeStorageFieldMutMethodCall_runtime() { - block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 0.i256 0.i256; - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd 0.i256 1.i256; - v4.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v5.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v6.i1 = eq v4 1.i256; - br v6 block2 block1; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - call %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v9.i256 = call %__NewtypeStorageFieldMutMethodCall_recv_0_0 v3; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v9; - evm_invalid; -} - -func private %wrap_haf9e70905fcbd513_bump_stor_arg0_root_stor(v0.i256) { - block0: - v2.i256 = evm_sload v0; - v4.i256 = add v2 1.i256; - evm_sstore v0 v4; - return; -} - -func private %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 v0 v1; - return v3; -} - -func private %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd v0 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { - block0: - evm_revert 0.i256 0.i256; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 v1; - return v3; -} - -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; - evm_invalid; - - block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; -} - -func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; -} - -func private %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v11.*i256 = gep v10 0.i256 0.i256 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - v13.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v15.*i256 = gep v13 0.i256 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v18.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v19.*i256 = gep v18 0.i256 0.i256 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v17 i256; - v21.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v22.*i256 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v26.*i256 = gep v25 0.i256 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v29.*i256 = gep v28 0.i256 1.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 0.i256 i256; - return v5; -} - -func private %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; -} - -func private %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { - block0: - return 0.i256; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; - return v5; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { - block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { - block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i1 = eq v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - v11.*i8 = evm_malloc v1; - v12.i256 = ptr_to_int v11 i256; - v14.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v17.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v12 i256; - v21.i256 = add v12 v1; - v22.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - jump block2; - - block2: - v27.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - return v30; -} - -func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; - return; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { - block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v12.*i8 = evm_malloc 64.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_tuple_1 = int_to_ptr v13 *@__fe_tuple_1; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v5 i256; - v17.i256 = sub v10 v5; - v18.*@__fe_tuple_1 = int_to_ptr v13 *@__fe_tuple_1; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v17 i256; - return v13; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { - block0: - evm_return v1 v2; -} - -func public %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 v8 i256; - v12.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v18.*i256 = gep v17 0.i256 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v16 i256; - v20.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v21.*i256 = gep v20 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 0.i256 i256; - return v4; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483(v0.i256) -> i256 { - block0: - return v0; -} - -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v13.*i256 = gep v12 0.i256 0.i256 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v11 i256; - v15.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v17.*i256 = gep v15 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v21.*i256 = gep v20 0.i256 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v19 i256; - v23.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v1 i256; - return v7; -} - -func public %solencoder_h1b9228b90dad6928_new() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - mstore v6 0.i256 i256; - v7.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 0.i256 i256; - v11.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v13.*i256 = gep v11 0.i256 2.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 0.i256 i256; - return v3; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - -func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func public %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 v0 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 0.i256 i256; - return v4; -} - -func public %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v8.*i8 = evm_malloc 64.i256; - v9.i256 = ptr_to_int v8 i256; - v10.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v11.*@__fe_CallData_5 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v6 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v1 i256; - return v9; -} - - -object @NewtypeStorageFieldMutMethodCall { - section init { - entry %__NewtypeStorageFieldMutMethodCall_init; - embed .runtime as &__NewtypeStorageFieldMutMethodCall_runtime; - } - section runtime { - entry %__NewtypeStorageFieldMutMethodCall_runtime; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/newtype_u8_word_conversion.snap b/crates/codegen/tests/fixtures/sonatina_ir/newtype_u8_word_conversion.snap deleted file mode 100644 index d26cdfd4fe..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/newtype_u8_word_conversion.snap +++ /dev/null @@ -1,45 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/newtype_u8_word_conversion.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_WrapU8_0 = {i256}; -type @__fe_Container_1 = {@__fe_WrapU8_0, i256}; - -func public %newtype_u8_roundtrip(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i8 = trunc v0 i8; - v6.i256 = zext v5 i256; - v7.*@__fe_Container_1 = int_to_ptr v4 *@__fe_Container_1; - v8.*@__fe_WrapU8_0 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v6 i256; - v10.*@__fe_Container_1 = int_to_ptr v4 *@__fe_Container_1; - v12.*i256 = gep v10 0.i256 1.i256; - v13.i256 = ptr_to_int v12 i256; - mstore v13 0.i256 i256; - v14.*@__fe_Container_1 = int_to_ptr v4 *@__fe_Container_1; - v15.*@__fe_WrapU8_0 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v18.i8 = trunc v17 i8; - v19.i256 = zext v18 i256; - return v19; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %newtype_u8_roundtrip 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/newtype_word_mut_method_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/newtype_word_mut_method_call.snap deleted file mode 100644 index 868642a770..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/newtype_word_mut_method_call.snap +++ /dev/null @@ -1,31 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/newtype_word_mut_method_call.fe ---- -target = "evm-ethereum-osaka" - -func public %newtype_word_mut_method_call(v0.i256) -> i256 { - block0: - v2.i256 = call %wrap_haf9e70905fcbd513_bump v0; - return v2; -} - -func private %wrap_haf9e70905fcbd513_bump(v0.i256) -> i256 { - block0: - v3.i256 = add v0 1.i256; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %newtype_word_mut_method_call 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/range_bounds.snap b/crates/codegen/tests/fixtures/sonatina_ir/range_bounds.snap deleted file mode 100644 index 3b0c6ee0c3..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/range_bounds.snap +++ /dev/null @@ -1,234 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/range_bounds.fe ---- -target = "evm-ethereum-osaka" - -func public %sum_const() -> i256 { - block0: - v1.i256 = call %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_len__0_4__f9605efabd18106c 0.i256; - jump block1; - - block1: - v16.i256 = phi (0.i256 block0) (v10 block3); - v2.i256 = phi (0.i256 block0) (v13 block3); - v4.i1 = lt v2 v1; - v5.i256 = zext v4 i256; - v6.i1 = ne v5 0.i256; - br v6 block2 block4; - - block2: - v8.i256 = call %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c 0.i256 v2; - v10.i256 = add v16 v8; - jump block3; - - block3: - v13.i256 = add v2 1.i256; - jump block1; - - block4: - return v16; -} - -func public %sum_dynamic_end(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 32.i256; - v4.i256 = ptr_to_int v3 i256; - mstore v4 v0 i256; - v5.i256 = call %range_known_const_s__usize___unknown__h4e84f6b6b8307914_seq_ha637d2df505bccf2_len__0__fc6647014fb554e5 v4; - jump block1; - - block1: - v23.i256 = phi (0.i256 block0) (v15 block3); - v6.i256 = phi (0.i256 block0) (v18 block3); - v8.i1 = lt v6 v5; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; - br v10 block2 block4; - - block2: - v13.i256 = call %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c v4 v6; - v15.i256 = add v23 v13; - jump block3; - - block3: - v18.i256 = add v6 1.i256; - jump block1; - - block4: - return v23; -} - -func public %sum_dynamic_start(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 32.i256; - v4.i256 = ptr_to_int v3 i256; - mstore v4 v0 i256; - v5.i256 = call %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_len__4__f248ae0e02044d7e v4; - jump block1; - - block1: - v23.i256 = phi (0.i256 block0) (v15 block3); - v6.i256 = phi (0.i256 block0) (v18 block3); - v8.i1 = lt v6 v5; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; - br v10 block2 block4; - - block2: - v13.i256 = call %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e v4 v6; - v15.i256 = add v23 v13; - jump block3; - - block3: - v18.i256 = add v6 1.i256; - jump block1; - - block4: - return v23; -} - -func public %sum_dynamic(v0.i256, v1.i256) -> i256 { - block0: - v4.*i8 = evm_malloc 64.i256; - v5.i256 = ptr_to_int v4 i256; - mstore v5 v0 i256; - v7.i256 = add v5 32.i256; - mstore v7 v1 i256; - v8.i256 = call %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len v5; - jump block1; - - block1: - v26.i256 = phi (0.i256 block0) (v18 block3); - v9.i256 = phi (0.i256 block0) (v21 block3); - v11.i1 = lt v9 v8; - v12.i256 = zext v11 i256; - v13.i1 = ne v12 0.i256; - br v13 block2 block4; - - block2: - v16.i256 = call %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e v5 v9; - v18.i256 = add v26 v16; - jump block3; - - block3: - v21.i256 = add v9 1.i256; - jump block1; - - block4: - return v26; -} - -func private %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_len__0_4__f9605efabd18106c(v0.i256) -> i256 { - block0: - v3.i1 = lt 4.i256 0.i256; - v4.i256 = zext v3 i256; - v5.i1 = ne v4 0.i256; - br v5 block1 block2; - - block1: - jump block3; - - block2: - v6.i256 = sub 4.i256 0.i256; - jump block3; - - block3: - v7.i256 = phi (0.i256 block1) (v6 block2); - return v7; -} - -func private %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add 0.i256 v1; - return v3; -} - -func private %range_known_const_s__usize___unknown__h4e84f6b6b8307914_seq_ha637d2df505bccf2_len__0__fc6647014fb554e5(v0.i256) -> i256 { - block0: - v2.i256 = mload v0 i256; - v3.i1 = lt v2 0.i256; - v4.i256 = zext v3 i256; - v5.i1 = ne v4 0.i256; - br v5 block1 block2; - - block1: - jump block3; - - block2: - v7.i256 = mload v0 i256; - v8.i256 = sub v7 0.i256; - jump block3; - - block3: - v9.i256 = phi (0.i256 block1) (v8 block2); - return v9; -} - -func private %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_len__4__f248ae0e02044d7e(v0.i256) -> i256 { - block0: - v2.i256 = mload v0 i256; - v4.i1 = lt 4.i256 v2; - v5.i256 = zext v4 i256; - v6.i1 = ne v5 0.i256; - br v6 block1 block2; - - block1: - jump block3; - - block2: - v8.i256 = mload v0 i256; - v9.i256 = sub 4.i256 v8; - jump block3; - - block3: - v10.i256 = phi (0.i256 block1) (v9 block2); - return v10; -} - -func private %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = mload v0 i256; - v4.i256 = add v3 v1; - return v4; -} - -func private %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len(v0.i256) -> i256 { - block0: - v3.i256 = add v0 32.i256; - v4.i256 = mload v3 i256; - v5.i256 = mload v0 i256; - v6.i1 = lt v4 v5; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; - - block1: - jump block3; - - block2: - v10.i256 = add v0 32.i256; - v11.i256 = mload v10 i256; - v12.i256 = mload v0 i256; - v13.i256 = sub v11 v12; - jump block3; - - block3: - v14.i256 = phi (0.i256 block1) (v13 block2); - return v14; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %sum_const; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/raw_log_emit.snap b/crates/codegen/tests/fixtures/sonatina_ir/raw_log_emit.snap deleted file mode 100644 index adc7c96937..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/raw_log_emit.snap +++ /dev/null @@ -1,32 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/raw_log_emit.fe ---- -target = "evm-ethereum-osaka" - -func private %raw_emit(v0.i256) { - block0: - call %evm_hef0af3106e109414_log_h22d1a10952034bae_log0 v0 1.i256 32.i256; - return; -} - -func private %evm_hef0af3106e109414_log_h22d1a10952034bae_log0(v0.i256, v1.i256, v2.i256) { - block0: - evm_log0 v1 v2; - return; -} - -func public %__fe_sonatina_entry() { - block0: - call %raw_emit 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/ret.snap b/crates/codegen/tests/fixtures/sonatina_ir/ret.snap deleted file mode 100644 index 3b76aa06d6..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/ret.snap +++ /dev/null @@ -1,51 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/ret.fe ---- -target = "evm-ethereum-osaka" - -func public %retfoo(v0.i256, v1.i256) -> i256 { - block0: - v3.i1 = ne v0 0.i256; - br v3 block1 block2; - - block1: - return 0.i256; - - block2: - v6.i1 = lt v1 5.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block3 block4; - - block3: - return 1.i256; - - block4: - v11.i256 = sub v1 1.i256; - v13.i1 = eq v11 42.i256; - v14.i256 = zext v13 i256; - v15.i1 = ne v14 0.i256; - br v15 block5 block6; - - block5: - return 2.i256; - - block6: - v18.i256 = add v11 1.i256; - return v18; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %retfoo 0.i256 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/revert.snap b/crates/codegen/tests/fixtures/sonatina_ir/revert.snap deleted file mode 100644 index f7c8b717af..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/revert.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/revert.fe ---- -target = "evm-ethereum-osaka" - -func private %fail__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) { - block0: - mstore 0.i256 42.i256 i256; - evm_revert 0.i256 32.i256; -} - -func public %__fe_sonatina_entry() { - block0: - call %fail__Evm_hef0af3106e109414__3af54274b2985741 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/storage.snap b/crates/codegen/tests/fixtures/sonatina_ir/storage.snap deleted file mode 100644 index 1800243eff..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/storage.snap +++ /dev/null @@ -1,362 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/storage.fe ---- -target = "evm-ethereum-osaka" - -func private %transfer_result_code(v0.i256) -> i256 { - block0: - jump block4; - - block1: - jump block2; - - block2: - v2.i256 = phi (0.i256 block1) (1.i256 block3); - return v2; - - block3: - jump block2; - - block4: - v5.i256 = mload v0 i256; - v6.i1 = eq v5 0.i256; - br v6 block1 block6; - - block5: - evm_invalid; - - block6: - v7.i1 = eq v5 1.i256; - br v7 block3 block5; -} - -func private %abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - mstore 0.i256 v0 i256; - evm_return 0.i256 32.i256; -} - -func private %credit__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - jump block4; - - block1: - v8.i256 = call %credit_alice__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78 v1 v2 v3; - jump block2; - - block2: - v9.i256 = phi (v8 block1) (v13 block3); - return v9; - - block3: - v13.i256 = call %credit_bob__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78 v1 v2 v3; - jump block2; - - block4: - v15.i256 = mload v0 i256; - v17.i1 = eq v15 0.i256; - br v17 block1 block6; - - block5: - evm_invalid; - - block6: - v18.i1 = eq v15 1.i256; - br v18 block3 block5; -} - -func private %transfer__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - jump block4; - - block1: - v6.i256 = call %transfer_from_alice__StorPtr_CoinStore___ba1c0d0726e89ba2 v1 v2; - jump block2; - - block2: - v7.i256 = phi (v6 block1) (v10 block3); - return v7; - - block3: - v10.i256 = call %transfer_from_bob__StorPtr_CoinStore___ba1c0d0726e89ba2 v1 v2; - jump block2; - - block4: - v12.i256 = mload v0 i256; - v14.i1 = eq v12 0.i256; - br v14 block1 block6; - - block5: - evm_invalid; - - block6: - v15.i1 = eq v12 1.i256; - br v15 block3 block5; -} - -func private %balance_of__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256, v1.i256) -> i256 { - block0: - jump block4; - - block1: - v4.i256 = evm_sload v1; - jump block2; - - block2: - v5.i256 = phi (v4 block1) (v9 block3); - return v5; - - block3: - v8.i256 = add v1 1.i256; - v9.i256 = evm_sload v8; - jump block2; - - block4: - v11.i256 = mload v0 i256; - v12.i1 = eq v11 0.i256; - br v12 block1 block6; - - block5: - evm_invalid; - - block6: - v13.i1 = eq v11 1.i256; - br v13 block3 block5; -} - -func private %balance_of_raw__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256, v1.i256) -> i256 { - block0: - jump block4; - - block1: - v4.i256 = evm_sload v1; - jump block2; - - block2: - v5.i256 = phi (v4 block1) (v9 block3); - return v5; - - block3: - v8.i256 = add v1 1.i256; - v9.i256 = evm_sload v8; - jump block2; - - block4: - v11.i1 = eq v0 0.i256; - br v11 block1 block3; -} - -func private %total_supply__StorPtr_TotalSupply___2e654c25952f42f9(v0.i256) -> i256 { - block0: - v2.i256 = evm_sload v0; - return v2; -} - -func private %credit_alice__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - v4.i256 = evm_sload v1; - v5.i256 = add v4 v0; - evm_sstore v1 v5; - v6.i256 = evm_sload v2; - v7.i256 = add v6 v0; - evm_sstore v2 v7; - v8.i256 = evm_sload v1; - return v8; -} - -func private %credit_bob__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78(v0.i256, v1.i256, v2.i256) -> i256 { - block0: - v5.i256 = add v1 1.i256; - v6.i256 = evm_sload v5; - v7.i256 = add v6 v0; - v8.i256 = add v1 1.i256; - evm_sstore v8 v7; - v9.i256 = evm_sload v2; - v10.i256 = add v9 v0; - evm_sstore v2 v10; - v11.i256 = add v1 1.i256; - v12.i256 = evm_sload v11; - return v12; -} - -func private %transfer_from_alice__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = evm_sload v1; - v4.i1 = lt v3 v0; - v5.i256 = zext v4 i256; - v6.i1 = ne v5 0.i256; - br v6 block1 block2; - - block1: - v8.*i8 = evm_malloc 32.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 1.i256 i256; - return v9; - - block2: - v12.i256 = evm_sload v1; - v14.i256 = sub v12 v0; - evm_sstore v1 v14; - v15.i256 = add v1 1.i256; - v16.i256 = evm_sload v15; - v17.i256 = add v16 v0; - v18.i256 = add v1 1.i256; - evm_sstore v18 v17; - v19.*i8 = evm_malloc 32.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 0.i256 i256; - return v20; -} - -func private %transfer_from_bob__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256, v1.i256) -> i256 { - block0: - v4.i256 = add v1 1.i256; - v5.i256 = evm_sload v4; - v6.i1 = lt v5 v0; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; - - block1: - v10.*i8 = evm_malloc 32.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 1.i256 i256; - return v11; - - block2: - v13.i256 = add v1 1.i256; - v14.i256 = evm_sload v13; - v16.i256 = sub v14 v0; - v17.i256 = add v1 1.i256; - evm_sstore v17 v16; - v18.i256 = evm_sload v1; - v19.i256 = add v18 v0; - evm_sstore v1 v19; - v20.*i8 = evm_malloc 32.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 0.i256 i256; - return v21; -} - -func private %init__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; - v2.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; - evm_code_copy 0.i256 v2 v1; - evm_return 0.i256 v1; -} - -func private %runtime__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_CoinStore_hd26a92ca525e0e79__b6feb5585dda62f1 0.i256 0.i256; - v3.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_TotalSupply_hddb16bb19b5b088e__f5679b0709de743a 0.i256 2.i256; - v4.i256 = evm_calldata_load 0.i256; - v6.i256 = shr 224.i256 v4; - jump block14; - - block1: - v8.i256 = evm_calldata_load 4.i256; - v10.i256 = evm_calldata_load 36.i256; - jump block5; - - block2: - v14.i256 = call %credit_alice__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78 v10 v1 v3; - jump block3; - - block3: - v15.i256 = phi (v14 block2) (v19 block4); - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v15 0.i256; - evm_invalid; - - block4: - v19.i256 = call %credit_bob__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78 v10 v1 v3; - jump block3; - - block5: - v21.i1 = eq v8 0.i256; - br v21 block2 block4; - - block6: - v22.i256 = evm_calldata_load 4.i256; - v24.i256 = call %balance_of_raw__StorPtr_CoinStore___ba1c0d0726e89ba2 v22 v1; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v24 0.i256; - evm_invalid; - - block7: - v25.i256 = evm_calldata_load 4.i256; - v26.i256 = evm_calldata_load 36.i256; - jump block11; - - block8: - v29.i256 = call %transfer_from_alice__StorPtr_CoinStore___ba1c0d0726e89ba2 v26 v1; - jump block9; - - block9: - v30.i256 = phi (v29 block8) (v34 block10); - v31.i256 = call %transfer_result_code v30; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v31 0.i256; - evm_invalid; - - block10: - v34.i256 = call %transfer_from_bob__StorPtr_CoinStore___ba1c0d0726e89ba2 v26 v1; - jump block9; - - block11: - v36.i1 = eq v25 0.i256; - br v36 block8 block10; - - block12: - v38.i256 = call %total_supply__StorPtr_TotalSupply___2e654c25952f42f9 v3; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v38 0.i256; - evm_invalid; - - block13: - evm_return 0.i256 0.i256; - - block14: - v44.i1 = eq v6 2877082652.i256; - br v44 block1 block15; - - block15: - v45.i1 = eq v6 1818602213.i256; - br v45 block6 block16; - - block16: - v46.i1 = eq v6 217554442.i256; - br v46 block7 block17; - - block17: - v47.i1 = eq v6 960555502.i256; - br v47 block12 block13; -} - -func private %stor_ptr_stor__Evm_hef0af3106e109414_CoinStore_hd26a92ca525e0e79__b6feb5585dda62f1(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede v1; - return v3; -} - -func private %stor_ptr_stor__Evm_hef0af3106e109414_TotalSupply_hddb16bb19b5b088e__f5679b0709de743a(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede v1; - return v3; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede(v0.i256) -> i256 { - block0: - return v0; -} - - -object @Coin { - section init { - entry %init__StorPtr_Evm___207f35a85ac4062e; - embed .runtime as &runtime__StorPtr_Evm___207f35a85ac4062e; - } - section runtime { - entry %runtime__StorPtr_Evm___207f35a85ac4062e; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/storage_map.snap b/crates/codegen/tests/fixtures/sonatina_ir/storage_map.snap deleted file mode 100644 index 2c15930063..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/storage_map.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/storage_map.fe ---- -target = "evm-ethereum-osaka" diff --git a/crates/codegen/tests/fixtures/sonatina_ir/storage_map_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/storage_map_contract.snap deleted file mode 100644 index 98ac553a19..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/storage_map_contract.snap +++ /dev/null @@ -1,223 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/storage_map_contract.fe ---- -target = "evm-ethereum-osaka" - -func private %abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { - block0: - mstore 0.i256 v0 i256; - evm_return 0.i256 32.i256; -} - -func private %init__StorPtr_Evm___207f35a85ac4062e() { - block0: - v1.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; - v2.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; - evm_code_copy 0.i256 v2 v1; - evm_return 0.i256 v1; -} - -func private %runtime__StorPtr_Evm___207f35a85ac4062e() { - block0: - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_new__u256_u256_0__6a346ad3c930d971; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_new__u256_u256_1__3c02c0f2b86be0bb; - v1.i256 = evm_calldata_load 0.i256; - v3.i256 = shr 224.i256 v1; - jump block7; - - block1: - v5.i256 = evm_calldata_load 4.i256; - v6.i256 = call %get_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d v5 0.i256; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v6 0.i256; - evm_invalid; - - block2: - v7.i256 = evm_calldata_load 4.i256; - v9.i256 = evm_calldata_load 36.i256; - call %set_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d v7 v9 0.i256; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 0.i256 0.i256; - evm_invalid; - - block3: - v10.i256 = evm_calldata_load 4.i256; - v11.i256 = evm_calldata_load 36.i256; - v13.i256 = evm_calldata_load 68.i256; - v14.i256 = call %transfer__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d v10 v11 v13 0.i256; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v14 0.i256; - evm_invalid; - - block4: - v15.i256 = evm_calldata_load 4.i256; - v16.i256 = call %get_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1 v15 0.i256; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v16 0.i256; - evm_invalid; - - block5: - v17.i256 = evm_calldata_load 4.i256; - v18.i256 = evm_calldata_load 36.i256; - call %set_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1 v17 v18 0.i256; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 0.i256 0.i256; - evm_invalid; - - block6: - evm_return 0.i256 0.i256; - - block7: - v25.i1 = eq v3 2630350600.i256; - br v25 block1 block8; - - block8: - v26.i1 = eq v3 1246470123.i256; - br v26 block2 block9; - - block9: - v27.i1 = eq v3 2430412327.i256; - br v27 block3 block10; - - block10: - v28.i1 = eq v3 3378517838.i256; - br v28 block4 block11; - - block11: - v29.i1 = eq v3 197806145.i256; - br v29 block5 block6; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_new__u256_u256_0__6a346ad3c930d971() { - block0: - return; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_new__u256_u256_1__3c02c0f2b86be0bb() { - block0: - return; -} - -func private %get_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971 v1 v0; - return v3; -} - -func private %set_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d(v0.i256, v1.i256, v2.i256) { - block0: - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971 v2 v0 v1; - return; -} - -func private %transfer__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { - block0: - v5.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971 v3 v0; - v6.i1 = lt v5 v2; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; - - block1: - return 1.i256; - - block2: - v12.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971 v3 v1; - v16.i256 = sub v5 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971 v3 v0 v16; - v17.i256 = add v12 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971 v3 v1 v17; - return 0.i256; -} - -func private %get_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_1__3c02c0f2b86be0bb v1 v0; - return v3; -} - -func private %set_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1(v0.i256, v1.i256, v2.i256) { - block0: - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_1__3c02c0f2b86be0bb v2 v0 v1; - return; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_get_word_with_salt__u256__3271ca15373d4483 v1 0.i256; - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v3; - return v4; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt__u256__3271ca15373d4483 v1 0.i256 v4; - return; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_1__3c02c0f2b86be0bb(v0.i256, v1.i256) -> i256 { - block0: - v4.i256 = call %storagemap_get_word_with_salt__u256__3271ca15373d4483 v1 1.i256; - v5.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v4; - return v5; -} - -func public %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_1__3c02c0f2b86be0bb(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt__u256__3271ca15373d4483 v1 1.i256 v4; - return; -} - -func private %storagemap_get_word_with_salt__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storagemap_storage_slot_with_salt__u256__3271ca15373d4483 v0 v1; - v4.i256 = evm_sload v3; - return v4; -} - -func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %storagemap_set_word_with_salt__u256__3271ca15373d4483(v0.i256, v1.i256, v2.i256) { - block0: - v4.i256 = call %storagemap_storage_slot_with_salt__u256__3271ca15373d4483 v0 v1; - evm_sstore v4 v2; - return; -} - -func private %storagemap_storage_slot_with_salt__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v4 v0; - v6.i256 = add v4 v5; - mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; -} - -func private %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { - block0: - mstore v0 v1 i256; - return 32.i256; -} - - -object @BalanceMap { - section init { - entry %init__StorPtr_Evm___207f35a85ac4062e; - embed .runtime as &runtime__StorPtr_Evm___207f35a85ac4062e; - } - section runtime { - entry %runtime__StorPtr_Evm___207f35a85ac4062e; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/string_literal.snap b/crates/codegen/tests/fixtures/sonatina_ir/string_literal.snap deleted file mode 100644 index b691195c11..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/string_literal.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/string_literal.fe ---- -target = "evm-ethereum-osaka" - -func public %string_literal() -> i256 { - block0: - return 448378203247.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %string_literal; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/string_literal_large.snap b/crates/codegen/tests/fixtures/sonatina_ir/string_literal_large.snap deleted file mode 100644 index 691c0e6da3..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/string_literal_large.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 -expression: output -input_file: crates/codegen/tests/fixtures/string_literal_large.fe ---- -target = "evm-ethereum-osaka" - -func public %large_string() -> i256 { - block0: - return 45861076989195096321303246625756685126263456619655637997107188103266074894625.i256; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %large_string; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/struct_init.snap b/crates/codegen/tests/fixtures/sonatina_ir/struct_init.snap deleted file mode 100644 index dff1a00a2b..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/struct_init.snap +++ /dev/null @@ -1,38 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/struct_init.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_Dummy_0 = {i256, i256}; - -func public %make_dummy() -> i256 { - block0: - v2.*i8 = evm_malloc 64.i256; - v3.i256 = ptr_to_int v2 i256; - v5.i64 = trunc 42.i256 i64; - v6.i256 = zext v5 i256; - v7.*@__fe_Dummy_0 = int_to_ptr v3 *@__fe_Dummy_0; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v6 i256; - v11.*@__fe_Dummy_0 = int_to_ptr v3 *@__fe_Dummy_0; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 99.i256 i256; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %make_dummy; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tstor_ptr_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/tstor_ptr_contract.snap deleted file mode 100644 index 02e4f36997..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/tstor_ptr_contract.snap +++ /dev/null @@ -1,498 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/tstor_ptr_contract.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_MemoryBytes_0 = {i256, i256}; -type @__fe_tuple_1 = {i256, i256}; -type @__fe_Cursor_2 = {@__fe_MemoryBytes_0, i256}; -type @__fe_SolDecoder_3 = {@__fe_Cursor_2, i256}; -type @__fe_SolEncoder_4 = {i256, i256, i256}; -type @__fe_CallData_5 = {i256}; -type @__fe_Cursor_6 = {@__fe_CallData_5, i256}; -type @__fe_SolDecoder_7 = {@__fe_Cursor_6, i256}; - -func private %__GuardContract_init_contract(v0.i256) { - block0: - v2.i1 = ne 0.i256 0.i256; - v3.i256 = zext v2 i256; - evm_tstore v0 v3; - return; -} - -func private %__GuardContract_recv_0_0(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = evm_sload v1; - v5.i256 = add v3 1.i256; - evm_sstore v1 v5; - v6.i256 = evm_tload v0; - v7.i1 = ne v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = is_zero v8; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - v12.i256 = zext v11 i256; - evm_tstore v0 v12; - return v8; -} - -func private %__GuardContract_init() { - block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 0.i256; - v2.i256 = call %tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07 0.i256; - v3.i256 = sym_addr &__GuardContract_runtime; - v4.i256 = sym_size &__GuardContract_runtime; - v5.i256 = sym_size .; - v6.i256 = evm_code_size; - v7.i1 = lt v6 v5; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - v12.i256 = sub v6 v5; - v13.i256 = sub v6 v5; - v14.*i8 = evm_malloc v13; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = sub v6 v5; - evm_code_copy v15 v5 v16; - v18.*i8 = evm_malloc 64.i256; - v19.i256 = ptr_to_int v18 i256; - v20.*@__fe_MemoryBytes_0 = int_to_ptr v19 *@__fe_MemoryBytes_0; - v21.*i256 = gep v20 0.i256 0.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v15 i256; - v23.i256 = sub v6 v5; - v24.*@__fe_MemoryBytes_0 = int_to_ptr v19 *@__fe_MemoryBytes_0; - v26.*i256 = gep v24 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v23 i256; - v28.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v19; - call %__GuardContract_init_contract v2; - evm_code_copy 0.i256 v3 v4; - evm_return 0.i256 v4; -} - -func private %__GuardContract_runtime() { - block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 0.i256 0.i256; - v2.i256 = call %tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07 0.i256; - v3.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v4.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v6.i1 = eq v3 1.i256; - br v6 block2 block1; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; - evm_invalid; - - block2: - call %flip_h5b3ce0ea80335753_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v4; - v10.i256 = call %__GuardContract_recv_0_0 v2 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v10; - evm_invalid; -} - -func private %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 v0 v1; - return v3; -} - -func private %tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07(v0.i256) -> i256 { - block0: - return v0; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { - block0: - evm_revert 0.i256 0.i256; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 v1; - return v3; -} - -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; - - block1: - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; - evm_invalid; - - block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; -} - -func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { - block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; -} - -func private %flip_h5b3ce0ea80335753_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { - block0: - return; -} - -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(v0.i256, v1.i256) { - block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v11.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v10 v15; - evm_invalid; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - v9.i256 = mload v8 i256; - v10.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v11.*i256 = gep v10 0.i256 0.i256 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - v13.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v15.*i256 = gep v13 0.i256 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = mload v16 i256; - v18.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v19.*i256 = gep v18 0.i256 0.i256 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v17 i256; - v21.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v22.*i256 = gep v21 0.i256 1.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = mload v23 i256; - v25.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v26.*i256 = gep v25 0.i256 0.i256 1.i256; - v27.i256 = ptr_to_int v26 i256; - mstore v27 v24 i256; - v28.*@__fe_SolDecoder_3 = int_to_ptr v5 *@__fe_SolDecoder_3; - v29.*i256 = gep v28 0.i256 1.i256; - v30.i256 = ptr_to_int v29 i256; - mstore v30 0.i256 i256; - return v5; -} - -func private %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { - block0: - return 0.i256; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { - block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; -} - -func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; - return v5; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { - block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; -} - -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { - block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v7.i1 = eq v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; - - block1: - v11.*i8 = evm_malloc v1; - v12.i256 = ptr_to_int v11 i256; - v14.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v12 i256; - v17.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = ptr_to_int v19 i256; - mstore v20 v12 i256; - v21.i256 = add v12 v1; - v22.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v24.*i256 = gep v22 0.i256 2.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v21 i256; - jump block2; - - block2: - v27.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v28.*i256 = gep v27 0.i256 0.i256; - v29.i256 = ptr_to_int v28 i256; - v30.i256 = mload v29 i256; - return v30; -} - -func private %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { - block0: - v3.i1 = ne v0 0.i256; - br v3 block1 block3; - - block1: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 1.i256; - jump block2; - - block2: - return; - - block3: - call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 0.i256; - jump block2; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { - block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i256 = mload v4 i256; - v6.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v8.*i256 = gep v6 0.i256 2.i256; - v9.i256 = ptr_to_int v8 i256; - v10.i256 = mload v9 i256; - v12.*i8 = evm_malloc 64.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_tuple_1 = int_to_ptr v13 *@__fe_tuple_1; - v15.*i256 = gep v14 0.i256 0.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v5 i256; - v17.i256 = sub v10 v5; - v18.*@__fe_tuple_1 = int_to_ptr v13 *@__fe_tuple_1; - v20.*i256 = gep v18 0.i256 1.i256; - v21.i256 = ptr_to_int v20 i256; - mstore v21 v17 i256; - return v13; -} - -func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { - block0: - evm_return v1 v2; -} - -func public %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - v8.i256 = mload v7 i256; - v9.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 v8 i256; - v12.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v14.*i256 = gep v12 0.i256 1.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = mload v15 i256; - v17.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v18.*i256 = gep v17 0.i256 0.i256 1.i256; - v19.i256 = ptr_to_int v18 i256; - mstore v19 v16 i256; - v20.*@__fe_Cursor_2 = int_to_ptr v4 *@__fe_Cursor_2; - v21.*i256 = gep v20 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 0.i256 i256; - return v4; -} - -func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483(v0.i256) -> i256 { - block0: - return v0; -} - -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { - block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; -} - -func public %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; - v10.i256 = ptr_to_int v9 i256; - v11.i256 = mload v10 i256; - v12.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v13.*i256 = gep v12 0.i256 0.i256 0.i256 0.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 v11 i256; - v15.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v17.*i256 = gep v15 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v21.*i256 = gep v20 0.i256 0.i256 1.i256; - v22.i256 = ptr_to_int v21 i256; - mstore v22 v19 i256; - v23.*@__fe_SolDecoder_7 = int_to_ptr v7 *@__fe_SolDecoder_7; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v1 i256; - return v7; -} - -func public %solencoder_h1b9228b90dad6928_new() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v5.*i256 = gep v4 0.i256 0.i256; - v6.i256 = ptr_to_int v5 i256; - mstore v6 0.i256 i256; - v7.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = ptr_to_int v9 i256; - mstore v10 0.i256 i256; - v11.*@__fe_SolEncoder_4 = int_to_ptr v3 *@__fe_SolEncoder_4; - v13.*i256 = gep v11 0.i256 2.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 0.i256 i256; - return v3; -} - -func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { - block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i256 = mload v6 i256; - mstore v7 v1 i256; - v9.i256 = add v7 32.i256; - v10.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v9 i256; - return; -} - -func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { - block0: - return v0; -} - -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { - block0: - return v0; -} - -func public %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { - block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 v0 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v10.*i256 = gep v8 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 0.i256 i256; - return v4; -} - -func public %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { - block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = mload v5 i256; - v8.*i8 = evm_malloc 64.i256; - v9.i256 = ptr_to_int v8 i256; - v10.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v11.*@__fe_CallData_5 = gep v10 0.i256 0.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 v6 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v9 *@__fe_Cursor_6; - v15.*i256 = gep v13 0.i256 1.i256; - v16.i256 = ptr_to_int v15 i256; - mstore v16 v1 i256; - return v9; -} - - -object @GuardContract { - section init { - entry %__GuardContract_init; - embed .runtime as &__GuardContract_runtime; - } - section runtime { - entry %__GuardContract_runtime; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tuple_construction.snap b/crates/codegen/tests/fixtures/sonatina_ir/tuple_construction.snap deleted file mode 100644 index 77474e7bea..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/tuple_construction.snap +++ /dev/null @@ -1,62 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/tuple_construction.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256}; -type @__fe_tuple_1 = {i256, i256, i256}; - -func public %make_tuple() -> i256 { - block0: - v2.*i8 = evm_malloc 64.i256; - v3.i256 = ptr_to_int v2 i256; - v5.i64 = trunc 42.i256 i64; - v6.i256 = zext v5 i256; - v7.*@__fe_tuple_0 = int_to_ptr v3 *@__fe_tuple_0; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 v6 i256; - v11.*@__fe_tuple_0 = int_to_ptr v3 *@__fe_tuple_0; - v13.*i256 = gep v11 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - mstore v14 99.i256 i256; - return v3; -} - -func public %access_tuple() -> i256 { - block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v5.*@__fe_tuple_1 = int_to_ptr v3 *@__fe_tuple_1; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 1.i256 i256; - v9.*@__fe_tuple_1 = int_to_ptr v3 *@__fe_tuple_1; - v10.*i256 = gep v9 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 2.i256 i256; - v13.*@__fe_tuple_1 = int_to_ptr v3 *@__fe_tuple_1; - v14.*i256 = gep v13 0.i256 2.i256; - v15.i256 = ptr_to_int v14 i256; - mstore v15 3.i256 i256; - v16.*@__fe_tuple_1 = int_to_ptr v3 *@__fe_tuple_1; - v17.*i256 = gep v16 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - v19.i256 = mload v18 i256; - return v19; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %make_tuple; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tuple_expr.snap b/crates/codegen/tests/fixtures/sonatina_ir/tuple_expr.snap deleted file mode 100644 index 7e2519bca1..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/tuple_expr.snap +++ /dev/null @@ -1,43 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/tuple_expr.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256}; - -func public %tuple_expr() -> i256 { - block0: - v2.*i8 = evm_malloc 64.i256; - v3.i256 = ptr_to_int v2 i256; - v6.i256 = add 1.i256 2.i256; - v7.i64 = trunc v6 i64; - v8.i256 = zext v7 i256; - v9.*@__fe_tuple_0 = int_to_ptr v3 *@__fe_tuple_0; - v10.*i256 = gep v9 0.i256 0.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 v8 i256; - v12.i1 = is_zero 0.i256; - v13.i256 = zext v12 i256; - v14.i1 = ne v13 0.i256; - v15.i256 = zext v14 i256; - v16.*@__fe_tuple_0 = int_to_ptr v3 *@__fe_tuple_0; - v17.*i256 = gep v16 0.i256 1.i256; - v18.i256 = ptr_to_int v17 i256; - mstore v18 v15 i256; - return v3; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %tuple_expr; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tuple_literal_field_access.snap b/crates/codegen/tests/fixtures/sonatina_ir/tuple_literal_field_access.snap deleted file mode 100644 index edf0f9e321..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/tuple_literal_field_access.snap +++ /dev/null @@ -1,104 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/tuple_literal_field_access.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {i256, i256}; -type @__fe_tuple_1 = {i256, @__fe_tuple_0}; - -func public %tuple_literal_field_access() -> i256 { - block0: - v4.*i8 = evm_malloc 64.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_tuple_0 = int_to_ptr v5 *@__fe_tuple_0; - v7.*i256 = gep v6 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - mstore v8 1.i256 i256; - v9.*@__fe_tuple_0 = int_to_ptr v5 *@__fe_tuple_0; - v10.*i256 = gep v9 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 2.i256 i256; - v12.*@__fe_tuple_0 = int_to_ptr v5 *@__fe_tuple_0; - v13.*i256 = gep v12 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - return v15; -} - -func public %tuple_literal_nested_access() -> i256 { - block0: - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = ptr_to_int v8 i256; - mstore v9 2.i256 i256; - v10.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v11.*i256 = gep v10 0.i256 1.i256; - v12.i256 = ptr_to_int v11 i256; - mstore v12 3.i256 i256; - v14.*i8 = evm_malloc 96.i256; - v15.i256 = ptr_to_int v14 i256; - v16.*@__fe_tuple_1 = int_to_ptr v15 *@__fe_tuple_1; - v17.*i256 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - mstore v18 1.i256 i256; - v19.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v20.*i256 = gep v19 0.i256 0.i256; - v21.i256 = ptr_to_int v20 i256; - v22.i256 = mload v21 i256; - v23.*@__fe_tuple_1 = int_to_ptr v15 *@__fe_tuple_1; - v24.*i256 = gep v23 0.i256 1.i256 0.i256; - v25.i256 = ptr_to_int v24 i256; - mstore v25 v22 i256; - v26.*@__fe_tuple_0 = int_to_ptr v6 *@__fe_tuple_0; - v27.*i256 = gep v26 0.i256 1.i256; - v28.i256 = ptr_to_int v27 i256; - v29.i256 = mload v28 i256; - v30.*@__fe_tuple_1 = int_to_ptr v15 *@__fe_tuple_1; - v31.*i256 = gep v30 0.i256 1.i256 1.i256; - v32.i256 = ptr_to_int v31 i256; - mstore v32 v29 i256; - v33.*@__fe_tuple_1 = int_to_ptr v15 *@__fe_tuple_1; - v34.*@__fe_tuple_0 = gep v33 0.i256 1.i256; - v35.i256 = ptr_to_int v34 i256; - v36.*@__fe_tuple_0 = int_to_ptr v35 *@__fe_tuple_0; - v37.*i256 = gep v36 0.i256 0.i256; - v38.i256 = ptr_to_int v37 i256; - v39.i256 = mload v38 i256; - return v39; -} - -func public %tuple_literal_struct_chain() -> i256 { - block0: - v4.*i8 = evm_malloc 64.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_tuple_0 = int_to_ptr v5 *@__fe_tuple_0; - v7.*i256 = gep v6 0.i256 0.i256; - v8.i256 = ptr_to_int v7 i256; - mstore v8 1.i256 i256; - v9.*@__fe_tuple_0 = int_to_ptr v5 *@__fe_tuple_0; - v10.*i256 = gep v9 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - mstore v11 2.i256 i256; - v12.*@__fe_tuple_0 = int_to_ptr v5 *@__fe_tuple_0; - v13.*i256 = gep v12 0.i256 1.i256; - v14.i256 = ptr_to_int v13 i256; - v15.i256 = mload v14 i256; - return v15; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %tuple_literal_field_access; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tuple_single_element_peeling.snap b/crates/codegen/tests/fixtures/sonatina_ir/tuple_single_element_peeling.snap deleted file mode 100644 index d3b1d22c63..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/tuple_single_element_peeling.snap +++ /dev/null @@ -1,60 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/tuple_single_element_peeling.fe ---- -target = "evm-ethereum-osaka" - -func public %tuple_single_passthrough(v0.i256) -> i256 { - block0: - return v0; -} - -func public %tuple_single_nested_passthrough(v0.i256) -> i256 { - block0: - return v0; -} - -func public %tuple_single_struct_newtype_nested(v0.i256) -> i256 { - block0: - return v0; -} - -func public %match_single_element_tuple(v0.i256) -> i256 { - block0: - jump block4; - - block1: - jump block2; - - block2: - v3.i256 = phi (1.i256 block1) (0.i256 block3); - return v3; - - block3: - jump block2; - - block4: - v5.i1 = eq v0 1.i256; - br v5 block1 block6; - - block5: - evm_invalid; - - block6: - v6.i1 = eq v0 0.i256; - br v6 block3 block5; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %tuple_single_passthrough 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/unary_expr.snap b/crates/codegen/tests/fixtures/sonatina_ir/unary_expr.snap deleted file mode 100644 index 27dab66d7d..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/unary_expr.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/unary_expr.fe ---- -target = "evm-ethereum-osaka" - -func public %unary_expr() -> i256 { - block0: - v3.i256 = add 1.i256 2.i256; - v4.i256 = neg v3; - return v4; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %unary_expr; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/unit_method_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/unit_method_call.snap deleted file mode 100644 index 37ca4ad967..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/unit_method_call.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/unit_method_call.fe ---- -target = "evm-ethereum-osaka" - -func private %call_unit_method(v0.i256) { - block0: - call %counter_h872958864d1ad471_increment v0; - return; -} - -func private %counter_h872958864d1ad471_increment(v0.i256) { - block0: - return; -} - -func public %__fe_sonatina_entry() { - block0: - call %call_unit_method 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/while.snap b/crates/codegen/tests/fixtures/sonatina_ir/while.snap deleted file mode 100644 index 1ce0749cac..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/while.snap +++ /dev/null @@ -1,38 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/while.fe ---- -target = "evm-ethereum-osaka" - -func public %do_while() -> i256 { - block0: - jump block1; - - block1: - v1.i256 = phi (0.i256 block0) (v8 block2); - v3.i1 = lt v1 10.i256; - v4.i256 = zext v3 i256; - v5.i1 = ne v4 0.i256; - br v5 block2 block3; - - block2: - v8.i256 = add v1 1.i256; - jump block1; - - block3: - return v1; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %do_while; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/while_cond_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/while_cond_call.snap deleted file mode 100644 index 2fe3a8f7fd..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/while_cond_call.snap +++ /dev/null @@ -1,44 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/while_cond_call.fe ---- -target = "evm-ethereum-osaka" - -func private %lt_ten(v0.i256) -> i256 { - block0: - v3.i1 = lt v0 10.i256; - v4.i256 = zext v3 i256; - return v4; -} - -func public %while_cond_call() -> i256 { - block0: - jump block1; - - block1: - v1.i256 = phi (0.i256 block0) (v6 block2); - v2.i256 = call %lt_ten v1; - v3.i1 = ne v2 0.i256; - br v3 block2 block3; - - block2: - v6.i256 = add v1 1.i256; - jump block1; - - block3: - return v1; -} - -func public %__fe_sonatina_entry() { - block0: - v1.i256 = call %lt_ten 0.i256; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/zero_sized_aggregates.snap b/crates/codegen/tests/fixtures/sonatina_ir/zero_sized_aggregates.snap deleted file mode 100644 index 8528d45232..0000000000 --- a/crates/codegen/tests/fixtures/sonatina_ir/zero_sized_aggregates.snap +++ /dev/null @@ -1,68 +0,0 @@ ---- -source: crates/codegen/tests/sonatina_ir.rs -expression: output -input_file: crates/codegen/tests/fixtures/zero_sized_aggregates.fe ---- -target = "evm-ethereum-osaka" - -type @__fe_tuple_0 = {unit, i256}; -type @__fe_Wrap_1 = {unit, i256}; - -func public %tuple_with_empty() -> i256 { - block0: - v3.*i8 = evm_malloc 32.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_tuple_0 = int_to_ptr v4 *@__fe_tuple_0; - v7.*i256 = gep v5 0.i256 1.i256; - v8.i256 = ptr_to_int v7 i256; - mstore v8 5.i256 i256; - v9.*@__fe_tuple_0 = int_to_ptr v4 *@__fe_tuple_0; - v10.*i256 = gep v9 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - v12.i256 = mload v11 i256; - return v12; -} - -func public %tuple_only_empty() { - block0: - return; -} - -func public %struct_with_empty() -> i256 { - block0: - v3.*i8 = evm_malloc 32.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Wrap_1 = int_to_ptr v4 *@__fe_Wrap_1; - v7.*i256 = gep v5 0.i256 1.i256; - v8.i256 = ptr_to_int v7 i256; - mstore v8 7.i256 i256; - v9.*@__fe_Wrap_1 = int_to_ptr v4 *@__fe_Wrap_1; - v10.*i256 = gep v9 0.i256 1.i256; - v11.i256 = ptr_to_int v10 i256; - v12.i256 = mload v11 i256; - return v12; -} - -func public %empty_field_assign() { - block0: - v2.*i8 = evm_malloc 32.i256; - v3.i256 = ptr_to_int v2 i256; - v5.*@__fe_Wrap_1 = int_to_ptr v3 *@__fe_Wrap_1; - v6.*i256 = gep v5 0.i256 1.i256; - v7.i256 = ptr_to_int v6 i256; - mstore v7 1.i256 i256; - return; -} - -func public %__fe_sonatina_entry() { - block0: - v0.i256 = call %tuple_with_empty; - evm_stop; -} - - -object @Contract { - section runtime { - entry %__fe_sonatina_entry; - } -} diff --git a/crates/codegen/tests/fixtures/storage.fe b/crates/codegen/tests/fixtures/storage.fe deleted file mode 100644 index 1a8ee874cb..0000000000 --- a/crates/codegen/tests/fixtures/storage.fe +++ /dev/null @@ -1,166 +0,0 @@ -use std::evm::{Evm, RawMem, RawOps, RawStorage, StorPtr} - -enum User { - Alice, - Bob, -} - -enum TransferResult { - Ok, - Insufficient, -} - -struct CoinStore { - alice: u256, - bob: u256, -} - -struct TotalSupply { - total: u256, -} - -fn transfer_result_code(res: TransferResult) -> u256 { - match res { - TransferResult::Ok => 0 - TransferResult::Insufficient => 1 - } -} - -fn abi_encode(value: u256) -> ! uses (ops: mut RawOps) { - let ptr: u256 = 0 - ops.mstore(ptr, value) - ops.return_data(ptr, 32) -} - -fn credit(user: User, amount: u256) -> u256 - uses (store: mut CoinStore, supply: mut TotalSupply) -{ - match user { - User::Alice => credit_alice(amount) - User::Bob => credit_bob(amount) - } -} - -fn transfer(from: User, amount: u256) -> TransferResult - uses (store: mut CoinStore) -{ - match from { - User::Alice => transfer_from_alice(amount) - User::Bob => transfer_from_bob(amount) - } -} - -fn balance_of(user: User) -> u256 - uses (store: CoinStore) -{ - match user { - User::Alice => store.alice - User::Bob => store.bob - } -} - -fn balance_of_raw(_ user: u256) -> u256 - uses (store: CoinStore) -{ - match user { - 0 => store.alice - _ => store.bob - } -} - - -fn total_supply() -> u256 - uses (supply: TotalSupply) -{ - supply.total -} - -fn credit_alice(amount: u256) -> u256 - uses (store: mut CoinStore, supply: mut TotalSupply) -{ - store.alice = store.alice + amount - supply.total = supply.total + amount - store.alice -} - -fn credit_bob(amount: u256) -> u256 - uses (store: mut CoinStore, supply: mut TotalSupply) -{ - store.bob = store.bob + amount - supply.total = supply.total + amount - store.bob -} - -fn transfer_from_alice(amount: u256) -> TransferResult - uses (store: mut CoinStore) -{ - if store.alice < amount { - return TransferResult::Insufficient - } - store.alice = store.alice - amount - store.bob = store.bob + amount - TransferResult::Ok -} - -fn transfer_from_bob(amount: u256) -> TransferResult - uses (store: mut CoinStore) -{ - if store.bob < amount { - return TransferResult::Insufficient - } - store.bob = store.bob - amount - store.alice = store.alice + amount - TransferResult::Ok -} - -#[contract_init(Coin)] -fn init() uses (evm: mut Evm) { - let len = evm.code_region_len(runtime) - let offset = evm.code_region_offset(runtime) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(Coin)] -fn runtime() uses (evm: mut Evm) { - let mut store: StorPtr = evm.stor_ptr(0) - let mut supply: StorPtr = evm.stor_ptr(2) - with (store, supply, RawOps = evm) { - let selector = evm.calldataload(0) >> 224 - match selector { - 0xab7ccc1c => { - // credit(uint256,uint256) - let who_raw = evm.calldataload(4) - let amount = evm.calldataload(36) - let new_balance = match who_raw { - 0 => credit_alice(amount) - _ => credit_bob(amount) - } - abi_encode(value: new_balance) - } - 0x6c65aae5 => { - // balance_of(uint256) - let who_raw = evm.calldataload(4) - let value = balance_of_raw(who_raw) - abi_encode(value: value) - } - 0x0cf79e0a => { - // transfer(uint256,uint256) - let who_raw = evm.calldataload(4) - let amount = evm.calldataload(36) - let res = match who_raw { - 0 => transfer_from_alice(amount) - _ => transfer_from_bob(amount) - } - let code = transfer_result_code(res: res) - abi_encode(value: code) - } - 0x3940e9ee => { - // total_supply() - let supply = total_supply() - abi_encode(value: supply) - } - _ => evm.return_data(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/storage.snap b/crates/codegen/tests/fixtures/storage.snap deleted file mode 100644 index e70ae0b4a8..0000000000 --- a/crates/codegen/tests/fixtures/storage.snap +++ /dev/null @@ -1,205 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/storage.fe ---- -object "Coin" { - code { - function $init__StorPtr_Evm___207f35a85ac4062e() { - let v0 := datasize("Coin_deployed") - let v1 := dataoffset("Coin_deployed") - codecopy(0, v1, v0) - return(0, v0) - } - $init__StorPtr_Evm___207f35a85ac4062e() - } - - object "Coin_deployed" { - code { - function $abi_encode__Evm_hef0af3106e109414__3af54274b2985741($value, $ops) { - let v0 := 0 - mstore(v0, $value) - return(v0, 32) - } - function $balance_of_raw__StorPtr_CoinStore___ba1c0d0726e89ba2($user, $store) -> ret { - let v0 := 0 - switch $user - case 0 { - let v1 := sload($store) - v0 := v1 - } - default { - let v2 := sload(add($store, 1)) - v0 := v2 - } - ret := v0 - leave - } - function $credit_alice__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78($amount, $store, $supply) -> ret { - let v0 := sload($store) - sstore($store, add(v0, $amount)) - let v1 := sload($supply) - sstore($supply, add(v1, $amount)) - let v2 := sload($store) - ret := v2 - leave - } - function $credit_bob__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78($amount, $store, $supply) -> ret { - let v0 := sload(add($store, 1)) - sstore(add($store, 1), add(v0, $amount)) - let v1 := sload($supply) - sstore($supply, add(v1, $amount)) - let v2 := sload(add($store, 1)) - ret := v2 - leave - } - function $runtime__StorPtr_Evm___207f35a85ac4062e() { - let v0 := $stor_ptr_stor__Evm_hef0af3106e109414_CoinStore_hd26a92ca525e0e79__b6feb5585dda62f1(0, 0) - let v1 := $stor_ptr_stor__Evm_hef0af3106e109414_TotalSupply_hddb16bb19b5b088e__f5679b0709de743a(0, 2) - let v2 := v0 - let v3 := v1 - let v4 := calldataload(0) - let v5 := shr(224, v4) - switch v5 - case 2877082652 { - let v6 := calldataload(4) - let v7 := calldataload(36) - let v8 := 0 - switch v6 - case 0 { - let v9 := $credit_alice__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78(v7, v2, v3) - v8 := v9 - } - default { - let v10 := $credit_bob__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78(v7, v2, v3) - v8 := v10 - } - let v11 := v8 - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v11, 0) - } - case 1818602213 { - let v12 := calldataload(4) - let v13 := $balance_of_raw__StorPtr_CoinStore___ba1c0d0726e89ba2(v12, v2) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v13, 0) - } - case 217554442 { - let v14 := calldataload(4) - let v15 := calldataload(36) - let v16 := 0 - switch v14 - case 0 { - let v17 := $transfer_from_alice__StorPtr_CoinStore___ba1c0d0726e89ba2(v15, v2) - v16 := v17 - } - default { - let v18 := $transfer_from_bob__StorPtr_CoinStore___ba1c0d0726e89ba2(v15, v2) - v16 := v18 - } - let v19 := v16 - let v20 := $transfer_result_code(v19) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v20, 0) - } - case 960555502 { - let v21 := $total_supply__StorPtr_TotalSupply___2e654c25952f42f9(v3) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v21, 0) - } - default { - return(0, 0) - } - } - function $stor_ptr_stor__Evm_hef0af3106e109414_CoinStore_hd26a92ca525e0e79__b6feb5585dda62f1($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede($slot) - ret := v0 - leave - } - function $stor_ptr_stor__Evm_hef0af3106e109414_TotalSupply_hddb16bb19b5b088e__f5679b0709de743a($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede($raw) -> ret { - ret := $raw - leave - } - function $total_supply__StorPtr_TotalSupply___2e654c25952f42f9($supply) -> ret { - let v0 := sload($supply) - ret := v0 - leave - } - function $transfer_from_alice__StorPtr_CoinStore___ba1c0d0726e89ba2($amount, $store) -> ret { - let v0 := sload($store) - let v1 := lt(v0, $amount) - if v1 { - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 32)) - mstore(v2, 1) - ret := v2 - leave - } - if iszero(v1) { - let v3 := sload($store) - sstore($store, sub(v3, $amount)) - let v4 := sload(add($store, 1)) - sstore(add($store, 1), add(v4, $amount)) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 32)) - mstore(v5, 0) - ret := v5 - leave - } - } - function $transfer_from_bob__StorPtr_CoinStore___ba1c0d0726e89ba2($amount, $store) -> ret { - let v0 := sload(add($store, 1)) - let v1 := lt(v0, $amount) - if v1 { - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 32)) - mstore(v2, 1) - ret := v2 - leave - } - if iszero(v1) { - let v3 := sload(add($store, 1)) - sstore(add($store, 1), sub(v3, $amount)) - let v4 := sload($store) - sstore($store, add(v4, $amount)) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 32)) - mstore(v5, 0) - ret := v5 - leave - } - } - function $transfer_result_code($res) -> ret { - let v0 := 0 - let v1 := mload($res) - switch v1 - case 0 { - v0 := 0 - } - case 1 { - v0 := 1 - } - default { - } - ret := v0 - leave - } - $runtime__StorPtr_Evm___207f35a85ac4062e() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/storage_map.fe b/crates/codegen/tests/fixtures/storage_map.fe deleted file mode 100644 index 269a28b14f..0000000000 --- a/crates/codegen/tests/fixtures/storage_map.fe +++ /dev/null @@ -1,13 +0,0 @@ -use std::evm::StorageMap - -fn get_balance(addr: u256) -> u256 - uses (balances: StorageMap) -{ - balances.get(key: addr) -} - -fn set_balance(addr: u256, value: u256) - uses (balances: mut StorageMap) -{ - balances.set(key: addr, value) -} diff --git a/crates/codegen/tests/fixtures/storage_map.snap b/crates/codegen/tests/fixtures/storage_map.snap deleted file mode 100644 index 48a283e53a..0000000000 --- a/crates/codegen/tests/fixtures/storage_map.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/storage_map.fe ---- - diff --git a/crates/codegen/tests/fixtures/storage_map_contract.fe b/crates/codegen/tests/fixtures/storage_map_contract.fe deleted file mode 100644 index c5c89a7c62..0000000000 --- a/crates/codegen/tests/fixtures/storage_map_contract.fe +++ /dev/null @@ -1,105 +0,0 @@ -use std::evm::{Evm, RawMem, RawOps, RawStorage, StorageMap, StorPtr} - -fn abi_encode(value: u256) -> ! uses (ops: mut RawOps) { - let ptr: u256 = 0 - ops.mstore(ptr, value) - ops.return_data(ptr, 32) -} - -// Two separate StorageMaps - balances and allowances -fn get_balance(addr: u256) -> u256 - uses (balances: StorageMap) -{ - balances.get(key: addr) -} - -fn set_balance(addr: u256, value: u256) - uses (balances: mut StorageMap) -{ - balances.set(key: addr, value) -} - -fn get_allowance(addr: u256) -> u256 - uses (allowances: StorageMap) -{ - allowances.get(key: addr) -} - -fn set_allowance(addr: u256, value: u256) - uses (allowances: mut StorageMap) -{ - allowances.set(key: addr, value) -} - -fn transfer(from: u256, to: u256, amount: u256) -> u256 - uses (balances: mut StorageMap) -{ - let from_balance = balances.get(key: from) - if from_balance < amount { - return 1 // insufficient funds - } - let to_balance = balances.get(key: to) - balances.set(key: from, value: from_balance - amount) - balances.set(key: to, value: to_balance + amount) - 0 // success -} - -#[contract_init(BalanceMap)] -fn init() uses (evm: mut Evm) { - let len = evm.code_region_len(runtime) - let offset = evm.code_region_offset(runtime) - evm.codecopy(dest: 0, offset, len) - evm.return_data(0, len) -} - -#[contract_runtime(BalanceMap)] -fn runtime() uses (evm: mut Evm) { - let mut balances = StorageMap::new() - let mut allowances = StorageMap::new() - let selector = evm.calldataload(0) >> 224 - with (RawOps = evm) { - match selector { - 0x9cc7f708 => { - // balanceOf(uint256) - let addr = evm.calldataload(4) - let balance = with (balances) { - get_balance(addr) - } - abi_encode(value: balance) - } - 0x4a4b9feb => { - // setBalance(uint256,uint256) - let addr = evm.calldataload(4) - let value = evm.calldataload(36) - with (balances) { - set_balance(addr, value) - } - abi_encode(value: 0) - } - 0x90dd2627 => { - // transfer(uint256,uint256,uint256) - let from = evm.calldataload(4) - let to = evm.calldataload(36) - let amount = evm.calldataload(68) - let result = with (balances) { transfer(from, to, amount) } - abi_encode(value: result) - } - 0xc960174e => { - // getAllowance(uint256) - let addr = evm.calldataload(4) - let allowance = with (allowances) { get_allowance(addr) } - abi_encode(value: allowance) - } - 0x0bca4841 => { - // setAllowance(uint256,uint256) - let addr = evm.calldataload(4) - let value = evm.calldataload(36) - with (allowances) { - set_allowance(addr, value) - } - abi_encode(value: 0) - } - _ => evm.return_data(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/storage_map_contract.snap b/crates/codegen/tests/fixtures/storage_map_contract.snap deleted file mode 100644 index 54647e52e8..0000000000 --- a/crates/codegen/tests/fixtures/storage_map_contract.snap +++ /dev/null @@ -1,168 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/storage_map_contract.fe ---- -object "BalanceMap" { - code { - function $init__StorPtr_Evm___207f35a85ac4062e() { - let v0 := datasize("BalanceMap_deployed") - let v1 := dataoffset("BalanceMap_deployed") - codecopy(0, v1, v0) - return(0, v0) - } - $init__StorPtr_Evm___207f35a85ac4062e() - } - - object "BalanceMap_deployed" { - code { - function $abi_encode__Evm_hef0af3106e109414__3af54274b2985741($value, $ops) { - let v0 := 0 - mstore(v0, $value) - return(v0, 32) - } - function $get_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1($addr, $allowances) -> ret { - let v0 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_1__3c02c0f2b86be0bb($allowances, $addr) - ret := v0 - leave - } - function $get_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d($addr, $balances) -> ret { - let v0 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971($balances, $addr) - ret := v0 - leave - } - function $runtime__StorPtr_Evm___207f35a85ac4062e() { - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_new__u256_u256_0__6a346ad3c930d971() - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_new__u256_u256_1__3c02c0f2b86be0bb() - let v0 := calldataload(0) - let v1 := shr(224, v0) - switch v1 - case 2630350600 { - let v2 := calldataload(4) - let v3 := $get_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d(v2, 0) - let v4 := v3 - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v4, 0) - } - case 1246470123 { - let v5 := calldataload(4) - let v6 := calldataload(36) - $set_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d(v5, v6, 0) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(0, 0) - } - case 2430412327 { - let v7 := calldataload(4) - let v8 := calldataload(36) - let v9 := calldataload(68) - let v10 := $transfer__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d(v7, v8, v9, 0) - let v11 := v10 - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v11, 0) - } - case 3378517838 { - let v12 := calldataload(4) - let v13 := $get_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1(v12, 0) - let v14 := v13 - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v14, 0) - } - case 197806145 { - let v15 := calldataload(4) - let v16 := calldataload(36) - $set_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1(v15, v16, 0) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(0, 0) - } - default { - return(0, 0) - } - } - function $set_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1($addr, $value, $allowances) { - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_1__3c02c0f2b86be0bb($allowances, $addr, $value) - leave - } - function $set_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d($addr, $value, $balances) { - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971($balances, $addr, $value) - leave - } - function $storagemap_get_word_with_salt__u256__3271ca15373d4483($key, $salt) -> ret { - let v0 := $storagemap_storage_slot_with_salt__u256__3271ca15373d4483($key, $salt) - let v1 := sload(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971($self, $key) -> ret { - let v0 := $storagemap_get_word_with_salt__u256__3271ca15373d4483($key, 0) - let v1 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_1__3c02c0f2b86be0bb($self, $key) -> ret { - let v0 := $storagemap_get_word_with_salt__u256__3271ca15373d4483($key, 1) - let v1 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0) - ret := v1 - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_new__u256_u256_0__6a346ad3c930d971() { - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_new__u256_u256_1__3c02c0f2b86be0bb() { - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971($self, $key, $value) { - let v0 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($value) - $storagemap_set_word_with_salt__u256__3271ca15373d4483($key, 0, v0) - leave - } - function $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_1__3c02c0f2b86be0bb($self, $key, $value) { - let v0 := $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($value) - $storagemap_set_word_with_salt__u256__3271ca15373d4483($key, 1, v0) - leave - } - function $storagemap_set_word_with_salt__u256__3271ca15373d4483($key, $salt, $word) { - let v0 := $storagemap_storage_slot_with_salt__u256__3271ca15373d4483($key, $salt) - sstore(v0, $word) - leave - } - function $storagemap_storage_slot_with_salt__u256__3271ca15373d4483($key, $salt) -> ret { - let v0 := mload(64) - if iszero(v0) { - v0 := 0x80 - } - mstore(64, add(v0, 0)) - let v1 := $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 - leave - } - function $transfer__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d($from, $to, $amount, $balances) -> ret { - let v0 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971($balances, $from) - let v1 := lt(v0, $amount) - if v1 { - ret := 1 - leave - } - if iszero(v1) { - let v2 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971($balances, $to) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971($balances, $from, sub(v0, $amount)) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971($balances, $to, add(v2, $amount)) - ret := 0 - leave - } - } - function $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { - mstore($ptr, $self) - ret := 32 - leave - } - function $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word($word) -> ret { - ret := $word - leave - } - function $u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word($self) -> ret { - ret := $self - leave - } - $runtime__StorPtr_Evm___207f35a85ac4062e() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/string_literal.fe b/crates/codegen/tests/fixtures/string_literal.fe deleted file mode 100644 index f324eb8c57..0000000000 --- a/crates/codegen/tests/fixtures/string_literal.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub fn string_literal() -> String<5> { - "hello" -} diff --git a/crates/codegen/tests/fixtures/string_literal.snap b/crates/codegen/tests/fixtures/string_literal.snap deleted file mode 100644 index 8799523bd7..0000000000 --- a/crates/codegen/tests/fixtures/string_literal.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/string_literal.fe ---- -function $string_literal() -> ret { - ret := 0x68656c6c6f - leave -} diff --git a/crates/codegen/tests/fixtures/string_literal_large.fe b/crates/codegen/tests/fixtures/string_literal_large.fe deleted file mode 100644 index 528262816f..0000000000 --- a/crates/codegen/tests/fixtures/string_literal_large.fe +++ /dev/null @@ -1,4 +0,0 @@ -// Test: Large string literal (>32 bytes) should use DataRegion -pub fn large_string() -> String<64> { - "This is a long string that exceeds thirty-two bytes in length!!" -} diff --git a/crates/codegen/tests/fixtures/string_literal_large.snap b/crates/codegen/tests/fixtures/string_literal_large.snap deleted file mode 100644 index f57e8b41a2..0000000000 --- a/crates/codegen/tests/fixtures/string_literal_large.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/string_literal_large.fe ---- -function $large_string() -> ret { - ret := 0x546869732069732061206c6f6e6720737472696e6720746861742065786365656473207468697274792d74776f20627974657320696e206c656e6774682121 - leave -} diff --git a/crates/codegen/tests/fixtures/struct_init.fe b/crates/codegen/tests/fixtures/struct_init.fe deleted file mode 100644 index 0075cbe668..0000000000 --- a/crates/codegen/tests/fixtures/struct_init.fe +++ /dev/null @@ -1,12 +0,0 @@ -struct Dummy { - a: u64, - b: u256, -} - -pub fn make_dummy() -> Dummy { - let dum = Dummy { - a: 42, - b: 99, - } - dum -} diff --git a/crates/codegen/tests/fixtures/struct_init.snap b/crates/codegen/tests/fixtures/struct_init.snap deleted file mode 100644 index 39523f3d4f..0000000000 --- a/crates/codegen/tests/fixtures/struct_init.snap +++ /dev/null @@ -1,18 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/struct_init.fe ---- -function $make_dummy() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, and(42, 0xffffffffffffffff)) - mstore(add(v0, 32), 99) - let v1 := v0 - ret := v1 - leave -} diff --git a/crates/codegen/tests/fixtures/test_output/effect_test.fe b/crates/codegen/tests/fixtures/test_output/effect_test.fe deleted file mode 100644 index ceef2c37ba..0000000000 --- a/crates/codegen/tests/fixtures/test_output/effect_test.fe +++ /dev/null @@ -1,4 +0,0 @@ -#[test] -fn test_effect() uses (x: mut u256) { - x += 1 -} diff --git a/crates/codegen/tests/fixtures/test_output/effect_test.snap b/crates/codegen/tests/fixtures/test_output/effect_test.snap deleted file mode 100644 index f77ccfe823..0000000000 --- a/crates/codegen/tests/fixtures/test_output/effect_test.snap +++ /dev/null @@ -1,23 +0,0 @@ ---- -source: crates/codegen/tests/test_yul_tests.rs -expression: "output.tests[0].yul" -input_file: tests/fixtures/test_output/effect_test.fe ---- -object "test_test_effect" { - code { - datacopy(0, dataoffset("runtime"), datasize("runtime")) - return(0, datasize("runtime")) - } - - object "runtime" { - code { - function $test_effect__StorPtr_u256___64779554cfbf0358($x) { - let v0 := sload($x) - sstore($x, add(v0, 1)) - leave - } - $test_effect__StorPtr_u256___64779554cfbf0358(0) - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/tstor_ptr_contract.fe b/crates/codegen/tests/fixtures/tstor_ptr_contract.fe deleted file mode 100644 index 1dfb8dd445..0000000000 --- a/crates/codegen/tests/fixtures/tstor_ptr_contract.fe +++ /dev/null @@ -1,24 +0,0 @@ -use std::evm::effects::TStorPtr - -msg GuardMsg { - #[selector = 1] - Flip -> bool -} - -pub contract GuardContract { - mut call_count: u256, - mut block_reentrance: TStorPtr, - - init() uses (mut block_reentrance) { - block_reentrance = false - } - - recv GuardMsg { - Flip -> bool uses (mut block_reentrance, mut call_count) { - call_count += 1 - let old = block_reentrance - block_reentrance = !old - old - } - } -} diff --git a/crates/codegen/tests/fixtures/tstor_ptr_contract.snap b/crates/codegen/tests/fixtures/tstor_ptr_contract.snap deleted file mode 100644 index 8ea4e55533..0000000000 --- a/crates/codegen/tests/fixtures/tstor_ptr_contract.snap +++ /dev/null @@ -1,329 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/tstor_ptr_contract.fe ---- -object "GuardContract" { - code { - function $__GuardContract_init() { - let v0 := $init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(0, 0) - let v1 := $tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07(0) - let v2 := dataoffset("GuardContract_deployed") - let v3 := datasize("GuardContract_deployed") - let v4 := datasize("GuardContract") - let v5 := codesize() - let v6 := lt(v5, v4) - if v6 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - let v7 := sub(v5, v4) - let v8 := mload(64) - if iszero(v8) { - v8 := 0x80 - } - mstore(64, add(v8, v7)) - codecopy(v8, v4, v7) - let v9 := mload(0x40) - if iszero(v9) { - v9 := 0x80 - } - mstore(0x40, add(v9, 64)) - mstore(v9, v8) - mstore(add(v9, 32), v7) - let v10 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v9) - $__GuardContract_init_contract(v1) - codecopy(0, v2, v3) - return(0, v3) - } - function $__GuardContract_init_contract($block_reentrance) { - tstore($block_reentrance, iszero(iszero(0))) - leave - } - function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - let v1 := $input - mstore(v0, mload(v1)) - mstore(add(v0, 32), mload(add(v1, 32))) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(0, $slot) - ret := v0 - leave - } - function $init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9($self, $slot) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483($self, $slot) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 128)) - let v2 := v0 - mstore(v1, mload(v2)) - mstore(add(v1, 32), mload(add(v2, 32))) - mstore(add(v1, 64), mload(add(v2, 64))) - mstore(add(v1, 96), 0) - ret := v1 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { - ret := $raw - leave - } - function $tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07($raw) -> ret { - ret := $raw - leave - } - $__GuardContract_init() - } - - object "GuardContract_deployed" { - code { - function $__GuardContract_recv_0_0($args, $block_reentrance, $call_count) -> ret { - let v0 := sload($call_count) - sstore($call_count, add(v0, 1)) - let v1 := iszero(eq(tload($block_reentrance), 0)) - let v2 := v1 - tstore($block_reentrance, iszero(iszero(iszero(v2)))) - ret := v2 - leave - } - function $__GuardContract_runtime() { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483(0, 0) - let v1 := $tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07(0) - let v2 := $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - let v3 := $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(0) - switch v2 - case 1 { - $flip_h5b3ce0ea80335753_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v3) - let v4 := $__GuardContract_recv_0_0(0, v1, v0) - $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(0, v4) - } - default { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(0) - } - } - function $bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { - let v0 := $self - if v0 { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, 1) - } - if iszero(v0) { - $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, 0) - } - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { - let v0 := calldatasize() - ret := sub(v0, $self) - leave - } - function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) - let v1 := calldataload(v0) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { - let v0 := mload($self) - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 64)) - mstore(v1, v0) - mstore(add(v1, 32), $pos) - ret := v1 - leave - } - function $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, $input) - mstore(add(v0, 32), 0) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) { - revert(0, 0) - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483($self, $slot) -> ret { - let v0 := $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(0, $slot) - ret := v0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) -> ret { - ret := 0 - leave - } - function $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes($self, $ptr, $len) { - return($ptr, $len) - } - function $flip_h5b3ce0ea80335753_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { - leave - } - function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a($self, $value) { - let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() - let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) - pop(v1) - $bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($value, v0) - let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) - let v3 := mload(v2) - let v4 := mload(add(v2, 32)) - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(0, v3, v4) - } - function $runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(0) - let v1 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, 4) - ret := v1 - leave - } - function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { - let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) - let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { - $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) - } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 - leave - } - function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { - let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) - let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0) - ret := v1 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> ret { - let v0 := $solencoder_h1b9228b90dad6928_new() - ret := v0 - leave - } - function $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix($prefix) -> ret { - let v0 := $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(shr(224, $prefix)) - ret := v0 - leave - } - function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { - let v0 := $cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input) - let v1 := $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0, $base) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 96)) - let v3 := v1 - mstore(v2, mload(v3)) - mstore(add(v2, 32), mload(add(v3, 32))) - mstore(add(v2, 64), $base) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { - let v0 := mload($self) - let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { - let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 - leave - } - function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { - let v0 := mload(add($self, 32)) - mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) - leave - } - function $solencoder_h1b9228b90dad6928_new() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 0) - mstore(add(v0, 32), 0) - mstore(add(v0, 64), 0) - ret := v0 - leave - } - function $stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) - ret := v0 - leave - } - function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { - ret := $raw - leave - } - function $tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07($raw) -> ret { - ret := $raw - leave - } - function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { - ret := $self - leave - } - function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { - ret := $word - leave - } - $__GuardContract_runtime() - return(0, 0) - } - } -} diff --git a/crates/codegen/tests/fixtures/tuple_construction.fe b/crates/codegen/tests/fixtures/tuple_construction.fe deleted file mode 100644 index c4c981ffec..0000000000 --- a/crates/codegen/tests/fixtures/tuple_construction.fe +++ /dev/null @@ -1,9 +0,0 @@ -pub fn make_tuple() -> (u64, u256) { - let t: (u64, u256) = (42, 99) - t -} - -pub fn access_tuple() -> u256 { - let t: (u256, u256, u256) = (1, 2, 3) - t.1 -} diff --git a/crates/codegen/tests/fixtures/tuple_construction.snap b/crates/codegen/tests/fixtures/tuple_construction.snap deleted file mode 100644 index f600e141d1..0000000000 --- a/crates/codegen/tests/fixtures/tuple_construction.snap +++ /dev/null @@ -1,32 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/tuple_construction.fe ---- -function $make_tuple() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, and(42, 0xffffffffffffffff)) - mstore(add(v0, 32), 99) - let v1 := v0 - ret := v1 - leave -} -function $access_tuple() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 96)) - mstore(v0, 1) - mstore(add(v0, 32), 2) - mstore(add(v0, 64), 3) - let v1 := v0 - let v2 := mload(add(v1, 32)) - ret := v2 - leave -} diff --git a/crates/codegen/tests/fixtures/tuple_expr.fe b/crates/codegen/tests/fixtures/tuple_expr.fe deleted file mode 100644 index 7ebc9c7ed8..0000000000 --- a/crates/codegen/tests/fixtures/tuple_expr.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub fn tuple_expr() -> (u64, bool) { - (1 + 2, !false) -} diff --git a/crates/codegen/tests/fixtures/tuple_expr.snap b/crates/codegen/tests/fixtures/tuple_expr.snap deleted file mode 100644 index 4406357601..0000000000 --- a/crates/codegen/tests/fixtures/tuple_expr.snap +++ /dev/null @@ -1,17 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/tuple_expr.fe ---- -function $tuple_expr() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 64)) - mstore(v0, and(add(1, 2), 0xffffffffffffffff)) - mstore(add(v0, 32), iszero(iszero(iszero(0)))) - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/tuple_literal_field_access.fe b/crates/codegen/tests/fixtures/tuple_literal_field_access.fe deleted file mode 100644 index 0e36b365f7..0000000000 --- a/crates/codegen/tests/fixtures/tuple_literal_field_access.fe +++ /dev/null @@ -1,22 +0,0 @@ -struct PairWrap { - pair: (u256, u256), -} - -pub fn tuple_literal_field_access() -> u256 { - let a: u256 = 1 - let b: u256 = 2 - (a, b).1 -} - -pub fn tuple_literal_nested_access() -> u256 { - let a: u256 = 1 - let b: u256 = 2 - let c: u256 = 3 - (a, (b, c)).1.0 -} - -pub fn tuple_literal_struct_chain() -> u256 { - let a: u256 = 1 - let b: u256 = 2 - PairWrap { pair: (a, b) }.pair.1 -} diff --git a/crates/codegen/tests/fixtures/tuple_literal_field_access.snap b/crates/codegen/tests/fixtures/tuple_literal_field_access.snap deleted file mode 100644 index b9458c1cbe..0000000000 --- a/crates/codegen/tests/fixtures/tuple_literal_field_access.snap +++ /dev/null @@ -1,58 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 42 -expression: output -input_file: tests/fixtures/tuple_literal_field_access.fe ---- -function $tuple_literal_field_access() -> ret { - let v0 := 1 - let v1 := 2 - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - let v3 := mload(add(v2, 32)) - ret := v3 - leave -} -function $tuple_literal_nested_access() -> ret { - let v0 := 1 - let v1 := 2 - let v2 := 3 - let v3 := mload(0x40) - if iszero(v3) { - v3 := 0x80 - } - mstore(0x40, add(v3, 64)) - mstore(v3, v1) - mstore(add(v3, 32), v2) - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 - } - mstore(0x40, add(v4, 96)) - mstore(v4, v0) - let v5 := v3 - mstore(add(v4, 32), mload(v5)) - mstore(add(v4, 64), mload(add(v5, 32))) - let v6 := mload(add(v4, 32)) - ret := v6 - leave -} -function $tuple_literal_struct_chain() -> ret { - let v0 := 1 - let v1 := 2 - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), v1) - let v3 := mload(add(v2, 32)) - ret := v3 - leave -} diff --git a/crates/codegen/tests/fixtures/tuple_single_element_peeling.fe b/crates/codegen/tests/fixtures/tuple_single_element_peeling.fe deleted file mode 100644 index 60b84ecc63..0000000000 --- a/crates/codegen/tests/fixtures/tuple_single_element_peeling.fe +++ /dev/null @@ -1,27 +0,0 @@ -// Tests transparent peeling for single-element tuples `(T,)`. - -struct WrapU256 { - inner: u256, -} - -pub fn tuple_single_passthrough(x: u256) -> u256 { - let t: (u256,) = (x,) - t.0 -} - -pub fn tuple_single_nested_passthrough(x: u256) -> u256 { - let t: ((u256,),) = ((x,),) - t.0.0 -} - -pub fn tuple_single_struct_newtype_nested(x: u256) -> u256 { - let t: (WrapU256,) = (WrapU256 { inner: x },) - t.0.inner -} - -pub fn match_single_element_tuple(t: (bool,)) -> u8 { - match t { - (true,) => 1, - (false,) => 0, - } -} diff --git a/crates/codegen/tests/fixtures/tuple_single_element_peeling.snap b/crates/codegen/tests/fixtures/tuple_single_element_peeling.snap deleted file mode 100644 index a5ab7bbbdc..0000000000 --- a/crates/codegen/tests/fixtures/tuple_single_element_peeling.snap +++ /dev/null @@ -1,34 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/tuple_single_element_peeling.fe ---- -function $tuple_single_passthrough($x) -> ret { - let v0 := $x - ret := v0 - leave -} -function $tuple_single_nested_passthrough($x) -> ret { - let v0 := $x - ret := v0 - leave -} -function $tuple_single_struct_newtype_nested($x) -> ret { - let v0 := $x - ret := v0 - leave -} -function $match_single_element_tuple($t) -> ret { - let v0 := 0 - switch $t - case 1 { - v0 := 1 - } - case 0 { - v0 := 0 - } - default { - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/unary_expr.fe b/crates/codegen/tests/fixtures/unary_expr.fe deleted file mode 100644 index abf8a6727e..0000000000 --- a/crates/codegen/tests/fixtures/unary_expr.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub fn unary_expr() -> u64 { - -(1 + 2) -} diff --git a/crates/codegen/tests/fixtures/unary_expr.snap b/crates/codegen/tests/fixtures/unary_expr.snap deleted file mode 100644 index cb588adb15..0000000000 --- a/crates/codegen/tests/fixtures/unary_expr.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/unary_expr.fe ---- -function $unary_expr() -> ret { - ret := sub(0, add(1, 2)) - leave -} diff --git a/crates/codegen/tests/fixtures/unit_method_call.fe b/crates/codegen/tests/fixtures/unit_method_call.fe deleted file mode 100644 index 5612aaf1fa..0000000000 --- a/crates/codegen/tests/fixtures/unit_method_call.fe +++ /dev/null @@ -1,12 +0,0 @@ -struct Counter { - value: u256, -} - -impl Counter { - fn increment(self) { - } -} - -fn call_unit_method(c: Counter) { - c.increment() -} diff --git a/crates/codegen/tests/fixtures/unit_method_call.snap b/crates/codegen/tests/fixtures/unit_method_call.snap deleted file mode 100644 index 2af2c162ca..0000000000 --- a/crates/codegen/tests/fixtures/unit_method_call.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/unit_method_call.fe ---- -function $call_unit_method($c) { - $counter_h872958864d1ad471_increment($c) - leave -} -function $counter_h872958864d1ad471_increment($self) { - leave -} diff --git a/crates/codegen/tests/fixtures/while.fe b/crates/codegen/tests/fixtures/while.fe deleted file mode 100644 index 9dd6197e1a..0000000000 --- a/crates/codegen/tests/fixtures/while.fe +++ /dev/null @@ -1,7 +0,0 @@ -pub fn do_while() -> u64 { - let mut i = 0 - while i < 10 { - i = i + 1 - } - i -} diff --git a/crates/codegen/tests/fixtures/while.snap b/crates/codegen/tests/fixtures/while.snap deleted file mode 100644 index 4c9e1f79e5..0000000000 --- a/crates/codegen/tests/fixtures/while.snap +++ /dev/null @@ -1,17 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/while.fe ---- -function $do_while() -> ret { - let v0 := 0 - for { } 1 { } { - if iszero(lt(v0, 10)) { - break - } - v0 := add(v0, 1) - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/while_cond_call.fe b/crates/codegen/tests/fixtures/while_cond_call.fe deleted file mode 100644 index 2a9a38cd43..0000000000 --- a/crates/codegen/tests/fixtures/while_cond_call.fe +++ /dev/null @@ -1,11 +0,0 @@ -fn lt_ten(value: u64) -> bool { - value < 10 -} - -pub fn while_cond_call() -> u64 { - let mut i = 0 - while lt_ten(i) { - i = i + 1 - } - i -} diff --git a/crates/codegen/tests/fixtures/while_cond_call.snap b/crates/codegen/tests/fixtures/while_cond_call.snap deleted file mode 100644 index e01adb5000..0000000000 --- a/crates/codegen/tests/fixtures/while_cond_call.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -assertion_line: 33 -expression: output -input_file: tests/fixtures/while_cond_call.fe ---- -function $lt_ten($value) -> ret { - ret := lt($value, 10) - leave -} -function $while_cond_call() -> ret { - let v0 := 0 - for { } 1 { } { - let v1 := $lt_ten(v0) - if iszero(v1) { - break - } - v0 := add(v0, 1) - } - ret := v0 - leave -} diff --git a/crates/codegen/tests/fixtures/zero_sized_aggregates.fe b/crates/codegen/tests/fixtures/zero_sized_aggregates.fe deleted file mode 100644 index c787b41377..0000000000 --- a/crates/codegen/tests/fixtures/zero_sized_aggregates.fe +++ /dev/null @@ -1,33 +0,0 @@ -struct Empty { -} - -struct Wrap { - empty: Empty, - value: u256, -} - -pub fn tuple_with_empty() -> u256 { - let e: Empty = Empty {} - let v: u256 = 5 - let t: (Empty, u256) = (e, v) - t.1 -} - -pub fn tuple_only_empty() -> (Empty,) { - let e: Empty = Empty {} - let t: (Empty,) = (e,) - t -} - -pub fn struct_with_empty() -> u256 { - let e: Empty = Empty {} - let v: u256 = 7 - let w: Wrap = Wrap { empty: e, value: v } - w.value -} - -pub fn empty_field_assign() { - let e: Empty = Empty {} - let mut w: Wrap = Wrap { empty: e, value: 1 } - w.empty = Empty {} -} diff --git a/crates/codegen/tests/fixtures/zero_sized_aggregates.snap b/crates/codegen/tests/fixtures/zero_sized_aggregates.snap deleted file mode 100644 index 8c1df3acf5..0000000000 --- a/crates/codegen/tests/fixtures/zero_sized_aggregates.snap +++ /dev/null @@ -1,48 +0,0 @@ ---- -source: crates/codegen/tests/yul.rs -expression: output -input_file: tests/fixtures/zero_sized_aggregates.fe ---- -function $tuple_with_empty() -> ret { - let v0 := 5 - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 32)) - pop(v1) - mstore(v1, v0) - let v2 := v1 - let v3 := mload(v2) - ret := v3 - leave -} -function $tuple_only_empty() { - leave -} -function $struct_with_empty() -> ret { - let v0 := 7 - let v1 := mload(0x40) - if iszero(v1) { - v1 := 0x80 - } - mstore(0x40, add(v1, 32)) - pop(v1) - mstore(v1, v0) - let v2 := v1 - let v3 := mload(v2) - ret := v3 - leave -} -function $empty_field_assign() { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 - } - mstore(0x40, add(v0, 32)) - pop(v0) - mstore(v0, 1) - let v1 := v0 - pop(v1) - leave -} diff --git a/crates/codegen/tests/layout.rs b/crates/codegen/tests/layout.rs deleted file mode 100644 index 250c448ba0..0000000000 --- a/crates/codegen/tests/layout.rs +++ /dev/null @@ -1,147 +0,0 @@ -//! Layout snapshot tests: verify type sizes and field offsets. -//! -//! These tests ensure layout computation is consistent and correct. -//! The snapshots serve as golden values that catch layout drift. - -use std::path::Path; - -use dir_test::{Fixture, dir_test}; -use hir::hir_def::{Enum, Struct}; -use hir::test_db::HirAnalysisTestDb; -use mir::layout; -use test_utils::snap_test; - -/// Generates a layout report for all ADTs in a module. -fn generate_layout_report<'db>( - db: &'db HirAnalysisTestDb, - top_mod: hir::hir_def::TopLevelMod<'db>, -) -> String { - let mut report = String::new(); - - // Collect structs - for &strct in top_mod.all_structs(db) { - report.push_str(&format_struct_layout(db, strct)); - report.push('\n'); - } - - // Collect enums - for &enm in top_mod.all_enums(db) { - report.push_str(&format_enum_layout(db, enm)); - report.push('\n'); - } - - report -} - -fn format_struct_layout<'db>(db: &'db HirAnalysisTestDb, strct: Struct<'db>) -> String { - let name = strct - .name(db) - .to_opt() - .map(|n| n.data(db).to_string()) - .unwrap_or_else(|| "".to_string()); - - let mut lines = vec![format!("struct {name}:")]; - - // Get field types via semantic API - let field_tys = strct.field_tys(db); - - // Compute total size - let mut total_size = 0; - for field_ty_binder in &field_tys { - let field_ty = *field_ty_binder.skip_binder(); - total_size += layout::ty_size_bytes(db, field_ty).expect("field size known"); - } - lines.push(format!(" size: {total_size} bytes")); - - lines.push(" fields:".to_string()); - - let mut offset = 0; - for (idx, field_ty_binder) in field_tys.iter().enumerate() { - let field_ty = *field_ty_binder.skip_binder(); - let field_size = layout::ty_size_bytes(db, field_ty).expect("field size known"); - - lines.push(format!(" [{idx}]: offset={offset}, size={field_size}")); - offset += field_size; - } - - lines.join("\n") -} - -fn format_enum_layout<'db>(db: &'db HirAnalysisTestDb, enm: Enum<'db>) -> String { - let name = enm - .name(db) - .to_opt() - .map(|n| n.data(db).to_string()) - .unwrap_or_else(|| "".to_string()); - - let adt_def = enm.as_adt(db); - - let mut lines = vec![format!("enum {name}:")]; - - // Compute enum size (discriminant + max payload) - let mut max_payload_size = 0; - for adt_field in adt_def.fields(db).iter() { - let mut payload_size = 0; - for field_ty_binder in adt_field.iter_types(db) { - let field_ty = *field_ty_binder.skip_binder(); - payload_size += layout::ty_size_bytes(db, field_ty).expect("variant field size known"); - } - max_payload_size = max_payload_size.max(payload_size); - } - - let total_size = layout::DISCRIMINANT_SIZE_BYTES + max_payload_size; - lines.push(format!(" size: {total_size} bytes")); - lines.push(format!( - " discriminant: {} bytes", - layout::DISCRIMINANT_SIZE_BYTES - )); - - lines.push(" variants:".to_string()); - - // Get variant names from HIR - let variants: Vec<_> = enm.variants(db).collect(); - - for (idx, (variant, adt_field)) in variants.iter().zip(adt_def.fields(db).iter()).enumerate() { - let variant_name = variant - .name(db) - .map(|n| n.data(db).to_string()) - .unwrap_or_else(|| format!("{idx}")); - - if adt_field.num_types() == 0 { - lines.push(format!(" {variant_name}: (unit)")); - } else { - lines.push(format!(" {variant_name}:")); - let mut field_offset = 0; - for (field_idx, field_ty_binder) in adt_field.iter_types(db).enumerate() { - let field_ty = *field_ty_binder.skip_binder(); - let field_size = - layout::ty_size_bytes(db, field_ty).expect("variant field size known"); - - // Absolute offset = discriminant + payload offset - let abs_offset = layout::DISCRIMINANT_SIZE_BYTES + field_offset; - lines.push(format!( - " [{field_idx}]: offset={abs_offset}, size={field_size}" - )); - field_offset += field_size; - } - } - } - - lines.join("\n") -} - -#[dir_test( - dir: "$CARGO_MANIFEST_DIR/tests/fixtures/layout", - glob: "*.fe" -)] -fn layout_snapshot(fixture: Fixture<&str>) { - let mut db = HirAnalysisTestDb::default(); - let path = Path::new(fixture.path()); - let file_name = path.file_name().and_then(|file| file.to_str()).unwrap(); - let file = db.new_stand_alone(file_name.into(), fixture.content()); - let (top_mod, _prop_formatter) = db.top_mod(file); - db.assert_no_diags(top_mod); - - let report = generate_layout_report(&db, top_mod); - snap_test!(report, fixture.path()); -} diff --git a/crates/codegen/tests/sonatina_ir.rs b/crates/codegen/tests/sonatina_ir.rs deleted file mode 100644 index 84a70b42e1..0000000000 --- a/crates/codegen/tests/sonatina_ir.rs +++ /dev/null @@ -1,66 +0,0 @@ -//! Snapshot tests for Sonatina IR output. -//! -//! These tests compile Fe fixtures to Sonatina IR and snapshot the human-readable -//! IR text. This helps catch IR lowering bugs and makes it easy to review what -//! IR is generated for each fixture. -//! -//! Snapshots are stored in `fixtures/sonatina_ir/` to avoid conflicting with Yul snapshots. - -use common::InputDb; -use dir_test::{Fixture, dir_test}; -use driver::DriverDataBase; -use fe_codegen::emit_module_sonatina_ir; -use std::path::Path; -use test_utils::_macro_support::_insta::{self, Settings}; -use url::Url; - -// NOTE: `dir_test` discovers fixtures at compile time; new fixture files will be picked up on a -// clean build (e.g. CI) or whenever this test target is recompiled. -// -// Unlike the Yul tests which run on all fixtures, Sonatina IR tests only run on fixtures -// that the backend currently supports. Unsupported fixtures will produce LowerError::Unsupported -// which we skip gracefully. -#[dir_test( - dir: "$CARGO_MANIFEST_DIR/tests/fixtures", - glob: "*.fe" -)] -fn sonatina_ir_snap(fixture: Fixture<&str>) { - let mut db = DriverDataBase::default(); - let file_url = Url::from_file_path(fixture.path()).expect("fixture path should be absolute"); - db.workspace().touch( - &mut db, - file_url.clone(), - Some(fixture.content().to_string()), - ); - let file = db - .workspace() - .get(&db, &file_url) - .expect("file should be loaded"); - let top_mod = db.top_mod(file); - - let output = match emit_module_sonatina_ir(&db, top_mod) { - Ok(ir) => ir, - Err(fe_codegen::LowerError::Unsupported(msg)) => { - tracing::info!("SKIP {}: unsupported ({msg})", fixture.path()); - return; - } - Err(fe_codegen::LowerError::Internal(msg)) => { - tracing::warn!("SKIP {}: internal error ({msg})", fixture.path()); - return; - } - Err(err) => panic!("Sonatina IR lowering failed: {err}"), - }; - - // Store snapshots in sonatina_ir/ subdirectory to avoid conflicting with Yul snapshots - let fixture_path = Path::new(fixture.path()); - let fixture_name = fixture_path.file_stem().unwrap().to_str().unwrap(); - let snapshot_dir = fixture_path.parent().unwrap().join("sonatina_ir"); - - let mut settings = Settings::new(); - settings.set_snapshot_path(snapshot_dir); - settings.set_input_file(fixture.path()); - settings.set_prepend_module_to_snapshot(false); - settings.bind(|| { - _insta::assert_snapshot!(fixture_name, output); - }); -} diff --git a/crates/codegen/tests/sonatina_operand_collect.rs b/crates/codegen/tests/sonatina_operand_collect.rs deleted file mode 100644 index 807372afab..0000000000 --- a/crates/codegen/tests/sonatina_operand_collect.rs +++ /dev/null @@ -1,45 +0,0 @@ -use sonatina_ir::{ - I256, Signature, Type, ValueId, - builder::ModuleBuilder, - func_cursor::InstInserter, - inst::{Inst, evm::EvmCreate2}, - isa::Isa, - isa::evm::Evm, -}; -use sonatina_triple::{Architecture, EvmVersion, OperatingSystem, TargetTriple, Vendor}; - -#[test] -fn evm_create2_collects_all_operands() { - let triple = TargetTriple::new( - Architecture::Evm, - Vendor::Ethereum, - OperatingSystem::Evm(EvmVersion::Osaka), - ); - let isa = sonatina_ir::isa::evm::Evm::new(triple); - let is = isa.inst_set(); - - let inst = EvmCreate2::new(is, ValueId(1), ValueId(2), ValueId(3), ValueId(4)); - assert_eq!(inst.collect_values().len(), 4); -} - -#[test] -fn make_imm_value_is_interned() { - let triple = TargetTriple::new( - Architecture::Evm, - Vendor::Ethereum, - OperatingSystem::Evm(EvmVersion::Osaka), - ); - let isa = Evm::new(triple); - let ctx = sonatina_ir::module::ModuleCtx::new(&isa); - let builder = ModuleBuilder::new(ctx); - - let sig = Signature::new("f", sonatina_ir::Linkage::Public, &[], Type::Unit); - let func_ref = builder.declare_function(sig).unwrap(); - let mut fb = builder.func_builder::(func_ref); - let entry = fb.append_block(); - fb.switch_to_block(entry); - - let a = fb.make_imm_value(I256::zero()); - let b = fb.make_imm_value(I256::zero()); - assert_eq!(a, b, "expected identical immediates to be interned"); -} diff --git a/crates/codegen/tests/test_yul_tests.rs b/crates/codegen/tests/test_yul_tests.rs deleted file mode 100644 index 319e38d5d0..0000000000 --- a/crates/codegen/tests/test_yul_tests.rs +++ /dev/null @@ -1,38 +0,0 @@ -use common::InputDb; -use dir_test::{Fixture, dir_test}; -use driver::DriverDataBase; -use fe_codegen::emit_test_module_yul; -use test_utils::snap_test; -use url::Url; - -/// Snapshot test for emitted test Yul objects. -/// -/// * `fixture` - Fixture containing the input file and contents. -/// -/// Returns nothing; asserts on the emitted Yul output. -#[dir_test( - dir: "$CARGO_MANIFEST_DIR/tests/fixtures/test_output", - glob: "*.fe" -)] -fn yul_test_object_snap(fixture: Fixture<&str>) { - let mut db = DriverDataBase::default(); - let file_url = Url::from_file_path(fixture.path()).expect("fixture path should be absolute"); - db.workspace().touch( - &mut db, - file_url.clone(), - Some(fixture.content().to_string()), - ); - let file = db - .workspace() - .get(&db, &file_url) - .expect("file should be loaded"); - let top_mod = db.top_mod(file); - - let output = match emit_test_module_yul(&db, top_mod) { - Ok(output) => output, - Err(err) => panic!("MIR ERROR: {err}"), - }; - - assert_eq!(output.tests.len(), 1, "fixture should yield one test"); - snap_test!(output.tests[0].yul, fixture.path()); -} diff --git a/crates/codegen/tests/yul.rs b/crates/codegen/tests/yul.rs deleted file mode 100644 index 7986ed8aa5..0000000000 --- a/crates/codegen/tests/yul.rs +++ /dev/null @@ -1,34 +0,0 @@ -use common::InputDb; -use dir_test::{Fixture, dir_test}; -use driver::DriverDataBase; -use fe_codegen::emit_module_yul; -use test_utils::snap_test; -use url::Url; - -// NOTE: `dir_test` discovers fixtures at compile time; new fixture files will be picked up on a -// clean build (e.g. CI) or whenever this test target is recompiled. -#[dir_test( - dir: "$CARGO_MANIFEST_DIR/tests/fixtures", - glob: "*.fe" -)] -fn yul_snap(fixture: Fixture<&str>) { - let mut db = DriverDataBase::default(); - let file_url = Url::from_file_path(fixture.path()).expect("fixture path should be absolute"); - db.workspace().touch( - &mut db, - file_url.clone(), - Some(fixture.content().to_string()), - ); - let file = db - .workspace() - .get(&db, &file_url) - .expect("file should be loaded"); - let top_mod = db.top_mod(file); - - let output = match emit_module_yul(&db, top_mod) { - Ok(yul) => yul, - Err(err) => panic!("MIR ERROR: {err}"), - }; - - snap_test!(output, fixture.path()); -} diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml deleted file mode 100644 index 5111703c95..0000000000 --- a/crates/common/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ -[package] -name = "fe-common" -version = "26.0.0-alpha.7" -edition.workspace = true -license = "Apache-2.0" -repository = "https://github.com/argotorg/fe" -description = "Provides HIR definition and lowering for Fe lang." - -[lib] -doctest = false - -[dependencies] -camino.workspace = true -paste.workspace = true -salsa.workspace = true -serde-semver.workspace = true -smol_str.workspace = true -rust-embed = "8.5.0" -toml = "0.8.8" -tracing.workspace = true -petgraph.workspace = true - -parser.workspace = true -url.workspace = true -typed-path.workspace = true -ordermap = "0.5.5" -rustc-hash.workspace = true -radix_immutable = "0.1" diff --git a/crates/common/src/cache.rs b/crates/common/src/cache.rs deleted file mode 100644 index 910e034114..0000000000 --- a/crates/common/src/cache.rs +++ /dev/null @@ -1,65 +0,0 @@ -use camino::Utf8PathBuf; -use std::{env, path::PathBuf}; - -fn utf8_path_from_os(value: std::ffi::OsString) -> Option { - Utf8PathBuf::from_path_buf(PathBuf::from(value)).ok() -} - -fn env_path(var: &str) -> Option { - env::var_os(var).and_then(utf8_path_from_os) -} - -fn join_components(mut base: Utf8PathBuf, components: &[&str]) -> Utf8PathBuf { - for component in components { - base.push(component); - } - base -} - -fn xdg_cache_dir() -> Option { - env_path("XDG_CACHE_HOME").map(|path| join_components(path, &["fe", "git"])) -} - -fn unix_home_cache() -> Option { - #[cfg(unix)] - { - env_path("HOME").map(|path| join_components(path, &[".cache", "fe", "git"])) - } - #[cfg(not(unix))] - { - None - } -} - -fn windows_local_appdata() -> Option { - #[cfg(windows)] - { - env_path("LOCALAPPDATA") - .or_else(|| env_path("USERPROFILE")) - .map(|path| join_components(path, &["Fe", "cache", "git"])) - } - #[cfg(not(windows))] - { - None - } -} - -pub fn remote_git_cache_dir() -> Option { - env_path("FE_REMOTE_CACHE_DIR") - .or_else(|| { - env_path("FE_CACHE_DIR").map(|path| { - if path.ends_with("git") { - path - } else { - join_components(path, &["git"]) - } - }) - }) - .or_else(xdg_cache_dir) - .or_else(unix_home_cache) - .or_else(windows_local_appdata) - .or_else(|| { - utf8_path_from_os(env::temp_dir().into()) - .map(|path| join_components(path, &["fe", "git"])) - }) -} diff --git a/crates/common/src/color.rs b/crates/common/src/color.rs deleted file mode 100644 index d6af87ddb2..0000000000 --- a/crates/common/src/color.rs +++ /dev/null @@ -1,73 +0,0 @@ -use std::{ - env, - io::{self, IsTerminal}, - sync::atomic::{AtomicU8, Ordering}, -}; - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum ColorPreference { - Auto, - Always, - Never, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub enum ColorTarget { - Stdout, - Stderr, -} - -// 0 = auto, 1 = always, 2 = never -static COLOR_PREFERENCE: AtomicU8 = AtomicU8::new(0); - -pub fn set_color_preference(preference: ColorPreference) { - let value = match preference { - ColorPreference::Auto => 0, - ColorPreference::Always => 1, - ColorPreference::Never => 2, - }; - COLOR_PREFERENCE.store(value, Ordering::Relaxed); -} - -pub fn color_preference() -> ColorPreference { - match COLOR_PREFERENCE.load(Ordering::Relaxed) { - 1 => ColorPreference::Always, - 2 => ColorPreference::Never, - _ => ColorPreference::Auto, - } -} - -pub fn should_colorize(target: ColorTarget) -> bool { - match color_preference() { - ColorPreference::Always => true, - ColorPreference::Never => false, - ColorPreference::Auto => should_colorize_auto(target), - } -} - -fn normalize_env(value: Result) -> Option { - match value { - Ok(string) => Some(string != "0"), - Err(_) => None, - } -} - -fn should_colorize_auto(target: ColorTarget) -> bool { - if normalize_env(env::var("CLICOLOR_FORCE")) == Some(true) { - return true; - } - - if normalize_env(env::var("NO_COLOR")).is_some() { - return false; - } - - let clicolor = normalize_env(env::var("CLICOLOR")).unwrap_or(true); - if !clicolor { - return false; - } - - match target { - ColorTarget::Stdout => io::stdout().is_terminal(), - ColorTarget::Stderr => io::stderr().is_terminal(), - } -} diff --git a/crates/common/src/config/dependency.rs b/crates/common/src/config/dependency.rs deleted file mode 100644 index fb4f5cad73..0000000000 --- a/crates/common/src/config/dependency.rs +++ /dev/null @@ -1,202 +0,0 @@ -use camino::Utf8PathBuf; -use smol_str::SmolStr; -use toml::Value; -use url::Url; - -use crate::dependencies::RemoteFiles; - -use super::{ConfigDiagnostic, is_valid_name}; - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct DependencyEntry { - pub alias: SmolStr, - pub location: DependencyEntryLocation, - pub arguments: crate::dependencies::DependencyArguments, -} - -impl DependencyEntry { - pub fn new( - alias: SmolStr, - location: DependencyEntryLocation, - arguments: crate::dependencies::DependencyArguments, - ) -> Self { - Self { - alias, - location, - arguments, - } - } -} - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub enum DependencyEntryLocation { - RelativePath(Utf8PathBuf), - Remote(RemoteFiles), - WorkspaceCurrent, -} - -pub fn parse_root_dependencies( - parsed: &Value, - diagnostics: &mut Vec, -) -> Vec { - parsed - .get("dependencies") - .and_then(|value| value.as_table()) - .map(|table| parse_dependencies_table(table, "dependencies", diagnostics)) - .unwrap_or_default() -} - -pub fn parse_dependencies_table( - table: &toml::map::Map, - field_prefix: &str, - diagnostics: &mut Vec, -) -> Vec { - let mut dependencies = Vec::new(); - for (alias, value) in table { - if !is_valid_name(alias) { - diagnostics.push(ConfigDiagnostic::InvalidDependencyAlias(alias.into())); - } - - let alias = SmolStr::new(alias); - match value { - Value::String(path) => { - if let Ok(version) = path.parse() { - let arguments = crate::dependencies::DependencyArguments { - name: Some(alias.clone()), - version: Some(version), - }; - dependencies.push(DependencyEntry::new( - alias.clone(), - DependencyEntryLocation::WorkspaceCurrent, - arguments, - )); - } else { - dependencies.push(DependencyEntry::new( - alias.clone(), - DependencyEntryLocation::RelativePath(Utf8PathBuf::from(path)), - crate::dependencies::DependencyArguments::default(), - )); - } - } - Value::Boolean(true) => { - let arguments = crate::dependencies::DependencyArguments { - name: Some(alias.clone()), - ..Default::default() - }; - dependencies.push(DependencyEntry::new( - alias.clone(), - DependencyEntryLocation::WorkspaceCurrent, - arguments, - )); - } - Value::Table(table) => { - let mut arguments = crate::dependencies::DependencyArguments::default(); - let mut has_name_field = false; - let mut has_name = false; - if let Some(name) = table.get("name") { - has_name_field = true; - if let Some(name) = name.as_str() { - if is_valid_name(name) { - arguments.name = Some(SmolStr::new(name)); - has_name = true; - } else { - diagnostics.push(ConfigDiagnostic::InvalidDependencyName(name.into())); - } - } else { - diagnostics.push(ConfigDiagnostic::InvalidDependencyName( - name.to_string().into(), - )); - } - } - if let Some(version) = table.get("version").and_then(|value| value.as_str()) { - if let Ok(version) = version.parse() { - arguments.version = Some(version); - } else { - diagnostics - .push(ConfigDiagnostic::InvalidDependencyVersion(version.into())); - } - } - - if table.contains_key("source") { - match parse_git_dependency(&alias, table) { - Ok(remote) => dependencies.push(DependencyEntry::new( - alias.clone(), - DependencyEntryLocation::Remote(remote), - arguments, - )), - Err(diag) => diagnostics.push(diag), - } - } else if let Some(path) = table.get("path").and_then(|value| value.as_str()) { - dependencies.push(DependencyEntry::new( - alias.clone(), - DependencyEntryLocation::RelativePath(Utf8PathBuf::from(path)), - arguments, - )); - } else if has_name || (!has_name_field && arguments.version.is_some()) { - if arguments.name.is_none() { - arguments.name = Some(alias.clone()); - } - dependencies.push(DependencyEntry::new( - alias.clone(), - DependencyEntryLocation::WorkspaceCurrent, - arguments, - )); - } else if !has_name_field { - arguments.name = Some(alias.clone()); - dependencies.push(DependencyEntry::new( - alias.clone(), - DependencyEntryLocation::WorkspaceCurrent, - arguments, - )); - } else { - diagnostics.push(ConfigDiagnostic::MissingDependencyPath { - alias: alias.clone(), - description: format!("{field_prefix}.{alias}"), - }); - } - } - value => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: field_prefix.into(), - found: value.type_str().to_lowercase().into(), - expected: Some("table".into()), - }), - } - } - dependencies -} - -fn parse_git_dependency( - alias: &SmolStr, - table: &toml::map::Map, -) -> Result { - let source_value = table - .get("source") - .and_then(|value| value.as_str()) - .ok_or_else(|| ConfigDiagnostic::MissingDependencySource { - alias: alias.clone(), - })?; - - let source = - Url::parse(source_value).map_err(|_| ConfigDiagnostic::InvalidDependencySource { - alias: alias.clone(), - value: source_value.into(), - })?; - - let rev_value = table - .get("rev") - .and_then(|value| value.as_str()) - .ok_or_else(|| ConfigDiagnostic::MissingDependencyRev { - alias: alias.clone(), - })?; - - let path = table - .get("path") - .and_then(|value| value.as_str()) - .map(Utf8PathBuf::from); - - Ok(RemoteFiles { - source, - rev: SmolStr::new(rev_value), - path, - }) -} diff --git a/crates/common/src/config/ingot.rs b/crates/common/src/config/ingot.rs deleted file mode 100644 index 5b528ec07d..0000000000 --- a/crates/common/src/config/ingot.rs +++ /dev/null @@ -1,73 +0,0 @@ -use smol_str::SmolStr; -use toml::Value; - -use crate::ingot::Version; - -use super::{ConfigDiagnostic, dependency, is_valid_name}; - -#[derive(Debug, Default, Clone, PartialEq, Eq, Hash)] -pub struct IngotMetadata { - pub name: Option, - pub version: Option, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct IngotConfig { - pub metadata: IngotMetadata, - pub dependency_entries: Vec, - pub diagnostics: Vec, -} - -impl IngotConfig { - pub fn parse_from_value(parsed: &Value) -> Self { - let mut diagnostics = Vec::new(); - let metadata = parse_ingot(parsed, &mut diagnostics); - let dependency_entries = dependency::parse_root_dependencies(parsed, &mut diagnostics); - Self { - metadata, - dependency_entries, - diagnostics, - } - } -} - -pub(crate) fn parse_ingot( - parsed: &Value, - diagnostics: &mut Vec, -) -> IngotMetadata { - let mut metadata = IngotMetadata::default(); - - let table = match parsed.get("ingot").and_then(|value| value.as_table()) { - Some(table) => Some(table), - None => parsed.as_table(), - }; - - if let Some(table) = table { - if let Some(name) = table.get("name") { - match name.as_str() { - Some(name) if is_valid_name(name) => metadata.name = Some(SmolStr::new(name)), - Some(name) => diagnostics.push(ConfigDiagnostic::InvalidName(SmolStr::new(name))), - None => diagnostics.push(ConfigDiagnostic::InvalidName(SmolStr::new( - name.to_string(), - ))), - } - } else { - diagnostics.push(ConfigDiagnostic::MissingName); - } - - if let Some(version) = table.get("version") { - match version.as_str().and_then(|value| value.parse().ok()) { - Some(version) => metadata.version = Some(version), - None => diagnostics.push(ConfigDiagnostic::InvalidVersion(SmolStr::from( - version.to_string(), - ))), - } - } else { - diagnostics.push(ConfigDiagnostic::MissingVersion); - } - } else { - diagnostics.push(ConfigDiagnostic::MissingIngotMetadata); - } - - metadata -} diff --git a/crates/common/src/config/mod.rs b/crates/common/src/config/mod.rs deleted file mode 100644 index 25b7ff289d..0000000000 --- a/crates/common/src/config/mod.rs +++ /dev/null @@ -1,436 +0,0 @@ -use std::fmt::Display; - -use smol_str::SmolStr; -use toml::Value; -use url::Url; - -use crate::{ - dependencies::{Dependency, DependencyLocation, LocalFiles}, - urlext::UrlExt, -}; - -mod dependency; -mod ingot; -mod workspace; - -pub use dependency::{DependencyEntry, DependencyEntryLocation, parse_dependencies_table}; -pub use ingot::{IngotConfig, IngotMetadata}; -pub use workspace::{ - WorkspaceConfig, WorkspaceMemberSelection, WorkspaceResolution, WorkspaceSettings, -}; - -#[derive(Debug, Clone, PartialEq)] -pub enum Config { - Ingot(IngotConfig), - Workspace(Box), -} - -impl Config { - pub fn parse(content: &str) -> Result { - let parsed: Value = content - .parse() - .map_err(|e: toml::de::Error| e.to_string())?; - - let has_ingot_table = parsed.get("ingot").is_some(); - let has_workspace_table = parsed.get("workspace").is_some(); - - if has_ingot_table && has_workspace_table { - return Err("config cannot contain both [ingot] and [workspace] sections".to_string()); - } - - if has_ingot_table { - return Ok(Config::Ingot(ingot::IngotConfig::parse_from_value(&parsed))); - } - - if has_workspace_table || looks_like_workspace(&parsed) { - return workspace::parse_workspace_config(&parsed) - .map(|config| Config::Workspace(Box::new(config))); - } - - Ok(Config::Ingot(ingot::IngotConfig::parse_from_value(&parsed))) - } -} - -pub fn looks_like_workspace(parsed: &Value) -> bool { - let Some(table) = parsed.as_table() else { - return false; - }; - - table.contains_key("members") - || table.contains_key("default-members") - || table.contains_key("exclude") - || table.contains_key("resolution") - || table.contains_key("profiles") - || table.contains_key("scripts") -} - -pub fn is_workspace_content(content: &str) -> bool { - let parsed: Value = match content.parse() { - Ok(parsed) => parsed, - Err(_) => return false, - }; - parsed.get("workspace").is_some() || looks_like_workspace(&parsed) -} - -impl IngotConfig { - pub fn dependencies(&self, base_url: &Url) -> Vec { - self.dependency_entries - .iter() - .map(|dependency| match &dependency.location { - DependencyEntryLocation::RelativePath(path) => { - let url = base_url.join_directory(path).unwrap(); - Dependency { - alias: dependency.alias.clone(), - arguments: dependency.arguments.clone(), - location: DependencyLocation::Local(LocalFiles { - path: path.clone(), - url, - }), - } - } - DependencyEntryLocation::Remote(remote) => Dependency { - alias: dependency.alias.clone(), - arguments: dependency.arguments.clone(), - location: DependencyLocation::Remote(remote.clone()), - }, - DependencyEntryLocation::WorkspaceCurrent => Dependency { - alias: dependency.alias.clone(), - arguments: dependency.arguments.clone(), - location: DependencyLocation::WorkspaceCurrent, - }, - }) - .collect() - } - - pub fn formatted_diagnostics(&self) -> Option { - if self.diagnostics.is_empty() { - None - } else { - Some( - self.diagnostics - .iter() - .map(|diag| format!(" {diag}")) - .collect::>() - .join("\n"), - ) - } - } -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum ConfigDiagnostic { - MissingIngotMetadata, - MissingName, - MissingVersion, - InvalidName(SmolStr), - InvalidVersion(SmolStr), - MissingWorkspaceMembers, - InvalidWorkspaceMember(SmolStr), - InvalidWorkspaceDevMember(SmolStr), - InvalidWorkspaceDefaultMember(SmolStr), - InvalidWorkspaceExclude(SmolStr), - InvalidWorkspaceMemberName(SmolStr), - InvalidWorkspaceMemberVersion(SmolStr), - InvalidWorkspaceVersion(SmolStr), - MissingWorkspaceSection, - MissingWorkspaceMemberPath, - ConflictingWorkspaceMembersSpec, - InvalidDependencyAlias(SmolStr), - InvalidDependencyName(SmolStr), - InvalidDependencyVersion(SmolStr), - MissingDependencyPath { - alias: SmolStr, - description: String, - }, - MissingDependencySource { - alias: SmolStr, - }, - MissingDependencyRev { - alias: SmolStr, - }, - InvalidDependencySource { - alias: SmolStr, - value: SmolStr, - }, - UnexpectedTomlData { - field: SmolStr, - found: SmolStr, - expected: Option, - }, -} - -impl Display for ConfigDiagnostic { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - Self::MissingIngotMetadata => write!(f, "Missing ingot metadata"), - Self::MissingName => write!(f, "Missing ingot name"), - Self::MissingVersion => write!(f, "Missing ingot version"), - Self::InvalidName(name) => write!(f, "Invalid ingot name \"{name}\""), - Self::InvalidVersion(version) => write!(f, "Invalid ingot version \"{version}\""), - Self::MissingWorkspaceMembers => write!(f, "Missing workspace members"), - Self::InvalidWorkspaceMember(value) => { - write!(f, "Invalid workspace member entry \"{value}\"") - } - Self::InvalidWorkspaceDevMember(value) => { - write!(f, "Invalid workspace dev member entry \"{value}\"") - } - Self::InvalidWorkspaceDefaultMember(value) => { - write!(f, "Invalid workspace default member entry \"{value}\"") - } - Self::InvalidWorkspaceExclude(value) => { - write!(f, "Invalid workspace exclude entry \"{value}\"") - } - Self::InvalidWorkspaceMemberName(value) => { - write!(f, "Invalid workspace member name \"{value}\"") - } - Self::InvalidWorkspaceMemberVersion(value) => { - write!(f, "Invalid workspace member version \"{value}\"") - } - Self::InvalidWorkspaceVersion(value) => { - write!(f, "Invalid workspace version \"{value}\"") - } - Self::MissingWorkspaceSection => { - write!(f, "Workspace config is missing a [workspace] section") - } - Self::MissingWorkspaceMemberPath => write!(f, "Workspace member is missing a path"), - Self::ConflictingWorkspaceMembersSpec => { - write!(f, "Cannot mix flat and categorized workspace members") - } - Self::InvalidDependencyAlias(alias) => { - write!(f, "Invalid dependency alias \"{alias}\"") - } - Self::InvalidDependencyName(name) => { - write!(f, "Invalid dependency name \"{name}\"") - } - Self::InvalidDependencyVersion(version) => { - write!(f, "Invalid dependency version \"{version}\"") - } - Self::MissingDependencyPath { alias, description } => write!( - f, - "The dependency \"{alias}\" is missing a path argument \"{description}\"" - ), - Self::MissingDependencySource { alias } => { - write!(f, "The dependency \"{alias}\" is missing a source field") - } - Self::MissingDependencyRev { alias } => { - write!(f, "The dependency \"{alias}\" is missing a rev field") - } - Self::InvalidDependencySource { alias, value } => write!( - f, - "The dependency \"{alias}\" has an invalid source \"{value}\"" - ), - Self::UnexpectedTomlData { - field, - found, - expected, - } => { - if let Some(expected) = expected { - write!( - f, - "Expected a {expected} in field {field}, but found a {found}" - ) - } else { - write!(f, "Unexpected field {field}") - } - } - } - } -} - -pub(crate) fn is_valid_name_char(c: char) -> bool { - c.is_alphanumeric() || c == '_' -} - -pub(crate) fn is_valid_name(s: &str) -> bool { - s.chars().all(is_valid_name_char) -} - -pub(crate) fn parse_string_array_field( - parent: &str, - key: &str, - value: &Value, - diagnostics: &mut Vec, -) -> Vec { - match value { - Value::Array(entries) => { - let mut parsed = Vec::new(); - for entry in entries { - if let Some(value) = entry.as_str() { - parsed.push(SmolStr::new(value)); - } else { - diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: format_field_path(parent, key).into(), - found: entry.type_str().to_lowercase().into(), - expected: Some("string".into()), - }); - } - } - parsed - } - other => { - diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: format_field_path(parent, key).into(), - found: other.type_str().to_lowercase().into(), - expected: Some("array".into()), - }); - vec![] - } - } -} - -fn format_field_path(parent: &str, key: &str) -> String { - if parent.is_empty() { - key.to_string() - } else { - format!("{parent}.{key}") - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn parses_git_dependency_entry() { - let toml = r#" -[ingot] -name = "root" -version = "1.0.0" - -[dependencies] -remote = { source = "https://example.com/fe.git", rev = "abcd1234", path = "contracts" } -"#; - let config_file = Config::parse(toml).expect("config parses"); - let Config::Ingot(config) = config_file else { - panic!("expected ingot config"); - }; - assert!( - config.diagnostics.is_empty(), - "unexpected diagnostics: {:?}", - config.diagnostics - ); - let base = Url::parse("file:///workspace/root/").unwrap(); - let dependencies = config.dependencies(&base); - assert_eq!(dependencies.len(), 1); - match &dependencies[0].location { - DependencyLocation::Remote(remote) => { - assert_eq!(remote.source.as_str(), "https://example.com/fe.git"); - assert_eq!(remote.rev, "abcd1234"); - assert_eq!( - remote.path.as_ref().map(|path| path.as_str()), - Some("contracts") - ); - } - other => panic!("expected git dependency, found {other:?}"), - } - } - - #[test] - fn reports_diagnostics_for_incomplete_git_dependency() { - let toml = r#" -[ingot] -name = "root" -version = "1.0.0" - -[dependencies] -missing_rev = { source = "https://example.com/repo.git" } -invalid_source = { source = "not a url", rev = "1234" } -"#; - let config_file = Config::parse(toml).expect("config parses"); - let Config::Ingot(config) = config_file else { - panic!("expected ingot config"); - }; - assert!( - config - .diagnostics - .iter() - .any(|diag| matches!(diag, ConfigDiagnostic::MissingDependencyRev { .. })) - ); - assert!( - config - .diagnostics - .iter() - .any(|diag| matches!(diag, ConfigDiagnostic::InvalidDependencySource { .. })) - ); - } - - #[test] - fn parses_name_only_dependency() { - let toml = r#" -[ingot] -name = "root" -version = "1.0.0" - -[dependencies] -util = { name = "utils" } -"#; - let config_file = Config::parse(toml).expect("config parses"); - let Config::Ingot(config) = config_file else { - panic!("expected ingot config"); - }; - assert_eq!( - config - .dependencies(&Url::parse("file:///workspace/root/").unwrap()) - .len(), - 1 - ); - let dependency = &config.dependencies(&Url::parse("file:///workspace/root/").unwrap())[0]; - assert_eq!(dependency.arguments.name.as_deref(), Some("utils")); - assert!(matches!( - dependency.location, - DependencyLocation::WorkspaceCurrent - )); - } - - #[test] - fn parses_alias_only_dependency() { - let toml = r#" -[ingot] -name = "root" -version = "1.0.0" - -[dependencies] -util = true -"#; - let config_file = Config::parse(toml).expect("config parses"); - let Config::Ingot(config) = config_file else { - panic!("expected ingot config"); - }; - let dependency = &config.dependencies(&Url::parse("file:///workspace/root/").unwrap())[0]; - assert_eq!(dependency.arguments.name.as_deref(), Some("util")); - assert!(matches!( - dependency.location, - DependencyLocation::WorkspaceCurrent - )); - } - - #[test] - fn parses_alias_version_dependency() { - let toml = r#" -[ingot] -name = "root" -version = "1.0.0" - -[dependencies] -util = "0.1.0" -"#; - let config_file = Config::parse(toml).expect("config parses"); - let Config::Ingot(config) = config_file else { - panic!("expected ingot config"); - }; - let dependency = &config.dependencies(&Url::parse("file:///workspace/root/").unwrap())[0]; - assert_eq!(dependency.arguments.name.as_deref(), Some("util")); - assert_eq!( - dependency - .arguments - .version - .as_ref() - .map(|version| version.to_string()), - Some("0.1.0".to_string()) - ); - assert!(matches!( - dependency.location, - DependencyLocation::WorkspaceCurrent - )); - } -} diff --git a/crates/common/src/config/workspace.rs b/crates/common/src/config/workspace.rs deleted file mode 100644 index 4c39bccd55..0000000000 --- a/crates/common/src/config/workspace.rs +++ /dev/null @@ -1,497 +0,0 @@ -use smol_str::SmolStr; -use toml::Value; - -use crate::ingot::Version; - -use super::{ConfigDiagnostic, dependency, is_valid_name, parse_string_array_field}; - -#[derive(Debug, Clone, Default, PartialEq)] -pub struct WorkspaceSettings { - pub name: Option, - pub version: Option, - pub members: Vec, - pub dev_members: Vec, - pub default_members: Option>, - pub exclude: Vec, - pub metadata: Option, - pub profiles: Option, - pub scripts: Vec, - pub resolution: Option, - pub dependencies: Vec, -} - -impl Eq for WorkspaceSettings {} - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct WorkspaceScript { - pub name: SmolStr, - pub command: SmolStr, -} - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct WorkspaceMemberSpec { - pub path: SmolStr, - pub name: Option, - pub version: Option, -} - -#[derive(Debug, Clone, Default, PartialEq)] -pub struct WorkspaceResolution { - pub registry: Option, - pub source: Option, - pub lockfile: Option, - pub extra: toml::value::Table, -} - -impl Eq for WorkspaceResolution {} - -#[derive(Debug, Clone, Copy)] -pub enum WorkspaceMemberSelection { - All, - DefaultOnly, - PrimaryOnly, -} - -#[derive(Debug, Clone, PartialEq)] -pub struct WorkspaceConfig { - pub workspace: WorkspaceSettings, - pub diagnostics: Vec, -} - -impl WorkspaceSettings { - pub fn members_for_selection( - &self, - selection: WorkspaceMemberSelection, - ) -> Vec { - let mut members = match selection { - WorkspaceMemberSelection::PrimaryOnly => self.members.clone(), - WorkspaceMemberSelection::DefaultOnly => { - if let Some(defaults) = &self.default_members { - let mut combined = self.members.clone(); - combined.extend(self.dev_members.clone()); - combined - .into_iter() - .filter(|member| defaults.contains(&member.path)) - .collect() - } else { - self.members.clone() - } - } - WorkspaceMemberSelection::All => { - let mut combined = self.members.clone(); - combined.extend(self.dev_members.clone()); - combined - } - }; - members.sort_by(|a, b| { - a.path - .cmp(&b.path) - .then(a.name.cmp(&b.name)) - .then(a.version.cmp(&b.version)) - }); - members.dedup(); - members - } -} - -pub(crate) fn parse_workspace( - parsed: &Value, - diagnostics: &mut Vec, -) -> WorkspaceSettings { - let Some(table) = parsed.as_table() else { - return WorkspaceSettings::default(); - }; - - let mut workspace = WorkspaceSettings::default(); - - parse_identity(table, &mut workspace, diagnostics); - parse_members(table, &mut workspace, diagnostics); - parse_default_members(table, &mut workspace, diagnostics); - parse_exclude(table, &mut workspace, diagnostics); - parse_metadata(table, &mut workspace, diagnostics); - parse_profiles(table, &mut workspace, diagnostics); - parse_scripts(table, &mut workspace, diagnostics); - workspace.resolution = parse_resolution(table, diagnostics); - - workspace -} - -fn parse_identity( - table: &toml::value::Table, - workspace: &mut WorkspaceSettings, - diagnostics: &mut Vec, -) { - if let Some(name) = table.get("name") { - match name.as_str() { - Some(name) => workspace.name = Some(SmolStr::new(name)), - None => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "name".into(), - found: name.type_str().to_lowercase().into(), - expected: Some("string".into()), - }), - } - } - - if let Some(version) = table.get("version") { - match version.as_str() { - Some(version) => match version.parse() { - Ok(parsed) => workspace.version = Some(parsed), - Err(_) => { - diagnostics.push(ConfigDiagnostic::InvalidWorkspaceVersion(version.into())) - } - }, - None => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "version".into(), - found: version.type_str().to_lowercase().into(), - expected: Some("string".into()), - }), - } - } -} - -pub(crate) fn parse_workspace_config(parsed: &Value) -> Result { - let mut diagnostics = Vec::new(); - let has_workspace_section = parsed - .get("workspace") - .and_then(|value| value.as_table()) - .is_some(); - if !has_workspace_section && super::looks_like_workspace(parsed) { - diagnostics.push(ConfigDiagnostic::MissingWorkspaceSection); - } - let workspace_value = if let (Some(root), Some(workspace)) = ( - parsed.as_table(), - parsed.get("workspace").and_then(|value| value.as_table()), - ) { - let mut merged = root.clone(); - for (key, value) in workspace { - merged.insert(key.clone(), value.clone()); - } - Value::Table(merged) - } else { - parsed.clone() - }; - let mut workspace = parse_workspace(&workspace_value, &mut diagnostics); - - workspace.dependencies = dependency::parse_root_dependencies(parsed, &mut diagnostics); - - Ok(WorkspaceConfig { - workspace, - diagnostics, - }) -} - -fn parse_members( - table: &toml::value::Table, - workspace: &mut WorkspaceSettings, - diagnostics: &mut Vec, -) { - let Some(value) = table.get("members") else { - diagnostics.push(ConfigDiagnostic::MissingWorkspaceMembers); - return; - }; - - match value { - Value::Array(_entries) => { - workspace.members = parse_member_array_field("members", value, diagnostics); - } - Value::Table(member_table) => { - if let Some(main) = member_table.get("main") { - workspace.members = parse_member_array_field("members.main", main, diagnostics); - } else { - diagnostics.push(ConfigDiagnostic::MissingWorkspaceMembers); - } - if let Some(dev) = member_table.get("dev") { - workspace.dev_members = parse_member_array_field("members.dev", dev, diagnostics); - } - } - other => { - diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "members".into(), - found: other.type_str().to_lowercase().into(), - expected: Some("array".into()), - }); - } - } -} - -fn parse_default_members( - table: &toml::value::Table, - workspace: &mut WorkspaceSettings, - diagnostics: &mut Vec, -) { - let Some(value) = table.get("default-members") else { - return; - }; - - let defaults = parse_string_array_field("", "default-members", value, diagnostics); - workspace.default_members = Some(defaults); -} - -fn parse_exclude( - table: &toml::value::Table, - workspace: &mut WorkspaceSettings, - diagnostics: &mut Vec, -) { - let Some(value) = table.get("exclude") else { - return; - }; - workspace.exclude = parse_string_array_field("", "exclude", value, diagnostics); -} - -fn parse_member_array_field( - parent: &str, - value: &Value, - diagnostics: &mut Vec, -) -> Vec { - let Value::Array(entries) = value else { - diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: parent.into(), - found: value.type_str().to_lowercase().into(), - expected: Some("array".into()), - }); - return Vec::new(); - }; - - let mut parsed = Vec::new(); - for entry in entries { - match entry { - Value::String(value) => parsed.push(WorkspaceMemberSpec { - path: SmolStr::new(value), - name: None, - version: None, - }), - Value::Table(member_table) => { - let Some(path) = member_table.get("path").and_then(|value| value.as_str()) else { - diagnostics.push(ConfigDiagnostic::MissingWorkspaceMemberPath); - continue; - }; - let mut member = WorkspaceMemberSpec { - path: SmolStr::new(path), - name: None, - version: None, - }; - if let Some(name) = member_table.get("name").and_then(|value| value.as_str()) { - if is_valid_name(name) { - member.name = Some(SmolStr::new(name)); - } else { - diagnostics.push(ConfigDiagnostic::InvalidWorkspaceMemberName(name.into())); - } - } - if let Some(version) = member_table.get("version").and_then(|value| value.as_str()) - { - match version.parse() { - Ok(parsed) => member.version = Some(parsed), - Err(_) => diagnostics.push( - ConfigDiagnostic::InvalidWorkspaceMemberVersion(version.into()), - ), - } - } - parsed.push(member); - } - other => diagnostics.push(ConfigDiagnostic::InvalidWorkspaceMember( - other.to_string().into(), - )), - } - } - parsed -} - -fn parse_metadata( - table: &toml::value::Table, - workspace: &mut WorkspaceSettings, - diagnostics: &mut Vec, -) { - if let Some(value) = table.get("metadata") { - match value.as_table() { - Some(table) => workspace.metadata = Some(table.clone()), - None => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "metadata".into(), - found: value.type_str().to_lowercase().into(), - expected: Some("table".into()), - }), - } - } -} - -fn parse_profiles( - table: &toml::value::Table, - workspace: &mut WorkspaceSettings, - diagnostics: &mut Vec, -) { - if let Some(value) = table.get("profiles") { - match value.as_table() { - Some(table) => workspace.profiles = Some(table.clone()), - None => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "profiles".into(), - found: value.type_str().to_lowercase().into(), - expected: Some("table".into()), - }), - } - } -} - -fn parse_scripts( - table: &toml::value::Table, - workspace: &mut WorkspaceSettings, - diagnostics: &mut Vec, -) { - if let Some(value) = table.get("scripts") { - match value { - Value::Table(entries) => { - for (name, value) in entries { - match value.as_str() { - Some(command) => workspace.scripts.push(WorkspaceScript { - name: SmolStr::new(name), - command: SmolStr::new(command), - }), - None => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: format!("scripts.{name}").into(), - found: value.type_str().to_lowercase().into(), - expected: Some("string".into()), - }), - } - } - } - other => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "scripts".into(), - found: other.type_str().to_lowercase().into(), - expected: Some("table".into()), - }), - } - } -} - -fn parse_resolution( - table: &toml::value::Table, - diagnostics: &mut Vec, -) -> Option { - let value = table.get("resolution")?; - - let Value::Table(entries) = value else { - diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "resolution".into(), - found: value.type_str().to_lowercase().into(), - expected: Some("table".into()), - }); - return None; - }; - - let mut resolution = WorkspaceResolution::default(); - for (key, value) in entries { - match key.as_str() { - "registry" => match value.as_str() { - Some(registry) => resolution.registry = Some(registry.into()), - None => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "resolution.registry".into(), - found: value.type_str().to_lowercase().into(), - expected: Some("string".into()), - }), - }, - "source" => match value.as_str() { - Some(source) => resolution.source = Some(source.into()), - None => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "resolution.source".into(), - found: value.type_str().to_lowercase().into(), - expected: Some("string".into()), - }), - }, - "lockfile" => match value.as_bool() { - Some(lockfile) => resolution.lockfile = Some(lockfile), - None => diagnostics.push(ConfigDiagnostic::UnexpectedTomlData { - field: "resolution.lockfile".into(), - found: value.type_str().to_lowercase().into(), - expected: Some("boolean".into()), - }), - }, - _ => { - resolution.extra.insert(key.clone(), value.clone()); - } - } - } - - Some(resolution) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn parses_workspace_section_with_extras() { - let toml = r#" -name = "workspace-root" -version = "0.1.0" -members = { main = ["ingot-a", "ingot-b/**"], dev = ["examples/**"] } -default-members = ["ingot-a"] -exclude = ["target", "ignored/**"] - -[metadata] -docs = true - -[profiles.release] -opt-level = 3 - -[scripts] -fmt = "fe fmt" -ci = "fe check" - -[resolution] -registry = "local" -source = "https://example.com" -lockfile = false -other = "keep" - -[dependencies] -util = { path = "ingots/util" } -"#; - let config_file = crate::config::Config::parse(toml).expect("config parses"); - let crate::config::Config::Workspace(workspace_config) = config_file else { - panic!("expected workspace config"); - }; - let workspace = workspace_config.workspace; - assert_eq!(workspace.name.as_deref(), Some("workspace-root")); - assert_eq!( - workspace - .version - .as_ref() - .map(|version| version.to_string()), - Some("0.1.0".to_string()) - ); - assert_eq!( - workspace.members, - vec![ - WorkspaceMemberSpec { - path: "ingot-a".into(), - name: None, - version: None, - }, - WorkspaceMemberSpec { - path: "ingot-b/**".into(), - name: None, - version: None, - } - ] - ); - assert_eq!( - workspace.dev_members, - vec![WorkspaceMemberSpec { - path: "examples/**".into(), - name: None, - version: None, - }] - ); - assert_eq!( - workspace.default_members.unwrap(), - vec![SmolStr::new("ingot-a")] - ); - assert_eq!(workspace.exclude, vec!["target", "ignored/**"]); - assert!(workspace.metadata.is_some()); - assert!(workspace.profiles.is_some()); - assert_eq!(workspace.scripts.len(), 2); - let resolution = workspace.resolution.expect("resolution parsed"); - assert_eq!(resolution.registry.as_deref(), Some("local")); - assert_eq!(resolution.source.as_deref(), Some("https://example.com")); - assert_eq!(resolution.lockfile, Some(false)); - assert_eq!(workspace.dependencies.len(), 1); - } -} diff --git a/crates/common/src/dependencies/graph.rs b/crates/common/src/dependencies/graph.rs deleted file mode 100644 index b039b7eb27..0000000000 --- a/crates/common/src/dependencies/graph.rs +++ /dev/null @@ -1,366 +0,0 @@ -#![allow(clippy::too_many_arguments)] // salsa-generated input constructor takes multiple fields - -use std::collections::{HashMap, HashSet}; - -use petgraph::graph::{DiGraph, NodeIndex}; -use petgraph::visit::{Dfs, EdgeRef}; -use salsa::Setter; -use smol_str::SmolStr; -use url::Url; - -use super::{DependencyAlias, DependencyArguments, RemoteFiles, WorkspaceMemberRecord}; -use crate::{InputDb, ingot::Version}; - -type EdgeWeight = (DependencyAlias, DependencyArguments); - -#[salsa::input] -#[derive(Debug)] -pub struct DependencyGraph { - graph: DiGraph, - node_map: HashMap, - git_locations: HashMap, - reverse_git_map: HashMap, - ingots_by_metadata: HashMap<(SmolStr, Version), Url>, - workspace_members: HashMap>, - workspace_root_by_member: HashMap, - expected_member_metadata: HashMap, -} - -#[salsa::tracked] -impl DependencyGraph { - pub fn default(db: &dyn InputDb) -> Self { - DependencyGraph::new( - db, - DiGraph::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - ) - } - - fn allocate_node( - graph: &mut DiGraph, - node_map: &mut HashMap, - url: &Url, - ) -> NodeIndex { - if let Some(&idx) = node_map.get(url) { - idx - } else { - let idx = graph.add_node(url.clone()); - node_map.insert(url.clone(), idx); - idx - } - } - - pub fn ensure_node(&self, db: &mut dyn InputDb, url: &Url) { - if self.node_map(db).contains_key(url) { - return; - } - let mut graph = self.graph(db); - let mut node_map = self.node_map(db); - Self::allocate_node(&mut graph, &mut node_map, url); - self.set_graph(db).to(graph); - self.set_node_map(db).to(node_map); - } - - pub fn register_ingot_metadata( - &self, - db: &mut dyn InputDb, - url: &Url, - name: SmolStr, - version: Version, - ) { - let mut map = self.ingots_by_metadata(db); - map.entry((name, version)).or_insert_with(|| url.clone()); - self.set_ingots_by_metadata(db).to(map); - } - - pub fn ingot_by_name_version( - &self, - db: &dyn InputDb, - name: &SmolStr, - version: &Version, - ) -> Option { - self.ingots_by_metadata(db) - .get(&(name.clone(), version.clone())) - .cloned() - } - - pub fn register_workspace_member( - &self, - db: &mut dyn InputDb, - workspace_root: &Url, - member: WorkspaceMemberRecord, - ) { - let mut members = self.workspace_members(db); - let entry = members.entry(workspace_root.clone()).or_default(); - if let Some(existing) = entry.iter_mut().find(|record| record.url == member.url) { - *existing = member.clone(); - } else { - entry.push(member.clone()); - } - self.set_workspace_members(db).to(members); - - self.register_workspace_member_root(db, workspace_root, &member.url); - } - - pub fn register_workspace_member_root( - &self, - db: &mut dyn InputDb, - workspace_root: &Url, - member_url: &Url, - ) { - let mut roots = self.workspace_root_by_member(db); - roots.insert(member_url.clone(), workspace_root.clone()); - self.set_workspace_root_by_member(db).to(roots); - } - - pub fn workspace_member_records( - &self, - db: &dyn InputDb, - workspace_root: &Url, - ) -> Vec { - self.workspace_members(db) - .get(workspace_root) - .cloned() - .unwrap_or_default() - } - - pub fn workspace_roots(&self, db: &dyn InputDb) -> Vec { - self.workspace_members(db).keys().cloned().collect() - } - - /// Ensure the workspace root has an entry in the members map even when - /// it has zero named members (e.g. a workspace with only glob patterns - /// that match nothing yet). Without this the root would be invisible to - /// `workspace_roots()`. - pub fn ensure_workspace_root(&self, db: &mut dyn InputDb, workspace_root: &Url) { - let mut members = self.workspace_members(db); - if members.contains_key(workspace_root) { - return; - } - members.entry(workspace_root.clone()).or_default(); - self.set_workspace_members(db).to(members); - } - - pub fn workspace_members_by_name( - &self, - db: &dyn InputDb, - workspace_root: &Url, - name: &SmolStr, - ) -> Vec { - self.workspace_members(db) - .get(workspace_root) - .map(|members| { - members - .iter() - .filter(|member| member.name == *name) - .cloned() - .collect() - }) - .unwrap_or_default() - } - - pub fn workspace_root_for_member(&self, db: &dyn InputDb, url: &Url) -> Option { - self.workspace_root_by_member(db).get(url).cloned() - } - - pub fn register_expected_member_metadata( - &self, - db: &mut dyn InputDb, - url: &Url, - name: SmolStr, - version: Version, - ) { - let mut map = self.expected_member_metadata(db); - map.insert(url.clone(), (name, version)); - self.set_expected_member_metadata(db).to(map); - } - - pub fn expected_member_metadata_for( - &self, - db: &dyn InputDb, - url: &Url, - ) -> Option<(SmolStr, Version)> { - self.expected_member_metadata(db).get(url).cloned() - } - - pub fn contains_url(&self, db: &dyn InputDb, url: &Url) -> bool { - self.node_map(db).contains_key(url) - } - - pub fn add_dependency( - &self, - db: &mut dyn InputDb, - source: &Url, - target: &Url, - alias: DependencyAlias, - arguments: DependencyArguments, - ) { - let mut graph = self.graph(db); - let mut node_map = self.node_map(db); - let source_idx = Self::allocate_node(&mut graph, &mut node_map, source); - let target_idx = Self::allocate_node(&mut graph, &mut node_map, target); - - // Avoid duplicate edges when re-resolving (e.g. workspace re-init after - // a new member ingot appears). If an edge with the same alias already - // exists, update its arguments in case they changed. - let existing = graph - .edges(source_idx) - .find(|e| e.target() == target_idx && e.weight().0 == alias) - .map(|e| e.id()); - if let Some(edge_id) = existing { - if graph[edge_id].1 != arguments { - graph[edge_id] = (alias, arguments); - } - } else { - graph.add_edge(source_idx, target_idx, (alias, arguments)); - } - - self.set_graph(db).to(graph); - self.set_node_map(db).to(node_map); - } - - pub fn petgraph(&self, db: &dyn InputDb) -> DiGraph { - self.graph(db) - } - - pub fn cyclic_subgraph(&self, db: &dyn InputDb) -> DiGraph { - use petgraph::algo::tarjan_scc; - - let graph = self.graph(db); - let sccs = tarjan_scc(&graph); - - let mut cyclic_nodes = HashSet::new(); - for scc in sccs { - if scc.len() > 1 { - for node_idx in scc { - cyclic_nodes.insert(node_idx); - } - } - } - - if cyclic_nodes.is_empty() { - return DiGraph::new(); - } - - let mut nodes_to_include = cyclic_nodes.clone(); - let mut visited = HashSet::new(); - let mut queue: Vec = cyclic_nodes.iter().copied().collect(); - - while let Some(current) = queue.pop() { - if !visited.insert(current) { - continue; - } - nodes_to_include.insert(current); - - for pred in graph.node_indices() { - if graph.find_edge(pred, current).is_some() && !visited.contains(&pred) { - queue.push(pred); - } - } - } - - let mut subgraph = DiGraph::new(); - let mut node_map = HashMap::new(); - - for &node_idx in &nodes_to_include { - let url = &graph[node_idx]; - let new_idx = subgraph.add_node(url.clone()); - node_map.insert(node_idx, new_idx); - } - - for edge in graph.edge_references() { - if let (Some(&from_new), Some(&to_new)) = - (node_map.get(&edge.source()), node_map.get(&edge.target())) - { - subgraph.add_edge(from_new, to_new, edge.weight().clone()); - } - } - - subgraph - } - - pub fn dependency_urls(&self, db: &dyn InputDb, url: &Url) -> Vec { - let node_map = self.node_map(db); - let graph = self.graph(db); - - if let Some(&root) = node_map.get(url) { - let mut dfs = Dfs::new(&graph, root); - let mut visited = Vec::new(); - while let Some(node) = dfs.next(&graph) { - if node != root { - visited.push(graph[node].clone()); - } - } - visited - } else { - Vec::new() - } - } - - pub fn direct_dependencies(&self, db: &dyn InputDb, url: &Url) -> Vec<(DependencyAlias, Url)> { - let node_map = self.node_map(db); - let graph = self.graph(db); - - let Some(&root) = node_map.get(url) else { - return Vec::new(); - }; - - graph - .edges(root) - .map(|edge| { - let (alias, _arguments) = edge.weight(); - (alias.clone(), graph[edge.target()].clone()) - }) - .collect() - } - - pub fn register_remote_checkout( - &self, - db: &mut dyn InputDb, - local_url: Url, - remote: RemoteFiles, - ) { - let mut git_map = self.git_locations(db); - git_map.insert(local_url.clone(), remote.clone()); - self.set_git_locations(db).to(git_map); - - let mut reverse = self.reverse_git_map(db); - reverse.insert(remote, local_url); - self.set_reverse_git_map(db).to(reverse); - } - - pub fn remote_git_for_local(&self, db: &dyn InputDb, local_url: &Url) -> Option { - self.git_locations(db).get(local_url).cloned() - } - - pub fn local_for_remote_git(&self, db: &dyn InputDb, remote: &RemoteFiles) -> Option { - self.reverse_git_map(db).get(remote).cloned() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::define_input_db; - - define_input_db!(TestDatabase); - - #[test] - fn finds_ingot_by_metadata() { - let mut db = TestDatabase::default(); - let graph = DependencyGraph::default(&db); - - let url = Url::parse("file:///workspace/ingot/").unwrap(); - let version = Version::parse("0.1.0").unwrap(); - graph.register_ingot_metadata(&mut db, &url, "foo".into(), version.clone()); - - let found = graph.ingot_by_name_version(&db, &"foo".into(), &version); - assert_eq!(found, Some(url)); - } -} diff --git a/crates/common/src/dependencies/mod.rs b/crates/common/src/dependencies/mod.rs deleted file mode 100644 index 2aa4a28d08..0000000000 --- a/crates/common/src/dependencies/mod.rs +++ /dev/null @@ -1,73 +0,0 @@ -pub mod graph; -pub mod tree; - -use crate::ingot::Version; -use camino::Utf8PathBuf; -use smol_str::SmolStr; -use url::Url; - -#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] -pub struct DependencyArguments { - pub name: Option, - pub version: Option, -} - -pub type DependencyAlias = SmolStr; - -/// Metadata describing a git checkout on disk. This can later become an enum if -/// we support multiple remote transport mechanisms. -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub struct RemoteFiles { - pub source: Url, - pub rev: SmolStr, - pub path: Option, -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub struct LocalFiles { - pub path: Utf8PathBuf, - pub url: Url, -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub enum DependencyLocation { - Local(LocalFiles), - Remote(RemoteFiles), - WorkspaceCurrent, -} - -#[derive(Clone, Debug)] -pub struct Dependency { - pub alias: SmolStr, - pub location: DependencyLocation, - pub arguments: DependencyArguments, -} - -impl Dependency { - pub fn url(&self) -> &Url { - match &self.location { - DependencyLocation::Local(local) => &local.url, - DependencyLocation::Remote(remote) => &remote.source, - DependencyLocation::WorkspaceCurrent => panic!("workspace current has no URL"), - } - } -} - -#[derive(Clone, Debug)] -pub struct ExternalDependencyEdge { - pub parent: Url, - pub alias: SmolStr, - pub arguments: DependencyArguments, - pub remote: RemoteFiles, -} - -#[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub struct WorkspaceMemberRecord { - pub name: SmolStr, - pub version: Option, - pub path: Utf8PathBuf, - pub url: Url, -} - -pub use graph::DependencyGraph; -pub use tree::DependencyTree; diff --git a/crates/common/src/dependencies/tree.rs b/crates/common/src/dependencies/tree.rs deleted file mode 100644 index 32810e95b2..0000000000 --- a/crates/common/src/dependencies/tree.rs +++ /dev/null @@ -1,299 +0,0 @@ -use std::collections::{HashMap, HashSet}; - -use petgraph::graph::{DiGraph, NodeIndex}; -use petgraph::visit::EdgeRef; -use smol_str::SmolStr; -use url::Url; - -use super::{DependencyAlias, DependencyArguments}; -use crate::{ - InputDb, - color::{ColorTarget, should_colorize}, - config::{Config, IngotConfig}, - ingot::Version, -}; - -type TreeEdge = (DependencyAlias, DependencyArguments); - -pub struct DependencyTree { - root: Url, - graph: DiGraph, - configs: HashMap, - remote_edges: HashSet<(Url, Url)>, -} - -impl DependencyTree { - pub fn build(db: &dyn InputDb, root: &Url) -> Self { - let graph = db.dependency_graph().petgraph(db); - let configs = collect_configs(db, &graph); - let remote_edges = collect_remote_edges(db, &graph); - - Self::from_parts(graph, root.clone(), configs, remote_edges) - } - - pub fn from_parts( - graph: DiGraph, - root: Url, - configs: HashMap, - remote_edges: HashSet<(Url, Url)>, - ) -> Self { - Self { - root, - graph, - configs, - remote_edges, - } - } - - pub fn display(&self) -> String { - self.display_to(ColorTarget::Stdout) - } - - pub fn display_to(&self, target: ColorTarget) -> String { - display_tree( - &self.graph, - &self.root, - &self.configs, - &self.remote_edges, - should_colorize(target), - ) - } -} - -fn collect_configs(db: &dyn InputDb, graph: &DiGraph) -> HashMap { - let mut configs = HashMap::new(); - let mut workspace_versions: HashMap> = HashMap::new(); - for node_idx in graph.node_indices() { - let url = &graph[node_idx]; - if let Some(ingot) = db.workspace().containing_ingot(db, url.clone()) - && let Some(mut config) = ingot.config(db) - { - if config.metadata.version.is_none() - && let Some(workspace_url) = - db.dependency_graph().workspace_root_for_member(db, url) - { - let version = workspace_versions - .entry(workspace_url.clone()) - .or_insert_with(|| workspace_version(db, &workspace_url)); - if let Some(version) = version.clone() { - config.metadata.version = Some(version); - } - } - configs.insert(url.clone(), config); - } - } - configs -} - -fn workspace_version(db: &dyn InputDb, workspace_url: &Url) -> Option { - let config_url = workspace_url.join("fe.toml").ok()?; - let file = db.workspace().get(db, &config_url)?; - let parsed = Config::parse(file.text(db)).ok()?; - match parsed { - Config::Workspace(config) => config.workspace.version, - Config::Ingot(_) => None, - } -} - -fn collect_remote_edges(db: &dyn InputDb, graph: &DiGraph) -> HashSet<(Url, Url)> { - let mut edges = HashSet::new(); - for edge in graph.edge_references() { - let from = &graph[edge.source()]; - let to = &graph[edge.target()]; - let to_is_remote = db.dependency_graph().remote_git_for_local(db, to).is_some(); - if to_is_remote - && db - .dependency_graph() - .remote_git_for_local(db, from) - .is_none() - { - edges.insert((from.clone(), to.clone())); - } - } - edges -} - -#[derive(Clone)] -enum TreePrefix { - Root, - Fork(String), - Last(String), -} - -impl TreePrefix { - fn new_prefix(&self) -> String { - match self { - TreePrefix::Root => "".to_string(), - TreePrefix::Fork(p) => format!("{p}├── "), - TreePrefix::Last(p) => format!("{p}└── "), - } - } - - fn child_indent(&self) -> String { - match self { - TreePrefix::Root => "".to_string(), - TreePrefix::Fork(p) => format!("{p}│ "), - TreePrefix::Last(p) => format!("{p} "), - } - } -} - -fn display_tree( - graph: &DiGraph, - root_url: &Url, - configs: &HashMap, - remote_edges: &HashSet<(Url, Url)>, - colorize: bool, -) -> String { - let mut output = String::new(); - - let cycle_nodes = find_cycle_nodes(graph); - - if let Some(root_idx) = graph.node_indices().find(|i| graph[*i] == *root_url) { - let context = TreeContext { - graph, - configs, - cycle_nodes: &cycle_nodes, - remote_edges, - colorize, - }; - let mut seen = HashSet::new(); - print_node_with_alias( - &context, - root_idx, - TreePrefix::Root, - &mut output, - &mut seen, - None, - None, - ); - } else { - output.push_str("[error: root node not found]\n"); - } - - output -} - -struct TreeContext<'a> { - graph: &'a DiGraph, - configs: &'a HashMap, - cycle_nodes: &'a HashSet, - remote_edges: &'a HashSet<(Url, Url)>, - colorize: bool, -} - -fn print_node_with_alias( - context: &TreeContext, - node: NodeIndex, - prefix: TreePrefix, - output: &mut String, - seen: &mut HashSet, - alias: Option<&str>, - parent_url: Option<&Url>, -) { - let ingot_path = &context.graph[node]; - - // Build the label with alias support (no leading marker; remote marker is appended for local→remote edges) - let base_label = if let Some(config) = context.configs.get(ingot_path) { - let ingot_name = config.metadata.name.as_deref().unwrap_or("null"); - let version = config - .metadata - .version - .as_ref() - .map(ToString::to_string) - .unwrap_or_else(|| "null".to_string()); - - // Show "ingot_name as alias" if alias differs from ingot name - match alias { - Some(alias_str) if alias_str != ingot_name => { - format!("{ingot_name} as {alias_str} v{version}") - } - _ => format!("{ingot_name} v{version}"), - } - } else { - "[invalid fe.toml]".to_string() - }; - - let is_in_cycle = context.cycle_nodes.contains(&node); - let will_close_cycle = seen.contains(&node); - - let is_remote_edge = parent_url - .map(|parent| { - context - .remote_edges - .contains(&(parent.clone(), ingot_path.clone())) - }) - .unwrap_or(false); - - let mut label = base_label; - - if will_close_cycle { - label = format!("{label} [cycle]"); - } - - if is_remote_edge { - label = format!("{label} [remote]"); - } - - if is_in_cycle && context.colorize { - output.push_str(&format!("{}{}\n", prefix.new_prefix(), red(label))); - } else { - output.push_str(&format!("{}{}\n", prefix.new_prefix(), label)); - } - - if will_close_cycle { - return; - } - - seen.insert(node); - - // Process children with alias information from edges - let children: Vec<_> = context - .graph - .edges_directed(node, petgraph::Direction::Outgoing) - .collect(); - - for (i, edge) in children.iter().enumerate() { - let child_prefix = if i == children.len() - 1 { - TreePrefix::Last(prefix.child_indent()) - } else { - TreePrefix::Fork(prefix.child_indent()) - }; - - print_node_with_alias( - context, - edge.target(), - child_prefix, - output, - seen, - Some(&edge.weight().0), - Some(ingot_path), - ); - } - - seen.remove(&node); -} - -fn red(s: String) -> String { - format!("\x1b[31m{s}\x1b[0m") -} - -fn find_cycle_nodes(graph: &DiGraph) -> HashSet { - use petgraph::algo::kosaraju_scc; - - let mut cycles = HashSet::new(); - for scc in kosaraju_scc(graph) { - if scc.len() > 1 { - cycles.extend(scc); - } else { - let node = scc[0]; - if graph - .neighbors_directed(node, petgraph::Direction::Outgoing) - .any(|n| n == node) - { - cycles.insert(node); // self-loop - } - } - } - cycles -} diff --git a/crates/common/src/diagnostics.rs b/crates/common/src/diagnostics.rs deleted file mode 100644 index 49999b3ec2..0000000000 --- a/crates/common/src/diagnostics.rs +++ /dev/null @@ -1,214 +0,0 @@ -use std::fmt; - -use parser::TextRange; - -use crate::file::File; - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct CompleteDiagnostic { - pub severity: Severity, - pub message: String, - pub sub_diagnostics: Vec, - pub notes: Vec, - pub error_code: GlobalErrorCode, -} - -impl CompleteDiagnostic { - pub fn new( - severity: Severity, - message: String, - sub_diagnostics: Vec, - notes: Vec, - error_code: GlobalErrorCode, - ) -> Self { - Self { - severity, - message, - sub_diagnostics, - notes, - error_code, - } - } - - pub fn primary_span(&self) -> Option { - let span = self - .sub_diagnostics - .iter() - .find_map(|sub| sub.is_primary().then(|| sub.span.clone()).flatten()) - .or_else(|| self.sub_diagnostics.iter().find_map(|sub| sub.span.clone())); - - debug_assert!( - span.is_some(), - "spanless diagnostic ({}): {}", - self.error_code, - self.message - ); - - span - } -} - -pub fn cmp_complete_diagnostics( - lhs: &CompleteDiagnostic, - rhs: &CompleteDiagnostic, -) -> std::cmp::Ordering { - match lhs.error_code.cmp(&rhs.error_code) { - std::cmp::Ordering::Equal => { - let lhs_span = lhs.primary_span(); - let rhs_span = rhs.primary_span(); - match (lhs_span, rhs_span) { - (Some(lhs_span), Some(rhs_span)) => lhs_span.cmp(&rhs_span), - (Some(_), None) => std::cmp::Ordering::Less, - (None, Some(_)) => std::cmp::Ordering::Greater, - (None, None) => std::cmp::Ordering::Equal, - } - } - ord => ord, - } -} - -#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct GlobalErrorCode { - pub pass: DiagnosticPass, - pub local_code: u16, -} - -impl GlobalErrorCode { - pub fn new(pass: DiagnosticPass, local_code: u16) -> Self { - Self { pass, local_code } - } -} - -impl fmt::Display for GlobalErrorCode { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}-{:04}", self.pass.code(), self.local_code) - } -} - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct SubDiagnostic { - pub style: LabelStyle, - pub message: String, - pub span: Option, -} - -impl SubDiagnostic { - pub fn new(style: LabelStyle, message: String, span: Option) -> Self { - Self { - style, - message, - span, - } - } - - pub fn is_primary(&self) -> bool { - matches!(self.style, LabelStyle::Primary) - } -} - -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -pub enum LabelStyle { - Primary, - Secondary, -} - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct Span { - pub file: File, - pub range: TextRange, - pub kind: SpanKind, -} - -impl PartialOrd for Span { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Span { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - match self.file.cmp(&other.file) { - std::cmp::Ordering::Equal => self.range.start().cmp(&other.range.start()), - ord => ord, - } - } -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum SpanKind { - /// A node corresponding is originally written in the source code. - Original, - - /// A node corresponding to the span is generated by macro expansion. - Expanded, - - /// No span information was found. - /// This happens if analysis code tries to get a span for a node that is - /// generated in lowering phase. - /// - /// If span has this kind, it means there is a bug in the analysis code. - /// The reason not to panic is that LSP should continue working even if - /// there are bugs in the span generation(This also makes easier to identify - /// the cause of the bug) - /// - /// Range is always the first character of the file in this case. - NotFound, -} - -impl Span { - pub fn new(file: File, range: TextRange, kind: SpanKind) -> Self { - Self { file, range, kind } - } -} - -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] -pub enum Severity { - Error, - Warning, - Note, -} - -#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub enum DiagnosticPass { - Parse, - MsgLower, - EventLower, - - NameResolution, - - TypeDefinition, - TraitDefinition, - ImplTraitDefinition, - TraitSatisfaction, - MethodDefinition, - TyCheck, - - Mir, - - ExternalAnalysis(ExternalAnalysisKey), -} - -impl DiagnosticPass { - pub fn code(&self) -> u16 { - match self { - Self::Parse => 1, - Self::MsgLower => 9, - Self::EventLower => 10, - Self::NameResolution => 2, - Self::TypeDefinition => 3, - Self::TraitDefinition => 4, - Self::ImplTraitDefinition => 5, - Self::TraitSatisfaction => 6, - Self::MethodDefinition => 7, - Self::TyCheck => 8, - Self::Mir => 11, - - Self::ExternalAnalysis(_) => u16::MAX, - } - } -} - -#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] -pub struct ExternalAnalysisKey { - name: String, -} diff --git a/crates/common/src/file/mod.rs b/crates/common/src/file/mod.rs deleted file mode 100644 index 1c639e9d1e..0000000000 --- a/crates/common/src/file/mod.rs +++ /dev/null @@ -1,55 +0,0 @@ -pub mod workspace; - -use camino::Utf8PathBuf; -use url::Url; -pub use workspace::Workspace; - -use crate::{InputDb, ingot::Ingot}; - -#[salsa::input(constructor = __new_impl)] -#[derive(Debug)] -pub struct File { - #[return_ref] - pub text: String, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum IngotFileKind { - /// A source file containing Fe code. - Source, - - /// A configuration file for the ingot. - Config, -} - -#[salsa::tracked] -impl File { - #[salsa::tracked] - pub fn containing_ingot(self, db: &dyn InputDb) -> Option> { - self.url(db) - .and_then(|url| db.workspace().containing_ingot(db, url)) - } - - #[salsa::tracked(return_ref)] - pub fn path(self, db: &dyn InputDb) -> Option { - self.containing_ingot(db) - .and_then(|ingot| db.workspace().get_relative_path(db, ingot.base(db), self)) - } - - #[salsa::tracked] - pub fn kind(self, db: &dyn InputDb) -> Option { - self.path(db).as_ref().and_then(|path| { - if path.as_str().ends_with(".fe") { - Some(IngotFileKind::Source) - } else if path.as_str().ends_with("fe.toml") { - Some(IngotFileKind::Config) - } else { - None - } - }) - } - - pub fn url(self, db: &dyn InputDb) -> Option { - db.workspace().get_path(db, self) - } -} diff --git a/crates/common/src/file/workspace.rs b/crates/common/src/file/workspace.rs deleted file mode 100644 index ba0d688cae..0000000000 --- a/crates/common/src/file/workspace.rs +++ /dev/null @@ -1,172 +0,0 @@ -use camino::Utf8PathBuf; -use radix_immutable::{StringPrefixView, StringTrie, Trie}; -use salsa::Setter; -use url::Url; - -use crate::{InputDb, file::File, indexmap::IndexMap}; - -#[derive(Debug)] -pub enum InputIndexError { - CannotReuseInput, -} - -#[salsa::input] -#[derive(Debug)] -pub struct Workspace { - files: StringTrie, - paths: IndexMap, -} - -#[salsa::tracked] -impl Workspace { - pub fn default(db: &dyn InputDb) -> Self { - Workspace::new(db, Trie::new(), IndexMap::default()) - } - pub(crate) fn set( - &self, - db: &mut dyn InputDb, - url: Url, - file: File, - ) -> Result { - // Check if the file is already associated with another URL - let paths = self.paths(db); - if let Some(existing_url) = paths.get(&file) - && existing_url != &url - { - return Err(InputIndexError::CannotReuseInput); - } - - let files = self.files(db); - self.set_files(db).to(files.insert(url.clone(), file)); - let mut paths = self.paths(db); - paths.insert(file, url); - self.set_paths(db).to(paths); - Ok(file) - } - - pub fn get(&self, db: &dyn InputDb, url: &Url) -> Option { - self.files(db).get(url).cloned() - } - - pub fn remove(&self, db: &mut dyn InputDb, url: &Url) -> Option { - if let Some(_file) = self.files(db).get(url) { - let files = self.files(db); - if let (files, Some(file)) = files.remove(url) { - self.set_files(db).to(files); - let mut paths = self.paths(db); - paths.remove(&file); - Some(file) - } else { - None - } - } else { - None - } - } - - #[salsa::tracked] - pub fn items_at_base(self, db: &dyn InputDb, base: Url) -> StringPrefixView { - self.files(db).view_subtrie(base) - } - - pub fn get_path(&self, db: &dyn InputDb, file: File) -> Option { - self.paths(db).get(&file).cloned() - } - - #[salsa::tracked] - pub fn get_relative_path(self, db: &dyn InputDb, base: Url, file: File) -> Option { - // Get the file path - let file_url = match self.paths(db).get(&file) { - Some(url) => url.clone(), - None => return None, - }; - - // Get the relative path between the base URL and file URL - base.make_relative(&file_url).map(Utf8PathBuf::from) - } - - pub fn touch(&self, db: &mut dyn InputDb, url: Url, initial_content: Option) -> File { - // Check if the file already exists - if let Some(file) = self.get(db, &url) { - return file; - } - let initial = initial_content.unwrap_or_default(); - - let input_file = File::__new_impl(db, initial); - self.set(db, url, input_file) - .expect("Failed to create file") - } - - pub fn update(&self, db: &mut dyn InputDb, url: Url, content: String) -> File { - let file = self.touch(db, url, None); - file.set_text(db).to(content); - file - } - - pub fn all_files(&self, db: &dyn InputDb) -> StringTrie { - self.files(db) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - use crate::define_input_db; - - define_input_db!(TestDatabase); - - #[test] - fn test_input_index_basic() { - let mut db = TestDatabase::default(); - let index = db.workspace(); - - // Create a file and add it to the index - let file = File::__new_impl(&db, "test content".to_string()); - let url = Url::parse("file:///test.fe").unwrap(); - - index - .set(&mut db, url.clone(), file) - .expect("Failed to set file"); - - // Test we can look up the file - let retrieved_file = index.get(&db, &url); - assert!(retrieved_file.is_some()); - assert_eq!(retrieved_file.unwrap(), file); - - // Test removal - let removed_file = index.remove(&mut db, &url); - assert!(removed_file.is_some()); - assert_eq!(removed_file.unwrap(), file); - - // Verify it's gone - let retrieved_file = index.get(&db, &url); - assert!(retrieved_file.is_none()); - } - - #[test] - fn test_input_index_path() { - let mut db = TestDatabase::default(); - let index = db.workspace(); - - // Create a file and add it to the index - let file = File::__new_impl(&db, "test content".to_string()); - let url = Url::parse("file:///test.fe").unwrap(); - - index - .set(&mut db, url.clone(), file) - .expect("Failed to set file"); - - // Test we can look up the path - let path = index.get_path(&db, file); - assert!(path.is_some()); - assert_eq!(path.unwrap(), url); - - // Test we can look up a cloned file's path - #[allow(clippy::clone_on_copy)] - let cloned_file = file.clone(); - let path = index.get_path(&db, cloned_file); - assert!(path.is_some()); - assert_eq!(path.unwrap(), url); - } -} diff --git a/crates/common/src/indexmap.rs b/crates/common/src/indexmap.rs deleted file mode 100644 index 4bdb80b11d..0000000000 --- a/crates/common/src/indexmap.rs +++ /dev/null @@ -1,203 +0,0 @@ -use std::{ - hash::Hash, - ops::{Deref, DerefMut}, -}; - -use rustc_hash::FxBuildHasher; -use salsa::Update; - -type OrderMap = ordermap::OrderMap; -type OrderSet = ordermap::OrderSet; - -#[derive(Debug, Clone, Hash, PartialEq, Eq)] -pub struct IndexMap(OrderMap); - -impl IndexMap { - pub fn new() -> Self { - Self(OrderMap::default()) - } - - pub fn with_capacity(n: usize) -> Self { - Self(OrderMap::with_capacity_and_hasher(n, FxBuildHasher {})) - } -} - -impl Default for IndexMap { - fn default() -> Self { - Self::new() - } -} - -impl IntoIterator for IndexMap { - type Item = as IntoIterator>::Item; - type IntoIter = as IntoIterator>::IntoIter; - fn into_iter(self) -> Self::IntoIter { - self.0.into_iter() - } -} - -impl<'a, K, V> IntoIterator for &'a IndexMap { - type Item = <&'a OrderMap as IntoIterator>::Item; - type IntoIter = <&'a OrderMap as IntoIterator>::IntoIter; - fn into_iter(self) -> Self::IntoIter { - (&self.0).into_iter() - } -} - -impl<'a, K, V> IntoIterator for &'a mut IndexMap { - type Item = <&'a mut OrderMap as IntoIterator>::Item; - type IntoIter = <&'a mut OrderMap as IntoIterator>::IntoIter; - fn into_iter(self) -> Self::IntoIter { - (&mut self.0).into_iter() - } -} - -impl FromIterator<(K, V)> for IndexMap -where - K: Hash + Eq, -{ - fn from_iter>(iter: T) -> Self { - Self(OrderMap::from_iter(iter)) - } -} - -impl Deref for IndexMap { - type Target = OrderMap; - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl DerefMut for IndexMap { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} - -unsafe impl Update for IndexMap -where - K: Update + Eq + Hash, - V: Update, -{ - unsafe fn maybe_update(old_pointer: *mut Self, new_map: Self) -> bool { - unsafe { - let old_map = &mut *old_pointer; - - // Check if the keys in both maps are the same w.r.t the key order. - let is_key_same = old_map.len() == new_map.len() - && old_map - .keys() - .zip(new_map.keys()) - .all(|(old, new)| old == new); - - // If the keys are different, update entire map. - if !is_key_same { - old_map.clear(); - old_map.0.extend(new_map.0); - return true; - } - - // Update values if it's different. - let mut changed = false; - for (i, new_value) in new_map.0.into_values().enumerate() { - let old_value = &mut old_map[i]; - changed |= V::maybe_update(old_value, new_value); - } - - changed - } - } -} - -#[derive(Debug, Clone)] -pub struct IndexSet(OrderSet); - -impl IndexSet { - pub fn new() -> Self { - Self(OrderSet::default()) - } - - pub fn with_capacity(n: usize) -> Self { - Self(OrderSet::with_capacity_and_hasher(n, FxBuildHasher {})) - } -} - -impl Default for IndexSet { - fn default() -> Self { - Self::new() - } -} - -impl IntoIterator for IndexSet { - type Item = as IntoIterator>::Item; - type IntoIter = as IntoIterator>::IntoIter; - fn into_iter(self) -> Self::IntoIter { - self.0.into_iter() - } -} - -impl<'a, V> IntoIterator for &'a IndexSet { - type Item = <&'a OrderSet as IntoIterator>::Item; - type IntoIter = <&'a OrderSet as IntoIterator>::IntoIter; - fn into_iter(self) -> Self::IntoIter { - (&self.0).into_iter() - } -} - -impl PartialEq for IndexSet -where - V: Hash + Eq, -{ - fn eq(&self, other: &Self) -> bool { - self.0.eq(&other.0) - } -} - -impl Eq for IndexSet where V: Eq + Hash {} - -impl Hash for IndexSet -where - V: Hash + Eq, -{ - fn hash(&self, state: &mut H) { - self.0.hash(state); - } -} - -impl FromIterator for IndexSet -where - V: Hash + Eq, -{ - fn from_iter>(iter: T) -> Self { - Self(OrderSet::from_iter(iter)) - } -} - -impl Deref for IndexSet { - type Target = OrderSet; - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl DerefMut for IndexSet { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} - -unsafe impl Update for IndexSet -where - V: Update + Eq + Hash, -{ - unsafe fn maybe_update(old_pointer: *mut Self, new_set: Self) -> bool { - let old_set = unsafe { &mut *old_pointer }; - if old_set == &new_set { - false - } else { - old_set.clear(); - old_set.0.extend(new_set.0); - true - } - } -} diff --git a/crates/common/src/ingot.rs b/crates/common/src/ingot.rs deleted file mode 100644 index d4135ce428..0000000000 --- a/crates/common/src/ingot.rs +++ /dev/null @@ -1,593 +0,0 @@ -use core::panic; - -use camino::Utf8PathBuf; -pub use radix_immutable::StringPrefixView; -use smol_str::SmolStr; -use url::Url; - -use crate::{ - InputDb, - config::{Config, IngotConfig}, - dependencies::DependencyLocation, - file::{File, Workspace}, - stdlib::{BUILTIN_CORE_BASE_URL, BUILTIN_STD_BASE_URL}, - urlext::UrlExt, -}; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum IngotKind { - /// A standalone ingot is a dummy ingot when the compiler is invoked - /// directly on a file. - StandAlone, - - /// A local ingot which is the current ingot being compiled. - Local, - - /// An external ingot which is depended on by the current ingot. - External, - - /// Core library ingot. - Core, - - /// Standard library ingot. - Std, -} - -pub trait IngotBaseUrl { - fn touch( - &self, - db: &mut dyn InputDb, - path: Utf8PathBuf, - initial_content: Option, - ) -> File; - fn ingot<'db>(&self, db: &'db dyn InputDb) -> Option>; -} - -impl IngotBaseUrl for Url { - fn touch( - &self, - db: &mut dyn InputDb, - relative_path: Utf8PathBuf, - initial_content: Option, - ) -> File { - if relative_path.is_absolute() { - panic!("Expected relative path, got absolute path: {relative_path}"); - } - let path = self - .directory() - .expect("failed to parse directory") - .join(relative_path.as_str()) - .expect("failed to parse path"); - db.workspace().touch(db, path, initial_content) - } - fn ingot<'db>(&self, db: &'db dyn InputDb) -> Option> { - db.workspace().containing_ingot(db, self.clone()) - } -} - -#[salsa::interned] -#[derive(Debug)] -pub struct Ingot<'db> { - pub base: Url, - pub standalone_file: Option, - pub kind: IngotKind, -} - -#[derive(Debug)] -pub enum IngotError { - RootFileNotFound, -} - -#[salsa::tracked] -impl<'db> Ingot<'db> { - pub fn root_file(&self, db: &dyn InputDb) -> Result { - if let Some(root_file) = self.standalone_file(db) { - Ok(root_file) - } else { - let path = self - .base(db) - .join("src/lib.fe") - .expect("failed to join path"); - db.workspace() - .get(db, &path) - .ok_or(IngotError::RootFileNotFound) - } - } - - #[salsa::tracked] - pub fn files(self, db: &'db dyn InputDb) -> StringPrefixView { - if let Some(standalone_file) = self.standalone_file(db) { - // For standalone ingots, use the standalone file URL as the base - db.workspace().items_at_base( - db, - standalone_file - .url(db) - .expect("file should be registered in the index"), - ) - } else { - // For regular ingots, use the ingot base URL - db.workspace().items_at_base(db, self.base(db)) - } - } - - #[salsa::tracked] - pub fn config_file(self, db: &'db dyn InputDb) -> Option { - db.workspace().containing_ingot_config(db, self.base(db)) - } - - #[salsa::tracked] - fn parse_config(self, db: &'db dyn InputDb) -> Option> { - self.config_file(db) - .map(|config_file| Config::parse(config_file.text(db))) - .map(|result| { - result.and_then(|config_file| match config_file { - Config::Ingot(config) => Ok(config), - Config::Workspace(_) => { - Err("Expected an ingot config but found a workspace config".to_string()) - } - }) - }) - } - - #[salsa::tracked] - pub fn config(self, db: &'db dyn InputDb) -> Option { - self.parse_config(db).and_then(|result| result.ok()) - } - - #[salsa::tracked] - pub fn config_parse_error(self, db: &'db dyn InputDb) -> Option { - self.parse_config(db).and_then(|result| result.err()) - } - - #[salsa::tracked] - pub fn version(self, db: &'db dyn InputDb) -> Option { - self.config(db).and_then(|config| config.metadata.version) - } - - #[salsa::tracked] - pub fn dependencies(self, db: &'db dyn InputDb) -> Vec<(SmolStr, Url)> { - let kind = self.kind(db); - let base_url = self.base(db); - let skip_config = matches!((kind, base_url.scheme()), (IngotKind::Std, "builtin-std")); - - let mut deps = if skip_config { - Vec::new() - } else { - let graph_deps = db - .dependency_graph() - .direct_dependencies(db, &base_url) - .into_iter() - .collect::>(); - - if !graph_deps.is_empty() { - graph_deps - } else { - match self.config(db) { - Some(config) => config - .dependencies(&base_url) - .into_iter() - .filter_map(|dependency| { - let url = match &dependency.location { - DependencyLocation::Remote(remote) => db - .dependency_graph() - .local_for_remote_git(db, remote) - .unwrap_or_else(|| remote.source.clone()), - DependencyLocation::Local(local) => local.url.clone(), - DependencyLocation::WorkspaceCurrent => { - let name = dependency.arguments.name.clone()?; - let workspace_root = db - .dependency_graph() - .workspace_root_for_member(db, &base_url)?; - let candidates = db - .dependency_graph() - .workspace_members_by_name(db, &workspace_root, &name); - let selected = - if let Some(version) = &dependency.arguments.version { - candidates.iter().find(|member| { - member.version.as_ref() == Some(version) - }) - } else if candidates.len() == 1 { - candidates.first() - } else { - None - }; - let member = selected?; - member.url.clone() - } - }; - Some((dependency.alias.clone(), url)) - }) - .collect(), - None => vec![], - } - } - }; - - let workspace_member_url = |name: &str| -> Option { - let workspace_root = db - .dependency_graph() - .workspace_root_for_member(db, &base_url)?; - let name = SmolStr::new(name); - db.dependency_graph() - .workspace_members_by_name(db, &workspace_root, &name) - .first() - .map(|member| member.url.clone()) - }; - - let core_url = workspace_member_url("core").unwrap_or_else(|| { - Url::parse(BUILTIN_CORE_BASE_URL).expect("couldn't parse core ingot URL") - }); - let std_url = workspace_member_url("std").unwrap_or_else(|| { - Url::parse(BUILTIN_STD_BASE_URL).expect("couldn't parse std ingot URL") - }); - - if kind != IngotKind::Core && !deps.iter().any(|(alias, _)| alias == "core") { - deps.push(("core".into(), core_url)); - } - if !matches!(kind, IngotKind::Core | IngotKind::Std) - && !deps.iter().any(|(alias, _)| alias == "std") - { - deps.push(("std".into(), std_url)); - } - - deps - } -} - -pub type Version = serde_semver::semver::Version; - -#[salsa::tracked] -impl Workspace { - /// Recursively search for a local ingot configuration file - #[salsa::tracked] - pub fn containing_ingot_config(self, db: &dyn InputDb, file: Url) -> Option { - tracing::debug!(target: "ingot_config", "containing_ingot_config called with file: {}", file); - let dir = match file.directory() { - Some(d) => d, - None => { - tracing::debug!(target: "ingot_config", "Could not get directory for: {}", file); - return None; - } - }; - tracing::debug!(target: "ingot_config", "Search directory: {}", dir); - - let config_url = match dir.join("fe.toml") { - Ok(url) => url, - Err(_) => { - tracing::debug!(target: "ingot_config", "Could not join 'fe.toml' to dir: {}", dir); - return None; - } - }; - tracing::debug!(target: "ingot_config", "Looking for config file at: {}", config_url); - - if let Some(file_obj) = self.get(db, &config_url) { - tracing::debug!(target: "ingot_config", "Found config file in index: {}", config_url); - Some(file_obj) - } else { - tracing::debug!(target: "ingot_config", "Config file NOT found in index: {}. Checking parent.", config_url); - if let Some(parent_dir_url) = dir.parent() { - tracing::debug!(target: "ingot_config", "Recursively calling containing_ingot_config for parent: {}", parent_dir_url); - self.containing_ingot_config(db, parent_dir_url) - } else { - tracing::debug!(target: "ingot_config", "No parent directory for {}, stopping search.", dir); - None - } - } - } - - #[salsa::tracked] - pub fn containing_ingot(self, db: &dyn InputDb, location: Url) -> Option> { - // Try to find a config file to determine if this is part of a structured ingot - if let Some(config_file) = db.workspace().containing_ingot_config(db, location.clone()) { - // Extract base URL from config file location - let base_url = config_file - .url(db) - .expect("Config file should be indexed") - .directory() - .expect("Config URL should have a directory"); - - let mut kind = match base_url.scheme() { - "builtin-core" => IngotKind::Core, - "builtin-std" => IngotKind::Std, - _ => IngotKind::Local, - }; - if kind == IngotKind::Local - && let Ok(Config::Ingot(config)) = Config::parse(config_file.text(db)) - { - match config.metadata.name.as_deref() { - Some("core") => kind = IngotKind::Core, - Some("std") => kind = IngotKind::Std, - _ => {} - } - } - - // Check that the file is actually under the ingot's source tree. - // A file like `crates/language-server/test_files/goto.fe` shouldn't - // be claimed by a `fe.toml` at the repo root if it's not under `src/`. - let src_prefix = base_url - .join("src/") - .expect("failed to join src/ to base URL"); - let is_under_src = location.as_str().starts_with(src_prefix.as_str()); - let is_at_root = location - .directory() - .is_some_and(|dir| dir.as_str() == base_url.as_str()); - - if is_under_src || is_at_root { - return Some(Ingot::new(db, base_url.clone(), None, kind)); - } - - tracing::debug!( - "File {} is not under ingot src/ at {}; treating as standalone", - location, - base_url, - ); - } - - // Make a standalone ingot if no config is found (or config's ingot has no root) - let base = location.directory().unwrap_or_else(|| location.clone()); - let specific_root_file = if location.path().ends_with(".fe") { - db.workspace().get(db, &location) - } else { - None - }; - Some(Ingot::new( - db, - base, - specific_root_file, - IngotKind::StandAlone, - )) - } - - pub fn touch_ingot<'db>( - self, - db: &'db mut dyn InputDb, - base_url: &Url, - config_content: Option, - ) -> Option> { - let base_dir = base_url - .directory() - .expect("Base URL should have a directory"); - let config_file = base_dir - .join("fe.toml") - .expect("Config file should be indexed"); - let config = self.touch(db, config_file, config_content); - - config.containing_ingot(db) - } -} - -#[cfg(test)] -mod tests { - use crate::file::File; - - use super::*; - - use crate::define_input_db; - - define_input_db!(TestDatabase); - - #[test] - fn test_locate_config() { - let mut db = TestDatabase::default(); - let index = db.workspace(); - - // Create our test files - a library file, a config file, and a standalone file - let url_lib = Url::parse("file:///foo/src/lib.fe").unwrap(); - let lib = File::__new_impl(&db, "lib".to_string()); - - let url_config = Url::parse("file:///foo/fe.toml").unwrap(); - let config = File::__new_impl(&db, "config".to_string()); - - let url_standalone = Url::parse("file:///bar/standalone.fe").unwrap(); - let standalone = File::__new_impl(&db, "standalone".to_string()); - - // Add the files to the index - index - .set(&mut db, url_lib.clone(), lib) - .expect("Failed to set lib file"); - index - .set(&mut db, url_config.clone(), config) - .expect("Failed to set config file"); - index - .set(&mut db, url_standalone.clone(), standalone) - .expect("Failed to set standalone file"); - - // Test recursive search: lib.fe is in /foo/src/ but config is in /foo/ - // This tests that we correctly search up the directory tree - let found_config = index.containing_ingot_config(&db, url_lib); - assert!(found_config.is_some()); - assert_eq!(found_config.and_then(|c| c.url(&db)).unwrap(), url_config); - - // Test that standalone file without a config returns None - let no_config = index.containing_ingot_config(&db, url_standalone); - assert!(no_config.is_none()); - } - - #[test] - fn test_same_ingot_for_nested_paths() { - let mut db = TestDatabase::default(); - let index = db.workspace(); - - // Create an ingot structure - let url_config = Url::parse("file:///project/fe.toml").unwrap(); - let config = File::__new_impl(&db, "[ingot]\nname = \"test\"".to_string()); - - let url_lib = Url::parse("file:///project/src/lib.fe").unwrap(); - let lib = File::__new_impl(&db, "pub fn main() {}".to_string()); - - let url_mod = Url::parse("file:///project/src/module.fe").unwrap(); - let module = File::__new_impl(&db, "pub fn helper() {}".to_string()); - - let url_nested = Url::parse("file:///project/src/nested/deep.fe").unwrap(); - let nested = File::__new_impl(&db, "pub fn deep_fn() {}".to_string()); - - // Add all files to the index - index - .set(&mut db, url_config.clone(), config) - .expect("Failed to set config file"); - index - .set(&mut db, url_lib.clone(), lib) - .expect("Failed to set lib file"); - index - .set(&mut db, url_mod.clone(), module) - .expect("Failed to set module file"); - index - .set(&mut db, url_nested.clone(), nested) - .expect("Failed to set nested file"); - - // Get ingots for different files in the same project - let ingot_lib = index.containing_ingot(&db, url_lib); - let ingot_mod = index.containing_ingot(&db, url_mod); - let ingot_nested = index.containing_ingot(&db, url_nested); - - // All should return Some - assert!(ingot_lib.is_some()); - assert!(ingot_mod.is_some()); - assert!(ingot_nested.is_some()); - - let ingot_lib = ingot_lib.unwrap(); - let ingot_mod = ingot_mod.unwrap(); - let ingot_nested = ingot_nested.unwrap(); - - // Critical test: All files in the same logical ingot should return the SAME Salsa instance - // This ensures we don't have infinite loops due to different ingot IDs - assert_eq!( - ingot_lib, ingot_mod, - "lib.fe and module.fe should have the same ingot" - ); - assert_eq!( - ingot_lib, ingot_nested, - "lib.fe and nested/deep.fe should have the same ingot" - ); - assert_eq!( - ingot_mod, ingot_nested, - "module.fe and nested/deep.fe should have the same ingot" - ); - - // Verify they all have the same base URL - assert_eq!(ingot_lib.base(&db), ingot_mod.base(&db)); - assert_eq!(ingot_lib.base(&db), ingot_nested.base(&db)); - - let expected_base = Url::parse("file:///project/").unwrap(); - assert_eq!(ingot_lib.base(&db), expected_base); - } - - #[test] - fn test_ingot_files_updates_when_new_files_added() { - let mut db = TestDatabase::default(); - let index = db.workspace(); - - // Create initial files for an ingot - let config_url = Url::parse("file:///project/fe.toml").unwrap(); - let config_file = File::__new_impl(&db, "[ingot]\nname = \"test\"".to_string()); - - let lib_url = Url::parse("file:///project/src/lib.fe").unwrap(); - let lib_file = File::__new_impl(&db, "pub use S".to_string()); - - // Add initial files to the index - index - .set(&mut db, config_url.clone(), config_file) - .expect("Failed to set config file"); - index - .set(&mut db, lib_url.clone(), lib_file) - .expect("Failed to set lib file"); - - // Get the ingot and its initial files, then drop the reference - let initial_count = { - let ingot = index - .containing_ingot(&db, lib_url.clone()) - .expect("Should find ingot"); - let initial_files = ingot.files(&db); - initial_files.iter().count() - }; - - // Should have 2 files initially (config + lib) - assert_eq!(initial_count, 2, "Should have 2 initial files"); - - // Add a new source file to the same ingot - let mod_url = Url::parse("file:///project/src/module.fe").unwrap(); - let mod_file = File::__new_impl(&db, "pub struct NewStruct;".to_string()); - - index - .set(&mut db, mod_url.clone(), mod_file) - .expect("Failed to set module file"); - - // Get the updated files list - this tests that Salsa correctly invalidates - // and recomputes the files list when new files are added - let ingot = index - .containing_ingot(&db, lib_url.clone()) - .expect("Should find ingot"); - let updated_files = ingot.files(&db); - let updated_count = updated_files.iter().count(); - - // Should now have 3 files (config + lib + module) - assert_eq!(updated_count, 3, "Should have 3 files after adding module"); - - // Verify the new file is in the list - let file_urls: Vec = updated_files.iter().map(|(url, _)| url).collect(); - assert!( - file_urls.contains(&mod_url), - "New module file should be in the files list" - ); - assert!( - file_urls.contains(&lib_url), - "Original lib file should still be in the files list" - ); - assert!( - file_urls.contains(&config_url), - "Config file should still be in the files list" - ); - } - - #[test] - fn test_file_containing_ingot_establishes_dependency() { - let mut db = TestDatabase::default(); - let index = db.workspace(); - - // Create a regular ingot with config file - let config_url = Url::parse("file:///project/fe.toml").unwrap(); - let config_file = File::__new_impl(&db, "[ingot]\nname = \"test\"".to_string()); - - let main_url = Url::parse("file:///project/src/main.fe").unwrap(); - let main_file = File::__new_impl(&db, "use foo::*\npub use S".to_string()); - - index - .set(&mut db, config_url.clone(), config_file) - .expect("Failed to set config file"); - index - .set(&mut db, main_url.clone(), main_file) - .expect("Failed to set main file"); - - // Call containing_ingot, which should trigger the side effect of calling ingot.files() - let ingot_option = main_file.containing_ingot(&db); - assert!(ingot_option.is_some(), "Should find ingot for main file"); - - // Drop the ingot reference before mutating the database - let _ = ingot_option; - - // Add another file to the same ingot - let other_url = Url::parse("file:///project/src/other.fe").unwrap(); - let other_file = File::__new_impl(&db, "pub struct OtherStruct;".to_string()); - - index - .set(&mut db, other_url.clone(), other_file) - .expect("Failed to set other file"); - - // Get the ingot again and check that the dependency established by the containing_ingot - // call ensures the files list is correctly updated - let ingot = main_file.containing_ingot(&db).expect("Should find ingot"); - let files = ingot.files(&db); - let file_count = files.iter().count(); - - // Should have all files now (config + main + other) - assert_eq!(file_count, 3, "Should have 3 files in the ingot"); - - let file_urls: Vec = files.iter().map(|(url, _)| url).collect(); - assert!( - file_urls.contains(&config_url), - "Should contain config file" - ); - assert!(file_urls.contains(&main_url), "Should contain main file"); - assert!(file_urls.contains(&other_url), "Should contain other file"); - } -} diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs deleted file mode 100644 index 7182060d69..0000000000 --- a/crates/common/src/lib.rs +++ /dev/null @@ -1,102 +0,0 @@ -pub mod cache; -pub mod color; -pub mod config; -pub mod dependencies; -pub mod diagnostics; -pub mod file; -pub mod indexmap; -pub mod ingot; -pub mod paths; -pub mod stdlib; -pub mod urlext; - -use dependencies::DependencyGraph; -use file::Workspace; - -#[salsa::db] -// Each database must implement InputDb explicitly with its own storage mechanism -pub trait InputDb: salsa::Database { - fn workspace(&self) -> Workspace; - fn dependency_graph(&self) -> DependencyGraph; -} - -#[doc(hidden)] -pub use paste::paste; - -// Macro for implementing the InputDb trait for a Salsa database struct -// This assumes the database has a field named `index` of type `Option`. -#[macro_export] -macro_rules! impl_input_db { - ($db_type:ty) => { - #[salsa::db] - impl $crate::InputDb for $db_type { - fn workspace(&self) -> $crate::file::Workspace { - self.index.clone().expect("Workspace not initialized") - } - fn dependency_graph(&self) -> $crate::dependencies::DependencyGraph { - self.graph.clone().expect("Graph not initialized") - } - } - }; -} - -// Macro for implementing Default for a Salsa database with Workspace - -// This assumes the database has a field named `index` of type `Option`, -// and will initialize it properly. -#[macro_export] -macro_rules! impl_db_default { - ($db_type:ty) => { - impl Default for $db_type - where - $db_type: $crate::stdlib::HasBuiltinCore + $crate::stdlib::HasBuiltinStd, - { - fn default() -> Self { - let mut db = Self { - storage: salsa::Storage::default(), - index: None, - graph: None, - }; - let index = $crate::file::Workspace::default(&db); - db.index = Some(index); - let graph = $crate::dependencies::DependencyGraph::default(&db); - db.graph = Some(graph); - $crate::stdlib::HasBuiltinCore::initialize_builtin_core(&mut db); - $crate::stdlib::HasBuiltinStd::initialize_builtin_std(&mut db); - db - } - } - }; -} - -// Macro for creating a standard Salsa database with Workspace support -#[macro_export] -macro_rules! define_input_db { - ($db_name:ident) => { - #[derive(Clone)] - #[salsa::db] - pub struct $db_name { - storage: salsa::Storage, - index: Option<$crate::file::Workspace>, - graph: Option<$crate::dependencies::DependencyGraph>, - } - - #[salsa::db] - impl salsa::Database for $db_name { - fn salsa_event(&self, _event: &dyn Fn() -> salsa::Event) {} - } - - $crate::impl_input_db!($db_name); - $crate::impl_db_default!($db_name); - }; -} - -#[macro_export] -macro_rules! impl_db_traits { - ($db_type:ty, $($trait_name:ident),+ $(,)?) => { - #[salsa::db] - impl salsa::Database for $db_type { - fn salsa_event(&self, _event: &dyn Fn() -> salsa::Event) {} - } - }; -} diff --git a/crates/common/src/paths.rs b/crates/common/src/paths.rs deleted file mode 100644 index a9cc66d251..0000000000 --- a/crates/common/src/paths.rs +++ /dev/null @@ -1,162 +0,0 @@ -use camino::{Utf8Path, Utf8PathBuf}; -use std::io; -use std::path::{Path, PathBuf}; -use typed_path::{Utf8WindowsComponent, Utf8WindowsPath, Utf8WindowsPrefix}; -use url::Url; - -fn non_utf8_path_error(path: PathBuf) -> io::Error { - io::Error::new( - io::ErrorKind::InvalidData, - format!("path is not UTF-8: {}", path.display()), - ) -} - -pub fn normalize_slashes(raw: &str) -> String { - if !raw.contains('\\') { - return raw.to_string(); - } - - let mut normalized = String::with_capacity(raw.len()); - let mut needs_separator = false; - - for component in Utf8WindowsPath::new(raw).components() { - match component { - Utf8WindowsComponent::Prefix(prefix) => { - if needs_separator { - normalized.push('/'); - } - - let is_disk_prefix = matches!(prefix.kind(), Utf8WindowsPrefix::Disk(_)); - normalized.push_str(&normalize_windows_prefix(prefix.kind())); - needs_separator = !is_disk_prefix && !normalized.ends_with('/'); - } - Utf8WindowsComponent::RootDir => { - if !normalized.ends_with('/') { - normalized.push('/'); - } - needs_separator = false; - } - Utf8WindowsComponent::CurDir => { - if needs_separator { - normalized.push('/'); - } - normalized.push('.'); - needs_separator = true; - } - Utf8WindowsComponent::ParentDir => { - if needs_separator { - normalized.push('/'); - } - normalized.push_str(".."); - needs_separator = true; - } - Utf8WindowsComponent::Normal(component) => { - if needs_separator { - normalized.push('/'); - } - normalized.push_str(component); - needs_separator = true; - } - } - } - - normalized -} - -pub fn glob_pattern(path: &Path) -> String { - normalize_slashes(path.to_string_lossy().as_ref()) -} - -fn normalize_windows_prefix(prefix: Utf8WindowsPrefix<'_>) -> String { - match prefix { - Utf8WindowsPrefix::Verbatim(component) => format!("//?/{component}"), - Utf8WindowsPrefix::VerbatimUNC(server, share) => { - format!("//?/UNC/{server}/{share}") - } - Utf8WindowsPrefix::VerbatimDisk(drive) => format!("//?/{drive}:"), - Utf8WindowsPrefix::DeviceNS(device) => format!("//./{device}"), - Utf8WindowsPrefix::UNC(server, share) => format!("//{server}/{share}"), - Utf8WindowsPrefix::Disk(drive) => format!("{drive}:"), - } -} - -pub fn file_url_to_utf8_path(url: &Url) -> Option { - #[cfg(not(target_arch = "wasm32"))] - let path = url.to_file_path().ok()?; - #[cfg(target_arch = "wasm32")] - let path = { - if url.scheme() != "file" { - return None; - } - PathBuf::from(url.path()) - }; - Utf8PathBuf::from_path_buf(path).ok() -} - -pub fn canonicalize_utf8(path: &Path) -> io::Result { - let canonical = path.canonicalize()?; - Utf8PathBuf::from_path_buf(canonical).map_err(non_utf8_path_error) -} - -pub fn absolute_utf8(path: &Utf8Path) -> io::Result { - if path.is_absolute() { - return Ok(path.to_path_buf()); - } - - let cwd = std::env::current_dir()?; - let cwd = Utf8PathBuf::from_path_buf(cwd).map_err(non_utf8_path_error)?; - Ok(cwd.join(path)) -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn normalizes_slashes() { - assert_eq!(normalize_slashes(r"a\b\c"), "a/b/c"); - } - - #[test] - fn normalizes_disk_paths() { - assert_eq!(normalize_slashes(r"C:\a\b\c"), "C:/a/b/c"); - assert_eq!(normalize_slashes(r"C:a\b\c"), "C:a/b/c"); - } - - #[test] - fn normalizes_unc_paths() { - assert_eq!( - normalize_slashes(r"\\server\share\path\to\file"), - "//server/share/path/to/file" - ); - } - - #[test] - fn converts_file_urls_to_utf8_paths() { - let cwd = std::env::current_dir().expect("current dir"); - let url = Url::from_directory_path(&cwd).expect("directory url"); - let path = file_url_to_utf8_path(&url).expect("file url to path"); - assert_eq!(path, Utf8PathBuf::from_path_buf(cwd).unwrap()); - } - - #[test] - fn builds_glob_patterns_with_forward_slashes() { - let pattern = glob_pattern(Path::new(r"a\b\**\fe.toml")); - assert_eq!(pattern, "a/b/**/fe.toml"); - } - - #[test] - fn makes_relative_paths_absolute() { - let absolute = absolute_utf8(Utf8Path::new("src")).expect("absolute path"); - assert!(absolute.is_absolute()); - } - - #[test] - fn canonicalizes_paths_to_utf8() { - let cwd = std::env::current_dir().expect("current dir"); - let path = canonicalize_utf8(&cwd).expect("canonicalize"); - let expected = cwd.canonicalize().expect("canonicalize cwd"); - let expected = Utf8PathBuf::from_path_buf(expected).unwrap(); - assert_eq!(path, expected); - } -} diff --git a/crates/common/src/stdlib.rs b/crates/common/src/stdlib.rs deleted file mode 100644 index 66bdc95e79..0000000000 --- a/crates/common/src/stdlib.rs +++ /dev/null @@ -1,112 +0,0 @@ -use std::fs; - -use camino::{Utf8Path, Utf8PathBuf}; -use rust_embed::Embed; -use url::Url; - -use crate::{ - InputDb, - ingot::{Ingot, IngotBaseUrl}, -}; - -pub static BUILTIN_CORE_BASE_URL: &str = "builtin-core:///"; -pub static BUILTIN_STD_BASE_URL: &str = "builtin-std:///"; - -fn initialize_builtin(db: &mut dyn InputDb, base_url: &str) { - let base = Url::parse(base_url).unwrap(); - - for (path, contents) in E::iter().filter_map(|path| { - E::get(&path).map(|content| { - let contents = String::from_utf8(content.data.into_owned()).unwrap(); - (Utf8PathBuf::from(path.to_string()), contents) - }) - }) { - base.touch(db, path, contents.into()); - } -} - -fn load_library_dir(db: &mut dyn InputDb, base_url: &str, root: &Utf8Path) -> Result<(), String> { - let base = Url::parse(base_url).map_err(|_| "invalid base url".to_string())?; - let mut stack = vec![root.to_path_buf()]; - - while let Some(dir) = stack.pop() { - let entries = fs::read_dir(dir.as_std_path()) - .map_err(|err| format!("Failed to read {}: {err}", dir))?; - for entry in entries { - let entry = entry.map_err(|err| format!("Failed to read entry: {err}"))?; - let path = Utf8PathBuf::from_path_buf(entry.path()) - .map_err(|_| "Library path is not UTF-8".to_string())?; - let file_type = entry - .file_type() - .map_err(|err| format!("Failed to read file type: {err}"))?; - if file_type.is_dir() { - stack.push(path); - continue; - } - let relative = path - .strip_prefix(root) - .map_err(|_| "Library path escaped root".to_string())?; - let url = base - .join(relative.as_str()) - .map_err(|_| "Failed to join library path".to_string())?; - let content = fs::read_to_string(path.as_std_path()) - .map_err(|err| format!("Failed to read {}: {err}", path))?; - db.workspace().update(db, url, content); - } - } - - Ok(()) -} - -pub fn load_library_from_path(db: &mut dyn InputDb, library_root: &Utf8Path) -> Result<(), String> { - let core_root = library_root.join("core"); - let std_root = library_root.join("std"); - - load_library_dir(db, BUILTIN_CORE_BASE_URL, &core_root)?; - load_library_dir(db, BUILTIN_STD_BASE_URL, &std_root)?; - Ok(()) -} - -#[derive(Embed)] -#[folder = "../../ingots/core"] -pub struct Core; - -pub trait HasBuiltinCore: InputDb { - fn initialize_builtin_core(&mut self); - fn builtin_core(&self) -> Ingot<'_>; -} - -impl HasBuiltinCore for T { - fn initialize_builtin_core(&mut self) { - initialize_builtin::(self, BUILTIN_CORE_BASE_URL); - } - - fn builtin_core(&self) -> Ingot<'_> { - let core = self - .workspace() - .containing_ingot(self, Url::parse(BUILTIN_CORE_BASE_URL).unwrap()); - core.expect("Built-in core ingot failed to initialize") - } -} - -#[derive(Embed)] -#[folder = "../../ingots/std"] -pub struct Std; - -pub trait HasBuiltinStd: InputDb { - fn initialize_builtin_std(&mut self); - fn builtin_std(&self) -> Ingot<'_>; -} - -impl HasBuiltinStd for T { - fn initialize_builtin_std(&mut self) { - initialize_builtin::(self, BUILTIN_STD_BASE_URL); - } - - fn builtin_std(&self) -> Ingot<'_> { - let std = self - .workspace() - .containing_ingot(self, Url::parse(BUILTIN_STD_BASE_URL).unwrap()); - std.expect("Built-in std ingot failed to initialize") - } -} diff --git a/crates/common/src/urlext.rs b/crates/common/src/urlext.rs deleted file mode 100644 index eabaa986f3..0000000000 --- a/crates/common/src/urlext.rs +++ /dev/null @@ -1,145 +0,0 @@ -use camino::Utf8PathBuf; -use url::Url; - -#[derive(Debug)] -pub enum UrlExtError { - DirectoryRangeError, - AsDirectoryError, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum UrlError { - InvalidPath, - JoinError, - CanonicalizationError, -} - -pub trait UrlExt { - fn parent(&self) -> Option; - fn directory(&self) -> Option; - fn join_directory(&self, path: &Utf8PathBuf) -> Result; -} - -impl UrlExt for Url { - fn directory(&self) -> Option { - if self.cannot_be_a_base() { - return None; - }; - let mut url = self.clone(); - - if url.path().ends_with('/') { - return Some(url); - } - - if let Ok(mut segments) = url.path_segments_mut() { - segments.pop(); - segments.push(""); - } - - Some(url) - } - - fn parent(&self) -> Option { - let directory = self.directory()?; - - if *self != directory { - // If we're not already at a directory, return the directory - Some(directory) - } else if self.path() == "/" { - None - } else { - // We're already at a directory, go up one level - let mut parent = self.clone(); - if let Ok(mut segments) = parent.path_segments_mut() { - segments.pop(); - segments.pop(); - segments.push(""); // Ensure trailing slash - } - Some(parent) - } - } - - fn join_directory(&self, path: &Utf8PathBuf) -> Result { - Ok(if path.as_str().ends_with("/") { - self.join(path.as_str()).map_err(|_| UrlError::JoinError)? - } else { - let mut path = path.clone(); - path.push(""); - self.join(path.as_str()).map_err(|_| UrlError::JoinError)? - }) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_directory_basic() { - let url = Url::parse("https://example.com/foo/bar/baz").unwrap(); - let directory = url.directory(); - assert!(directory.is_some()); - assert_eq!(directory.unwrap().as_str(), "https://example.com/foo/bar/"); - - let url = Url::parse("https://example.com/foo/bar/baz/").unwrap(); - let directory = url.directory(); - assert!(directory.is_some()); - assert_eq!( - directory.unwrap().as_str(), - "https://example.com/foo/bar/baz/" - ); - } - - #[test] - fn test_parent_basic() { - let url = Url::parse("https://example.com/foo/bar").unwrap(); - let parent = url.parent(); - assert!(parent.is_some()); - assert_eq!(parent.unwrap().as_str(), "https://example.com/foo/"); - - let url = Url::parse("https://example.com/foo/").unwrap(); - let parent = url.parent(); - assert!(parent.is_some()); - assert_eq!(parent.unwrap().as_str(), "https://example.com/"); - - let url = Url::parse("https://example.com/").unwrap(); - let parent = url.parent(); - assert!( - parent.is_none(), - "Parent should be `None` but instead we got {parent:?}" - ); - } - - #[test] - fn test_file_url_parent_behavior() { - // Test file:// URL paths - let file_url = Url::parse("file:///foo/bar/baz.txt").unwrap(); - - // Test directory() behavior - let dir = file_url.directory(); - assert!(dir.is_some()); - assert_eq!(dir.unwrap().as_str(), "file:///foo/bar/"); - - // Test parent() behavior - from file to directory - let parent = file_url.parent(); - assert!(parent.is_some()); - assert_eq!(parent.unwrap().as_str(), "file:///foo/bar/"); - - // Test parent of directory - let dir_url = Url::parse("file:///foo/bar/").unwrap(); - let parent = dir_url.parent(); - assert!(parent.is_some()); - let parent_url = parent.unwrap(); - assert_eq!(parent_url.as_str(), "file:///foo/"); - - // Test parent of parent - let parent_of_parent = parent_url.parent(); - assert!(parent_of_parent.is_some()); - assert_eq!(parent_of_parent.unwrap().as_str(), "file:///"); - - // Test parent of root - let root_url = Url::parse("file:///").unwrap(); - let root_parent = root_url.parent(); - assert!(root_parent.is_none(), "Root URL should have no parent"); - } -} diff --git a/crates/contract-harness/Cargo.toml b/crates/contract-harness/Cargo.toml deleted file mode 100644 index 2da98e56c8..0000000000 --- a/crates/contract-harness/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "fe-contract-harness" -version = "26.0.0-alpha.7" -edition.workspace = true - -[dependencies] -driver = { path = "../driver", package = "fe-driver" } -codegen = { path = "../codegen", package = "fe-codegen" } -mir = { path = "../mir", package = "fe-mir" } -solc_runner = { path = "../solc-runner", package = "fe-solc-runner" } -common = { path = "../common", package = "fe-common" } -revm = { version = "33.1.0", default-features = false, features = ["std"] } -hex = "0.4" -url.workspace = true -ethers-core = "2" -thiserror = "1" -tracing.workspace = true - -[dev-dependencies] -serde_json = "1" diff --git a/crates/contract-harness/src/lib.rs b/crates/contract-harness/src/lib.rs deleted file mode 100644 index bdeb8091c7..0000000000 --- a/crates/contract-harness/src/lib.rs +++ /dev/null @@ -1,1627 +0,0 @@ -//! Test harness utilities for compiling Fe contracts and exercising their runtimes with `revm`. -use codegen::{Backend, SonatinaBackend, emit_module_yul}; -use common::InputDb; -use driver::DriverDataBase; -use ethers_core::abi::{AbiParser, ParseError as AbiParseError, Token}; -use hex::FromHex; -use mir::layout; -pub use revm::primitives::U256; -use revm::{ - InspectCommitEvm, - bytecode::Bytecode, - context::{ - Context, TxEnv, - result::{ExecutionResult, HaltReason, Output}, - }, - database::InMemoryDB, - handler::{ExecuteCommitEvm, MainBuilder, MainContext, MainnetContext, MainnetEvm}, - interpreter::interpreter_types::Jumps, - primitives::{Address, Bytes as EvmBytes, Log, TxKind}, - state::AccountInfo, -}; -use solc_runner::{ContractBytecode, YulcError, compile_single_contract}; -use std::{ - collections::{HashMap, VecDeque}, - fmt, - io::Write, - path::{Path, PathBuf}, -}; -use thiserror::Error; -use url::Url; - -/// Default in-memory file path used when compiling inline Fe sources. -const MEMORY_SOURCE_URL: &str = "file:///contract.fe"; - -/// Error type returned by the harness. -#[derive(Error)] -pub enum HarnessError { - #[error("fe compiler diagnostics:\n{0}")] - CompilerDiagnostics(String), - #[error("failed to emit Yul: {0}")] - EmitYul(#[from] codegen::EmitModuleError), - #[error("failed to emit Sonatina bytecode: {0}")] - EmitSonatina(String), - #[error("solc error: {0}")] - Solc(String), - #[error("abi encoding failed: {0}")] - Abi(#[from] ethers_core::abi::Error), - #[error("failed to parse function signature: {0}")] - AbiSignature(#[from] AbiParseError), - #[error("execution failed: {0}")] - Execution(String), - #[error("runtime reverted with data {0}")] - Revert(RevertData), - #[error("runtime halted: {reason:?} (gas_used={gas_used})")] - Halted { reason: HaltReason, gas_used: u64 }, - #[error("unexpected output variant from runtime")] - UnexpectedOutput, - #[error("invalid hex string: {0}")] - Hex(#[from] hex::FromHexError), - #[error("io error: {0}")] - Io(#[from] std::io::Error), -} - -impl fmt::Debug for HarnessError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt::Display::fmt(self, f) - } -} - -impl From for HarnessError { - fn from(value: YulcError) -> Self { - Self::Solc(value.0) - } -} - -/// Captures raw revert data and provides a nicer `Display` implementation. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct RevertData(pub Vec); - -impl fmt::Display for RevertData { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "0x{}", hex::encode(&self.0)) - } -} - -/// Options that control how the Fe source is compiled. -#[derive(Debug, Clone)] -pub struct CompileOptions { - /// Toggle solc optimizer. - pub optimize: bool, - /// Verify that solc produced runtime bytecode. - pub verify_runtime: bool, -} - -impl Default for CompileOptions { - fn default() -> Self { - Self { - optimize: false, - verify_runtime: true, - } - } -} - -/// Options that control the execution context fed into `revm`. -#[derive(Debug, Clone, Copy)] -pub struct ExecutionOptions { - pub caller: Address, - pub gas_limit: u64, - pub gas_price: u128, - pub value: U256, - /// Optional transaction nonce; when absent the harness uses the caller's - /// current nonce from the in-memory database. - pub nonce: Option, -} - -/// Optional tracing settings for a runtime call. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct EvmTraceOptions { - /// Number of trailing EVM steps to keep in the ring buffer. - pub keep_steps: usize, - /// Number of stack values to render for each traced step. - pub stack_n: usize, - /// Optional output file for trace text. When absent, tracing only goes to stderr. - pub out_path: Option, - /// Whether to mirror trace output to stderr. - pub write_stderr: bool, -} - -impl Default for EvmTraceOptions { - fn default() -> Self { - Self { - keep_steps: 200, - stack_n: 0, - out_path: None, - write_stderr: true, - } - } -} - -impl Default for ExecutionOptions { - fn default() -> Self { - Self { - caller: Address::ZERO, - gas_limit: 10_000_000, - gas_price: 0, - value: U256::ZERO, - nonce: None, - } - } -} - -/// Output returned from executing contract runtime bytecode. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct CallResult { - pub return_data: Vec, - pub gas_used: u64, -} - -/// Output returned from executing contract runtime bytecode along with logs. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct CallResultWithLogs { - pub result: CallResult, - pub logs: Vec, -} - -/// Per-call gas attribution gathered from a full instruction trace replay. -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] -pub struct CallGasProfile { - /// Number of EVM instructions executed. - pub step_count: u64, - /// Sum of per-step gas deltas on the root runtime frame. - pub total_step_gas: u64, - /// Root-frame gas attributed to CREATE opcode steps (`0xF0`). - pub create_opcode_gas: u64, - /// Root-frame gas attributed to CREATE2 opcode steps (`0xF5`). - pub create2_opcode_gas: u64, - /// Root-frame gas attributed to all non-CREATE/CREATE2 opcode steps. - pub non_create_opcode_gas: u64, - /// Number of CREATE opcode steps (`0xF0`). - pub create_opcode_steps: u64, - /// Number of CREATE2 opcode steps (`0xF5`). - pub create2_opcode_steps: u64, - /// Gas reported by CREATE frame outcomes (constructor execution envelope). - pub constructor_frame_gas: u64, - /// Root-frame gas outside constructor execution (`total_step_gas - constructor_frame_gas`). - pub non_constructor_frame_gas: u64, -} - -fn prepare_account( - runtime_bytecode_hex: &str, -) -> Result<(Bytecode, Address, InMemoryDB), HarnessError> { - let code = hex_to_bytes(runtime_bytecode_hex)?; - let bytecode = Bytecode::new_raw(EvmBytes::from(code)); - let address = Address::with_last_byte(0xff); - Ok((bytecode, address, InMemoryDB::default())) -} - -fn transact( - evm: &mut MainnetEvm>, - address: Address, - calldata: &[u8], - options: ExecutionOptions, - nonce: u64, - trace_options: Option<&EvmTraceOptions>, -) -> Result { - let outcome = transact_with_logs(evm, address, calldata, options, nonce, trace_options)?; - Ok(outcome.result) -} - -/// Executes a call transaction and returns the result plus formatted logs. -/// -/// * `evm` - Mutable EVM instance to execute against. -/// * `address` - Target contract address. -/// * `calldata` - ABI-encoded call data. -/// * `options` - Execution options (gas, caller, value). -/// * `nonce` - Transaction nonce to use. -/// -/// Returns the call result along with any logs emitted by the execution. -fn transact_with_logs( - evm: &mut MainnetEvm>, - address: Address, - calldata: &[u8], - options: ExecutionOptions, - nonce: u64, - trace_options: Option<&EvmTraceOptions>, -) -> Result { - let build_tx = || { - TxEnv::builder() - .caller(options.caller) - .gas_limit(options.gas_limit) - .gas_price(options.gas_price) - .to(address) - .value(options.value) - .data(EvmBytes::copy_from_slice(calldata)) - .nonce(nonce) - .build() - }; - - if let Some(trace_options) = trace_options { - trace_tx(evm, build_tx().expect("tx builder is valid"), trace_options); - } - - let tx = build_tx().map_err(|err| HarnessError::Execution(format!("{err:?}")))?; - - let result = evm - .transact_commit(tx) - .map_err(|err| HarnessError::Execution(err.to_string()))?; - match result { - ExecutionResult::Success { - output: Output::Call(bytes), - gas_used, - logs, - .. - } => Ok(CallResultWithLogs { - result: CallResult { - return_data: bytes.to_vec(), - gas_used, - }, - logs: format_logs(&logs), - }), - ExecutionResult::Success { - output: Output::Create(..), - .. - } => Err(HarnessError::UnexpectedOutput), - ExecutionResult::Revert { output, .. } => { - Err(HarnessError::Revert(RevertData(output.to_vec()))) - } - ExecutionResult::Halt { reason, gas_used } => { - Err(HarnessError::Halted { reason, gas_used }) - } - } -} - -fn trace_tx(evm: &MainnetEvm>, tx: TxEnv, options: &EvmTraceOptions) { - #[derive(Clone, Debug)] - struct Step { - pc: usize, - opcode: u8, - stack_len: usize, - gas_remaining: u64, - stack_top: Vec, - } - - #[derive(Clone, Debug)] - struct RingTrace { - keep: usize, - stack_n: usize, - steps: VecDeque, - total_steps: u64, - } - - impl RingTrace { - fn new(keep: usize, stack_n: usize) -> Self { - Self { - keep, - stack_n, - steps: VecDeque::with_capacity(keep), - total_steps: 0, - } - } - - fn push(&mut self, step: Step) { - self.total_steps += 1; - if self.steps.len() == self.keep { - self.steps.pop_front(); - } - self.steps.push_back(step); - } - - fn format(&self) -> String { - let mut out = String::new(); - out.push_str(&format!( - "TRACE (last {} of {} steps)\n", - self.steps.len(), - self.total_steps - )); - for s in &self.steps { - if self.stack_n > 0 { - out.push_str(&format!( - "pc={:04} op=0x{:02x} stack={} gas_rem={} top={}\n", - s.pc, - s.opcode, - s.stack_len, - s.gas_remaining, - s.stack_top.join(",") - )); - } else { - out.push_str(&format!( - "pc={:04} op=0x{:02x} stack={} gas_rem={}\n", - s.pc, s.opcode, s.stack_len, s.gas_remaining - )); - } - } - out - } - } - - impl revm::Inspector for RingTrace { - fn step(&mut self, interp: &mut revm::interpreter::Interpreter, _context: &mut CTX) { - let stack_top = if self.stack_n == 0 { - Vec::new() - } else { - interp - .stack - .data() - .iter() - .rev() - .take(self.stack_n) - .rev() - .map(|v| format!("{v:#x}")) - .collect() - }; - self.push(Step { - pc: interp.bytecode.pc(), - opcode: interp.bytecode.opcode(), - stack_len: interp.stack.len(), - gas_remaining: interp.gas.remaining(), - stack_top, - }); - } - } - - use revm::interpreter::interpreter_types::{Jumps, StackTr}; - - // Clone the EVM (including DB state) for tracing so we don't disturb the caller's state. - let ctx = evm.ctx.clone(); - let mut trace_evm = - ctx.build_mainnet_with_inspector(RingTrace::new(options.keep_steps, options.stack_n)); - - let result = trace_evm.inspect_tx_commit(tx); - let formatted = format!( - "{}\ntrace result: {result:?}\n", - trace_evm.inspector.format() - ); - if let Some(path) = &options.out_path { - match std::fs::OpenOptions::new() - .create(true) - .append(true) - .open(path) - .and_then(|mut f| f.write_all(formatted.as_bytes())) - { - Ok(()) => { - if options.write_stderr { - tracing::debug!("{formatted}"); - } - } - Err(err) => { - tracing::error!( - "EVM trace output: failed to write `{}`: {err}", - path.display() - ); - tracing::debug!("{formatted}"); - } - } - } else if options.write_stderr { - tracing::debug!("{formatted}"); - } -} - -// --------------------------------------------------------------------------- -// Call-trace inspector: captures CALL/CREATE events at contract boundaries -// --------------------------------------------------------------------------- - -/// Normalized address in a call trace (sequential ID, not raw address). -type AddrId = usize; - -/// A single event in a call trace. -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum CallTraceEvent { - Call { - target: AddrId, - calldata: Vec, - output: Vec, - success: bool, - }, - Create { - scheme: &'static str, - address: AddrId, - success: bool, - }, -} - -/// Address-normalized call trace from a single test execution. -#[derive(Debug, Clone, Default)] -pub struct CallTrace { - pub events: Vec, - addr_map: HashMap, -} - -impl CallTrace { - /// Replaces known addresses in a hex-encoded byte string with their `$N` IDs. - /// - /// EVM addresses are 20 bytes. In ABI-encoded return data, they appear as - /// 32-byte words with 12 zero bytes followed by the 20-byte address. - /// We scan for both raw 20-byte occurrences and zero-padded 32-byte words. - fn normalize_hex(hex_str: &str, addr_map: &HashMap) -> String { - if addr_map.is_empty() || hex_str.is_empty() { - return hex_str.to_string(); - } - - let mut result = hex_str.to_string(); - // Sort by longest hex representation first to avoid partial replacements - let mut entries: Vec<_> = addr_map.iter().collect(); - entries.sort_by(|a, b| b.0.to_string().len().cmp(&a.0.to_string().len())); - - for (addr, id) in entries { - let addr_hex = hex::encode(addr.as_slice()); // 40 hex chars - // Replace zero-padded 32-byte ABI word (24 zeros + 40 hex chars) - let padded = format!("000000000000000000000000{addr_hex}"); - result = result.replace(&padded, &format!("${id}")); - // Also replace bare 20-byte address - result = result.replace(&addr_hex, &format!("${id}")); - } - result - } -} - -impl fmt::Display for CallTrace { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - for event in &self.events { - match event { - CallTraceEvent::Call { - target, - calldata, - output, - success, - } => { - let status = if *success { "ok" } else { "revert" }; - let ret_hex = CallTrace::normalize_hex(&hex::encode(output), &self.addr_map); - let data_hex = CallTrace::normalize_hex(&hex::encode(calldata), &self.addr_map); - writeln!( - f, - "CALL ${target} data={data_hex} -> {status} ret={ret_hex}", - )?; - } - CallTraceEvent::Create { - scheme, - address, - success, - } => { - let status = if *success { "ok" } else { "fail" }; - writeln!(f, "{scheme} {status} -> ${address}")?; - } - } - } - Ok(()) - } -} - -/// Tracks whether we are inside a CALL or CREATE frame. -#[derive(Debug, Clone)] -enum PendingFrame { - Call { target: AddrId, calldata: Vec }, - Create { scheme: &'static str }, -} - -/// Inspector that records every CALL/CREATE at contract boundaries. -/// -/// Addresses are normalized to sequential IDs so that traces from different -/// backends (which produce different bytecode and therefore different -/// CREATE-derived addresses) can be compared directly. -#[derive(Debug)] -pub struct CallTracer { - addr_map: HashMap, - next_id: AddrId, - stack: Vec, - events: Vec, -} - -impl Default for CallTracer { - fn default() -> Self { - Self::new() - } -} - -impl CallTracer { - pub fn new() -> Self { - Self { - addr_map: HashMap::new(), - next_id: 0, - stack: Vec::new(), - events: Vec::new(), - } - } - - fn resolve_addr(&mut self, addr: Address) -> AddrId { - let next = self.next_id; - *self.addr_map.entry(addr).or_insert_with(|| { - self.next_id = next + 1; - next - }) - } - - fn assign_new_addr(&mut self, addr: Address) -> AddrId { - let id = self.next_id; - self.next_id += 1; - self.addr_map.insert(addr, id); - id - } - - pub fn into_trace(self) -> CallTrace { - CallTrace { - events: self.events, - addr_map: self.addr_map, - } - } -} - -impl - revm::Inspector for CallTracer -{ - fn call( - &mut self, - context: &mut CTX, - inputs: &mut revm::interpreter::CallInputs, - ) -> Option { - let target_id = self.resolve_addr(inputs.target_address); - let calldata = inputs.input.bytes(context).to_vec(); - self.stack.push(PendingFrame::Call { - target: target_id, - calldata, - }); - None - } - - fn call_end( - &mut self, - _context: &mut CTX, - _inputs: &revm::interpreter::CallInputs, - outcome: &mut revm::interpreter::CallOutcome, - ) { - let Some(frame) = self.stack.pop() else { - return; - }; - if let PendingFrame::Call { target, calldata } = frame { - self.events.push(CallTraceEvent::Call { - target, - calldata, - output: outcome.result.output.to_vec(), - success: outcome.result.result.is_ok(), - }); - } - } - - fn create( - &mut self, - _context: &mut CTX, - inputs: &mut revm::interpreter::CreateInputs, - ) -> Option { - let scheme = match inputs.scheme { - revm::context_interface::CreateScheme::Create => "CREATE", - revm::context_interface::CreateScheme::Create2 { .. } => "CREATE2", - revm::context_interface::CreateScheme::Custom { .. } => "CREATE_CUSTOM", - }; - self.stack.push(PendingFrame::Create { scheme }); - None - } - - fn create_end( - &mut self, - _context: &mut CTX, - _inputs: &revm::interpreter::CreateInputs, - outcome: &mut revm::interpreter::CreateOutcome, - ) { - let Some(frame) = self.stack.pop() else { - return; - }; - if let PendingFrame::Create { scheme } = frame { - let success = outcome.result.result.is_ok(); - let addr_id = if let Some(addr) = outcome.address { - self.assign_new_addr(addr) - } else { - // Failed create — assign a placeholder ID - let id = self.next_id; - self.next_id += 1; - id - }; - self.events.push(CallTraceEvent::Create { - scheme, - address: addr_id, - success, - }); - } - } -} - -/// Formats raw EVM logs into debug strings for display. -/// -/// * `logs` - Logs emitted by the EVM execution. -/// -/// Returns a vector of formatted log strings. -fn format_logs(logs: &[Log]) -> Vec { - logs.iter().map(|log| format!("{log:?}")).collect() -} - -/// Stateful runtime instance backed by a persistent in-memory database. -pub struct RuntimeInstance { - evm: MainnetEvm>, - address: Address, - next_nonce_by_caller: HashMap, - trace_options: Option, -} - -impl RuntimeInstance { - /// Instantiates a runtime instance from raw bytecode, inserting it into an `InMemoryDB`. - pub fn new(runtime_bytecode_hex: &str) -> Result { - let (bytecode, address, mut db) = prepare_account(runtime_bytecode_hex)?; - let code_hash = bytecode.hash_slow(); - db.insert_account_info( - address, - AccountInfo::new(U256::ZERO, 0, code_hash, bytecode), - ); - let ctx = Context::mainnet().with_db(db); - let evm = ctx.build_mainnet(); - Ok(Self { - evm, - address, - next_nonce_by_caller: HashMap::new(), - trace_options: None, - }) - } - - /// Deploys a contract by executing its init bytecode and using the returned runtime code. - /// This properly runs any initialization logic in the constructor. - pub fn deploy(init_bytecode_hex: &str) -> Result { - Self::deploy_tracked(init_bytecode_hex).map(|(instance, _)| instance) - } - - /// Deploys a contract and returns the runtime instance plus deployment gas. - pub fn deploy_tracked(init_bytecode_hex: &str) -> Result<(Self, u64), HarnessError> { - Self::deploy_with_constructor_args_tracked(init_bytecode_hex, &[]) - } - - /// Deploys a contract by executing its init bytecode with ABI-encoded constructor args. - pub fn deploy_with_constructor_args( - init_bytecode_hex: &str, - constructor_args: &[u8], - ) -> Result { - Self::deploy_with_constructor_args_tracked(init_bytecode_hex, constructor_args) - .map(|(instance, _)| instance) - } - - /// Deploys a contract with constructor args and returns deployment gas. - pub fn deploy_with_constructor_args_tracked( - init_bytecode_hex: &str, - constructor_args: &[u8], - ) -> Result<(Self, u64), HarnessError> { - let mut init_code = hex_to_bytes(init_bytecode_hex)?; - init_code.extend_from_slice(constructor_args); - let caller = Address::ZERO; - - let mut db = InMemoryDB::default(); - // Give the caller some balance for deployment - db.insert_account_info( - caller, - AccountInfo::new( - U256::from(1_000_000_000u64), - 0, - Default::default(), - Bytecode::default(), - ), - ); - - let ctx = Context::mainnet().with_db(db); - let mut evm = ctx.build_mainnet(); - - // Create deployment transaction (TxKind::Create means contract creation) - let tx = TxEnv::builder() - .caller(caller) - .gas_limit(10_000_000) - .gas_price(0) - .kind(TxKind::Create) - .data(EvmBytes::from(init_code)) - .nonce(0) - .build() - .map_err(|err| HarnessError::Execution(format!("{err:?}")))?; - - let result = evm - .transact_commit(tx) - .map_err(|err| HarnessError::Execution(err.to_string()))?; - - match result { - ExecutionResult::Success { - output: Output::Create(_, Some(deployed_address)), - gas_used, - .. - } => { - // The contract was deployed successfully; revm has already inserted the account - let mut next_nonce_by_caller = HashMap::new(); - next_nonce_by_caller.insert(caller, 1); - Ok(( - Self { - evm, - address: deployed_address, - next_nonce_by_caller, - trace_options: None, - }, - gas_used, - )) - } - ExecutionResult::Success { output, .. } => Err(HarnessError::Execution(format!( - "deployment returned unexpected output: {output:?}" - ))), - ExecutionResult::Revert { output, .. } => { - Err(HarnessError::Revert(RevertData(output.to_vec()))) - } - ExecutionResult::Halt { reason, gas_used } => { - Err(HarnessError::Halted { reason, gas_used }) - } - } - } - - fn effective_nonce(&mut self, options: ExecutionOptions) -> u64 { - if let Some(nonce) = options.nonce { - let entry = self.next_nonce_by_caller.entry(options.caller).or_insert(0); - *entry = (*entry).max(nonce + 1); - return nonce; - } - - let entry = self.next_nonce_by_caller.entry(options.caller).or_insert(0); - let current = *entry; - *entry += 1; - current - } - - /// Executes the runtime with arbitrary calldata. - pub fn call_raw( - &mut self, - calldata: &[u8], - options: ExecutionOptions, - ) -> Result { - let nonce = self.effective_nonce(options); - transact( - &mut self.evm, - self.address, - calldata, - options, - nonce, - self.trace_options.as_ref(), - ) - } - - /// Executes the runtime with arbitrary calldata, returning execution logs. - pub fn call_raw_with_logs( - &mut self, - calldata: &[u8], - options: ExecutionOptions, - ) -> Result { - let nonce = self.effective_nonce(options); - transact_with_logs( - &mut self.evm, - self.address, - calldata, - options, - nonce, - self.trace_options.as_ref(), - ) - } - - /// Executes the runtime at an arbitrary address using the same underlying EVM state. - pub fn call_raw_at( - &mut self, - address: Address, - calldata: &[u8], - options: ExecutionOptions, - ) -> Result { - let nonce = self.effective_nonce(options); - transact( - &mut self.evm, - address, - calldata, - options, - nonce, - self.trace_options.as_ref(), - ) - } - - /// Configures optional step-by-step EVM tracing for subsequent calls. - pub fn set_trace_options(&mut self, trace_options: Option) { - self.trace_options = trace_options; - } - - /// Executes a strongly-typed function call using ABI encoding. - pub fn call_function( - &mut self, - signature: &str, - args: &[Token], - options: ExecutionOptions, - ) -> Result { - let calldata = encode_function_call(signature, args)?; - self.call_raw(&calldata, options) - } - - /// Re-executes the last transaction on a **cloned** EVM context with the - /// `CallTracer` inspector attached, producing a normalized call trace. - /// - /// Uses `&self` because it clones the context — does not mutate real state. - pub fn call_raw_traced(&self, calldata: &[u8], options: ExecutionOptions) -> CallTrace { - let ctx = self.evm.ctx.clone(); - let mut tracer = CallTracer::new(); - let mut trace_evm = ctx.build_mainnet_with_inspector(&mut tracer); - - // Honor explicit nonce when set, otherwise use stored nonce for this caller. - let nonce = options.nonce.unwrap_or_else(|| { - self.next_nonce_by_caller - .get(&options.caller) - .copied() - .unwrap_or(0) - }); - - let tx = TxEnv::builder() - .caller(options.caller) - .gas_limit(options.gas_limit) - .gas_price(options.gas_price) - .to(self.address) - .value(options.value) - .data(EvmBytes::copy_from_slice(calldata)) - .nonce(nonce) - .build() - .expect("tx builder is valid"); - - let _ = trace_evm.inspect_tx_commit(tx); - tracer.into_trace() - } - - /// Re-executes the call on a cloned EVM context and returns total EVM steps. - /// - /// Uses `&self` because this is a read-only replay that does not mutate the - /// runtime state used by real executions. - pub fn call_raw_step_count(&self, calldata: &[u8], options: ExecutionOptions) -> u64 { - self.call_raw_gas_profile(calldata, options).step_count - } - - /// Re-executes the call on a cloned EVM context and returns full-step gas attribution. - /// - /// Uses `&self` because this is a read-only replay that does not mutate the - /// runtime state used by real executions. - pub fn call_raw_gas_profile( - &self, - calldata: &[u8], - options: ExecutionOptions, - ) -> CallGasProfile { - #[derive(Debug, Clone, Copy, PartialEq, Eq)] - enum InvocationKind { - Call, - Create, - } - - #[derive(Debug, Clone, Copy)] - struct PendingInvocation { - kind: InvocationKind, - started_interp: bool, - } - - #[derive(Debug, Clone, Copy)] - struct FrameState { - in_constructor: bool, - pending_gas_remaining: u64, - pending_opcode: u8, - } - - impl FrameState { - fn new(in_constructor: bool, gas_limit: u64) -> Self { - Self { - in_constructor, - pending_gas_remaining: gas_limit, - pending_opcode: 0, - } - } - } - - #[derive(Debug, Default)] - struct GasAttributionInspector { - frame_stack: Vec, - pending_invocations: Vec, - profile: CallGasProfile, - } - - impl GasAttributionInspector { - fn record_root_step_delta(&mut self, opcode: u8, delta: u64) { - self.profile.total_step_gas = self.profile.total_step_gas.saturating_add(delta); - match opcode { - 0xf0 => { - self.profile.create_opcode_steps += 1; - self.profile.create_opcode_gas = - self.profile.create_opcode_gas.saturating_add(delta); - } - 0xf5 => { - self.profile.create2_opcode_steps += 1; - self.profile.create2_opcode_gas = - self.profile.create2_opcode_gas.saturating_add(delta); - } - _ => {} - } - } - - fn complete_invocation(&mut self, kind: InvocationKind) -> Option { - self.pending_invocations - .iter() - .rposition(|invocation| invocation.kind == kind) - .map(|index| self.pending_invocations.remove(index)) - } - } - - impl revm::Inspector - for GasAttributionInspector - { - fn initialize_interp( - &mut self, - interp: &mut revm::interpreter::Interpreter, - _context: &mut CTX, - ) { - let in_constructor = if self.frame_stack.is_empty() { - false - } else { - let parent_in_constructor = self - .frame_stack - .last() - .map(|frame| frame.in_constructor) - .unwrap_or(false); - let child_kind = self - .pending_invocations - .iter_mut() - .rev() - .find(|invocation| !invocation.started_interp) - .map(|invocation| { - invocation.started_interp = true; - invocation.kind - }); - parent_in_constructor || matches!(child_kind, Some(InvocationKind::Create)) - }; - self.frame_stack - .push(FrameState::new(in_constructor, interp.gas.limit())); - } - - fn step( - &mut self, - interp: &mut revm::interpreter::Interpreter, - _context: &mut CTX, - ) { - if let Some(frame) = self.frame_stack.last_mut() { - frame.pending_gas_remaining = interp.gas.remaining(); - frame.pending_opcode = interp.bytecode.opcode(); - } - self.profile.step_count += 1; - } - - fn step_end( - &mut self, - interp: &mut revm::interpreter::Interpreter, - _context: &mut CTX, - ) { - let frame_depth = self.frame_stack.len(); - let Some(frame) = self.frame_stack.last_mut() else { - return; - }; - let remaining = interp.gas.remaining(); - let delta = frame.pending_gas_remaining.saturating_sub(remaining); - let opcode = frame.pending_opcode; - if frame_depth == 1 { - self.record_root_step_delta(opcode, delta); - } - } - - fn call( - &mut self, - _context: &mut CTX, - _inputs: &mut revm::interpreter::CallInputs, - ) -> Option { - self.pending_invocations.push(PendingInvocation { - kind: InvocationKind::Call, - started_interp: false, - }); - None - } - - fn call_end( - &mut self, - _context: &mut CTX, - _inputs: &revm::interpreter::CallInputs, - _outcome: &mut revm::interpreter::CallOutcome, - ) { - if let Some(invocation) = self.complete_invocation(InvocationKind::Call) - && invocation.started_interp - { - let _ = self.frame_stack.pop(); - } - } - - fn create( - &mut self, - _context: &mut CTX, - _inputs: &mut revm::interpreter::CreateInputs, - ) -> Option { - self.pending_invocations.push(PendingInvocation { - kind: InvocationKind::Create, - started_interp: false, - }); - None - } - - fn create_end( - &mut self, - _context: &mut CTX, - _inputs: &revm::interpreter::CreateInputs, - outcome: &mut revm::interpreter::CreateOutcome, - ) { - if let Some(invocation) = self.complete_invocation(InvocationKind::Create) - && invocation.started_interp - { - self.profile.constructor_frame_gas = self - .profile - .constructor_frame_gas - .saturating_add(outcome.result.gas.spent()); - let _ = self.frame_stack.pop(); - } - } - } - - let ctx = self.evm.ctx.clone(); - let mut inspector = GasAttributionInspector::default(); - let mut trace_evm = ctx.build_mainnet_with_inspector(&mut inspector); - - // Honor explicit nonce when set, otherwise use stored nonce for this caller. - let nonce = options.nonce.unwrap_or_else(|| { - self.next_nonce_by_caller - .get(&options.caller) - .copied() - .unwrap_or(0) - }); - - let tx = TxEnv::builder() - .caller(options.caller) - .gas_limit(options.gas_limit) - .gas_price(options.gas_price) - .to(self.address) - .value(options.value) - .data(EvmBytes::copy_from_slice(calldata)) - .nonce(nonce) - .build() - .expect("tx builder is valid"); - - let _ = trace_evm.inspect_tx_commit(tx); - let mut profile = trace_evm.inspector.profile; - let create_total = profile - .create_opcode_gas - .saturating_add(profile.create2_opcode_gas); - profile.non_create_opcode_gas = profile.total_step_gas.saturating_sub(create_total); - profile.non_constructor_frame_gas = profile - .total_step_gas - .saturating_sub(profile.constructor_frame_gas); - profile - } - - /// Returns the contract address assigned to this runtime instance. - pub fn address(&self) -> Address { - self.address - } -} - -/// Harness that compiles Fe source code and executes the resulting contract runtime. -pub struct FeContractHarness { - contract: ContractBytecode, -} - -impl FeContractHarness { - /// Convenience helper that uses default [`CompileOptions`]. - pub fn compile(contract_name: &str, source: &str) -> Result { - Self::compile_from_source(contract_name, source, CompileOptions::default()) - } - - /// Compiles the provided Fe source into bytecode for the specified contract. - pub fn compile_from_source( - contract_name: &str, - source: &str, - options: CompileOptions, - ) -> Result { - let mut db = DriverDataBase::default(); - let url = Url::parse(MEMORY_SOURCE_URL).expect("static URL is valid"); - db.workspace() - .touch(&mut db, url.clone(), Some(source.to_string())); - let file = db - .workspace() - .get(&db, &url) - .expect("file should exist in workspace"); - let top_mod = db.top_mod(file); - let diags = db.run_on_top_mod(top_mod); - if !diags.is_empty() { - return Err(HarnessError::CompilerDiagnostics(diags.format_diags(&db))); - } - let yul = emit_module_yul(&db, top_mod)?; - let contract = compile_single_contract( - contract_name, - &yul, - options.optimize, - options.verify_runtime, - )?; - Ok(Self { contract }) - } - - /// Reads a source file from disk and compiles the specified contract. - pub fn compile_from_file( - contract_name: &str, - path: impl AsRef, - options: CompileOptions, - ) -> Result { - let source = std::fs::read_to_string(path)?; - Self::compile_from_source(contract_name, &source, options) - } - - /// Returns the raw runtime bytecode emitted by `solc`. - pub fn runtime_bytecode(&self) -> &str { - &self.contract.runtime_bytecode - } - - /// Executes the compiled runtime with arbitrary calldata. - pub fn call_raw( - &self, - calldata: &[u8], - options: ExecutionOptions, - ) -> Result { - execute_runtime(&self.contract.runtime_bytecode, calldata, options) - } - - /// ABI-encodes the provided arguments and executes the runtime. - pub fn call_function( - &self, - signature: &str, - args: &[Token], - options: ExecutionOptions, - ) -> Result { - let calldata = encode_function_call(signature, args)?; - self.call_raw(&calldata, options) - } - - /// Creates a persistent runtime instance that can serve multiple calls. - pub fn deploy_instance(&self) -> Result { - RuntimeInstance::new(&self.contract.runtime_bytecode) - } - - /// Deploys a contract by running the init bytecode, initializing storage. - /// Use this when your contract has initialization logic (e.g., storage setup). - pub fn deploy_with_init(&self) -> Result { - RuntimeInstance::deploy(&self.contract.bytecode) - } - - /// Deploys a contract by running the init bytecode with ABI-encoded constructor args. - pub fn deploy_with_init_args( - &self, - constructor_args: &[Token], - ) -> Result { - let args = ethers_core::abi::encode(constructor_args); - RuntimeInstance::deploy_with_constructor_args(&self.contract.bytecode, &args) - } - - /// Returns the raw init bytecode emitted by `solc`. - pub fn init_bytecode(&self) -> &str { - &self.contract.bytecode - } -} - -/// Compiles the provided Fe source to Sonatina-generated runtime bytecode (hex-encoded). -pub fn compile_runtime_sonatina_from_source(source: &str) -> Result { - let mut db = DriverDataBase::default(); - let url = Url::parse(MEMORY_SOURCE_URL).expect("static URL is valid"); - db.workspace() - .touch(&mut db, url.clone(), Some(source.to_string())); - let file = db - .workspace() - .get(&db, &url) - .expect("file should exist in workspace"); - let top_mod = db.top_mod(file); - let diags = db.run_on_top_mod(top_mod); - if !diags.is_empty() { - return Err(HarnessError::CompilerDiagnostics(diags.format_diags(&db))); - } - - let output = SonatinaBackend - .compile( - &db, - top_mod, - layout::EVM_LAYOUT, - codegen::OptLevel::default(), - ) - .map_err(|err| HarnessError::EmitSonatina(err.to_string()))?; - let bytes = output - .as_bytecode() - .ok_or_else(|| HarnessError::EmitSonatina("backend returned non-bytecode output".into()))?; - Ok(hex::encode(bytes)) -} - -/// ABI-encodes a function call according to the provided signature. -pub fn encode_function_call(signature: &str, args: &[Token]) -> Result, HarnessError> { - let function = AbiParser::default().parse_function(signature)?; - let encoded = function.encode_input(args)?; - Ok(encoded) -} - -/// Executes the provided runtime bytecode within `revm`. -pub fn execute_runtime( - runtime_bytecode_hex: &str, - calldata: &[u8], - options: ExecutionOptions, -) -> Result { - let mut instance = RuntimeInstance::new(runtime_bytecode_hex)?; - instance.call_raw(calldata, options) -} - -/// Parses a hex string (with or without `0x` prefix) into raw bytes. -pub fn hex_to_bytes(hex: &str) -> Result, HarnessError> { - let trimmed = hex.trim().strip_prefix("0x").unwrap_or(hex.trim()); - Vec::from_hex(trimmed).map_err(HarnessError::Hex) -} - -/// Interprets exactly 32 return bytes as a big-endian `U256`. -pub fn bytes_to_u256(bytes: &[u8]) -> Result { - if bytes.len() != 32 { - return Err(HarnessError::Execution(format!( - "expected 32 bytes of return data, found {}", - bytes.len() - ))); - } - let mut buf = [0u8; 32]; - buf.copy_from_slice(bytes); - Ok(U256::from_be_bytes(buf)) -} - -#[cfg(test)] -#[allow(clippy::print_stderr)] -mod tests { - use super::*; - use ethers_core::{abi::Token, types::U256 as AbiU256}; - use std::process::Command; - - fn solc_available() -> bool { - let solc_path = std::env::var("FE_SOLC_PATH").unwrap_or_else(|_| "solc".to_string()); - Command::new(solc_path) - .arg("--version") - .status() - .map(|status| status.success()) - .unwrap_or(false) - } - - #[test] - fn harness_error_debug_is_human_readable() { - let err = HarnessError::Solc("DeclarationError: missing".to_string()); - let dbg = format!("{err:?}"); - assert!(dbg.starts_with("solc error: DeclarationError:")); - assert!(!dbg.contains("Solc(\"")); - } - - #[test] - fn runtime_instance_persists_state() { - if !solc_available() { - eprintln!("skipping runtime_instance_persists_state because solc is missing"); - return; - } - let yul = r#" -object "Counter" { - code { - datacopy(0, dataoffset("runtime"), datasize("runtime")) - return(0, datasize("runtime")) - } - object "runtime" { - code { - let current := sload(0) - let next := add(current, 1) - sstore(0, next) - mstore(0x00, next) - return(0x00, 0x20) - } - } -} -"#; - let contract = - compile_single_contract("Counter", yul, false, true).expect("yul compilation succeeds"); - let mut instance = - RuntimeInstance::new(&contract.runtime_bytecode).expect("runtime instantiation"); - let options = ExecutionOptions::default(); - let first = instance - .call_raw(&[0u8; 0], options) - .expect("first call succeeds"); - assert_eq!(bytes_to_u256(&first.return_data).unwrap(), U256::from(1)); - let second = instance - .call_raw(&[0u8; 0], options) - .expect("second call succeeds"); - assert_eq!(bytes_to_u256(&second.return_data).unwrap(), U256::from(2)); - } - - #[test] - fn erc20_contract_test() { - if !solc_available() { - eprintln!("skipping erc20_contract_test because solc is missing"); - return; - } - - let source_path = concat!( - env!("CARGO_MANIFEST_DIR"), - "/../codegen/tests/fixtures/erc20.fe" - ); - let harness = FeContractHarness::compile_from_file( - "CoolCoin", - source_path, - CompileOptions::default(), - ) - .expect("compilation should succeed"); - - let owner = Address::with_last_byte(0x01); - let alice = Address::with_last_byte(0x02); - let bob = Address::with_last_byte(0x03); - - let owner_abi = ethers_core::types::Address::from_low_u64_be(1); - let alice_abi = ethers_core::types::Address::from_low_u64_be(2); - let bob_abi = ethers_core::types::Address::from_low_u64_be(3); - - let initial_supply = AbiU256::from(1_000u64); - let mut instance = harness - .deploy_with_init_args(&[Token::Uint(initial_supply), Token::Address(owner_abi)]) - .expect("deployment succeeds"); - - let owner_opts = ExecutionOptions { - caller: owner, - ..ExecutionOptions::default() - }; - - let name_call = encode_function_call("name()", &[]).unwrap(); - let name_res = instance - .call_raw(&name_call, owner_opts) - .expect("name() should succeed"); - assert_eq!( - bytes_to_u256(&name_res.return_data).unwrap(), - U256::from(0x436f6f6c436f696eu64), - "name() should return CoolCoin" - ); - - let symbol_call = encode_function_call("symbol()", &[]).unwrap(); - let symbol_res = instance - .call_raw(&symbol_call, owner_opts) - .expect("symbol() should succeed"); - assert_eq!( - bytes_to_u256(&symbol_res.return_data).unwrap(), - U256::from(0x434f4f4cu64), - "symbol() should return COOL" - ); - - let decimals_call = encode_function_call("decimals()", &[]).unwrap(); - let decimals_res = instance - .call_raw(&decimals_call, owner_opts) - .expect("decimals() should succeed"); - assert_eq!( - bytes_to_u256(&decimals_res.return_data).unwrap(), - U256::from(18u64), - "decimals() should return 18" - ); - - let total_supply_call = encode_function_call("totalSupply()", &[]).unwrap(); - let total_supply_res = instance - .call_raw(&total_supply_call, owner_opts) - .expect("totalSupply() should succeed"); - assert_eq!( - bytes_to_u256(&total_supply_res.return_data).unwrap(), - U256::from(1_000u64), - "totalSupply() should match constructor mint" - ); - - let bal_owner_call = - encode_function_call("balanceOf(address)", &[Token::Address(owner_abi)]).unwrap(); - let bal_owner = instance - .call_raw(&bal_owner_call, owner_opts) - .expect("balanceOf(owner) should succeed"); - assert_eq!( - bytes_to_u256(&bal_owner.return_data).unwrap(), - U256::from(1_000u64), - "owner should receive initial supply" - ); - - // transfer 250 from owner -> alice - let transfer_call = encode_function_call( - "transfer(address,uint256)", - &[ - Token::Address(alice_abi), - Token::Uint(AbiU256::from(250u64)), - ], - ) - .unwrap(); - let transfer_res = instance - .call_raw(&transfer_call, owner_opts) - .expect("transfer should succeed"); - assert_eq!( - bytes_to_u256(&transfer_res.return_data).unwrap(), - U256::from(1u64), - "transfer should return true" - ); - - let bal_owner = instance - .call_raw(&bal_owner_call, owner_opts) - .expect("balanceOf(owner) after transfer should succeed"); - assert_eq!( - bytes_to_u256(&bal_owner.return_data).unwrap(), - U256::from(750u64), - "owner balance should decrease after transfer" - ); - - let bal_alice_call = - encode_function_call("balanceOf(address)", &[Token::Address(alice_abi)]).unwrap(); - let bal_alice = instance - .call_raw(&bal_alice_call, owner_opts) - .expect("balanceOf(alice) after transfer should succeed"); - assert_eq!( - bytes_to_u256(&bal_alice.return_data).unwrap(), - U256::from(250u64), - "alice balance should increase after transfer" - ); - - // approve bob to spend 100 from owner - let approve_call = encode_function_call( - "approve(address,uint256)", - &[Token::Address(bob_abi), Token::Uint(AbiU256::from(100u64))], - ) - .unwrap(); - let approve_res = instance - .call_raw(&approve_call, owner_opts) - .expect("approve should succeed"); - assert_eq!( - bytes_to_u256(&approve_res.return_data).unwrap(), - U256::from(1u64), - "approve should return true" - ); - - let allowance_call = encode_function_call( - "allowance(address,address)", - &[Token::Address(owner_abi), Token::Address(bob_abi)], - ) - .unwrap(); - let allowance_res = instance - .call_raw(&allowance_call, owner_opts) - .expect("allowance should succeed"); - assert_eq!( - bytes_to_u256(&allowance_res.return_data).unwrap(), - U256::from(100u64), - "allowance should match approve" - ); - - // transferFrom by bob: owner -> alice, 60 - let transfer_from_call = encode_function_call( - "transferFrom(address,address,uint256)", - &[ - Token::Address(owner_abi), - Token::Address(alice_abi), - Token::Uint(AbiU256::from(60u64)), - ], - ) - .unwrap(); - let bob_opts = ExecutionOptions { - caller: bob, - ..ExecutionOptions::default() - }; - let transfer_from_res = instance - .call_raw(&transfer_from_call, bob_opts) - .expect("transferFrom should succeed"); - assert_eq!( - bytes_to_u256(&transfer_from_res.return_data).unwrap(), - U256::from(1u64), - "transferFrom should return true" - ); - - let allowance_res = instance - .call_raw(&allowance_call, owner_opts) - .expect("allowance after transferFrom should succeed"); - assert_eq!( - bytes_to_u256(&allowance_res.return_data).unwrap(), - U256::from(40u64), - "allowance should decrease after transferFrom" - ); - - // mint 10 to alice (owner is MINTER) - let mint_call = encode_function_call( - "mint(address,uint256)", - &[Token::Address(alice_abi), Token::Uint(AbiU256::from(10u64))], - ) - .unwrap(); - let mint_res = instance - .call_raw(&mint_call, owner_opts) - .expect("mint should succeed"); - assert_eq!( - bytes_to_u256(&mint_res.return_data).unwrap(), - U256::from(1u64), - "mint should return true" - ); - - let total_supply_res = instance - .call_raw(&total_supply_call, owner_opts) - .expect("totalSupply after mint should succeed"); - assert_eq!( - bytes_to_u256(&total_supply_res.return_data).unwrap(), - U256::from(1_010u64), - "totalSupply should increase after mint" - ); - - // burn 5 from alice - let burn_call = - encode_function_call("burn(uint256)", &[Token::Uint(AbiU256::from(5u64))]).unwrap(); - let alice_opts = ExecutionOptions { - caller: alice, - ..ExecutionOptions::default() - }; - let burn_res = instance - .call_raw(&burn_call, alice_opts) - .expect("burn should succeed"); - assert_eq!( - bytes_to_u256(&burn_res.return_data).unwrap(), - U256::from(1u64), - "burn should return true" - ); - - let total_supply_res = instance - .call_raw(&total_supply_call, owner_opts) - .expect("totalSupply after burn should succeed"); - assert_eq!( - bytes_to_u256(&total_supply_res.return_data).unwrap(), - U256::from(1_005u64), - "totalSupply should decrease after burn" - ); - } - - #[test] - fn runtime_constructs_contract() { - if !solc_available() { - eprintln!("skipping runtime_constructs_contract because solc is missing"); - return; - } - let fixture_dir = concat!( - env!("CARGO_MANIFEST_DIR"), - "/../codegen/tests/fixtures/runtime_constructs" - ); - let ingot_url = Url::from_directory_path(fixture_dir).expect("fixture dir is valid"); - - let mut db = DriverDataBase::default(); - let had_init_diagnostics = driver::init_ingot(&mut db, &ingot_url); - assert!( - !had_init_diagnostics, - "ingot resolution should succeed for `{ingot_url}`" - ); - - let ingot = db - .workspace() - .containing_ingot(&db, ingot_url.clone()) - .expect("ingot should be registered in workspace"); - let diags = db.run_on_ingot(ingot); - if !diags.is_empty() { - panic!("compiler diagnostics:\n{}", diags.format_diags(&db)); - } - - let root_file = ingot.root_file(&db).expect("ingot should have root file"); - let top_mod = db.top_mod(root_file); - let yul = emit_module_yul(&db, top_mod).expect("yul emission should succeed"); - let contract = compile_single_contract("Parent", &yul, false, true) - .expect("solc compilation should succeed"); - - let mut instance = - RuntimeInstance::deploy(&contract.bytecode).expect("parent deployment should succeed"); - let parent_res = instance - .call_raw(&[], ExecutionOptions::default()) - .expect("parent runtime should succeed"); - assert_eq!( - parent_res.return_data.len(), - 32, - "parent should return a u256 word containing the deployed child address" - ); - - let child_address = Address::from_slice(&parent_res.return_data[12..]); - assert_ne!( - child_address, - Address::ZERO, - "parent should return a nonzero child address" - ); - - let child_res = instance - .call_raw_at(child_address, &[], ExecutionOptions::default()) - .expect("child runtime should succeed"); - assert_eq!( - bytes_to_u256(&child_res.return_data).unwrap(), - U256::from(0xbeefu64), - "child runtime should return expected value" - ); - } -} diff --git a/crates/driver/Cargo.toml b/crates/driver/Cargo.toml deleted file mode 100644 index 69e9f24d45..0000000000 --- a/crates/driver/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "fe-driver" -version = "26.0.0-alpha.7" -edition.workspace = true -license = "Apache-2.0" -repository = "https://github.com/argotorg/fe" -description = "Provides Fe driver" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -doctest = false - -[dependencies] -camino.workspace = true -codespan-reporting.workspace = true -salsa.workspace = true -smol_str.workspace = true - -common.workspace = true -hir.workspace = true -resolver.workspace = true -url.workspace = true -tracing.workspace = true -mir.workspace = true -petgraph.workspace = true -glob.workspace = true - -[dev-dependencies] -tempfile = "3.13" diff --git a/crates/driver/src/cli_target.rs b/crates/driver/src/cli_target.rs deleted file mode 100644 index 80fa0d4c14..0000000000 --- a/crates/driver/src/cli_target.rs +++ /dev/null @@ -1,235 +0,0 @@ -use std::fs; - -use camino::Utf8PathBuf; -use common::{InputDb, config::Config}; -use resolver::{ResolutionHandler, Resolver}; -use resolver::{ - files::ancestor_fe_toml_dirs, - ingot::{FeTomlProbe, infer_config_kind}, -}; -use smol_str::SmolStr; -use url::Url; - -use crate::DriverDataBase; - -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum CliTarget { - StandaloneFile(Utf8PathBuf), - Directory(Utf8PathBuf), -} - -struct ResolvedMember { - path: Utf8PathBuf, - url: Url, -} - -struct ConfigProbe; - -impl ResolutionHandler for ConfigProbe { - type Item = FeTomlProbe; - - fn handle_resolution( - &mut self, - _description: &Url, - resource: resolver::files::FilesResource, - ) -> Self::Item { - for file in &resource.files { - if file.path.as_str().ends_with("fe.toml") { - return FeTomlProbe::Present { - kind_hint: infer_config_kind(&file.content), - }; - } - } - FeTomlProbe::Missing - } -} - -pub fn resolve_cli_target( - db: &mut DriverDataBase, - path: &Utf8PathBuf, - force_standalone: bool, -) -> Result { - let arg = path.as_str(); - let is_name = is_name_candidate(arg); - let path_exists = path.exists(); - - if path.is_file() { - if path.file_name() == Some("fe.toml") { - return Err(format!( - "fe.toml file paths are not accepted: {path}. Pass the containing directory instead" - )); - } - if path.extension() == Some("fe") { - // If the file lives under an ingot, operate from that directory so imports resolve - // in context. For workspace roots, prefer treating the file as standalone unless - // the user explicitly targets the workspace. - if !force_standalone - && let Ok(canonical) = path.canonicalize_utf8() - && let Some(root) = ancestor_fe_toml_dirs(canonical.as_std_path()) - .first() - .and_then(|root| Utf8PathBuf::from_path_buf(root.to_path_buf()).ok()) - { - let config_path = root.join("fe.toml"); - if let Ok(content) = fs::read_to_string(&config_path) - && matches!(Config::parse(&content), Ok(Config::Ingot(_))) - { - return Ok(CliTarget::Directory(root)); - } - } - - return Ok(CliTarget::StandaloneFile(path.clone())); - } - return Err("Path must be either a .fe file or a directory containing fe.toml".into()); - } - - let name_match = if is_name { - resolve_member_by_name(db, arg)? - } else { - None - }; - - let path_member = if is_name && path_exists { - resolve_member_by_path(db, path)? - } else { - None - }; - - if path_exists && name_match.is_some() { - match (&name_match, &path_member) { - (Some(name_member), Some(path_member)) => { - if name_member.url == path_member.url { - return Ok(CliTarget::Directory(path_member.path.clone())); - } - return Err(format!( - "Argument \"{arg}\" matches a workspace member name but does not match the provided path" - )); - } - (Some(_), None) => { - return Err(format!( - "Argument \"{arg}\" matches a workspace member name but does not match the provided path" - )); - } - _ => {} - } - } - - if let Some(name_member) = name_match { - return Ok(CliTarget::Directory(name_member.path)); - } - - if path_exists { - if path.is_dir() && path.join("fe.toml").is_file() { - return Ok(CliTarget::Directory(path.clone())); - } - return Err("Path must be either a .fe file or a directory containing fe.toml".into()); - } - - Err("Path must be either a .fe file or a directory containing fe.toml".into()) -} - -fn is_name_candidate(value: &str) -> bool { - !value.is_empty() && value.chars().all(|c| c.is_ascii_alphanumeric() || c == '_') -} - -fn resolve_member_by_name( - db: &mut DriverDataBase, - name: &str, -) -> Result, String> { - let cwd = std::env::current_dir() - .map_err(|err| format!("Failed to read current directory: {err}"))?; - let cwd = Utf8PathBuf::from_path_buf(cwd) - .map_err(|_| "Current directory is not valid UTF-8".to_string())?; - let workspace_root = find_workspace_root(db, &cwd)?; - let Some(workspace_root) = workspace_root else { - return Ok(None); - }; - let workspace_url = dir_url(&workspace_root)?; - let mut matches = - db.dependency_graph() - .workspace_members_by_name(db, &workspace_url, &SmolStr::new(name)); - if matches.is_empty() { - return Ok(None); - } - if matches.len() > 1 { - return Err(format!( - "Multiple workspace members named \"{name}\"; specify a path instead" - )); - } - let member = matches.pop().map(|member| ResolvedMember { - path: workspace_root.join(member.path.as_str()), - url: member.url, - }); - Ok(member) -} - -fn resolve_member_by_path( - db: &mut DriverDataBase, - path: &Utf8PathBuf, -) -> Result, String> { - if !path.is_dir() { - return Ok(None); - } - let workspace_root = find_workspace_root(db, path)?; - let Some(workspace_root) = workspace_root else { - return Ok(None); - }; - let workspace_url = dir_url(&workspace_root)?; - let members = db - .dependency_graph() - .workspace_member_records(db, &workspace_url); - let canonical = path - .canonicalize_utf8() - .map_err(|_| format!("Invalid or non-existent directory path: {path}"))?; - let target_url = Url::from_directory_path(canonical.as_str()) - .map_err(|_| format!("Invalid directory path: {path}"))?; - - Ok(members - .into_iter() - .find(|member| member.url == target_url) - .map(|member| ResolvedMember { - path: workspace_root.join(member.path.as_str()), - url: member.url, - })) -} - -fn find_workspace_root( - db: &mut DriverDataBase, - start: &Utf8PathBuf, -) -> Result, String> { - let dirs = ancestor_fe_toml_dirs(start.as_std_path()); - for dir in dirs { - let dir = Utf8PathBuf::from_path_buf(dir) - .map_err(|_| "Encountered non UTF-8 workspace path".to_string())?; - let url = dir_url(&dir)?; - let mut resolver = resolver::ingot::minimal_files_resolver(); - let summary = resolver - .resolve(&mut ConfigProbe, &url) - .map_err(|err| err.to_string())?; - if summary.kind_hint() == Some(resolver::ingot::ConfigKind::Workspace) { - if db - .dependency_graph() - .workspace_member_records(db, &url) - .is_empty() - { - let _ = crate::init_ingot(db, &url); - } - return Ok(Some(dir)); - } - } - Ok(None) -} - -fn dir_url(path: &Utf8PathBuf) -> Result { - let canonical_path = match path.canonicalize_utf8() { - Ok(path) => path, - Err(_) => { - let cwd = std::env::current_dir() - .map_err(|err| format!("Failed to read current directory: {err}"))?; - let cwd = Utf8PathBuf::from_path_buf(cwd) - .map_err(|_| "Current directory is not valid UTF-8".to_string())?; - cwd.join(path) - } - }; - Url::from_directory_path(canonical_path.as_str()) - .map_err(|_| format!("Invalid or non-existent directory path: {path}")) -} diff --git a/crates/driver/src/db.rs b/crates/driver/src/db.rs deleted file mode 100644 index 84644cf3d7..0000000000 --- a/crates/driver/src/db.rs +++ /dev/null @@ -1,171 +0,0 @@ -use crate::diagnostics::CsDbWrapper; -use codespan_reporting::term::{ - self, - termcolor::{BufferWriter, ColorChoice}, -}; -use common::file::File; -use common::{ - define_input_db, - diagnostics::{CompleteDiagnostic, Severity, cmp_complete_diagnostics}, -}; -use hir::analysis::{ - analysis_pass::{AnalysisPassManager, EventLowerPass, MsgLowerPass, ParsingPass}, - diagnostics::DiagnosticVoucher, - name_resolution::ImportAnalysisPass, - ty::{ - AdtDefAnalysisPass, BodyAnalysisPass, ContractAnalysisPass, DefConflictAnalysisPass, - FuncAnalysisPass, ImplAnalysisPass, ImplTraitAnalysisPass, MsgSelectorAnalysisPass, - TraitAnalysisPass, TypeAliasAnalysisPass, - }, -}; -use hir::{ - Ingot, - hir_def::{HirIngot, TopLevelMod}, - lower::{map_file_to_mod, module_tree}, -}; -use mir::{MirDiagnosticsMode, collect_mir_diagnostics}; - -use crate::diagnostics::ToCsDiag; - -define_input_db!(DriverDataBase); - -impl DriverDataBase { - // TODO: An temporary implementation for ui testing. - pub fn run_on_top_mod<'db>(&'db self, top_mod: TopLevelMod<'db>) -> DiagnosticsCollection<'db> { - self.run_on_file_with_pass_manager(top_mod, initialize_analysis_pass()) - } - - pub fn run_on_file_with_pass_manager<'db>( - &'db self, - top_mod: TopLevelMod<'db>, - mut pass_manager: AnalysisPassManager, - ) -> DiagnosticsCollection<'db> { - DiagnosticsCollection(pass_manager.run_on_module(self, top_mod)) - } - - pub fn run_on_ingot<'db>(&'db self, ingot: Ingot<'db>) -> DiagnosticsCollection<'db> { - self.run_on_ingot_with_pass_manager(ingot, initialize_analysis_pass()) - } - - pub fn run_on_ingot_with_pass_manager<'db>( - &'db self, - ingot: Ingot<'db>, - mut pass_manager: AnalysisPassManager, - ) -> DiagnosticsCollection<'db> { - let tree = module_tree(self, ingot); - DiagnosticsCollection(pass_manager.run_on_module_tree(self, tree)) - } - - pub fn top_mod(&self, input: File) -> TopLevelMod<'_> { - map_file_to_mod(self, input) - } - - pub fn mir_diagnostics_for_ingot<'db>( - &'db self, - ingot: Ingot<'db>, - mode: MirDiagnosticsMode, - ) -> Vec { - // Empty ingots (e.g. deleted during incremental workspace changes) - // have no root module to analyze. - let Some(root_data) = ingot.module_tree(self).root_data() else { - return Vec::new(); - }; - let top_mod = root_data.top_mod; - let mut output = collect_mir_diagnostics(self, top_mod, mode); - for err in output.internal_errors { - tracing::debug!(target: "lsp", "MIR diagnostics internal error: {err}"); - } - sort_and_dedup_complete_diagnostics(&mut output.diagnostics); - output.diagnostics - } - - pub fn emit_complete_diagnostics(&self, diagnostics: &[CompleteDiagnostic]) { - let writer = BufferWriter::stderr(ColorChoice::Auto); - let mut buffer = writer.buffer(); - let config = term::Config::default(); - let mut diagnostics = diagnostics.to_vec(); - sort_and_dedup_complete_diagnostics(&mut diagnostics); - - for diag in diagnostics { - term::emit(&mut buffer, &config, &CsDbWrapper(self), &diag.to_cs(self)).unwrap(); - } - - writer - .print(&buffer) - .expect("Failed to write diagnostics to stderr"); - } -} - -pub struct DiagnosticsCollection<'db>(Vec>); -impl DiagnosticsCollection<'_> { - pub fn is_empty(&self) -> bool { - self.0.is_empty() - } - - pub fn has_errors(&self, db: &DriverDataBase) -> bool { - self.finalize(db) - .iter() - .any(|d| d.severity == Severity::Error) - } - - pub fn emit(&self, db: &DriverDataBase) { - let writer = BufferWriter::stderr(ColorChoice::Auto); - let mut buffer = writer.buffer(); - let config = term::Config::default(); - - for diag in self.finalize(db) { - term::emit(&mut buffer, &config, &CsDbWrapper(db), &diag.to_cs(db)).unwrap(); - } - - writer - .print(&buffer) - .expect("Failed to write diagnostics to stderr"); - } - - /// Format the accumulated diagnostics to a string. - pub fn format_diags(&self, db: &DriverDataBase) -> String { - let writer = BufferWriter::stderr(ColorChoice::Never); - let mut buffer = writer.buffer(); - let config = term::Config::default(); - - for diag in self.finalize(db) { - term::emit(&mut buffer, &config, &CsDbWrapper(db), &diag.to_cs(db)).unwrap(); - } - - std::str::from_utf8(buffer.as_slice()).unwrap().to_string() - } - - fn finalize(&self, db: &DriverDataBase) -> Vec { - let mut diags: Vec<_> = self.0.iter().map(|d| d.as_ref().to_complete(db)).collect(); - sort_complete_diagnostics(&mut diags); - diags - } -} - -fn sort_complete_diagnostics(diags: &mut [CompleteDiagnostic]) { - diags.sort_by(cmp_complete_diagnostics); -} - -fn sort_and_dedup_complete_diagnostics(diags: &mut Vec) { - sort_complete_diagnostics(diags); - diags.dedup(); -} - -fn initialize_analysis_pass() -> AnalysisPassManager { - let mut pass_manager = AnalysisPassManager::new(); - pass_manager.add_module_pass("Parsing", Box::new(ParsingPass {})); - pass_manager.add_module_pass("MsgLower", Box::new(MsgLowerPass {})); - pass_manager.add_module_pass("EventLower", Box::new(EventLowerPass {})); - pass_manager.add_module_pass("MsgSelector", Box::new(MsgSelectorAnalysisPass {})); - pass_manager.add_module_pass("DefConflict", Box::new(DefConflictAnalysisPass {})); - pass_manager.add_module_pass("Import", Box::new(ImportAnalysisPass {})); - pass_manager.add_module_pass("AdtDef", Box::new(AdtDefAnalysisPass {})); - pass_manager.add_module_pass("TypeAlias", Box::new(TypeAliasAnalysisPass {})); - pass_manager.add_module_pass("Trait", Box::new(TraitAnalysisPass {})); - pass_manager.add_module_pass("Impl", Box::new(ImplAnalysisPass {})); - pass_manager.add_module_pass("ImplTrait", Box::new(ImplTraitAnalysisPass {})); - pass_manager.add_module_pass("Func", Box::new(FuncAnalysisPass {})); - pass_manager.add_module_pass("Body", Box::new(BodyAnalysisPass {})); - pass_manager.add_module_pass("Contract", Box::new(ContractAnalysisPass {})); - pass_manager -} diff --git a/crates/driver/src/diagnostics.rs b/crates/driver/src/diagnostics.rs deleted file mode 100644 index 2fe9fed69d..0000000000 --- a/crates/driver/src/diagnostics.rs +++ /dev/null @@ -1,130 +0,0 @@ -use std::ops::Range; - -use camino::Utf8Path; -use codespan_reporting as cs; -use common::{ - InputDb, - diagnostics::{CompleteDiagnostic, LabelStyle, Severity}, - file::File, -}; -use cs::{diagnostic as cs_diag, files as cs_files}; -use hir::analysis::diagnostics::{DiagnosticVoucher, SpannedHirAnalysisDb}; - -pub trait ToCsDiag { - fn to_cs(&self, db: &dyn SpannedInputDb) -> cs_diag::Diagnostic; -} - -pub trait SpannedInputDb: SpannedHirAnalysisDb + InputDb {} -impl SpannedInputDb for T where T: SpannedHirAnalysisDb + InputDb {} - -impl ToCsDiag for T -where - T: DiagnosticVoucher, -{ - fn to_cs(&self, db: &dyn SpannedInputDb) -> cs_diag::Diagnostic { - complete_to_cs(self.to_complete(db)) - } -} - -fn complete_to_cs(complete: CompleteDiagnostic) -> cs_diag::Diagnostic { - let severity = convert_severity(complete.severity); - let code = Some(complete.error_code.to_string()); - let message = complete.message; - - let labels = complete - .sub_diagnostics - .into_iter() - .filter_map(|sub_diag| { - let span = sub_diag.span?; - match sub_diag.style { - LabelStyle::Primary => { - cs_diag::Label::new(cs_diag::LabelStyle::Primary, span.file, span.range) - } - LabelStyle::Secondary => { - cs_diag::Label::new(cs_diag::LabelStyle::Secondary, span.file, span.range) - } - } - .with_message(sub_diag.message) - .into() - }) - .collect(); - - cs_diag::Diagnostic { - severity, - code, - message, - labels, - notes: complete.notes, - } -} - -fn convert_severity(severity: Severity) -> cs_diag::Severity { - match severity { - Severity::Error => cs_diag::Severity::Error, - Severity::Warning => cs_diag::Severity::Warning, - Severity::Note => cs_diag::Severity::Note, - } -} - -#[salsa::tracked(return_ref)] -pub fn file_line_starts(db: &dyn SpannedHirAnalysisDb, file: File) -> Vec { - cs::files::line_starts(file.text(db)).collect() -} - -pub struct CsDbWrapper<'a>(pub &'a dyn SpannedHirAnalysisDb); - -impl<'db> cs_files::Files<'db> for CsDbWrapper<'db> { - type FileId = File; - type Name = &'db Utf8Path; - type Source = &'db str; - - fn name(&'db self, file_id: Self::FileId) -> Result { - match file_id.path(self.0) { - Some(path) => Ok(path.as_path()), - None => Err(cs_files::Error::FileMissing), - } - } - - fn source(&'db self, file_id: Self::FileId) -> Result { - Ok(file_id.text(self.0)) - } - - fn line_index( - &'db self, - file_id: Self::FileId, - byte_index: usize, - ) -> Result { - let starts = file_line_starts(self.0, file_id); - Ok(starts - .binary_search(&byte_index) - .unwrap_or_else(|next_line| next_line - 1)) - } - - fn line_range( - &'db self, - file_id: Self::FileId, - line_index: usize, - ) -> Result, cs_files::Error> { - let line_starts = file_line_starts(self.0, file_id); - - let start = *line_starts - .get(line_index) - .ok_or(cs_files::Error::LineTooLarge { - given: line_index, - max: line_starts.len() - 1, - })?; - - let end = if line_index == line_starts.len() - 1 { - file_id.text(self.0).len() - } else { - *line_starts - .get(line_index + 1) - .ok_or(cs_files::Error::LineTooLarge { - given: line_index, - max: line_starts.len() - 1, - })? - }; - - Ok(Range { start, end }) - } -} diff --git a/crates/driver/src/files.rs b/crates/driver/src/files.rs deleted file mode 100644 index 0df4deb94c..0000000000 --- a/crates/driver/src/files.rs +++ /dev/null @@ -1,23 +0,0 @@ -use camino::Utf8PathBuf; - -pub const FE_TOML: &str = "fe.toml"; - -pub fn find_project_root() -> Option { - let mut path = Utf8PathBuf::from_path_buf( - std::env::current_dir().expect("Unable to get current directory"), - ) - .expect("Expected utf8 path"); - - loop { - let fe_toml = path.join(FE_TOML); - if fe_toml.is_file() { - return Some(path); - } - - if !path.pop() { - break; - } - } - - None -} diff --git a/crates/driver/src/ingot_handler.rs b/crates/driver/src/ingot_handler.rs deleted file mode 100644 index 16f8409355..0000000000 --- a/crates/driver/src/ingot_handler.rs +++ /dev/null @@ -1,1209 +0,0 @@ -use std::collections::{HashMap, HashSet}; - -use camino::{Utf8Path, Utf8PathBuf}; -use common::{ - InputDb, - config::{Config, ConfigDiagnostic, WorkspaceMemberSelection}, - dependencies::{ - DependencyAlias, DependencyArguments, DependencyLocation, LocalFiles, RemoteFiles, - WorkspaceMemberRecord, - }, - urlext::UrlExt, -}; -use resolver::{ - ResolutionHandler, - git::GitDescription, - graph::{ - DiGraph, GraphNodeOutcome, GraphResolutionHandler, UnresolvedNode, petgraph::visit::EdgeRef, - }, - ingot::{ - ConfigKind, IngotDescriptor, IngotOrigin, IngotPriority, IngotResolutionDiagnostic, - IngotResolutionEvent, IngotResolverImpl, IngotResource, - }, -}; -use smol_str::SmolStr; -use url::Url; - -use crate::IngotInitDiagnostics; - -pub struct IngotHandler<'a> { - pub db: &'a mut dyn InputDb, - ingot_urls: HashMap, - had_diagnostics: bool, - reported_checkouts: HashSet, - dependency_contexts: HashMap>, - emitted_diagnostics: HashSet, -} - -#[derive(Clone, Debug)] -struct DependencyContext { - from_ingot_url: Url, - dependency: SmolStr, -} - -fn workspace_version_for_member( - db: &dyn InputDb, - ingot_url: &Url, -) -> Option { - let workspace_url = db - .dependency_graph() - .workspace_root_for_member(db, ingot_url)?; - let config_url = workspace_url.join("fe.toml").ok()?; - let file = db.workspace().get(db, &config_url)?; - let config_file = Config::parse(file.text(db)).ok()?; - match config_file { - Config::Workspace(workspace_config) => workspace_config.workspace.version, - Config::Ingot(_) => None, - } -} - -impl<'a> IngotHandler<'a> { - pub fn new(db: &'a mut dyn InputDb) -> Self { - Self { - db, - ingot_urls: HashMap::new(), - had_diagnostics: false, - reported_checkouts: HashSet::new(), - dependency_contexts: HashMap::new(), - emitted_diagnostics: HashSet::new(), - } - } - - pub fn had_diagnostics(&self) -> bool { - self.had_diagnostics - } - - fn record_dependency_context( - &mut self, - descriptor: &IngotDescriptor, - from_ingot_url: &Url, - dependency: &SmolStr, - ) { - let contexts = self - .dependency_contexts - .entry(descriptor.clone()) - .or_default(); - if contexts.iter().any(|context| { - context.from_ingot_url == *from_ingot_url && context.dependency == *dependency - }) { - return; - } - contexts.push(DependencyContext { - from_ingot_url: from_ingot_url.clone(), - dependency: dependency.clone(), - }); - } - - fn report_warn(&mut self, diagnostic: IngotInitDiagnostics) { - let diagnostic_string = diagnostic.to_string(); - if !self.emitted_diagnostics.insert(diagnostic_string.clone()) { - return; - } - self.had_diagnostics = true; - tracing::warn!(target: "resolver", "{diagnostic_string}"); - eprintln!("Error: {diagnostic_string}"); - } - - fn report_error(&mut self, diagnostic: IngotInitDiagnostics) { - let diagnostic_string = diagnostic.to_string(); - if !self.emitted_diagnostics.insert(diagnostic_string.clone()) { - return; - } - self.had_diagnostics = true; - tracing::error!(target: "resolver", "{diagnostic_string}"); - eprintln!("Error: {diagnostic_string}"); - } - - fn record_files(&mut self, files: &[resolver::files::File]) { - for file in files { - let file_url = - Url::from_file_path(file.path.as_std_path()).expect("resolved path to url"); - self.db - .workspace() - .touch(self.db, file_url, Some(file.content.clone())); - } - } - - fn record_files_owned(&mut self, files: Vec) { - for file in files { - let file_url = - Url::from_file_path(file.path.as_std_path()).expect("resolved path to url"); - self.db - .workspace() - .touch(self.db, file_url, Some(file.content)); - } - } - - fn register_remote_mapping(&mut self, ingot_url: &Url, origin: &IngotOrigin) { - if let IngotOrigin::Remote { description, .. } = origin { - let remote = RemoteFiles { - source: description.source.clone(), - rev: SmolStr::new(description.rev.clone()), - path: description.path.clone(), - }; - self.db - .dependency_graph() - .register_remote_checkout(self.db, ingot_url.clone(), remote); - } - } - - fn convert_dependency( - &mut self, - ingot_url: &Url, - origin: &IngotOrigin, - workspace_root: Option<&Url>, - dependency: common::dependencies::Dependency, - ) -> Option<(IngotDescriptor, (DependencyAlias, DependencyArguments))> { - let common::dependencies::Dependency { - alias, - location, - arguments, - } = dependency; - - match location { - DependencyLocation::WorkspaceCurrent => { - let name = arguments.name.clone().unwrap_or_else(|| alias.clone()); - - let Some(workspace_root) = workspace_root else { - self.report_error(IngotInitDiagnostics::WorkspaceNameLookupUnavailable { - ingot_url: ingot_url.clone(), - dependency: alias.clone(), - }); - return None; - }; - - let workspace_current = common::dependencies::Dependency { - alias: alias.clone(), - location: DependencyLocation::WorkspaceCurrent, - arguments: arguments.clone(), - }; - match self.workspace_dependency_for_alias( - ingot_url, - origin, - workspace_root, - &workspace_current, - ) { - Ok(Some(descriptor)) => { - return Some((descriptor, (alias, arguments))); - } - Ok(None) => {} - Err(error) => { - self.report_error(IngotInitDiagnostics::WorkspaceMemberResolutionFailed { - ingot_url: ingot_url.clone(), - dependency: alias.clone(), - error, - }); - return None; - } - } - - match origin { - IngotOrigin::Local => { - let descriptor = IngotDescriptor::LocalByName { - base: workspace_root.clone(), - name, - }; - self.record_dependency_context(&descriptor, ingot_url, &alias); - Some((descriptor, (alias, arguments))) - } - IngotOrigin::Remote { - description, - checkout_path, - .. - } => { - match relative_path_within_checkout(checkout_path.as_path(), workspace_root) - { - Ok(relative_path) => { - let mut base = GitDescription::new( - description.source.clone(), - description.rev.clone(), - ); - if let Some(path) = relative_path { - base = base.with_path(path); - } - let descriptor = IngotDescriptor::RemoteByName { base, name }; - self.record_dependency_context(&descriptor, ingot_url, &alias); - Some((descriptor, (alias, arguments))) - } - Err(error) => { - self.report_error( - IngotInitDiagnostics::RemotePathResolutionError { - ingot_url: ingot_url.clone(), - dependency: alias, - error, - }, - ); - None - } - } - } - } - } - DependencyLocation::Local(local) => { - if let Some(name) = arguments.name.clone() { - match origin { - IngotOrigin::Local => { - let descriptor = IngotDescriptor::LocalByName { - base: local.url, - name, - }; - self.record_dependency_context(&descriptor, ingot_url, &alias); - Some((descriptor, (alias, arguments))) - } - IngotOrigin::Remote { - description, - checkout_path, - .. - } => { - match relative_path_within_checkout(checkout_path.as_path(), &local.url) - { - Ok(relative_path) => { - let mut base = GitDescription::new( - description.source.clone(), - description.rev.clone(), - ); - if let Some(path) = relative_path { - base = base.with_path(path); - } - let descriptor = IngotDescriptor::RemoteByName { base, name }; - self.record_dependency_context(&descriptor, ingot_url, &alias); - Some((descriptor, (alias, arguments))) - } - Err(error) => { - self.report_error( - IngotInitDiagnostics::RemotePathResolutionError { - ingot_url: ingot_url.clone(), - dependency: alias, - error, - }, - ); - None - } - } - } - } - } else { - match origin { - IngotOrigin::Local => { - let descriptor = IngotDescriptor::Local(local.url); - self.record_dependency_context(&descriptor, ingot_url, &alias); - Some((descriptor, (alias, arguments))) - } - IngotOrigin::Remote { - description, - checkout_path, - .. - } => { - match relative_path_within_checkout(checkout_path.as_path(), &local.url) - { - Ok(relative_path) => { - let mut next_description = GitDescription::new( - description.source.clone(), - description.rev.clone(), - ); - if let Some(path) = relative_path { - next_description = next_description.with_path(path); - } - let descriptor = IngotDescriptor::Remote(next_description); - self.record_dependency_context(&descriptor, ingot_url, &alias); - Some((descriptor, (alias, arguments))) - } - Err(error) => { - self.report_error( - IngotInitDiagnostics::RemotePathResolutionError { - ingot_url: ingot_url.clone(), - dependency: alias, - error, - }, - ); - None - } - } - } - } - } - } - DependencyLocation::Remote(remote) => { - if let Some(name) = arguments.name.clone() { - let mut base = - GitDescription::new(remote.source.clone(), remote.rev.to_string()); - if let Some(path) = remote.path.clone() { - base = base.with_path(path); - } - let descriptor = IngotDescriptor::RemoteByName { base, name }; - self.record_dependency_context(&descriptor, ingot_url, &alias); - Some((descriptor, (alias, arguments))) - } else { - let mut next_description = - GitDescription::new(remote.source.clone(), remote.rev.to_string()); - if let Some(path) = remote.path.clone() { - next_description = next_description.with_path(path); - } - let descriptor = IngotDescriptor::Remote(next_description); - self.record_dependency_context(&descriptor, ingot_url, &alias); - Some((descriptor, (alias, arguments))) - } - } - } - } - - fn workspace_dependency_for_alias( - &mut self, - ingot_url: &Url, - origin: &IngotOrigin, - workspace_root: &Url, - dependency: &common::dependencies::Dependency, - ) -> Result, String> { - let config = self.config_at_url(workspace_root)?; - let Config::Workspace(workspace_config) = config else { - return Ok(None); - }; - - let Some(entry) = workspace_config - .workspace - .dependencies - .iter() - .find(|entry| entry.alias == dependency.alias) - else { - return Ok(None); - }; - - let location = match &entry.location { - common::config::DependencyEntryLocation::RelativePath(path) => { - let url = workspace_root - .join_directory(path) - .map_err(|_| format!("Failed to join workspace dependency path {path}"))?; - DependencyLocation::Local(LocalFiles { - path: path.clone(), - url, - }) - } - common::config::DependencyEntryLocation::Remote(remote) => { - DependencyLocation::Remote(remote.clone()) - } - common::config::DependencyEntryLocation::WorkspaceCurrent => { - return Err(format!( - "Workspace dependency '{}' must specify a path or a source", - entry.alias - )); - } - }; - - let mut arguments = entry.arguments.clone(); - if arguments.name.is_none() { - arguments.name = dependency.arguments.name.clone(); - } - if dependency.arguments.version.is_some() { - arguments.version = dependency.arguments.version.clone(); - } - - let workspace_dependency = common::dependencies::Dependency { - alias: entry.alias.clone(), - location, - arguments, - }; - - Ok(self - .convert_dependency( - ingot_url, - origin, - Some(workspace_root), - workspace_dependency, - ) - .map(|(descriptor, _)| descriptor)) - } - - fn workspace_member_metadata( - &mut self, - member: &crate::ExpandedWorkspaceMember, - ) -> Result<(Option, Option), String> { - let config = self.config_at_url(&member.url)?; - let Config::Ingot(ingot) = config else { - return Err(format!("Expected ingot config at {}", member.url)); - }; - - if let Some(expected_name) = member.name.as_ref() - && ingot.metadata.name.as_ref() != Some(expected_name) - { - return Err(format!( - "Workspace member {} has mismatched metadata: name expected {expected_name} but found {}", - member.url, - ingot.metadata.name.as_deref().unwrap_or("") - )); - } - - if let Some(expected_version) = member.version.as_ref() - && ingot.metadata.version.as_ref() != Some(expected_version) - { - return Err(format!( - "Workspace member {} has mismatched metadata: version expected {expected_version} but found {}", - member.url, - ingot - .metadata - .version - .as_ref() - .map(ToString::to_string) - .unwrap_or_else(|| "".to_string()) - )); - } - - let name = member.name.clone().or(ingot.metadata.name.clone()); - let version = member.version.clone().or(ingot.metadata.version.clone()); - Ok((name, version)) - } - - fn handle_workspace_config( - &mut self, - resource: &IngotResource, - workspace_config: common::config::WorkspaceConfig, - ) -> Vec> - { - if !workspace_config.diagnostics.is_empty() { - self.report_warn(IngotInitDiagnostics::WorkspaceDiagnostics { - workspace_url: resource.ingot_url.clone(), - diagnostics: workspace_config.diagnostics.clone(), - }); - } - - let workspace = workspace_config.workspace.clone(); - let workspace_dependency_aliases: HashSet<_> = workspace - .dependencies - .iter() - .map(|dependency| dependency.alias.clone()) - .collect(); - let selection = if workspace.default_members.is_some() { - WorkspaceMemberSelection::DefaultOnly - } else { - WorkspaceMemberSelection::All - }; - let mut members = - match crate::expand_workspace_members(&workspace, &resource.ingot_url, selection) { - Ok(members) => members, - Err(error) => { - self.report_error(IngotInitDiagnostics::WorkspaceMembersError { - workspace_url: resource.ingot_url.clone(), - error, - }); - return Vec::new(); - } - }; - - self.db - .dependency_graph() - .ensure_workspace_root(self.db, &resource.ingot_url); - - for member in &mut members { - let explicit_name = member.name.clone(); - let explicit_version = member.version.clone(); - let (name, version) = match self.workspace_member_metadata(member) { - Ok(metadata) => metadata, - Err(error) => { - self.report_error(IngotInitDiagnostics::WorkspaceMembersError { - workspace_url: resource.ingot_url.clone(), - error, - }); - return Vec::new(); - } - }; - member.name = name; - member.version = version; - self.db.dependency_graph().register_workspace_member_root( - self.db, - &resource.ingot_url, - &member.url, - ); - if let (Some(name), Some(version)) = (explicit_name, explicit_version) { - self.db - .dependency_graph() - .register_expected_member_metadata( - self.db, - &member.url, - name.clone(), - version.clone(), - ); - } - - if let Some(name) = &member.name { - if workspace_dependency_aliases.contains(name) { - self.report_error(IngotInitDiagnostics::WorkspaceDependencyAliasConflict { - workspace_url: resource.ingot_url.clone(), - alias: name.clone(), - }); - return Vec::new(); - } - let existing = self.db.dependency_graph().workspace_members_by_name( - self.db, - &resource.ingot_url, - name, - ); - if existing.iter().any(|other| other.url != member.url) { - self.report_error(IngotInitDiagnostics::WorkspaceMemberDuplicate { - workspace_url: resource.ingot_url.clone(), - name: name.clone(), - version: None, - }); - return Vec::new(); - } - let record = WorkspaceMemberRecord { - name: name.clone(), - version: member.version.clone(), - path: member.path.clone(), - url: member.url.clone(), - }; - self.db.dependency_graph().register_workspace_member( - self.db, - &resource.ingot_url, - record, - ); - } - } - - let mut dependencies = Vec::new(); - for member in members { - if member.url == resource.ingot_url { - continue; - } - let arguments = DependencyArguments { - name: member.name.clone(), - version: member.version.clone(), - }; - let alias = member - .name - .clone() - .unwrap_or_else(|| SmolStr::new(member.path.as_str())); - let descriptor = match &resource.origin { - IngotOrigin::Local => IngotDescriptor::Local(member.url.clone()), - IngotOrigin::Remote { description, .. } => { - let mut member_path = member.path.clone(); - if let Some(root_path) = &description.path { - member_path = root_path.join(member_path.as_str()); - } - let next_description = - GitDescription::new(description.source.clone(), description.rev.clone()) - .with_path(member_path); - IngotDescriptor::Remote(next_description) - } - }; - let priority = match &descriptor { - IngotDescriptor::Local(_) => IngotPriority::local(), - IngotDescriptor::Remote(_) => IngotPriority::remote(), - _ => unreachable!("workspace members must resolve to local or remote descriptors"), - }; - dependencies.push(UnresolvedNode { - priority, - description: descriptor, - edge: (alias, arguments), - }); - } - - dependencies - } - - fn config_at_url(&mut self, url: &Url) -> Result { - let config_url = url - .join("fe.toml") - .map_err(|_| "failed to locate fe.toml for dependency".to_string())?; - - let file = self - .db - .workspace() - .get(self.db, &config_url) - .ok_or_else(|| format!("Missing config at {config_url}"))?; - Config::parse(file.text(self.db)) - .map_err(|err| format!("Failed to parse {config_url}: {err}")) - } - - fn ensure_phantom_lib_file(&mut self, ingot_url: &Url) { - let lib_url = match ingot_url.join("src/lib.fe") { - Ok(url) => url, - Err(_) => return, - }; - - if self.db.workspace().get(self.db, &lib_url).is_some() { - return; - } - - // If `src/lib.fe` exists on disk but couldn't be read, don't hide that error by - // synthesizing a replacement. - if lib_url - .to_file_path() - .ok() - .is_some_and(|path| path.is_file()) - { - return; - } - - let src_prefix = match ingot_url.join("src/") { - Ok(url) => url, - Err(_) => return, - }; - - let has_sources = self - .db - .workspace() - .items_at_base(self.db, src_prefix) - .iter() - .any(|(url, _)| url.as_str().ends_with(".fe")); - if !has_sources { - return; - } - - self.db - .workspace() - .touch(self.db, lib_url, Some(String::new())); - } - - fn effective_metadata_for_ingot( - &mut self, - ingot_url: &Url, - ) -> Option<(Option, Option)> { - let config = self.config_at_url(ingot_url).ok()?; - match config { - Config::Ingot(ingot) => { - let name = ingot.metadata.name.clone(); - let version = ingot - .metadata - .version - .clone() - .or_else(|| workspace_version_for_member(self.db, ingot_url)); - Some((name, version)) - } - Config::Workspace(_) => None, - } - } -} - -impl<'a> ResolutionHandler for IngotHandler<'a> { - type Item = Result< - GraphNodeOutcome, - resolver::ingot::IngotResolutionError, - >; - - fn on_resolution_diagnostic(&mut self, diagnostic: IngotResolutionDiagnostic) { - match diagnostic { - IngotResolutionDiagnostic::Files(diagnostic) => { - self.report_warn(IngotInitDiagnostics::FileError { diagnostic }); - } - } - } - - fn on_resolution_event(&mut self, event: IngotResolutionEvent) { - match event { - IngotResolutionEvent::FilesResolved { files } => { - self.record_files_owned(files); - } - IngotResolutionEvent::RemoteCheckoutStart { description } => { - tracing::info!(target: "resolver", "Checking out {description}"); - } - IngotResolutionEvent::RemoteCheckoutComplete { - ingot_url, - reused_checkout, - description, - .. - } => { - if reused_checkout { - if self.reported_checkouts.contains(&description) { - return; - } - tracing::debug!(target: "resolver", "Using cached checkout {}", ingot_url); - return; - } - tracing::info!(target: "resolver", "Checked out {}", ingot_url); - } - } - } - - fn on_resolution_error( - &mut self, - description: &IngotDescriptor, - error: resolver::ingot::IngotResolutionError, - ) { - if matches!( - description, - IngotDescriptor::Remote(_) | IngotDescriptor::RemoteByName { .. } - ) { - tracing::error!( - target: "resolver", - "Failed to check out {description}: {error}" - ); - } - - if let resolver::ingot::IngotResolutionError::Selection(selection) = &error - && let Some(contexts) = self.dependency_contexts.get(description).cloned() - { - use resolver::ingot::IngotSelectionError; - - for context in contexts { - match selection.as_ref() { - IngotSelectionError::NoResolvedIngotByMetadata { name, version } => { - self.report_error(IngotInitDiagnostics::IngotByNameResolutionFailed { - ingot_url: context.from_ingot_url.clone(), - dependency: context.dependency.clone(), - name: name.clone(), - version: version.clone(), - }); - } - IngotSelectionError::WorkspacePathRequiresSelection { workspace_url } => { - self.report_error(IngotInitDiagnostics::WorkspacePathRequiresSelection { - ingot_url: context.from_ingot_url.clone(), - dependency: context.dependency.clone(), - workspace_url: workspace_url.clone(), - }); - } - IngotSelectionError::WorkspaceMemberNotFound { - workspace_url, - name, - } - | IngotSelectionError::WorkspaceMemberDuplicate { - workspace_url, - name, - } => { - self.report_error(IngotInitDiagnostics::WorkspaceMemberResolutionFailed { - ingot_url: context.from_ingot_url.clone(), - dependency: context.dependency.clone(), - error: format!( - "No workspace member named \"{name}\" found in {workspace_url}" - ), - }); - } - IngotSelectionError::DependencyMetadataMismatch { - dependency_url, - expected_name, - found_name, - found_version, - } => { - self.report_error(IngotInitDiagnostics::DependencyMetadataMismatch { - ingot_url: context.from_ingot_url.clone(), - dependency: context.dependency.clone(), - dependency_url: dependency_url.clone(), - expected_name: expected_name.clone(), - expected_version: None, - found_name: found_name.clone(), - found_version: found_version.clone(), - }); - } - IngotSelectionError::MissingConfig { config_url } => { - self.report_error(IngotInitDiagnostics::WorkspaceMemberResolutionFailed { - ingot_url: context.from_ingot_url.clone(), - dependency: context.dependency.clone(), - error: format!("Missing config at {config_url}"), - }); - } - IngotSelectionError::ConfigParseError { config_url, error } => { - self.report_error(IngotInitDiagnostics::WorkspaceMemberResolutionFailed { - ingot_url: context.from_ingot_url.clone(), - dependency: context.dependency.clone(), - error: format!("Failed to parse {config_url}: {error}"), - }); - } - } - } - return; - } - - match description { - IngotDescriptor::Local(target) => { - self.report_error(IngotInitDiagnostics::UnresolvableIngotDependency { - target: target.clone(), - error, - }) - } - IngotDescriptor::LocalByName { base, .. } => { - self.report_error(IngotInitDiagnostics::UnresolvableIngotDependency { - target: base.clone(), - error, - }) - } - IngotDescriptor::ByNameVersion { .. } => { - tracing::error!( - target: "resolver", - "Unhandled ByNameVersion resolution error for {description}: {error}" - ); - } - IngotDescriptor::Remote(target) => { - self.report_error(IngotInitDiagnostics::UnresolvableRemoteDependency { - target: target.clone(), - error, - }) - } - IngotDescriptor::RemoteByName { base, .. } => { - self.report_error(IngotInitDiagnostics::UnresolvableRemoteDependency { - target: base.clone(), - error, - }) - } - }; - } - - fn handle_resolution( - &mut self, - descriptor: &IngotDescriptor, - resource: IngotResource, - ) -> Self::Item { - let IngotResource { - ingot_url, - origin, - workspace_root, - config_probe, - files_error, - } = resource; - - if let Some(workspace_root) = &workspace_root { - self.db.dependency_graph().register_workspace_member_root( - self.db, - workspace_root, - &ingot_url, - ); - } - - self.register_remote_mapping(&ingot_url, &origin); - - if let Some(error) = files_error { - match &origin { - IngotOrigin::Local => { - self.report_error(IngotInitDiagnostics::UnresolvableIngotDependency { - target: ingot_url.clone(), - error: resolver::ingot::IngotResolutionError::Files(error), - }); - } - IngotOrigin::Remote { .. } => { - self.report_error(IngotInitDiagnostics::RemoteFileError { - ingot_url: ingot_url.clone(), - error: error.to_string(), - }); - } - } - self.ingot_urls - .insert(descriptor.clone(), ingot_url.clone()); - return Ok(GraphNodeOutcome { - canonical_description: descriptor.clone(), - aliases: Vec::new(), - forward_nodes: Vec::new(), - }); - } - - if !config_probe.has_config() { - if matches!(&origin, IngotOrigin::Remote { .. }) { - self.report_error(IngotInitDiagnostics::RemoteFileError { - ingot_url: ingot_url.clone(), - error: "Remote ingot is missing fe.toml".into(), - }); - } - self.ingot_urls - .insert(descriptor.clone(), ingot_url.clone()); - return Ok(GraphNodeOutcome { - canonical_description: descriptor.clone(), - aliases: Vec::new(), - forward_nodes: Vec::new(), - }); - } - - let config = match self.config_at_url(&ingot_url) { - Ok(config) => config, - Err(error) => { - match &origin { - IngotOrigin::Local => { - if config_probe.kind_hint() == Some(ConfigKind::Workspace) { - self.report_error(IngotInitDiagnostics::WorkspaceConfigParseError { - workspace_url: ingot_url.clone(), - error, - }); - } else { - self.report_error(IngotInitDiagnostics::ConfigParseError { - ingot_url: ingot_url.clone(), - error, - }); - } - } - IngotOrigin::Remote { .. } => { - self.report_error(IngotInitDiagnostics::RemoteConfigParseError { - ingot_url: ingot_url.clone(), - error, - }); - } - } - self.ingot_urls - .insert(descriptor.clone(), ingot_url.clone()); - return Ok(GraphNodeOutcome { - canonical_description: descriptor.clone(), - aliases: Vec::new(), - forward_nodes: Vec::new(), - }); - } - }; - - if let Config::Workspace(workspace_config) = config { - if self.dependency_contexts.contains_key(descriptor) { - return Err(resolver::ingot::IngotResolutionError::Selection(Box::new( - resolver::ingot::IngotSelectionError::WorkspacePathRequiresSelection { - workspace_url: ingot_url.clone(), - }, - ))); - } - - self.ingot_urls - .insert(descriptor.clone(), ingot_url.clone()); - return Ok(GraphNodeOutcome { - canonical_description: descriptor.clone(), - aliases: Vec::new(), - forward_nodes: self.handle_workspace_config( - &IngotResource { - ingot_url, - origin, - workspace_root, - config_probe, - files_error: None, - }, - *workspace_config, - ), - }); - } - - let Config::Ingot(mut config) = config else { - self.ingot_urls - .insert(descriptor.clone(), ingot_url.clone()); - return Ok(GraphNodeOutcome { - canonical_description: descriptor.clone(), - aliases: Vec::new(), - forward_nodes: Vec::new(), - }); - }; - - let mut diagnostics = config.diagnostics.clone(); - - if config.metadata.version.is_none() - && let Some(version) = workspace_version_for_member(self.db, &ingot_url) - { - config.metadata.version = Some(version); - diagnostics.retain(|diag| !matches!(diag, ConfigDiagnostic::MissingVersion)); - } - - if !diagnostics.is_empty() { - match &origin { - IngotOrigin::Local => self.report_warn(IngotInitDiagnostics::ConfigDiagnostics { - ingot_url: ingot_url.clone(), - diagnostics, - }), - IngotOrigin::Remote { .. } => { - self.report_warn(IngotInitDiagnostics::RemoteConfigDiagnostics { - ingot_url: ingot_url.clone(), - diagnostics, - }) - } - }; - } - - self.ensure_phantom_lib_file(&ingot_url); - - self.db.dependency_graph().ensure_node(self.db, &ingot_url); - - if let Some((expected_name, expected_version)) = self - .db - .dependency_graph() - .expected_member_metadata_for(self.db, &ingot_url) - && (config.metadata.name.as_ref() != Some(&expected_name) - || config.metadata.version.as_ref() != Some(&expected_version)) - { - self.report_error(IngotInitDiagnostics::WorkspaceMemberMetadataMismatch { - ingot_url: ingot_url.clone(), - expected_name, - expected_version, - found_name: config.metadata.name.clone(), - found_version: config.metadata.version.clone(), - }); - self.ingot_urls - .insert(descriptor.clone(), ingot_url.clone()); - return Ok(GraphNodeOutcome { - canonical_description: descriptor.clone(), - aliases: Vec::new(), - forward_nodes: Vec::new(), - }); - } - - let mut aliases = Vec::new(); - if let (Some(name), Some(version)) = ( - config.metadata.name.clone(), - config.metadata.version.clone(), - ) { - self.db.dependency_graph().register_ingot_metadata( - self.db, - &ingot_url, - name.clone(), - version.clone(), - ); - aliases.push(IngotDescriptor::ByNameVersion { name, version }); - } - - let workspace_member_alias = workspace_root.as_ref().and_then(|workspace_root| { - config.metadata.name.clone().map(|name| match &origin { - IngotOrigin::Local => IngotDescriptor::LocalByName { - base: workspace_root.clone(), - name, - }, - IngotOrigin::Remote { - description, - checkout_path, - .. - } => { - let mut base = - GitDescription::new(description.source.clone(), description.rev.clone()); - if let Ok(relative) = - relative_path_within_checkout(checkout_path.as_path(), workspace_root) - && let Some(path) = relative - { - base = base.with_path(path); - } - IngotDescriptor::RemoteByName { base, name } - } - }) - }); - - let canonical_description = workspace_member_alias - .clone() - .unwrap_or_else(|| descriptor.clone()); - - let concrete_description = match &origin { - IngotOrigin::Local => IngotDescriptor::Local(ingot_url.clone()), - IngotOrigin::Remote { description, .. } => IngotDescriptor::Remote(description.clone()), - }; - if concrete_description != canonical_description { - aliases.push(concrete_description); - } - - let mut dependencies = Vec::new(); - for dependency in config.dependencies(&ingot_url) { - if let Some(converted) = - self.convert_dependency(&ingot_url, &origin, workspace_root.as_ref(), dependency) - { - let priority = match &converted.0 { - IngotDescriptor::Local(_) | IngotDescriptor::LocalByName { .. } => { - IngotPriority::local() - } - IngotDescriptor::Remote(_) - | IngotDescriptor::RemoteByName { .. } - | IngotDescriptor::ByNameVersion { .. } => IngotPriority::remote(), - }; - dependencies.push(UnresolvedNode { - priority, - description: converted.0, - edge: converted.1, - }); - } - } - - self.ingot_urls - .insert(canonical_description.clone(), ingot_url.clone()); - - Ok(GraphNodeOutcome { - canonical_description, - aliases, - forward_nodes: dependencies, - }) - } -} - -impl<'a> ResolutionHandler for IngotHandler<'a> { - type Item = resolver::files::FilesResource; - - fn on_resolution_diagnostic(&mut self, diagnostic: resolver::files::FilesResolutionDiagnostic) { - self.report_warn(IngotInitDiagnostics::FileError { diagnostic }); - } - - fn handle_resolution( - &mut self, - _description: &Url, - resource: resolver::files::FilesResource, - ) -> Self::Item { - self.record_files(&resource.files); - resource - } -} - -impl<'a> - GraphResolutionHandler< - IngotDescriptor, - DiGraph, - > for IngotHandler<'a> -{ - type Item = (); - - fn handle_graph_resolution( - &mut self, - _descriptor: &IngotDescriptor, - graph: DiGraph, - ) -> Self::Item { - let mut registered_nodes = HashSet::new(); - for node_idx in graph.node_indices() { - if let Some(url) = self.ingot_urls.get(&graph[node_idx]) - && registered_nodes.insert(url.clone()) - { - self.db.dependency_graph().ensure_node(self.db, url); - } - } - - let mut registered_edges = HashSet::new(); - for edge in graph.edge_references() { - if let (Some(from_url), Some(to_url)) = ( - self.ingot_urls.get(&graph[edge.source()]), - self.ingot_urls.get(&graph[edge.target()]), - ) { - let from_url = from_url.clone(); - let to_url = to_url.clone(); - let (alias, arguments) = edge.weight(); - if registered_edges.insert(( - from_url.clone(), - to_url.clone(), - alias.clone(), - arguments.clone(), - )) { - if let Some(expected_version) = arguments.version.clone() - && let Some((found_name, found_version)) = - self.effective_metadata_for_ingot(&to_url) - && found_version.as_ref() != Some(&expected_version) - { - let expected_name = arguments - .name - .clone() - .or_else(|| found_name.clone()) - .unwrap_or_else(|| alias.clone()); - self.report_error(IngotInitDiagnostics::DependencyMetadataMismatch { - ingot_url: from_url.clone(), - dependency: alias.clone(), - dependency_url: to_url.clone(), - expected_name, - expected_version: Some(expected_version), - found_name, - found_version, - }); - } - self.db.dependency_graph().add_dependency( - self.db, - &from_url, - &to_url, - alias.clone(), - arguments.clone(), - ); - } - } - } - } -} - -fn relative_path_within_checkout( - checkout_path: &Utf8Path, - target_url: &Url, -) -> Result, String> { - let path_buf = target_url - .to_file_path() - .map_err(|_| "target URL is not a file URL".to_string())?; - let utf8_path = Utf8PathBuf::from_path_buf(path_buf) - .map_err(|_| "non UTF-8 path encountered in remote dependency".to_string())?; - let relative = utf8_path - .strip_prefix(checkout_path) - .map_err(|_| "path escapes the checked-out repository".to_string())?; - if relative.as_str().is_empty() { - Ok(None) - } else { - Ok(Some(relative.to_owned())) - } -} diff --git a/crates/driver/src/lib.rs b/crates/driver/src/lib.rs deleted file mode 100644 index 516b3ed016..0000000000 --- a/crates/driver/src/lib.rs +++ /dev/null @@ -1,552 +0,0 @@ -#![allow(clippy::print_stderr)] - -pub mod cli_target; -pub mod db; -pub mod diagnostics; -pub mod files; -mod ingot_handler; - -pub use common::dependencies::DependencyTree; - -use std::collections::{HashMap, HashSet}; - -use camino::Utf8PathBuf; -use common::{ - InputDb, - cache::remote_git_cache_dir, - config::WorkspaceMemberSelection, - ingot::Version, - stdlib::{HasBuiltinCore, HasBuiltinStd}, -}; -pub use db::DriverDataBase; -use ingot_handler::IngotHandler; -pub use mir::{MirDiagnosticsMode, MirDiagnosticsOutput}; -use smol_str::SmolStr; - -use hir::analysis::core_requirements; -use hir::hir_def::TopLevelMod; -pub use resolver::workspace::{ExpandedWorkspaceMember, expand_workspace_members}; -use resolver::{ - files::FilesResolutionDiagnostic, - git::{GitDescription, GitResolver}, - graph::{GraphResolver, GraphResolverImpl}, - ingot::{IngotDescriptor, IngotResolutionError, IngotResolverImpl, RemoteProgress}, -}; -use url::Url; - -struct LoggingProgress; - -impl RemoteProgress for LoggingProgress { - fn start(&mut self, description: &GitDescription) { - tracing::info!(target: "resolver", "Resolving remote dependency {}", description); - } - - fn success(&mut self, _description: &GitDescription, ingot_url: &Url) { - tracing::info!(target: "resolver", "Resolved {}", ingot_url); - } - - fn error(&mut self, description: &GitDescription, error: &IngotResolutionError) { - tracing::warn!( - target: "resolver", - "Failed to resolve {}: {}", - description, - error - ); - } -} - -fn ingot_resolver(remote_checkout_root: Utf8PathBuf) -> IngotResolverImpl { - let git_resolver = GitResolver::new(remote_checkout_root); - IngotResolverImpl::new(git_resolver).with_progress(Box::new(LoggingProgress)) -} - -pub fn init_ingot(db: &mut DriverDataBase, ingot_url: &Url) -> bool { - init_ingot_graph(db, ingot_url) -} - -pub fn check_library_requirements(db: &DriverDataBase) -> Vec { - let mut missing = Vec::new(); - - let core = db.builtin_core(); - if let Ok(core_file) = core.root_file(db) { - let top_mod = db.top_mod(core_file); - missing.extend( - core_requirements::check_core_requirements(db, top_mod.scope(), core.kind(db)) - .into_iter() - .map(|req| req.to_string()), - ); - } else { - missing.push("missing required core ingot".to_string()); - } - - let std_ingot = db.builtin_std(); - if let Ok(std_file) = std_ingot.root_file(db) { - let top_mod = db.top_mod(std_file); - missing.extend( - core_requirements::check_std_type_requirements(db, top_mod.scope(), std_ingot.kind(db)) - .into_iter() - .map(|req| req.to_string()), - ); - } else { - missing.push("missing required std ingot".to_string()); - } - - missing -} - -fn init_ingot_graph(db: &mut DriverDataBase, ingot_url: &Url) -> bool { - tracing::info!(target: "resolver", "Starting ingot resolution for: {}", ingot_url); - let checkout_root = remote_checkout_root(ingot_url); - let mut handler = IngotHandler::new(db); - let mut ingot_graph_resolver = GraphResolverImpl::new(ingot_resolver(checkout_root)); - - // Root ingot resolution should never fail since directory existence is validated earlier. - // If it fails, it indicates a bug in the resolver or an unexpected system condition. - if let Err(err) = - ingot_graph_resolver.graph_resolve(&mut handler, &IngotDescriptor::Local(ingot_url.clone())) - { - panic!( - "Unexpected failure resolving root ingot at {ingot_url}: {err:?}. This indicates a bug in the resolver since directory existence is validated before calling init_ingot." - ); - } - - let mut had_diagnostics = handler.had_diagnostics(); - - // Check for cycles after graph resolution (now that handler is dropped) - let cyclic_subgraph = db.dependency_graph().cyclic_subgraph(db); - - // Add cycle diagnostics - single comprehensive diagnostic if any cycles exist - if cyclic_subgraph.node_count() > 0 { - // Get configs for all nodes in the cyclic subgraph - let mut configs = HashMap::new(); - for node_idx in cyclic_subgraph.node_indices() { - let url = &cyclic_subgraph[node_idx]; - if let Some(ingot) = db.workspace().containing_ingot(db, url.clone()) - && let Some(config) = ingot.config(db) - { - configs.insert(url.clone(), config); - } - } - - // The root ingot should be part of any detected cycles since we're analyzing its dependencies - if !cyclic_subgraph - .node_indices() - .any(|idx| cyclic_subgraph[idx] == *ingot_url) - { - panic!( - "Root ingot {ingot_url} not found in cyclic subgraph. This indicates a bug in cycle detection logic." - ); - } - - // Generate the tree display string - let tree_display = - DependencyTree::from_parts(cyclic_subgraph, ingot_url.clone(), configs, HashSet::new()) - .display_to(common::color::ColorTarget::Stderr); - - let diag = IngotInitDiagnostics::IngotDependencyCycle { tree_display }; - tracing::warn!(target: "resolver", "{diag}"); - eprintln!("Error: {diag}"); - had_diagnostics = true; - } - - if !had_diagnostics { - tracing::info!(target: "resolver", "Ingot resolution completed successfully for: {}", ingot_url); - } else { - tracing::warn!(target: "resolver", "Ingot resolution completed with diagnostics for: {}", ingot_url); - } - - had_diagnostics -} - -pub fn init_workspace(db: &mut DriverDataBase, workspace_url: &Url) -> bool { - init_ingot_graph(db, workspace_url) -} - -pub fn find_ingot_by_metadata(db: &DriverDataBase, name: &str, version: &Version) -> Option { - db.dependency_graph() - .ingot_by_name_version(db, &SmolStr::new(name), version) -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct WorkspaceMember { - pub url: Url, - pub path: Utf8PathBuf, - pub name: Option, - pub version: Option, -} - -fn _dump_scope_graph(db: &DriverDataBase, top_mod: TopLevelMod) -> String { - let mut s = vec![]; - top_mod.scope_graph(db).write_as_dot(db, &mut s).unwrap(); - String::from_utf8(s).unwrap() -} - -pub fn workspace_member_urls( - workspace: &common::config::WorkspaceSettings, - workspace_url: &Url, -) -> Result, String> { - let members = workspace_members(workspace, workspace_url)?; - Ok(members - .into_iter() - .filter(|member| member.url != *workspace_url) - .map(|member| member.url) - .collect()) -} - -pub fn workspace_members( - workspace: &common::config::WorkspaceSettings, - workspace_url: &Url, -) -> Result, String> { - let selection = if workspace.default_members.is_some() { - WorkspaceMemberSelection::DefaultOnly - } else { - WorkspaceMemberSelection::All - }; - let members = expand_workspace_members(workspace, workspace_url, selection)?; - Ok(members - .into_iter() - .filter(|member| member.url != *workspace_url) - .map(|member| WorkspaceMember { - url: member.url, - path: member.path, - name: member.name, - version: member.version, - }) - .collect()) -} - -// Maybe the driver should eventually only support WASI? - -#[derive(Debug)] -pub enum IngotInitDiagnostics { - UnresolvableIngotDependency { - target: Url, - error: IngotResolutionError, - }, - IngotDependencyCycle { - tree_display: String, - }, - FileError { - diagnostic: FilesResolutionDiagnostic, - }, - ConfigParseError { - ingot_url: Url, - error: String, - }, - ConfigDiagnostics { - ingot_url: Url, - diagnostics: Vec, - }, - WorkspaceConfigParseError { - workspace_url: Url, - error: String, - }, - WorkspaceDiagnostics { - workspace_url: Url, - diagnostics: Vec, - }, - WorkspaceMembersError { - workspace_url: Url, - error: String, - }, - WorkspaceMemberDuplicate { - workspace_url: Url, - name: SmolStr, - version: Option, - }, - WorkspaceMemberMetadataMismatch { - ingot_url: Url, - expected_name: SmolStr, - expected_version: Version, - found_name: Option, - found_version: Option, - }, - WorkspaceDependencyAliasConflict { - workspace_url: Url, - alias: SmolStr, - }, - WorkspacePathRequiresSelection { - ingot_url: Url, - dependency: SmolStr, - workspace_url: Url, - }, - WorkspaceNameLookupUnavailable { - ingot_url: Url, - dependency: SmolStr, - }, - DependencyMetadataMismatch { - ingot_url: Url, - dependency: SmolStr, - dependency_url: Url, - expected_name: SmolStr, - expected_version: Option, - found_name: Option, - found_version: Option, - }, - WorkspaceMemberResolutionFailed { - ingot_url: Url, - dependency: SmolStr, - error: String, - }, - IngotByNameResolutionFailed { - ingot_url: Url, - dependency: SmolStr, - name: SmolStr, - version: Version, - }, - RemoteFileError { - ingot_url: Url, - error: String, - }, - RemoteConfigParseError { - ingot_url: Url, - error: String, - }, - RemoteConfigDiagnostics { - ingot_url: Url, - diagnostics: Vec, - }, - UnresolvableRemoteDependency { - target: GitDescription, - error: IngotResolutionError, - }, - RemotePathResolutionError { - ingot_url: Url, - dependency: SmolStr, - error: String, - }, -} - -fn format_metadata(name: &Option, version: &Option) -> String { - let name = name - .as_ref() - .map(ToString::to_string) - .unwrap_or_else(|| "".to_string()); - let version = version - .as_ref() - .map(ToString::to_string) - .unwrap_or_else(|| "".to_string()); - format!("{name}@{version}") -} - -impl std::fmt::Display for IngotInitDiagnostics { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - IngotInitDiagnostics::UnresolvableIngotDependency { target, error } => { - write!(f, "Failed to resolve ingot dependency '{target}': {error}") - } - IngotInitDiagnostics::IngotDependencyCycle { tree_display } => { - write!( - f, - "Detected cycle(s) in ingot dependencies:\n\n{tree_display}" - ) - } - IngotInitDiagnostics::FileError { diagnostic } => { - write!(f, "File resolution failed: {diagnostic}") - } - IngotInitDiagnostics::ConfigParseError { ingot_url, error } => { - write!(f, "Invalid fe.toml in ingot {ingot_url}: {error}") - } - IngotInitDiagnostics::ConfigDiagnostics { - ingot_url, - diagnostics, - } => { - if diagnostics.len() == 1 { - write!( - f, - "Invalid fe.toml in ingot {ingot_url}: {}", - diagnostics[0] - ) - } else { - writeln!(f, "Invalid fe.toml in ingot {ingot_url}:")?; - for diagnostic in diagnostics { - writeln!(f, " • {diagnostic}")?; - } - Ok(()) - } - } - IngotInitDiagnostics::WorkspaceConfigParseError { - workspace_url, - error, - } => { - write!(f, "Invalid workspace fe.toml in {workspace_url}: {error}") - } - IngotInitDiagnostics::WorkspaceDiagnostics { - workspace_url, - diagnostics, - } => { - if diagnostics.len() == 1 { - write!( - f, - "Invalid workspace fe.toml in {workspace_url}: {}", - diagnostics[0] - ) - } else { - writeln!(f, "Invalid workspace fe.toml in {workspace_url}:")?; - for diagnostic in diagnostics { - writeln!(f, " • {diagnostic}")?; - } - Ok(()) - } - } - IngotInitDiagnostics::WorkspaceMembersError { - workspace_url, - error, - } => { - write!( - f, - "Failed to resolve workspace members in {workspace_url}: {error}" - ) - } - IngotInitDiagnostics::WorkspaceMemberDuplicate { - workspace_url, - name, - version, - } => { - let _ = version; - write!( - f, - "Workspace member {name} is duplicated in {workspace_url}" - ) - } - IngotInitDiagnostics::WorkspaceMemberMetadataMismatch { - ingot_url, - expected_name, - expected_version, - found_name, - found_version, - } => { - write!( - f, - "Workspace member {expected_name}@{expected_version} in {ingot_url} has mismatched metadata (found {})", - format_metadata(found_name, found_version) - ) - } - IngotInitDiagnostics::WorkspaceDependencyAliasConflict { - workspace_url, - alias, - } => { - write!( - f, - "Workspace dependency alias '{alias}' conflicts with a workspace member name in {workspace_url}" - ) - } - IngotInitDiagnostics::WorkspacePathRequiresSelection { - ingot_url, - dependency, - workspace_url, - } => { - write!( - f, - "Dependency '{dependency}' in {ingot_url} points to a workspace at {workspace_url}; provide an ingot path or a name/version" - ) - } - IngotInitDiagnostics::WorkspaceNameLookupUnavailable { - ingot_url, - dependency, - } => { - write!( - f, - "Dependency '{dependency}' in {ingot_url} uses name-only lookup outside a workspace" - ) - } - IngotInitDiagnostics::DependencyMetadataMismatch { - ingot_url, - dependency, - dependency_url, - expected_name, - expected_version, - found_name, - found_version, - } => { - if let Some(expected_version) = expected_version { - write!( - f, - "Dependency '{dependency}' in {ingot_url} expected {expected_name}@{expected_version} at {dependency_url} but found {}", - format_metadata(found_name, found_version) - ) - } else { - write!( - f, - "Dependency '{dependency}' in {ingot_url} expected {expected_name} at {dependency_url} but found {}", - format_metadata(found_name, found_version) - ) - } - } - IngotInitDiagnostics::WorkspaceMemberResolutionFailed { - ingot_url, - dependency, - error, - } => { - write!( - f, - "Failed to resolve workspace member for '{dependency}' in {ingot_url}: {error}" - ) - } - IngotInitDiagnostics::IngotByNameResolutionFailed { - ingot_url, - dependency, - name, - version, - } => { - write!( - f, - "Dependency '{dependency}' in {ingot_url} requested ingot {name}@{version} but it was not found in the workspace registry" - ) - } - IngotInitDiagnostics::RemoteFileError { ingot_url, error } => { - write!(f, "Remote file operation failed at {ingot_url}: {error}") - } - IngotInitDiagnostics::RemoteConfigParseError { ingot_url, error } => { - write!(f, "Invalid remote fe.toml in {ingot_url}: {error}") - } - IngotInitDiagnostics::RemoteConfigDiagnostics { - ingot_url, - diagnostics, - } => { - if diagnostics.len() == 1 { - write!( - f, - "Invalid remote fe.toml in {ingot_url}: {}", - diagnostics[0] - ) - } else { - writeln!(f, "Invalid remote fe.toml in {ingot_url}:")?; - for diagnostic in diagnostics { - writeln!(f, " • {diagnostic}")?; - } - Ok(()) - } - } - IngotInitDiagnostics::UnresolvableRemoteDependency { target, error } => { - write!(f, "Failed to resolve remote dependency '{target}': {error}") - } - IngotInitDiagnostics::RemotePathResolutionError { - ingot_url, - dependency, - error, - } => { - write!( - f, - "Remote dependency '{dependency}' in {ingot_url} points outside the repository: {error}" - ) - } - } - } -} - -pub(crate) fn remote_checkout_root(ingot_url: &Url) -> Utf8PathBuf { - if let Some(root) = remote_git_cache_dir() { - return root; - } - - let mut ingot_path = Utf8PathBuf::from_path_buf( - ingot_url - .to_file_path() - .expect("ingot URL should map to a local path"), - ) - .expect("ingot path should be valid UTF-8"); - ingot_path.push(".fe"); - ingot_path.push("git"); - ingot_path -} diff --git a/crates/driver/tests/workspace_resolution.rs b/crates/driver/tests/workspace_resolution.rs deleted file mode 100644 index b33bc86ea6..0000000000 --- a/crates/driver/tests/workspace_resolution.rs +++ /dev/null @@ -1,995 +0,0 @@ -use std::fs; -use std::process::Command; - -use camino::Utf8PathBuf; -use common::InputDb; -use common::cache::remote_git_cache_dir; -use common::file::IngotFileKind; -use fe_driver::{DriverDataBase, init_ingot, init_workspace}; -use resolver::git::{GitDescription, GitResolver}; -use tempfile::TempDir; -use url::Url; - -fn write_file(path: &Utf8PathBuf, content: &str) { - if let Some(parent) = path.parent() { - fs::create_dir_all(parent.as_std_path()).unwrap(); - } - fs::write(path.as_std_path(), content).unwrap(); -} - -fn git_commit(repo: &Utf8PathBuf, message: &str) -> String { - Command::new("git") - .arg("-C") - .arg(repo.as_std_path()) - .arg("add") - .arg(".") - .status() - .expect("git add") - .success() - .then_some(()) - .expect("git add success"); - Command::new("git") - .arg("-C") - .arg(repo.as_std_path()) - .args(["commit", "-m", message]) - .status() - .expect("git commit") - .success() - .then_some(()) - .expect("git commit success"); - - let output = Command::new("git") - .arg("-C") - .arg(repo.as_std_path()) - .args(["rev-parse", "HEAD"]) - .output() - .expect("git rev-parse"); - assert!(output.status.success()); - String::from_utf8_lossy(&output.stdout).trim().to_string() -} - -static REMOTE_CACHE_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(()); - -fn with_remote_cache_dir(cache_root: &Utf8PathBuf, f: impl FnOnce() -> T) -> T { - let _guard = REMOTE_CACHE_LOCK.lock().expect("remote cache lock"); - let previous = std::env::var("FE_REMOTE_CACHE_DIR").ok(); - unsafe { - std::env::set_var("FE_REMOTE_CACHE_DIR", cache_root.as_str()); - } - let result = f(); - unsafe { - match previous { - Some(value) => std::env::set_var("FE_REMOTE_CACHE_DIR", value), - None => std::env::remove_var("FE_REMOTE_CACHE_DIR"), - } - } - result -} - -#[cfg(unix)] -#[test] -fn resolves_workspace_member_by_name_local_through_symlinked_workspace_root() { - use std::os::unix::fs::symlink; - - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let workspace_link = root.join("workspace_link"); - let ingot_a = workspace_root.join("ingots/a"); - let ingot_b = workspace_root.join("ingots/b"); - - fs::create_dir_all(workspace_root.as_std_path()).unwrap(); - symlink(workspace_root.as_std_path(), workspace_link.as_std_path()).unwrap(); - - write_file( - &workspace_root.join("fe.toml"), - r#" -[workspace] -name = "local-workspace" -version = "0.1.0" -members = [ - { path = "ingots/a", name = "a", version = "0.1.0" }, - { path = "ingots/b", name = "b", version = "0.1.0" }, -] -"#, - ); - - write_file( - &ingot_a.join("fe.toml"), - r#" -[ingot] -name = "a" -version = "0.1.0" - -[dependencies] -b = true -"#, - ); - write_file(&ingot_a.join("src/lib.fe"), "pub fn main() {}\n"); - - write_file( - &ingot_b.join("fe.toml"), - r#" -[ingot] -name = "b" -version = "0.1.0" -"#, - ); - write_file(&ingot_b.join("src/lib.fe"), "pub fn main() {}\n"); - - let workspace_url = - Url::from_directory_path(workspace_link.as_std_path()).expect("workspace url"); - let ingot_a_url = Url::from_directory_path(workspace_link.join("ingots/a").as_std_path()) - .expect("ingot a url"); - let ingot_b_url = Url::from_directory_path(workspace_link.join("ingots/b").as_std_path()) - .expect("ingot b url"); - - let mut db = DriverDataBase::default(); - let had_diagnostics = init_workspace(&mut db, &workspace_url); - assert!(!had_diagnostics, "unexpected diagnostics"); - - let deps = db.dependency_graph().dependency_urls(&db, &ingot_a_url); - assert!(deps.contains(&ingot_b_url)); -} - -#[test] -fn resolves_workspace_member_by_name_local() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let ingot_a = workspace_root.join("ingots/a"); - let ingot_b = workspace_root.join("ingots/b"); - - write_file( - &workspace_root.join("fe.toml"), - r#" -[workspace] -name = "local-workspace" -version = "0.1.0" -members = [ - { path = "ingots/a", name = "a", version = "0.1.0" }, - { path = "ingots/b", name = "b", version = "0.1.0" }, -] -"#, - ); - - write_file( - &ingot_a.join("fe.toml"), - r#" -[ingot] -name = "a" -version = "0.1.0" - -[dependencies] -b = true -"#, - ); - write_file(&ingot_a.join("src/lib.fe"), "pub fn main() {}\n"); - - write_file( - &ingot_b.join("fe.toml"), - r#" -[ingot] -name = "b" -version = "0.1.0" -"#, - ); - write_file(&ingot_b.join("src/lib.fe"), "pub fn main() {}\n"); - - let workspace_url = - Url::from_directory_path(workspace_root.as_std_path()).expect("workspace url"); - let ingot_a_url = Url::from_directory_path(ingot_a.as_std_path()).expect("ingot a url"); - let ingot_b_url = Url::from_directory_path(ingot_b.as_std_path()).expect("ingot b url"); - - let mut db = DriverDataBase::default(); - let had_diagnostics = init_workspace(&mut db, &workspace_url); - assert!(!had_diagnostics, "unexpected diagnostics"); - - let deps = db.dependency_graph().dependency_urls(&db, &ingot_a_url); - assert!(deps.contains(&ingot_b_url)); -} - -#[test] -fn resolves_workspace_member_by_version_string_local() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let ingot_a = workspace_root.join("ingots/a"); - let ingot_b = workspace_root.join("ingots/b"); - - write_file( - &workspace_root.join("fe.toml"), - r#" -[workspace] -name = "local-workspace" -version = "0.1.0" -members = [ - { path = "ingots/a", name = "a", version = "0.1.0" }, - { path = "ingots/b", name = "b", version = "0.1.0" }, -] -"#, - ); - - write_file( - &ingot_a.join("fe.toml"), - r#" -[ingot] -name = "a" -version = "0.1.0" - -[dependencies] -b = "0.1.0" -"#, - ); - write_file(&ingot_a.join("src/lib.fe"), "pub fn main() {}\n"); - - write_file( - &ingot_b.join("fe.toml"), - r#" -[ingot] -name = "b" -version = "0.1.0" -"#, - ); - write_file(&ingot_b.join("src/lib.fe"), "pub fn main() {}\n"); - - let workspace_url = - Url::from_directory_path(workspace_root.as_std_path()).expect("workspace url"); - let ingot_a_url = Url::from_directory_path(ingot_a.as_std_path()).expect("ingot a url"); - let ingot_b_url = Url::from_directory_path(ingot_b.as_std_path()).expect("ingot b url"); - - let mut db = DriverDataBase::default(); - let had_diagnostics = init_workspace(&mut db, &workspace_url); - assert!(!had_diagnostics, "unexpected diagnostics"); - - let deps = db.dependency_graph().dependency_urls(&db, &ingot_a_url); - assert!(deps.contains(&ingot_b_url)); -} - -#[test] -fn resolves_workspace_dependency_by_alias_local() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let ingot_a = workspace_root.join("ingots/a"); - let ingot_b = workspace_root.join("ingots/b"); - let util = workspace_root.join("vendor/util"); - - write_file( - &workspace_root.join("fe.toml"), - r#" -[workspace] -name = "local-workspace" -version = "0.1.0" -members = [ - { path = "ingots/a", name = "a", version = "0.1.0" }, - { path = "ingots/b", name = "b", version = "0.1.0" }, -] - -[dependencies] -util = { path = "vendor/util", name = "util", version = "0.1.0" } -"#, - ); - - write_file( - &ingot_a.join("fe.toml"), - r#" -[ingot] -name = "a" -version = "0.1.0" - -[dependencies] -b = true -util = true -"#, - ); - write_file(&ingot_a.join("src/lib.fe"), "pub fn main() {}\n"); - - write_file( - &ingot_b.join("fe.toml"), - r#" -[ingot] -name = "b" -version = "0.1.0" -"#, - ); - write_file(&ingot_b.join("src/lib.fe"), "pub fn main() {}\n"); - - write_file( - &util.join("fe.toml"), - r#" -[ingot] -name = "util" -version = "0.1.0" -"#, - ); - write_file(&util.join("src/lib.fe"), "pub fn main() {}\n"); - - let workspace_url = - Url::from_directory_path(workspace_root.as_std_path()).expect("workspace url"); - let ingot_a_url = Url::from_directory_path(ingot_a.as_std_path()).expect("ingot a url"); - let ingot_b_url = Url::from_directory_path(ingot_b.as_std_path()).expect("ingot b url"); - let util_url = Url::from_directory_path(util.as_std_path()).expect("util url"); - - let mut db = DriverDataBase::default(); - let had_diagnostics = init_workspace(&mut db, &workspace_url); - assert!(!had_diagnostics, "unexpected diagnostics"); - - let deps = db.dependency_graph().dependency_urls(&db, &ingot_a_url); - assert!(deps.contains(&ingot_b_url)); - assert!(deps.contains(&util_url)); -} - -#[test] -fn rejects_workspace_with_duplicate_member_names() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let member_a = workspace_root.join("ingots/lib_v1"); - let member_b = workspace_root.join("ingots/lib_v2"); - - write_file( - &workspace_root.join("fe.toml"), - r#" -[workspace] -name = "duplicate-members" -version = "0.1.0" -members = [ - { path = "ingots/lib_v1", name = "lib" }, - { path = "ingots/lib_v2", name = "lib" }, -] -"#, - ); - - write_file( - &member_a.join("fe.toml"), - r#" -[ingot] -name = "lib" -version = "0.1.0" -"#, - ); - write_file( - &member_a.join("src/lib.fe"), - "pub fn add(a: u256, b: u256) -> u256 { a + b }\n", - ); - - write_file( - &member_b.join("fe.toml"), - r#" -[ingot] -name = "lib" -version = "0.2.0" -"#, - ); - write_file( - &member_b.join("src/lib.fe"), - "pub fn add(a: u256, b: u256) -> u256 { a + b }\n", - ); - - let workspace_url = - Url::from_directory_path(workspace_root.as_std_path()).expect("workspace url"); - let mut db = DriverDataBase::default(); - let had_diagnostics = init_workspace(&mut db, &workspace_url); - assert!(had_diagnostics, "expected duplicate member diagnostics"); -} - -#[test] -fn rejects_workspace_dependency_alias_conflicting_with_member_name() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let ingot_a = workspace_root.join("ingots/a"); - let ingot_b = workspace_root.join("ingots/b"); - let dep_b = workspace_root.join("vendor/dep_b"); - - write_file( - &workspace_root.join("fe.toml"), - r#" -[workspace] -name = "local-workspace" -version = "0.1.0" -members = [ - { path = "ingots/a", name = "a", version = "0.1.0" }, - { path = "ingots/b", name = "b", version = "0.1.0" }, -] - -[dependencies] -b = { path = "vendor/dep_b", name = "dep_b", version = "0.1.0" } -"#, - ); - - write_file( - &ingot_a.join("fe.toml"), - r#" -[ingot] -name = "a" -version = "0.1.0" -"#, - ); - write_file(&ingot_a.join("src/lib.fe"), "pub fn main() {}\n"); - - write_file( - &ingot_b.join("fe.toml"), - r#" -[ingot] -name = "b" -version = "0.1.0" -"#, - ); - write_file(&ingot_b.join("src/lib.fe"), "pub fn main() {}\n"); - - write_file( - &dep_b.join("fe.toml"), - r#" -[ingot] -name = "dep_b" -version = "0.1.0" -"#, - ); - write_file(&dep_b.join("src/lib.fe"), "pub fn main() {}\n"); - - let workspace_url = - Url::from_directory_path(workspace_root.as_std_path()).expect("workspace url"); - let mut db = DriverDataBase::default(); - let had_diagnostics = init_workspace(&mut db, &workspace_url); - assert!(had_diagnostics, "expected diagnostics"); -} - -#[test] -fn rejects_workspace_member_name_mismatch() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let ingot_a = workspace_root.join("ingots/a"); - - write_file( - &workspace_root.join("fe.toml"), - r#" -[workspace] -name = "mismatch-workspace" -version = "0.1.0" -members = [ - { path = "ingots/a", name = "a" }, -] -"#, - ); - - write_file( - &ingot_a.join("fe.toml"), - r#" -[ingot] -name = "not_a" -version = "0.1.0" -"#, - ); - - let workspace_url = - Url::from_directory_path(workspace_root.as_std_path()).expect("workspace url"); - let mut db = DriverDataBase::default(); - let had_diagnostics = init_workspace(&mut db, &workspace_url); - assert!(had_diagnostics, "expected metadata mismatch diagnostics"); -} - -#[test] -fn rejects_workspace_member_version_mismatch() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let ingot_a = workspace_root.join("ingots/a"); - - write_file( - &workspace_root.join("fe.toml"), - r#" -[workspace] -name = "mismatch-workspace" -version = "0.1.0" -members = [ - { path = "ingots/a", version = "9.9.9" }, -] -"#, - ); - - write_file( - &ingot_a.join("fe.toml"), - r#" -[ingot] -name = "a" -version = "0.1.0" -"#, - ); - - let workspace_url = - Url::from_directory_path(workspace_root.as_std_path()).expect("workspace url"); - let mut db = DriverDataBase::default(); - let had_diagnostics = init_workspace(&mut db, &workspace_url); - assert!(had_diagnostics, "expected metadata mismatch diagnostics"); -} - -#[test] -fn resolves_remote_workspace_member_by_name() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_repo = root.join("remote_ws"); - let member_path = workspace_repo.join("ingots/core"); - - fs::create_dir_all(workspace_repo.as_std_path()).unwrap(); - Command::new("git") - .arg("-C") - .arg(workspace_repo.as_std_path()) - .arg("init") - .status() - .expect("git init") - .success() - .then_some(()) - .expect("git init success"); - Command::new("git") - .arg("-C") - .arg(workspace_repo.as_std_path()) - .args(["config", "user.email", "fe@example.com"]) - .status() - .expect("git config email") - .success() - .then_some(()) - .expect("git config email success"); - Command::new("git") - .arg("-C") - .arg(workspace_repo.as_std_path()) - .args(["config", "user.name", "fe"]) - .status() - .expect("git config name") - .success() - .then_some(()) - .expect("git config name success"); - - write_file( - &workspace_repo.join("fe.toml"), - r#" -name = "remote-workspace" -version = "0.1.0" -members = [ - { path = "ingots/core", name = "core", version = "0.1.0" }, -] -"#, - ); - write_file( - &member_path.join("fe.toml"), - r#" -[ingot] -name = "core" -version = "0.1.0" -"#, - ); - write_file(&member_path.join("src/lib.fe"), "pub fn main() {}\n"); - - let rev = git_commit(&workspace_repo, "initial"); - let source_url = Url::from_directory_path(workspace_repo.as_std_path()) - .expect("repo url") - .to_string(); - - let cache_root = root.join("git-cache"); - fs::create_dir_all(cache_root.as_std_path()).unwrap(); - - let local_root = root.join("consumer"); - let local_ingot = local_root.join("ingot"); - write_file( - &local_ingot.join("fe.toml"), - &format!( - r#" -[ingot] -name = "consumer" -version = "0.1.0" - -[dependencies] -core = {{ source = "{}", rev = "{}", name = "core", version = "0.1.0" }} -"#, - source_url, rev - ), - ); - write_file(&local_ingot.join("src/lib.fe"), "pub fn main() {}\n"); - - with_remote_cache_dir(&cache_root, || { - let ingot_url = Url::from_directory_path(local_ingot.as_std_path()).expect("ingot url"); - let mut db = DriverDataBase::default(); - let had_diagnostics = init_ingot(&mut db, &ingot_url); - assert!(!had_diagnostics, "unexpected diagnostics"); - - let cache_root = remote_git_cache_dir().expect("cache dir"); - let git = GitResolver::new(cache_root); - let description = - GitDescription::new(Url::parse(&source_url).expect("source url"), rev.clone()); - let checkout_path = git.checkout_path(&description); - let member_url = Url::from_directory_path(checkout_path.join("ingots/core").as_std_path()) - .expect("member url"); - - let deps = db.dependency_graph().dependency_urls(&db, &ingot_url); - assert!(deps.contains(&member_url)); - let ingot = db - .workspace() - .containing_ingot(&db, member_url) - .expect("expected member ingot"); - let has_source_files = ingot - .files(&db) - .iter() - .any(|(_, file)| matches!(file.kind(&db), Some(IngotFileKind::Source))); - assert!( - has_source_files, - "expected member ingot to load source files" - ); - }); -} - -#[test] -fn resolves_remote_workspace_member_by_name_in_subdir() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_repo = root.join("remote_ws"); - let workspace_root = workspace_repo.join("workspace"); - let member_path = workspace_root.join("ingots/core"); - - fs::create_dir_all(workspace_root.as_std_path()).unwrap(); - Command::new("git") - .arg("-C") - .arg(workspace_repo.as_std_path()) - .arg("init") - .status() - .expect("git init") - .success() - .then_some(()) - .expect("git init success"); - Command::new("git") - .arg("-C") - .arg(workspace_repo.as_std_path()) - .args(["config", "user.email", "fe@example.com"]) - .status() - .expect("git config email") - .success() - .then_some(()) - .expect("git config email success"); - Command::new("git") - .arg("-C") - .arg(workspace_repo.as_std_path()) - .args(["config", "user.name", "fe"]) - .status() - .expect("git config name") - .success() - .then_some(()) - .expect("git config name success"); - - write_file( - &workspace_root.join("fe.toml"), - r#" -name = "remote-workspace" -version = "0.1.0" -members = [ - { path = "ingots/core", name = "core", version = "0.1.0" }, -] -"#, - ); - write_file( - &member_path.join("fe.toml"), - r#" -[ingot] -name = "core" -version = "0.1.0" -"#, - ); - write_file(&member_path.join("src/lib.fe"), "pub fn main() {}\n"); - - let rev = git_commit(&workspace_repo, "initial"); - let source_url = Url::from_directory_path(workspace_repo.as_std_path()) - .expect("repo url") - .to_string(); - - let cache_root = root.join("git-cache"); - fs::create_dir_all(cache_root.as_std_path()).unwrap(); - - let local_root = root.join("consumer"); - let local_ingot = local_root.join("ingot"); - write_file( - &local_ingot.join("fe.toml"), - &format!( - r#" -[ingot] -name = "consumer" -version = "0.1.0" - -[dependencies] -core = {{ source = "{}", rev = "{}", path = "workspace", name = "core", version = "0.1.0" }} -"#, - source_url, rev - ), - ); - write_file(&local_ingot.join("src/lib.fe"), "pub fn main() {}\n"); - - with_remote_cache_dir(&cache_root, || { - let ingot_url = Url::from_directory_path(local_ingot.as_std_path()).expect("ingot url"); - let mut db = DriverDataBase::default(); - let had_diagnostics = init_ingot(&mut db, &ingot_url); - assert!(!had_diagnostics, "unexpected diagnostics"); - - let cache_root = remote_git_cache_dir().expect("cache dir"); - let git = GitResolver::new(cache_root); - let description = - GitDescription::new(Url::parse(&source_url).expect("source url"), rev.clone()); - let checkout_path = git.checkout_path(&description); - let member_url = - Url::from_directory_path(checkout_path.join("workspace/ingots/core").as_std_path()) - .expect("member url"); - - let deps = db.dependency_graph().dependency_urls(&db, &ingot_url); - assert!(deps.contains(&member_url)); - let ingot = db - .workspace() - .containing_ingot(&db, member_url) - .expect("expected member ingot"); - let has_source_files = ingot - .files(&db) - .iter() - .any(|(_, file)| matches!(file.kind(&db), Some(IngotFileKind::Source))); - assert!( - has_source_files, - "expected member ingot to load source files" - ); - }); -} - -#[test] -fn resolves_remote_workspace_member_dependency_urls() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_repo = root.join("remote_ws"); - let member_path = workspace_repo.join("ingots/core"); - - fs::create_dir_all(workspace_repo.as_std_path()).unwrap(); - Command::new("git") - .arg("-C") - .arg(workspace_repo.as_std_path()) - .arg("init") - .status() - .expect("git init") - .success() - .then_some(()) - .expect("git init success"); - Command::new("git") - .arg("-C") - .arg(workspace_repo.as_std_path()) - .args(["config", "user.email", "fe@example.com"]) - .status() - .expect("git config email") - .success() - .then_some(()) - .expect("git config email success"); - Command::new("git") - .arg("-C") - .arg(workspace_repo.as_std_path()) - .args(["config", "user.name", "fe"]) - .status() - .expect("git config name") - .success() - .then_some(()) - .expect("git config name success"); - - write_file( - &workspace_repo.join("fe.toml"), - r#" -name = "remote-workspace" -version = "0.1.0" -members = [ - { path = "ingots/core", name = "core", version = "0.1.0" }, -] -"#, - ); - write_file( - &member_path.join("fe.toml"), - r#" -[ingot] -name = "core" -version = "0.1.0" -"#, - ); - write_file(&member_path.join("src/lib.fe"), "pub fn main() {}\n"); - - let rev = git_commit(&workspace_repo, "initial"); - let source_url = Url::from_directory_path(workspace_repo.as_std_path()) - .expect("repo url") - .to_string(); - - let cache_root = root.join("git-cache"); - fs::create_dir_all(cache_root.as_std_path()).unwrap(); - - let local_root = root.join("consumer"); - let local_ingot = local_root.join("ingot"); - write_file( - &local_ingot.join("fe.toml"), - &format!( - r#" -[ingot] -name = "consumer" -version = "0.1.0" - -[dependencies] -remote_core = {{ source = "{}", rev = "{}", name = "core", version = "0.1.0" }} -"#, - source_url, rev - ), - ); - write_file(&local_ingot.join("src/lib.fe"), "pub fn main() {}\n"); - - with_remote_cache_dir(&cache_root, || { - let ingot_url = Url::from_directory_path(local_ingot.as_std_path()).expect("ingot url"); - let mut db = DriverDataBase::default(); - let had_diagnostics = init_ingot(&mut db, &ingot_url); - assert!(!had_diagnostics, "unexpected diagnostics"); - - let cache_root = remote_git_cache_dir().expect("cache dir"); - let git = GitResolver::new(cache_root); - let description = - GitDescription::new(Url::parse(&source_url).expect("source url"), rev.clone()); - let checkout_path = git.checkout_path(&description); - let member_url = Url::from_directory_path(checkout_path.join("ingots/core").as_std_path()) - .expect("member url"); - - let ingot = db - .workspace() - .containing_ingot(&db, ingot_url.clone()) - .expect("expected consumer ingot"); - let deps = ingot.dependencies(&db); - assert!( - deps.iter() - .any(|(name, url)| name == "remote_core" && url == &member_url) - ); - }); -} - -#[test] -fn reports_workspace_dependency_without_selection() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let ingot_a = workspace_root.join("ingots/a"); - let ingot_b = workspace_root.join("ingots/b"); - - write_file( - &workspace_root.join("fe.toml"), - r#" -name = "local-workspace" -version = "0.1.0" -members = [ - { path = "ingots/a", name = "a", version = "0.1.0" }, - { path = "ingots/b", name = "b", version = "0.1.0" }, -] -"#, - ); - - write_file( - &ingot_a.join("fe.toml"), - r#" -[ingot] -name = "a" -version = "0.1.0" - -[dependencies] -workspace = { path = "../.." } -"#, - ); - write_file(&ingot_a.join("src/lib.fe"), "pub fn main() {}\n"); - - write_file( - &ingot_b.join("fe.toml"), - r#" -[ingot] -name = "b" -version = "0.1.0" -"#, - ); - write_file(&ingot_b.join("src/lib.fe"), "pub fn main() {}\n"); - - let ingot_a_url = Url::from_directory_path(ingot_a.as_std_path()).expect("ingot a url"); - let mut db = DriverDataBase::default(); - let had_diagnostics = init_ingot(&mut db, &ingot_a_url); - assert!(had_diagnostics, "expected diagnostics"); -} - -/// Regression test: when a workspace member is added after initial workspace -/// resolution, re-initializing the workspace root should register the new -/// member so that other members can resolve dependencies on it. -#[test] -fn reinit_workspace_discovers_new_member() { - let temp = TempDir::new().unwrap(); - let root = Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).unwrap(); - let workspace_root = root.join("workspace"); - let counter_test = workspace_root.join("counter_test"); - let counter = workspace_root.join("counter"); - - // Workspace declares both members, but only counter_test exists initially - write_file( - &workspace_root.join("fe.toml"), - r#" -[workspace] -name = "getting-started" -version = "0.1.0" -members = ["counter_test", "counter"] -"#, - ); - - write_file( - &counter_test.join("fe.toml"), - r#" -[ingot] -name = "counter_test" -version = "0.1.0" - -[dependencies] -counter = true -"#, - ); - write_file(&counter_test.join("src/lib.fe"), "use counter::Counter\n"); - - // counter directory does NOT exist yet - - let workspace_url = - Url::from_directory_path(workspace_root.as_std_path()).expect("workspace url"); - let counter_test_url = - Url::from_directory_path(counter_test.as_std_path()).expect("counter_test url"); - let counter_url = Url::from_directory_path(counter.as_std_path()).expect("counter url"); - - // --- Phase 1: initial workspace resolution (counter missing) --- - let mut db = DriverDataBase::default(); - let _had_diagnostics = init_workspace(&mut db, &workspace_url); - - // counter_test should be registered as workspace member - let members = db - .dependency_graph() - .workspace_member_records(&db, &workspace_url); - assert!( - members.iter().any(|m| m.url == counter_test_url), - "counter_test should be a workspace member" - ); - // counter should NOT be a workspace member (directory didn't exist) - assert!( - !members.iter().any(|m| m.url == counter_url), - "counter should not be a workspace member yet" - ); - - // counter_test's dependency graph should NOT contain counter - let deps = db - .dependency_graph() - .dependency_urls(&db, &counter_test_url); - assert!( - !deps.contains(&counter_url), - "counter_test should not depend on counter yet" - ); - - // --- Phase 2: create counter ingot on disk --- - write_file( - &counter.join("fe.toml"), - r#" -[ingot] -name = "counter" -version = "0.1.0" -"#, - ); - write_file(&counter.join("src/lib.fe"), "pub contract Counter {}\n"); - - // --- Phase 3: re-init workspace (the fix) --- - let _had_diagnostics = init_workspace(&mut db, &workspace_url); - - // counter should now be registered as workspace member - let members = db - .dependency_graph() - .workspace_member_records(&db, &workspace_url); - assert!( - members.iter().any(|m| m.url == counter_url), - "counter should now be a workspace member after re-init" - ); - - // counter_test should now have counter in its dependency graph - let deps = db - .dependency_graph() - .dependency_urls(&db, &counter_test_url); - assert!( - deps.contains(&counter_url), - "counter_test should now depend on counter after workspace re-init" - ); -} diff --git a/crates/fe/Cargo.toml b/crates/fe/Cargo.toml deleted file mode 100644 index f218b4467d..0000000000 --- a/crates/fe/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -name = "fe" -version = "26.0.0-alpha.7" -edition.workspace = true - -[features] -default = ["lsp"] -lsp = ["dep:language-server", "dep:tokio"] -vendored-openssl = ["resolver/vendored-openssl"] - -[dependencies] -clap.workspace = true -clap_complete.workspace = true -driver.workspace = true -tracing.workspace = true -common.workspace = true -resolver.workspace = true -camino.workspace = true -petgraph.workspace = true -url.workspace = true -smol_str.workspace = true -hir.workspace = true -mir.workspace = true -cranelift-entity.workspace = true -rustc-hash.workspace = true -codegen = { path = "../codegen", package = "fe-codegen" } -contract-harness = { path = "../contract-harness", package = "fe-contract-harness" } -solc-runner = { path = "../solc-runner", package = "fe-solc-runner" } -fmt.workspace = true -serde_json = "1" -walkdir = "2" -similar = "2" -colored = "2" -hex = "0.4" -toml = "0.8.8" -glob.workspace = true -crossbeam-channel.workspace = true -scip = "0.6.1" -language-server = { workspace = true, optional = true } -tokio = { version = "1.43.0", default-features = false, features = ["rt-multi-thread"], optional = true } - -[dev-dependencies] -dir-test.workspace = true -test-utils.workspace = true -tempfile = "3.23" diff --git a/crates/fe/src/build.rs b/crates/fe/src/build.rs deleted file mode 100644 index ffb9210a66..0000000000 --- a/crates/fe/src/build.rs +++ /dev/null @@ -1,1376 +0,0 @@ -use std::{ - collections::{BTreeMap, HashSet}, - fs, -}; - -use camino::{Utf8Path, Utf8PathBuf}; -use codegen::{BackendKind, OptLevel, SonatinaContractBytecode}; -use common::{InputDb, config::Config, dependencies::WorkspaceMemberRecord, file::IngotFileKind}; -use driver::DriverDataBase; -use driver::cli_target::{CliTarget, resolve_cli_target}; -use hir::hir_def::TopLevelMod; -use mir::{analysis::build_contract_graph, fmt as mir_fmt, lower_ingot, lower_module}; -use smol_str::SmolStr; -use solc_runner::compile_single_contract_with_solc; -use url::Url; - -use crate::{ - BuildEmit, - report::{ - ReportStaging, copy_input_into_report, create_dir_all_utf8, create_report_staging_root, - enable_panic_report, normalize_report_out_path, tar_gz_dir, write_report_meta, - }, - workspace_ingot::{ - INGOT_REQUIRES_WORKSPACE_ROOT, WorkspaceMemberRef, select_workspace_member_paths, - }, -}; - -#[derive(Debug, Default, Clone, Copy)] -struct BuildSummary { - had_errors: bool, -} - -#[derive(Debug, Clone)] -struct BuildReportContext { - root_dir: Utf8PathBuf, -} - -#[derive(Debug, Clone, Copy)] -struct EmitSelection { - bytecode: bool, - runtime_bytecode: bool, - ir: bool, -} - -impl EmitSelection { - fn from_requested(requested: &[BuildEmit]) -> Self { - let mut selection = Self { - bytecode: false, - runtime_bytecode: false, - ir: false, - }; - for emit in requested { - match emit { - BuildEmit::Bytecode => selection.bytecode = true, - BuildEmit::RuntimeBytecode => selection.runtime_bytecode = true, - BuildEmit::Ir => selection.ir = true, - } - } - selection - } - - fn writes_any_bytecode(self) -> bool { - self.bytecode || self.runtime_bytecode - } -} - -fn create_build_report_staging() -> Result { - create_report_staging_root("target/fe-build-report-staging", "fe-build-report") -} - -fn write_report_file(report: &BuildReportContext, rel: &str, contents: &str) { - let path = report.root_dir.join(rel); - if let Some(parent) = path.parent() { - let _ = std::fs::create_dir_all(parent.as_std_path()); - } - let _ = std::fs::write(path.as_std_path(), contents); -} - -#[allow(clippy::too_many_arguments)] -fn write_build_manifest( - report: &BuildReportContext, - path: &Utf8PathBuf, - ingot: Option<&str>, - force_standalone: bool, - contract: Option<&str>, - backend_kind: BackendKind, - opt_level: OptLevel, - emit: EmitSelection, - out_dir: Option<&Utf8PathBuf>, - solc: Option<&str>, - has_errors: bool, -) { - let mut out = String::new(); - out.push_str("fe build report\n"); - out.push_str(&format!("path: {path}\n")); - out.push_str(&format!("ingot: {}\n", ingot.unwrap_or(""))); - out.push_str(&format!("standalone: {force_standalone}\n")); - out.push_str(&format!("contract: {}\n", contract.unwrap_or(""))); - out.push_str(&format!("backend: {}\n", backend_kind.name())); - out.push_str(&format!("opt_level: {opt_level}\n")); - out.push_str(&format!("emit: {}\n", describe_emit_selection(emit))); - out.push_str(&format!( - "out_dir: {}\n", - out_dir.map(|p| p.as_str()).unwrap_or("") - )); - out.push_str(&format!("solc: {}\n", solc.unwrap_or(""))); - out.push_str(&format!( - "status: {}\n", - if has_errors { "failed" } else { "ok" } - )); - out.push_str(&format!("fe_version: {}\n", env!("CARGO_PKG_VERSION"))); - write_report_file(report, "manifest.txt", &out); -} - -fn report_scope_dir(report: Option<&BuildReportContext>, scope: &str) -> Option { - let report = report?; - let dir = report - .root_dir - .join("artifacts") - .join(sanitize_filename(scope)); - let _ = create_dir_all_utf8(&dir); - Some(dir) -} - -#[allow(clippy::too_many_arguments)] -pub fn build( - path: &Utf8PathBuf, - ingot: Option<&str>, - force_standalone: bool, - contract: Option<&str>, - backend_kind: BackendKind, - opt_level: OptLevel, - emit: &[BuildEmit], - out_dir: Option<&Utf8PathBuf>, - solc: Option<&str>, - report_out: Option<&Utf8PathBuf>, - report_failed_only: bool, -) { - let emit = EmitSelection::from_requested(emit); - let mut db = DriverDataBase::default(); - - let report_root = match report_out - .map(|out| -> Result<_, String> { - let staging = create_build_report_staging()?; - let out = normalize_report_out_path(out)?; - Ok((out, staging)) - }) - .transpose() - { - Ok(v) => v, - Err(err) => { - eprintln!("Error: {err}"); - std::process::exit(1); - } - }; - - let report_ctx = match report_root - .as_ref() - .map(|(_, staging)| -> Result<_, String> { - let root = &staging.root_dir; - create_dir_all_utf8(&root.join("inputs"))?; - create_dir_all_utf8(&root.join("artifacts"))?; - create_dir_all_utf8(&root.join("errors"))?; - write_report_meta(root, "fe build report", None); - Ok(BuildReportContext { - root_dir: root.clone(), - }) - }) - .transpose() - { - Ok(v) => v, - Err(err) => { - eprintln!("Error: {err}"); - std::process::exit(1); - } - }; - - let _panic_guard = report_ctx - .as_ref() - .map(|report| enable_panic_report(report.root_dir.join("errors/panic_full.txt"))); - - let target = match resolve_cli_target(&mut db, path, force_standalone) { - Ok(target) => target, - Err(message) => { - eprintln!("Error: {message}"); - if let Some(report) = report_ctx.as_ref() { - write_report_file(report, "errors/cli_target.txt", &format!("{message}\n")); - } - if let Some((out, staging)) = report_root { - let has_errors = true; - if report_ctx.as_ref().is_some() && (!report_failed_only || has_errors) { - write_build_manifest( - report_ctx.as_ref().expect("report ctx"), - path, - ingot, - force_standalone, - contract, - backend_kind, - opt_level, - emit, - out_dir, - solc, - has_errors, - ); - if let Err(err) = tar_gz_dir(&staging.root_dir, &out) { - eprintln!("Error: failed to write report `{out}`: {err}"); - eprintln!("Report staging directory left at `{}`", staging.temp_dir); - } else { - let _ = std::fs::remove_dir_all(&staging.temp_dir); - println!("wrote report: {out}"); - } - } else { - let _ = std::fs::remove_dir_all(&staging.temp_dir); - } - } - std::process::exit(1); - } - }; - - if let Some(report) = report_ctx.as_ref() { - let inputs_dir = report.root_dir.join("inputs"); - let source = match &target { - CliTarget::StandaloneFile(file) => file, - CliTarget::Directory(dir) => dir, - }; - if let Err(err) = copy_input_into_report(source, &inputs_dir) { - write_report_file(report, "errors/report_inputs.txt", &format!("{err}\n")); - } - } - - let had_errors = match target { - CliTarget::StandaloneFile(file_path) => build_file( - &mut db, - &file_path, - ingot, - contract, - backend_kind, - opt_level, - emit, - out_dir, - solc, - report_ctx.as_ref(), - ), - CliTarget::Directory(dir_path) => build_directory( - &mut db, - &dir_path, - ingot, - contract, - backend_kind, - opt_level, - emit, - out_dir, - solc, - report_ctx.as_ref(), - ), - }; - - if let Some((out, staging)) = report_root { - let should_write = !report_failed_only || had_errors; - if should_write { - write_build_manifest( - report_ctx.as_ref().expect("report ctx"), - path, - ingot, - force_standalone, - contract, - backend_kind, - opt_level, - emit, - out_dir, - solc, - had_errors, - ); - if let Err(err) = tar_gz_dir(&staging.root_dir, &out) { - eprintln!("Error: failed to write report `{out}`: {err}"); - eprintln!("Report staging directory left at `{}`", staging.temp_dir); - } else { - // Best-effort cleanup. - let _ = std::fs::remove_dir_all(&staging.temp_dir); - println!("wrote report: {out}"); - } - } else { - let _ = std::fs::remove_dir_all(&staging.temp_dir); - } - } - - if had_errors { - std::process::exit(1); - } -} - -#[allow(clippy::too_many_arguments)] -fn build_file( - db: &mut DriverDataBase, - file_path: &Utf8PathBuf, - ingot: Option<&str>, - contract: Option<&str>, - backend_kind: BackendKind, - opt_level: OptLevel, - emit: EmitSelection, - out_dir: Option<&Utf8PathBuf>, - solc: Option<&str>, - report: Option<&BuildReportContext>, -) -> bool { - if ingot.is_some() { - eprintln!("Error: {INGOT_REQUIRES_WORKSPACE_ROOT}"); - return true; - } - - let canonical = match file_path.canonicalize_utf8() { - Ok(path) => path, - Err(_) => { - eprintln!("Error: Invalid file path: {file_path}"); - return true; - } - }; - - let url = match Url::from_file_path(canonical.as_std_path()) { - Ok(url) => url, - Err(_) => { - eprintln!("Error: Invalid file path: {file_path}"); - return true; - } - }; - - let content = match fs::read_to_string(&canonical) { - Ok(content) => content, - Err(err) => { - eprintln!("Error: Failed to read file {file_path}: {err}"); - return true; - } - }; - - db.workspace().touch(db, url.clone(), Some(content)); - - let Some(file) = db.workspace().get(db, &url) else { - eprintln!("Error: Could not process file {file_path}"); - return true; - }; - - let top_mod = db.top_mod(file); - let diags = db.run_on_top_mod(top_mod); - if !diags.is_empty() { - diags.emit(db); - return true; - } - - let default_out_dir = canonical - .parent() - .map(|parent| parent.join("out")) - .unwrap_or_else(|| Utf8PathBuf::from("out")); - let out_dir = out_dir.cloned().unwrap_or(default_out_dir); - let ir_file_stem = canonical - .file_stem() - .map(|stem| sanitize_name_with_default(stem, "module")) - .unwrap_or_else(|| "module".to_string()); - let report_dir = report_scope_dir( - report, - &format!( - "file-{}", - canonical - .file_stem() - .map(|s| s.to_string()) - .unwrap_or_else(|| "build".to_string()) - ), - ); - build_top_mod( - db, - top_mod, - contract, - backend_kind, - opt_level, - emit, - &out_dir, - &out_dir, - ir_file_stem.as_str(), - true, - solc, - report_dir.as_ref(), - ) - .had_errors -} - -#[allow(clippy::too_many_arguments)] -fn build_directory( - db: &mut DriverDataBase, - dir_path: &Utf8PathBuf, - ingot: Option<&str>, - contract: Option<&str>, - backend_kind: BackendKind, - opt_level: OptLevel, - emit: EmitSelection, - out_dir: Option<&Utf8PathBuf>, - solc: Option<&str>, - report: Option<&BuildReportContext>, -) -> bool { - let canonical = match dir_path.canonicalize_utf8() { - Ok(path) => path, - Err(_) => { - eprintln!("Error: Invalid or non-existent directory path: {dir_path}"); - return true; - } - }; - - if !canonical.join("fe.toml").is_file() { - if ingot.is_some() { - eprintln!("Error: {INGOT_REQUIRES_WORKSPACE_ROOT}"); - return true; - } - eprintln!("Error: No fe.toml file found in the provided directory: {canonical}"); - return true; - } - - let url = match Url::from_directory_path(canonical.as_str()) { - Ok(url) => url, - Err(_) => { - eprintln!("Error: Invalid directory path: {dir_path}"); - return true; - } - }; - - if driver::init_ingot(db, &url) { - return true; - } - - let config = match fs::read_to_string(canonical.join("fe.toml")) { - Ok(content) => match Config::parse(&content) { - Ok(config) => config, - Err(err) => { - eprintln!("Error: Failed to parse {}/fe.toml: {err}", canonical); - return true; - } - }, - Err(err) => { - eprintln!("Error: Failed to read {}/fe.toml: {err}", canonical); - return true; - } - }; - - match config { - Config::Workspace(_) => build_workspace( - db, - &canonical, - url, - ingot, - contract, - backend_kind, - opt_level, - emit, - out_dir, - solc, - report, - ), - Config::Ingot(_) => { - if ingot.is_some() { - eprintln!("Error: {INGOT_REQUIRES_WORKSPACE_ROOT}"); - return true; - } - let default_out_dir = canonical.join("out"); - let out_dir = out_dir.cloned().unwrap_or(default_out_dir); - let report_dir = report_scope_dir( - report, - &format!( - "ingot-{}", - canonical - .file_name() - .map(|s| s.to_string()) - .unwrap_or_else(|| "build".to_string()) - ), - ); - build_ingot_url( - db, - &url, - contract, - backend_kind, - opt_level, - emit, - &out_dir, - None, - None, - true, - solc, - report_dir.as_ref(), - ) - .had_errors - } - } -} - -#[allow(clippy::too_many_arguments)] -fn build_workspace( - db: &mut DriverDataBase, - workspace_root: &Utf8PathBuf, - workspace_url: Url, - ingot: Option<&str>, - contract: Option<&str>, - backend_kind: BackendKind, - opt_level: OptLevel, - emit: EmitSelection, - out_dir: Option<&Utf8PathBuf>, - solc: Option<&str>, - report: Option<&BuildReportContext>, -) -> bool { - let mut members = db - .dependency_graph() - .workspace_member_records(db, &workspace_url); - members.sort_by(|a, b| a.path.cmp(&b.path)); - - if members.is_empty() { - eprintln!( - "Warning: No workspace members found. Check that member paths in fe.toml exist on disk." - ); - return false; - } - - let selected_member_paths = match select_workspace_member_paths( - workspace_root, - workspace_root, - members.iter().map(|member| { - WorkspaceMemberRef::new(member.path.as_path(), Some(member.name.as_str())) - }), - ingot, - ) { - Ok(paths) => paths, - Err(err) => { - eprintln!("Error: {err}"); - return true; - } - }; - let selected_member_paths: HashSet = selected_member_paths.into_iter().collect(); - - let out_dir = out_dir - .cloned() - .unwrap_or_else(|| workspace_root.join("out")); - - let mut contract_names_by_member = Vec::with_capacity(selected_member_paths.len()); - for member in members { - let member_path = workspace_root.join(member.path.as_str()); - if !selected_member_paths.contains(&member_path) { - continue; - } - let contract_names = match analyze_ingot_contract_names(db, &member.url) { - Ok(names) => names, - Err(()) => return true, - }; - contract_names_by_member.push((member, contract_names)); - } - - if let Some(contract) = contract { - let matches: Vec<_> = contract_names_by_member - .iter() - .filter(|(_, names)| names.iter().any(|name| name == contract)) - .map(|(member, _)| member) - .collect(); - - match matches.len() { - 0 => { - eprintln!("Error: Contract \"{contract}\" not found in any workspace member"); - let mut available: Vec = contract_names_by_member - .iter() - .flat_map(|(_, names)| names.iter().cloned()) - .collect(); - available.sort(); - available.dedup(); - if !available.is_empty() { - eprintln!("Available contracts:"); - const MAX: usize = 50; - for name in available.iter().take(MAX) { - eprintln!(" - {name}"); - } - if available.len() > MAX { - eprintln!(" ... and {} more", available.len() - MAX); - } - } - return true; - } - 1 => { - let report_dir = - report_scope_dir(report, &format!("member-{}", matches[0].name.as_str())); - let summary = build_ingot_url( - db, - &matches[0].url, - Some(contract), - backend_kind, - opt_level, - emit, - &out_dir, - workspace_member_ir_out_dir(emit, &out_dir, matches[0].name.as_str()), - Some(matches[0].name.as_str()), - true, - solc, - report_dir.as_ref(), - ); - return summary.had_errors; - } - _ => { - eprintln!( - "Error: Contract \"{contract}\" is defined in multiple workspace members" - ); - eprintln!("Matches:"); - for member in matches { - eprintln!(" - {} ({})", member.name, member.path); - } - eprintln!("Hint: build a specific member by name or path instead."); - return true; - } - } - } - - if emit.writes_any_bytecode() - && let Err(()) = check_workspace_artifact_name_collisions(&contract_names_by_member) - { - return true; - } - if emit.ir - && let Err(()) = check_workspace_ir_output_name_collisions(&contract_names_by_member) - { - return true; - } - - let mut had_errors = false; - let mut any_contracts = false; - for (member, contract_names) in contract_names_by_member { - if contract_names.is_empty() { - continue; - } - any_contracts = true; - let report_dir = report_scope_dir(report, &format!("member-{}", member.name.as_str())); - let summary = build_ingot_url( - db, - &member.url, - None, - backend_kind, - opt_level, - emit, - &out_dir, - workspace_member_ir_out_dir(emit, &out_dir, member.name.as_str()), - Some(member.name.as_str()), - true, - solc, - report_dir.as_ref(), - ); - had_errors |= summary.had_errors; - } - - if !any_contracts { - eprintln!("Error: No contracts found to build"); - return true; - } - - had_errors -} - -fn analyze_ingot_contract_names( - db: &mut DriverDataBase, - ingot_url: &Url, -) -> Result, ()> { - let Some(ingot) = db.workspace().containing_ingot(db, ingot_url.clone()) else { - eprintln!("Error: Could not resolve ingot from directory"); - return Err(()); - }; - - if !ingot_has_source_files(db, ingot) { - eprintln!("Error: Could not find source files for ingot {ingot_url}"); - return Err(()); - } - - let diags = db.run_on_ingot(ingot); - if !diags.is_empty() { - diags.emit(db); - return Err(()); - } - - let contract_names = collect_ingot_contract_names(db, ingot).map_err(|err| { - eprintln!("Error: Failed to analyze contracts: {err}"); - })?; - - Ok(contract_names) -} - -fn check_workspace_artifact_name_collisions( - contract_names_by_member: &[(WorkspaceMemberRecord, Vec)], -) -> Result<(), ()> { - struct CollisionEntry { - member_name: SmolStr, - member_path: Utf8PathBuf, - contract_name: String, - artifact: String, - } - - // Use a case-insensitive key to avoid filesystem-dependent artifact collisions - // (e.g. macOS default case-insensitive APFS). - let mut collisions: BTreeMap> = BTreeMap::new(); - for (member, contract_names) in contract_names_by_member { - for name in contract_names { - let artifact = sanitize_filename(name); - let key = artifact.to_ascii_lowercase(); - collisions.entry(key).or_default().push(CollisionEntry { - member_name: member.name.clone(), - member_path: member.path.clone(), - contract_name: name.clone(), - artifact, - }); - } - } - - let duplicates: Vec<_> = collisions - .into_iter() - .filter(|(_, entries)| entries.len() > 1) - .collect(); - - if duplicates.is_empty() { - return Ok(()); - } - - eprintln!("Error: Contract names collide in a flat workspace output directory"); - eprintln!("Conflicts:"); - for (key, entries) in duplicates { - let mut artifacts: Vec = entries.iter().map(|e| e.artifact.clone()).collect(); - artifacts.sort(); - artifacts.dedup(); - let header = if artifacts.len() == 1 { - artifacts[0].clone() - } else { - format!("{key} (case-insensitive)") - }; - let mut labels: Vec = entries - .into_iter() - .map(|entry| { - format!( - "{} in {} ({})", - entry.contract_name, entry.member_name, entry.member_path - ) - }) - .collect(); - labels.sort(); - eprintln!(" - {header}"); - for label in labels { - eprintln!(" - {label}"); - } - } - eprintln!("Hint: build a specific member by name or path instead."); - Err(()) -} - -fn check_workspace_ir_output_name_collisions( - contract_names_by_member: &[(WorkspaceMemberRecord, Vec)], -) -> Result<(), ()> { - struct CollisionEntry { - member_name: SmolStr, - member_path: Utf8PathBuf, - artifact: String, - } - - // Use a case-insensitive key to avoid filesystem-dependent artifact collisions - // (e.g. macOS default case-insensitive APFS). - let mut collisions: BTreeMap> = BTreeMap::new(); - for (member, contract_names) in contract_names_by_member { - if contract_names.is_empty() { - continue; - } - let artifact = sanitize_filename(member.name.as_str()); - let key = artifact.to_ascii_lowercase(); - collisions.entry(key).or_default().push(CollisionEntry { - member_name: member.name.clone(), - member_path: member.path.clone(), - artifact, - }); - } - - let duplicates: Vec<_> = collisions - .into_iter() - .filter(|(_, entries)| entries.len() > 1) - .collect(); - - if duplicates.is_empty() { - return Ok(()); - } - - eprintln!("Error: Workspace member names collide in IR output directories"); - eprintln!("Conflicts:"); - for (key, entries) in duplicates { - let mut artifacts: Vec = entries.iter().map(|e| e.artifact.clone()).collect(); - artifacts.sort(); - artifacts.dedup(); - let header = if artifacts.len() == 1 { - artifacts[0].clone() - } else { - format!("{key} (case-insensitive)") - }; - let mut labels: Vec = entries - .into_iter() - .map(|entry| format!("{} ({})", entry.member_name, entry.member_path)) - .collect(); - labels.sort(); - eprintln!(" - {header}"); - for label in labels { - eprintln!(" - {label}"); - } - } - eprintln!("Hint: build a specific member by name or path instead."); - Err(()) -} - -#[allow(clippy::too_many_arguments)] -fn build_ingot_url( - db: &mut DriverDataBase, - ingot_url: &Url, - contract: Option<&str>, - backend_kind: BackendKind, - opt_level: OptLevel, - emit: EmitSelection, - out_dir: &Utf8Path, - ir_out_dir: Option, - ir_file_stem: Option<&str>, - missing_contract_is_error: bool, - solc: Option<&str>, - report_dir: Option<&Utf8PathBuf>, -) -> BuildSummary { - let Some(ingot) = db.workspace().containing_ingot(db, ingot_url.clone()) else { - eprintln!("Error: Could not resolve ingot from directory"); - return BuildSummary { had_errors: true }; - }; - - if !ingot_has_source_files(db, ingot) { - eprintln!("Error: Could not find source files for ingot {ingot_url}"); - return BuildSummary { had_errors: true }; - } - - let diags = db.run_on_ingot(ingot); - if !diags.is_empty() { - diags.emit(db); - return BuildSummary { had_errors: true }; - } - - let ir_file_stem = ir_file_stem - .map(|name| sanitize_name_with_default(name, "module")) - .unwrap_or_else(|| derive_ingot_ir_file_stem(db, ingot)); - - build_ingot( - db, - ingot, - contract, - backend_kind, - opt_level, - emit, - out_dir, - ir_out_dir.as_ref().map_or(out_dir, Utf8PathBuf::as_path), - ir_file_stem.as_str(), - missing_contract_is_error, - solc, - report_dir, - ) -} - -#[allow(clippy::too_many_arguments)] -fn build_ingot( - db: &DriverDataBase, - ingot: hir::Ingot<'_>, - contract: Option<&str>, - backend_kind: BackendKind, - opt_level: OptLevel, - emit: EmitSelection, - out_dir: &Utf8Path, - ir_out_dir: &Utf8Path, - ir_file_stem: &str, - missing_contract_is_error: bool, - solc: Option<&str>, - report_dir: Option<&Utf8PathBuf>, -) -> BuildSummary { - let contract_names = match collect_ingot_contract_names(db, ingot) { - Ok(names) => names, - Err(err) => { - eprintln!("Error: Failed to analyze contracts: {err}"); - return BuildSummary { had_errors: true }; - } - }; - - if contract_names.is_empty() { - eprintln!("Error: No contracts found to build"); - return BuildSummary { had_errors: true }; - } - - let names_to_build = - match resolve_names_to_build(contract_names, contract, missing_contract_is_error) { - Ok(names) => names, - Err(summary) => return summary, - }; - if let Err(err) = ensure_output_dirs(emit, out_dir, ir_out_dir) { - eprintln!("Error: {err}"); - return BuildSummary { had_errors: true }; - } - let report_dir = report_dir.map(Utf8PathBuf::as_path); - - let mut had_errors = false; - match backend_kind { - BackendKind::Yul => { - let optimize = opt_level.yul_optimize(); - let yul = match codegen::emit_ingot_yul(db, ingot) { - Ok(yul) => yul, - Err(err) => { - eprintln!("Error: Failed to emit Yul: {err}"); - return BuildSummary { had_errors: true }; - } - }; - if let Some(dir) = report_dir { - let path = dir.join("ingot.yul"); - let _ = std::fs::write(path.as_std_path(), &yul); - match lower_ingot(db, ingot) { - Ok(mir) => { - let path = dir.join("mir.txt"); - let _ = - std::fs::write(path.as_std_path(), mir_fmt::format_module(db, &mir)); - } - Err(err) => { - let path = dir.join("mir_error.txt"); - let _ = std::fs::write(path.as_std_path(), format!("{err}")); - } - } - } - if emit.ir - && let Err(err) = - write_named_ir_artifact(ir_out_dir, report_dir, ir_file_stem, "yul", &yul) - { - eprintln!("Error: {err}"); - had_errors = true; - } - if emit.writes_any_bytecode() { - had_errors |= write_yul_bytecode_artifacts( - &names_to_build, - &yul, - optimize, - out_dir, - report_dir, - emit, - solc, - ); - } - } - BackendKind::Sonatina => { - if emit.ir { - let mir_module = match lower_ingot(db, ingot) { - Ok(mir_module) => mir_module, - Err(err) => { - eprintln!("Error: Failed to compile Sonatina IR: {err}"); - return BuildSummary { had_errors: true }; - } - }; - let ir = match codegen::emit_mir_module_sonatina_ir_optimized( - db, - &mir_module, - opt_level, - contract, - ) { - Ok(ir) => ir, - Err(err) => { - eprintln!("Error: Failed to compile Sonatina IR: {err}"); - return BuildSummary { had_errors: true }; - } - }; - if let Err(err) = - write_named_ir_artifact(ir_out_dir, report_dir, ir_file_stem, "sona", &ir) - { - eprintln!("Error: {err}"); - had_errors = true; - } - } - if emit.writes_any_bytecode() { - let bytecode = - match codegen::emit_ingot_sonatina_bytecode(db, ingot, opt_level, contract) { - Ok(bytecode) => bytecode, - Err(err) => { - eprintln!("Error: Failed to compile Sonatina bytecode: {err}"); - return BuildSummary { had_errors: true }; - } - }; - had_errors |= write_sonatina_bytecode_artifacts( - &names_to_build, - &bytecode, - out_dir, - report_dir, - emit, - ); - } - } - }; - - BuildSummary { had_errors } -} - -#[allow(clippy::too_many_arguments)] -fn build_top_mod( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - contract: Option<&str>, - backend_kind: BackendKind, - opt_level: OptLevel, - emit: EmitSelection, - out_dir: &Utf8Path, - ir_out_dir: &Utf8Path, - ir_file_stem: &str, - missing_contract_is_error: bool, - solc: Option<&str>, - report_dir: Option<&Utf8PathBuf>, -) -> BuildSummary { - let contract_names = match collect_contract_names(db, top_mod) { - Ok(names) => names, - Err(err) => { - eprintln!("Error: Failed to analyze contracts: {err}"); - return BuildSummary { had_errors: true }; - } - }; - - if contract_names.is_empty() { - eprintln!("Error: No contracts found to build"); - return BuildSummary { had_errors: true }; - } - - let names_to_build = - match resolve_names_to_build(contract_names, contract, missing_contract_is_error) { - Ok(names) => names, - Err(summary) => return summary, - }; - if let Err(err) = ensure_output_dirs(emit, out_dir, ir_out_dir) { - eprintln!("Error: {err}"); - return BuildSummary { had_errors: true }; - } - let report_dir = report_dir.map(Utf8PathBuf::as_path); - - let mut had_errors = false; - match backend_kind { - BackendKind::Yul => { - let optimize = opt_level.yul_optimize(); - let yul = match codegen::emit_module_yul(db, top_mod) { - Ok(yul) => yul, - Err(err) => { - eprintln!("Error: Failed to emit Yul: {err}"); - return BuildSummary { had_errors: true }; - } - }; - if let Some(dir) = report_dir { - let path = dir.join("module.yul"); - let _ = std::fs::write(path.as_std_path(), &yul); - match lower_module(db, top_mod) { - Ok(mir) => { - let path = dir.join("mir.txt"); - let _ = - std::fs::write(path.as_std_path(), mir_fmt::format_module(db, &mir)); - } - Err(err) => { - let path = dir.join("mir_error.txt"); - let _ = std::fs::write(path.as_std_path(), format!("{err}")); - } - } - } - if emit.ir - && let Err(err) = - write_named_ir_artifact(ir_out_dir, report_dir, ir_file_stem, "yul", &yul) - { - eprintln!("Error: {err}"); - had_errors = true; - } - if emit.writes_any_bytecode() { - had_errors |= write_yul_bytecode_artifacts( - &names_to_build, - &yul, - optimize, - out_dir, - report_dir, - emit, - solc, - ); - } - } - BackendKind::Sonatina => { - if emit.ir { - let ir = match codegen::emit_module_sonatina_ir_optimized( - db, top_mod, opt_level, contract, - ) { - Ok(ir) => ir, - Err(err) => { - eprintln!("Error: Failed to compile Sonatina IR: {err}"); - return BuildSummary { had_errors: true }; - } - }; - if let Err(err) = - write_named_ir_artifact(ir_out_dir, report_dir, ir_file_stem, "sona", &ir) - { - eprintln!("Error: {err}"); - had_errors = true; - } - } - if emit.writes_any_bytecode() { - let bytecode = match codegen::emit_module_sonatina_bytecode( - db, top_mod, opt_level, contract, - ) { - Ok(bytecode) => bytecode, - Err(err) => { - eprintln!("Error: Failed to compile Sonatina bytecode: {err}"); - return BuildSummary { had_errors: true }; - } - }; - had_errors |= write_sonatina_bytecode_artifacts( - &names_to_build, - &bytecode, - out_dir, - report_dir, - emit, - ); - } - } - }; - - BuildSummary { had_errors } -} - -fn collect_contract_names( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, -) -> Result, String> { - let module = lower_module(db, top_mod).map_err(|err| err.to_string())?; - let graph = build_contract_graph(&module.functions); - let mut names: Vec<_> = graph.contracts.keys().cloned().collect(); - names.sort(); - Ok(names) -} - -fn collect_ingot_contract_names( - db: &DriverDataBase, - ingot: hir::Ingot<'_>, -) -> Result, String> { - let module = lower_ingot(db, ingot).map_err(|err| err.to_string())?; - let graph = build_contract_graph(&module.functions); - let mut names: Vec<_> = graph.contracts.keys().cloned().collect(); - names.sort(); - Ok(names) -} - -fn workspace_member_ir_out_dir( - emit: EmitSelection, - out_dir: &Utf8Path, - member_name: &str, -) -> Option { - emit.ir - .then(|| out_dir.join(sanitize_filename(member_name))) -} - -fn resolve_names_to_build( - contract_names: Vec, - contract: Option<&str>, - missing_contract_is_error: bool, -) -> Result, BuildSummary> { - let Some(name) = contract else { - return Ok(contract_names); - }; - - if contract_names.iter().any(|candidate| candidate == name) { - return Ok(vec![name.to_string()]); - } - if missing_contract_is_error { - eprintln!("Error: Contract \"{name}\" not found"); - eprintln!("Available contracts:"); - for candidate in &contract_names { - eprintln!(" - {candidate}"); - } - Err(BuildSummary { had_errors: true }) - } else { - Err(BuildSummary { had_errors: false }) - } -} - -fn ensure_output_dirs( - emit: EmitSelection, - out_dir: &Utf8Path, - ir_out_dir: &Utf8Path, -) -> Result<(), String> { - if emit.writes_any_bytecode() { - fs::create_dir_all(out_dir.as_std_path()) - .map_err(|err| format!("Failed to create output directory {out_dir}: {err}"))?; - } - if emit.ir { - fs::create_dir_all(ir_out_dir.as_std_path()) - .map_err(|err| format!("Failed to create output directory {ir_out_dir}: {err}"))?; - } - Ok(()) -} - -fn write_named_ir_artifact( - out_dir: &Utf8Path, - report_dir: Option<&Utf8Path>, - ir_file_stem: &str, - extension: &str, - ir: &str, -) -> Result<(), String> { - let file_name = format!("{ir_file_stem}.{extension}"); - let path = out_dir.join(&file_name); - let ir_with_newline = if ir.ends_with('\n') { - ir.to_string() - } else { - format!("{ir}\n") - }; - fs::write(path.as_std_path(), &ir_with_newline) - .map_err(|err| format!("Failed to write {path}: {err}"))?; - if let Some(dir) = report_dir { - let _ = fs::write(dir.join(&file_name).as_std_path(), ir_with_newline); - } - println!("Wrote {out_dir}/{file_name}"); - Ok(()) -} - -#[allow(clippy::too_many_arguments)] -fn write_yul_bytecode_artifacts( - names_to_build: &[String], - yul: &str, - optimize: bool, - out_dir: &Utf8Path, - report_dir: Option<&Utf8Path>, - emit: EmitSelection, - solc: Option<&str>, -) -> bool { - let mut had_errors = false; - for name in names_to_build { - match compile_single_contract_with_solc(name, yul, optimize, true, solc) { - Ok(bytecode) => { - if let Err(err) = write_contract_artifacts( - out_dir, - report_dir, - name, - &bytecode.bytecode, - &bytecode.runtime_bytecode, - emit, - ) { - eprintln!("Error: {err}"); - had_errors = true; - } else { - print_contract_artifact_paths(out_dir, name, emit); - } - } - Err(err) => { - eprintln!("Error: solc failed for contract \"{name}\": {}", err.0); - eprintln!("Hint: install solc, set FE_SOLC_PATH, or pass --solc ."); - had_errors = true; - } - } - } - had_errors -} - -fn write_sonatina_bytecode_artifacts( - names_to_build: &[String], - bytecode: &BTreeMap, - out_dir: &Utf8Path, - report_dir: Option<&Utf8Path>, - emit: EmitSelection, -) -> bool { - let mut had_errors = false; - for name in names_to_build { - let Some(SonatinaContractBytecode { deploy, runtime }) = bytecode.get(name) else { - eprintln!("Error: Sonatina did not emit bytecode for contract \"{name}\""); - had_errors = true; - continue; - }; - let deploy_hex = hex::encode(deploy); - let runtime_hex = hex::encode(runtime); - if let Err(err) = - write_contract_artifacts(out_dir, report_dir, name, &deploy_hex, &runtime_hex, emit) - { - eprintln!("Error: {err}"); - had_errors = true; - } else { - print_contract_artifact_paths(out_dir, name, emit); - } - } - had_errors -} - -fn derive_ingot_ir_file_stem(db: &DriverDataBase, ingot: hir::Ingot<'_>) -> String { - if let Some(name) = ingot - .config(db) - .and_then(|config| config.metadata.name) - .map(|name| name.to_string()) - { - return sanitize_name_with_default(&name, "module"); - } - - let ingot_base = ingot.base(db); - let fallback = ingot_base - .path_segments() - .and_then(|mut segments| segments.rfind(|segment| !segment.is_empty())) - .unwrap_or("module"); - sanitize_name_with_default(fallback, "module") -} - -fn describe_emit_selection(emit: EmitSelection) -> String { - let mut parts = Vec::new(); - if emit.bytecode { - parts.push("bytecode"); - } - if emit.runtime_bytecode { - parts.push("runtime-bytecode"); - } - if emit.ir { - parts.push("ir"); - } - parts.join(",") -} - -fn write_contract_artifacts( - out_dir: &Utf8Path, - report_dir: Option<&Utf8Path>, - contract_name: &str, - bytecode: &str, - runtime_bytecode: &str, - emit: EmitSelection, -) -> Result<(), String> { - let base = sanitize_filename(contract_name); - if emit.bytecode { - let deploy_path = out_dir.join(format!("{base}.bin")); - fs::write(deploy_path.as_std_path(), format!("{bytecode}\n")) - .map_err(|err| format!("Failed to write {deploy_path}: {err}"))?; - if let Some(dir) = report_dir { - let deploy_path = dir.join(format!("{base}.bin")); - let _ = fs::write(deploy_path.as_std_path(), format!("{bytecode}\n")); - } - } - if emit.runtime_bytecode { - let runtime_path = out_dir.join(format!("{base}.runtime.bin")); - fs::write(runtime_path.as_std_path(), format!("{runtime_bytecode}\n")) - .map_err(|err| format!("Failed to write {runtime_path}: {err}"))?; - if let Some(dir) = report_dir { - let runtime_path = dir.join(format!("{base}.runtime.bin")); - let _ = fs::write(runtime_path.as_std_path(), format!("{runtime_bytecode}\n")); - } - } - Ok(()) -} - -fn print_contract_artifact_paths(out_dir: &Utf8Path, contract_name: &str, emit: EmitSelection) { - let base = sanitize_filename(contract_name); - if emit.bytecode { - println!("Wrote {out_dir}/{base}.bin"); - } - if emit.runtime_bytecode { - println!("Wrote {out_dir}/{base}.runtime.bin"); - } -} - -fn sanitize_filename(name: &str) -> String { - sanitize_name_with_default(name, "contract") -} - -fn sanitize_name_with_default(name: &str, default_name: &str) -> String { - let sanitized: String = name - .chars() - .map(|c| { - if c.is_ascii_alphanumeric() || c == '_' || c == '-' { - c - } else { - '_' - } - }) - .collect(); - - if sanitized.is_empty() { - default_name.into() - } else { - sanitized - } -} - -fn ingot_has_source_files(db: &DriverDataBase, ingot: hir::Ingot<'_>) -> bool { - ingot - .files(db) - .iter() - .any(|(_, file)| matches!(file.kind(db), Some(IngotFileKind::Source))) -} diff --git a/crates/fe/src/check.rs b/crates/fe/src/check.rs deleted file mode 100644 index baba3e8a99..0000000000 --- a/crates/fe/src/check.rs +++ /dev/null @@ -1,613 +0,0 @@ -use std::collections::HashSet; - -use camino::Utf8PathBuf; -use common::{ - InputDb, - config::{Config, WorkspaceConfig}, - file::IngotFileKind, -}; -use driver::DriverDataBase; -use driver::cli_target::{CliTarget, resolve_cli_target}; -use hir::hir_def::{HirIngot, TopLevelMod}; -use mir::{MirDiagnosticsMode, collect_mir_diagnostics, fmt as mir_fmt, lower_module}; -use url::Url; - -use crate::report::{ - copy_input_into_report, create_dir_all_utf8, create_report_staging_dir, enable_panic_report, - normalize_report_out_path, tar_gz_dir, write_report_meta, -}; -use crate::workspace_ingot::{ - INGOT_REQUIRES_WORKSPACE_ROOT, WorkspaceMemberRef, select_workspace_member_paths, -}; - -#[derive(Debug, Clone)] -struct ReportContext { - root_dir: Utf8PathBuf, -} - -fn write_report_file(report: &ReportContext, rel: &str, contents: &str) { - let path = report.root_dir.join(rel); - if let Some(parent) = path.parent() { - let _ = std::fs::create_dir_all(parent); - } - let _ = std::fs::write(path, contents); -} - -#[allow(clippy::too_many_arguments)] -pub fn check( - path: &Utf8PathBuf, - ingot: Option<&str>, - force_standalone: bool, - dump_mir: bool, - report_out: Option<&Utf8PathBuf>, - report_failed_only: bool, -) -> Result { - let mut db = DriverDataBase::default(); - - let report_root = report_out - .map(|out| -> Result<_, String> { - let staging = create_report_staging_dir("target/fe-check-report-staging")?; - let out = normalize_report_out_path(out)?; - Ok((out, staging)) - }) - .transpose()?; - - let report_ctx = report_root - .as_ref() - .map(|(_, staging)| -> Result<_, String> { - let inputs_dir = staging.join("inputs"); - create_dir_all_utf8(&inputs_dir)?; - create_dir_all_utf8(&staging.join("artifacts"))?; - create_dir_all_utf8(&staging.join("errors"))?; - write_report_meta(staging, "fe check report", None); - Ok(ReportContext { - root_dir: staging.clone(), - }) - }) - .transpose()?; - - let target = match resolve_cli_target(&mut db, path, force_standalone) { - Ok(target) => target, - Err(message) => { - if let Some(report) = report_ctx.as_ref() { - write_report_file(report, "errors/cli_target.txt", &format!("{message}\n")); - } - - if let Some((out, staging)) = report_root { - let has_errors = true; - let should_write = !report_failed_only || has_errors; - if should_write { - write_check_manifest(&staging, path, dump_mir, has_errors); - if let Err(err) = tar_gz_dir(&staging, &out) { - eprintln!("Error: failed to write report `{out}`: {err}"); - eprintln!("Report staging directory left at `{staging}`"); - } else { - let _ = std::fs::remove_dir_all(&staging); - println!("wrote report: {out}"); - } - } else { - let _ = std::fs::remove_dir_all(&staging); - } - } - - return Err(message); - } - }; - - if let Some(report) = report_ctx.as_ref() { - let inputs_dir = report.root_dir.join("inputs"); - let source = match &target { - CliTarget::StandaloneFile(file) => file, - CliTarget::Directory(dir) => dir, - }; - if let Err(err) = copy_input_into_report(source, &inputs_dir) { - write_report_file(report, "errors/report_inputs.txt", &format!("{err}\n")); - } - } - - let _panic_guard = report_ctx - .as_ref() - .map(|report| enable_panic_report(report.root_dir.join("errors/panic_full.txt"))); - - let has_errors = match target { - CliTarget::StandaloneFile(file_path) => { - if ingot.is_some() { - eprintln!("Error: {INGOT_REQUIRES_WORKSPACE_ROOT}"); - true - } else { - check_single_file(&mut db, &file_path, dump_mir, report_ctx.as_ref()) - } - } - CliTarget::Directory(dir_path) => { - check_directory(&mut db, &dir_path, ingot, dump_mir, report_ctx.as_ref()) - } - }; - - if let Some((out, staging)) = report_root { - let should_write = !report_failed_only || has_errors; - if should_write { - write_check_manifest(&staging, path, dump_mir, has_errors); - if let Err(err) = tar_gz_dir(&staging, &out) { - eprintln!("Error: failed to write report `{out}`: {err}"); - eprintln!("Report staging directory left at `{staging}`"); - } else { - let _ = std::fs::remove_dir_all(&staging); - println!("wrote report: {out}"); - } - } else { - let _ = std::fs::remove_dir_all(&staging); - } - } - - Ok(has_errors) -} - -#[allow(clippy::too_many_arguments)] -fn check_directory( - db: &mut DriverDataBase, - dir_path: &Utf8PathBuf, - ingot: Option<&str>, - dump_mir: bool, - report: Option<&ReportContext>, -) -> bool { - let ingot_url = match dir_url(dir_path) { - Ok(url) => url, - Err(message) => { - eprintln!("{message}"); - return true; - } - }; - - let had_init_diagnostics = driver::init_ingot(db, &ingot_url); - if had_init_diagnostics { - if let Some(report) = report { - write_report_file( - report, - "errors/diagnostics.txt", - "compilation errors while initializing ingot", - ); - } - return true; - } - - let config = match config_from_db(db, &ingot_url) { - Ok(Some(config)) => config, - Ok(None) => { - if ingot.is_some() { - eprintln!("Error: {INGOT_REQUIRES_WORKSPACE_ROOT}"); - return true; - } - eprintln!("Error: No fe.toml file found in the root directory"); - return true; - } - Err(err) => { - eprintln!("Error: {err}"); - return true; - } - }; - - match config { - Config::Workspace(workspace) => { - check_workspace(db, dir_path, *workspace, ingot, dump_mir, report) - } - Config::Ingot(_) => { - if ingot.is_some() { - eprintln!("Error: {INGOT_REQUIRES_WORKSPACE_ROOT}"); - return true; - } - check_ingot_url(db, &ingot_url, dump_mir, report) - } - } -} - -fn config_from_db(db: &DriverDataBase, ingot_url: &Url) -> Result, String> { - let config_url = ingot_url - .join("fe.toml") - .map_err(|_| format!("Failed to locate fe.toml for {ingot_url}"))?; - let Some(file) = db.workspace().get(db, &config_url) else { - return Ok(None); - }; - let config = Config::parse(file.text(db)) - .map_err(|err| format!("Failed to parse {config_url}: {err}"))?; - Ok(Some(config)) -} - -fn dir_url(path: &Utf8PathBuf) -> Result { - let canonical_path = match path.canonicalize_utf8() { - Ok(path) => path, - Err(_) => { - let cwd = std::env::current_dir() - .map_err(|err| format!("Failed to read current directory: {err}"))?; - let cwd = Utf8PathBuf::from_path_buf(cwd) - .map_err(|_| "Current directory is not valid UTF-8".to_string())?; - cwd.join(path) - } - }; - Url::from_directory_path(canonical_path.as_str()) - .map_err(|_| format!("Error: invalid or non-existent directory path: {path}")) -} - -#[allow(clippy::too_many_arguments)] -fn check_ingot_url( - db: &mut DriverDataBase, - ingot_url: &Url, - dump_mir: bool, - report: Option<&ReportContext>, -) -> bool { - if db - .workspace() - .containing_ingot(db, ingot_url.clone()) - .is_none() - { - // Check if the issue is a missing fe.toml file - let config_url = match ingot_url.join("fe.toml") { - Ok(url) => url, - Err(_) => { - eprintln!("Error: Invalid ingot directory path"); - return true; - } - }; - - if db.workspace().get(db, &config_url).is_none() { - eprintln!("Error: No fe.toml file found in the root directory"); - eprintln!(" Expected fe.toml at: {config_url}"); - eprintln!( - " Make sure you're in an fe project directory or create a fe.toml file" - ); - } else { - eprintln!("Error: Could not resolve ingot from directory"); - } - return true; - } - - let mut seen = HashSet::new(); - check_ingot_and_dependencies(db, ingot_url, dump_mir, report, &mut seen) -} - -#[allow(clippy::too_many_arguments)] -fn check_workspace( - db: &mut DriverDataBase, - dir_path: &Utf8PathBuf, - workspace_config: WorkspaceConfig, - ingot: Option<&str>, - dump_mir: bool, - report: Option<&ReportContext>, -) -> bool { - let workspace_url = match dir_url(dir_path) { - Ok(url) => url, - Err(message) => { - eprintln!("{message}"); - return true; - } - }; - - let members = match driver::workspace_members(&workspace_config.workspace, &workspace_url) { - Ok(members) => members, - Err(err) => { - eprintln!("Error: Failed to resolve workspace members: {err}"); - return true; - } - }; - - if members.is_empty() { - let paths: Vec<&str> = workspace_config - .workspace - .members - .iter() - .map(|m| m.path.as_str()) - .collect(); - if paths.is_empty() { - eprintln!("Warning: No workspace members configured in fe.toml"); - } else { - eprintln!( - "Warning: No workspace members found. The configured member paths do not exist:\n {}", - paths.join("\n ") - ); - } - return false; - } - - let selected_member_paths = match select_workspace_member_paths( - dir_path, - dir_path, - members - .iter() - .map(|member| WorkspaceMemberRef::new(member.path.as_path(), member.name.as_deref())), - ingot, - ) { - Ok(paths) => paths, - Err(err) => { - eprintln!("Error: {err}"); - return true; - } - }; - let selected_member_paths: HashSet = selected_member_paths.into_iter().collect(); - - let mut seen = HashSet::new(); - let mut has_errors = false; - for member in members { - let member_path = dir_path.join(member.path.as_str()); - if !selected_member_paths.contains(&member_path) { - continue; - } - let member_url = member.url; - let member_has_errors = - check_ingot_and_dependencies(db, &member_url, dump_mir, report, &mut seen); - has_errors |= member_has_errors; - } - - has_errors -} - -#[allow(clippy::too_many_arguments)] -fn check_ingot_and_dependencies( - db: &mut DriverDataBase, - ingot_url: &Url, - dump_mir: bool, - report: Option<&ReportContext>, - seen: &mut HashSet, -) -> bool { - if !seen.insert(ingot_url.clone()) { - return false; - } - - let Some(ingot) = db.workspace().containing_ingot(db, ingot_url.clone()) else { - eprintln!("Error: Could not resolve ingot {ingot_url}"); - return true; - }; - - if !ingot_has_source_files(db, ingot) { - eprintln!("Error: Could not find source files for ingot {ingot_url}"); - return true; - } - - let hir_diags = db.run_on_ingot(ingot); - let hir_has_errors = hir_diags.has_errors(db); - let mut has_errors = false; - - if !hir_diags.is_empty() { - hir_diags.emit(db); - if let Some(report) = report { - let formatted = hir_diags.format_diags(db); - write_report_file(report, "errors/diagnostics.txt", &formatted); - } - has_errors = true; - } - - // MIR assumes HIR is sound and panics on invalid HIR. Skip it when HIR - // already reported errors to prevent cascading panics on broken input. - let mir_diags = if hir_has_errors { - vec![] - } else { - db.mir_diagnostics_for_ingot(ingot, MirDiagnosticsMode::CompilerParity) - }; - if !mir_diags.is_empty() { - db.emit_complete_diagnostics(&mir_diags); - has_errors = true; - } - - if !has_errors { - let root_mod = ingot.root_mod(db); - if dump_mir { - dump_module_mir(db, root_mod); - } - if let Some(report) = report { - write_check_artifacts(db, root_mod, report); - } - } - - let mut dependency_errors = Vec::new(); - for dependency_url in db.dependency_graph().dependency_urls(db, ingot_url) { - if !seen.insert(dependency_url.clone()) { - continue; - } - let Some(ingot) = db.workspace().containing_ingot(db, dependency_url.clone()) else { - continue; - }; - if !ingot_has_source_files(db, ingot) { - eprintln!("Error: Could not find source files for ingot {dependency_url}"); - has_errors = true; - continue; - } - let hir_diags = db.run_on_ingot(ingot); - let mir_diags = if hir_diags.has_errors(db) { - vec![] - } else { - db.mir_diagnostics_for_ingot(ingot, MirDiagnosticsMode::CompilerParity) - }; - if !hir_diags.is_empty() || !mir_diags.is_empty() { - dependency_errors.push((dependency_url, hir_diags, mir_diags)); - } - } - - if !dependency_errors.is_empty() { - has_errors = true; - if dependency_errors.len() == 1 { - eprintln!("Error: Downstream ingot has errors"); - } else { - eprintln!("Error: Downstream ingots have errors"); - } - - if let Some(report) = report { - let mut out = String::new(); - for (dependency_url, hir_diags, mir_diags) in &dependency_errors { - out.push_str(&format!("dependency: {dependency_url}\n")); - if !hir_diags.is_empty() { - out.push_str(&hir_diags.format_diags(db)); - } - if !mir_diags.is_empty() { - out.push_str(&format!( - "MIR diagnostics: {} emitted to stderr\n", - mir_diags.len() - )); - } - out.push('\n'); - } - write_report_file(report, "errors/dependency_diagnostics.txt", &out); - } - - for (dependency_url, hir_diags, mir_diags) in dependency_errors { - print_dependency_info(db, &dependency_url); - if !hir_diags.is_empty() { - hir_diags.emit(db); - } - if !mir_diags.is_empty() { - db.emit_complete_diagnostics(&mir_diags); - } - } - } - - has_errors -} - -fn ingot_has_source_files(db: &DriverDataBase, ingot: hir::Ingot<'_>) -> bool { - ingot - .files(db) - .iter() - .any(|(_, file)| matches!(file.kind(db), Some(IngotFileKind::Source))) -} - -#[allow(clippy::too_many_arguments)] -fn check_single_file( - db: &mut DriverDataBase, - file_path: &Utf8PathBuf, - dump_mir: bool, - report: Option<&ReportContext>, -) -> bool { - // Create a file URL for the single .fe file - let canonical = match file_path.canonicalize_utf8() { - Ok(p) => p, - Err(e) => { - eprintln!("Error: Cannot canonicalize {file_path}: {e}"); - return true; - } - }; - let file_url = match Url::from_file_path(&canonical) { - Ok(url) => url, - Err(_) => { - eprintln!("Error: Invalid file path: {file_path}"); - return true; - } - }; - - // Read the file content - let content = match std::fs::read_to_string(file_path) { - Ok(content) => content, - Err(err) => { - eprintln!("Error: Failed to read file {file_path}: {err}"); - return true; - } - }; - - // Add the file to the workspace - db.workspace().touch(db, file_url.clone(), Some(content)); - - // Try to get the file and check it for errors - if let Some(file) = db.workspace().get(db, &file_url) { - let top_mod = db.top_mod(file); - let hir_diags = db.run_on_top_mod(top_mod); - let mut has_errors = false; - - if !hir_diags.is_empty() { - eprintln!("errors in {file_url}"); - eprintln!(); - hir_diags.emit(db); - if let Some(report) = report { - let formatted = hir_diags.format_diags(db); - write_report_file(report, "errors/diagnostics.txt", &formatted); - } - has_errors = true; - } - - let mir_output = collect_mir_diagnostics(db, top_mod, MirDiagnosticsMode::CompilerParity); - if !mir_output.diagnostics.is_empty() { - if !has_errors { - eprintln!("errors in {file_url}"); - eprintln!(); - } - db.emit_complete_diagnostics(&mir_output.diagnostics); - has_errors = true; - } - - if has_errors { - return true; - } - if dump_mir { - dump_module_mir(db, top_mod); - } - if let Some(report) = report { - write_check_artifacts(db, top_mod, report); - } - } else { - eprintln!("Error: Could not process file {file_path}"); - return true; - } - - false -} - -fn print_dependency_info(db: &DriverDataBase, dependency_url: &Url) { - eprintln!(); - - // Get the ingot for this dependency URL to access its config - if let Some(ingot) = db.workspace().containing_ingot(db, dependency_url.clone()) { - if let Some(config) = ingot.config(db) { - let name = config.metadata.name.as_deref().unwrap_or("unknown"); - if let Some(version) = &config.metadata.version { - eprintln!("Dependency: {name} (version: {version})"); - } else { - eprintln!("Dependency: {name}"); - } - } else { - eprintln!("Dependency: "); - } - } else { - eprintln!("Dependency: "); - } - - eprintln!("URL: {dependency_url}"); - eprintln!(); -} - -fn dump_module_mir(db: &DriverDataBase, top_mod: TopLevelMod<'_>) { - match lower_module(db, top_mod) { - Ok(mir_module) => { - println!("=== MIR for module ==="); - print!("{}", mir_fmt::format_module(db, &mir_module)); - } - Err(err) => eprintln!("failed to lower MIR: {err}"), - } -} - -fn write_check_manifest( - staging: &Utf8PathBuf, - path: &Utf8PathBuf, - dump_mir: bool, - has_errors: bool, -) { - let mut out = String::new(); - out.push_str("fe check report\n"); - out.push_str(&format!("path: {path}\n")); - out.push_str(&format!("dump_mir: {dump_mir}\n")); - out.push_str(&format!( - "status: {}\n", - if has_errors { "failed" } else { "ok" } - )); - out.push_str(&format!("fe_version: {}\n", env!("CARGO_PKG_VERSION"))); - let _ = std::fs::write(staging.join("manifest.txt"), out); -} - -fn write_check_artifacts(db: &DriverDataBase, top_mod: TopLevelMod<'_>, report: &ReportContext) { - match lower_module(db, top_mod) { - Ok(mir) => { - write_report_file( - report, - "artifacts/mir.txt", - &mir_fmt::format_module(db, &mir), - ); - } - Err(err) => { - write_report_file(report, "artifacts/mir_error.txt", &format!("{err}")); - } - } -} diff --git a/crates/fe/src/cli/mod.rs b/crates/fe/src/cli/mod.rs deleted file mode 100644 index 9d52a2be27..0000000000 --- a/crates/fe/src/cli/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod new; diff --git a/crates/fe/src/cli/new.rs b/crates/fe/src/cli/new.rs deleted file mode 100644 index 720aa802db..0000000000 --- a/crates/fe/src/cli/new.rs +++ /dev/null @@ -1,350 +0,0 @@ -use std::fs; - -use camino::{Utf8Path, Utf8PathBuf}; -use common::config::{Config, WorkspaceMemberSelection}; -use common::paths::{absolute_utf8, file_url_to_utf8_path, normalize_slashes}; -use resolver::workspace::{discover_context, expand_workspace_members}; -use toml::Value; -use url::Url; - -const DEFAULT_VERSION: &str = "0.1.0"; - -pub fn run( - path: &Utf8PathBuf, - workspace: bool, - name: Option<&str>, - version: Option<&str>, -) -> Result<(), String> { - let target = absolute_target(path)?; - - if target.exists() && target.is_file() { - return Err(format!( - "Target path {target} exists and is a file; expected directory" - )); - } - - if workspace { - create_workspace_layout(&target, name, version)?; - return Ok(()); - } - - let mut start_dir = target.parent().unwrap_or(target.as_path()); - while !start_dir.exists() { - let Some(parent) = start_dir.parent() else { - break; - }; - start_dir = parent; - } - let workspace_root = find_workspace_root(start_dir)?; - - create_ingot_layout(&target, name, version)?; - - if let Some(root) = workspace_root { - match workspace_member_suggestion(&root, &target) { - Ok(Some(message)) => println!("{message}"), - Ok(None) => {} - Err(err) => eprintln!("Warning: failed to check workspace members: {err}"), - } - } - - Ok(()) -} - -fn create_workspace_layout( - base: &Utf8PathBuf, - explicit_name: Option<&str>, - explicit_version: Option<&str>, -) -> Result<(), String> { - fs::create_dir_all(base) - .map_err(|err| format!("Failed to create workspace directory {base}: {err}"))?; - - let workspace_name = explicit_name - .map(ToString::to_string) - .unwrap_or_else(|| infer_workspace_name(base)); - let version = explicit_version.unwrap_or(DEFAULT_VERSION); - - let workspace_config = base.join("fe.toml"); - write_if_absent( - &workspace_config, - format!( - r#"# Workspace config -[workspace] -name = "{workspace_name}" -version = "{version}" - -# Members can be a flat array or a table with main/dev groups. -members = [] -# members = ["ingots/*"] -# members = {{ main = ["packages/*"], dev = ["examples/*"] }} - -# Paths to exclude from member discovery. -exclude = ["target"] -"# - ), - )?; - - println!("Created workspace at {base}"); - Ok(()) -} - -fn create_ingot_layout( - base: &Utf8PathBuf, - explicit_name: Option<&str>, - explicit_version: Option<&str>, -) -> Result<(), String> { - fs::create_dir_all(base) - .map_err(|err| format!("Failed to create ingot directory {base}: {err}"))?; - - let src_dir = base.join("src"); - fs::create_dir_all(&src_dir) - .map_err(|err| format!("Failed to create src directory {src_dir}: {err}"))?; - - let name = explicit_name - .map(ToString::to_string) - .unwrap_or_else(|| infer_ingot_name(base)); - let version = explicit_version.unwrap_or(DEFAULT_VERSION); - - let config_path = base.join("fe.toml"); - write_if_absent( - &config_path, - format!( - r#"# Ingot config -[ingot] -name = "{name}" -version = "{version}" - -# Optional dependencies -# [dependencies] -# utils = {{ path = "../utils" }} -"# - ), - )?; - - let src_lib = src_dir.join("lib.fe"); - write_if_absent( - &src_lib, - r#"// A simple Counter contract to get you started. -// Run `fe test` to see it in action! - -use std::abi::sol -use std::evm::{Evm, Call} -use std::evm::effects::assert - -// Messages define your contract's public interface. -// Each variant becomes a callable function with a unique selector. -// The `sol()` const fn computes the standard Solidity selector at compile time. -msg CounterMsg { - #[selector = sol("increment()")] - Increment, - #[selector = sol("get()")] - Get -> u256, -} - -// Storage is defined as a regular struct. -// Its fields are persisted on-chain between calls. -struct CounterStore { - value: u256, -} - -// The contract itself: declares its storage and handles messages. -pub contract Counter { - mut store: CounterStore - - // The constructor runs once when the contract is deployed. - init() uses (mut store) { - store.value = 0 - } - - // The recv block routes incoming messages to handlers. - recv CounterMsg { - Increment uses (mut store) { - store.value = store.value + 1 - } - - Get -> u256 uses (store) { - store.value - } - } -} - -// Tests can deploy and interact with contracts. -// Run with: fe test -#[test] -fn test_counter() uses (evm: mut Evm) { - // Deploy the contract - let addr = evm.create2(value: 0, args: (), salt: 0) - assert(addr.inner != 0) - - // Initially the counter is 0 - let val: u256 = evm.call( - addr: addr, - gas: 100000, - value: 0, - message: CounterMsg::Get {} - ) - assert(val == 0) - - // Increment the counter - evm.call( - addr: addr, - gas: 100000, - value: 0, - message: CounterMsg::Increment {} - ) - - // Now it should be 1 - let val: u256 = evm.call( - addr: addr, - gas: 100000, - value: 0, - message: CounterMsg::Get {} - ) - assert(val == 1) -} -"#, - )?; - - println!("Created ingot at {base}"); - Ok(()) -} - -fn write_if_absent(path: &Utf8PathBuf, content: impl AsRef) -> Result<(), String> { - if path.exists() { - return Err(format!("Refusing to overwrite existing {}", path)); - } - fs::write(path, content.as_ref()).map_err(|err| format!("Failed to write {}: {err}", path))?; - Ok(()) -} - -fn infer_ingot_name(path: &Utf8PathBuf) -> String { - let fallback = "ingot".to_string(); - let Some(stem) = path.file_name().map(|s| s.to_string()) else { - return fallback; - }; - sanitize_name(&stem, fallback) -} - -fn infer_workspace_name(path: &Utf8PathBuf) -> String { - let fallback = "workspace".to_string(); - let Some(stem) = path.file_name().map(|s| s.to_string()) else { - return fallback; - }; - sanitize_name(&stem, fallback) -} - -fn sanitize_name(candidate: &str, fallback: String) -> String { - let mut sanitized = String::new(); - for c in candidate.chars() { - if c.is_ascii_alphanumeric() || c == '_' { - sanitized.push(c); - } else { - sanitized.push('_'); - } - } - if sanitized.is_empty() { - fallback - } else { - sanitized - } -} - -fn absolute_target(path: &Utf8PathBuf) -> Result { - absolute_utf8(path).map_err(|err| format!("Failed to resolve absolute path for {path}: {err}")) -} - -fn find_workspace_root(start: &Utf8Path) -> Result, String> { - let start_url = Url::from_directory_path(start.as_std_path()) - .map_err(|_| "Invalid directory path".to_string())?; - let discovery = discover_context(&start_url, false).map_err(|err| err.to_string())?; - let Some(workspace_url) = discovery.workspace_root else { - return Ok(None); - }; - let path = file_url_to_utf8_path(&workspace_url) - .ok_or_else(|| "Workspace path is not valid UTF-8".to_string())?; - Ok(Some(path)) -} - -fn workspace_member_suggestion( - workspace_root: &Utf8PathBuf, - member_dir: &Utf8PathBuf, -) -> Result, String> { - let config_path = workspace_root.join("fe.toml"); - let config_str = fs::read_to_string(config_path.as_std_path()) - .map_err(|err| format!("Failed to read {}: {err}", config_path))?; - let config_file = Config::parse(&config_str) - .map_err(|err| format!("Failed to parse {}: {err}", config_path))?; - let workspace = match config_file { - Config::Workspace(workspace_config) => workspace_config.workspace, - Config::Ingot(_) => return Ok(None), - }; - - let relative_member = member_dir - .strip_prefix(workspace_root) - .map_err(|_| "Ingot path is not inside workspace".to_string())? - .to_path_buf(); - let relative_member_str = normalize_member_path(&relative_member); - if relative_member.as_str().is_empty() { - return Ok(None); - } - - let base_url = Url::from_directory_path(workspace_root.as_std_path()) - .map_err(|_| format!("Invalid workspace path: {workspace_root}"))?; - if let Ok(expanded) = - expand_workspace_members(&workspace, &base_url, WorkspaceMemberSelection::All) - && expanded - .iter() - .any(|member| normalize_member_path(&member.path) == relative_member_str) - { - return Ok(None); - } - - let value: Value = config_str - .parse() - .map_err(|err| format!("Failed to parse {}: {err}", config_path))?; - let root_table = value - .as_table() - .ok_or_else(|| format!("{} is not a workspace config", config_path))?; - let has_workspace_table = root_table - .get("workspace") - .and_then(|value| value.as_table()) - .is_some(); - let workspace_table = if has_workspace_table { - root_table - .get("workspace") - .and_then(|value| value.as_table()) - .ok_or_else(|| "workspace is not a table".to_string())? - } else { - root_table - }; - - let members_path = match workspace_table.get("members") { - Some(Value::Array(_)) | None => { - if has_workspace_table { - "[workspace].members" - } else { - "members" - } - } - Some(Value::Table(_)) => { - if has_workspace_table { - "[workspace].members.main" - } else { - "members.main" - } - } - Some(_) => { - return Err(format!( - "members is not an array or table in {}", - config_path - )); - } - }; - - Ok(Some(format!( - "Workspace detected at {workspace_root}. To include this ingot, add \"{relative_member_str}\" to {members_path} in {config_path}." - ))) -} - -fn normalize_member_path(path: &Utf8Path) -> String { - normalize_slashes(path.as_str()) -} diff --git a/crates/fe/src/lsif.rs b/crates/fe/src/lsif.rs deleted file mode 100644 index 710b5f8f50..0000000000 --- a/crates/fe/src/lsif.rs +++ /dev/null @@ -1,799 +0,0 @@ -use std::collections::HashMap; -use std::io::{self, Write}; - -use common::InputDb; -use common::diagnostics::Span; -use hir::{ - HirDb, SpannedHirDb, - hir_def::{Attr, HirIngot, ItemKind, scope_graph::ScopeId}, - span::LazySpan, -}; - -/// Position in LSIF (0-based line and character). -#[derive(Clone, Copy)] -struct LsifPos { - line: u32, - character: u32, -} - -/// Range in LSIF. -#[derive(Clone, Copy)] -struct LsifRange { - start: LsifPos, - end: LsifPos, -} - -/// Compute line offsets for a text string. -fn calculate_line_offsets(text: &str) -> Vec { - let mut offsets = vec![0]; - for (i, b) in text.bytes().enumerate() { - if b == b'\n' { - offsets.push(i + 1); - } - } - offsets -} - -fn utf16_column(text: &str, line_start: usize, offset: usize) -> Option { - if line_start > offset || offset > text.len() { - return None; - } - let prefix = text.get(line_start..offset)?; - Some(prefix.encode_utf16().count() as u32) -} - -/// Convert a Span to an LsifRange. -fn span_to_range(span: &Span, db: &dyn InputDb) -> Option { - let text = span.file.text(db); - let line_offsets = calculate_line_offsets(text); - - let start: usize = span.range.start().into(); - let end: usize = span.range.end().into(); - - let start_line = line_offsets - .partition_point(|&line_start| line_start <= start) - .saturating_sub(1); - let end_line = line_offsets - .partition_point(|&line_start| line_start <= end) - .saturating_sub(1); - - let start_character = utf16_column(text, line_offsets[start_line], start)?; - let end_character = utf16_column(text, line_offsets[end_line], end)?; - - Some(LsifRange { - start: LsifPos { - line: start_line as u32, - character: start_character, - }, - end: LsifPos { - line: end_line as u32, - character: end_character, - }, - }) -} - -/// The LSIF emitter. -struct LsifEmitter { - writer: W, - next_id: u64, -} - -impl LsifEmitter { - fn new(writer: W) -> Self { - Self { writer, next_id: 1 } - } - - fn next_id(&mut self) -> u64 { - let id = self.next_id; - self.next_id += 1; - id - } - - fn emit_vertex(&mut self, label: &str, data: serde_json::Value) -> io::Result { - let id = self.next_id(); - let mut obj = serde_json::json!({ - "id": id, - "type": "vertex", - "label": label, - }); - if let serde_json::Value::Object(map) = data { - for (k, v) in map { - obj[&k] = v; - } - } - writeln!(self.writer, "{}", obj)?; - Ok(id) - } - - fn emit_edge(&mut self, label: &str, out_v: u64, in_v: u64) -> io::Result { - let id = self.next_id(); - let obj = serde_json::json!({ - "id": id, - "type": "edge", - "label": label, - "outV": out_v, - "inV": in_v, - }); - writeln!(self.writer, "{}", obj)?; - Ok(id) - } - - fn emit_edge_many( - &mut self, - label: &str, - out_v: u64, - in_vs: &[u64], - document: Option, - ) -> io::Result { - let id = self.next_id(); - let mut obj = serde_json::json!({ - "id": id, - "type": "edge", - "label": label, - "outV": out_v, - "inVs": in_vs, - }); - if let Some(doc) = document { - obj["document"] = serde_json::json!(doc); - } - writeln!(self.writer, "{}", obj)?; - Ok(id) - } - - fn emit_metadata(&mut self) -> io::Result { - self.emit_vertex( - "metaData", - serde_json::json!({ - "version": "0.4.0", - "positionEncoding": "utf-16", - "toolInfo": { - "name": "fe-lsif", - "version": env!("CARGO_PKG_VERSION"), - } - }), - ) - } - - fn emit_project(&mut self) -> io::Result { - self.emit_vertex("project", serde_json::json!({"kind": "fe"})) - } - - fn emit_document(&mut self, uri: &str) -> io::Result { - self.emit_vertex( - "document", - serde_json::json!({ - "uri": uri, - "languageId": "fe", - }), - ) - } - - fn emit_range(&mut self, range: LsifRange) -> io::Result { - self.emit_vertex( - "range", - serde_json::json!({ - "start": {"line": range.start.line, "character": range.start.character}, - "end": {"line": range.end.line, "character": range.end.character}, - }), - ) - } - - fn emit_result_set(&mut self) -> io::Result { - self.emit_vertex("resultSet", serde_json::json!({})) - } - - fn emit_definition_result(&mut self) -> io::Result { - self.emit_vertex("definitionResult", serde_json::json!({})) - } - - fn emit_reference_result(&mut self) -> io::Result { - self.emit_vertex("referenceResult", serde_json::json!({})) - } - - fn emit_hover_result(&mut self, contents: &str) -> io::Result { - self.emit_vertex( - "hoverResult", - serde_json::json!({ - "result": { - "contents": [ - {"language": "fe", "value": contents} - ] - } - }), - ) - } - - fn emit_moniker(&mut self, scheme: &str, identifier: &str) -> io::Result { - self.emit_vertex( - "moniker", - serde_json::json!({ - "scheme": scheme, - "identifier": identifier, - "kind": "export", - }), - ) - } -} - -/// Get the docstring for a scope. -fn get_docstring(db: &dyn HirDb, scope: ScopeId) -> Option { - scope - .attrs(db)? - .data(db) - .iter() - .filter_map(|attr| { - if let Attr::DocComment(doc) = attr { - Some(doc.text.data(db).clone()) - } else { - None - } - }) - .reduce(|a, b| a + "\n" + &b) -} - -/// Get a simple definition string for an item (used for hover). -fn get_item_definition(db: &dyn SpannedHirDb, item: ItemKind) -> Option { - let span = item.span().resolve(db)?; - - let mut start: usize = span.range.start().into(); - let mut end: usize = span.range.end().into(); - - // Trim body for functions, modules - let body_start = match item { - ItemKind::Func(func) => Some(func.body(db)?.span().resolve(db)?.range.start()), - ItemKind::Mod(module) => Some(module.scope().name_span(db)?.resolve(db)?.range.end()), - _ => None, - }; - if let Some(body_start) = body_start { - end = body_start.into(); - } - - // Start at the beginning of the name line - let name_span = item.name_span()?.resolve(db); - if let Some(name_span) = name_span { - let file_text = span.file.text(db).as_str(); - let mut name_line_start: usize = name_span.range.start().into(); - while name_line_start > 0 && file_text.as_bytes().get(name_line_start - 1) != Some(&b'\n') { - name_line_start -= 1; - } - start = name_line_start; - } - - let item_definition = span.file.text(db).as_str()[start..end].to_string(); - Some(item_definition.trim().to_string()) -} - -/// Build hover content for an item (definition + docstring). -fn build_hover_content(db: &driver::DriverDataBase, item: ItemKind) -> Option { - let definition = get_item_definition(db, item)?; - let docstring = get_docstring(db, item.scope()); - - if let Some(doc) = docstring { - Some(format!("{definition}\n\n{doc}")) - } else { - Some(definition) - } -} - -/// Run LSIF generation on a project. -pub fn generate_lsif( - db: &mut driver::DriverDataBase, - ingot_url: &url::Url, - writer: impl Write, -) -> io::Result<()> { - let mut emitter = LsifEmitter::new(writer); - - // Metadata and project - emitter.emit_metadata()?; - let project_id = emitter.emit_project()?; - - let Some(ingot) = db.workspace().containing_ingot(db, ingot_url.clone()) else { - return Err(io::Error::new( - io::ErrorKind::NotFound, - "Could not resolve ingot", - )); - }; - - // Get ingot name and version for monikers - let ingot_name = ingot - .config(db) - .and_then(|c| c.metadata.name) - .map(|n| n.to_string()) - .unwrap_or_else(|| "unknown".to_string()); - let ingot_version = ingot - .version(db) - .map(|v| v.to_string()) - .unwrap_or_else(|| "0.0.0".to_string()); - - // Track documents: url -> (vertex_id, range_ids) - let mut documents: HashMap)> = HashMap::new(); - - // Pre-emit document vertices for each module - for top_mod in ingot.all_modules(db) { - let doc_span = top_mod.span().resolve(db); - let doc_url = match &doc_span { - Some(span) => match span.file.url(db) { - Some(url) => url.to_string(), - None => continue, - }, - None => continue, - }; - if let std::collections::hash_map::Entry::Vacant(entry) = documents.entry(doc_url) { - let doc_id = emitter.emit_document(entry.key())?; - entry.insert((doc_id, Vec::new())); - } - } - - // Process each module's items - for top_mod in ingot.all_modules(db) { - let scope_graph = top_mod.scope_graph(db); - - let doc_span = top_mod.span().resolve(db); - let doc_url = match &doc_span { - Some(span) => match span.file.url(db) { - Some(url) => url.to_string(), - None => continue, - }, - None => continue, - }; - - let doc_id = documents[&doc_url].0; - - for item in scope_graph.items_dfs(db) { - let scope = ScopeId::from_item(item); - - let name_span = match item.name_span() { - Some(ns) => ns, - None => continue, - }; - let resolved_name_span = match name_span.resolve(db) { - Some(s) => s, - None => continue, - }; - let name_range = match span_to_range(&resolved_name_span, db) { - Some(r) => r, - None => continue, - }; - - // Emit range + resultSet - let range_id = emitter.emit_range(name_range)?; - documents.get_mut(&doc_url).unwrap().1.push(range_id); - - let result_set_id = emitter.emit_result_set()?; - emitter.emit_edge("next", range_id, result_set_id)?; - - // Definition result - let def_result_id = emitter.emit_definition_result()?; - emitter.emit_edge("textDocument/definition", result_set_id, def_result_id)?; - emitter.emit_edge_many("item", def_result_id, &[range_id], Some(doc_id))?; - - // Hover result - if let Some(hover_content) = build_hover_content(db, item) { - let hover_id = emitter.emit_hover_result(&hover_content)?; - emitter.emit_edge("textDocument/hover", result_set_id, hover_id)?; - } - - // Reference result - let target = hir::core::semantic::reference::Target::Scope(scope); - let ref_result_id = emitter.emit_reference_result()?; - emitter.emit_edge("textDocument/references", result_set_id, ref_result_id)?; - - // Definition is also a reference - emitter.emit_edge_many("item", ref_result_id, &[range_id], Some(doc_id))?; - - // Collect references from all modules - for ref_mod in ingot.all_modules(db) { - let refs = ref_mod.references_to_target(db, &target); - if refs.is_empty() { - continue; - } - - let ref_doc_span = ref_mod.span().resolve(db); - let ref_doc_url = match &ref_doc_span { - Some(span) => match span.file.url(db) { - Some(url) => url.to_string(), - None => continue, - }, - None => continue, - }; - - let mut ref_range_ids = Vec::new(); - for matched in refs { - if let Some(resolved) = matched.span.resolve(db) - && let Some(r) = span_to_range(&resolved, db) - { - let ref_range_id = emitter.emit_range(r)?; - ref_range_ids.push(ref_range_id); - } - } - - if !ref_range_ids.is_empty() { - // Look up existing document (guaranteed to exist from pre-emission) - let ref_doc_id = documents[&ref_doc_url].0; - documents - .get_mut(&ref_doc_url) - .unwrap() - .1 - .extend_from_slice(&ref_range_ids); - emitter.emit_edge_many( - "item", - ref_result_id, - &ref_range_ids, - Some(ref_doc_id), - )?; - } - } - - // Moniker - if let Some(pretty_path) = scope.pretty_path(db) { - let identifier = format!("{ingot_name}:{ingot_version}:{pretty_path}"); - let moniker_id = emitter.emit_moniker("fe", &identifier)?; - emitter.emit_edge("moniker/attach", result_set_id, moniker_id)?; - } - } - } - - // Emit contains edges for all documents - let document_ids: Vec = documents.values().map(|(id, _)| *id).collect(); - for (doc_id, range_ids) in documents.values() { - if !range_ids.is_empty() { - emitter.emit_edge_many("contains", *doc_id, range_ids, None)?; - } - } - - // Project -> document edges - if !document_ids.is_empty() { - emitter.emit_edge_many("contains", project_id, &document_ids, None)?; - } - - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::*; - use driver::DriverDataBase; - use std::collections::{HashMap as StdHashMap, HashSet}; - - /// Parse LSIF output into a list of JSON values, one per line. - fn parse_lsif(output: &str) -> Vec { - output - .lines() - .filter(|l| !l.is_empty()) - .map(|l| serde_json::from_str(l).expect("valid JSON line")) - .collect() - } - - /// Validate structural correctness of LSIF output. - fn validate_lsif(elements: &[serde_json::Value]) -> Result<(), Vec> { - let mut errors = Vec::new(); - let mut seen_ids: HashSet = HashSet::new(); - let mut vertex_labels: StdHashMap = StdHashMap::new(); - - // Check first element is metaData - if let Some(first) = elements.first() { - if first.get("label").and_then(|l| l.as_str()) != Some("metaData") { - errors.push("first element must be metaData vertex".into()); - } - } else { - errors.push("empty LSIF output".into()); - return Err(errors); - } - - // Validate each element - for (i, el) in elements.iter().enumerate() { - let id = el.get("id").and_then(|v| v.as_u64()); - let el_type = el.get("type").and_then(|v| v.as_str()); - let label = el.get("label").and_then(|v| v.as_str()); - - // Every element needs id, type, label - if id.is_none() { - errors.push(format!("element {i} missing 'id'")); - } - if el_type.is_none() { - errors.push(format!("element {i} missing 'type'")); - } - if label.is_none() { - errors.push(format!("element {i} missing 'label'")); - } - - if let Some(id) = id { - if !seen_ids.insert(id) { - errors.push(format!("duplicate id {id}")); - } - if let (Some(t), Some(l)) = (el_type, label) - && t == "vertex" - { - vertex_labels.insert(id, l.to_string()); - } - } - } - - // Validate edges reference existing vertices - for el in elements { - if el.get("type").and_then(|v| v.as_str()) != Some("edge") { - continue; - } - if let Some(out_v) = el.get("outV").and_then(|v| v.as_u64()) { - if !seen_ids.contains(&out_v) { - errors.push(format!("edge references non-existent outV {out_v}")); - } - } else { - let id = el.get("id").and_then(|v| v.as_u64()).unwrap_or(0); - errors.push(format!("edge {id} missing 'outV'")); - } - - // Check inV or inVs - let has_in_v = el.get("inV").and_then(|v| v.as_u64()).is_some(); - let has_in_vs = el.get("inVs").and_then(|v| v.as_array()).is_some(); - if !has_in_v && !has_in_vs { - let id = el.get("id").and_then(|v| v.as_u64()).unwrap_or(0); - errors.push(format!("edge {id} missing both 'inV' and 'inVs'")); - } - - if let Some(in_v) = el.get("inV").and_then(|v| v.as_u64()) - && !seen_ids.contains(&in_v) - { - errors.push(format!("edge references non-existent inV {in_v}")); - } - if let Some(in_vs) = el.get("inVs").and_then(|v| v.as_array()) { - for v in in_vs { - if let Some(id) = v.as_u64() - && !seen_ids.contains(&id) - { - errors.push(format!("edge references non-existent inVs member {id}")); - } - } - } - } - - // Check required vertex types exist - let labels: HashSet<&str> = vertex_labels.values().map(|s| s.as_str()).collect(); - for required in ["metaData", "project"] { - if !labels.contains(required) { - errors.push(format!("missing required vertex type: {required}")); - } - } - - if errors.is_empty() { - Ok(()) - } else { - Err(errors) - } - } - - fn generate_test_lsif(code: &str) -> String { - let mut db = DriverDataBase::default(); - let url = url::Url::parse("file:///test.fe").unwrap(); - db.workspace() - .touch(&mut db, url.clone(), Some(code.to_string())); - - let ingot_url = url::Url::parse("file:///").unwrap(); - let mut output = Vec::new(); - let _ = generate_lsif(&mut db, &ingot_url, &mut output); - String::from_utf8(output).unwrap() - } - - #[test] - fn test_lsif_basic_structure() { - let output = generate_test_lsif("struct Foo {\n x: i32\n}\n"); - let elements = parse_lsif(&output); - - assert!(!elements.is_empty(), "should produce LSIF output"); - match validate_lsif(&elements) { - Ok(()) => {} - Err(errors) => panic!("LSIF validation errors:\n{}", errors.join("\n")), - } - } - - #[test] - fn test_lsif_has_document_vertex() { - let output = generate_test_lsif("fn hello() -> i32 {\n 42\n}\n"); - let elements = parse_lsif(&output); - - let docs: Vec<_> = elements - .iter() - .filter(|e| e.get("label").and_then(|l| l.as_str()) == Some("document")) - .collect(); - assert!(!docs.is_empty(), "should have at least one document vertex"); - - let doc = &docs[0]; - assert_eq!( - doc.get("languageId").and_then(|l| l.as_str()), - Some("fe"), - "document languageId should be 'fe'" - ); - } - - #[test] - fn test_lsif_definitions_and_references() { - let code = r#"struct Point { - x: i32 - y: i32 -} - -fn make_point() -> Point { - Point { x: 1, y: 2 } -} -"#; - let output = generate_test_lsif(code); - let elements = parse_lsif(&output); - - match validate_lsif(&elements) { - Ok(()) => {} - Err(errors) => panic!("validation errors:\n{}", errors.join("\n")), - } - - // Should have definitionResult vertices - let def_results: Vec<_> = elements - .iter() - .filter(|e| e.get("label").and_then(|l| l.as_str()) == Some("definitionResult")) - .collect(); - assert!( - def_results.len() >= 2, - "should have definition results for Point and make_point, got {}", - def_results.len() - ); - - // Should have referenceResult vertices - let ref_results: Vec<_> = elements - .iter() - .filter(|e| e.get("label").and_then(|l| l.as_str()) == Some("referenceResult")) - .collect(); - assert!( - ref_results.len() >= 2, - "should have reference results for both items" - ); - - // Should have hover results - let hovers: Vec<_> = elements - .iter() - .filter(|e| e.get("label").and_then(|l| l.as_str()) == Some("hoverResult")) - .collect(); - assert!(!hovers.is_empty(), "should have hover results"); - } - - #[test] - fn test_lsif_monikers() { - let output = generate_test_lsif("fn greet() -> i32 {\n 1\n}\n"); - let elements = parse_lsif(&output); - - let monikers: Vec<_> = elements - .iter() - .filter(|e| e.get("label").and_then(|l| l.as_str()) == Some("moniker")) - .collect(); - assert!(!monikers.is_empty(), "should have moniker vertices"); - - let moniker = &monikers[0]; - assert_eq!( - moniker.get("scheme").and_then(|s| s.as_str()), - Some("fe"), - "moniker scheme should be 'fe'" - ); - assert!( - moniker.get("identifier").and_then(|s| s.as_str()).is_some(), - "moniker should have identifier" - ); - } - - #[test] - fn test_lsif_contains_edges() { - let output = generate_test_lsif("fn foo() -> i32 {\n 1\n}\n"); - let elements = parse_lsif(&output); - - let contains_edges: Vec<_> = elements - .iter() - .filter(|e| { - e.get("type").and_then(|t| t.as_str()) == Some("edge") - && e.get("label").and_then(|l| l.as_str()) == Some("contains") - }) - .collect(); - assert!( - contains_edges.len() >= 2, - "should have contains edges for document->ranges and project->documents, got {}", - contains_edges.len() - ); - } - - #[test] - fn test_lsif_no_duplicate_document_ids() { - let output = generate_test_lsif("struct A {\n x: i32\n}\nstruct B {\n y: i32\n}\n"); - let elements = parse_lsif(&output); - - let doc_ids: Vec = elements - .iter() - .filter(|e| e.get("label").and_then(|l| l.as_str()) == Some("document")) - .filter_map(|e| e.get("id").and_then(|v| v.as_u64())) - .collect(); - let unique: HashSet = doc_ids.iter().copied().collect(); - assert_eq!( - doc_ids.len(), - unique.len(), - "should have no duplicate document IDs" - ); - } - - #[test] - fn test_lsif_hover_content() { - let code = "struct Widget {\n count: i32\n}\n"; - let output = generate_test_lsif(code); - let elements = parse_lsif(&output); - - let hovers: Vec<_> = elements - .iter() - .filter(|e| e.get("label").and_then(|l| l.as_str()) == Some("hoverResult")) - .collect(); - - assert!(!hovers.is_empty(), "should have hover results"); - let hover = &hovers[0]; - let contents = hover - .get("result") - .and_then(|r| r.get("contents")) - .and_then(|c| c.as_array()); - assert!(contents.is_some(), "hover should have contents array"); - - let first_content = &contents.unwrap()[0]; - assert_eq!( - first_content.get("language").and_then(|l| l.as_str()), - Some("fe") - ); - let value = first_content.get("value").and_then(|v| v.as_str()).unwrap(); - assert!( - value.contains("Widget"), - "hover for Widget should contain 'Widget', got: {value}" - ); - } - - #[test] - fn test_lsif_range_positions() { - let output = generate_test_lsif("fn test_fn() -> i32 {\n 42\n}\n"); - let elements = parse_lsif(&output); - - let ranges: Vec<_> = elements - .iter() - .filter(|e| e.get("label").and_then(|l| l.as_str()) == Some("range")) - .collect(); - assert!(!ranges.is_empty(), "should have range vertices"); - - for range in &ranges { - let start = range.get("start").expect("range must have start"); - let end = range.get("end").expect("range must have end"); - assert!(start.get("line").is_some(), "start must have line"); - assert!( - start.get("character").is_some(), - "start must have character" - ); - assert!(end.get("line").is_some(), "end must have line"); - assert!(end.get("character").is_some(), "end must have character"); - - let start_line = start["line"].as_u64().unwrap(); - let end_line = end["line"].as_u64().unwrap(); - assert!(end_line >= start_line, "end line should be >= start line"); - } - } - - #[test] - fn test_lsif_metadata() { - let output = generate_test_lsif("fn x() -> i32 { 1 }\n"); - let elements = parse_lsif(&output); - - let meta = &elements[0]; - assert_eq!(meta["label"].as_str(), Some("metaData")); - assert_eq!(meta["version"].as_str(), Some("0.4.0")); - assert_eq!(meta["positionEncoding"].as_str(), Some("utf-16")); - assert!(meta.get("toolInfo").is_some()); - assert_eq!(meta["toolInfo"]["name"].as_str(), Some("fe-lsif")); - } - - #[test] - fn test_utf16_column_counts_surrogate_pairs() { - let text = "a😀b"; - let line_offsets = calculate_line_offsets(text); - assert_eq!(line_offsets, vec![0]); - - // byte offsets: a=0..1, 😀=1..5, b=5..6 - assert_eq!(utf16_column(text, line_offsets[0], 1), Some(1)); - assert_eq!(utf16_column(text, line_offsets[0], 5), Some(3)); - assert_eq!(utf16_column(text, line_offsets[0], 6), Some(4)); - } -} diff --git a/crates/fe/src/main.rs b/crates/fe/src/main.rs deleted file mode 100644 index f70fb824ba..0000000000 --- a/crates/fe/src/main.rs +++ /dev/null @@ -1,901 +0,0 @@ -#![allow(clippy::print_stderr, clippy::print_stdout)] -mod build; -mod check; -mod cli; -mod lsif; -mod report; -mod scip_index; -mod test; -#[cfg(not(target_arch = "wasm32"))] -mod tree; -mod workspace_ingot; - -use std::fs; - -use build::build; -use camino::Utf8PathBuf; -use check::check; -use clap::{CommandFactory, Parser, Subcommand, ValueEnum}; -use colored::Colorize; -use fmt as fe_fmt; -use similar::{ChangeTag, TextDiff}; -use walkdir::WalkDir; - -use crate::test::TestDebugOptions; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)] -pub enum ColorChoice { - Auto, - Always, - Never, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)] -pub enum TestDebug { - /// Print Yul output for any failing test. - Failures, - /// Print Yul output for all executed tests. - All, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)] -pub enum BuildEmit { - Bytecode, - RuntimeBytecode, - Ir, -} - -#[derive(Debug, Clone, Parser)] -#[command(version, about, long_about = None)] -pub struct Options { - /// Control colored output (auto, always, never). - #[arg(long, global = true, value_enum, default_value = "auto")] - pub color: ColorChoice, - #[command(subcommand)] - pub command: Command, -} - -#[derive(Debug, Clone, Subcommand)] -pub enum Command { - /// Compile Fe code to EVM bytecode. - Build { - /// Path to an ingot/workspace directory (containing fe.toml), a workspace member name, or a .fe file. - #[arg(default_value_t = default_project_path())] - path: Utf8PathBuf, - /// Build artifacts for a single workspace ingot by member name. - /// - /// This requires targeting a workspace root path. - #[arg(short = 'i', long = "ingot", value_name = "INGOT")] - ingot: Option, - /// Treat a `.fe` file target as standalone, even if it is inside an ingot. - #[arg(long)] - standalone: bool, - /// Build a specific contract by name (defaults to all contracts in the target). - #[arg(long)] - contract: Option, - /// Code generation backend to use (yul or sonatina). - #[arg(long, default_value = "sonatina")] - backend: String, - /// Optimization level (0 = none, 1 = balanced, 2 = aggressive). - /// - /// Defaults to `1`. - /// - /// Note: with `--backend yul`, opt levels `1` and `2` are currently equivalent. - /// - /// - Sonatina backend: controls the optimization pipeline. - /// - Yul backend: controls whether solc optimization is enabled (0 = disabled, 1/2 = enabled). - #[arg(long, default_value = "1", value_name = "LEVEL")] - opt_level: String, - /// Enable optimization. - /// - /// Shorthand for `--opt-level 1`. - /// - /// It is an error to pass `--optimize` with `--opt-level 0`. - #[arg(long)] - optimize: bool, - /// solc binary to use (overrides FE_SOLC_PATH). - /// - /// Only used with `--backend yul` (ignored with a warning otherwise). - #[arg(long)] - solc: Option, - /// Output directory for artifacts. - #[arg(long)] - out_dir: Option, - /// Comma-delimited artifacts to emit. - #[arg( - long, - short = 'e', - value_enum, - value_delimiter = ',', - default_value = "bytecode,runtime-bytecode" - )] - emit: Vec, - /// Write a debugging report as a `.tar.gz` file (includes sources, IR, backend output, and bytecode artifacts). - #[arg(long)] - report: bool, - /// Output path for `--report` (must end with `.tar.gz`). - #[arg( - long, - value_name = "OUT", - default_value = "fe-build-report.tar.gz", - requires = "report" - )] - report_out: Utf8PathBuf, - /// Only write the report if `fe build` fails. - #[arg(long, requires = "report")] - report_failed_only: bool, - }, - Check { - #[arg(default_value_t = default_project_path())] - path: Utf8PathBuf, - /// Check a single workspace ingot by member name. - /// - /// This requires targeting a workspace root path. - #[arg(short = 'i', long = "ingot", value_name = "INGOT")] - ingot: Option, - /// Treat a `.fe` file target as standalone, even if it is inside an ingot. - #[arg(long)] - standalone: bool, - #[arg(long)] - dump_mir: bool, - /// Write a debugging report as a `.tar.gz` file (includes sources and diagnostics). - #[arg(long)] - report: bool, - /// Output path for `--report` (must end with `.tar.gz`). - #[arg( - long, - value_name = "OUT", - default_value = "fe-check-report.tar.gz", - requires = "report" - )] - report_out: Utf8PathBuf, - /// Only write the report if `fe check` fails. - #[arg(long, requires = "report")] - report_failed_only: bool, - }, - #[cfg(not(target_arch = "wasm32"))] - Tree { - #[arg(default_value_t = default_project_path())] - path: Utf8PathBuf, - }, - /// Format Fe source code. - Fmt { - /// Path to a Fe source file or directory. If omitted, formats all .fe files in the current project. - path: Option, - /// Check if files are formatted, but do not write changes. - #[arg(long)] - check: bool, - }, - /// Run Fe tests in a file or directory. - Test { - /// Path(s) to .fe files or directories containing ingots with tests. - /// - /// Supports glob patterns (e.g. `crates/fe/tests/fixtures/fe_test/*.fe`). - /// - /// When omitted, defaults to the current project root (like `cargo test`). - #[arg(value_name = "PATH", num_args = 0..)] - paths: Vec, - /// Run tests for a single workspace ingot by member name - /// - /// This requires targeting a workspace root path. - #[arg(short = 'i', long = "ingot", value_name = "INGOT")] - ingot: Option, - /// Optional filter pattern for test names. - #[arg(short, long)] - filter: Option, - /// Number of suites to run in parallel (0 = auto). - #[arg(long, default_value_t = 8, value_name = "N")] - jobs: usize, - /// Run suites as grouped jobs instead of splitting into per-test jobs. - #[arg(long)] - grouped: bool, - /// Show event logs from test execution. - #[arg(long)] - show_logs: bool, - /// Print Yul output (`failures` or `all`) when using the Yul backend. - #[arg( - long, - value_enum, - num_args = 0..=1, - default_missing_value = "failures", - require_equals = true - )] - debug: Option, - /// Backend to use for codegen (yul or sonatina). - #[arg(long, default_value = "sonatina")] - backend: String, - /// solc binary to use (overrides FE_SOLC_PATH). - /// - /// Only used with `--backend yul` (ignored with a warning otherwise). - #[arg(long)] - solc: Option, - /// Optimization level (0 = none, 1 = balanced, 2 = aggressive). - /// - /// Defaults to `1`. - /// - /// Note: with `--backend yul`, opt levels `1` and `2` are currently equivalent. - /// - /// - Sonatina backend: controls the optimization pipeline. - /// - Yul backend: controls whether solc optimization is enabled (0 = disabled, 1/2 = enabled). - #[arg(long, default_value = "1", value_name = "LEVEL")] - opt_level: String, - /// Enable optimization. - /// - /// Shorthand for `--opt-level 1`. - /// - /// It is an error to pass `--optimize` with `--opt-level 0`. - #[arg(long)] - optimize: bool, - /// Trace executed EVM opcodes while running tests. - #[arg(long)] - trace_evm: bool, - /// How many EVM steps to keep in the trace ring buffer. - #[arg(long, default_value_t = 200)] - trace_evm_keep: usize, - /// How many stack items to print per EVM step in traces. - #[arg(long, default_value_t = 16)] - trace_evm_stack_n: usize, - /// Dump the Sonatina runtime symbol table (function offsets/sizes). - #[arg(long)] - sonatina_symtab: bool, - /// Directory to write debug outputs (traces, symtabs) into. - #[arg(long)] - debug_dir: Option, - /// Write a debugging report as a `.tar.gz` file (includes sources, IR, bytecode, traces). - #[arg(long)] - report: bool, - /// Output path for `--report` (must end with `.tar.gz`). - #[arg( - long, - value_name = "OUT", - default_value = "fe-test-report.tar.gz", - requires = "report" - )] - report_out: Utf8PathBuf, - /// Write one `.tar.gz` report per input suite into this directory. - /// - /// Useful when running a glob over many fixtures: each failing suite can be shared as a - /// standalone artifact. - #[arg(long, value_name = "DIR", conflicts_with = "report")] - report_dir: Option, - /// When used with `--report-dir`, only write reports for suites that failed. - #[arg(long, requires = "report_dir")] - report_failed_only: bool, - /// Print a normalized call trace for each test (for backend comparison). - #[arg(long)] - call_trace: bool, - }, - /// Create a new ingot or workspace. - New { - /// Path to create the ingot or workspace in. - path: Utf8PathBuf, - /// Create a workspace instead of a single ingot. - #[arg(long)] - workspace: bool, - /// Override the default inferred name. - #[arg(long)] - name: Option, - /// Override the default version (default: 0.1.0). - #[arg(long)] - version: Option, - }, - /// Generate shell completion scripts. - Completion { - /// Shell to generate completions for - #[arg(value_name = "shell")] - shell: clap_complete::Shell, - }, - /// Generate LSIF index for code navigation. - Lsif { - /// Path to the ingot directory. - #[arg(default_value_t = default_project_path())] - path: Utf8PathBuf, - /// Output file (defaults to stdout). - #[arg(short, long)] - output: Option, - }, - /// Find the workspace or ingot root for a given path. - /// - /// Walks up from the given path (or cwd) looking for fe.toml files. - /// Prints the workspace root if found, otherwise the nearest ingot root. - /// Useful for editor integrations that need to determine the project root. - Root { - /// Path to start searching from (default: current directory). - path: Option, - }, - /// Start the Fe language server (LSP). - #[cfg(feature = "lsp")] - Lsp { - /// Set the workspace root directory. - /// - /// Used as the server's working directory. When the LSP client doesn't - /// send workspace folders, this directory is used as the fallback root - /// for ingot/workspace discovery. - #[arg(long)] - root: Option, - /// Communication mode (default: stdio). - #[command(subcommand)] - mode: Option, - }, - /// Generate SCIP index for code navigation. - Scip { - /// Path to the ingot directory. - #[arg(default_value_t = default_project_path())] - path: Utf8PathBuf, - /// Output file (defaults to index.scip). - #[arg(short, long, default_value = "index.scip")] - output: Utf8PathBuf, - }, -} - -#[cfg(feature = "lsp")] -#[derive(Debug, Clone, Subcommand)] -pub enum LspMode { - /// Start with TCP transport instead of stdio. - Tcp { - /// Port to listen on. - #[arg(short, long, default_value_t = 4242)] - port: u16, - /// Timeout in seconds to shut down if no clients are connected. - #[arg(short, long, default_value_t = 10)] - timeout: u64, - }, -} - -fn default_project_path() -> Utf8PathBuf { - Utf8PathBuf::from(".") -} - -fn main() { - let opts = Options::parse(); - run(&opts); -} -pub fn run(opts: &Options) { - let preference = match opts.color { - ColorChoice::Auto => common::color::ColorPreference::Auto, - ColorChoice::Always => common::color::ColorPreference::Always, - ColorChoice::Never => common::color::ColorPreference::Never, - }; - common::color::set_color_preference(preference); - match preference { - common::color::ColorPreference::Auto => colored::control::unset_override(), - common::color::ColorPreference::Always => colored::control::set_override(true), - common::color::ColorPreference::Never => colored::control::set_override(false), - } - - match &opts.command { - Command::Build { - path, - ingot, - standalone, - contract, - backend, - opt_level, - optimize, - solc, - out_dir, - emit, - report, - report_out, - report_failed_only, - } => { - let backend_kind: codegen::BackendKind = match backend.parse() { - Ok(kind) => kind, - Err(err) => { - eprintln!("Error: {err}"); - std::process::exit(1); - } - }; - let opt_level = match effective_opt_level(backend_kind, opt_level, *optimize) { - Ok(level) => level, - Err(err) => { - eprintln!("Error: {err}"); - std::process::exit(1); - } - }; - if backend_kind != codegen::BackendKind::Yul && solc.is_some() { - eprintln!("Warning: --solc is only used with --backend yul; ignoring --solc"); - } - build( - path, - ingot.as_deref(), - *standalone, - contract.as_deref(), - backend_kind, - opt_level, - emit, - out_dir.as_ref(), - solc.as_deref(), - (*report).then_some(report_out), - *report_failed_only, - ) - } - Command::Check { - path, - ingot, - standalone, - dump_mir, - report, - report_out, - report_failed_only, - } => { - match check( - path, - ingot.as_deref(), - *standalone, - *dump_mir, - (*report).then_some(report_out), - *report_failed_only, - ) { - Ok(has_errors) => { - if has_errors { - std::process::exit(1); - } - } - Err(err) => { - eprintln!("Error: {err}"); - std::process::exit(1); - } - } - } - #[cfg(not(target_arch = "wasm32"))] - Command::Tree { path } => { - if tree::print_tree(path) { - std::process::exit(1); - } - } - Command::Fmt { path, check } => { - run_fmt(path.as_ref(), *check); - } - Command::Test { - paths, - ingot, - filter, - jobs, - grouped, - show_logs, - debug: test_debug, - backend, - solc, - opt_level, - optimize, - trace_evm, - trace_evm_keep, - trace_evm_stack_n, - sonatina_symtab, - debug_dir, - report, - report_out, - report_dir, - report_failed_only, - call_trace, - } => { - let backend_kind: codegen::BackendKind = match backend.parse() { - Ok(kind) => kind, - Err(err) => { - eprintln!("Error: {err}"); - std::process::exit(1); - } - }; - let opt_level = match effective_opt_level(backend_kind, opt_level, *optimize) { - Ok(level) => level, - Err(err) => { - eprintln!("Error: {err}"); - std::process::exit(1); - } - }; - if backend_kind != codegen::BackendKind::Yul && solc.is_some() { - eprintln!("Warning: --solc is only used with --backend yul; ignoring --solc"); - } - let debug = TestDebugOptions { - trace_evm: *trace_evm, - trace_evm_keep: *trace_evm_keep, - trace_evm_stack_n: *trace_evm_stack_n, - sonatina_symtab: *sonatina_symtab, - sonatina_evm_debug: false, - sonatina_observability: false, - dump_yul_on_failure: matches!(test_debug, Some(TestDebug::Failures)), - dump_yul_for_all: matches!(test_debug, Some(TestDebug::All)), - debug_dir: debug_dir.clone(), - }; - let paths = if paths.is_empty() { - vec![default_project_path()] - } else { - paths.clone() - }; - let solc = if backend_kind == codegen::BackendKind::Yul { - solc.as_deref() - } else { - None - }; - let yul_optimize = - backend_kind == codegen::BackendKind::Yul && opt_level.yul_optimize(); - match test::run_tests( - &paths, - ingot.as_deref(), - filter.as_deref(), - *jobs, - *grouped, - *show_logs, - backend, - yul_optimize, - solc, - opt_level, - &debug, - (*report).then_some(report_out), - report_dir.as_ref(), - *report_failed_only, - *call_trace, - ) { - Ok(has_failures) => { - if has_failures { - std::process::exit(1); - } - } - Err(err) => { - eprintln!("Error: {err}"); - std::process::exit(1); - } - } - } - Command::New { - path, - workspace, - name, - version, - } => { - if let Err(err) = cli::new::run(path, *workspace, name.as_deref(), version.as_deref()) { - eprintln!("Error: {err}"); - std::process::exit(1); - } - } - Command::Completion { shell } => { - clap_complete::generate( - *shell, - &mut Options::command(), - "fe", - &mut std::io::stdout(), - ); - } - Command::Root { path } => { - run_root(path.as_ref()); - } - #[cfg(feature = "lsp")] - Command::Lsp { root, mode } => { - // If --root is explicit, use it. Otherwise, auto-discover from cwd. - let resolved_root = match root { - Some(r) => Some(r.canonicalize_utf8().unwrap_or_else(|e| { - eprintln!("Error: invalid --root path {r}: {e}"); - std::process::exit(1); - })), - None => driver::files::find_project_root(), - }; - if let Some(root) = resolved_root { - std::env::set_current_dir(root.as_std_path()).unwrap_or_else(|e| { - eprintln!("Error: cannot chdir to {root}: {e}"); - std::process::exit(1); - }); - } - - let rt = tokio::runtime::Runtime::new().unwrap_or_else(|e| { - eprintln!("Error creating async runtime: {e}"); - std::process::exit(1); - }); - rt.block_on(async { - unsafe { - std::env::set_var("RUST_BACKTRACE", "full"); - } - language_server::setup_panic_hook(); - match mode { - Some(LspMode::Tcp { port, timeout }) => { - language_server::run_tcp_server( - *port, - std::time::Duration::from_secs(*timeout), - ) - .await; - } - None => { - language_server::run_stdio_server().await; - } - } - }); - } - Command::Lsif { path, output } => { - run_lsif(path, output.as_ref()); - } - Command::Scip { path, output } => { - run_scip(path, output); - } - } -} - -fn effective_opt_level( - backend_kind: codegen::BackendKind, - opt_level: &str, - optimize: bool, -) -> Result { - let level: codegen::OptLevel = opt_level.parse()?; - - if optimize && level == codegen::OptLevel::O0 { - return Err( - "--optimize is shorthand for `--opt-level 1` and cannot be used with `--opt-level 0`" - .to_string(), - ); - } - - if backend_kind == codegen::BackendKind::Yul && level == codegen::OptLevel::O2 { - eprintln!("Warning: --opt-level 2 has no additional effect for --backend yul (same as 1)"); - } - - Ok(level) -} - -fn run_lsif(path: &Utf8PathBuf, output: Option<&Utf8PathBuf>) { - use driver::DriverDataBase; - - let mut db = DriverDataBase::default(); - - let canonical_path = match path.canonicalize_utf8() { - Ok(p) => p, - Err(_) => { - eprintln!("Error: Invalid or non-existent directory path: {path}"); - std::process::exit(1); - } - }; - - let ingot_url = match url::Url::from_directory_path(canonical_path.as_str()) { - Ok(url) => url, - Err(_) => { - eprintln!("Error: Invalid directory path: {path}"); - std::process::exit(1); - } - }; - - let had_init_diagnostics = driver::init_ingot(&mut db, &ingot_url); - if had_init_diagnostics { - eprintln!("Warning: ingot had initialization diagnostics"); - } - - let result = if let Some(output_path) = output { - let file = match std::fs::File::create(output_path.as_std_path()) { - Ok(f) => f, - Err(e) => { - eprintln!("Error creating output file: {e}"); - std::process::exit(1); - } - }; - let writer = std::io::BufWriter::new(file); - lsif::generate_lsif(&mut db, &ingot_url, writer) - } else { - let stdout = std::io::stdout().lock(); - let writer = std::io::BufWriter::new(stdout); - lsif::generate_lsif(&mut db, &ingot_url, writer) - }; - - if let Err(e) = result { - eprintln!("Error generating LSIF: {e}"); - std::process::exit(1); - } -} - -fn run_scip(path: &Utf8PathBuf, output: &Utf8PathBuf) { - use driver::DriverDataBase; - - let mut db = DriverDataBase::default(); - - let canonical_path = match path.canonicalize_utf8() { - Ok(p) => p, - Err(_) => { - eprintln!("Error: Invalid or non-existent directory path: {path}"); - std::process::exit(1); - } - }; - - let ingot_url = match url::Url::from_directory_path(canonical_path.as_str()) { - Ok(url) => url, - Err(_) => { - eprintln!("Error: Invalid directory path: {path}"); - std::process::exit(1); - } - }; - - let had_init_diagnostics = driver::init_ingot(&mut db, &ingot_url); - if had_init_diagnostics { - eprintln!("Warning: ingot had initialization diagnostics"); - } - - let index = match scip_index::generate_scip(&mut db, &ingot_url) { - Ok(index) => index, - Err(e) => { - eprintln!("Error generating SCIP: {e}"); - std::process::exit(1); - } - }; - - if let Err(e) = scip::write_message_to_file(output.as_std_path(), index) { - eprintln!("Error writing SCIP file: {e}"); - std::process::exit(1); - } -} - -fn run_root(path: Option<&Utf8PathBuf>) { - use resolver::workspace::discover_context; - - let start = match path { - Some(p) => p.canonicalize_utf8().unwrap_or_else(|e| { - eprintln!("Error: invalid path {p}: {e}"); - std::process::exit(1); - }), - None => Utf8PathBuf::from_path_buf( - std::env::current_dir().expect("Unable to get current directory"), - ) - .expect("Expected utf8 path"), - }; - - let start_url = url::Url::from_directory_path(start.as_str()).unwrap_or_else(|_| { - // Maybe it's a file, try the parent directory - let parent = start.parent().unwrap_or(&start); - url::Url::from_directory_path(parent.as_str()).unwrap_or_else(|_| { - eprintln!("Error: invalid directory path: {start}"); - std::process::exit(1); - }) - }); - - match discover_context(&start_url, false) { - Ok(discovery) => { - if let Some(workspace_root) = &discovery.workspace_root - && let Ok(path) = workspace_root.to_file_path() - { - println!("{}", path.display()); - return; - } - if let Some(ingot_root) = discovery.ingot_roots.first() - && let Ok(path) = ingot_root.to_file_path() - { - println!("{}", path.display()); - return; - } - eprintln!("No fe.toml found in {start} or any parent directory"); - std::process::exit(1); - } - Err(e) => { - eprintln!("Error discovering project root: {e}"); - std::process::exit(1); - } - } -} - -fn run_fmt(path: Option<&Utf8PathBuf>, check: bool) { - let config = fe_fmt::Config::default(); - - // Collect files to format - let files: Vec = match path { - Some(p) if p.is_file() => vec![p.clone()], - Some(p) if p.is_dir() => collect_fe_files(p), - Some(p) => { - eprintln!("Error: Path does not exist: {p}"); - std::process::exit(1); - } - None => { - // Find project root and format all .fe files in src/ - match driver::files::find_project_root() { - Some(root) => collect_fe_files(&root.join("src")), - None => { - eprintln!( - "Error: No fe.toml found. Run from a Fe project directory or specify a path." - ); - std::process::exit(1); - } - } - } - }; - - if files.is_empty() { - eprintln!("Error: No .fe files found"); - std::process::exit(1); - } - - let mut unformatted_files = Vec::new(); - let mut error_count = 0; - - for file in &files { - match format_single_file(file, &config, check) { - FormatResult::Unchanged => {} - FormatResult::Formatted { - original, - formatted, - } => { - if check { - print_diff(file, &original, &formatted); - unformatted_files.push(file.clone()); - } - } - FormatResult::ParseError(errs) => { - eprintln!("Warning: Skipping {file} (parse errors):"); - for err in errs { - eprintln!(" {}", err.msg()); - } - } - FormatResult::IoError(err) => { - eprintln!("Error: Failed to process {file}: {err}"); - error_count += 1; - } - } - } - - if check && !unformatted_files.is_empty() { - std::process::exit(1); - } - - if error_count > 0 { - std::process::exit(1); - } -} - -fn print_diff(path: &Utf8PathBuf, original: &str, formatted: &str) { - let diff = TextDiff::from_lines(original, formatted); - - println!("{}", format!("Diff {}:", path).bold()); - for hunk in diff.unified_diff().context_radius(3).iter_hunks() { - // Print hunk header - println!("{}", format!("{}", hunk.header()).cyan()); - for change in hunk.iter_changes() { - match change.tag() { - ChangeTag::Delete => print!("{}", format!("-{}", change).red()), - ChangeTag::Insert => print!("{}", format!("+{}", change).green()), - ChangeTag::Equal => print!(" {}", change), - }; - } - } - println!(); -} - -fn collect_fe_files(dir: &Utf8PathBuf) -> Vec { - if !dir.exists() { - return Vec::new(); - } - - WalkDir::new(dir) - .into_iter() - .filter_map(|e| e.ok()) - .filter(|e| e.file_type().is_file()) - .filter(|e| e.path().extension().is_some_and(|ext| ext == "fe")) - .filter_map(|e| Utf8PathBuf::from_path_buf(e.into_path()).ok()) - .collect() -} - -enum FormatResult { - Unchanged, - Formatted { original: String, formatted: String }, - ParseError(Vec), - IoError(std::io::Error), -} - -fn format_single_file(path: &Utf8PathBuf, config: &fe_fmt::Config, check: bool) -> FormatResult { - let original = match fs::read_to_string(path.as_std_path()) { - Ok(s) => s, - Err(e) => return FormatResult::IoError(e), - }; - - let formatted = match fe_fmt::format_str(&original, config) { - Ok(f) => f, - Err(fe_fmt::FormatError::ParseErrors(errs)) => return FormatResult::ParseError(errs), - Err(fe_fmt::FormatError::Io(e)) => return FormatResult::IoError(e), - }; - - if formatted == original { - return FormatResult::Unchanged; - } - - if !check { - if let Err(e) = fs::write(path.as_std_path(), &formatted) { - return FormatResult::IoError(e); - } - println!("Formatted {}", path); - } - - FormatResult::Formatted { - original, - formatted, - } -} diff --git a/crates/fe/src/report.rs b/crates/fe/src/report.rs deleted file mode 100644 index 3339e71c34..0000000000 --- a/crates/fe/src/report.rs +++ /dev/null @@ -1,349 +0,0 @@ -use camino::Utf8PathBuf; -use std::{cell::RefCell, sync::OnceLock}; - -pub fn sanitize_filename(component: &str) -> String { - component - .chars() - .map(|ch| if ch.is_ascii_alphanumeric() { ch } else { '_' }) - .collect() -} - -pub fn normalize_report_out_path(out: &Utf8PathBuf) -> Result { - let s = out.as_str(); - if !s.ends_with(".tar.gz") { - return Err(format!( - "report output path must end with `.tar.gz`: `{out}`" - )); - } - - if !out.exists() { - return Ok(out.clone()); - } - - let base = s.strip_suffix(".tar.gz").expect("checked .tar.gz suffix"); - for idx in 1.. { - let candidate = Utf8PathBuf::from(format!("{base}-{idx}.tar.gz")); - if !candidate.exists() { - return Ok(candidate); - } - } - unreachable!() -} - -pub fn create_dir_all_utf8(path: &Utf8PathBuf) -> Result<(), String> { - std::fs::create_dir_all(path).map_err(|err| format!("failed to create dir `{path}`: {err}")) -} - -pub fn create_report_staging_dir(base: &str) -> Result { - let base = Utf8PathBuf::from(base); - let _ = std::fs::create_dir_all(&base); - let pid = std::process::id(); - let nanos = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .map(|d| d.as_nanos()) - .unwrap_or(0); - let dir = base.join(format!("report-{pid}-{nanos}")); - create_dir_all_utf8(&dir)?; - Ok(dir) -} - -#[derive(Debug, Clone)] -pub struct ReportStaging { - pub root_dir: Utf8PathBuf, - pub temp_dir: Utf8PathBuf, -} - -pub fn create_report_staging_root(base: &str, root_name: &str) -> Result { - let temp_dir = create_report_staging_dir(base)?; - let root_dir = temp_dir.join(root_name); - create_dir_all_utf8(&root_dir)?; - Ok(ReportStaging { root_dir, temp_dir }) -} - -pub fn tar_gz_dir(staging: &Utf8PathBuf, out: &Utf8PathBuf) -> Result<(), String> { - let parent = staging - .parent() - .ok_or_else(|| "missing staging parent".to_string())?; - let name = staging - .file_name() - .ok_or_else(|| "missing staging basename".to_string())?; - - let status = std::process::Command::new("tar") - .arg("-czf") - .arg(out.as_str()) - .arg("-C") - .arg(parent.as_str()) - .arg(name) - .status() - .map_err(|err| format!("failed to run tar: {err}"))?; - - if !status.success() { - return Err(format!("tar exited with status {status}")); - } - Ok(()) -} - -pub fn copy_input_into_report(input: &Utf8PathBuf, inputs_dir: &Utf8PathBuf) -> Result<(), String> { - if input.is_file() { - let name = input - .file_name() - .map(|s| s.to_string()) - .unwrap_or_else(|| "input.fe".to_string()); - let dest = inputs_dir.join(name); - std::fs::copy(input, &dest) - .map_err(|err| format!("failed to copy `{input}` to `{dest}`: {err}"))?; - return Ok(()); - } - - if !input.is_dir() { - return Ok(()); - } - - // Keep the report small but useful: include `fe.toml` and all `.fe` sources under `src/`. - let fe_toml = input.join("fe.toml"); - if fe_toml.is_file() { - let dest = inputs_dir.join("fe.toml"); - let _ = std::fs::copy(fe_toml, dest); - } - - let src_dir = input.join("src"); - if !src_dir.is_dir() { - return Ok(()); - } - - let dest_src = inputs_dir.join("src"); - create_dir_all_utf8(&dest_src)?; - - for entry in walkdir::WalkDir::new(src_dir.as_std_path()) - .follow_links(false) - .into_iter() - .filter_map(Result::ok) - { - let path = entry.path(); - if !path.is_file() { - continue; - } - if path.extension().and_then(|s| s.to_str()) != Some("fe") { - continue; - } - let rel = match path.strip_prefix(src_dir.as_std_path()) { - Ok(rel) => rel, - Err(_) => continue, - }; - let rel = match Utf8PathBuf::from_path_buf(rel.to_path_buf()) { - Ok(p) => p, - Err(_) => continue, - }; - let dest = dest_src.join(rel); - if let Some(parent) = dest.parent() { - let _ = std::fs::create_dir_all(parent); - } - let _ = std::fs::copy(path, dest); - } - Ok(()) -} - -pub fn panic_payload_to_string(payload: &(dyn std::any::Any + Send)) -> String { - if let Some(s) = payload.downcast_ref::<&'static str>() { - (*s).to_string() - } else if let Some(s) = payload.downcast_ref::() { - s.clone() - } else { - "panic payload is not a string".to_string() - } -} - -thread_local! { - static PANIC_REPORT_PATH: RefCell> = const { RefCell::new(None) }; -} - -static PANIC_REPORT_INSTALL: OnceLock<()> = OnceLock::new(); - -fn install_panic_reporter_once() { - let _ = PANIC_REPORT_INSTALL.get_or_init(|| { - let old = std::panic::take_hook(); - std::panic::set_hook(Box::new(move |info| { - // Never panic inside a panic hook: that would abort the process and can prevent reports - // from being written. - let _ = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { - let path = PANIC_REPORT_PATH.with(|p| p.borrow().clone()); - if let Some(path) = path { - let bt = std::backtrace::Backtrace::force_capture(); - let mut msg = String::new(); - msg.push_str("panic while running `fe`\n\n"); - msg.push_str(&format!("{info}\n\n")); - msg.push_str(&format!("backtrace:\n{bt:?}\n")); - let _ = std::fs::write(&path, msg); - } - - // Keep the default stderr output for interactive runs. - (old)(info); - })); - })); - }); -} - -pub struct PanicReportGuard { - prev: Option, -} - -impl Drop for PanicReportGuard { - fn drop(&mut self) { - let prev = self.prev.take(); - PANIC_REPORT_PATH.with(|p| { - *p.borrow_mut() = prev; - }); - } -} - -pub fn enable_panic_report(path: Utf8PathBuf) -> PanicReportGuard { - install_panic_reporter_once(); - let prev = PANIC_REPORT_PATH.with(|p| p.borrow().clone()); - PANIC_REPORT_PATH.with(|p| { - *p.borrow_mut() = Some(path); - }); - PanicReportGuard { prev } -} - -fn find_git_repo_root(start: &Utf8PathBuf) -> Option { - let mut dir = start.clone(); - loop { - if dir.join(".git").exists() { - return Some(dir); - } - let parent = dir.parent()?.to_owned(); - if parent == dir { - return None; - } - dir = parent; - } -} - -fn capture_cmd(cwd: &Utf8PathBuf, program: &str, args: &[&str]) -> Option { - let output = std::process::Command::new(program) - .args(args) - .current_dir(cwd.as_std_path()) - .output() - .ok()?; - let mut text = String::new(); - text.push_str(&String::from_utf8_lossy(&output.stdout)); - text.push_str(&String::from_utf8_lossy(&output.stderr)); - Some(text.trim().to_string()) -} - -fn write_best_effort(path: &Utf8PathBuf, contents: impl AsRef<[u8]>) { - let _ = std::fs::write(path, contents); -} - -pub fn write_report_meta(root: &Utf8PathBuf, kind: &str, suite: Option<&str>) { - let meta = root.join("meta"); - let _ = std::fs::create_dir_all(meta.as_std_path()); - - write_best_effort(&meta.join("kind.txt"), format!("{kind}\n")); - if let Some(suite) = suite { - write_best_effort(&meta.join("suite.txt"), format!("{suite}\n")); - } - - if let Ok(cwd) = std::env::current_dir() - && let Ok(cwd) = Utf8PathBuf::from_path_buf(cwd) - { - write_best_effort(&meta.join("cwd.txt"), format!("{cwd}\n")); - } - - let mut args = String::new(); - for a in std::env::args() { - args.push_str(&a); - args.push('\n'); - } - write_best_effort(&meta.join("args.txt"), args); - - let keys = ["RUST_BACKTRACE", "FE_SOLC_PATH"]; - let mut env_txt = String::new(); - for k in keys { - if let Ok(v) = std::env::var(k) { - env_txt.push_str(k); - env_txt.push('='); - env_txt.push_str(&v); - env_txt.push('\n'); - } - } - if !env_txt.is_empty() { - write_best_effort(&meta.join("env.txt"), env_txt); - } - - if let Ok(manifest_dir) = - Utf8PathBuf::from_path_buf(std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))) - && let Some(repo) = find_git_repo_root(&manifest_dir) - { - let mut git_txt = String::new(); - git_txt.push_str(&format!("fe_repo: {repo}\n")); - if let Some(head) = capture_cmd(&repo, "git", &["rev-parse", "HEAD"]) { - git_txt.push_str(&format!("fe_head: {head}\n")); - } - if let Some(status) = capture_cmd(&repo, "git", &["status", "--porcelain=v1"]) { - let dirty = if status.trim().is_empty() { - "no" - } else { - "yes" - }; - git_txt.push_str(&format!("fe_dirty: {dirty}\n")); - } - - let sonatina_guess = repo.join("../sonatina"); - if sonatina_guess.exists() - && let Some(sonatina_repo) = find_git_repo_root(&sonatina_guess) - { - git_txt.push_str(&format!("\nsonatina_repo: {sonatina_repo}\n")); - if let Some(head) = capture_cmd(&sonatina_repo, "git", &["rev-parse", "HEAD"]) { - git_txt.push_str(&format!("sonatina_head: {head}\n")); - } - if let Some(status) = capture_cmd(&sonatina_repo, "git", &["status", "--porcelain=v1"]) - { - let dirty = if status.trim().is_empty() { - "no" - } else { - "yes" - }; - git_txt.push_str(&format!("sonatina_dirty: {dirty}\n")); - } - } - - write_best_effort(&meta.join("git.txt"), git_txt); - } - - if let Ok(out) = std::process::Command::new("rustc").arg("-Vv").output() - && out.status.success() - { - let mut txt = String::new(); - txt.push_str(&String::from_utf8_lossy(&out.stdout)); - txt.push_str(&String::from_utf8_lossy(&out.stderr)); - write_best_effort(&meta.join("rustc.txt"), txt); - } -} - -pub fn is_verifier_error_text(text: &str) -> bool { - let normalized = text.to_ascii_lowercase(); - normalized.contains("verifierfailed") - || normalized.contains("verificationreport") - || normalized.contains("verifier failed") -} - -#[cfg(test)] -mod tests { - use super::is_verifier_error_text; - - #[test] - fn detects_verifier_error_markers() { - assert!(is_verifier_error_text( - "internal error: VerifierFailed { report: VerificationReport { ... } }" - )); - assert!(is_verifier_error_text( - "backend verifier failed while compiling module" - )); - } - - #[test] - fn ignores_non_verifier_errors() { - assert!(!is_verifier_error_text("failed to lower MIR")); - } -} diff --git a/crates/fe/src/scip_index.rs b/crates/fe/src/scip_index.rs deleted file mode 100644 index dca1aa92d5..0000000000 --- a/crates/fe/src/scip_index.rs +++ /dev/null @@ -1,436 +0,0 @@ -use std::collections::{HashMap, HashSet}; -use std::io; - -use camino::{Utf8Path, Utf8PathBuf}; -use common::InputDb; -use common::diagnostics::Span; -use hir::{ - HirDb, SpannedHirDb, - core::semantic::reference::Target, - hir_def::{Attr, HirIngot, ItemKind, scope_graph::ScopeId}, - span::LazySpan, -}; -use scip::{ - symbol::format_symbol, - types::{self, descriptor, symbol_information}, -}; - -#[derive(Default)] -struct ScipDocumentBuilder { - relative_path: String, - occurrences: Vec, - symbols: Vec, - seen_symbols: HashSet, -} - -impl ScipDocumentBuilder { - fn new(relative_path: String) -> Self { - Self { - relative_path, - ..Default::default() - } - } - - fn into_document(self) -> types::Document { - types::Document { - language: "fe".to_string(), - relative_path: self.relative_path, - occurrences: self.occurrences, - symbols: self.symbols, - text: String::new(), - position_encoding: types::PositionEncoding::UTF8CodeUnitOffsetFromLineStart.into(), - special_fields: Default::default(), - } - } -} - -fn calculate_line_offsets(text: &str) -> Vec { - let mut offsets = vec![0]; - for (i, b) in text.bytes().enumerate() { - if b == b'\n' { - offsets.push(i + 1); - } - } - offsets -} - -fn span_to_scip_range(span: &Span, db: &dyn InputDb) -> Option> { - let text = span.file.text(db); - let line_offsets = calculate_line_offsets(text); - - let start: usize = span.range.start().into(); - let end: usize = span.range.end().into(); - - let start_line = line_offsets - .partition_point(|&line_start| line_start <= start) - .saturating_sub(1); - let end_line = line_offsets - .partition_point(|&line_start| line_start <= end) - .saturating_sub(1); - - let start_col = start.checked_sub(line_offsets[start_line])?; - let end_col = end.checked_sub(line_offsets[end_line])?; - - Some(if start_line == end_line { - vec![start_line as i32, start_col as i32, end_col as i32] - } else { - vec![ - start_line as i32, - start_col as i32, - end_line as i32, - end_col as i32, - ] - }) -} - -fn top_mod_url( - db: &driver::DriverDataBase, - top_mod: &hir::hir_def::TopLevelMod<'_>, -) -> Option { - top_mod.span().resolve(db)?.file.url(db) -} - -fn relative_path(project_root: &Utf8Path, doc_url: &url::Url) -> Option { - let file_path = doc_url.to_file_path().ok()?; - let file_path = Utf8PathBuf::from_path_buf(file_path).ok()?; - let relative = file_path.strip_prefix(project_root).ok()?; - Some(relative.to_string()) -} - -fn get_docstring(db: &dyn HirDb, scope: ScopeId) -> Option { - scope - .attrs(db)? - .data(db) - .iter() - .filter_map(|attr| { - if let Attr::DocComment(doc) = attr { - Some(doc.text.data(db).clone()) - } else { - None - } - }) - .reduce(|a, b| a + "\n" + &b) -} - -fn get_item_definition(db: &dyn SpannedHirDb, item: ItemKind) -> Option { - let span = item.span().resolve(db)?; - - let mut start: usize = span.range.start().into(); - let mut end: usize = span.range.end().into(); - - let body_start = match item { - ItemKind::Func(func) => Some(func.body(db)?.span().resolve(db)?.range.start()), - ItemKind::Mod(module) => Some(module.scope().name_span(db)?.resolve(db)?.range.end()), - _ => None, - }; - if let Some(body_start) = body_start { - end = body_start.into(); - } - - let name_span = item.name_span()?.resolve(db); - if let Some(name_span) = name_span { - let file_text = span.file.text(db).as_str(); - let mut name_line_start: usize = name_span.range.start().into(); - while name_line_start > 0 && file_text.as_bytes().get(name_line_start - 1) != Some(&b'\n') { - name_line_start -= 1; - } - start = name_line_start; - } - - let item_definition = span.file.text(db).as_str()[start..end].to_string(); - Some(item_definition.trim().to_string()) -} - -fn build_symbol_documentation(db: &driver::DriverDataBase, item: ItemKind) -> Vec { - let mut parts = Vec::new(); - if let Some(definition) = get_item_definition(db, item) { - parts.push(format!("```fe\n{definition}\n```")); - } - if let Some(doc) = get_docstring(db, item.scope()) { - parts.push(doc); - } - if parts.is_empty() { - Vec::new() - } else { - vec![parts.join("\n\n")] - } -} - -fn item_descriptor_suffix(item: ItemKind<'_>) -> descriptor::Suffix { - match item { - ItemKind::Struct(_) | ItemKind::Enum(_) | ItemKind::Trait(_) => descriptor::Suffix::Type, - ItemKind::Func(_) => descriptor::Suffix::Term, - _ => descriptor::Suffix::Meta, - } -} - -fn item_symbol_kind(item: ItemKind<'_>) -> symbol_information::Kind { - match item { - ItemKind::Struct(_) => symbol_information::Kind::Struct, - ItemKind::Enum(_) => symbol_information::Kind::Enum, - ItemKind::Trait(_) => symbol_information::Kind::Trait, - ItemKind::Func(_) => symbol_information::Kind::Function, - _ => symbol_information::Kind::UnspecifiedKind, - } -} - -fn item_symbol<'db>( - db: &driver::DriverDataBase, - item: ItemKind<'db>, - package_name: &str, - package_version: &str, -) -> Option<(String, String)> { - let pretty_path = ScopeId::from_item(item).pretty_path(db)?.to_string(); - let mut descriptors = Vec::new(); - let mut parts = pretty_path.split("::").peekable(); - while let Some(part) = parts.next() { - let suffix = if parts.peek().is_some() { - descriptor::Suffix::Namespace - } else { - item_descriptor_suffix(item) - }; - descriptors.push(types::Descriptor { - name: part.to_string(), - disambiguator: String::new(), - suffix: suffix.into(), - special_fields: Default::default(), - }); - } - - let symbol = types::Symbol { - scheme: "fe".to_string(), - package: Some(types::Package { - manager: "fe".to_string(), - name: package_name.to_string(), - version: package_version.to_string(), - special_fields: Default::default(), - }) - .into(), - descriptors, - special_fields: Default::default(), - }; - let display_name = pretty_path - .rsplit("::") - .next() - .unwrap_or(pretty_path.as_str()) - .to_string(); - Some((format_symbol(symbol), display_name)) -} - -fn push_occurrence( - doc: &mut ScipDocumentBuilder, - range: Vec, - symbol: String, - symbol_roles: i32, -) { - doc.occurrences.push(types::Occurrence { - range, - symbol, - symbol_roles, - override_documentation: Vec::new(), - syntax_kind: types::SyntaxKind::Identifier.into(), - diagnostics: Vec::new(), - enclosing_range: Vec::new(), - special_fields: Default::default(), - }); -} - -pub fn generate_scip( - db: &mut driver::DriverDataBase, - ingot_url: &url::Url, -) -> io::Result { - let Some(ingot) = db.workspace().containing_ingot(db, ingot_url.clone()) else { - return Err(io::Error::new( - io::ErrorKind::NotFound, - "Could not resolve ingot", - )); - }; - - let project_root_path = ingot_url - .to_file_path() - .ok() - .and_then(|p| Utf8PathBuf::from_path_buf(p).ok()) - .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, "ingot URL must be file://"))?; - - let ingot_name = ingot - .config(db) - .and_then(|c| c.metadata.name) - .map(|n| n.to_string()) - .unwrap_or_else(|| "unknown".to_string()); - let ingot_version = ingot - .version(db) - .map(|v| v.to_string()) - .unwrap_or_else(|| "0.0.0".to_string()); - - let mut documents: HashMap = HashMap::new(); - - for top_mod in ingot.all_modules(db) { - let Some(doc_url) = top_mod_url(db, top_mod) else { - continue; - }; - let Some(relative) = relative_path(&project_root_path, &doc_url) else { - continue; - }; - documents - .entry(doc_url.to_string()) - .or_insert_with(|| ScipDocumentBuilder::new(relative)); - } - - for top_mod in ingot.all_modules(db) { - let scope_graph = top_mod.scope_graph(db); - let Some(doc_url) = top_mod_url(db, top_mod).map(|u| u.to_string()) else { - continue; - }; - - for item in scope_graph.items_dfs(db) { - let Some((symbol, display_name)) = item_symbol(db, item, &ingot_name, &ingot_version) - else { - continue; - }; - - if let Some(doc) = documents.get_mut(&doc_url) { - if doc.seen_symbols.insert(symbol.clone()) { - doc.symbols.push(types::SymbolInformation { - symbol: symbol.clone(), - documentation: build_symbol_documentation(db, item), - relationships: Vec::new(), - kind: item_symbol_kind(item).into(), - display_name, - signature_documentation: None.into(), - enclosing_symbol: String::new(), - special_fields: Default::default(), - }); - } - - if let Some(name_span) = item.name_span().and_then(|span| span.resolve(db)) - && let Some(range) = span_to_scip_range(&name_span, db) - { - push_occurrence( - doc, - range, - symbol.clone(), - types::SymbolRole::Definition as i32, - ); - } - } - - let target = Target::Scope(ScopeId::from_item(item)); - for ref_mod in ingot.all_modules(db) { - let refs = ref_mod.references_to_target(db, &target); - if refs.is_empty() { - continue; - } - let Some(ref_doc_url) = top_mod_url(db, ref_mod).map(|u| u.to_string()) else { - continue; - }; - let Some(ref_doc) = documents.get_mut(&ref_doc_url) else { - continue; - }; - - for matched in refs { - if let Some(resolved) = matched.span.resolve(db) - && let Some(range) = span_to_scip_range(&resolved, db) - { - push_occurrence(ref_doc, range, symbol.clone(), 0); - } - } - } - } - } - - let mut index = types::Index::new(); - index.metadata = Some(types::Metadata { - version: types::ProtocolVersion::UnspecifiedProtocolVersion.into(), - tool_info: Some(types::ToolInfo { - name: "fe-scip".to_string(), - version: env!("CARGO_PKG_VERSION").to_string(), - arguments: Vec::new(), - special_fields: Default::default(), - }) - .into(), - project_root: ingot_url.to_string(), - text_document_encoding: types::TextEncoding::UTF8.into(), - special_fields: Default::default(), - }) - .into(); - - let mut docs: Vec<_> = documents - .into_values() - .map(ScipDocumentBuilder::into_document) - .collect(); - docs.sort_by(|a, b| a.relative_path.cmp(&b.relative_path)); - index.documents = docs; - - Ok(index) -} - -#[cfg(test)] -mod tests { - use super::*; - use std::path::Path; - - fn file_url(path: &Path) -> url::Url { - url::Url::from_file_path(path).expect("file path to url") - } - - fn dir_url(path: &Path) -> url::Url { - url::Url::from_directory_path(path).expect("directory path to url") - } - - fn generate_test_scip(code: &str) -> types::Index { - let temp = tempfile::tempdir().expect("create temp dir"); - let file_path = temp.path().join("test.fe"); - let mut db = driver::DriverDataBase::default(); - let url = file_url(&file_path); - db.workspace() - .touch(&mut db, url.clone(), Some(code.to_string())); - let ingot_url = dir_url(temp.path()); - generate_scip(&mut db, &ingot_url).expect("generate scip index") - } - - #[test] - fn test_scip_basic_structure() { - let index = generate_test_scip("fn hello() -> i32 {\n 42\n}\n"); - - let metadata = index.metadata.as_ref().expect("metadata"); - assert_eq!( - metadata.tool_info.as_ref().expect("tool info").name, - "fe-scip" - ); - assert_eq!( - metadata.text_document_encoding.value(), - types::TextEncoding::UTF8 as i32 - ); - assert!(!index.documents.is_empty(), "should contain documents"); - } - - #[test] - fn test_scip_contains_symbols_and_occurrences() { - let code = r#"struct Point { - x: i32 - y: i32 -} - -fn make_point() -> Point { - Point { x: 1, y: 2 } -} -"#; - let index = generate_test_scip(code); - let doc = index - .documents - .iter() - .find(|d| d.relative_path == "test.fe") - .expect("document"); - - assert!( - doc.symbols.iter().any(|s| s.display_name == "Point"), - "expected Point symbol" - ); - assert!( - doc.occurrences - .iter() - .any(|o| (o.symbol_roles & (types::SymbolRole::Definition as i32)) != 0), - "expected at least one definition occurrence" - ); - } -} diff --git a/crates/fe/src/test/gas.rs b/crates/fe/src/test/gas.rs deleted file mode 100644 index 90249b222a..0000000000 --- a/crates/fe/src/test/gas.rs +++ /dev/null @@ -1,3128 +0,0 @@ -//! Gas comparison, measurement, CSV parsing, report writing, and aggregation. - -use camino::Utf8PathBuf; -use codegen::{ - OptLevel, SonatinaTestDebugConfig, TestMetadata, emit_test_module_sonatina, - emit_test_module_yul, -}; -use contract_harness::CallGasProfile; -use driver::DriverDataBase; -use hir::hir_def::TopLevelMod; -use rustc_hash::{FxHashMap, FxHashSet}; -use serde_json::Value; - -use crate::report::create_dir_all_utf8; - -use super::{ - ComparisonTotals, DEPLOYMENT_ATTRIBUTION_CSV_HEADER, - DEPLOYMENT_ATTRIBUTION_CSV_HEADER_WITH_SUITE, DEPLOYMENT_ATTRIBUTION_FIELD_COUNT, - DeltaMagnitudeTotals, DeploymentGasAttributionRow, DeploymentGasAttributionTotals, - EvmRuntimeMetrics, GasComparisonCase, GasHotspotRow, GasMagnitudeTotals, GasMeasurement, - GasTotals, ObservabilityCoverageRow, ObservabilityCoverageTotals, ObservabilityPcRange, - ObservabilityRuntimeSnapshot, OpcodeAggregateTotals, OpcodeMagnitudeTotals, ReportContext, - SuiteDeltaTotals, SymtabEntry, TestResult, TraceObservabilityHotspotRow, TraceSymbolHotspotRow, - YUL_VERIFY_RUNTIME, compile_and_run_test, emit_with_catch_unwind, test_case_matches_filter, - write_report_error, write_yul_case_artifacts, -}; - -#[allow(clippy::too_many_arguments)] -pub(super) fn collect_gas_comparison_cases( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - suite: &str, - filter: Option<&str>, - report: &ReportContext, - primary_backend: &str, - opt_level: OptLevel, - primary_cases: &[TestMetadata], -) -> Vec { - let mut by_symbol: FxHashMap = FxHashMap::default(); - let mut setup_errors = Vec::new(); - - for case in primary_cases - .iter() - .filter(|case| test_case_matches_filter(case, filter)) - { - let key = case.symbol_name.clone(); - let entry = by_symbol - .entry(key.clone()) - .or_insert_with(|| GasComparisonCase { - display_name: case.display_name.clone(), - symbol_name: key, - yul: None, - sonatina: None, - }); - - if primary_backend.eq_ignore_ascii_case("yul") { - entry.yul = Some(case.clone()); - } else if primary_backend.eq_ignore_ascii_case("sonatina") { - entry.sonatina = Some(case.clone()); - } - } - - if primary_backend.eq_ignore_ascii_case("yul") { - let mut emit_output = String::new(); - match emit_with_catch_unwind( - || { - emit_test_module_sonatina( - db, - top_mod, - opt_level, - &SonatinaTestDebugConfig::default(), - ) - }, - "Sonatina", - suite, - None, - &mut emit_output, - ) { - Ok(output) => { - for case in output - .tests - .into_iter() - .filter(|case| test_case_matches_filter(case, filter)) - { - let key = case.symbol_name.clone(); - let entry = by_symbol - .entry(key.clone()) - .or_insert_with(|| GasComparisonCase { - display_name: case.display_name.clone(), - symbol_name: key, - yul: None, - sonatina: None, - }); - entry.sonatina = Some(case); - } - } - Err(results) => { - setup_errors.push(format!( - "failed to emit Sonatina tests for gas comparison:\n{}", - format_results_for_report(&results) - )); - } - } - } else if primary_backend.eq_ignore_ascii_case("sonatina") { - let mut emit_output = String::new(); - match emit_with_catch_unwind( - || emit_test_module_yul(db, top_mod), - "Yul", - suite, - None, - &mut emit_output, - ) { - Ok(output) => { - for case in output - .tests - .into_iter() - .filter(|case| test_case_matches_filter(case, filter)) - { - let key = case.symbol_name.clone(); - let entry = by_symbol - .entry(key.clone()) - .or_insert_with(|| GasComparisonCase { - display_name: case.display_name.clone(), - symbol_name: key, - yul: None, - sonatina: None, - }); - entry.yul = Some(case); - } - } - Err(results) => { - setup_errors.push(format!( - "failed to emit Yul tests for gas comparison:\n{}", - format_results_for_report(&results) - )); - } - } - } else { - setup_errors.push(format!( - "unknown backend `{primary_backend}` (expected 'yul' or 'sonatina')" - )); - } - - if !setup_errors.is_empty() { - write_report_error( - report, - "gas_comparison_setup_error.txt", - &setup_errors.join("\n\n"), - ); - } - - let mut cases: Vec<_> = by_symbol.into_values().collect(); - cases.sort_by(|a, b| a.display_name.cmp(&b.display_name)); - cases -} - -fn format_results_for_report(results: &[TestResult]) -> String { - let mut out = String::new(); - for result in results { - out.push_str(&format!("- {}\n", result.name)); - if let Some(msg) = &result.error_message { - out.push_str(&format!(" {msg}\n")); - } - } - if out.is_empty() { - "no additional details".to_string() - } else { - out - } -} - -fn measure_case_gas( - case: &TestMetadata, - backend: &str, - yul_optimize: bool, - collect_step_count: bool, -) -> GasMeasurement { - let outcome = compile_and_run_test( - case, - false, - backend, - yul_optimize, - None, - None, - None, - false, - collect_step_count, - ); - GasMeasurement::from_test_outcome(&outcome) -} - -fn normalize_inline_text(value: &str) -> String { - value.replace('\r', "\\r").replace('\n', "\\n") -} - -fn csv_escape(value: &str) -> String { - let value = normalize_inline_text(value); - if value.contains(',') || value.contains('"') { - format!("\"{}\"", value.replace('"', "\"\"")) - } else { - value - } -} - -fn parse_csv_fields(line: &str) -> Vec { - let mut fields = Vec::new(); - let mut current = String::new(); - let mut chars = line.chars().peekable(); - let mut in_quotes = false; - - while let Some(ch) = chars.next() { - match ch { - '"' => { - if in_quotes { - if chars.peek() == Some(&'"') { - current.push('"'); - let _ = chars.next(); - } else { - in_quotes = false; - } - } else if current.is_empty() { - in_quotes = true; - } else { - current.push(ch); - } - } - ',' if !in_quotes => { - fields.push(current); - current = String::new(); - } - _ => current.push(ch), - } - } - fields.push(current); - fields -} - -fn parse_optional_u64_cell(value: &str) -> Option { - value.trim().parse::().ok() -} - -fn parse_optional_i128_cell(value: &str) -> Option { - value.trim().parse::().ok() -} - -fn deployment_attribution_row_to_csv_line(row: &DeploymentGasAttributionRow) -> String { - let cells = [ - row.test.clone(), - row.symbol.clone(), - u64_cell(row.yul_unopt_step_total_gas), - u64_cell(row.yul_opt_step_total_gas), - u64_cell(row.sonatina_step_total_gas), - u64_cell(row.yul_unopt_create_opcode_gas), - u64_cell(row.yul_opt_create_opcode_gas), - u64_cell(row.sonatina_create_opcode_gas), - u64_cell(row.yul_unopt_create2_opcode_gas), - u64_cell(row.yul_opt_create2_opcode_gas), - u64_cell(row.sonatina_create2_opcode_gas), - u64_cell(row.yul_unopt_constructor_frame_gas), - u64_cell(row.yul_opt_constructor_frame_gas), - u64_cell(row.sonatina_constructor_frame_gas), - u64_cell(row.yul_unopt_non_constructor_frame_gas), - u64_cell(row.yul_opt_non_constructor_frame_gas), - u64_cell(row.sonatina_non_constructor_frame_gas), - u64_cell(row.yul_unopt_create_opcode_steps), - u64_cell(row.yul_opt_create_opcode_steps), - u64_cell(row.sonatina_create_opcode_steps), - u64_cell(row.yul_unopt_create2_opcode_steps), - u64_cell(row.yul_opt_create2_opcode_steps), - u64_cell(row.sonatina_create2_opcode_steps), - row.note.clone(), - ]; - let escaped: Vec = cells.into_iter().map(|cell| csv_escape(&cell)).collect(); - escaped.join(",") -} - -fn parse_deployment_attribution_row(fields: &[String]) -> Option { - if fields.len() != DEPLOYMENT_ATTRIBUTION_FIELD_COUNT { - return None; - } - Some(DeploymentGasAttributionRow { - test: fields[0].clone(), - symbol: fields[1].clone(), - yul_unopt_step_total_gas: parse_optional_u64_cell(&fields[2]), - yul_opt_step_total_gas: parse_optional_u64_cell(&fields[3]), - sonatina_step_total_gas: parse_optional_u64_cell(&fields[4]), - yul_unopt_create_opcode_gas: parse_optional_u64_cell(&fields[5]), - yul_opt_create_opcode_gas: parse_optional_u64_cell(&fields[6]), - sonatina_create_opcode_gas: parse_optional_u64_cell(&fields[7]), - yul_unopt_create2_opcode_gas: parse_optional_u64_cell(&fields[8]), - yul_opt_create2_opcode_gas: parse_optional_u64_cell(&fields[9]), - sonatina_create2_opcode_gas: parse_optional_u64_cell(&fields[10]), - yul_unopt_constructor_frame_gas: parse_optional_u64_cell(&fields[11]), - yul_opt_constructor_frame_gas: parse_optional_u64_cell(&fields[12]), - sonatina_constructor_frame_gas: parse_optional_u64_cell(&fields[13]), - yul_unopt_non_constructor_frame_gas: parse_optional_u64_cell(&fields[14]), - yul_opt_non_constructor_frame_gas: parse_optional_u64_cell(&fields[15]), - sonatina_non_constructor_frame_gas: parse_optional_u64_cell(&fields[16]), - yul_unopt_create_opcode_steps: parse_optional_u64_cell(&fields[17]), - yul_opt_create_opcode_steps: parse_optional_u64_cell(&fields[18]), - sonatina_create_opcode_steps: parse_optional_u64_cell(&fields[19]), - yul_unopt_create2_opcode_steps: parse_optional_u64_cell(&fields[20]), - yul_opt_create2_opcode_steps: parse_optional_u64_cell(&fields[21]), - sonatina_create2_opcode_steps: parse_optional_u64_cell(&fields[22]), - note: fields[23].clone(), - }) -} - -fn deployment_attribution_row_profiles_for_totals( - row: &DeploymentGasAttributionRow, -) -> Option<(CallGasProfile, CallGasProfile)> { - let yul_opt_total_step_gas = row.yul_opt_step_total_gas?; - let sonatina_total_step_gas = row.sonatina_step_total_gas?; - let yul_opt_profile = CallGasProfile { - total_step_gas: yul_opt_total_step_gas, - create_opcode_gas: row.yul_opt_create_opcode_gas.unwrap_or(0), - create2_opcode_gas: row.yul_opt_create2_opcode_gas.unwrap_or(0), - constructor_frame_gas: row.yul_opt_constructor_frame_gas.unwrap_or(0), - non_constructor_frame_gas: row.yul_opt_non_constructor_frame_gas.unwrap_or(0), - ..CallGasProfile::default() - }; - let sonatina_profile = CallGasProfile { - total_step_gas: sonatina_total_step_gas, - create_opcode_gas: row.sonatina_create_opcode_gas.unwrap_or(0), - create2_opcode_gas: row.sonatina_create2_opcode_gas.unwrap_or(0), - constructor_frame_gas: row.sonatina_constructor_frame_gas.unwrap_or(0), - non_constructor_frame_gas: row.sonatina_non_constructor_frame_gas.unwrap_or(0), - ..CallGasProfile::default() - }; - Some((yul_opt_profile, sonatina_profile)) -} - -fn gas_profile_partition_violation(label: &str, profile: CallGasProfile) -> Option { - let opcode_partition_delta = profile.create_opcode_gas as i128 - + profile.create2_opcode_gas as i128 - + profile.non_create_opcode_gas as i128 - - profile.total_step_gas as i128; - let frame_partition_delta = profile.constructor_frame_gas as i128 - + profile.non_constructor_frame_gas as i128 - - profile.total_step_gas as i128; - if opcode_partition_delta == 0 && frame_partition_delta == 0 { - None - } else { - Some(format!( - "{label} attribution_residual(opcode={opcode_partition_delta}, frame={frame_partition_delta})" - )) - } -} - -fn parse_symtab_entries(contents: &str) -> Vec { - let mut rows = Vec::new(); - for line in contents.lines() { - let line = line.trim(); - if !line.starts_with("off=") { - continue; - } - // Format: - // off= 3996 size= 700 test_erc20__StorPtr_Evm___... - let mut parts = line.split_whitespace(); - let off_token = parts.next().unwrap_or_default(); - let off_value = parts.next().unwrap_or_default(); - let size_token = parts.next().unwrap_or_default(); - let size_value = parts.next().unwrap_or_default(); - if off_token != "off=" || size_token != "size=" { - continue; - } - let Ok(start) = off_value.parse::() else { - continue; - }; - let Ok(size) = size_value.parse::() else { - continue; - }; - let symbol = parts.collect::>().join(" "); - if symbol.is_empty() { - continue; - } - rows.push(SymtabEntry { - start, - end: start.saturating_add(size), - symbol, - }); - } - rows.sort_by_key(|row| row.start); - rows -} - -fn parse_trace_tail_pcs(contents: &str) -> Vec { - let mut pcs = Vec::new(); - for line in contents.lines() { - let Some(rest) = line.strip_prefix("pc=") else { - continue; - }; - let mut parts = rest.split_whitespace(); - let Some(pc_text) = parts.next() else { - continue; - }; - if let Ok(pc) = pc_text.parse::() { - pcs.push(pc); - } - } - pcs -} - -fn map_pc_to_symbol(pc: u32, symtab: &[SymtabEntry]) -> Option<&str> { - let mut lo = 0usize; - let mut hi = symtab.len(); - while lo < hi { - let mid = (lo + hi) / 2; - let row = &symtab[mid]; - if pc < row.start { - hi = mid; - } else if pc >= row.end { - lo = mid + 1; - } else { - return Some(&row.symbol); - } - } - None -} - -fn json_u64(value: Option<&Value>) -> u64 { - value.and_then(Value::as_u64).unwrap_or(0) -} - -fn parse_observability_runtime_snapshot(contents: &str) -> Option { - let root: Value = serde_json::from_str(contents).ok()?; - let section = root - .get("sections") - .and_then(Value::as_array)? - .iter() - .find(|entry| entry.get("section").and_then(Value::as_str) == Some("runtime"))?; - - let unmapped_obj = section - .get("unmapped_reason_coverage") - .and_then(Value::as_object); - let unmapped_reason = |key: &str| -> u64 { - unmapped_obj - .and_then(|obj| obj.get(key)) - .and_then(Value::as_u64) - .unwrap_or(0) - }; - - let mut pc_ranges = Vec::new(); - if let Some(entries) = section.get("pc_map").and_then(Value::as_array) { - for entry in entries { - let start = entry.get("pc_start").and_then(Value::as_u64); - let end = entry.get("pc_end").and_then(Value::as_u64); - let (Some(start), Some(end)) = (start, end) else { - continue; - }; - if end <= start || end > u32::MAX as u64 { - continue; - } - let func_name = entry - .get("func_name") - .and_then(Value::as_str) - .unwrap_or("") - .to_string(); - let reason = entry - .get("reason") - .and_then(Value::as_str) - .map(str::to_string); - pc_ranges.push(ObservabilityPcRange { - start: start as u32, - end: end as u32, - func_name, - reason, - }); - } - } - pc_ranges.sort_by_key(|range| range.start); - - Some(ObservabilityRuntimeSnapshot { - section: section - .get("section") - .and_then(Value::as_str) - .unwrap_or("runtime") - .to_string(), - schema_version: section - .get("schema_version") - .and_then(Value::as_str) - .unwrap_or("-") - .to_string(), - section_bytes: json_u64(section.get("section_bytes")), - code_bytes: json_u64(section.get("code_bytes")), - data_bytes: json_u64(section.get("data_bytes")), - embed_bytes: json_u64(section.get("embed_bytes")), - mapped_code_bytes: json_u64(section.get("mapped_code_bytes")), - unmapped_code_bytes: json_u64(section.get("unmapped_code_bytes")), - unmapped_no_ir_inst: unmapped_reason("no_ir_inst"), - unmapped_label_or_fixup_only: unmapped_reason("label_or_fixup_only"), - unmapped_synthetic: unmapped_reason("synthetic"), - unmapped_unknown: unmapped_reason("unknown"), - pc_ranges, - }) -} - -fn load_suite_observability_runtime( - suite_dir: &Utf8PathBuf, - suite: &str, -) -> ( - Vec, - FxHashMap>, -) { - let mut rows = Vec::new(); - let mut ranges_by_test: FxHashMap> = FxHashMap::default(); - let tests_dir = suite_dir.join("artifacts").join("tests"); - let Ok(entries) = std::fs::read_dir(&tests_dir) else { - return (rows, ranges_by_test); - }; - for entry in entries.flatten() { - let path = entry.path(); - if !path.is_dir() { - continue; - } - let test = entry.file_name().to_string_lossy().to_string(); - let obs_path = path.join("sonatina").join("observability.json"); - let Ok(contents) = std::fs::read_to_string(&obs_path) else { - continue; - }; - let Some(snapshot) = parse_observability_runtime_snapshot(&contents) else { - continue; - }; - rows.push(ObservabilityCoverageRow { - suite: suite.to_string(), - test: test.clone(), - section: snapshot.section, - schema_version: snapshot.schema_version, - section_bytes: snapshot.section_bytes, - code_bytes: snapshot.code_bytes, - data_bytes: snapshot.data_bytes, - embed_bytes: snapshot.embed_bytes, - mapped_code_bytes: snapshot.mapped_code_bytes, - unmapped_code_bytes: snapshot.unmapped_code_bytes, - unmapped_no_ir_inst: snapshot.unmapped_no_ir_inst, - unmapped_label_or_fixup_only: snapshot.unmapped_label_or_fixup_only, - unmapped_synthetic: snapshot.unmapped_synthetic, - unmapped_unknown: snapshot.unmapped_unknown, - }); - ranges_by_test.insert(test, snapshot.pc_ranges); - } - rows.sort_by(|a, b| a.test.cmp(&b.test).then_with(|| a.section.cmp(&b.section))); - (rows, ranges_by_test) -} - -fn map_pc_to_observability( - pc: u32, - ranges: &[ObservabilityPcRange], -) -> Option<&ObservabilityPcRange> { - let mut lo = 0usize; - let mut hi = ranges.len(); - while lo < hi { - let mid = (lo + hi) / 2; - let range = &ranges[mid]; - if pc < range.start { - hi = mid; - } else if pc >= range.end { - lo = mid + 1; - } else { - return Some(range); - } - } - None -} - -fn resolve_observability_test_ranges<'a>( - suite: &str, - trace_test_name: &'a str, - ranges_by_test: &'a FxHashMap>, -) -> Option<&'a [ObservabilityPcRange]> { - let suite_prefixed = format!("{suite}__"); - let mut candidates: Vec<&str> = Vec::new(); - candidates.push(trace_test_name); - if let Some(stripped) = trace_test_name.strip_prefix(&suite_prefixed) { - candidates.push(stripped); - } - if let Some((_, suffix)) = trace_test_name.split_once("__") { - candidates.push(suffix); - } - if let Some((_, suffix)) = trace_test_name.rsplit_once("__") { - candidates.push(suffix); - } - - let mut seen: Vec<&str> = Vec::new(); - for candidate in candidates { - if seen.contains(&candidate) { - continue; - } - seen.push(candidate); - if let Some(ranges) = ranges_by_test.get(candidate) { - return Some(ranges.as_slice()); - } - } - - None -} - -pub(super) fn evm_runtime_metrics_from_bytes(bytes: &[u8]) -> EvmRuntimeMetrics { - let mut metrics = EvmRuntimeMetrics { - byte_len: bytes.len(), - ..EvmRuntimeMetrics::default() - }; - let mut idx = 0usize; - while idx < bytes.len() { - let op = bytes[idx]; - idx += 1; - metrics.op_count += 1; - match op { - 0x5f => metrics.push_ops += 1, // PUSH0 - 0x50 => metrics.pop_ops += 1, - 0x51 => metrics.mload_ops += 1, - 0x52 => metrics.mstore_ops += 1, - 0x54 => metrics.sload_ops += 1, - 0x55 => metrics.sstore_ops += 1, - 0x56 => metrics.jump_ops += 1, - 0x57 => metrics.jumpi_ops += 1, - 0x5b => metrics.jumpdest_ops += 1, - 0x15 => metrics.iszero_ops += 1, - 0x20 => metrics.keccak_ops += 1, - 0x37 => metrics.calldatacopy_ops += 1, - 0x3e => metrics.returndatacopy_ops += 1, - 0x5e => metrics.mcopy_ops += 1, - 0xf1 => metrics.call_ops += 1, - 0xfa => metrics.staticcall_ops += 1, - 0xf3 => metrics.return_ops += 1, - 0xfd => metrics.revert_ops += 1, - 0x60..=0x7f => { - metrics.push_ops += 1; - let push_n = (op - 0x5f) as usize; - idx = idx.saturating_add(push_n).min(bytes.len()); - } - 0x80..=0x8f => metrics.dup_ops += 1, - 0x90..=0x9f => metrics.swap_ops += 1, - _ => {} - } - } - metrics -} - -pub(super) fn evm_runtime_metrics_from_hex(runtime_hex: &str) -> Option { - let bytes = hex::decode(runtime_hex.trim()).ok()?; - Some(evm_runtime_metrics_from_bytes(&bytes)) -} - -fn usize_cell(value: Option) -> String { - value - .map(|v| v.to_string()) - .unwrap_or_else(|| "n/a".to_string()) -} - -fn u64_cell(value: Option) -> String { - value - .map(|v| v.to_string()) - .unwrap_or_else(|| "n/a".to_string()) -} - -fn ratio_cell_usize(numerator: Option, denominator: Option) -> String { - match (numerator, denominator) { - (Some(n), Some(d)) if d > 0 => format!("{:.2}", n as f64 / d as f64), - _ => "n/a".to_string(), - } -} - -fn ratio_cell_u64(numerator: Option, denominator: Option) -> String { - match (numerator, denominator) { - (Some(n), Some(d)) if d > 0 => format!("{:.2}", n as f64 / d as f64), - _ => "n/a".to_string(), - } -} - -fn stack_ops_pct_cell(metrics: Option) -> String { - match metrics { - Some(metrics) if metrics.op_count > 0 => { - format!( - "{:.2}%", - (metrics.stack_ops_total() as f64 * 100.0) / (metrics.op_count as f64) - ) - } - _ => "n/a".to_string(), - } -} - -fn format_ratio_percent(numerator: usize, denominator: usize) -> String { - if denominator == 0 { - "n/a".to_string() - } else { - format!("{:.1}%", (numerator as f64 * 100.0) / (denominator as f64)) - } -} - -fn format_delta_percent(delta: i128, baseline: u64) -> String { - if baseline == 0 { - "n/a".to_string() - } else { - let pct = (delta as f64 * 100.0) / (baseline as f64); - format!("{pct:.2}%") - } -} - -fn gas_comparison_settings_text( - primary_backend: &str, - yul_primary_optimize: bool, - opt_level: OptLevel, -) -> String { - let mut out = String::new(); - out.push_str(&format!( - "primary.backend={}\n", - primary_backend.to_lowercase() - )); - if primary_backend.eq_ignore_ascii_case("yul") { - out.push_str(&format!("yul.primary.optimize={yul_primary_optimize}\n")); - } else { - out.push_str("yul.primary.optimize=n/a\n"); - } - out.push_str("yul.compare.unoptimized.optimize=false\n"); - out.push_str("yul.compare.optimized.optimize=true\n"); - out.push_str(&format!("yul.solc.verify_runtime={YUL_VERIFY_RUNTIME}\n")); - out.push_str(&format!("sonatina.opt_level={opt_level}\n")); - out.push_str("sonatina.codegen.path=emit_test_module_sonatina (default)\n"); - out.push_str("measurement.call=RuntimeInstance::call_raw(empty calldata)\n"); - out.push_str("measurement.deploy=RuntimeInstance::deploy_tracked(init bytecode)\n"); - out.push_str("measurement.total=deploy_gas + call_gas (when both are available)\n"); - out -} - -fn write_comparison_totals_rows( - out: &mut String, - baseline: &str, - comparison: ComparisonTotals, - tests_in_scope: usize, -) { - out.push_str(&format!( - "{baseline},compared_with_gas,{},{},{}\n", - comparison.compared_with_gas, - format_ratio_percent(comparison.compared_with_gas, comparison.compared_with_gas), - format_ratio_percent(comparison.compared_with_gas, tests_in_scope) - )); - out.push_str(&format!( - "{baseline},sonatina_lower,{},{},{}\n", - comparison.sonatina_lower, - format_ratio_percent(comparison.sonatina_lower, comparison.compared_with_gas), - format_ratio_percent(comparison.sonatina_lower, tests_in_scope) - )); - out.push_str(&format!( - "{baseline},sonatina_higher,{},{},{}\n", - comparison.sonatina_higher, - format_ratio_percent(comparison.sonatina_higher, comparison.compared_with_gas), - format_ratio_percent(comparison.sonatina_higher, tests_in_scope) - )); - out.push_str(&format!( - "{baseline},equal,{},{},{}\n", - comparison.equal, - format_ratio_percent(comparison.equal, comparison.compared_with_gas), - format_ratio_percent(comparison.equal, tests_in_scope) - )); - out.push_str(&format!( - "{baseline},incomplete,{},n/a,{}\n", - comparison.incomplete, - format_ratio_percent(comparison.incomplete, tests_in_scope) - )); -} - -fn write_gas_totals_csv(path: &Utf8PathBuf, totals: GasTotals) { - let mut out = String::new(); - out.push_str("baseline,metric,count,pct_of_compared,pct_of_scope\n"); - out.push_str(&format!( - "all,tests_in_scope,{},n/a,{}\n", - totals.tests_in_scope, - format_ratio_percent(totals.tests_in_scope, totals.tests_in_scope) - )); - write_comparison_totals_rows( - &mut out, - "yul_unopt", - totals.vs_yul_unopt, - totals.tests_in_scope, - ); - write_comparison_totals_rows( - &mut out, - "yul_opt", - totals.vs_yul_opt, - totals.tests_in_scope, - ); - - let _ = std::fs::write(path, out); -} - -fn write_magnitude_totals_rows(out: &mut String, baseline: &str, totals: DeltaMagnitudeTotals) { - out.push_str(&format!( - "{baseline},compared_with_gas,{}\n", - totals.compared_with_gas - )); - out.push_str(&format!("{baseline},pct_rows,{}\n", totals.pct_rows)); - out.push_str(&format!( - "{baseline},baseline_gas_sum,{}\n", - totals.baseline_gas_sum - )); - out.push_str(&format!( - "{baseline},sonatina_gas_sum,{}\n", - totals.sonatina_gas_sum - )); - out.push_str(&format!( - "{baseline},delta_gas_sum,{}\n", - totals.delta_gas_sum - )); - out.push_str(&format!( - "{baseline},abs_delta_gas_sum,{}\n", - totals.abs_delta_gas_sum - )); - out.push_str(&format!( - "{baseline},delta_pct_sum,{:.6}\n", - totals.delta_pct_sum - )); - out.push_str(&format!( - "{baseline},abs_delta_pct_sum,{:.6}\n", - totals.abs_delta_pct_sum - )); -} - -fn write_gas_magnitude_csv(path: &Utf8PathBuf, totals: GasMagnitudeTotals) { - let mut out = String::new(); - out.push_str("baseline,metric,value\n"); - write_magnitude_totals_rows(&mut out, "yul_unopt", totals.vs_yul_unopt); - write_magnitude_totals_rows(&mut out, "yul_opt", totals.vs_yul_opt); - let _ = std::fs::write(path, out); -} - -fn write_gas_breakdown_magnitude_component_rows( - out: &mut String, - baseline: &str, - component: &str, - totals: DeltaMagnitudeTotals, -) { - out.push_str(&format!( - "{baseline},{component},compared_with_gas,{}\n", - totals.compared_with_gas - )); - out.push_str(&format!( - "{baseline},{component},pct_rows,{}\n", - totals.pct_rows - )); - out.push_str(&format!( - "{baseline},{component},baseline_gas_sum,{}\n", - totals.baseline_gas_sum - )); - out.push_str(&format!( - "{baseline},{component},sonatina_gas_sum,{}\n", - totals.sonatina_gas_sum - )); - out.push_str(&format!( - "{baseline},{component},delta_gas_sum,{}\n", - totals.delta_gas_sum - )); - out.push_str(&format!( - "{baseline},{component},abs_delta_gas_sum,{}\n", - totals.abs_delta_gas_sum - )); - out.push_str(&format!( - "{baseline},{component},delta_pct_sum,{:.6}\n", - totals.delta_pct_sum - )); - out.push_str(&format!( - "{baseline},{component},abs_delta_pct_sum,{:.6}\n", - totals.abs_delta_pct_sum - )); -} - -fn write_gas_breakdown_magnitude_csv( - path: &Utf8PathBuf, - call_totals: GasMagnitudeTotals, - deploy_totals: GasMagnitudeTotals, - total_totals: GasMagnitudeTotals, -) { - let mut out = String::new(); - out.push_str("baseline,component,metric,value\n"); - write_gas_breakdown_magnitude_component_rows( - &mut out, - "yul_unopt", - "call", - call_totals.vs_yul_unopt, - ); - write_gas_breakdown_magnitude_component_rows( - &mut out, - "yul_opt", - "call", - call_totals.vs_yul_opt, - ); - write_gas_breakdown_magnitude_component_rows( - &mut out, - "yul_unopt", - "deploy", - deploy_totals.vs_yul_unopt, - ); - write_gas_breakdown_magnitude_component_rows( - &mut out, - "yul_opt", - "deploy", - deploy_totals.vs_yul_opt, - ); - write_gas_breakdown_magnitude_component_rows( - &mut out, - "yul_unopt", - "total", - total_totals.vs_yul_unopt, - ); - write_gas_breakdown_magnitude_component_rows( - &mut out, - "yul_opt", - "total", - total_totals.vs_yul_opt, - ); - let _ = std::fs::write(path, out); -} - -fn write_opcode_magnitude_rows(out: &mut String, side: &str, totals: OpcodeAggregateTotals) { - out.push_str(&format!("{side},steps_sum,{}\n", totals.steps_sum)); - out.push_str(&format!( - "{side},runtime_bytes_sum,{}\n", - totals.runtime_bytes_sum - )); - out.push_str(&format!( - "{side},runtime_ops_sum,{}\n", - totals.runtime_ops_sum - )); - out.push_str(&format!("{side},swap_ops_sum,{}\n", totals.swap_ops_sum)); - out.push_str(&format!("{side},pop_ops_sum,{}\n", totals.pop_ops_sum)); - out.push_str(&format!("{side},jump_ops_sum,{}\n", totals.jump_ops_sum)); - out.push_str(&format!("{side},jumpi_ops_sum,{}\n", totals.jumpi_ops_sum)); - out.push_str(&format!( - "{side},iszero_ops_sum,{}\n", - totals.iszero_ops_sum - )); - out.push_str(&format!( - "{side},mem_rw_ops_sum,{}\n", - totals.mem_rw_ops_sum - )); - out.push_str(&format!( - "{side},storage_rw_ops_sum,{}\n", - totals.storage_rw_ops_sum - )); - out.push_str(&format!("{side},mload_ops_sum,{}\n", totals.mload_ops_sum)); - out.push_str(&format!( - "{side},mstore_ops_sum,{}\n", - totals.mstore_ops_sum - )); - out.push_str(&format!("{side},sload_ops_sum,{}\n", totals.sload_ops_sum)); - out.push_str(&format!( - "{side},sstore_ops_sum,{}\n", - totals.sstore_ops_sum - )); - out.push_str(&format!( - "{side},keccak_ops_sum,{}\n", - totals.keccak_ops_sum - )); - out.push_str(&format!( - "{side},call_family_ops_sum,{}\n", - totals.call_family_ops_sum - )); - out.push_str(&format!("{side},copy_ops_sum,{}\n", totals.copy_ops_sum)); -} - -fn write_opcode_magnitude_csv(path: &Utf8PathBuf, totals: OpcodeMagnitudeTotals) { - let mut out = String::new(); - out.push_str("side,metric,value\n"); - out.push_str(&format!( - "all,compared_with_metrics,{}\n", - totals.compared_with_metrics - )); - write_opcode_magnitude_rows(&mut out, "yul_opt", totals.yul_opt); - write_opcode_magnitude_rows(&mut out, "sonatina", totals.sonatina); - let _ = std::fs::write(path, out); -} - -fn write_gas_hotspots_csv(path: &Utf8PathBuf, rows: &[GasHotspotRow]) { - let mut sorted = rows.to_vec(); - sorted.sort_by(|a, b| b.delta_vs_yul_opt.cmp(&a.delta_vs_yul_opt)); - - let total_delta: i128 = sorted.iter().map(|row| row.delta_vs_yul_opt).sum(); - let mut cumulative: i128 = 0; - - let mut out = String::new(); - out.push_str("rank,suite,test,symbol,yul_opt_gas,sonatina_gas,delta_vs_yul_opt,delta_vs_yul_opt_pct,share_of_total_delta_pct,cumulative_share_pct\n"); - for (idx, row) in sorted.into_iter().enumerate() { - cumulative += row.delta_vs_yul_opt; - let share = ratio_percent_i128(row.delta_vs_yul_opt, total_delta) - .map(|v| format!("{v:.2}%")) - .unwrap_or_else(|| "n/a".to_string()); - let cumulative_share = ratio_percent_i128(cumulative, total_delta) - .map(|v| format!("{v:.2}%")) - .unwrap_or_else(|| "n/a".to_string()); - out.push_str(&format!( - "{},{},{},{},{},{},{},{},{},{}\n", - idx + 1, - csv_escape(&row.suite), - csv_escape(&row.test), - csv_escape(&row.symbol), - csv_escape(&u64_cell(row.yul_opt_gas)), - csv_escape(&u64_cell(row.sonatina_gas)), - row.delta_vs_yul_opt, - csv_escape(&row.delta_vs_yul_opt_pct), - csv_escape(&share), - csv_escape(&cumulative_share) - )); - } - let _ = std::fs::write(path, out); -} - -fn write_suite_delta_summary_csv(path: &Utf8PathBuf, suite_rollup: &[(String, SuiteDeltaTotals)]) { - let total_delta: i128 = suite_rollup - .iter() - .map(|(_, totals)| totals.delta_vs_yul_opt_sum) - .sum(); - let mut out = String::new(); - out.push_str("suite,tests_with_delta,delta_vs_yul_opt_sum,avg_delta_vs_yul_opt,share_of_total_delta_pct\n"); - for (suite, totals) in suite_rollup { - let avg = if totals.tests_with_delta == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}", - totals.delta_vs_yul_opt_sum as f64 / totals.tests_with_delta as f64 - ) - }; - let share = ratio_percent_i128(totals.delta_vs_yul_opt_sum, total_delta) - .map(|v| format!("{v:.2}%")) - .unwrap_or_else(|| "n/a".to_string()); - out.push_str(&format!( - "{},{},{},{},{}\n", - csv_escape(suite), - totals.tests_with_delta, - totals.delta_vs_yul_opt_sum, - csv_escape(&avg), - csv_escape(&share), - )); - } - let _ = std::fs::write(path, out); -} - -fn write_trace_symbol_hotspots_csv(path: &Utf8PathBuf, rows: &[TraceSymbolHotspotRow]) { - let mut sorted = rows.to_vec(); - sorted.sort_by(|a, b| { - b.steps_in_symbol - .cmp(&a.steps_in_symbol) - .then_with(|| a.suite.cmp(&b.suite)) - .then_with(|| a.test.cmp(&b.test)) - }); - - let mut out = String::new(); - out.push_str("suite,test,symbol,tail_steps_total,tail_steps_mapped,steps_in_symbol,symbol_share_of_tail_pct\n"); - for row in sorted { - let pct = if row.tail_steps_total == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}%", - (row.steps_in_symbol as f64 * 100.0) / row.tail_steps_total as f64 - ) - }; - out.push_str(&format!( - "{},{},{},{},{},{},{}\n", - csv_escape(&row.suite), - csv_escape(&row.test), - csv_escape(&row.symbol), - row.tail_steps_total, - row.tail_steps_mapped, - row.steps_in_symbol, - csv_escape(&pct) - )); - } - let _ = std::fs::write(path, out); -} - -fn write_observability_coverage_csv(path: &Utf8PathBuf, rows: &[ObservabilityCoverageRow]) { - let mut sorted = rows.to_vec(); - sorted.sort_by(|a, b| { - a.suite - .cmp(&b.suite) - .then_with(|| a.test.cmp(&b.test)) - .then_with(|| a.section.cmp(&b.section)) - }); - - let mut out = String::new(); - out.push_str("suite,test,section,schema_version,section_bytes,code_bytes,data_bytes,embed_bytes,mapped_code_bytes,unmapped_code_bytes,mapped_code_pct,unmapped_code_pct,unmapped_no_ir_inst,unmapped_label_or_fixup_only,unmapped_synthetic,unmapped_unknown\n"); - for row in sorted { - let mapped_pct = if row.code_bytes == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}%", - (row.mapped_code_bytes as f64 * 100.0) / row.code_bytes as f64 - ) - }; - let unmapped_pct = if row.code_bytes == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}%", - (row.unmapped_code_bytes as f64 * 100.0) / row.code_bytes as f64 - ) - }; - out.push_str(&format!( - "{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}\n", - csv_escape(&row.suite), - csv_escape(&row.test), - csv_escape(&row.section), - csv_escape(&row.schema_version), - row.section_bytes, - row.code_bytes, - row.data_bytes, - row.embed_bytes, - row.mapped_code_bytes, - row.unmapped_code_bytes, - csv_escape(&mapped_pct), - csv_escape(&unmapped_pct), - row.unmapped_no_ir_inst, - row.unmapped_label_or_fixup_only, - row.unmapped_synthetic, - row.unmapped_unknown, - )); - } - let _ = std::fs::write(path, out); -} - -fn write_trace_observability_hotspots_csv( - path: &Utf8PathBuf, - rows: &[TraceObservabilityHotspotRow], -) { - let mut sorted = rows.to_vec(); - sorted.sort_by(|a, b| { - b.steps_in_bucket - .cmp(&a.steps_in_bucket) - .then_with(|| a.suite.cmp(&b.suite)) - .then_with(|| a.test.cmp(&b.test)) - .then_with(|| a.function.cmp(&b.function)) - .then_with(|| a.reason.cmp(&b.reason)) - }); - - let mut out = String::new(); - out.push_str("suite,test,function,reason,tail_steps_total,tail_steps_mapped,steps_in_bucket,bucket_share_of_tail_pct\n"); - for row in sorted { - let pct = if row.tail_steps_total == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}%", - (row.steps_in_bucket as f64 * 100.0) / row.tail_steps_total as f64 - ) - }; - out.push_str(&format!( - "{},{},{},{},{},{},{},{}\n", - csv_escape(&row.suite), - csv_escape(&row.test), - csv_escape(&row.function), - csv_escape(&row.reason), - row.tail_steps_total, - row.tail_steps_mapped, - row.steps_in_bucket, - csv_escape(&pct), - )); - } - let _ = std::fs::write(path, out); -} - -fn parse_gas_totals_csv(contents: &str) -> GasTotals { - let mut totals = GasTotals::default(); - for (idx, line) in contents.lines().enumerate() { - if idx == 0 || line.trim().is_empty() { - continue; - } - let mut parts = line.splitn(5, ','); - let baseline = parts.next().unwrap_or_default().trim(); - let metric = parts.next().unwrap_or_default().trim(); - let count = parts - .next() - .and_then(|raw| raw.trim().parse::().ok()) - .unwrap_or(0); - match (baseline, metric) { - ("all", "tests_in_scope") => totals.tests_in_scope = count, - ("yul_unopt", "compared_with_gas") => totals.vs_yul_unopt.compared_with_gas = count, - ("yul_unopt", "sonatina_lower") => totals.vs_yul_unopt.sonatina_lower = count, - ("yul_unopt", "sonatina_higher") => totals.vs_yul_unopt.sonatina_higher = count, - ("yul_unopt", "equal") => totals.vs_yul_unopt.equal = count, - ("yul_unopt", "incomplete") => totals.vs_yul_unopt.incomplete = count, - ("yul_opt", "compared_with_gas") => totals.vs_yul_opt.compared_with_gas = count, - ("yul_opt", "sonatina_lower") => totals.vs_yul_opt.sonatina_lower = count, - ("yul_opt", "sonatina_higher") => totals.vs_yul_opt.sonatina_higher = count, - ("yul_opt", "equal") => totals.vs_yul_opt.equal = count, - ("yul_opt", "incomplete") => totals.vs_yul_opt.incomplete = count, - _ => {} - } - } - totals -} - -fn parse_gas_magnitude_csv(contents: &str) -> GasMagnitudeTotals { - let mut totals = GasMagnitudeTotals::default(); - for (idx, line) in contents.lines().enumerate() { - if idx == 0 || line.trim().is_empty() { - continue; - } - let mut parts = line.splitn(3, ','); - let baseline = parts.next().unwrap_or_default().trim(); - let metric = parts.next().unwrap_or_default().trim(); - let value = parts.next().unwrap_or_default().trim(); - let target = match baseline { - "yul_unopt" => &mut totals.vs_yul_unopt, - "yul_opt" => &mut totals.vs_yul_opt, - _ => continue, - }; - match metric { - "compared_with_gas" => { - target.compared_with_gas = value.parse::().unwrap_or(0); - } - "pct_rows" => { - target.pct_rows = value.parse::().unwrap_or(0); - } - "baseline_gas_sum" => { - target.baseline_gas_sum = value.parse::().unwrap_or(0); - } - "sonatina_gas_sum" => { - target.sonatina_gas_sum = value.parse::().unwrap_or(0); - } - "delta_gas_sum" => { - target.delta_gas_sum = value.parse::().unwrap_or(0); - } - "abs_delta_gas_sum" => { - target.abs_delta_gas_sum = value.parse::().unwrap_or(0); - } - "delta_pct_sum" => { - target.delta_pct_sum = value.parse::().unwrap_or(0.0); - } - "abs_delta_pct_sum" => { - target.abs_delta_pct_sum = value.parse::().unwrap_or(0.0); - } - _ => {} - } - } - totals -} - -fn parse_gas_breakdown_magnitude_csv( - contents: &str, -) -> (GasMagnitudeTotals, GasMagnitudeTotals, GasMagnitudeTotals) { - let mut call_totals = GasMagnitudeTotals::default(); - let mut deploy_totals = GasMagnitudeTotals::default(); - let mut total_totals = GasMagnitudeTotals::default(); - for (idx, line) in contents.lines().enumerate() { - if idx == 0 || line.trim().is_empty() { - continue; - } - let mut parts = line.splitn(4, ','); - let baseline = parts.next().unwrap_or_default().trim(); - let component = parts.next().unwrap_or_default().trim(); - let metric = parts.next().unwrap_or_default().trim(); - let value = parts.next().unwrap_or_default().trim(); - - let component_totals = match component { - "call" => &mut call_totals, - "deploy" => &mut deploy_totals, - "total" => &mut total_totals, - _ => continue, - }; - - let target = match baseline { - "yul_unopt" => &mut component_totals.vs_yul_unopt, - "yul_opt" => &mut component_totals.vs_yul_opt, - _ => continue, - }; - - match metric { - "compared_with_gas" => { - target.compared_with_gas = value.parse::().unwrap_or(0); - } - "pct_rows" => { - target.pct_rows = value.parse::().unwrap_or(0); - } - "baseline_gas_sum" => { - target.baseline_gas_sum = value.parse::().unwrap_or(0); - } - "sonatina_gas_sum" => { - target.sonatina_gas_sum = value.parse::().unwrap_or(0); - } - "delta_gas_sum" => { - target.delta_gas_sum = value.parse::().unwrap_or(0); - } - "abs_delta_gas_sum" => { - target.abs_delta_gas_sum = value.parse::().unwrap_or(0); - } - "delta_pct_sum" => { - target.delta_pct_sum = value.parse::().unwrap_or(0.0); - } - "abs_delta_pct_sum" => { - target.abs_delta_pct_sum = value.parse::().unwrap_or(0.0); - } - _ => {} - } - } - (call_totals, deploy_totals, total_totals) -} - -fn parse_gas_opcode_magnitude_csv(contents: &str) -> OpcodeMagnitudeTotals { - let mut totals = OpcodeMagnitudeTotals::default(); - for (idx, line) in contents.lines().enumerate() { - if idx == 0 || line.trim().is_empty() { - continue; - } - let mut parts = line.splitn(3, ','); - let side = parts.next().unwrap_or_default().trim(); - let metric = parts.next().unwrap_or_default().trim(); - let value = parts.next().unwrap_or_default().trim(); - if side == "all" && metric == "compared_with_metrics" { - totals.compared_with_metrics = value.parse::().unwrap_or(0); - continue; - } - let target = match side { - "yul_opt" => &mut totals.yul_opt, - "sonatina" => &mut totals.sonatina, - _ => continue, - }; - let parsed = value.parse::().unwrap_or(0); - match metric { - "steps_sum" => target.steps_sum = parsed, - "runtime_bytes_sum" => target.runtime_bytes_sum = parsed, - "runtime_ops_sum" => target.runtime_ops_sum = parsed, - "swap_ops_sum" => target.swap_ops_sum = parsed, - "pop_ops_sum" => target.pop_ops_sum = parsed, - "jump_ops_sum" => target.jump_ops_sum = parsed, - "jumpi_ops_sum" => target.jumpi_ops_sum = parsed, - "iszero_ops_sum" => target.iszero_ops_sum = parsed, - "mem_rw_ops_sum" => target.mem_rw_ops_sum = parsed, - "storage_rw_ops_sum" => target.storage_rw_ops_sum = parsed, - "mload_ops_sum" => target.mload_ops_sum = parsed, - "mstore_ops_sum" => target.mstore_ops_sum = parsed, - "sload_ops_sum" => target.sload_ops_sum = parsed, - "sstore_ops_sum" => target.sstore_ops_sum = parsed, - "keccak_ops_sum" => target.keccak_ops_sum = parsed, - "call_family_ops_sum" => target.call_family_ops_sum = parsed, - "copy_ops_sum" => target.copy_ops_sum = parsed, - _ => {} - } - } - totals -} - -fn measurement_status(has_metadata: bool, measurement: Option<&GasMeasurement>) -> &'static str { - if !has_metadata { - return "missing"; - } - let Some(measurement) = measurement else { - return "not_run"; - }; - if measurement.passed { - if measurement.gas_used.is_some() { - "ok" - } else { - "ok_no_gas" - } - } else { - "failed" - } -} - -fn record_delta( - baseline_gas: Option, - sonatina_gas: Option, - totals: &mut ComparisonTotals, -) -> (String, String) { - match (baseline_gas, sonatina_gas) { - (Some(baseline_gas), Some(sonatina_gas)) => { - totals.compared_with_gas += 1; - let diff = sonatina_gas as i128 - baseline_gas as i128; - if diff < 0 { - totals.sonatina_lower += 1; - } else if diff > 0 { - totals.sonatina_higher += 1; - } else { - totals.equal += 1; - } - (diff.to_string(), format_delta_percent(diff, baseline_gas)) - } - _ => { - totals.incomplete += 1; - ("n/a".to_string(), "n/a".to_string()) - } - } -} - -fn delta_cells(baseline_gas: Option, sonatina_gas: Option) -> (String, String) { - match (baseline_gas, sonatina_gas) { - (Some(baseline_gas), Some(sonatina_gas)) => { - let diff = sonatina_gas as i128 - baseline_gas as i128; - (diff.to_string(), format_delta_percent(diff, baseline_gas)) - } - _ => ("n/a".to_string(), "n/a".to_string()), - } -} - -fn record_delta_magnitude( - baseline_gas: Option, - sonatina_gas: Option, - totals: &mut DeltaMagnitudeTotals, -) { - let (Some(baseline_gas), Some(sonatina_gas)) = (baseline_gas, sonatina_gas) else { - return; - }; - - let delta_gas = sonatina_gas as i128 - baseline_gas as i128; - totals.compared_with_gas += 1; - totals.baseline_gas_sum += baseline_gas as u128; - totals.sonatina_gas_sum += sonatina_gas as u128; - totals.delta_gas_sum += delta_gas; - totals.abs_delta_gas_sum += if delta_gas < 0 { - (-delta_gas) as u128 - } else { - delta_gas as u128 - }; - - if baseline_gas > 0 { - let delta_pct = (delta_gas as f64 * 100.0) / baseline_gas as f64; - totals.pct_rows += 1; - totals.delta_pct_sum += delta_pct; - totals.abs_delta_pct_sum += delta_pct.abs(); - } -} - -fn append_comparison_summary( - out: &mut String, - label: &str, - totals: ComparisonTotals, - tests_in_scope: usize, -) { - out.push_str(&format!("### {label}\n\n")); - out.push_str(&format!( - "- compared_with_gas: {} ({})\n", - totals.compared_with_gas, - format_ratio_percent(totals.compared_with_gas, tests_in_scope) - )); - out.push_str(&format!( - "- sonatina_lower: {} ({})\n", - totals.sonatina_lower, - format_ratio_percent(totals.sonatina_lower, totals.compared_with_gas) - )); - out.push_str(&format!( - "- sonatina_higher: {} ({})\n", - totals.sonatina_higher, - format_ratio_percent(totals.sonatina_higher, totals.compared_with_gas) - )); - out.push_str(&format!( - "- equal: {} ({})\n", - totals.equal, - format_ratio_percent(totals.equal, totals.compared_with_gas) - )); - out.push_str(&format!( - "- incomplete: {} ({})\n\n", - totals.incomplete, - format_ratio_percent(totals.incomplete, tests_in_scope) - )); -} - -fn format_percent_cell(value: Option) -> String { - value - .map(|v| format!("{v:.2}%")) - .unwrap_or_else(|| "n/a".to_string()) -} - -fn format_float_cell(value: Option) -> String { - value - .map(|v| format!("{v:.2}")) - .unwrap_or_else(|| "n/a".to_string()) -} - -fn append_magnitude_summary(out: &mut String, label: &str, totals: DeltaMagnitudeTotals) { - out.push_str(&format!("### {label}\n\n")); - out.push_str(&format!( - "- compared_with_gas: {}\n", - totals.compared_with_gas - )); - out.push_str(&format!( - "- baseline_gas_sum: {}\n", - totals.baseline_gas_sum - )); - out.push_str(&format!( - "- sonatina_gas_sum: {}\n", - totals.sonatina_gas_sum - )); - out.push_str(&format!("- total_delta_gas: {}\n", totals.delta_gas_sum)); - out.push_str(&format!( - "- weighted_delta_pct: {}\n", - format_percent_cell(totals.weighted_delta_pct()) - )); - out.push_str(&format!( - "- mean_delta_gas: {}\n", - format_float_cell(totals.mean_delta_gas()) - )); - out.push_str(&format!( - "- mean_abs_delta_gas: {}\n", - format_float_cell(totals.mean_abs_delta_gas()) - )); - out.push_str(&format!( - "- mean_delta_pct: {}\n", - format_percent_cell(totals.mean_delta_pct()) - )); - out.push_str(&format!( - "- mean_abs_delta_pct: {}\n\n", - format_percent_cell(totals.mean_abs_delta_pct()) - )); -} - -fn delta_pct_from_sums(baseline_sum: u128, sonatina_sum: u128) -> Option { - if baseline_sum == 0 { - None - } else { - Some((sonatina_sum as f64 - baseline_sum as f64) * 100.0 / baseline_sum as f64) - } -} - -fn append_opcode_delta_metric( - out: &mut String, - label: &str, - baseline_sum: u128, - sonatina_sum: u128, -) { - let delta = sonatina_sum as i128 - baseline_sum as i128; - out.push_str(&format!( - "- {label}: {} -> {} (delta {}, {})\n", - baseline_sum, - sonatina_sum, - delta, - format_percent_cell(delta_pct_from_sums(baseline_sum, sonatina_sum)) - )); -} - -fn append_opcode_magnitude_summary(out: &mut String, totals: OpcodeMagnitudeTotals) { - out.push_str("## Opcode Aggregate Delta Metrics (vs Yul optimized)\n\n"); - out.push_str(&format!( - "- compared_with_metrics: {}\n", - totals.compared_with_metrics - )); - append_opcode_delta_metric( - out, - "steps_sum", - totals.yul_opt.steps_sum, - totals.sonatina.steps_sum, - ); - append_opcode_delta_metric( - out, - "runtime_bytes_sum", - totals.yul_opt.runtime_bytes_sum, - totals.sonatina.runtime_bytes_sum, - ); - append_opcode_delta_metric( - out, - "runtime_ops_sum", - totals.yul_opt.runtime_ops_sum, - totals.sonatina.runtime_ops_sum, - ); - append_opcode_delta_metric( - out, - "swap_ops_sum", - totals.yul_opt.swap_ops_sum, - totals.sonatina.swap_ops_sum, - ); - append_opcode_delta_metric( - out, - "pop_ops_sum", - totals.yul_opt.pop_ops_sum, - totals.sonatina.pop_ops_sum, - ); - append_opcode_delta_metric( - out, - "jump_ops_sum", - totals.yul_opt.jump_ops_sum, - totals.sonatina.jump_ops_sum, - ); - append_opcode_delta_metric( - out, - "jumpi_ops_sum", - totals.yul_opt.jumpi_ops_sum, - totals.sonatina.jumpi_ops_sum, - ); - append_opcode_delta_metric( - out, - "iszero_ops_sum", - totals.yul_opt.iszero_ops_sum, - totals.sonatina.iszero_ops_sum, - ); - append_opcode_delta_metric( - out, - "mem_rw_ops_sum", - totals.yul_opt.mem_rw_ops_sum, - totals.sonatina.mem_rw_ops_sum, - ); - append_opcode_delta_metric( - out, - "storage_rw_ops_sum", - totals.yul_opt.storage_rw_ops_sum, - totals.sonatina.storage_rw_ops_sum, - ); - append_opcode_delta_metric( - out, - "mload_ops_sum", - totals.yul_opt.mload_ops_sum, - totals.sonatina.mload_ops_sum, - ); - append_opcode_delta_metric( - out, - "mstore_ops_sum", - totals.yul_opt.mstore_ops_sum, - totals.sonatina.mstore_ops_sum, - ); - append_opcode_delta_metric( - out, - "sload_ops_sum", - totals.yul_opt.sload_ops_sum, - totals.sonatina.sload_ops_sum, - ); - append_opcode_delta_metric( - out, - "sstore_ops_sum", - totals.yul_opt.sstore_ops_sum, - totals.sonatina.sstore_ops_sum, - ); - append_opcode_delta_metric( - out, - "keccak_ops_sum", - totals.yul_opt.keccak_ops_sum, - totals.sonatina.keccak_ops_sum, - ); - append_opcode_delta_metric( - out, - "call_family_ops_sum", - totals.yul_opt.call_family_ops_sum, - totals.sonatina.call_family_ops_sum, - ); - append_opcode_delta_metric( - out, - "copy_ops_sum", - totals.yul_opt.copy_ops_sum, - totals.sonatina.copy_ops_sum, - ); - out.push('\n'); -} - -fn ratio_percent_i128(numerator: i128, denominator: i128) -> Option { - if denominator == 0 { - None - } else { - Some((numerator as f64 * 100.0) / denominator as f64) - } -} - -fn append_opcode_inflation_attribution(out: &mut String, totals: OpcodeMagnitudeTotals) { - let runtime_ops_delta = - totals.sonatina.runtime_ops_sum as i128 - totals.yul_opt.runtime_ops_sum as i128; - let swap_delta = totals.sonatina.swap_ops_sum as i128 - totals.yul_opt.swap_ops_sum as i128; - let pop_delta = totals.sonatina.pop_ops_sum as i128 - totals.yul_opt.pop_ops_sum as i128; - let jump_delta = totals.sonatina.jump_ops_sum as i128 - totals.yul_opt.jump_ops_sum as i128; - let jumpi_delta = totals.sonatina.jumpi_ops_sum as i128 - totals.yul_opt.jumpi_ops_sum as i128; - let iszero_delta = - totals.sonatina.iszero_ops_sum as i128 - totals.yul_opt.iszero_ops_sum as i128; - let mem_rw_delta = - totals.sonatina.mem_rw_ops_sum as i128 - totals.yul_opt.mem_rw_ops_sum as i128; - let storage_rw_delta = - totals.sonatina.storage_rw_ops_sum as i128 - totals.yul_opt.storage_rw_ops_sum as i128; - - let swap_pop_delta = swap_delta + pop_delta; - let control_delta = jump_delta + jumpi_delta; - let mem_storage_delta = mem_rw_delta + storage_rw_delta; - let stack_control_delta = swap_pop_delta + control_delta; - - out.push_str("## Inflation Attribution Snapshot\n\n"); - out.push_str(&format!("- runtime_ops_delta: {runtime_ops_delta}\n")); - out.push_str(&format!( - "- swap_pop_delta: {} ({})\n", - swap_pop_delta, - format_percent_cell(ratio_percent_i128(swap_pop_delta, runtime_ops_delta)) - )); - out.push_str(&format!( - "- control_flow_delta (jump+jumpi): {} ({})\n", - control_delta, - format_percent_cell(ratio_percent_i128(control_delta, runtime_ops_delta)) - )); - out.push_str(&format!( - "- bool_normalization_delta (iszero): {} ({})\n", - iszero_delta, - format_percent_cell(ratio_percent_i128(iszero_delta, runtime_ops_delta)) - )); - out.push_str(&format!( - "- stack_control_delta (swap+pop+jump+jumpi): {} ({})\n", - stack_control_delta, - format_percent_cell(ratio_percent_i128(stack_control_delta, runtime_ops_delta)) - )); - out.push_str(&format!( - "- mem_storage_delta (mem_rw+storage_rw): {} ({})\n", - mem_storage_delta, - format_percent_cell(ratio_percent_i128(mem_storage_delta, runtime_ops_delta)) - )); - out.push('\n'); -} - -fn append_deployment_attribution_summary( - out: &mut String, - heading: &str, - totals: DeploymentGasAttributionTotals, -) { - out.push_str(&format!("## {heading}\n\n")); - out.push_str(&format!( - "- compared_with_profile: {}\n", - totals.compared_with_profile - )); - append_opcode_delta_metric( - out, - "step_total_gas_sum (vs Yul optimized)", - totals.yul_opt_step_total_gas, - totals.sonatina_step_total_gas, - ); - append_opcode_delta_metric( - out, - "create_opcode_gas_sum (vs Yul optimized)", - totals.yul_opt_create_opcode_gas, - totals.sonatina_create_opcode_gas, - ); - append_opcode_delta_metric( - out, - "create2_opcode_gas_sum (vs Yul optimized)", - totals.yul_opt_create2_opcode_gas, - totals.sonatina_create2_opcode_gas, - ); - append_opcode_delta_metric( - out, - "constructor_frame_gas_sum (vs Yul optimized)", - totals.yul_opt_constructor_frame_gas, - totals.sonatina_constructor_frame_gas, - ); - append_opcode_delta_metric( - out, - "non_constructor_frame_gas_sum (vs Yul optimized)", - totals.yul_opt_non_constructor_frame_gas, - totals.sonatina_non_constructor_frame_gas, - ); - out.push('\n'); -} - -fn append_hotspot_summary( - out: &mut String, - hotspots: &[GasHotspotRow], - suite_rollup: &[(String, SuiteDeltaTotals)], -) { - let total_delta: i128 = hotspots.iter().map(|row| row.delta_vs_yul_opt).sum(); - let mut sorted = hotspots.to_vec(); - sorted.sort_by(|a, b| b.delta_vs_yul_opt.cmp(&a.delta_vs_yul_opt)); - - out.push_str("## Top Gas Regressions (vs Yul optimized)\n\n"); - out.push_str(&format!("- rows_with_delta: {}\n", sorted.len())); - out.push_str(&format!("- total_delta_vs_yul_opt: {}\n\n", total_delta)); - out.push_str("| rank | suite | test | delta_vs_yul_opt | pct_vs_yul_opt | share_of_total |\n"); - out.push_str("| ---: | --- | --- | ---: | ---: | ---: |\n"); - - let mut cumulative: i128 = 0; - for (idx, row) in sorted.iter().take(10).enumerate() { - cumulative += row.delta_vs_yul_opt; - let share = format_percent_cell(ratio_percent_i128(row.delta_vs_yul_opt, total_delta)); - out.push_str(&format!( - "| {} | {} | {} | {} | {} | {} |\n", - idx + 1, - row.suite, - row.test, - row.delta_vs_yul_opt, - row.delta_vs_yul_opt_pct, - share - )); - } - out.push_str(&format!( - "\n- top_10_cumulative_share: {}\n\n", - format_percent_cell(ratio_percent_i128(cumulative, total_delta)) - )); - - out.push_str("## Suite Delta Rollup (vs Yul optimized)\n\n"); - out.push_str("| suite | tests_with_delta | delta_vs_yul_opt_sum | avg_delta_vs_yul_opt | share_of_total |\n"); - out.push_str("| --- | ---: | ---: | ---: | ---: |\n"); - for (suite, totals) in suite_rollup.iter().take(10) { - let avg = if totals.tests_with_delta == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}", - totals.delta_vs_yul_opt_sum as f64 / totals.tests_with_delta as f64 - ) - }; - out.push_str(&format!( - "| {} | {} | {} | {} | {} |\n", - suite, - totals.tests_with_delta, - totals.delta_vs_yul_opt_sum, - avg, - format_percent_cell(ratio_percent_i128(totals.delta_vs_yul_opt_sum, total_delta)) - )); - } - out.push('\n'); -} - -fn append_trace_symbol_hotspots_summary(out: &mut String, rows: &[TraceSymbolHotspotRow]) { - if rows.is_empty() { - return; - } - let mut sorted = rows.to_vec(); - sorted.sort_by(|a, b| { - b.steps_in_symbol - .cmp(&a.steps_in_symbol) - .then_with(|| a.suite.cmp(&b.suite)) - .then_with(|| a.test.cmp(&b.test)) - }); - - out.push_str("## Tail Trace Symbol Attribution (Sonatina)\n\n"); - out.push_str( - "Sampled from each suite trace artifact (`debug/*.evm_trace.txt`), which keeps the last N steps.\n\n", - ); - out.push_str("| rank | suite | test | symbol | steps_in_symbol | symbol_share_of_tail |\n"); - out.push_str("| ---: | --- | --- | --- | ---: | ---: |\n"); - for (idx, row) in sorted.iter().take(12).enumerate() { - let pct = if row.tail_steps_total == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}%", - (row.steps_in_symbol as f64 * 100.0) / row.tail_steps_total as f64 - ) - }; - out.push_str(&format!( - "| {} | {} | {} | {} | {} | {} |\n", - idx + 1, - row.suite, - row.test, - row.symbol, - row.steps_in_symbol, - pct - )); - } - out.push('\n'); -} - -fn append_observability_coverage_summary( - out: &mut String, - rows: &[ObservabilityCoverageRow], - totals: ObservabilityCoverageTotals, -) { - if rows.is_empty() { - return; - } - - let mut test_keys: FxHashSet<(String, String)> = FxHashSet::default(); - for row in rows { - test_keys.insert((row.suite.clone(), row.test.clone())); - } - - out.push_str("## Sonatina Observability Coverage\n\n"); - out.push_str(&format!("- observed_sections: {}\n", rows.len())); - out.push_str(&format!("- observed_tests: {}\n", test_keys.len())); - out.push_str(&format!("- code_bytes_total: {}\n", totals.code_bytes)); - out.push_str(&format!( - "- mapped_code_bytes_total: {}\n", - totals.mapped_code_bytes - )); - out.push_str(&format!( - "- unmapped_code_bytes_total: {}\n", - totals.unmapped_code_bytes - )); - let mapped_pct = if totals.code_bytes == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}%", - (totals.mapped_code_bytes as f64 * 100.0) / totals.code_bytes as f64 - ) - }; - let unmapped_pct = if totals.code_bytes == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}%", - (totals.unmapped_code_bytes as f64 * 100.0) / totals.code_bytes as f64 - ) - }; - out.push_str(&format!("- mapped_code_pct: {mapped_pct}\n")); - out.push_str(&format!("- unmapped_code_pct: {unmapped_pct}\n")); - out.push_str(&format!( - "- unmapped_synthetic_bytes: {} ({})\n", - totals.unmapped_synthetic, - format_percent_cell(ratio_percent_i128( - totals.unmapped_synthetic as i128, - totals.unmapped_code_bytes as i128 - )) - )); - out.push_str(&format!( - "- unmapped_label_or_fixup_only_bytes: {} ({})\n", - totals.unmapped_label_or_fixup_only, - format_percent_cell(ratio_percent_i128( - totals.unmapped_label_or_fixup_only as i128, - totals.unmapped_code_bytes as i128 - )) - )); - out.push_str(&format!( - "- unmapped_no_ir_inst_bytes: {} ({})\n", - totals.unmapped_no_ir_inst, - format_percent_cell(ratio_percent_i128( - totals.unmapped_no_ir_inst as i128, - totals.unmapped_code_bytes as i128 - )) - )); - out.push_str(&format!( - "- unmapped_unknown_bytes: {} ({})\n\n", - totals.unmapped_unknown, - format_percent_cell(ratio_percent_i128( - totals.unmapped_unknown as i128, - totals.unmapped_code_bytes as i128 - )) - )); - - let mut top_rows = rows.to_vec(); - top_rows.sort_by(|a, b| { - b.unmapped_code_bytes - .cmp(&a.unmapped_code_bytes) - .then_with(|| a.suite.cmp(&b.suite)) - .then_with(|| a.test.cmp(&b.test)) - .then_with(|| a.section.cmp(&b.section)) - }); - out.push_str("| rank | suite | test | section | unmapped_code_bytes | unmapped_code_pct | synthetic_share_of_unmapped |\n"); - out.push_str("| ---: | --- | --- | --- | ---: | ---: | ---: |\n"); - for (idx, row) in top_rows.iter().take(10).enumerate() { - let unmapped_pct = if row.code_bytes == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}%", - (row.unmapped_code_bytes as f64 * 100.0) / row.code_bytes as f64 - ) - }; - let synthetic_share = format_percent_cell(ratio_percent_i128( - row.unmapped_synthetic as i128, - row.unmapped_code_bytes as i128, - )); - out.push_str(&format!( - "| {} | {} | {} | {} | {} | {} | {} |\n", - idx + 1, - row.suite, - row.test, - row.section, - row.unmapped_code_bytes, - unmapped_pct, - synthetic_share - )); - } - out.push('\n'); -} - -fn append_trace_observability_hotspots_summary( - out: &mut String, - rows: &[TraceObservabilityHotspotRow], -) { - if rows.is_empty() { - return; - } - let mut sorted = rows.to_vec(); - sorted.sort_by(|a, b| { - b.steps_in_bucket - .cmp(&a.steps_in_bucket) - .then_with(|| a.suite.cmp(&b.suite)) - .then_with(|| a.test.cmp(&b.test)) - .then_with(|| a.function.cmp(&b.function)) - .then_with(|| a.reason.cmp(&b.reason)) - }); - - out.push_str("## Tail Trace Observability Attribution (Sonatina)\n\n"); - out.push_str( - "Mapped from tail trace PCs to observability PC ranges (`debug/*.evm_trace.txt` + `artifacts/tests//sonatina/observability.json`).\n\n", - ); - out.push_str( - "| rank | suite | test | function | reason | steps_in_bucket | bucket_share_of_tail |\n", - ); - out.push_str("| ---: | --- | --- | --- | --- | ---: | ---: |\n"); - for (idx, row) in sorted.iter().take(12).enumerate() { - let pct = if row.tail_steps_total == 0 { - "n/a".to_string() - } else { - format!( - "{:.2}%", - (row.steps_in_bucket as f64 * 100.0) / row.tail_steps_total as f64 - ) - }; - out.push_str(&format!( - "| {} | {} | {} | {} | {} | {} | {} |\n", - idx + 1, - row.suite, - row.test, - row.function, - row.reason, - row.steps_in_bucket, - pct - )); - } - out.push('\n'); -} - -fn gas_opcode_comparison_header() -> &'static str { - "test,symbol,yul_unopt_steps,yul_opt_steps,sonatina_steps,steps_ratio_vs_yul_unopt,steps_ratio_vs_yul_opt,yul_unopt_runtime_bytes,yul_opt_runtime_bytes,sonatina_runtime_bytes,bytes_ratio_vs_yul_unopt,bytes_ratio_vs_yul_opt,yul_unopt_runtime_ops,yul_opt_runtime_ops,sonatina_runtime_ops,ops_ratio_vs_yul_unopt,ops_ratio_vs_yul_opt,yul_unopt_stack_ops_pct,yul_opt_stack_ops_pct,sonatina_stack_ops_pct,yul_opt_swap_ops,sonatina_swap_ops,swap_ratio_vs_yul_opt,yul_opt_pop_ops,sonatina_pop_ops,pop_ratio_vs_yul_opt,yul_opt_jump_ops,sonatina_jump_ops,jump_ratio_vs_yul_opt,yul_opt_jumpi_ops,sonatina_jumpi_ops,jumpi_ratio_vs_yul_opt,yul_opt_iszero_ops,sonatina_iszero_ops,iszero_ratio_vs_yul_opt,yul_opt_mem_rw_ops,sonatina_mem_rw_ops,mem_rw_ratio_vs_yul_opt,yul_opt_storage_rw_ops,sonatina_storage_rw_ops,storage_rw_ratio_vs_yul_opt,yul_opt_keccak_ops,sonatina_keccak_ops,keccak_ratio_vs_yul_opt,yul_opt_call_family_ops,sonatina_call_family_ops,call_family_ratio_vs_yul_opt,yul_opt_copy_ops,sonatina_copy_ops,copy_ratio_vs_yul_opt,note" -} - -pub(super) fn write_gas_comparison_report( - report: &ReportContext, - primary_backend: &str, - yul_primary_optimize: bool, - opt_level: OptLevel, - cases: &[GasComparisonCase], - primary_measurements: &FxHashMap, -) { - let artifacts_dir = report.root_dir.join("artifacts"); - let _ = create_dir_all_utf8(&artifacts_dir); - let _ = std::fs::write( - artifacts_dir.join("gas_comparison_settings.txt"), - gas_comparison_settings_text(primary_backend, yul_primary_optimize, opt_level), - ); - - let mut markdown = String::new(); - markdown.push_str("# Gas Comparison\n\n"); - markdown.push_str("Comparison of runtime test-call gas usage (`gas_used`) between Yul and Sonatina backends.\n"); - markdown.push_str( - "`delta` columns are `sonatina - yul`; negative means Sonatina used less gas.\n\n", - ); - markdown.push_str("| test | yul_unopt | yul_opt | sonatina | delta_vs_unopt | pct_vs_unopt | delta_vs_opt | pct_vs_opt | note |\n"); - markdown.push_str("| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |\n"); - let mut opcode_markdown = String::new(); - opcode_markdown.push_str("# EVM Opcode/Trace Comparison\n\n"); - opcode_markdown.push_str( - "Static runtime opcode shape and dynamic EVM step counts for the same test call.\n\n", - ); - opcode_markdown.push_str("| test | steps_ratio_vs_opt | bytes_ratio_vs_opt | ops_ratio_vs_opt | swap_ratio_vs_opt | pop_ratio_vs_opt | jump_ratio_vs_opt | jumpi_ratio_vs_opt | iszero_ratio_vs_opt | mem_rw_ratio_vs_opt | storage_rw_ratio_vs_opt | keccak_ratio_vs_opt | call_family_ratio_vs_opt | copy_ratio_vs_opt | note |\n"); - opcode_markdown.push_str("| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |\n"); - let mut deployment_attribution_markdown = String::new(); - deployment_attribution_markdown.push_str("# Deployment Gas Attribution (Step Replay)\n\n"); - deployment_attribution_markdown.push_str( - "CREATE/CREATE2 opcode and constructor-frame attribution from full-step call replay on cloned EVM state.\n\n", - ); - deployment_attribution_markdown.push_str("| test | yul_opt_create_ops_gas | sonatina_create_ops_gas | delta_create_ops_vs_opt | yul_opt_constructor_frame_gas | sonatina_constructor_frame_gas | delta_constructor_frame_vs_opt | yul_opt_non_constructor_frame_gas | sonatina_non_constructor_frame_gas | delta_non_constructor_vs_opt | note |\n"); - deployment_attribution_markdown - .push_str("| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |\n"); - - let mut csv = String::new(); - csv.push_str( - "test,symbol,yul_unopt_gas,yul_opt_gas,sonatina_gas,delta_vs_yul_unopt,delta_vs_yul_unopt_pct,delta_vs_yul_opt,delta_vs_yul_opt_pct,yul_unopt_status,yul_opt_status,sonatina_status,note\n", - ); - let mut breakdown_csv = String::new(); - breakdown_csv.push_str( - "test,symbol,yul_unopt_call_gas,yul_opt_call_gas,sonatina_call_gas,delta_call_vs_yul_unopt,delta_call_vs_yul_unopt_pct,delta_call_vs_yul_opt,delta_call_vs_yul_opt_pct,yul_unopt_deploy_gas,yul_opt_deploy_gas,sonatina_deploy_gas,delta_deploy_vs_yul_unopt,delta_deploy_vs_yul_unopt_pct,delta_deploy_vs_yul_opt,delta_deploy_vs_yul_opt_pct,yul_unopt_total_gas,yul_opt_total_gas,sonatina_total_gas,delta_total_vs_yul_unopt,delta_total_vs_yul_unopt_pct,delta_total_vs_yul_opt,delta_total_vs_yul_opt_pct,note\n", - ); - let mut opcode_csv = String::new(); - opcode_csv.push_str(gas_opcode_comparison_header()); - opcode_csv.push('\n'); - let mut deployment_attribution_csv = String::new(); - deployment_attribution_csv.push_str(DEPLOYMENT_ATTRIBUTION_CSV_HEADER); - deployment_attribution_csv.push('\n'); - - let mut totals = GasTotals { - tests_in_scope: cases.len(), - ..GasTotals::default() - }; - let mut call_magnitude_totals = GasMagnitudeTotals::default(); - let mut deploy_magnitude_totals = GasMagnitudeTotals::default(); - let mut total_magnitude_totals = GasMagnitudeTotals::default(); - let mut opcode_magnitude_totals = OpcodeMagnitudeTotals::default(); - let mut deployment_attribution_totals = DeploymentGasAttributionTotals::default(); - - for case in cases { - // In Sonatina-primary runs, comparisons are still made against Yul. - // Persist the exact Yul source/bytecode pair used for those baselines. - if primary_backend.eq_ignore_ascii_case("sonatina") - && let Some(yul_case) = case.yul.as_ref() - { - write_yul_case_artifacts(report, yul_case, None); - } - - let measure_yul = |optimize| { - case.yul - .as_ref() - .map(|test| measure_case_gas(test, "yul", optimize, true)) - }; - - let primary_is_yul = primary_backend.eq_ignore_ascii_case("yul"); - let primary_yul = primary_measurements.get(&case.symbol_name).cloned(); - - let yul_opt = if primary_is_yul && yul_primary_optimize { - primary_yul.clone().or_else(|| measure_yul(true)) - } else { - measure_yul(true) - }; - - let yul_unopt = if primary_is_yul && !yul_primary_optimize { - primary_yul.or_else(|| measure_yul(false)) - } else { - measure_yul(false) - }; - - let sonatina = if primary_backend.eq_ignore_ascii_case("sonatina") { - primary_measurements.get(&case.symbol_name).cloned() - } else { - case.sonatina - .as_ref() - .map(|test| measure_case_gas(test, "sonatina", false, true)) - }; - - let yul_unopt_gas = yul_unopt - .as_ref() - .and_then(|measurement| measurement.gas_used); - let yul_opt_gas = yul_opt - .as_ref() - .and_then(|measurement| measurement.gas_used); - let sonatina_gas = sonatina - .as_ref() - .and_then(|measurement| measurement.gas_used); - let yul_unopt_deploy_gas = yul_unopt - .as_ref() - .and_then(|measurement| measurement.deploy_gas_used); - let yul_opt_deploy_gas = yul_opt - .as_ref() - .and_then(|measurement| measurement.deploy_gas_used); - let sonatina_deploy_gas = sonatina - .as_ref() - .and_then(|measurement| measurement.deploy_gas_used); - let yul_unopt_total_gas = yul_unopt - .as_ref() - .and_then(|measurement| measurement.total_gas_used); - let yul_opt_total_gas = yul_opt - .as_ref() - .and_then(|measurement| measurement.total_gas_used); - let sonatina_total_gas = sonatina - .as_ref() - .and_then(|measurement| measurement.total_gas_used); - let yul_unopt_cell = yul_unopt_gas.map_or_else(|| "n/a".to_string(), |gas| gas.to_string()); - let yul_opt_cell = yul_opt_gas.map_or_else(|| "n/a".to_string(), |gas| gas.to_string()); - let sonatina_cell = sonatina_gas.map_or_else(|| "n/a".to_string(), |gas| gas.to_string()); - let yul_unopt_deploy_cell = - yul_unopt_deploy_gas.map_or_else(|| "n/a".to_string(), |gas| gas.to_string()); - let yul_opt_deploy_cell = - yul_opt_deploy_gas.map_or_else(|| "n/a".to_string(), |gas| gas.to_string()); - let sonatina_deploy_cell = - sonatina_deploy_gas.map_or_else(|| "n/a".to_string(), |gas| gas.to_string()); - let yul_unopt_total_cell = - yul_unopt_total_gas.map_or_else(|| "n/a".to_string(), |gas| gas.to_string()); - let yul_opt_total_cell = - yul_opt_total_gas.map_or_else(|| "n/a".to_string(), |gas| gas.to_string()); - let sonatina_total_cell = - sonatina_total_gas.map_or_else(|| "n/a".to_string(), |gas| gas.to_string()); - let yul_unopt_profile = yul_unopt - .as_ref() - .and_then(|measurement| measurement.gas_profile); - let yul_opt_profile = yul_opt - .as_ref() - .and_then(|measurement| measurement.gas_profile); - let sonatina_profile = sonatina - .as_ref() - .and_then(|measurement| measurement.gas_profile); - - let mut notes = Vec::new(); - if case.yul.is_none() { - notes.push("missing yul test metadata".to_string()); - } - if case.sonatina.is_none() { - notes.push("missing sonatina test metadata".to_string()); - } - if let Some(measurement) = &yul_unopt - && (!measurement.passed || measurement.gas_used.is_none()) - { - notes.push(format!("yul_unopt {}", measurement.status_label())); - } - if let Some(measurement) = &yul_opt - && (!measurement.passed || measurement.gas_used.is_none()) - { - notes.push(format!("yul_opt {}", measurement.status_label())); - } - if let Some(measurement) = &sonatina - && (!measurement.passed || measurement.gas_used.is_none()) - { - notes.push(format!("sonatina {}", measurement.status_label())); - } - if yul_opt_profile.is_none() || sonatina_profile.is_none() { - notes.push("missing step-attribution profile".to_string()); - } - if let Some(profile) = yul_opt_profile - && let Some(violation) = gas_profile_partition_violation("yul_opt", profile) - { - notes.push(violation); - } - if let Some(profile) = sonatina_profile - && let Some(violation) = gas_profile_partition_violation("sonatina", profile) - { - notes.push(violation); - } - - let yul_unopt_status = measurement_status(case.yul.is_some(), yul_unopt.as_ref()); - let yul_opt_status = measurement_status(case.yul.is_some(), yul_opt.as_ref()); - let sonatina_status = measurement_status(case.sonatina.is_some(), sonatina.as_ref()); - - let (delta_unopt_cell, delta_unopt_pct_cell) = - record_delta(yul_unopt_gas, sonatina_gas, &mut totals.vs_yul_unopt); - let (delta_opt_cell, delta_opt_pct_cell) = - record_delta(yul_opt_gas, sonatina_gas, &mut totals.vs_yul_opt); - record_delta_magnitude( - yul_unopt_gas, - sonatina_gas, - &mut call_magnitude_totals.vs_yul_unopt, - ); - record_delta_magnitude( - yul_opt_gas, - sonatina_gas, - &mut call_magnitude_totals.vs_yul_opt, - ); - record_delta_magnitude( - yul_unopt_deploy_gas, - sonatina_deploy_gas, - &mut deploy_magnitude_totals.vs_yul_unopt, - ); - record_delta_magnitude( - yul_opt_deploy_gas, - sonatina_deploy_gas, - &mut deploy_magnitude_totals.vs_yul_opt, - ); - record_delta_magnitude( - yul_unopt_total_gas, - sonatina_total_gas, - &mut total_magnitude_totals.vs_yul_unopt, - ); - record_delta_magnitude( - yul_opt_total_gas, - sonatina_total_gas, - &mut total_magnitude_totals.vs_yul_opt, - ); - - let note = if notes.is_empty() { - String::new() - } else { - normalize_inline_text(¬es.join("; ")) - }; - - markdown.push_str(&format!( - "| {} | {} | {} | {} | {} | {} | {} | {} | {} |\n", - case.display_name, - yul_unopt_cell, - yul_opt_cell, - sonatina_cell, - delta_unopt_cell, - delta_unopt_pct_cell, - delta_opt_cell, - delta_opt_pct_cell, - note - )); - - csv.push_str(&format!( - "{},{},{},{},{},{},{},{},{},{},{},{},{}\n", - csv_escape(&case.display_name), - csv_escape(&case.symbol_name), - csv_escape(&yul_unopt_cell), - csv_escape(&yul_opt_cell), - csv_escape(&sonatina_cell), - csv_escape(&delta_unopt_cell), - csv_escape(&delta_unopt_pct_cell), - csv_escape(&delta_opt_cell), - csv_escape(&delta_opt_pct_cell), - csv_escape(yul_unopt_status), - csv_escape(yul_opt_status), - csv_escape(sonatina_status), - csv_escape(¬e), - )); - - let (delta_call_unopt_cell, delta_call_unopt_pct_cell) = - delta_cells(yul_unopt_gas, sonatina_gas); - let (delta_call_opt_cell, delta_call_opt_pct_cell) = delta_cells(yul_opt_gas, sonatina_gas); - let (delta_deploy_unopt_cell, delta_deploy_unopt_pct_cell) = - delta_cells(yul_unopt_deploy_gas, sonatina_deploy_gas); - let (delta_deploy_opt_cell, delta_deploy_opt_pct_cell) = - delta_cells(yul_opt_deploy_gas, sonatina_deploy_gas); - let (delta_total_unopt_cell, delta_total_unopt_pct_cell) = - delta_cells(yul_unopt_total_gas, sonatina_total_gas); - let (delta_total_opt_cell, delta_total_opt_pct_cell) = - delta_cells(yul_opt_total_gas, sonatina_total_gas); - breakdown_csv.push_str(&format!( - "{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}\n", - csv_escape(&case.display_name), - csv_escape(&case.symbol_name), - csv_escape(&yul_unopt_cell), - csv_escape(&yul_opt_cell), - csv_escape(&sonatina_cell), - csv_escape(&delta_call_unopt_cell), - csv_escape(&delta_call_unopt_pct_cell), - csv_escape(&delta_call_opt_cell), - csv_escape(&delta_call_opt_pct_cell), - csv_escape(&yul_unopt_deploy_cell), - csv_escape(&yul_opt_deploy_cell), - csv_escape(&sonatina_deploy_cell), - csv_escape(&delta_deploy_unopt_cell), - csv_escape(&delta_deploy_unopt_pct_cell), - csv_escape(&delta_deploy_opt_cell), - csv_escape(&delta_deploy_opt_pct_cell), - csv_escape(&yul_unopt_total_cell), - csv_escape(&yul_opt_total_cell), - csv_escape(&sonatina_total_cell), - csv_escape(&delta_total_unopt_cell), - csv_escape(&delta_total_unopt_pct_cell), - csv_escape(&delta_total_opt_cell), - csv_escape(&delta_total_opt_pct_cell), - csv_escape(¬e), - )); - - let yul_unopt_steps = yul_unopt - .as_ref() - .and_then(|measurement| measurement.step_count); - let yul_opt_steps = yul_opt - .as_ref() - .and_then(|measurement| measurement.step_count); - let sonatina_steps = sonatina - .as_ref() - .and_then(|measurement| measurement.step_count); - - let yul_unopt_metrics = yul_unopt - .as_ref() - .and_then(|measurement| measurement.runtime_metrics); - let yul_opt_metrics = yul_opt - .as_ref() - .and_then(|measurement| measurement.runtime_metrics); - let sonatina_metrics = sonatina - .as_ref() - .and_then(|measurement| measurement.runtime_metrics); - - let yul_unopt_bytes = yul_unopt_metrics.map(|metrics| metrics.byte_len); - let yul_opt_bytes = yul_opt_metrics.map(|metrics| metrics.byte_len); - let sonatina_bytes = sonatina_metrics.map(|metrics| metrics.byte_len); - - let yul_unopt_ops = yul_unopt_metrics.map(|metrics| metrics.op_count); - let yul_opt_ops = yul_opt_metrics.map(|metrics| metrics.op_count); - let sonatina_ops = sonatina_metrics.map(|metrics| metrics.op_count); - - let steps_ratio_unopt = ratio_cell_u64(sonatina_steps, yul_unopt_steps); - let steps_ratio_opt = ratio_cell_u64(sonatina_steps, yul_opt_steps); - let bytes_ratio_unopt = ratio_cell_usize(sonatina_bytes, yul_unopt_bytes); - let bytes_ratio_opt = ratio_cell_usize(sonatina_bytes, yul_opt_bytes); - let ops_ratio_unopt = ratio_cell_usize(sonatina_ops, yul_unopt_ops); - let ops_ratio_opt = ratio_cell_usize(sonatina_ops, yul_opt_ops); - - let yul_opt_swap = yul_opt_metrics.map(|metrics| metrics.swap_ops); - let sonatina_swap = sonatina_metrics.map(|metrics| metrics.swap_ops); - let swap_ratio_opt = ratio_cell_usize(sonatina_swap, yul_opt_swap); - - let yul_opt_pop = yul_opt_metrics.map(|metrics| metrics.pop_ops); - let sonatina_pop = sonatina_metrics.map(|metrics| metrics.pop_ops); - let pop_ratio_opt = ratio_cell_usize(sonatina_pop, yul_opt_pop); - - let yul_opt_jump = yul_opt_metrics.map(|metrics| metrics.jump_ops); - let sonatina_jump = sonatina_metrics.map(|metrics| metrics.jump_ops); - let jump_ratio_opt = ratio_cell_usize(sonatina_jump, yul_opt_jump); - - let yul_opt_jumpi = yul_opt_metrics.map(|metrics| metrics.jumpi_ops); - let sonatina_jumpi = sonatina_metrics.map(|metrics| metrics.jumpi_ops); - let jumpi_ratio_opt = ratio_cell_usize(sonatina_jumpi, yul_opt_jumpi); - - let yul_opt_iszero = yul_opt_metrics.map(|metrics| metrics.iszero_ops); - let sonatina_iszero = sonatina_metrics.map(|metrics| metrics.iszero_ops); - let iszero_ratio_opt = ratio_cell_usize(sonatina_iszero, yul_opt_iszero); - - let yul_opt_mem_rw = yul_opt_metrics.map(|metrics| metrics.mem_rw_ops_total()); - let sonatina_mem_rw = sonatina_metrics.map(|metrics| metrics.mem_rw_ops_total()); - let mem_rw_ratio_opt = ratio_cell_usize(sonatina_mem_rw, yul_opt_mem_rw); - - let yul_opt_storage_rw = yul_opt_metrics.map(|metrics| metrics.storage_rw_ops_total()); - let sonatina_storage_rw = sonatina_metrics.map(|metrics| metrics.storage_rw_ops_total()); - let storage_rw_ratio_opt = ratio_cell_usize(sonatina_storage_rw, yul_opt_storage_rw); - - let yul_opt_keccak = yul_opt_metrics.map(|metrics| metrics.keccak_ops); - let sonatina_keccak = sonatina_metrics.map(|metrics| metrics.keccak_ops); - let keccak_ratio_opt = ratio_cell_usize(sonatina_keccak, yul_opt_keccak); - - let yul_opt_call_family = yul_opt_metrics.map(|metrics| metrics.call_family_ops_total()); - let sonatina_call_family = sonatina_metrics.map(|metrics| metrics.call_family_ops_total()); - let call_family_ratio_opt = ratio_cell_usize(sonatina_call_family, yul_opt_call_family); - - let yul_opt_copy = yul_opt_metrics.map(|metrics| metrics.copy_ops_total()); - let sonatina_copy = sonatina_metrics.map(|metrics| metrics.copy_ops_total()); - let copy_ratio_opt = ratio_cell_usize(sonatina_copy, yul_opt_copy); - - if let (Some(y_steps), Some(y_metrics), Some(s_steps), Some(s_metrics)) = ( - yul_opt_steps, - yul_opt_metrics, - sonatina_steps, - sonatina_metrics, - ) { - opcode_magnitude_totals.compared_with_metrics += 1; - opcode_magnitude_totals - .yul_opt - .add_observation(y_steps, y_metrics); - opcode_magnitude_totals - .sonatina - .add_observation(s_steps, s_metrics); - } - - opcode_markdown.push_str(&format!( - "| {} | {} | {} | {} | {} | {} | {} | {} | {} | {} | {} | {} | {} | {} | {} |\n", - case.display_name, - steps_ratio_opt, - bytes_ratio_opt, - ops_ratio_opt, - swap_ratio_opt, - pop_ratio_opt, - jump_ratio_opt, - jumpi_ratio_opt, - iszero_ratio_opt, - mem_rw_ratio_opt, - storage_rw_ratio_opt, - keccak_ratio_opt, - call_family_ratio_opt, - copy_ratio_opt, - note - )); - - let opcode_cells = vec![ - csv_escape(&case.display_name), - csv_escape(&case.symbol_name), - csv_escape(&u64_cell(yul_unopt_steps)), - csv_escape(&u64_cell(yul_opt_steps)), - csv_escape(&u64_cell(sonatina_steps)), - csv_escape(&steps_ratio_unopt), - csv_escape(&steps_ratio_opt), - csv_escape(&usize_cell(yul_unopt_bytes)), - csv_escape(&usize_cell(yul_opt_bytes)), - csv_escape(&usize_cell(sonatina_bytes)), - csv_escape(&bytes_ratio_unopt), - csv_escape(&bytes_ratio_opt), - csv_escape(&usize_cell(yul_unopt_ops)), - csv_escape(&usize_cell(yul_opt_ops)), - csv_escape(&usize_cell(sonatina_ops)), - csv_escape(&ops_ratio_unopt), - csv_escape(&ops_ratio_opt), - csv_escape(&stack_ops_pct_cell(yul_unopt_metrics)), - csv_escape(&stack_ops_pct_cell(yul_opt_metrics)), - csv_escape(&stack_ops_pct_cell(sonatina_metrics)), - csv_escape(&usize_cell(yul_opt_swap)), - csv_escape(&usize_cell(sonatina_swap)), - csv_escape(&swap_ratio_opt), - csv_escape(&usize_cell(yul_opt_pop)), - csv_escape(&usize_cell(sonatina_pop)), - csv_escape(&pop_ratio_opt), - csv_escape(&usize_cell(yul_opt_jump)), - csv_escape(&usize_cell(sonatina_jump)), - csv_escape(&jump_ratio_opt), - csv_escape(&usize_cell(yul_opt_jumpi)), - csv_escape(&usize_cell(sonatina_jumpi)), - csv_escape(&jumpi_ratio_opt), - csv_escape(&usize_cell(yul_opt_iszero)), - csv_escape(&usize_cell(sonatina_iszero)), - csv_escape(&iszero_ratio_opt), - csv_escape(&usize_cell(yul_opt_mem_rw)), - csv_escape(&usize_cell(sonatina_mem_rw)), - csv_escape(&mem_rw_ratio_opt), - csv_escape(&usize_cell(yul_opt_storage_rw)), - csv_escape(&usize_cell(sonatina_storage_rw)), - csv_escape(&storage_rw_ratio_opt), - csv_escape(&usize_cell(yul_opt_keccak)), - csv_escape(&usize_cell(sonatina_keccak)), - csv_escape(&keccak_ratio_opt), - csv_escape(&usize_cell(yul_opt_call_family)), - csv_escape(&usize_cell(sonatina_call_family)), - csv_escape(&call_family_ratio_opt), - csv_escape(&usize_cell(yul_opt_copy)), - csv_escape(&usize_cell(sonatina_copy)), - csv_escape(©_ratio_opt), - csv_escape(¬e), - ]; - opcode_csv.push_str(&opcode_cells.join(",")); - opcode_csv.push('\n'); - - let yul_unopt_step_total = yul_unopt_profile.map(|profile| profile.total_step_gas); - let yul_opt_step_total = yul_opt_profile.map(|profile| profile.total_step_gas); - let sonatina_step_total = sonatina_profile.map(|profile| profile.total_step_gas); - let yul_unopt_create_opcode_gas = - yul_unopt_profile.map(|profile| profile.create_opcode_gas); - let yul_opt_create_opcode_gas = yul_opt_profile.map(|profile| profile.create_opcode_gas); - let sonatina_create_opcode_gas = sonatina_profile.map(|profile| profile.create_opcode_gas); - let yul_unopt_create2_opcode_gas = - yul_unopt_profile.map(|profile| profile.create2_opcode_gas); - let yul_opt_create2_opcode_gas = yul_opt_profile.map(|profile| profile.create2_opcode_gas); - let sonatina_create2_opcode_gas = - sonatina_profile.map(|profile| profile.create2_opcode_gas); - let yul_unopt_constructor_frame_gas = - yul_unopt_profile.map(|profile| profile.constructor_frame_gas); - let yul_opt_constructor_frame_gas = - yul_opt_profile.map(|profile| profile.constructor_frame_gas); - let sonatina_constructor_frame_gas = - sonatina_profile.map(|profile| profile.constructor_frame_gas); - let yul_unopt_non_constructor_frame_gas = - yul_unopt_profile.map(|profile| profile.non_constructor_frame_gas); - let yul_opt_non_constructor_frame_gas = - yul_opt_profile.map(|profile| profile.non_constructor_frame_gas); - let sonatina_non_constructor_frame_gas = - sonatina_profile.map(|profile| profile.non_constructor_frame_gas); - let yul_unopt_create_opcode_steps = - yul_unopt_profile.map(|profile| profile.create_opcode_steps); - let yul_opt_create_opcode_steps = - yul_opt_profile.map(|profile| profile.create_opcode_steps); - let sonatina_create_opcode_steps = - sonatina_profile.map(|profile| profile.create_opcode_steps); - let yul_unopt_create2_opcode_steps = - yul_unopt_profile.map(|profile| profile.create2_opcode_steps); - let yul_opt_create2_opcode_steps = - yul_opt_profile.map(|profile| profile.create2_opcode_steps); - let sonatina_create2_opcode_steps = - sonatina_profile.map(|profile| profile.create2_opcode_steps); - - let yul_opt_create_ops_gas = - yul_opt_profile.map(|profile| profile.create_opcode_gas + profile.create2_opcode_gas); - let sonatina_create_ops_gas = - sonatina_profile.map(|profile| profile.create_opcode_gas + profile.create2_opcode_gas); - let (delta_create_ops_vs_opt, _) = - delta_cells(yul_opt_create_ops_gas, sonatina_create_ops_gas); - let (delta_constructor_vs_opt, _) = delta_cells( - yul_opt_constructor_frame_gas, - sonatina_constructor_frame_gas, - ); - let (delta_non_constructor_vs_opt, _) = delta_cells( - yul_opt_non_constructor_frame_gas, - sonatina_non_constructor_frame_gas, - ); - - deployment_attribution_markdown.push_str(&format!( - "| {} | {} | {} | {} | {} | {} | {} | {} | {} | {} | {} |\n", - case.display_name, - u64_cell(yul_opt_create_ops_gas), - u64_cell(sonatina_create_ops_gas), - delta_create_ops_vs_opt, - u64_cell(yul_opt_constructor_frame_gas), - u64_cell(sonatina_constructor_frame_gas), - delta_constructor_vs_opt, - u64_cell(yul_opt_non_constructor_frame_gas), - u64_cell(sonatina_non_constructor_frame_gas), - delta_non_constructor_vs_opt, - note, - )); - - let deployment_attribution_row = DeploymentGasAttributionRow { - test: case.display_name.clone(), - symbol: case.symbol_name.clone(), - yul_unopt_step_total_gas: yul_unopt_step_total, - yul_opt_step_total_gas: yul_opt_step_total, - sonatina_step_total_gas: sonatina_step_total, - yul_unopt_create_opcode_gas, - yul_opt_create_opcode_gas, - sonatina_create_opcode_gas, - yul_unopt_create2_opcode_gas, - yul_opt_create2_opcode_gas, - sonatina_create2_opcode_gas, - yul_unopt_constructor_frame_gas, - yul_opt_constructor_frame_gas, - sonatina_constructor_frame_gas, - yul_unopt_non_constructor_frame_gas, - yul_opt_non_constructor_frame_gas, - sonatina_non_constructor_frame_gas, - yul_unopt_create_opcode_steps, - yul_opt_create_opcode_steps, - sonatina_create_opcode_steps, - yul_unopt_create2_opcode_steps, - yul_opt_create2_opcode_steps, - sonatina_create2_opcode_steps, - note: note.clone(), - }; - deployment_attribution_csv.push_str(&deployment_attribution_row_to_csv_line( - &deployment_attribution_row, - )); - deployment_attribution_csv.push('\n'); - - if let Some((yul_opt_profile, sonatina_profile)) = - deployment_attribution_row_profiles_for_totals(&deployment_attribution_row) - { - deployment_attribution_totals.add_observation(yul_opt_profile, sonatina_profile); - } - } - - markdown.push_str("\n## Summary\n\n"); - markdown.push_str(&format!("- tests_in_scope: {}\n", totals.tests_in_scope)); - markdown.push('\n'); - append_comparison_summary( - &mut markdown, - "vs Yul (unoptimized)", - totals.vs_yul_unopt, - totals.tests_in_scope, - ); - append_comparison_summary( - &mut markdown, - "vs Yul (optimized)", - totals.vs_yul_opt, - totals.tests_in_scope, - ); - markdown.push_str("\n## Aggregate Delta Metrics\n\n"); - append_magnitude_summary( - &mut markdown, - "Runtime Call Gas vs Yul (unoptimized)", - call_magnitude_totals.vs_yul_unopt, - ); - append_magnitude_summary( - &mut markdown, - "Runtime Call Gas vs Yul (optimized)", - call_magnitude_totals.vs_yul_opt, - ); - markdown.push_str("\n## Deploy/Call/Total Breakdown\n\n"); - append_magnitude_summary( - &mut markdown, - "Deployment Gas vs Yul (unoptimized)", - deploy_magnitude_totals.vs_yul_unopt, - ); - append_magnitude_summary( - &mut markdown, - "Deployment Gas vs Yul (optimized)", - deploy_magnitude_totals.vs_yul_opt, - ); - append_magnitude_summary( - &mut markdown, - "Total Gas (deploy+call) vs Yul (unoptimized)", - total_magnitude_totals.vs_yul_unopt, - ); - append_magnitude_summary( - &mut markdown, - "Total Gas (deploy+call) vs Yul (optimized)", - total_magnitude_totals.vs_yul_opt, - ); - append_deployment_attribution_summary( - &mut markdown, - "Deployment Attribution (Step Replay)", - deployment_attribution_totals, - ); - append_opcode_magnitude_summary(&mut markdown, opcode_magnitude_totals); - - markdown.push_str("\n## Optimization Settings\n\n"); - for line in - gas_comparison_settings_text(primary_backend, yul_primary_optimize, opt_level).lines() - { - markdown.push_str(&format!("- {line}\n")); - } - markdown.push_str( - "\nMachine-readable aggregates: `artifacts/gas_comparison_totals.csv`, `artifacts/gas_comparison_magnitude.csv`, `artifacts/gas_breakdown_comparison.csv`, `artifacts/gas_breakdown_magnitude.csv`, `artifacts/gas_opcode_magnitude.csv`, and `artifacts/gas_deployment_attribution.csv`.\n", - ); - markdown.push_str( - "\n## Opcode/Trace Profile\n\nSee `artifacts/gas_opcode_comparison.md` and `artifacts/gas_opcode_comparison.csv` for bytecode shape and dynamic step-count diagnostics.\n", - ); - - let _ = std::fs::write(artifacts_dir.join("gas_comparison.md"), markdown); - let _ = std::fs::write(artifacts_dir.join("gas_comparison.csv"), csv); - let _ = std::fs::write( - artifacts_dir.join("gas_breakdown_comparison.csv"), - breakdown_csv, - ); - let _ = std::fs::write( - artifacts_dir.join("gas_opcode_comparison.md"), - opcode_markdown, - ); - let _ = std::fs::write(artifacts_dir.join("gas_opcode_comparison.csv"), opcode_csv); - let _ = std::fs::write( - artifacts_dir.join("gas_deployment_attribution.md"), - deployment_attribution_markdown, - ); - let _ = std::fs::write( - artifacts_dir.join("gas_deployment_attribution.csv"), - deployment_attribution_csv, - ); - write_gas_totals_csv(&artifacts_dir.join("gas_comparison_totals.csv"), totals); - write_gas_magnitude_csv( - &artifacts_dir.join("gas_comparison_magnitude.csv"), - call_magnitude_totals, - ); - write_gas_breakdown_magnitude_csv( - &artifacts_dir.join("gas_breakdown_magnitude.csv"), - call_magnitude_totals, - deploy_magnitude_totals, - total_magnitude_totals, - ); - write_opcode_magnitude_csv( - &artifacts_dir.join("gas_opcode_magnitude.csv"), - opcode_magnitude_totals, - ); -} - -pub(super) fn write_run_gas_comparison_summary( - root_dir: &Utf8PathBuf, - primary_backend: &str, - yul_primary_optimize: bool, - opt_level: OptLevel, -) { - let artifacts_dir = root_dir.join("artifacts"); - let _ = create_dir_all_utf8(&artifacts_dir); - let _ = std::fs::write( - artifacts_dir.join("gas_comparison_settings.txt"), - gas_comparison_settings_text(primary_backend, yul_primary_optimize, opt_level), - ); - - let mut suite_dirs: Vec<(String, Utf8PathBuf)> = Vec::new(); - for status_dir in ["passed", "failed"] { - let dir = root_dir.join(status_dir); - let Ok(entries) = std::fs::read_dir(&dir) else { - continue; - }; - for entry in entries.flatten() { - let path = entry.path(); - if !path.is_dir() { - continue; - } - let suite = entry.file_name().to_string_lossy().to_string(); - if let Ok(path) = Utf8PathBuf::from_path_buf(path) { - suite_dirs.push((suite, path)); - } - } - } - suite_dirs.sort_by(|a, b| a.0.cmp(&b.0)); - - let mut all_rows = String::new(); - all_rows.push_str("suite,test,symbol,yul_unopt_gas,yul_opt_gas,sonatina_gas,delta_vs_yul_unopt,delta_vs_yul_unopt_pct,delta_vs_yul_opt,delta_vs_yul_opt_pct,yul_unopt_status,yul_opt_status,sonatina_status,note\n"); - let mut all_breakdown_rows = String::new(); - all_breakdown_rows.push_str("suite,test,symbol,yul_unopt_call_gas,yul_opt_call_gas,sonatina_call_gas,delta_call_vs_yul_unopt,delta_call_vs_yul_unopt_pct,delta_call_vs_yul_opt,delta_call_vs_yul_opt_pct,yul_unopt_deploy_gas,yul_opt_deploy_gas,sonatina_deploy_gas,delta_deploy_vs_yul_unopt,delta_deploy_vs_yul_unopt_pct,delta_deploy_vs_yul_opt,delta_deploy_vs_yul_opt_pct,yul_unopt_total_gas,yul_opt_total_gas,sonatina_total_gas,delta_total_vs_yul_unopt,delta_total_vs_yul_unopt_pct,delta_total_vs_yul_opt,delta_total_vs_yul_opt_pct,note\n"); - let mut all_opcode_rows = String::new(); - all_opcode_rows.push_str("suite,"); - all_opcode_rows.push_str(gas_opcode_comparison_header()); - all_opcode_rows.push('\n'); - let mut all_deployment_attr_rows = String::new(); - all_deployment_attr_rows.push_str(DEPLOYMENT_ATTRIBUTION_CSV_HEADER_WITH_SUITE); - all_deployment_attr_rows.push('\n'); - let mut wrote_any_rows = false; - let mut wrote_any_breakdown_rows = false; - let mut wrote_any_opcode_rows = false; - let mut wrote_any_deployment_attr_rows = false; - let mut totals = GasTotals::default(); - let mut call_magnitude_totals = GasMagnitudeTotals::default(); - let mut deploy_magnitude_totals = GasMagnitudeTotals::default(); - let mut total_magnitude_totals = GasMagnitudeTotals::default(); - let mut opcode_magnitude_totals = OpcodeMagnitudeTotals::default(); - let mut deployment_attribution_totals = DeploymentGasAttributionTotals::default(); - let mut hotspots: Vec = Vec::new(); - let mut suite_rollup: FxHashMap = FxHashMap::default(); - let mut trace_symbol_hotspots: Vec = Vec::new(); - let mut observability_coverage_rows: Vec = Vec::new(); - let mut observability_coverage_totals = ObservabilityCoverageTotals::default(); - let mut trace_observability_hotspots: Vec = Vec::new(); - - for (suite, suite_dir) in suite_dirs { - let (suite_observability_rows, suite_observability_ranges) = - load_suite_observability_runtime(&suite_dir, &suite); - for row in suite_observability_rows { - observability_coverage_totals.add_row(&row); - observability_coverage_rows.push(row); - } - - let suite_rows_path = suite_dir.join("artifacts").join("gas_comparison.csv"); - if let Ok(contents) = std::fs::read_to_string(&suite_rows_path) { - for (idx, line) in contents.lines().enumerate() { - if idx == 0 || line.trim().is_empty() { - continue; - } - let fields = parse_csv_fields(line); - if fields.len() >= 9 { - let yul_opt_gas = parse_optional_u64_cell(&fields[3]); - let sonatina_gas = parse_optional_u64_cell(&fields[4]); - if let Some(delta_vs_yul_opt) = parse_optional_i128_cell(&fields[7]) { - hotspots.push(GasHotspotRow { - suite: suite.clone(), - test: fields[0].clone(), - symbol: fields[1].clone(), - yul_opt_gas, - sonatina_gas, - delta_vs_yul_opt, - delta_vs_yul_opt_pct: fields[8].clone(), - }); - let entry = suite_rollup.entry(suite.clone()).or_default(); - entry.tests_with_delta += 1; - entry.delta_vs_yul_opt_sum += delta_vs_yul_opt; - } - } - all_rows.push_str(&csv_escape(&suite)); - all_rows.push(','); - all_rows.push_str(line); - all_rows.push('\n'); - wrote_any_rows = true; - } - } - - let suite_breakdown_rows_path = suite_dir - .join("artifacts") - .join("gas_breakdown_comparison.csv"); - if let Ok(contents) = std::fs::read_to_string(&suite_breakdown_rows_path) { - for (idx, line) in contents.lines().enumerate() { - if idx == 0 || line.trim().is_empty() { - continue; - } - all_breakdown_rows.push_str(&csv_escape(&suite)); - all_breakdown_rows.push(','); - all_breakdown_rows.push_str(line); - all_breakdown_rows.push('\n'); - wrote_any_breakdown_rows = true; - } - } - - let suite_opcode_rows_path = suite_dir - .join("artifacts") - .join("gas_opcode_comparison.csv"); - if let Ok(contents) = std::fs::read_to_string(&suite_opcode_rows_path) { - for (idx, line) in contents.lines().enumerate() { - if idx == 0 || line.trim().is_empty() { - continue; - } - all_opcode_rows.push_str(&csv_escape(&suite)); - all_opcode_rows.push(','); - all_opcode_rows.push_str(line); - all_opcode_rows.push('\n'); - wrote_any_opcode_rows = true; - } - } - - let suite_deployment_attr_rows_path = suite_dir - .join("artifacts") - .join("gas_deployment_attribution.csv"); - if let Ok(contents) = std::fs::read_to_string(&suite_deployment_attr_rows_path) { - for (idx, line) in contents.lines().enumerate() { - if idx == 0 || line.trim().is_empty() { - continue; - } - let fields = parse_csv_fields(line); - if let Some(row) = parse_deployment_attribution_row(&fields) - && let Some((yul_opt_profile, sonatina_profile)) = - deployment_attribution_row_profiles_for_totals(&row) - { - deployment_attribution_totals - .add_observation(yul_opt_profile, sonatina_profile); - } - all_deployment_attr_rows.push_str(&csv_escape(&suite)); - all_deployment_attr_rows.push(','); - all_deployment_attr_rows.push_str(line); - all_deployment_attr_rows.push('\n'); - wrote_any_deployment_attr_rows = true; - } - } - - let suite_totals_path = suite_dir - .join("artifacts") - .join("gas_comparison_totals.csv"); - if let Ok(contents) = std::fs::read_to_string(&suite_totals_path) { - totals.add(parse_gas_totals_csv(&contents)); - } - - let suite_magnitude_path = suite_dir - .join("artifacts") - .join("gas_comparison_magnitude.csv"); - let mut has_legacy_call_magnitude = false; - if let Ok(contents) = std::fs::read_to_string(&suite_magnitude_path) { - call_magnitude_totals.add(parse_gas_magnitude_csv(&contents)); - has_legacy_call_magnitude = true; - } - - let suite_breakdown_magnitude_path = suite_dir - .join("artifacts") - .join("gas_breakdown_magnitude.csv"); - if let Ok(contents) = std::fs::read_to_string(&suite_breakdown_magnitude_path) { - let (call, deploy, total) = parse_gas_breakdown_magnitude_csv(&contents); - if !has_legacy_call_magnitude { - call_magnitude_totals.add(call); - } - deploy_magnitude_totals.add(deploy); - total_magnitude_totals.add(total); - } - - let suite_opcode_magnitude_path = - suite_dir.join("artifacts").join("gas_opcode_magnitude.csv"); - if let Ok(contents) = std::fs::read_to_string(&suite_opcode_magnitude_path) { - opcode_magnitude_totals.add(parse_gas_opcode_magnitude_csv(&contents)); - } - - let debug_dir = suite_dir.join("debug"); - let symtab_entries = std::fs::read_to_string(debug_dir.join("sonatina_symtab.txt")) - .ok() - .map(|contents| parse_symtab_entries(&contents)) - .unwrap_or_default(); - if let Ok(entries) = std::fs::read_dir(&debug_dir) { - for entry in entries.flatten() { - let path = entry.path(); - if !path.is_file() { - continue; - } - let Some(file_name) = path.file_name().and_then(|name| name.to_str()) else { - continue; - }; - if !file_name.ends_with(".evm_trace.txt") { - continue; - } - let Ok(contents) = std::fs::read_to_string(&path) else { - continue; - }; - let pcs = parse_trace_tail_pcs(&contents); - if pcs.is_empty() { - continue; - } - let mut counts: FxHashMap = FxHashMap::default(); - let mut mapped = 0usize; - if !symtab_entries.is_empty() { - for pc in &pcs { - if let Some(symbol) = map_pc_to_symbol(*pc, &symtab_entries) { - *counts.entry(symbol.to_string()).or_default() += 1; - mapped += 1; - } - } - } - let test_name = file_name - .strip_suffix(".evm_trace.txt") - .unwrap_or(file_name) - .to_string(); - if !counts.is_empty() { - for (symbol, steps_in_symbol) in counts { - trace_symbol_hotspots.push(TraceSymbolHotspotRow { - suite: suite.clone(), - test: test_name.clone(), - symbol, - tail_steps_total: pcs.len(), - tail_steps_mapped: mapped, - steps_in_symbol, - }); - } - } - - if let Some(pc_ranges) = resolve_observability_test_ranges( - &suite, - &test_name, - &suite_observability_ranges, - ) { - let mut obs_counts: FxHashMap<(String, String), usize> = FxHashMap::default(); - let mut obs_mapped = 0usize; - for pc in &pcs { - if let Some(range) = map_pc_to_observability(*pc, pc_ranges) { - obs_mapped += 1; - let reason = - range.reason.clone().unwrap_or_else(|| "mapped".to_string()); - *obs_counts - .entry((range.func_name.clone(), reason)) - .or_default() += 1; - } else { - *obs_counts - .entry(("".to_string(), "pc_not_in_map".to_string())) - .or_default() += 1; - } - } - - for ((function, reason), steps_in_bucket) in obs_counts { - trace_observability_hotspots.push(TraceObservabilityHotspotRow { - suite: suite.clone(), - test: test_name.clone(), - function, - reason, - tail_steps_total: pcs.len(), - tail_steps_mapped: obs_mapped, - steps_in_bucket, - }); - } - } else { - trace_observability_hotspots.push(TraceObservabilityHotspotRow { - suite: suite.clone(), - test: test_name.clone(), - function: "".to_string(), - reason: "no_observability_test_match".to_string(), - tail_steps_total: pcs.len(), - tail_steps_mapped: 0, - steps_in_bucket: pcs.len(), - }); - } - } - } - } - - let mut suite_rollup_rows: Vec<(String, SuiteDeltaTotals)> = suite_rollup.into_iter().collect(); - suite_rollup_rows.sort_by(|a, b| { - b.1.delta_vs_yul_opt_sum - .cmp(&a.1.delta_vs_yul_opt_sum) - .then_with(|| a.0.cmp(&b.0)) - }); - - if wrote_any_rows { - let _ = std::fs::write(artifacts_dir.join("gas_comparison_all.csv"), all_rows); - write_gas_hotspots_csv( - &artifacts_dir.join("gas_hotspots_vs_yul_opt.csv"), - &hotspots, - ); - write_suite_delta_summary_csv( - &artifacts_dir.join("gas_suite_delta_summary.csv"), - &suite_rollup_rows, - ); - write_trace_symbol_hotspots_csv( - &artifacts_dir.join("gas_tail_trace_symbol_hotspots.csv"), - &trace_symbol_hotspots, - ); - if !trace_observability_hotspots.is_empty() { - write_trace_observability_hotspots_csv( - &artifacts_dir.join("gas_tail_trace_observability_hotspots.csv"), - &trace_observability_hotspots, - ); - } - } - if !observability_coverage_rows.is_empty() { - write_observability_coverage_csv( - &artifacts_dir.join("observability_coverage_all.csv"), - &observability_coverage_rows, - ); - } - if wrote_any_breakdown_rows { - let _ = std::fs::write( - artifacts_dir.join("gas_breakdown_comparison_all.csv"), - all_breakdown_rows, - ); - } - if wrote_any_opcode_rows { - let _ = std::fs::write( - artifacts_dir.join("gas_opcode_comparison_all.csv"), - all_opcode_rows, - ); - } - if wrote_any_deployment_attr_rows { - let _ = std::fs::write( - artifacts_dir.join("gas_deployment_attribution_all.csv"), - all_deployment_attr_rows, - ); - } - write_gas_totals_csv(&artifacts_dir.join("gas_comparison_totals.csv"), totals); - write_gas_magnitude_csv( - &artifacts_dir.join("gas_comparison_magnitude.csv"), - call_magnitude_totals, - ); - write_gas_breakdown_magnitude_csv( - &artifacts_dir.join("gas_breakdown_magnitude.csv"), - call_magnitude_totals, - deploy_magnitude_totals, - total_magnitude_totals, - ); - write_opcode_magnitude_csv( - &artifacts_dir.join("gas_opcode_magnitude.csv"), - opcode_magnitude_totals, - ); - - let mut summary = String::new(); - summary.push_str("# Gas Comparison Summary\n\n"); - summary.push_str("Aggregated totals across all suite reports in this archive.\n\n"); - summary.push_str(&format!("- tests_in_scope: {}\n", totals.tests_in_scope)); - summary.push('\n'); - append_comparison_summary( - &mut summary, - "vs Yul (unoptimized)", - totals.vs_yul_unopt, - totals.tests_in_scope, - ); - append_comparison_summary( - &mut summary, - "vs Yul (optimized)", - totals.vs_yul_opt, - totals.tests_in_scope, - ); - summary.push_str("\n## Aggregate Delta Metrics\n\n"); - append_magnitude_summary( - &mut summary, - "Runtime Call Gas vs Yul (unoptimized)", - call_magnitude_totals.vs_yul_unopt, - ); - append_magnitude_summary( - &mut summary, - "Runtime Call Gas vs Yul (optimized)", - call_magnitude_totals.vs_yul_opt, - ); - summary.push_str("\n## Deploy/Call/Total Breakdown\n\n"); - append_magnitude_summary( - &mut summary, - "Deployment Gas vs Yul (unoptimized)", - deploy_magnitude_totals.vs_yul_unopt, - ); - append_magnitude_summary( - &mut summary, - "Deployment Gas vs Yul (optimized)", - deploy_magnitude_totals.vs_yul_opt, - ); - append_magnitude_summary( - &mut summary, - "Total Gas (deploy+call) vs Yul (unoptimized)", - total_magnitude_totals.vs_yul_unopt, - ); - append_magnitude_summary( - &mut summary, - "Total Gas (deploy+call) vs Yul (optimized)", - total_magnitude_totals.vs_yul_opt, - ); - append_deployment_attribution_summary( - &mut summary, - "Deployment Attribution (Step Replay, vs Yul optimized)", - deployment_attribution_totals, - ); - append_opcode_magnitude_summary(&mut summary, opcode_magnitude_totals); - append_opcode_inflation_attribution(&mut summary, opcode_magnitude_totals); - if wrote_any_rows { - append_hotspot_summary(&mut summary, &hotspots, &suite_rollup_rows); - append_trace_symbol_hotspots_summary(&mut summary, &trace_symbol_hotspots); - append_trace_observability_hotspots_summary(&mut summary, &trace_observability_hotspots); - } - append_observability_coverage_summary( - &mut summary, - &observability_coverage_rows, - observability_coverage_totals, - ); - summary.push_str("\n## Optimization Settings\n\n"); - for line in - gas_comparison_settings_text(primary_backend, yul_primary_optimize, opt_level).lines() - { - summary.push_str(&format!("- {line}\n")); - } - if wrote_any_rows { - summary.push_str("\nSee `artifacts/gas_comparison_all.csv`, `artifacts/gas_comparison_totals.csv`, `artifacts/gas_comparison_magnitude.csv`, `artifacts/gas_breakdown_comparison_all.csv`, `artifacts/gas_breakdown_magnitude.csv`, `artifacts/gas_opcode_magnitude.csv`, `artifacts/gas_deployment_attribution_all.csv`, `artifacts/gas_hotspots_vs_yul_opt.csv`, `artifacts/gas_suite_delta_summary.csv`, `artifacts/gas_tail_trace_symbol_hotspots.csv`, and `artifacts/gas_tail_trace_observability_hotspots.csv` for machine-readable totals and rollups.\n"); - } - if !observability_coverage_rows.is_empty() { - summary.push_str( - "See `artifacts/observability_coverage_all.csv` for per-test Sonatina observability coverage totals.\n", - ); - } - if wrote_any_opcode_rows { - summary.push_str( - "See `artifacts/gas_opcode_comparison_all.csv` for aggregated opcode and step-count diagnostics.\n", - ); - } - let _ = std::fs::write(artifacts_dir.join("gas_comparison_summary.md"), summary); -} diff --git a/crates/fe/src/test/mod.rs b/crates/fe/src/test/mod.rs deleted file mode 100644 index d58b1dd9bc..0000000000 --- a/crates/fe/src/test/mod.rs +++ /dev/null @@ -1,3241 +0,0 @@ -//! Test runner for Fe tests. -//! -//! Discovers functions marked with `#[test]` attribute, compiles them, and -//! executes them using revm. - -use crate::report::{ - PanicReportGuard, ReportStaging, copy_input_into_report, create_dir_all_utf8, - create_report_staging_root, enable_panic_report, is_verifier_error_text, - normalize_report_out_path, panic_payload_to_string, sanitize_filename, tar_gz_dir, - write_report_meta, -}; -use crate::workspace_ingot::{ - INGOT_REQUIRES_WORKSPACE_ROOT, WorkspaceMemberRef, select_workspace_member_paths, -}; -use camino::Utf8PathBuf; -use codegen::{ - DebugOutputSink, ExpectedRevert, OptLevel, SonatinaTestDebugConfig, TestMetadata, - TestModuleOutput, emit_test_module_sonatina, emit_test_module_yul, -}; -use colored::Colorize; -use common::{ - InputDb, - config::{Config, WorkspaceMemberSelection}, - ingot::Ingot, -}; -use contract_harness::{CallGasProfile, EvmTraceOptions, ExecutionOptions, RuntimeInstance}; -use crossbeam_channel::{Receiver, Sender, TryRecvError}; -use driver::DriverDataBase; -use hir::hir_def::{HirIngot, TopLevelMod, item::ItemKind}; -use mir::{fmt as mir_fmt, lower_module}; -use rustc_hash::{FxHashMap, FxHashSet}; -use solc_runner::compile_single_contract_with_solc; -use std::{ - fmt::Write as _, - sync::Arc, - time::{Duration, Instant}, -}; -use url::Url; - -mod gas; - -pub(super) const YUL_VERIFY_RUNTIME: bool = true; -const MAX_STREAMED_SUITE_LABEL_CHARS: usize = 20; -const STREAMED_SUITE_LABEL_ELLIPSIS: &str = ".."; -const STREAMED_STATUS_COLUMN_WIDTH: usize = 16; - -fn install_report_panic_hook(report: &ReportContext, filename: &str) -> PanicReportGuard { - let dir = report.root_dir.join("errors"); - let _ = create_dir_all_utf8(&dir); - let path = dir.join(filename); - enable_panic_report(path) -} - -/// Result of running a single test. -#[derive(Debug, Clone)] -pub struct TestResult { - pub name: String, - pub passed: bool, - pub error_message: Option, - /// Runtime test-call gas (the empty-calldata call into the deployed test object). - pub gas_used: Option, - /// Gas used by the deployment transaction that instantiates the test object. - pub deploy_gas_used: Option, - /// Combined deployment + runtime-call gas, when both are available. - pub total_gas_used: Option, -} - -#[derive(Debug)] -pub(super) struct TestOutcome { - result: TestResult, - logs: Vec, - trace: Option, - step_count: Option, - runtime_metrics: Option, - gas_profile: Option, - elapsed: Duration, -} - -#[derive(Debug, Clone)] -pub(super) struct GasComparisonCase { - pub(super) display_name: String, - pub(super) symbol_name: String, - pub(super) yul: Option, - pub(super) sonatina: Option, -} - -#[derive(Debug, Clone)] -pub(super) struct GasMeasurement { - pub(super) gas_used: Option, - pub(super) deploy_gas_used: Option, - pub(super) total_gas_used: Option, - pub(super) step_count: Option, - pub(super) runtime_metrics: Option, - pub(super) gas_profile: Option, - pub(super) passed: bool, - pub(super) error_message: Option, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct EvmRuntimeMetrics { - pub(super) byte_len: usize, - pub(super) op_count: usize, - pub(super) push_ops: usize, - pub(super) dup_ops: usize, - pub(super) swap_ops: usize, - pub(super) pop_ops: usize, - pub(super) jump_ops: usize, - pub(super) jumpi_ops: usize, - pub(super) jumpdest_ops: usize, - pub(super) iszero_ops: usize, - pub(super) mload_ops: usize, - pub(super) mstore_ops: usize, - pub(super) sload_ops: usize, - pub(super) sstore_ops: usize, - pub(super) keccak_ops: usize, - pub(super) call_ops: usize, - pub(super) staticcall_ops: usize, - pub(super) returndatacopy_ops: usize, - pub(super) calldatacopy_ops: usize, - pub(super) mcopy_ops: usize, - pub(super) return_ops: usize, - pub(super) revert_ops: usize, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct ComparisonTotals { - pub(super) compared_with_gas: usize, - pub(super) sonatina_lower: usize, - pub(super) sonatina_higher: usize, - pub(super) equal: usize, - pub(super) incomplete: usize, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct GasTotals { - pub(super) tests_in_scope: usize, - pub(super) vs_yul_unopt: ComparisonTotals, - pub(super) vs_yul_opt: ComparisonTotals, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct DeltaMagnitudeTotals { - pub(super) compared_with_gas: usize, - pub(super) pct_rows: usize, - pub(super) baseline_gas_sum: u128, - pub(super) sonatina_gas_sum: u128, - pub(super) delta_gas_sum: i128, - pub(super) abs_delta_gas_sum: u128, - pub(super) delta_pct_sum: f64, - pub(super) abs_delta_pct_sum: f64, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct GasMagnitudeTotals { - pub(super) vs_yul_unopt: DeltaMagnitudeTotals, - pub(super) vs_yul_opt: DeltaMagnitudeTotals, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct OpcodeAggregateTotals { - pub(super) steps_sum: u128, - pub(super) runtime_bytes_sum: u128, - pub(super) runtime_ops_sum: u128, - pub(super) swap_ops_sum: u128, - pub(super) pop_ops_sum: u128, - pub(super) jump_ops_sum: u128, - pub(super) jumpi_ops_sum: u128, - pub(super) iszero_ops_sum: u128, - pub(super) mem_rw_ops_sum: u128, - pub(super) storage_rw_ops_sum: u128, - pub(super) mload_ops_sum: u128, - pub(super) mstore_ops_sum: u128, - pub(super) sload_ops_sum: u128, - pub(super) sstore_ops_sum: u128, - pub(super) keccak_ops_sum: u128, - pub(super) call_family_ops_sum: u128, - pub(super) copy_ops_sum: u128, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct OpcodeMagnitudeTotals { - pub(super) compared_with_metrics: usize, - pub(super) yul_opt: OpcodeAggregateTotals, - pub(super) sonatina: OpcodeAggregateTotals, -} - -#[derive(Debug, Clone)] -pub(super) struct GasHotspotRow { - pub(super) suite: String, - pub(super) test: String, - pub(super) symbol: String, - pub(super) yul_opt_gas: Option, - pub(super) sonatina_gas: Option, - pub(super) delta_vs_yul_opt: i128, - pub(super) delta_vs_yul_opt_pct: String, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct SuiteDeltaTotals { - pub(super) tests_with_delta: usize, - pub(super) delta_vs_yul_opt_sum: i128, -} - -#[derive(Debug, Clone)] -pub(super) struct SymtabEntry { - pub(super) start: u32, - pub(super) end: u32, - pub(super) symbol: String, -} - -#[derive(Debug, Clone)] -pub(super) struct TraceSymbolHotspotRow { - pub(super) suite: String, - pub(super) test: String, - pub(super) symbol: String, - pub(super) tail_steps_total: usize, - pub(super) tail_steps_mapped: usize, - pub(super) steps_in_symbol: usize, -} - -#[derive(Debug, Clone)] -pub(super) struct ObservabilityCoverageRow { - pub(super) suite: String, - pub(super) test: String, - pub(super) section: String, - pub(super) schema_version: String, - pub(super) section_bytes: u64, - pub(super) code_bytes: u64, - pub(super) data_bytes: u64, - pub(super) embed_bytes: u64, - pub(super) mapped_code_bytes: u64, - pub(super) unmapped_code_bytes: u64, - pub(super) unmapped_no_ir_inst: u64, - pub(super) unmapped_label_or_fixup_only: u64, - pub(super) unmapped_synthetic: u64, - pub(super) unmapped_unknown: u64, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct ObservabilityCoverageTotals { - pub(super) section_bytes: u128, - pub(super) code_bytes: u128, - pub(super) data_bytes: u128, - pub(super) embed_bytes: u128, - pub(super) mapped_code_bytes: u128, - pub(super) unmapped_code_bytes: u128, - pub(super) unmapped_no_ir_inst: u128, - pub(super) unmapped_label_or_fixup_only: u128, - pub(super) unmapped_synthetic: u128, - pub(super) unmapped_unknown: u128, -} - -#[derive(Debug, Clone)] -pub(super) struct ObservabilityPcRange { - pub(super) start: u32, - pub(super) end: u32, - pub(super) func_name: String, - pub(super) reason: Option, -} - -#[derive(Debug, Clone)] -pub(super) struct ObservabilityRuntimeSnapshot { - pub(super) section: String, - pub(super) schema_version: String, - pub(super) section_bytes: u64, - pub(super) code_bytes: u64, - pub(super) data_bytes: u64, - pub(super) embed_bytes: u64, - pub(super) mapped_code_bytes: u64, - pub(super) unmapped_code_bytes: u64, - pub(super) unmapped_no_ir_inst: u64, - pub(super) unmapped_label_or_fixup_only: u64, - pub(super) unmapped_synthetic: u64, - pub(super) unmapped_unknown: u64, - pub(super) pc_ranges: Vec, -} - -#[derive(Debug, Clone)] -pub(super) struct TraceObservabilityHotspotRow { - pub(super) suite: String, - pub(super) test: String, - pub(super) function: String, - pub(super) reason: String, - pub(super) tail_steps_total: usize, - pub(super) tail_steps_mapped: usize, - pub(super) steps_in_bucket: usize, -} - -#[derive(Debug, Clone)] -pub(super) struct DeploymentGasAttributionRow { - pub(super) test: String, - pub(super) symbol: String, - pub(super) yul_unopt_step_total_gas: Option, - pub(super) yul_opt_step_total_gas: Option, - pub(super) sonatina_step_total_gas: Option, - pub(super) yul_unopt_create_opcode_gas: Option, - pub(super) yul_opt_create_opcode_gas: Option, - pub(super) sonatina_create_opcode_gas: Option, - pub(super) yul_unopt_create2_opcode_gas: Option, - pub(super) yul_opt_create2_opcode_gas: Option, - pub(super) sonatina_create2_opcode_gas: Option, - pub(super) yul_unopt_constructor_frame_gas: Option, - pub(super) yul_opt_constructor_frame_gas: Option, - pub(super) sonatina_constructor_frame_gas: Option, - pub(super) yul_unopt_non_constructor_frame_gas: Option, - pub(super) yul_opt_non_constructor_frame_gas: Option, - pub(super) sonatina_non_constructor_frame_gas: Option, - pub(super) yul_unopt_create_opcode_steps: Option, - pub(super) yul_opt_create_opcode_steps: Option, - pub(super) sonatina_create_opcode_steps: Option, - pub(super) yul_unopt_create2_opcode_steps: Option, - pub(super) yul_opt_create2_opcode_steps: Option, - pub(super) sonatina_create2_opcode_steps: Option, - pub(super) note: String, -} - -#[derive(Debug, Clone, Copy, Default)] -pub(super) struct DeploymentGasAttributionTotals { - pub(super) compared_with_profile: usize, - pub(super) yul_opt_step_total_gas: u128, - pub(super) sonatina_step_total_gas: u128, - pub(super) yul_opt_create_opcode_gas: u128, - pub(super) sonatina_create_opcode_gas: u128, - pub(super) yul_opt_create2_opcode_gas: u128, - pub(super) sonatina_create2_opcode_gas: u128, - pub(super) yul_opt_constructor_frame_gas: u128, - pub(super) sonatina_constructor_frame_gas: u128, - pub(super) yul_opt_non_constructor_frame_gas: u128, - pub(super) sonatina_non_constructor_frame_gas: u128, -} - -pub(super) const DEPLOYMENT_ATTRIBUTION_CSV_HEADER: &str = "test,symbol,yul_unopt_step_total_gas,yul_opt_step_total_gas,sonatina_step_total_gas,yul_unopt_create_opcode_gas,yul_opt_create_opcode_gas,sonatina_create_opcode_gas,yul_unopt_create2_opcode_gas,yul_opt_create2_opcode_gas,sonatina_create2_opcode_gas,yul_unopt_constructor_frame_gas,yul_opt_constructor_frame_gas,sonatina_constructor_frame_gas,yul_unopt_non_constructor_frame_gas,yul_opt_non_constructor_frame_gas,sonatina_non_constructor_frame_gas,yul_unopt_create_opcode_steps,yul_opt_create_opcode_steps,sonatina_create_opcode_steps,yul_unopt_create2_opcode_steps,yul_opt_create2_opcode_steps,sonatina_create2_opcode_steps,note"; -pub(super) const DEPLOYMENT_ATTRIBUTION_CSV_HEADER_WITH_SUITE: &str = "suite,test,symbol,yul_unopt_step_total_gas,yul_opt_step_total_gas,sonatina_step_total_gas,yul_unopt_create_opcode_gas,yul_opt_create_opcode_gas,sonatina_create_opcode_gas,yul_unopt_create2_opcode_gas,yul_opt_create2_opcode_gas,sonatina_create2_opcode_gas,yul_unopt_constructor_frame_gas,yul_opt_constructor_frame_gas,sonatina_constructor_frame_gas,yul_unopt_non_constructor_frame_gas,yul_opt_non_constructor_frame_gas,sonatina_non_constructor_frame_gas,yul_unopt_create_opcode_steps,yul_opt_create_opcode_steps,sonatina_create_opcode_steps,yul_unopt_create2_opcode_steps,yul_opt_create2_opcode_steps,sonatina_create2_opcode_steps,note"; -pub(super) const DEPLOYMENT_ATTRIBUTION_FIELD_COUNT: usize = 24; - -impl GasMeasurement { - pub(super) fn from_test_outcome(outcome: &TestOutcome) -> Self { - Self { - gas_used: outcome.result.gas_used, - deploy_gas_used: outcome.result.deploy_gas_used, - total_gas_used: outcome.result.total_gas_used, - step_count: outcome.step_count, - runtime_metrics: outcome.runtime_metrics, - gas_profile: outcome.gas_profile, - passed: outcome.result.passed, - error_message: outcome.result.error_message.clone(), - } - } - - pub(super) fn status_label(&self) -> String { - if self.passed { - "ok".to_string() - } else if let Some(msg) = &self.error_message { - format!("failed: {msg}") - } else { - "failed".to_string() - } - } -} - -impl DeploymentGasAttributionTotals { - pub(super) fn add_observation(&mut self, yul_opt: CallGasProfile, sonatina: CallGasProfile) { - self.compared_with_profile += 1; - self.yul_opt_step_total_gas += yul_opt.total_step_gas as u128; - self.sonatina_step_total_gas += sonatina.total_step_gas as u128; - self.yul_opt_create_opcode_gas += yul_opt.create_opcode_gas as u128; - self.sonatina_create_opcode_gas += sonatina.create_opcode_gas as u128; - self.yul_opt_create2_opcode_gas += yul_opt.create2_opcode_gas as u128; - self.sonatina_create2_opcode_gas += sonatina.create2_opcode_gas as u128; - self.yul_opt_constructor_frame_gas += yul_opt.constructor_frame_gas as u128; - self.sonatina_constructor_frame_gas += sonatina.constructor_frame_gas as u128; - self.yul_opt_non_constructor_frame_gas += yul_opt.non_constructor_frame_gas as u128; - self.sonatina_non_constructor_frame_gas += sonatina.non_constructor_frame_gas as u128; - } -} - -impl GasTotals { - pub(super) fn add(&mut self, other: Self) { - self.tests_in_scope += other.tests_in_scope; - self.vs_yul_unopt.compared_with_gas += other.vs_yul_unopt.compared_with_gas; - self.vs_yul_unopt.sonatina_lower += other.vs_yul_unopt.sonatina_lower; - self.vs_yul_unopt.sonatina_higher += other.vs_yul_unopt.sonatina_higher; - self.vs_yul_unopt.equal += other.vs_yul_unopt.equal; - self.vs_yul_unopt.incomplete += other.vs_yul_unopt.incomplete; - self.vs_yul_opt.compared_with_gas += other.vs_yul_opt.compared_with_gas; - self.vs_yul_opt.sonatina_lower += other.vs_yul_opt.sonatina_lower; - self.vs_yul_opt.sonatina_higher += other.vs_yul_opt.sonatina_higher; - self.vs_yul_opt.equal += other.vs_yul_opt.equal; - self.vs_yul_opt.incomplete += other.vs_yul_opt.incomplete; - } -} - -impl ObservabilityCoverageTotals { - pub(super) fn add_row(&mut self, row: &ObservabilityCoverageRow) { - self.section_bytes += row.section_bytes as u128; - self.code_bytes += row.code_bytes as u128; - self.data_bytes += row.data_bytes as u128; - self.embed_bytes += row.embed_bytes as u128; - self.mapped_code_bytes += row.mapped_code_bytes as u128; - self.unmapped_code_bytes += row.unmapped_code_bytes as u128; - self.unmapped_no_ir_inst += row.unmapped_no_ir_inst as u128; - self.unmapped_label_or_fixup_only += row.unmapped_label_or_fixup_only as u128; - self.unmapped_synthetic += row.unmapped_synthetic as u128; - self.unmapped_unknown += row.unmapped_unknown as u128; - } -} - -impl DeltaMagnitudeTotals { - pub(super) fn add(&mut self, other: Self) { - self.compared_with_gas += other.compared_with_gas; - self.pct_rows += other.pct_rows; - self.baseline_gas_sum += other.baseline_gas_sum; - self.sonatina_gas_sum += other.sonatina_gas_sum; - self.delta_gas_sum += other.delta_gas_sum; - self.abs_delta_gas_sum += other.abs_delta_gas_sum; - self.delta_pct_sum += other.delta_pct_sum; - self.abs_delta_pct_sum += other.abs_delta_pct_sum; - } - - pub(super) fn mean_delta_gas(self) -> Option { - if self.compared_with_gas == 0 { - None - } else { - Some(self.delta_gas_sum as f64 / self.compared_with_gas as f64) - } - } - - pub(super) fn mean_abs_delta_gas(self) -> Option { - if self.compared_with_gas == 0 { - None - } else { - Some(self.abs_delta_gas_sum as f64 / self.compared_with_gas as f64) - } - } - - pub(super) fn mean_delta_pct(self) -> Option { - if self.pct_rows == 0 { - None - } else { - Some(self.delta_pct_sum / self.pct_rows as f64) - } - } - - pub(super) fn mean_abs_delta_pct(self) -> Option { - if self.pct_rows == 0 { - None - } else { - Some(self.abs_delta_pct_sum / self.pct_rows as f64) - } - } - - pub(super) fn weighted_delta_pct(self) -> Option { - if self.baseline_gas_sum == 0 { - None - } else { - Some(self.delta_gas_sum as f64 * 100.0 / self.baseline_gas_sum as f64) - } - } -} - -impl GasMagnitudeTotals { - pub(super) fn add(&mut self, other: Self) { - self.vs_yul_unopt.add(other.vs_yul_unopt); - self.vs_yul_opt.add(other.vs_yul_opt); - } -} - -impl OpcodeAggregateTotals { - pub(super) fn add_observation(&mut self, steps: u64, metrics: EvmRuntimeMetrics) { - self.steps_sum += steps as u128; - self.runtime_bytes_sum += metrics.byte_len as u128; - self.runtime_ops_sum += metrics.op_count as u128; - self.swap_ops_sum += metrics.swap_ops as u128; - self.pop_ops_sum += metrics.pop_ops as u128; - self.jump_ops_sum += metrics.jump_ops as u128; - self.jumpi_ops_sum += metrics.jumpi_ops as u128; - self.iszero_ops_sum += metrics.iszero_ops as u128; - self.mem_rw_ops_sum += metrics.mem_rw_ops_total() as u128; - self.storage_rw_ops_sum += metrics.storage_rw_ops_total() as u128; - self.mload_ops_sum += metrics.mload_ops as u128; - self.mstore_ops_sum += metrics.mstore_ops as u128; - self.sload_ops_sum += metrics.sload_ops as u128; - self.sstore_ops_sum += metrics.sstore_ops as u128; - self.keccak_ops_sum += metrics.keccak_ops as u128; - self.call_family_ops_sum += metrics.call_family_ops_total() as u128; - self.copy_ops_sum += metrics.copy_ops_total() as u128; - } - - pub(super) fn add(&mut self, other: Self) { - self.steps_sum += other.steps_sum; - self.runtime_bytes_sum += other.runtime_bytes_sum; - self.runtime_ops_sum += other.runtime_ops_sum; - self.swap_ops_sum += other.swap_ops_sum; - self.pop_ops_sum += other.pop_ops_sum; - self.jump_ops_sum += other.jump_ops_sum; - self.jumpi_ops_sum += other.jumpi_ops_sum; - self.iszero_ops_sum += other.iszero_ops_sum; - self.mem_rw_ops_sum += other.mem_rw_ops_sum; - self.storage_rw_ops_sum += other.storage_rw_ops_sum; - self.mload_ops_sum += other.mload_ops_sum; - self.mstore_ops_sum += other.mstore_ops_sum; - self.sload_ops_sum += other.sload_ops_sum; - self.sstore_ops_sum += other.sstore_ops_sum; - self.keccak_ops_sum += other.keccak_ops_sum; - self.call_family_ops_sum += other.call_family_ops_sum; - self.copy_ops_sum += other.copy_ops_sum; - } -} - -impl OpcodeMagnitudeTotals { - pub(super) fn add(&mut self, other: Self) { - self.compared_with_metrics += other.compared_with_metrics; - self.yul_opt.add(other.yul_opt); - self.sonatina.add(other.sonatina); - } -} - -impl EvmRuntimeMetrics { - pub(super) fn stack_ops_total(self) -> usize { - self.push_ops + self.dup_ops + self.swap_ops + self.pop_ops - } - - pub(super) fn mem_rw_ops_total(self) -> usize { - self.mload_ops + self.mstore_ops - } - - pub(super) fn storage_rw_ops_total(self) -> usize { - self.sload_ops + self.sstore_ops - } - - pub(super) fn call_family_ops_total(self) -> usize { - self.call_ops + self.staticcall_ops - } - - pub(super) fn copy_ops_total(self) -> usize { - self.calldatacopy_ops + self.returndatacopy_ops + self.mcopy_ops - } -} - -fn suite_error_result(suite: &str, kind: &str, message: String) -> Vec { - vec![TestResult { - name: format!("{suite}::{kind}"), - passed: false, - error_message: Some(message), - gas_used: None, - deploy_gas_used: None, - total_gas_used: None, - }] -} - -pub(super) fn write_report_error(report: &ReportContext, filename: &str, contents: &str) { - let dir = report.root_dir.join("errors"); - let _ = create_dir_all_utf8(&dir); - let _ = std::fs::write(dir.join(filename), contents); -} - -fn write_codegen_report_error(report: &ReportContext, contents: &str) { - write_report_error(report, "codegen_error.txt", contents); - if is_verifier_error_text(contents) { - write_report_error(report, "verifier_error.txt", contents); - } -} - -#[derive(Debug, Clone)] -pub(super) struct ReportContext { - pub(super) root_dir: Utf8PathBuf, -} - -#[derive(Debug, Clone)] -struct SuitePlan { - index: usize, - path: Utf8PathBuf, - suite: String, - suite_key: String, - suite_report_out: Option, -} - -#[derive(Debug)] -struct SuiteRunResult { - index: usize, - path: Utf8PathBuf, - suite_key: String, - results: Vec, - aggregate_suite_staging: Option, -} - -#[derive(Debug, Clone)] -struct SingleTestJob { - suite_key: String, - case: TestMetadata, - evm_trace: Option, - report_root: Option, -} - -#[derive(Debug)] -enum JobOutcome { - Text { - suite_key: String, - text: String, - }, - Status { - suite_key: String, - kind: StreamStatusKind, - elapsed: Option, - message: String, - }, - SuitePrepared(PreparedSuite), - SingleFinished(Box), - SuiteFinished(SuiteRunResult), -} - -#[derive(Debug, Clone, Copy)] -enum StreamStatusKind { - Compiling, - Ready, - Pass, - Fail, - Error, -} - -#[derive(Debug)] -struct PreparedSuite { - plan: SuitePlan, - results: Vec, - single_jobs: Vec, - gas_comparison_cases: Option>, - aggregate_suite_staging: Option, - build_elapsed: Duration, -} - -#[derive(Debug)] -struct SingleRunResult { - suite_key: String, - symbol_name: String, - result: TestResult, - measurement: Option, - elapsed: Duration, -} - -#[derive(Debug)] -struct SuiteState { - plan: SuitePlan, - results: Vec, - primary_measurements: FxHashMap, - gas_comparison_cases: Option>, - expected_singles: usize, - completed_singles: usize, - aggregate_suite_staging: Option, -} - -#[derive(Debug)] -struct DiscoverResult { - tests: Vec, - gas_comparison_cases: Option>, -} - -#[derive(Debug)] -struct SuitePreparation { - results: Vec, - single_jobs: Vec, - gas_comparison_cases: Option>, -} - -#[derive(Debug)] -struct WorkerSharedConfig { - show_logs: bool, - backend: String, - yul_optimize: bool, - solc: Option, - opt_level: OptLevel, - debug: TestDebugOptions, - report_failed_only: bool, - aggregate_report: bool, - call_trace: bool, - multi: bool, -} - -#[derive(Clone, Debug)] -struct SuiteWorkerConfig { - shared: Arc, - filter: Option, - allow_single_steal: bool, - prefer_single_when_idle: bool, -} - -#[derive(Clone, Debug)] -struct SingleWorkerConfig { - shared: Arc, -} - -#[derive(Debug)] -struct SuiteWorkerChannels { - suite_rx: Receiver, - single_rx: Receiver, - outcome_tx: Sender, -} - -#[derive(Debug)] -struct SingleWorkerChannels { - single_rx: Receiver, - outcome_tx: Sender, -} - -#[derive(Debug)] -struct OutcomeCollectorState { - suite_runs: Vec, - pending_suites: FxHashMap, - next_suite_idx: usize, - in_flight_suites: usize, - max_in_flight_suites: usize, - suite_index_by_key: FxHashMap, - buffer_grouped_output: bool, - grouped_lines: Vec>, -} - -struct OutcomeContext<'a> { - suite_plans: &'a [SuitePlan], - suite_tx: &'a Sender, - single_tx: &'a Sender, - shared: &'a WorkerSharedConfig, - filter: Option<&'a str>, - multi: bool, - suite_label_width: usize, -} - -impl OutcomeCollectorState { - fn new( - suite_plans: &[SuitePlan], - grouped: bool, - multi: bool, - max_in_flight_suites: usize, - ) -> Self { - Self { - suite_runs: Vec::with_capacity(suite_plans.len()), - pending_suites: FxHashMap::default(), - next_suite_idx: 0, - in_flight_suites: 0, - max_in_flight_suites: max_in_flight_suites.max(1), - suite_index_by_key: suite_plans - .iter() - .map(|plan| (plan.suite_key.clone(), plan.index)) - .collect(), - buffer_grouped_output: grouped && multi, - grouped_lines: vec![Vec::new(); suite_plans.len()], - } - } - - fn queue_next_suite(&mut self, ctx: &OutcomeContext<'_>) -> Result<(), String> { - if self.next_suite_idx >= ctx.suite_plans.len() - || self.in_flight_suites >= self.max_in_flight_suites - { - return Ok(()); - } - ctx.suite_tx - .send(ctx.suite_plans[self.next_suite_idx].clone()) - .map_err(|err| format!("failed to queue suite job: {err}"))?; - self.next_suite_idx += 1; - self.in_flight_suites += 1; - Ok(()) - } - - fn queue_initial_suites( - &mut self, - ctx: &OutcomeContext<'_>, - worker_count: usize, - ) -> Result<(), String> { - for _ in 0..worker_count - .min(self.max_in_flight_suites) - .min(ctx.suite_plans.len()) - { - self.queue_next_suite(ctx)?; - } - Ok(()) - } - - fn handle_outcome( - &mut self, - outcome: JobOutcome, - ctx: &OutcomeContext<'_>, - ) -> Result<(), String> { - match outcome { - JobOutcome::Text { suite_key, text } => { - if self.buffer_grouped_output { - let suite_idx = *self.suite_index_by_key.get(&suite_key).ok_or_else(|| { - format!("received text outcome for unknown suite `{suite_key}`") - })?; - append_streamed_multi_output_lines( - &mut self.grouped_lines[suite_idx], - ctx.suite_label_width, - &suite_key, - &text, - ); - } else { - print_streamed_output(ctx.multi, ctx.suite_label_width, &suite_key, &text); - } - } - JobOutcome::Status { - suite_key, - kind, - elapsed, - message, - } => { - if self.buffer_grouped_output { - let suite_idx = *self.suite_index_by_key.get(&suite_key).ok_or_else(|| { - format!("received status outcome for unknown suite `{suite_key}`") - })?; - self.grouped_lines[suite_idx].push(format_streamed_status_line( - true, - ctx.suite_label_width, - &suite_key, - kind, - elapsed, - &message, - )); - } else { - print_streamed_status( - ctx.multi, - ctx.suite_label_width, - &suite_key, - kind, - elapsed, - &message, - ); - } - } - JobOutcome::SuiteFinished(suite_run) => { - let suite_idx = suite_run.index; - if self.in_flight_suites == 0 { - return Err(format!( - "received suite completion for `{}` with no in-flight suites", - suite_run.suite_key - )); - } - self.in_flight_suites -= 1; - self.suite_runs.push(suite_run); - if self.buffer_grouped_output { - self.flush_grouped_suite_lines(suite_idx)?; - } - self.queue_next_suite(ctx)?; - } - JobOutcome::SuitePrepared(prepared) => { - let suite_key = prepared.plan.suite_key.clone(); - let expected_singles = prepared.single_jobs.len(); - let (kind, message) = suite_preparation_status(expected_singles, &prepared.results); - self.pending_suites.insert( - suite_key.clone(), - SuiteState { - plan: prepared.plan, - results: prepared.results, - primary_measurements: FxHashMap::default(), - gas_comparison_cases: prepared.gas_comparison_cases, - expected_singles, - completed_singles: 0, - aggregate_suite_staging: prepared.aggregate_suite_staging, - }, - ); - - for single_job in prepared.single_jobs { - ctx.single_tx - .send(single_job) - .map_err(|err| format!("failed to queue single test job: {err}"))?; - } - - if ctx.multi || matches!(kind, StreamStatusKind::Error) { - print_streamed_status( - ctx.multi, - ctx.suite_label_width, - &suite_key, - kind, - Some(prepared.build_elapsed), - &message, - ); - } - self.queue_next_suite(ctx)?; - - if expected_singles == 0 { - self.finalize_pending_suite(&suite_key, ctx)?; - } - } - JobOutcome::SingleFinished(single) => { - let single = *single; - let suite_key = single.suite_key.clone(); - let suite_is_complete = { - let state = self.pending_suites.get_mut(&suite_key).ok_or_else(|| { - format!("received single test outcome for unknown suite `{suite_key}`") - })?; - state.completed_singles += 1; - state.results.push(single.result); - if let Some(measurement) = single.measurement { - state - .primary_measurements - .insert(single.symbol_name, measurement); - } - state.completed_singles == state.expected_singles - }; - if suite_is_complete { - self.finalize_pending_suite(&suite_key, ctx)?; - } - } - } - Ok(()) - } - - fn flush_grouped_suite_lines(&mut self, suite_idx: usize) -> Result<(), String> { - let lines = self - .grouped_lines - .get_mut(suite_idx) - .ok_or_else(|| format!("received suite index out of range: {suite_idx}"))?; - for line in lines.drain(..) { - println!("{line}"); - } - Ok(()) - } - - fn finalize_pending_suite( - &mut self, - suite_key: &str, - ctx: &OutcomeContext<'_>, - ) -> Result<(), String> { - if self.in_flight_suites == 0 { - return Err(format!( - "finalized suite `{suite_key}` with no in-flight suites" - )); - } - self.in_flight_suites -= 1; - finalize_pending_suite( - &mut self.pending_suites, - &mut self.suite_runs, - suite_key, - ctx.multi, - ctx.suite_label_width, - ctx.shared, - ctx.filter, - ); - self.queue_next_suite(ctx) - } -} - -#[derive(Debug, Clone, Default)] -pub struct TestDebugOptions { - pub trace_evm: bool, - pub trace_evm_keep: usize, - pub trace_evm_stack_n: usize, - pub sonatina_symtab: bool, - pub sonatina_evm_debug: bool, - pub sonatina_observability: bool, - pub dump_yul_on_failure: bool, - pub dump_yul_for_all: bool, - pub debug_dir: Option, -} - -impl TestDebugOptions { - fn ensure_debug_dir(&self) -> Result<(), String> { - let Some(dir) = &self.debug_dir else { - return Ok(()); - }; - std::fs::create_dir_all(dir) - .map_err(|err| format!("failed to create debug dir `{dir}`: {err}")) - } - - fn sonatina_debug_config(&self) -> Result { - self.ensure_debug_dir()?; - let mut config = SonatinaTestDebugConfig::default(); - - if self.sonatina_symtab { - let sink = if let Some(dir) = &self.debug_dir { - let path = dir.join("sonatina_symtab.txt"); - truncate_file(&path)?; - DebugOutputSink { - path: Some(path.into_std_path_buf()), - write_stderr: false, - } - } else { - DebugOutputSink { - path: None, - write_stderr: true, - } - }; - config.symtab_output = Some(sink); - } - - if self.sonatina_evm_debug { - let sink = if let Some(dir) = &self.debug_dir { - let path = dir.join("sonatina_evm_bytecode.txt"); - truncate_file(&path)?; - DebugOutputSink { - path: Some(path.into_std_path_buf()), - write_stderr: false, - } - } else { - DebugOutputSink { - path: None, - write_stderr: true, - } - }; - config.evm_debug_output = Some(sink); - } - - config.emit_observability = self.sonatina_observability; - - Ok(config) - } - - fn evm_trace_options_for_test( - &self, - test_suite: Option<&str>, - test_name: &str, - ) -> Result, String> { - if !self.trace_evm { - return Ok(None); - } - - let mut options = EvmTraceOptions { - keep_steps: self.trace_evm_keep.max(1), - stack_n: self.trace_evm_stack_n, - out_path: None, - write_stderr: true, - }; - - if let Some(dir) = &self.debug_dir { - let mut file = String::new(); - if let Some(suite) = test_suite { - let suite = sanitize_filename(suite); - if !suite.is_empty() { - file.push_str(&suite); - file.push_str("__"); - } - } - file.push_str(&sanitize_filename(test_name)); - if file.is_empty() { - file = "test".to_string(); - } - let path = dir.join(format!("{file}.evm_trace.txt")); - truncate_file(&path)?; - options.out_path = Some(path.into_std_path_buf()); - options.write_stderr = false; - } - - Ok(Some(options)) - } -} - -fn truncate_file(path: &Utf8PathBuf) -> Result<(), String> { - std::fs::write(path, "").map_err(|err| format!("failed to truncate `{path}`: {err}")) -} - -fn plan_suite_report_path( - dir: &Utf8PathBuf, - base: &str, - reserved: &mut FxHashSet, -) -> Utf8PathBuf { - let mut suffix = 0usize; - loop { - let file = if suffix == 0 { - format!("{base}.tar.gz") - } else { - format!("{base}-{suffix}.tar.gz") - }; - let candidate = dir.join(file); - let key = candidate.as_str().to_string(); - if !candidate.exists() && reserved.insert(key) { - return candidate; - } - suffix += 1; - } -} - -fn build_suite_plans( - input_paths: Vec, - report_dir: Option<&Utf8PathBuf>, -) -> Result, String> { - let mut plans = Vec::with_capacity(input_paths.len()); - let mut seen_suite_names: FxHashMap = FxHashMap::default(); - for (index, path) in input_paths.into_iter().enumerate() { - let suite = suite_name_for_path(&path); - let seen = seen_suite_names.entry(suite.clone()).or_insert(0); - *seen += 1; - let suite_key = if *seen == 1 { - suite.clone() - } else { - format!("{suite}-{}", seen) - }; - plans.push(SuitePlan { - index, - path, - suite, - suite_key, - suite_report_out: None, - }); - } - - if let Some(dir) = report_dir { - let mut reserved = FxHashSet::default(); - for plan in &mut plans { - let base = if plan.suite_key.is_empty() { - "tests".to_string() - } else { - sanitize_filename(&plan.suite_key) - }; - plan.suite_report_out = Some(plan_suite_report_path(dir, &base, &mut reserved)); - } - } - - Ok(plans) -} - -fn effective_jobs(requested: usize, suite_count: usize, grouped: bool) -> usize { - let requested = if requested == 0 { - std::thread::available_parallelism() - .map(|n| n.get()) - .unwrap_or(1) - } else { - requested - }; - if grouped { - requested.clamp(1, suite_count.max(1)) - } else { - requested.max(1) - } -} - -fn max_in_flight_suites( - grouped: bool, - suite_worker_count: usize, - single_worker_count: usize, -) -> usize { - if grouped || single_worker_count == 0 { - suite_worker_count.max(1) - } else { - suite_worker_count.saturating_add(1) - } -} - -fn displayed_suite_label(suite_key: &str) -> String { - if suite_key.chars().count() <= MAX_STREAMED_SUITE_LABEL_CHARS { - return suite_key.to_string(); - } - - let keep = MAX_STREAMED_SUITE_LABEL_CHARS.saturating_sub(STREAMED_SUITE_LABEL_ELLIPSIS.len()); - let mut shortened: String = suite_key.chars().take(keep).collect(); - shortened.push_str(STREAMED_SUITE_LABEL_ELLIPSIS); - shortened -} - -/// Run tests in the given path. -/// -/// # Arguments -/// * `paths` - Paths to .fe files or directories containing ingots (supports globs) -/// * `filter` - Optional filter pattern for test names -/// * `show_logs` - Whether to show event logs from test execution -/// * `backend` - Codegen backend for test artifacts ("yul" or "sonatina") -/// * `report_out` - Optional report output path (`.tar.gz`) -/// -/// Returns `Ok(true)` if any tests failed, `Ok(false)` if all passed, -/// or `Err` on fatal setup errors. -#[allow(clippy::too_many_arguments)] -pub fn run_tests( - paths: &[Utf8PathBuf], - ingot: Option<&str>, - filter: Option<&str>, - jobs: usize, - grouped: bool, - show_logs: bool, - backend: &str, - yul_optimize: bool, - solc: Option<&str>, - opt_level: OptLevel, - debug: &TestDebugOptions, - report_out: Option<&Utf8PathBuf>, - report_dir: Option<&Utf8PathBuf>, - report_failed_only: bool, - call_trace: bool, -) -> Result { - let expanded_paths = expand_test_paths(paths)?; - if ingot.is_some() && expanded_paths.len() != 1 { - return Err(INGOT_REQUIRES_WORKSPACE_ROOT.to_string()); - } - let input_paths = expand_workspace_test_paths(expanded_paths, ingot)?; - let suite_plans = build_suite_plans(input_paths, report_dir)?; - if suite_plans.is_empty() { - return Ok(false); - } - let worker_count = effective_jobs(jobs, suite_plans.len(), grouped); - let multi = suite_plans.len() > 1; - let suite_label_width = suite_plans - .iter() - .map(|plan| displayed_suite_label(&plan.suite_key).chars().count()) - .max() - .unwrap_or(0); - if multi { - println!( - "running `fe test` for {} inputs (jobs={worker_count})\n", - suite_plans.len() - ); - } - - if let Some(dir) = report_dir { - create_dir_all_utf8(dir)?; - } - - let report_root = report_out - .map(|out| -> Result<_, String> { - let staging = create_run_report_staging()?; - let out = normalize_report_out_path(out)?; - Ok((out, staging)) - }) - .transpose()?; - - if let Some((_, staging)) = report_root.as_ref() { - let root = &staging.root_dir; - create_dir_all_utf8(&root.join("passed"))?; - create_dir_all_utf8(&root.join("failed"))?; - write_report_meta(root, "fe test report", None); - } - - let filter = filter.map(str::to_owned); - let shared = Arc::new(WorkerSharedConfig { - show_logs, - backend: backend.to_string(), - yul_optimize, - solc: solc.map(str::to_owned), - opt_level, - debug: debug.clone(), - report_failed_only, - aggregate_report: report_root.is_some(), - call_trace, - multi, - }); - let mut suite_runs = std::thread::scope(|scope| -> Result, String> { - let (suite_tx, suite_rx) = crossbeam_channel::unbounded::(); - let (single_tx, single_rx) = crossbeam_channel::unbounded::(); - let (outcome_tx, outcome_rx) = crossbeam_channel::unbounded::(); - let suite_worker_count = if grouped { worker_count } else { 1 }; - let single_worker_count = if grouped { - 0 - } else { - worker_count.saturating_sub(suite_worker_count) - }; - let suite_in_flight_limit = - max_in_flight_suites(grouped, suite_worker_count, single_worker_count); - let suite_worker_cfg = SuiteWorkerConfig { - shared: Arc::clone(&shared), - filter: filter.clone(), - allow_single_steal: !grouped, - prefer_single_when_idle: single_worker_count == 0, - }; - - for _ in 0..suite_worker_count { - let cfg = suite_worker_cfg.clone(); - let channels = SuiteWorkerChannels { - suite_rx: suite_rx.clone(), - single_rx: single_rx.clone(), - outcome_tx: outcome_tx.clone(), - }; - if grouped { - scope.spawn(move || suite_worker_loop_grouped(channels, cfg)); - } else { - scope.spawn(move || suite_worker_loop_parallel(channels, cfg)); - } - } - - let single_worker_cfg = SingleWorkerConfig { - shared: Arc::clone(&shared), - }; - for _ in 0..single_worker_count { - let cfg = single_worker_cfg.clone(); - let channels = SingleWorkerChannels { - single_rx: single_rx.clone(), - outcome_tx: outcome_tx.clone(), - }; - scope.spawn(move || single_worker_loop(channels, cfg)); - } - drop(outcome_tx); - - let ctx = OutcomeContext { - suite_plans: &suite_plans, - suite_tx: &suite_tx, - single_tx: &single_tx, - shared: shared.as_ref(), - filter: filter.as_deref(), - multi, - suite_label_width, - }; - let mut collector = - OutcomeCollectorState::new(&suite_plans, grouped, multi, suite_in_flight_limit); - collector.queue_initial_suites(&ctx, suite_worker_count)?; - - while collector.suite_runs.len() < suite_plans.len() { - let outcome = outcome_rx - .recv() - .map_err(|err| format!("suite worker failed: {err}"))?; - collector.handle_outcome(outcome, &ctx)?; - } - - drop(single_tx); - drop(suite_tx); - Ok(collector.suite_runs) - })?; - - suite_runs.sort_unstable_by_key(|run| run.index); - - let mut test_results = Vec::new(); - for suite_run in suite_runs { - let SuiteRunResult { - path, - suite_key, - results, - aggregate_suite_staging, - .. - } = suite_run; - - let suite_failed = results.iter().any(|r| !r.passed); - if results.is_empty() { - eprintln!("Warning: No tests found in {path}"); - } else { - test_results.extend(results); - } - - if let Some((_, root_staging)) = &report_root - && let Some(staging) = aggregate_suite_staging - { - let status_dir = if suite_failed { "failed" } else { "passed" }; - let to = root_staging.root_dir.join(status_dir).join(&suite_key); - let _ = std::fs::remove_dir_all(&to); - match std::fs::rename(&staging.root_dir, &to) { - Ok(()) => { - let _ = std::fs::remove_dir_all(&staging.temp_dir); - } - Err(err) => { - eprintln!("Error: failed to stage suite report `{suite_key}`: {err}"); - eprintln!("Report staging directory left at `{}`", staging.temp_dir); - } - } - } - } - - if let Some((out, staging)) = report_root { - gas::write_run_gas_comparison_summary(&staging.root_dir, backend, yul_optimize, opt_level); - write_report_manifest( - &staging.root_dir, - backend, - yul_optimize, - opt_level, - filter.as_deref(), - &test_results, - ); - if let Err(err) = tar_gz_dir(&staging.root_dir, &out) { - eprintln!("Error: failed to write report `{out}`: {err}"); - eprintln!("Report staging directory left at `{}`", staging.temp_dir); - } else { - // Best-effort cleanup. - let _ = std::fs::remove_dir_all(&staging.temp_dir); - println!("wrote report: {out}"); - } - } - - print_summary(&test_results); - Ok(test_results.iter().any(|r| !r.passed)) -} - -fn print_streamed_output(multi: bool, suite_label_width: usize, suite_key: &str, text: &str) { - if text.is_empty() { - return; - } - if !multi { - print!("{text}"); - return; - } - - let mut lines = Vec::new(); - append_streamed_multi_output_lines(&mut lines, suite_label_width, suite_key, text); - for line in lines { - println!("{line}"); - } -} - -fn print_streamed_status( - multi: bool, - suite_label_width: usize, - suite_key: &str, - kind: StreamStatusKind, - elapsed: Option, - message: &str, -) { - println!( - "{}", - format_streamed_status_line(multi, suite_label_width, suite_key, kind, elapsed, message) - ); -} - -fn append_streamed_multi_output_lines( - lines: &mut Vec, - suite_label_width: usize, - suite_key: &str, - text: &str, -) { - if text.is_empty() { - return; - } - - let suite = format!("{:, - message: &str, -) -> String { - let status = format_streamed_status(kind, elapsed); - if !multi { - let status = colorize_streamed_status(kind, &status); - return if message.is_empty() { - status - } else { - format!("{status} {message}") - }; - } - - let status = - colorize_streamed_status(kind, &format!("{status:) -> String { - let label = match kind { - StreamStatusKind::Compiling => return "COMPILING".to_string(), - StreamStatusKind::Ready => "READY", - StreamStatusKind::Pass => "PASS ", - StreamStatusKind::Fail => "FAIL ", - StreamStatusKind::Error => "ERROR", - }; - format!( - "{label} [{}s]", - format_elapsed_seconds_cell(elapsed.unwrap_or_default()) - ) -} - -fn suite_preparation_status( - expected_singles: usize, - results: &[TestResult], -) -> (StreamStatusKind, String) { - if results.iter().any(|result| !result.passed) { - let message = results - .iter() - .find(|result| !result.passed) - .and_then(|result| result.error_message.as_deref()) - .and_then(|message| message.lines().next()) - .map(str::trim) - .filter(|message| !message.is_empty()) - .map(str::to_owned) - .unwrap_or_else(|| "suite preparation failed".to_string()); - return (StreamStatusKind::Error, message); - } - - let label = if expected_singles == 1 { - "test" - } else { - "tests" - }; - ( - StreamStatusKind::Ready, - format!("running {expected_singles} {label}"), - ) -} - -fn colorize_streamed_status(kind: StreamStatusKind, status: &str) -> String { - let colorize = |s: &str| match kind { - StreamStatusKind::Pass => format!("{}", s.green()), - StreamStatusKind::Fail | StreamStatusKind::Error => format!("{}", s.red()), - StreamStatusKind::Ready | StreamStatusKind::Compiling => format!("{}", s.blue()), - }; - if let Some(open) = status.find('[') - && let Some(close_rel) = status[open..].find(']') - { - let close = open + close_rel; - let left = &status[..open]; - let time = &status[open..=close]; - let right = &status[close + 1..]; - let left = colorize(left); - return format!("{left}{}{}", time.white(), right); - } - colorize(status) -} - -fn emit_single_outcome( - job: SingleTestJob, - outcome_tx: &Sender, - shared: &WorkerSharedConfig, -) { - let (output, single) = run_single_test_job(job, shared); - let _ = outcome_tx.send(JobOutcome::Status { - suite_key: single.suite_key.clone(), - kind: if single.result.passed { - StreamStatusKind::Pass - } else { - StreamStatusKind::Fail - }, - elapsed: Some(single.elapsed), - message: single.result.name.clone(), - }); - if !output.is_empty() { - let _ = outcome_tx.send(JobOutcome::Text { - suite_key: single.suite_key.clone(), - text: output, - }); - } - let _ = outcome_tx.send(JobOutcome::SingleFinished(Box::new(single))); -} - -fn emit_parallel_suite_outcome( - plan: SuitePlan, - outcome_tx: &Sender, - cfg: &SuiteWorkerConfig, -) { - if cfg.shared.multi { - let _ = outcome_tx.send(JobOutcome::Status { - suite_key: plan.suite_key.clone(), - kind: StreamStatusKind::Compiling, - elapsed: None, - message: plan.path.to_string(), - }); - } - let (prepared, output) = prepare_suite_job(&plan, cfg.filter.as_deref(), cfg.shared.as_ref()); - if !output.is_empty() { - let _ = outcome_tx.send(JobOutcome::Text { - suite_key: plan.suite_key.clone(), - text: output, - }); - } - let _ = outcome_tx.send(JobOutcome::SuitePrepared(prepared)); -} - -fn emit_grouped_suite_outcome( - plan: SuitePlan, - outcome_tx: &Sender, - cfg: &SuiteWorkerConfig, -) { - if cfg.shared.multi { - let _ = outcome_tx.send(JobOutcome::Status { - suite_key: plan.suite_key.clone(), - kind: StreamStatusKind::Compiling, - elapsed: None, - message: plan.path.to_string(), - }); - } - let (prepared, output) = prepare_suite_job(&plan, cfg.filter.as_deref(), cfg.shared.as_ref()); - if !output.is_empty() { - let _ = outcome_tx.send(JobOutcome::Text { - suite_key: plan.suite_key.clone(), - text: output, - }); - } - if cfg.shared.multi { - let (kind, message) = - suite_preparation_status(prepared.single_jobs.len(), &prepared.results); - let _ = outcome_tx.send(JobOutcome::Status { - suite_key: plan.suite_key.clone(), - kind, - elapsed: Some(prepared.build_elapsed), - message, - }); - } - - let mut state = SuiteState { - plan: prepared.plan, - results: prepared.results, - primary_measurements: FxHashMap::default(), - gas_comparison_cases: prepared.gas_comparison_cases, - expected_singles: prepared.single_jobs.len(), - completed_singles: 0, - aggregate_suite_staging: prepared.aggregate_suite_staging, - }; - for single_job in prepared.single_jobs { - let (output, single) = run_single_test_job(single_job, cfg.shared.as_ref()); - let _ = outcome_tx.send(JobOutcome::Status { - suite_key: single.suite_key.clone(), - kind: if single.result.passed { - StreamStatusKind::Pass - } else { - StreamStatusKind::Fail - }, - elapsed: Some(single.elapsed), - message: single.result.name.clone(), - }); - if !output.is_empty() { - let _ = outcome_tx.send(JobOutcome::Text { - suite_key: single.suite_key.clone(), - text: output, - }); - } - state.completed_singles += 1; - state.results.push(single.result); - if let Some(measurement) = single.measurement { - state - .primary_measurements - .insert(single.symbol_name, measurement); - } - } - let (suite_run, output) = - finalize_suite_state(state, cfg.shared.as_ref(), cfg.filter.as_deref()); - if !output.is_empty() { - let _ = outcome_tx.send(JobOutcome::Text { - suite_key: plan.suite_key.clone(), - text: output, - }); - } - let _ = outcome_tx.send(JobOutcome::SuiteFinished(suite_run)); -} - -fn single_worker_loop(channels: SingleWorkerChannels, cfg: SingleWorkerConfig) { - while let Ok(job) = channels.single_rx.recv() { - emit_single_outcome(job, &channels.outcome_tx, cfg.shared.as_ref()); - } -} - -fn drain_pending_single_jobs( - single_rx: &Receiver, - outcome_tx: &Sender, - shared: &WorkerSharedConfig, -) { - while let Ok(job) = single_rx.recv() { - emit_single_outcome(job, outcome_tx, shared); - } -} - -fn suite_worker_loop_grouped(channels: SuiteWorkerChannels, cfg: SuiteWorkerConfig) { - while let Ok(plan) = channels.suite_rx.recv() { - emit_grouped_suite_outcome(plan, &channels.outcome_tx, &cfg); - } -} - -fn suite_worker_loop_parallel(channels: SuiteWorkerChannels, cfg: SuiteWorkerConfig) { - let SuiteWorkerChannels { - suite_rx, - single_rx, - outcome_tx, - } = channels; - loop { - if cfg.allow_single_steal - && cfg.prefer_single_when_idle - && let Ok(job) = single_rx.try_recv() - { - emit_single_outcome(job, &outcome_tx, cfg.shared.as_ref()); - continue; - } - - match suite_rx.try_recv() { - Ok(plan) => { - emit_parallel_suite_outcome(plan, &outcome_tx, &cfg); - continue; - } - Err(TryRecvError::Disconnected) => { - if cfg.allow_single_steal { - drain_pending_single_jobs(&single_rx, &outcome_tx, cfg.shared.as_ref()); - } - break; - } - Err(TryRecvError::Empty) => {} - } - - if cfg.allow_single_steal - && !cfg.prefer_single_when_idle - && let Ok(job) = single_rx.try_recv() - { - emit_single_outcome(job, &outcome_tx, cfg.shared.as_ref()); - continue; - } - - if !cfg.allow_single_steal { - match suite_rx.recv() { - Ok(plan) => emit_parallel_suite_outcome(plan, &outcome_tx, &cfg), - Err(_) => break, - } - continue; - } - - if cfg.prefer_single_when_idle { - crossbeam_channel::select_biased! { - recv(single_rx) -> single => { - match single { - Ok(job) => emit_single_outcome(job, &outcome_tx, cfg.shared.as_ref()), - Err(_) => { - match suite_rx.recv() { - Ok(plan) => emit_parallel_suite_outcome(plan, &outcome_tx, &cfg), - Err(_) => break, - } - } - } - } - recv(suite_rx) -> suite => { - match suite { - Ok(plan) => emit_parallel_suite_outcome(plan, &outcome_tx, &cfg), - Err(_) => { - drain_pending_single_jobs(&single_rx, &outcome_tx, cfg.shared.as_ref()); - break; - } - } - } - } - } else { - crossbeam_channel::select_biased! { - recv(suite_rx) -> suite => { - match suite { - Ok(plan) => emit_parallel_suite_outcome(plan, &outcome_tx, &cfg), - Err(_) => { - drain_pending_single_jobs(&single_rx, &outcome_tx, cfg.shared.as_ref()); - break; - } - } - } - recv(single_rx) -> single => { - if let Ok(job) = single { - emit_single_outcome(job, &outcome_tx, cfg.shared.as_ref()); - } - } - } - } - } -} - -fn prepare_suite_job( - plan: &SuitePlan, - filter: Option<&str>, - shared: &WorkerSharedConfig, -) -> (PreparedSuite, String) { - let mut output = String::new(); - - let suite_report_staging = if plan.suite_report_out.is_some() || shared.aggregate_report { - match create_suite_report_staging(&plan.suite_key) { - Ok(staging) => Some(staging), - Err(err) => { - return ( - PreparedSuite { - plan: plan.clone(), - results: suite_error_result(&plan.suite, "setup", err), - single_jobs: Vec::new(), - gas_comparison_cases: None, - aggregate_suite_staging: None, - build_elapsed: Duration::default(), - }, - output, - ); - } - } - } else { - None - }; - - let report_ctx = if let Some(staging) = suite_report_staging.as_ref() { - let suite_dir = staging.root_dir.clone(); - write_report_meta(&suite_dir, "fe test report (suite)", Some(&plan.suite)); - let inputs_dir = suite_dir.join("inputs"); - if let Err(err) = create_dir_all_utf8(&inputs_dir).and_then(|_| { - copy_input_into_report(&plan.path, &inputs_dir)?; - Ok(()) - }) { - return ( - PreparedSuite { - plan: plan.clone(), - results: suite_error_result(&plan.suite, "setup", err), - single_jobs: Vec::new(), - gas_comparison_cases: None, - aggregate_suite_staging: None, - build_elapsed: Duration::default(), - }, - output, - ); - } - Some(ReportContext { - root_dir: suite_dir, - }) - } else { - None - }; - - let mut suite_debug = shared.debug.clone(); - if report_ctx.is_some() { - suite_debug.trace_evm = true; - suite_debug.sonatina_symtab = true; - suite_debug.sonatina_evm_debug = true; - suite_debug.sonatina_observability = true; - suite_debug.debug_dir = report_ctx.as_ref().map(|ctx| ctx.root_dir.join("debug")); - } - let sonatina_debug = match suite_debug.sonatina_debug_config() { - Ok(config) => config, - Err(err) => { - return ( - PreparedSuite { - plan: plan.clone(), - results: suite_error_result(&plan.suite, "setup", err), - single_jobs: Vec::new(), - gas_comparison_cases: None, - aggregate_suite_staging: None, - build_elapsed: Duration::default(), - }, - output, - ); - } - }; - - let build_started = Instant::now(); - let mut db = DriverDataBase::default(); - let prep = if plan.path.is_file() && plan.path.extension() == Some("fe") { - prepare_tests_single_file( - &mut db, - &plan.path, - &plan.suite, - &plan.suite_key, - filter, - shared.backend.as_str(), - shared.opt_level, - &suite_debug, - &sonatina_debug, - report_ctx.as_ref(), - &mut output, - ) - } else if plan.path.is_dir() { - prepare_tests_ingot( - &mut db, - &plan.path, - &plan.suite, - &plan.suite_key, - filter, - shared.backend.as_str(), - shared.opt_level, - &suite_debug, - &sonatina_debug, - report_ctx.as_ref(), - &mut output, - ) - } else { - SuitePreparation { - results: suite_error_result( - &plan.suite, - "setup", - "Path must be either a .fe file or a directory containing fe.toml".to_string(), - ), - single_jobs: Vec::new(), - gas_comparison_cases: None, - } - }; - - ( - PreparedSuite { - plan: plan.clone(), - results: prep.results, - single_jobs: prep.single_jobs, - gas_comparison_cases: prep.gas_comparison_cases, - aggregate_suite_staging: suite_report_staging, - build_elapsed: build_started.elapsed(), - }, - output, - ) -} - -fn run_single_test_job( - job: SingleTestJob, - shared: &WorkerSharedConfig, -) -> (String, SingleRunResult) { - let report_ctx = job.report_root.as_ref().map(|root| ReportContext { - root_dir: root.clone(), - }); - let case = job.case; - let outcome = compile_and_run_test( - &case, - shared.show_logs, - &shared.backend, - shared.yul_optimize, - shared.solc.as_deref(), - job.evm_trace.as_ref(), - report_ctx.as_ref(), - shared.call_trace, - report_ctx.is_some(), - ); - let measurement = GasMeasurement::from_test_outcome(&outcome); - let elapsed = outcome.elapsed; - let mut output = String::new(); - write_case_output( - &mut output, - &case, - &outcome, - shared.show_logs, - &shared.backend, - &shared.debug, - ); - let result = SingleRunResult { - suite_key: job.suite_key, - symbol_name: case.symbol_name, - result: outcome.result, - measurement: Some(measurement), - elapsed, - }; - (output, result) -} - -fn finalize_pending_suite( - pending_suites: &mut FxHashMap, - suite_runs: &mut Vec, - suite_key: &str, - multi: bool, - suite_label_width: usize, - shared: &WorkerSharedConfig, - filter: Option<&str>, -) { - let state = pending_suites - .remove(suite_key) - .expect("suite state should be present"); - let (suite_run, output) = finalize_suite_state(state, shared, filter); - if !output.is_empty() { - print_streamed_output(multi, suite_label_width, suite_key, &output); - } - suite_runs.push(suite_run); -} - -fn finalize_suite_state( - state: SuiteState, - shared: &WorkerSharedConfig, - filter: Option<&str>, -) -> (SuiteRunResult, String) { - let mut output = String::new(); - let mut aggregate_suite_staging = state.aggregate_suite_staging; - if let Some(staging) = aggregate_suite_staging.as_ref() - && let Some(cases) = state.gas_comparison_cases.as_ref() - { - let report = ReportContext { - root_dir: staging.root_dir.clone(), - }; - gas::write_gas_comparison_report( - &report, - &shared.backend, - shared.yul_optimize, - shared.opt_level, - cases, - &state.primary_measurements, - ); - } - - if let Some(out) = &state.plan.suite_report_out - && let Some(staging) = aggregate_suite_staging.take() - { - let should_write = !shared.report_failed_only || state.results.iter().any(|r| !r.passed); - if should_write { - write_report_manifest( - &staging.root_dir, - &shared.backend, - shared.yul_optimize, - shared.opt_level, - filter, - &state.results, - ); - match tar_gz_dir(&staging.root_dir, out) { - Ok(()) => { - let _ = std::fs::remove_dir_all(&staging.temp_dir); - let _ = writeln!(&mut output, "wrote report: {out}"); - } - Err(err) => { - let _ = writeln!(&mut output, "Error: failed to write report `{out}`: {err}"); - let _ = writeln!( - &mut output, - "Report staging directory left at `{}`", - staging.temp_dir - ); - } - } - } else { - let _ = std::fs::remove_dir_all(&staging.temp_dir); - } - } - - ( - SuiteRunResult { - index: state.plan.index, - path: state.plan.path, - suite_key: state.plan.suite_key, - results: state.results, - aggregate_suite_staging, - }, - output, - ) -} - -#[allow(clippy::too_many_arguments)] -fn prepare_tests_single_file( - db: &mut DriverDataBase, - file_path: &Utf8PathBuf, - suite: &str, - suite_key: &str, - filter: Option<&str>, - backend: &str, - opt_level: OptLevel, - debug: &TestDebugOptions, - sonatina_debug: &SonatinaTestDebugConfig, - report: Option<&ReportContext>, - output: &mut String, -) -> SuitePreparation { - let canonical = match file_path.canonicalize_utf8() { - Ok(p) => p, - Err(e) => { - return SuitePreparation { - results: suite_error_result( - suite, - "setup", - format!("Cannot canonicalize {file_path}: {e}"), - ), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - }; - let file_url = match Url::from_file_path(&canonical) { - Ok(url) => url, - Err(_) => { - return SuitePreparation { - results: suite_error_result( - suite, - "setup", - format!("Invalid file path: {file_path}"), - ), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - }; - - let content = match std::fs::read_to_string(file_path) { - Ok(content) => content, - Err(err) => { - return SuitePreparation { - results: suite_error_result( - suite, - "setup", - format!("Error reading file {file_path}: {err}"), - ), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - }; - - db.workspace().touch(db, file_url.clone(), Some(content)); - let Some(file) = db.workspace().get(db, &file_url) else { - return SuitePreparation { - results: suite_error_result( - suite, - "setup", - format!("Could not process file {file_path}"), - ), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - }; - let top_mod = db.top_mod(file); - - let diags = db.run_on_top_mod(top_mod); - if !diags.is_empty() { - let formatted = diags.format_diags(db); - let _ = writeln!(output, "Compilation errors in {file_url}"); - let _ = writeln!(output); - let _ = writeln!(output, "{formatted}"); - if let Some(report) = report { - write_report_error(report, "compilation_errors.txt", &formatted); - } - return SuitePreparation { - results: suite_error_result( - suite, - "compile", - format!("Compilation errors in {file_url}"), - ), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - - if !has_test_functions(db, top_mod) { - return SuitePreparation { - results: Vec::new(), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - - maybe_write_suite_ir(db, top_mod, backend, report); - prepare_discovered_tests( - db, - top_mod, - suite, - suite_key, - filter, - backend, - opt_level, - debug, - sonatina_debug, - report, - output, - ) -} - -#[allow(clippy::too_many_arguments)] -fn prepare_tests_ingot( - db: &mut DriverDataBase, - dir_path: &Utf8PathBuf, - suite: &str, - suite_key: &str, - filter: Option<&str>, - backend: &str, - opt_level: OptLevel, - debug: &TestDebugOptions, - sonatina_debug: &SonatinaTestDebugConfig, - report: Option<&ReportContext>, - output: &mut String, -) -> SuitePreparation { - let canonical_path = match dir_path.canonicalize_utf8() { - Ok(path) => path, - Err(_) => { - return SuitePreparation { - results: suite_error_result( - suite, - "setup", - format!("Invalid or non-existent directory path: {dir_path}"), - ), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - }; - - let ingot_url = match Url::from_directory_path(canonical_path.as_str()) { - Ok(url) => url, - Err(_) => { - return SuitePreparation { - results: suite_error_result( - suite, - "setup", - format!("Invalid directory path: {dir_path}"), - ), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - }; - - let had_init_diagnostics = driver::init_ingot(db, &ingot_url); - if had_init_diagnostics { - let msg = format!("Compilation errors while initializing ingot `{dir_path}`"); - let _ = writeln!(output, "{msg}"); - if let Some(report) = report { - write_report_error(report, "compilation_errors.txt", &msg); - } - return SuitePreparation { - results: suite_error_result(suite, "compile", msg), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - - let Some(ingot) = db.workspace().containing_ingot(db, ingot_url.clone()) else { - return SuitePreparation { - results: suite_error_result( - suite, - "setup", - "Could not resolve ingot from directory".to_string(), - ), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - }; - - let diags = db.run_on_ingot(ingot); - if !diags.is_empty() { - let formatted = diags.format_diags(db); - let _ = writeln!(output, "{formatted}"); - if let Some(report) = report { - write_report_error(report, "compilation_errors.txt", &formatted); - } - return SuitePreparation { - results: suite_error_result(suite, "compile", "Compilation errors".to_string()), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - - let root_mod = ingot.root_mod(db); - if !ingot_has_test_functions(db, ingot) { - return SuitePreparation { - results: Vec::new(), - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - - maybe_write_suite_ir(db, root_mod, backend, report); - prepare_discovered_tests( - db, - root_mod, - suite, - suite_key, - filter, - backend, - opt_level, - debug, - sonatina_debug, - report, - output, - ) -} - -#[allow(clippy::too_many_arguments)] -fn prepare_discovered_tests( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - suite: &str, - suite_key: &str, - filter: Option<&str>, - backend: &str, - opt_level: OptLevel, - debug: &TestDebugOptions, - sonatina_debug: &SonatinaTestDebugConfig, - report: Option<&ReportContext>, - output: &mut String, -) -> SuitePreparation { - let discovered = match discover_tests( - db, - top_mod, - suite, - filter, - backend, - opt_level, - sonatina_debug, - report, - output, - ) { - Ok(discovered) => discovered, - Err(results) => { - return SuitePreparation { - results, - single_jobs: Vec::new(), - gas_comparison_cases: None, - }; - } - }; - - let mut results = Vec::new(); - let report_root = report.map(|ctx| ctx.root_dir.clone()); - let mut single_jobs = Vec::new(); - for case in discovered.tests { - if !test_case_matches_filter(&case, filter) { - continue; - } - - let evm_trace = match debug.evm_trace_options_for_test(Some(suite), &case.display_name) { - Ok(value) => value, - Err(err) => { - write_case_status_line(output, false, Duration::ZERO, &case.display_name); - let _ = writeln!(output, " {err}"); - results.push(TestResult { - name: case.display_name.clone(), - passed: false, - error_message: Some(err), - gas_used: None, - deploy_gas_used: None, - total_gas_used: None, - }); - continue; - } - }; - - single_jobs.push(SingleTestJob { - suite_key: suite_key.to_string(), - case, - evm_trace, - report_root: report_root.clone(), - }); - } - - SuitePreparation { - results, - single_jobs, - gas_comparison_cases: discovered.gas_comparison_cases, - } -} - -/// Emit a test module with panic recovery and report integration. -/// -/// Wraps `emit_fn` in `catch_unwind`, writes error/panic info into the report -/// staging directory when present, and returns the output or an early-return -/// error result vector. -pub(super) fn emit_with_catch_unwind( - emit_fn: impl FnOnce() -> Result, - backend_label: &str, - suite: &str, - report: Option<&ReportContext>, - output: &mut String, -) -> Result> { - let _hook = report.map(|r| install_report_panic_hook(r, "codegen_panic_full.txt")); - match std::panic::catch_unwind(std::panic::AssertUnwindSafe(emit_fn)) { - Ok(Ok(output)) => Ok(output), - Ok(Err(err)) => { - let msg = format!("Failed to emit test {backend_label}: {err}"); - let _ = writeln!(output, "{msg}"); - if let Some(report) = report { - write_codegen_report_error(report, &msg); - } - Err(suite_error_result(suite, "codegen", msg)) - } - Err(payload) => { - let msg = format!( - "{backend_label} backend panicked while emitting test module: {}", - panic_payload_to_string(payload.as_ref()) - ); - let _ = writeln!(output, "{msg}"); - if let Some(report) = report { - write_report_error(report, "codegen_panic.txt", &msg); - } - Err(suite_error_result(suite, "codegen", msg)) - } - } -} - -/// Discovers `#[test]` functions, compiles them, and executes each one. -/// -/// * `db` - Driver database used for compilation. -/// * `top_mod` - Root module to scan for tests. -/// * `filter` - Optional substring filter for test names. -/// * `show_logs` - Whether to show event logs from test execution. -/// -/// Returns the collected test results. -#[allow(clippy::too_many_arguments)] -fn discover_tests( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - suite: &str, - filter: Option<&str>, - backend: &str, - opt_level: OptLevel, - sonatina_debug: &SonatinaTestDebugConfig, - report: Option<&ReportContext>, - output: &mut String, -) -> Result> { - let backend = backend.to_lowercase(); - let emit_result = match backend.as_str() { - "yul" => emit_with_catch_unwind( - || emit_test_module_yul(db, top_mod), - "Yul", - suite, - report, - output, - ), - "sonatina" => emit_with_catch_unwind( - || emit_test_module_sonatina(db, top_mod, opt_level, sonatina_debug), - "Sonatina", - suite, - report, - output, - ), - other => { - return Err(suite_error_result( - suite, - "setup", - format!("unknown backend `{other}` (expected 'yul' or 'sonatina')"), - )); - } - }; - let module_output = emit_result?; - - if module_output.tests.is_empty() { - return Ok(DiscoverResult { - tests: Vec::new(), - gas_comparison_cases: None, - }); - } - - let gas_comparison_cases = report.map(|ctx| { - gas::collect_gas_comparison_cases( - db, - top_mod, - suite, - filter, - ctx, - backend.as_str(), - opt_level, - &module_output.tests, - ) - }); - - Ok(DiscoverResult { - tests: module_output.tests, - gas_comparison_cases, - }) -} - -fn write_case_output( - output: &mut String, - case: &TestMetadata, - outcome: &TestOutcome, - show_logs: bool, - backend: &str, - debug: &TestDebugOptions, -) { - if !outcome.result.passed - && let Some(ref msg) = outcome.result.error_message - { - let _ = writeln!(output, " {msg}"); - } - - let should_dump_yul = backend == "yul" - && (debug.dump_yul_for_all || (debug.dump_yul_on_failure && !outcome.result.passed)); - if should_dump_yul { - write_test_yul(output, case); - } - - if let Some(trace) = &outcome.trace { - let _ = writeln!(output, "--- call trace ---"); - let _ = write!(output, "{trace}"); - let _ = writeln!(output, "--- end trace ---"); - } - - if show_logs { - if !outcome.logs.is_empty() { - for log in &outcome.logs { - let _ = writeln!(output, " log {log}"); - } - } else if outcome.result.passed { - let _ = writeln!(output, " log (none)"); - } else { - let _ = writeln!(output, " log (unavailable for failed tests)"); - } - } -} - -fn format_elapsed_seconds_cell(elapsed: Duration) -> String { - const WIDTH: usize = 6; - let seconds = elapsed.as_secs_f64(); - let whole_digits = if seconds >= 1.0 { - seconds.log10().floor() as usize + 1 - } else { - 1 - }; - let fractional_digits = WIDTH.saturating_sub(whole_digits + 1).min(4); - let rendered = if fractional_digits == 0 { - format!("{seconds:.0}") - } else { - format!("{seconds:.fractional_digits$}") - }; - format!("{rendered:>WIDTH$}") -} - -fn write_case_status_line(output: &mut String, passed: bool, elapsed: Duration, name: &str) { - let kind = if passed { - StreamStatusKind::Pass - } else { - StreamStatusKind::Fail - }; - let status = colorize_streamed_status(kind, &format_streamed_status(kind, Some(elapsed))); - let _ = writeln!(output, "{status} {name}"); -} - -fn write_test_yul(output: &mut String, case: &TestMetadata) { - let _ = writeln!(output); - let _ = writeln!( - output, - "---- yul output for test {} ({}) ----", - case.display_name, case.object_name - ); - let _ = writeln!(output, "{}", case.yul); - let _ = writeln!(output, "---- end yul output ----"); -} - -pub(super) fn test_case_matches_filter(case: &TestMetadata, filter: Option<&str>) -> bool { - let Some(pattern) = filter else { - return true; - }; - case.hir_name.contains(pattern) - || case.symbol_name.contains(pattern) - || case.display_name.contains(pattern) -} - -fn maybe_write_suite_ir( - db: &DriverDataBase, - top_mod: TopLevelMod<'_>, - backend: &str, - report: Option<&ReportContext>, -) { - let Some(report) = report else { - return; - }; - - let artifacts_dir = report.root_dir.join("artifacts"); - let _ = create_dir_all_utf8(&artifacts_dir); - - match lower_module(db, top_mod) { - Ok(mir) => { - let path = artifacts_dir.join("mir.txt"); - let _ = std::fs::write(&path, mir_fmt::format_module(db, &mir)); - } - Err(err) => { - let path = artifacts_dir.join("mir_error.txt"); - let _ = std::fs::write(&path, format!("{err}")); - } - } - - if backend.eq_ignore_ascii_case("sonatina") { - match codegen::emit_module_sonatina_ir(db, top_mod) { - Ok(ir) => { - let path = artifacts_dir.join("sonatina_ir.txt"); - let _ = std::fs::write(&path, ir); - } - Err(err) => { - let path = artifacts_dir.join("sonatina_ir_error.txt"); - let _ = std::fs::write(&path, format!("{err}")); - } - } - - match codegen::validate_module_sonatina_ir(db, top_mod) { - Ok(report) => { - let path = artifacts_dir.join("sonatina_validate.txt"); - let _ = std::fs::write(&path, report); - } - Err(err) => { - let path = artifacts_dir.join("sonatina_validate_error.txt"); - let _ = std::fs::write(&path, format!("{err}")); - } - } - } else if backend.eq_ignore_ascii_case("yul") { - match codegen::emit_module_yul(db, top_mod) { - Ok(yul) => { - let path = artifacts_dir.join("yul_module.yul"); - let _ = std::fs::write(&path, yul); - } - Err(err) => { - let path = artifacts_dir.join("yul_module_error.txt"); - let _ = std::fs::write(&path, format!("{err}")); - } - } - } -} - -fn suite_name_for_path(path: &Utf8PathBuf) -> String { - let raw = if path.is_file() { - path.file_stem() - .map(|s| s.to_string()) - .unwrap_or_else(|| "tests".to_string()) - } else { - path.file_name() - .map(|s| s.to_string()) - .unwrap_or_else(|| "tests".to_string()) - }; - let sanitized = sanitize_filename(&raw); - if sanitized.is_empty() { - "tests".to_string() - } else { - sanitized - } -} - -fn expand_test_paths(inputs: &[Utf8PathBuf]) -> Result, String> { - let mut expanded = Vec::new(); - let mut seen: FxHashSet = FxHashSet::default(); - - for input in inputs { - if input.exists() { - let key = input.as_str().to_string(); - if seen.insert(key) { - expanded.push(input.clone()); - } - continue; - } - - let pattern = input.as_str(); - if !looks_like_glob(pattern) { - return Err(format!("path does not exist: {input}")); - } - - let mut matches = Vec::new(); - let entries = glob::glob(pattern) - .map_err(|err| format!("invalid glob pattern `{pattern}`: {err}"))?; - for entry in entries { - let path = entry.map_err(|err| format!("glob entry error for `{pattern}`: {err}"))?; - let utf8 = Utf8PathBuf::from_path_buf(path) - .map_err(|path| format!("non-utf8 path matched by `{pattern}`: {path:?}"))?; - matches.push(utf8); - } - - if matches.is_empty() { - return Err(format!("glob pattern matched no paths: `{pattern}`")); - } - - matches.sort(); - for path in matches { - let key = path.as_str().to_string(); - if seen.insert(key) { - expanded.push(path); - } - } - } - - Ok(expanded) -} - -fn looks_like_glob(pattern: &str) -> bool { - pattern.contains('*') || pattern.contains('?') || pattern.contains('[') -} - -fn expand_workspace_test_paths( - inputs: Vec, - ingot: Option<&str>, -) -> Result, String> { - let mut expanded = Vec::new(); - let mut seen: FxHashSet = FxHashSet::default(); - let mut push_unique = |path: Utf8PathBuf| { - let key = path.as_str().to_string(); - if seen.insert(key) { - expanded.push(path); - } - }; - - for input in inputs { - if !input.is_dir() { - if ingot.is_some() { - return Err(INGOT_REQUIRES_WORKSPACE_ROOT.to_string()); - } - push_unique(input); - continue; - } - - let config_path = input.join("fe.toml"); - if !config_path.is_file() { - if ingot.is_some() { - return Err(INGOT_REQUIRES_WORKSPACE_ROOT.to_string()); - } - push_unique(input); - continue; - } - - let content = match std::fs::read_to_string(config_path.as_std_path()) { - Ok(content) => content, - Err(_) => { - if ingot.is_some() { - return Err(format!( - "`--ingot` requires a readable workspace config at `{config_path}`" - )); - } - push_unique(input); - continue; - } - }; - let config = match Config::parse(&content) { - Ok(config) => config, - Err(_) => { - if ingot.is_some() { - return Err(format!( - "`--ingot` requires a valid workspace config at `{config_path}`" - )); - } - push_unique(input); - continue; - } - }; - let Config::Workspace(workspace_config) = config else { - if ingot.is_some() { - return Err(INGOT_REQUIRES_WORKSPACE_ROOT.to_string()); - } - push_unique(input); - continue; - }; - - let canonical = input - .canonicalize_utf8() - .map_err(|err| format!("failed to canonicalize workspace path `{input}`: {err}"))?; - let workspace_url = Url::from_directory_path(canonical.as_str()) - .map_err(|_| format!("invalid workspace directory path `{input}`"))?; - let selection = if workspace_config.workspace.default_members.is_some() { - WorkspaceMemberSelection::DefaultOnly - } else { - WorkspaceMemberSelection::All - }; - let members = driver::expand_workspace_members( - &workspace_config.workspace, - &workspace_url, - selection, - ) - .map_err(|err| format!("failed to resolve workspace members in `{input}`: {err}"))?; - - let member_paths = select_workspace_member_paths( - &canonical, - &input, - members - .iter() - .filter(|member| member.url != workspace_url) - .map(|member| { - WorkspaceMemberRef::new(member.path.as_path(), member.name.as_deref()) - }), - ingot, - )?; - - if member_paths.is_empty() { - push_unique(input); - continue; - } - - for member_path in member_paths { - push_unique(member_path); - } - } - - Ok(expanded) -} - -fn has_test_functions(db: &DriverDataBase, top_mod: TopLevelMod<'_>) -> bool { - top_mod.all_funcs(db).iter().any(|func| { - ItemKind::from(*func) - .attrs(db) - .is_some_and(|attrs| attrs.has_attr(db, "test")) - }) -} - -/// Like [`has_test_functions`] but checks all modules in the ingot, not just one. -fn ingot_has_test_functions(db: &DriverDataBase, ingot: Ingot<'_>) -> bool { - ingot.all_funcs(db).iter().any(|func| { - ItemKind::from(*func) - .attrs(db) - .is_some_and(|attrs| attrs.has_attr(db, "test")) - }) -} - -fn create_run_report_staging() -> Result { - create_report_staging_root("target/fe-test-report-staging", "fe-test-report") -} - -fn create_suite_report_staging(suite: &str) -> Result { - let name = format!("fe-test-report-{}", sanitize_filename(suite)); - create_report_staging_root("target/fe-test-report-staging", &name) -} - -#[allow(clippy::too_many_arguments)] -pub(super) fn compile_and_run_test( - case: &TestMetadata, - show_logs: bool, - backend: &str, - yul_optimize: bool, - solc: Option<&str>, - evm_trace: Option<&EvmTraceOptions>, - report: Option<&ReportContext>, - call_trace: bool, - collect_step_count: bool, -) -> TestOutcome { - let started = Instant::now(); - let failure = |message: String| TestOutcome { - result: TestResult { - name: case.display_name.clone(), - passed: false, - error_message: Some(message), - gas_used: None, - deploy_gas_used: None, - total_gas_used: None, - }, - logs: Vec::new(), - trace: None, - step_count: None, - runtime_metrics: None, - gas_profile: None, - elapsed: started.elapsed(), - }; - - if case.value_param_count > 0 { - return failure(format!( - "tests with value parameters are not supported (found {})", - case.value_param_count - )); - } - - if case.object_name.trim().is_empty() { - return failure(format!( - "missing test object name for `{}`", - case.display_name - )); - } - - if backend == "sonatina" { - if case.bytecode.is_empty() { - return failure(format!("missing test bytecode for `{}`", case.display_name)); - } - - if let Some(report) = report { - write_sonatina_case_artifacts(report, case); - } - - let runtime_metrics = extract_runtime_from_sonatina_initcode(&case.bytecode) - .map(gas::evm_runtime_metrics_from_bytes); - let bytecode_hex = hex::encode(&case.bytecode); - let (result, logs, trace, step_count, gas_profile) = execute_test( - &case.display_name, - &bytecode_hex, - show_logs, - case.expected_revert.as_ref(), - evm_trace, - call_trace, - collect_step_count, - ); - return TestOutcome { - result, - logs, - trace, - step_count, - runtime_metrics, - gas_profile, - elapsed: started.elapsed(), - }; - } - - // Default backend: compile Yul to bytecode using solc. - if case.yul.trim().is_empty() { - return failure(format!("missing test Yul for `{}`", case.display_name)); - } - - if let Some(report) = report { - write_yul_case_artifacts(report, case, solc); - } - - let (bytecode, runtime_metrics) = match compile_single_contract_with_solc( - &case.object_name, - &case.yul, - yul_optimize, - YUL_VERIFY_RUNTIME, - solc, - ) { - Ok(contract) => ( - contract.bytecode, - gas::evm_runtime_metrics_from_hex(&contract.runtime_bytecode), - ), - Err(err) => return failure(format!("Failed to compile test: {}", err.0)), - }; - - // Execute the test bytecode in revm - let (result, logs, trace, step_count, gas_profile) = execute_test( - &case.display_name, - &bytecode, - show_logs, - case.expected_revert.as_ref(), - evm_trace, - call_trace, - collect_step_count, - ); - TestOutcome { - result, - logs, - trace, - step_count, - runtime_metrics, - gas_profile, - elapsed: started.elapsed(), - } -} - -fn write_sonatina_case_artifacts(report: &ReportContext, case: &TestMetadata) { - let dir = report - .root_dir - .join("artifacts") - .join("tests") - .join(sanitize_filename(&case.display_name)) - .join("sonatina"); - let _ = create_dir_all_utf8(&dir); - - let init_path = dir.join("initcode.hex"); - let _ = std::fs::write(&init_path, hex::encode(&case.bytecode)); - - if let Some(runtime) = extract_runtime_from_sonatina_initcode(&case.bytecode) { - let _ = std::fs::write(dir.join("runtime.bin"), runtime); - let _ = std::fs::write(dir.join("runtime.hex"), hex::encode(runtime)); - } - - if let Some(text) = &case.sonatina_observability_text { - let _ = std::fs::write(dir.join("observability.txt"), text); - } - if let Some(json) = &case.sonatina_observability_json { - let _ = std::fs::write(dir.join("observability.json"), json); - } -} - -pub(super) fn write_yul_case_artifacts( - report: &ReportContext, - case: &TestMetadata, - solc: Option<&str>, -) { - let dir = report - .root_dir - .join("artifacts") - .join("tests") - .join(sanitize_filename(&case.display_name)) - .join("yul"); - let _ = create_dir_all_utf8(&dir); - - let _ = std::fs::write(dir.join("source.yul"), &case.yul); - - let unopt = compile_single_contract_with_solc( - &case.object_name, - &case.yul, - false, - YUL_VERIFY_RUNTIME, - solc, - ); - if let Ok(contract) = unopt { - let _ = std::fs::write(dir.join("bytecode.unopt.hex"), &contract.bytecode); - let _ = std::fs::write(dir.join("runtime.unopt.hex"), &contract.runtime_bytecode); - } - - let opt = compile_single_contract_with_solc( - &case.object_name, - &case.yul, - true, - YUL_VERIFY_RUNTIME, - solc, - ); - if let Ok(contract) = opt { - let _ = std::fs::write(dir.join("bytecode.opt.hex"), &contract.bytecode); - let _ = std::fs::write(dir.join("runtime.opt.hex"), &contract.runtime_bytecode); - } -} - -fn extract_runtime_from_sonatina_initcode(init: &[u8]) -> Option<&[u8]> { - // Matches the init code produced by `fe-codegen` Sonatina tests: - // PUSHn , PUSH2 , PUSH1 0, CODECOPY, PUSHn , PUSH1 0, RETURN, - // - // Returns the appended runtime slice if parsing succeeds. - let mut idx = 0; - let push_opcode = *init.get(idx)?; - if !(0x60..=0x7f).contains(&push_opcode) { - return None; - } - let len_n = (push_opcode - 0x5f) as usize; - idx += 1; - if idx + len_n > init.len() { - return None; - } - let mut len: usize = 0; - for &b in init.get(idx..idx + len_n)? { - len = (len << 8) | (b as usize); - } - idx += len_n; - - if *init.get(idx)? != 0x61 { - return None; - } - idx += 1; - let off_hi = *init.get(idx)? as usize; - let off_lo = *init.get(idx + 1)? as usize; - let off = (off_hi << 8) | off_lo; - if off > init.len() { - return None; - } - if off + len > init.len() { - return None; - } - Some(&init[off..off + len]) -} - -fn write_report_manifest( - staging: &Utf8PathBuf, - backend: &str, - yul_optimize: bool, - opt_level: OptLevel, - filter: Option<&str>, - results: &[TestResult], -) { - let mut out = String::new(); - out.push_str("fe test report\n"); - out.push_str(&format!("backend: {backend}\n")); - out.push_str(&format!("yul_optimize: {yul_optimize}\n")); - out.push_str(&format!("opt_level: {opt_level}\n")); - out.push_str(&format!("filter: {}\n", filter.unwrap_or(""))); - out.push_str(&format!("fe_version: {}\n", env!("CARGO_PKG_VERSION"))); - out.push_str("details: see `meta/args.txt` and `meta/git.txt` for exact repro context\n"); - out.push_str("gas_comparison: see `artifacts/gas_comparison.md`, `artifacts/gas_comparison.csv`, `artifacts/gas_comparison_totals.csv`, `artifacts/gas_comparison_magnitude.csv`, `artifacts/gas_breakdown_comparison.csv`, `artifacts/gas_breakdown_magnitude.csv`, `artifacts/gas_opcode_magnitude.csv`, `artifacts/gas_deployment_attribution.csv`, and `artifacts/gas_comparison_settings.txt` when available\n"); - out.push_str("gas_comparison_yul_artifacts: in Sonatina comparison runs, Yul baselines are stored under `artifacts/tests//yul/{source.yul,bytecode.unopt.hex,bytecode.opt.hex,runtime.unopt.hex,runtime.opt.hex}`\n"); - out.push_str("sonatina_observability: when available, Sonatina test artifacts include `artifacts/tests//sonatina/{observability.txt,observability.json}`\n"); - out.push_str("gas_comparison_aggregate: run-level reports also include `artifacts/gas_comparison_all.csv`, `artifacts/gas_breakdown_comparison_all.csv`, `artifacts/gas_comparison_summary.md`, `artifacts/gas_comparison_magnitude.csv`, `artifacts/gas_breakdown_magnitude.csv`, `artifacts/gas_opcode_magnitude.csv`, `artifacts/gas_deployment_attribution_all.csv`, `artifacts/gas_hotspots_vs_yul_opt.csv`, `artifacts/gas_suite_delta_summary.csv`, `artifacts/gas_tail_trace_symbol_hotspots.csv`, and `artifacts/gas_tail_trace_observability_hotspots.csv`\n"); - out.push_str("sonatina_observability_aggregate: run-level reports also include `artifacts/observability_coverage_all.csv` for per-test coverage totals from observability maps\n"); - out.push_str("gas_opcode_profile: see `artifacts/gas_opcode_comparison.md` and `artifacts/gas_opcode_comparison.csv` for opcode and step-count diagnostics when available\n"); - out.push_str("gas_opcode_profile_aggregate: run-level reports also include `artifacts/gas_opcode_comparison_all.csv`\n"); - out.push_str("sonatina_evm_debug: when available, see `debug/sonatina_evm_bytecode.txt` for stackify traces and lowered EVM vcode output\n"); - out.push_str(&format!("tests: {}\n", results.len())); - let passed = results.iter().filter(|r| r.passed).count(); - out.push_str(&format!("passed: {passed}\n")); - out.push_str(&format!("failed: {}\n", results.len() - passed)); - out.push_str("\nfailures:\n"); - for r in results.iter().filter(|r| !r.passed) { - out.push_str(&format!("- {}\n", r.name)); - if let Some(msg) = &r.error_message { - out.push_str(&format!(" {}\n", msg)); - } - } - let _ = std::fs::write(staging.join("manifest.txt"), out); -} - -/// Deploys and executes compiled test bytecode in revm. -/// -/// The test passes if the function returns normally, fails if it reverts. -/// -/// * `name` - Display name used for reporting. -/// * `bytecode_hex` - Hex-encoded init bytecode for the test object. -/// * `show_logs` - Whether to execute with log collection enabled. -/// -/// Returns the test result and any emitted logs. -fn execute_test( - name: &str, - bytecode_hex: &str, - show_logs: bool, - expected_revert: Option<&ExpectedRevert>, - evm_trace: Option<&EvmTraceOptions>, - call_trace: bool, - collect_step_count: bool, -) -> ( - TestResult, - Vec, - Option, - Option, - Option, -) { - // Deploy the test contract - let (mut instance, deploy_gas_used) = match RuntimeInstance::deploy_tracked(bytecode_hex) { - Ok(deployed) => deployed, - Err(err) => { - let deploy_gas_used = harness_error_gas_used(&err); - return ( - TestResult { - name: name.to_string(), - passed: false, - error_message: Some(format!("Failed to deploy test: {err}")), - gas_used: None, - deploy_gas_used, - total_gas_used: deploy_gas_used, - }, - Vec::new(), - None, - None, - None, - ); - } - }; - instance.set_trace_options(evm_trace.cloned()); - - // Execute the test (empty calldata since test functions take no args) - let options = ExecutionOptions::default(); - - // Capture call trace BEFORE the real execution so the cloned context - // has the right pre-call state (contract deployed but not yet called). - let trace = if call_trace { - Some(instance.call_raw_traced(&[], options)) - } else { - None - }; - let gas_profile = if collect_step_count { - Some(instance.call_raw_gas_profile(&[], options)) - } else { - None - }; - let step_count = gas_profile.map(|profile| profile.step_count); - - let call_result = if show_logs { - instance - .call_raw_with_logs(&[], options) - .map(|outcome| (outcome.result.gas_used, outcome.logs)) - } else { - instance - .call_raw(&[], options) - .map(|result| (result.gas_used, Vec::new())) - }; - - match (call_result, expected_revert) { - // Normal test: execution succeeded - (Ok((gas_used, logs)), None) => { - let total_gas_used = Some(deploy_gas_used.saturating_add(gas_used)); - ( - TestResult { - name: name.to_string(), - passed: true, - error_message: None, - gas_used: Some(gas_used), - deploy_gas_used: Some(deploy_gas_used), - total_gas_used, - }, - logs, - trace, - step_count, - gas_profile, - ) - } - // Normal test: execution reverted (failure) - (Err(err), None) => { - let gas_used = harness_error_gas_used(&err); - let total_gas_used = gas_used.map(|call_gas| deploy_gas_used.saturating_add(call_gas)); - ( - TestResult { - name: name.to_string(), - passed: false, - error_message: Some(format_harness_error(err)), - gas_used, - deploy_gas_used: Some(deploy_gas_used), - total_gas_used, - }, - Vec::new(), - trace, - step_count, - gas_profile, - ) - } - // Expected revert: execution succeeded (failure - should have reverted) - (Ok((gas_used, _)), Some(_)) => { - let total_gas_used = Some(deploy_gas_used.saturating_add(gas_used)); - ( - TestResult { - name: name.to_string(), - passed: false, - error_message: Some("Expected test to revert, but it succeeded".to_string()), - gas_used: Some(gas_used), - deploy_gas_used: Some(deploy_gas_used), - total_gas_used, - }, - Vec::new(), - trace, - step_count, - gas_profile, - ) - } - // Expected revert: execution reverted (success) - (Err(contract_harness::HarnessError::Revert(_)), Some(ExpectedRevert::Any)) => ( - TestResult { - name: name.to_string(), - passed: true, - error_message: None, - gas_used: None, - deploy_gas_used: Some(deploy_gas_used), - total_gas_used: None, - }, - Vec::new(), - trace, - step_count, - gas_profile, - ), - // Expected revert: execution failed for a different reason (failure) - (Err(err), Some(ExpectedRevert::Any)) => { - let gas_used = harness_error_gas_used(&err); - let total_gas_used = gas_used.map(|call_gas| deploy_gas_used.saturating_add(call_gas)); - ( - TestResult { - name: name.to_string(), - passed: false, - error_message: Some(format!( - "Expected test to revert, but it failed with: {}", - format_harness_error(err) - )), - gas_used, - deploy_gas_used: Some(deploy_gas_used), - total_gas_used, - }, - Vec::new(), - trace, - step_count, - gas_profile, - ) - } - } -} - -/// Formats a harness error into a human-readable message. -fn format_harness_error(err: contract_harness::HarnessError) -> String { - match err { - contract_harness::HarnessError::Revert(data) => format!("Test reverted: {data}"), - contract_harness::HarnessError::Halted { reason, gas_used } => { - format!("Test halted: {reason:?} (gas: {gas_used})") - } - other => format!("Test execution error: {other}"), - } -} - -fn harness_error_gas_used(err: &contract_harness::HarnessError) -> Option { - match err { - contract_harness::HarnessError::Halted { gas_used, .. } => Some(*gas_used), - _ => None, - } -} - -/// Prints a summary for the completed test run. -/// -/// * `results` - Per-test results to summarize. -/// -/// Returns nothing. -fn print_summary(results: &[TestResult]) { - if results.is_empty() { - return; - } - - let passed = results.iter().filter(|r| r.passed).count(); - let failed = results.len() - passed; - - println!(); - if failed == 0 { - println!( - "test result: {}. {} passed; {} failed", - "ok".green(), - passed, - failed - ); - } else { - println!( - "test result: {}. {} passed; {} failed", - "FAILED".red(), - passed, - failed - ); - - // Print failed tests - println!(); - println!("failures:"); - for result in results.iter().filter(|r| !r.passed) { - println!(" {}", result.name); - } - } -} diff --git a/crates/fe/src/tree.rs b/crates/fe/src/tree.rs deleted file mode 100644 index a2e945cc9c..0000000000 --- a/crates/fe/src/tree.rs +++ /dev/null @@ -1,171 +0,0 @@ -use camino::Utf8PathBuf; -use common::InputDb; -use common::config::{Config, WorkspaceConfig}; -use driver::{DependencyTree, DriverDataBase, init_ingot, workspace_members}; -use resolver::workspace::discover_context; -use smol_str::SmolStr; -use url::Url; - -pub fn print_tree(path: &Utf8PathBuf) -> bool { - let mut had_errors = false; - let mut db = DriverDataBase::default(); - if let Some(name) = name_candidate(path) { - match print_workspace_member_tree_by_name(&mut db, &name) { - Ok(had_init_diagnostics) => { - had_errors |= had_init_diagnostics; - } - Err(err) => { - eprintln!("Error: {err}"); - had_errors = true; - } - } - return had_errors; - } - - let target_url = match ingot_url(path) { - Ok(url) => url, - Err(message) => { - eprintln!("Error: {message}"); - return true; - } - }; - - let had_init_diagnostics = init_ingot(&mut db, &target_url); - if had_init_diagnostics { - had_errors = true; - } - match config_from_db(&db, &target_url) { - Ok(Some(Config::Workspace(workspace_config))) => { - if let Err(err) = print_workspace_trees(&db, &workspace_config, &target_url) { - eprintln!("Error: {err}"); - had_errors = true; - } - return had_errors; - } - Ok(_) => {} - Err(err) => { - eprintln!("Error: {err}"); - had_errors = true; - } - } - - let tree = DependencyTree::build(&db, &target_url); - print!("{}", tree.display_to(common::color::ColorTarget::Stdout)); - had_errors -} - -fn ingot_url(path: &Utf8PathBuf) -> Result { - let canonical_path = path - .canonicalize_utf8() - .map_err(|_| format!("invalid or non-existent directory path: {path}"))?; - - if !canonical_path.is_dir() { - return Err(format!("{path} is not a directory")); - } - - Url::from_directory_path(canonical_path.as_str()) - .map_err(|_| format!("invalid directory path: {path}")) -} - -fn name_candidate(path: &Utf8PathBuf) -> Option { - if path.exists() { - return None; - } - let value = path.as_str(); - if value.is_empty() { - return None; - } - if value.chars().all(|c| c.is_alphanumeric() || c == '_') { - Some(value.to_string()) - } else { - None - } -} - -fn config_from_db(db: &DriverDataBase, base_url: &Url) -> Result, String> { - let config_url = base_url - .join("fe.toml") - .map_err(|_| format!("Failed to locate fe.toml for {base_url}"))?; - let Some(file) = db.workspace().get(db, &config_url) else { - return Ok(None); - }; - let config = Config::parse(file.text(db)) - .map_err(|err| format!("Failed to parse {config_url}: {err}"))?; - Ok(Some(config)) -} - -fn print_workspace_member_tree_by_name( - db: &mut DriverDataBase, - name: &str, -) -> Result { - let cwd = std::env::current_dir() - .map_err(|err| format!("Failed to read current directory: {err}"))?; - let cwd = Utf8PathBuf::from_path_buf(cwd) - .map_err(|_| "Current directory is not valid UTF-8".to_string())?; - let cwd_url = Url::from_directory_path(cwd.as_std_path()) - .map_err(|_| "Failed to convert current directory to URL".to_string())?; - let discovery = discover_context(&cwd_url, false) - .map_err(|err| format!("Failed to discover context: {err}"))?; - let workspace_url = discovery - .workspace_root - .ok_or_else(|| "No workspace config found in current directory hierarchy".to_string())?; - - let had_init_diagnostics = init_ingot(db, &workspace_url); - let mut matches = - db.dependency_graph() - .workspace_members_by_name(db, &workspace_url, &SmolStr::new(name)); - - if matches.is_empty() { - return Err(format!("No workspace member named \"{name}\"")); - } - if matches.len() > 1 { - return Err(format!( - "Multiple workspace members named \"{name}\"; specify a path instead" - )); - } - - let member = matches.remove(0); - let tree = DependencyTree::build(db, &member.url); - print!("{}", tree.display_to(common::color::ColorTarget::Stdout)); - Ok(had_init_diagnostics) -} - -fn print_workspace_trees( - db: &DriverDataBase, - workspace_config: &WorkspaceConfig, - workspace_url: &Url, -) -> Result<(), String> { - let members = workspace_members(&workspace_config.workspace, workspace_url)?; - if members.is_empty() { - let paths: Vec<&str> = workspace_config - .workspace - .members - .iter() - .map(|m| m.path.as_str()) - .collect(); - if paths.is_empty() { - eprintln!("Warning: No workspace members configured in fe.toml"); - } else { - eprintln!( - "Warning: No workspace members found. The configured member paths do not exist:\n {}", - paths.join("\n ") - ); - } - return Ok(()); - } - - for (idx, member) in members.iter().enumerate() { - if idx > 0 { - println!(); - } - let label = member - .name - .as_deref() - .map(|name| name.to_string()) - .unwrap_or_else(|| member.url.to_string()); - println!("== {label} =="); - let tree = DependencyTree::build(db, &member.url); - print!("{}", tree.display_to(common::color::ColorTarget::Stdout)); - } - Ok(()) -} diff --git a/crates/fe/src/workspace_ingot.rs b/crates/fe/src/workspace_ingot.rs deleted file mode 100644 index bc9e1ab618..0000000000 --- a/crates/fe/src/workspace_ingot.rs +++ /dev/null @@ -1,121 +0,0 @@ -use camino::{Utf8Path, Utf8PathBuf}; -use common::config::Config; - -pub const INGOT_REQUIRES_WORKSPACE_ROOT: &str = - "`--ingot` requires an input path that resolves to a workspace root"; - -#[derive(Debug, Clone, Copy)] -pub struct WorkspaceMemberRef<'a> { - path: &'a Utf8Path, - name: Option<&'a str>, -} - -impl<'a> WorkspaceMemberRef<'a> { - pub fn new(path: &'a Utf8Path, name: Option<&'a str>) -> Self { - Self { path, name } - } -} - -pub fn select_workspace_member_paths<'a>( - workspace_root: &Utf8Path, - workspace_display: &Utf8Path, - members: impl IntoIterator>, - ingot: Option<&str>, -) -> Result, String> { - let mut member_paths = members - .into_iter() - .filter(|member| { - ingot.is_none_or(|ingot| workspace_member_matches_ingot(workspace_root, *member, ingot)) - }) - .map(|member| workspace_root.join(member.path)) - .collect::>(); - member_paths.sort(); - - if let Some(ingot) = ingot - && member_paths.is_empty() - { - return Err(format!( - "No workspace member named \"{ingot}\" found in `{workspace_display}`" - )); - } - - Ok(member_paths) -} - -fn workspace_member_matches_ingot( - workspace_root: &Utf8Path, - member: WorkspaceMemberRef<'_>, - ingot: &str, -) -> bool { - if member.name == Some(ingot) { - return true; - } - - let config_path = workspace_root.join(member.path).join("fe.toml"); - let Ok(content) = std::fs::read_to_string(config_path.as_std_path()) else { - return false; - }; - let Ok(Config::Ingot(config)) = Config::parse(&content) else { - return false; - }; - config.metadata.name.as_deref() == Some(ingot) -} - -#[cfg(test)] -mod tests { - use super::{WorkspaceMemberRef, select_workspace_member_paths}; - use camino::{Utf8Path, Utf8PathBuf}; - use std::fs; - use tempfile::tempdir; - - #[test] - fn select_workspace_member_paths_does_not_match_by_directory_name() { - let temp = tempdir().expect("tempdir"); - let workspace_root = - Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).expect("workspace root utf8"); - let non_target = workspace_root.join("libs/a"); - fs::create_dir_all(non_target.as_std_path()).expect("create non-target dir"); - fs::write( - non_target.join("fe.toml").as_std_path(), - "[ingot]\nname = \"not_a\"\nversion = \"0.1.0\"\n", - ) - .expect("write non-target fe.toml"); - - let paths = select_workspace_member_paths( - &workspace_root, - &workspace_root, - [ - WorkspaceMemberRef::new(Utf8Path::new("ingots/target"), Some("a")), - WorkspaceMemberRef::new(Utf8Path::new("libs/a"), None), - ], - Some("a"), - ) - .expect("select paths"); - - assert_eq!(paths, vec![workspace_root.join("ingots/target")]); - } - - #[test] - fn select_workspace_member_paths_matches_ingot_metadata_name() { - let temp = tempdir().expect("tempdir"); - let workspace_root = - Utf8PathBuf::from_path_buf(temp.path().to_path_buf()).expect("workspace root utf8"); - let member = workspace_root.join("ingots/core"); - fs::create_dir_all(member.as_std_path()).expect("create member dir"); - fs::write( - member.join("fe.toml").as_std_path(), - "[ingot]\nname = \"app\"\nversion = \"0.1.0\"\n", - ) - .expect("write member fe.toml"); - - let paths = select_workspace_member_paths( - &workspace_root, - &workspace_root, - [WorkspaceMemberRef::new(Utf8Path::new("ingots/core"), None)], - Some("app"), - ) - .expect("select paths"); - - assert_eq!(paths, vec![workspace_root.join("ingots/core")]); - } -} diff --git a/crates/fe/tests/build_foundry.rs b/crates/fe/tests/build_foundry.rs deleted file mode 100644 index 04500e78f9..0000000000 --- a/crates/fe/tests/build_foundry.rs +++ /dev/null @@ -1,455 +0,0 @@ -use std::{ - fs, - path::{Path, PathBuf}, - process::{Command, Stdio}, -}; - -use tempfile::tempdir; - -fn fe_binary_path() -> &'static str { - env!("CARGO_BIN_EXE_fe") -} - -fn render_output(output: &std::process::Output) -> String { - let mut full_output = String::new(); - if !output.stdout.is_empty() { - full_output.push_str("=== STDOUT ===\n"); - full_output.push_str(&String::from_utf8_lossy(&output.stdout)); - } - if !output.stderr.is_empty() { - if !full_output.is_empty() { - full_output.push('\n'); - } - full_output.push_str("=== STDERR ===\n"); - full_output.push_str(&String::from_utf8_lossy(&output.stderr)); - } - let exit_code = output.status.code().unwrap_or(-1); - full_output.push_str(&format!("\n=== EXIT CODE: {exit_code} ===")); - full_output -} - -fn find_executable_in_path(name: &str) -> Option { - let path = std::env::var_os("PATH")?; - for dir in std::env::split_paths(&path) { - let candidate = dir.join(name); - if candidate.is_file() { - return Some(candidate); - } - } - None -} - -fn run_fe_main_with_env(args: &[&str], extra_env: &[(&str, &str)]) -> (String, i32) { - let mut command = Command::new(fe_binary_path()); - command.args(args).env("NO_COLOR", "1"); - for (key, value) in extra_env { - command.env(key, value); - } - let output = command - .output() - .unwrap_or_else(|_| panic!("Failed to run fe {:?}", args)); - - let exit_code = output.status.code().unwrap_or(-1); - (render_output(&output), exit_code) -} - -fn write_foundry_base(root: &Path) -> Result<(), String> { - fs::create_dir_all(root.join("src")).map_err(|err| format!("create src: {err}"))?; - fs::create_dir_all(root.join("test")).map_err(|err| format!("create test: {err}"))?; - - let foundry_toml = r#"[profile.default] -src = "src" -test = "test" -fs_permissions = [{ access = "read", path = "./" }] -"#; - fs::write(root.join("foundry.toml"), foundry_toml) - .map_err(|err| format!("write foundry.toml: {err}"))?; - - Ok(()) -} - -fn write_foundry_project( - root: &Path, - deploy_rel_path: &str, - runtime_rel_path: &str, -) -> Result<(), String> { - let solidity_test = format!( - r#"// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -interface Vm {{ - function readFile(string calldata path) external returns (string memory); -}} - -contract FeBuildArtifactsTest {{ - Vm constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - function testBuildArtifactsDeployAndRun() public {{ - bytes memory initCode = fromHex(vm.readFile("{deploy_rel_path}")); - bytes memory expectedRuntime = fromHex(vm.readFile("{runtime_rel_path}")); - - address deployed = deploy(initCode); - require(deployed != address(0), "create failed"); - - (bool ok, bytes memory out) = deployed.staticcall( - abi.encodeWithSelector(bytes4(0x12345678)) - ); - require(ok, "call failed"); - - uint256 value = abi.decode(out, (uint256)); - require(value == 1, "unexpected return"); - - bytes memory deployedCode = deployed.code; - require( - keccak256(deployedCode) == keccak256(expectedRuntime), - "runtime mismatch" - ); - }} - - function deploy(bytes memory initCode) internal returns (address deployed) {{ - assembly {{ - deployed := create(0, add(initCode, 0x20), mload(initCode)) - }} - }} - - function fromHex(string memory s) internal pure returns (bytes memory) {{ - bytes memory strBytes = bytes(s); - uint256 start = 0; - while (start < strBytes.length && isWhitespace(strBytes[start])) {{ - start++; - }} - - if ( - start + 1 < strBytes.length && - strBytes[start] == bytes1("0") && - (strBytes[start + 1] == bytes1("x") || strBytes[start + 1] == bytes1("X")) - ) {{ - start += 2; - }} - - uint256 digits = 0; - for (uint256 i = start; i < strBytes.length; i++) {{ - if (isWhitespace(strBytes[i])) continue; - digits++; - }} - require(digits % 2 == 0, "odd hex length"); - - bytes memory out = new bytes(digits / 2); - uint256 outIndex = 0; - uint8 high = 0; - bool highNibble = true; - for (uint256 i = start; i < strBytes.length; i++) {{ - bytes1 ch = strBytes[i]; - if (isWhitespace(ch)) continue; - uint8 val = fromHexChar(ch); - if (highNibble) {{ - high = val; - highNibble = false; - }} else {{ - out[outIndex] = bytes1((high << 4) | val); - outIndex++; - highNibble = true; - }} - }} - return out; - }} - - function isWhitespace(bytes1 ch) private pure returns (bool) {{ - return ch == 0x20 || ch == 0x0a || ch == 0x0d || ch == 0x09; - }} - - function fromHexChar(bytes1 c) private pure returns (uint8) {{ - uint8 b = uint8(c); - if (b >= 48 && b <= 57) return b - 48; - if (b >= 65 && b <= 70) return b - 55; - if (b >= 97 && b <= 102) return b - 87; - revert("invalid hex"); - }} -}} -"# - ); - fs::write(root.join("test/FeBuildArtifacts.t.sol"), solidity_test) - .map_err(|err| format!("write FeBuildArtifacts.t.sol: {err}"))?; - - Ok(()) -} - -fn write_foundry_project_erc20( - root: &Path, - deploy_rel_path: &str, - runtime_rel_path: &str, -) -> Result<(), String> { - let solidity_test = format!( - r#"// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; - -interface Vm {{ - function readFile(string calldata path) external returns (string memory); - function prank(address msgSender) external; - function expectEmit(bool checkTopic1, bool checkTopic2, bool checkTopic3, bool checkData) external; -}} - -interface ICoolCoin {{ - function name() external view returns (uint256); - function symbol() external view returns (uint256); - function decimals() external view returns (uint8); - function totalSupply() external view returns (uint256); - function balanceOf(address account) external view returns (uint256); - function allowance(address owner, address spender) external view returns (uint256); - function transfer(address to, uint256 amount) external returns (bool); - function approve(address spender, uint256 amount) external returns (bool); - function transferFrom(address from, address to, uint256 amount) external returns (bool); - function mint(address to, uint256 amount) external returns (bool); -}} - -contract FeErc20ArtifactsTest {{ - Vm constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - - event Transfer(address indexed from, address indexed to, uint256 value); - event Approval(address indexed owner, address indexed spender, uint256 value); - - function testErc20Artifacts() public {{ - bytes memory initCode = fromHex(vm.readFile("{deploy_rel_path}")); - bytes memory expectedRuntime = fromHex(vm.readFile("{runtime_rel_path}")); - - address owner = address(0x1000000000000000000000000000000000000001); - address alice = address(0x1000000000000000000000000000000000000002); - address bob = address(0x1000000000000000000000000000000000000003); - address spender = address(0x1000000000000000000000000000000000000004); - - uint256 initialSupply = 1000; - bytes memory initWithArgs = bytes.concat(initCode, abi.encode(initialSupply, owner)); - - address deployed = deploy(initWithArgs); - require(deployed != address(0), "create failed"); - - bytes memory deployedCode = deployed.code; - require( - keccak256(deployedCode) == keccak256(expectedRuntime), - "runtime mismatch" - ); - - ICoolCoin token = ICoolCoin(deployed); - require(token.totalSupply() == initialSupply, "totalSupply"); - require(token.balanceOf(owner) == initialSupply, "balanceOf(owner)"); - require(token.balanceOf(alice) == 0, "balanceOf(alice)"); - - vm.expectEmit(true, true, false, true); - emit Transfer(owner, alice, 50); - vm.prank(owner); - require(token.transfer(alice, 50), "transfer"); - require(token.balanceOf(owner) == 950, "balanceOf(owner) after transfer"); - require(token.balanceOf(alice) == 50, "balanceOf(alice) after transfer"); - - vm.expectEmit(true, true, false, true); - emit Approval(owner, spender, 100); - vm.prank(owner); - require(token.approve(spender, 100), "approve"); - require(token.allowance(owner, spender) == 100, "allowance after approve"); - - vm.expectEmit(true, true, false, true); - emit Transfer(owner, bob, 40); - vm.prank(spender); - require(token.transferFrom(owner, bob, 40), "transferFrom"); - require(token.allowance(owner, spender) == 60, "allowance after transferFrom"); - require(token.balanceOf(owner) == 910, "balanceOf(owner) after transferFrom"); - require(token.balanceOf(bob) == 40, "balanceOf(bob) after transferFrom"); - - vm.prank(spender); - require(!token.transferFrom(owner, bob, 1000), "transferFrom should fail"); - require(token.allowance(owner, spender) == 60, "allowance unchanged"); - require(token.balanceOf(owner) == 910, "owner unchanged"); - require(token.balanceOf(bob) == 40, "bob unchanged"); - - require(token.name() == 0x436f6f6c436f696e, "name"); - require(token.symbol() == 0x434f4f4c, "symbol"); - require(token.decimals() == 18, "decimals"); - - vm.expectEmit(true, true, false, true); - emit Transfer(address(0), alice, 500); - require(token.mint(alice, 500), "mint"); - require(token.totalSupply() == 1500, "totalSupply after mint"); - require(token.balanceOf(alice) == 550, "balanceOf(alice) after mint"); - }} - - function deploy(bytes memory initCode) internal returns (address deployed) {{ - assembly {{ - deployed := create(0, add(initCode, 0x20), mload(initCode)) - }} - }} - - function fromHex(string memory s) internal pure returns (bytes memory) {{ - bytes memory strBytes = bytes(s); - uint256 start = 0; - while (start < strBytes.length && isWhitespace(strBytes[start])) {{ - start++; - }} - - if ( - start + 1 < strBytes.length && - strBytes[start] == bytes1("0") && - (strBytes[start + 1] == bytes1("x") || strBytes[start + 1] == bytes1("X")) - ) {{ - start += 2; - }} - - uint256 digits = 0; - for (uint256 i = start; i < strBytes.length; i++) {{ - if (isWhitespace(strBytes[i])) continue; - digits++; - }} - require(digits % 2 == 0, "odd hex length"); - - bytes memory out = new bytes(digits / 2); - uint256 outIndex = 0; - uint8 high = 0; - bool highNibble = true; - for (uint256 i = start; i < strBytes.length; i++) {{ - bytes1 ch = strBytes[i]; - if (isWhitespace(ch)) continue; - uint8 val = fromHexChar(ch); - if (highNibble) {{ - high = val; - highNibble = false; - }} else {{ - out[outIndex] = bytes1((high << 4) | val); - outIndex++; - highNibble = true; - }} - }} - return out; - }} - - function isWhitespace(bytes1 ch) private pure returns (bool) {{ - return ch == 0x20 || ch == 0x0a || ch == 0x0d || ch == 0x09; - }} - - function fromHexChar(bytes1 c) private pure returns (uint8) {{ - uint8 b = uint8(c); - if (b >= 48 && b <= 57) return b - 48; - if (b >= 65 && b <= 70) return b - 55; - if (b >= 97 && b <= 102) return b - 87; - revert("invalid hex"); - }} -}} -"# - ); - fs::write(root.join("test/FeErc20Artifacts.t.sol"), solidity_test) - .map_err(|err| format!("write FeErc20Artifacts.t.sol: {err}"))?; - - Ok(()) -} - -#[cfg(unix)] -#[test] -fn test_fe_build_artifacts_with_foundry() { - let Some(forge) = find_executable_in_path("forge") else { - #[allow(clippy::print_stdout)] - { - println!("skipping foundry integration test because `forge` is missing"); - } - return; - }; - let solc = std::env::var_os("FE_SOLC_PATH") - .map(PathBuf::from) - .filter(|path| path.is_file()) - .or_else(|| find_executable_in_path("solc")); - let Some(solc) = solc else { - #[allow(clippy::print_stdout)] - { - println!("skipping foundry integration test because `solc` is missing"); - } - return; - }; - - let solc_str = solc.to_str().expect("solc utf8"); - - let fixture_basic_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) - .join("tests/fixtures/cli_output/build/simple_contract.fe"); - let fixture_basic_path_str = fixture_basic_path.to_str().expect("fixture path utf8"); - let fixture_erc20_path = - PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/build_foundry/erc20.fe"); - let fixture_erc20_path_str = fixture_erc20_path.to_str().expect("fixture path utf8"); - - let temp = tempdir().expect("tempdir"); - - let forge_root = temp.path().join("forge-project"); - fs::create_dir_all(&forge_root).expect("create forge project root"); - - let out_dir = forge_root.join("fe-out"); - let out_dir_str = out_dir.to_string_lossy().to_string(); - - let (output, exit_code) = run_fe_main_with_env( - &[ - "build", - "--backend", - "sonatina", - "--contract", - "Foo", - "--out-dir", - out_dir_str.as_str(), - fixture_basic_path_str, - ], - &[], - ); - assert_eq!(exit_code, 0, "fe build Foo failed:\n{output}"); - - let (output, exit_code) = run_fe_main_with_env( - &[ - "build", - "--backend", - "sonatina", - "--contract", - "CoolCoin", - "--out-dir", - out_dir_str.as_str(), - fixture_erc20_path_str, - ], - &[], - ); - assert_eq!(exit_code, 0, "fe build CoolCoin failed:\n{output}"); - - for artifact in [ - out_dir.join("Foo.bin"), - out_dir.join("Foo.runtime.bin"), - out_dir.join("CoolCoin.bin"), - out_dir.join("CoolCoin.runtime.bin"), - ] { - assert!(artifact.is_file(), "expected artifact at {artifact:?}"); - } - - write_foundry_base(&forge_root).expect("write foundry project"); - write_foundry_project(&forge_root, "fe-out/Foo.bin", "fe-out/Foo.runtime.bin") - .expect("write Foo foundry test"); - write_foundry_project_erc20( - &forge_root, - "fe-out/CoolCoin.bin", - "fe-out/CoolCoin.runtime.bin", - ) - .expect("write CoolCoin foundry test"); - - let foundry_home = forge_root.join("foundry-home"); - fs::create_dir_all(&foundry_home).expect("create foundry home"); - - let forge_output = Command::new(&forge) - .args([ - "test", - "--root", - forge_root.to_str().expect("forge root utf8"), - "--use", - solc_str, - "--offline", - "-q", - ]) - .env("FOUNDRY_HOME", &foundry_home) - .stdout(Stdio::piped()) - .stderr(Stdio::piped()) - .output() - .expect("run forge test"); - - assert!( - forge_output.status.success(), - "forge test failed:\n{}", - render_output(&forge_output) - ); -} diff --git a/crates/fe/tests/cli_new.rs b/crates/fe/tests/cli_new.rs deleted file mode 100644 index 4e465097d8..0000000000 --- a/crates/fe/tests/cli_new.rs +++ /dev/null @@ -1,427 +0,0 @@ -use std::process::Command; - -use tempfile::TempDir; - -fn run_fe(args: &[&str], cwd: &std::path::Path) -> (String, i32) { - let output = Command::new(env!("CARGO_BIN_EXE_fe")) - .args(args) - .env("NO_COLOR", "1") - .current_dir(cwd) - .output() - .unwrap_or_else(|_| panic!("Failed to run fe {:?}", args)); - - let mut full_output = String::new(); - if !output.stdout.is_empty() { - full_output.push_str("=== STDOUT ===\n"); - full_output.push_str(&String::from_utf8_lossy(&output.stdout)); - } - if !output.stderr.is_empty() { - if !full_output.is_empty() { - full_output.push('\n'); - } - full_output.push_str("=== STDERR ===\n"); - full_output.push_str(&String::from_utf8_lossy(&output.stderr)); - } - let exit_code = output.status.code().unwrap_or(-1); - full_output.push_str(&format!("\n=== EXIT CODE: {exit_code} ===")); - (full_output, exit_code) -} - -#[test] -fn new_creates_ingot_layout() { - let tmp = TempDir::new().expect("tempdir"); - let ingot_dir = tmp.path().join("my_ingot"); - - let (output, exit_code) = run_fe(&["new", ingot_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - - let fe_toml = ingot_dir.join("fe.toml"); - assert!(fe_toml.is_file(), "missing fe.toml"); - let config = std::fs::read_to_string(&fe_toml).expect("read fe.toml"); - assert!(config.contains("[ingot]")); - assert!(config.contains("name = \"my_ingot\"")); - assert!(config.contains("version = \"0.1.0\"")); - - assert!(ingot_dir.join("src").is_dir(), "missing src/"); - let lib_fe = ingot_dir.join("src/lib.fe"); - assert!(lib_fe.is_file(), "missing src/lib.fe"); - let lib_content = std::fs::read_to_string(&lib_fe).expect("read lib.fe"); - assert!( - lib_content.contains("contract Counter"), - "expected lib.fe to contain Counter contract template, got:\n{lib_content}" - ); -} - -#[test] -fn new_allows_overriding_name_and_version() { - let tmp = TempDir::new().expect("tempdir"); - let ingot_dir = tmp.path().join("some_dir"); - - let (output, exit_code) = run_fe( - &[ - "new", - "--name", - "custom_name", - "--version", - "9.9.9", - ingot_dir.to_str().unwrap(), - ], - tmp.path(), - ); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - - let fe_toml = ingot_dir.join("fe.toml"); - let config = std::fs::read_to_string(&fe_toml).expect("read fe.toml"); - assert!(config.contains("name = \"custom_name\"")); - assert!(config.contains("version = \"9.9.9\"")); -} - -#[test] -fn new_workspace_creates_workspace_config_without_hardcoded_layout() { - let tmp = TempDir::new().expect("tempdir"); - let ws_dir = tmp.path().join("my_ws"); - - let (output, exit_code) = run_fe( - &["new", "--workspace", ws_dir.to_str().unwrap()], - tmp.path(), - ); - assert_eq!(exit_code, 0, "fe new --workspace failed:\n{output}"); - - let fe_toml = ws_dir.join("fe.toml"); - assert!(fe_toml.is_file(), "missing workspace fe.toml"); - let config = std::fs::read_to_string(&fe_toml).expect("read workspace fe.toml"); - assert!(config.contains("[workspace]")); - assert!(config.contains("name = \"my_ws\"")); - assert!(config.contains("members = []")); - - assert!( - !ws_dir.join("ingots").exists(), - "workspace new should not create an ingots/ directory" - ); -} - -#[test] -fn new_suggests_member_for_enclosing_workspace() { - let tmp = TempDir::new().expect("tempdir"); - let ws_dir = tmp.path().join("ws"); - std::fs::create_dir_all(&ws_dir).expect("create ws"); - std::fs::write( - ws_dir.join("fe.toml"), - r#"[workspace] -name = "ws" -version = "0.1.0" -members = [] -exclude = ["target"] -"#, - ) - .expect("write fe.toml"); - - let member_dir = ws_dir.join("app"); - let (output, exit_code) = run_fe(&["new", member_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - assert!( - output.contains("add \"app\" to [workspace].members"), - "expected `fe new` to print a workspace member suggestion, got:\n{output}" - ); - - let updated = std::fs::read_to_string(ws_dir.join("fe.toml")).expect("read fe.toml"); - let value: toml::Value = updated.parse().expect("parse workspace fe.toml"); - let workspace = value - .get("workspace") - .and_then(|v| v.as_table()) - .expect("workspace table"); - let members = workspace - .get("members") - .and_then(|v| v.as_array()) - .expect("members array"); - assert!( - members.is_empty(), - "expected members to remain empty (no file writes), got: {members:?}" - ); -} - -#[test] -fn new_suggests_member_for_root_level_workspace_config() { - let tmp = TempDir::new().expect("tempdir"); - let ws_dir = tmp.path().join("ws"); - std::fs::create_dir_all(&ws_dir).expect("create ws"); - std::fs::write( - ws_dir.join("fe.toml"), - r#"name = "ws" -version = "0.1.0" -members = [] -exclude = ["target"] -"#, - ) - .expect("write fe.toml"); - - let member_dir = ws_dir.join("app"); - let (output, exit_code) = run_fe(&["new", member_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - assert!( - output.contains("add \"app\" to members"), - "expected `fe new` to suggest adding the member to root-level members, got:\n{output}" - ); - - let updated = std::fs::read_to_string(ws_dir.join("fe.toml")).expect("read fe.toml"); - let value: toml::Value = updated.parse().expect("parse workspace fe.toml"); - let members = value - .get("members") - .and_then(|v| v.as_array()) - .expect("members array"); - assert!( - members.is_empty(), - "expected members to remain empty (no file writes), got: {members:?}" - ); -} - -#[test] -fn new_does_not_suggest_member_when_covered_by_existing_glob() { - let tmp = TempDir::new().expect("tempdir"); - let ws_dir = tmp.path().join("ws"); - std::fs::create_dir_all(&ws_dir).expect("create ws"); - std::fs::write( - ws_dir.join("fe.toml"), - r#"[workspace] -name = "ws" -version = "0.1.0" -members = ["ingots/*"] -exclude = ["target"] -"#, - ) - .expect("write fe.toml"); - - let member_dir = ws_dir.join("ingots").join("app"); - let (output, exit_code) = run_fe(&["new", member_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - assert!( - !output.contains("Workspace detected at"), - "expected `fe new` to skip workspace suggestion when member is covered by glob, got:\n{output}" - ); - - let updated = std::fs::read_to_string(ws_dir.join("fe.toml")).expect("read fe.toml"); - let value: toml::Value = updated.parse().expect("parse workspace fe.toml"); - let workspace = value - .get("workspace") - .and_then(|v| v.as_table()) - .expect("workspace table"); - let members = workspace - .get("members") - .and_then(|v| v.as_array()) - .expect("members array"); - assert!( - members.iter().any(|m| m.as_str() == Some("ingots/*")), - "expected members to retain glob entry, got: {members:?}" - ); - assert!( - !members.iter().any(|m| m.as_str() == Some("ingots/app")), - "expected members not to contain explicit \"ingots/app\", got: {members:?}" - ); -} - -#[test] -fn new_suggests_member_for_members_main_table() { - let tmp = TempDir::new().expect("tempdir"); - let ws_dir = tmp.path().join("ws"); - std::fs::create_dir_all(&ws_dir).expect("create ws"); - std::fs::write( - ws_dir.join("fe.toml"), - r#"[workspace] -name = "ws" -version = "0.1.0" -members = { main = [], dev = ["examples/*"] } -exclude = ["target"] -"#, - ) - .expect("write fe.toml"); - - let member_dir = ws_dir.join("app"); - let (output, exit_code) = run_fe(&["new", member_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - assert!( - output.contains("add \"app\" to [workspace].members.main"), - "expected `fe new` to print a workspace member suggestion for members.main, got:\n{output}" - ); - - let updated = std::fs::read_to_string(ws_dir.join("fe.toml")).expect("read fe.toml"); - let value: toml::Value = updated.parse().expect("parse workspace fe.toml"); - let workspace = value - .get("workspace") - .and_then(|v| v.as_table()) - .expect("workspace table"); - let members = workspace.get("members").expect("members value"); - let member_table = members.as_table().expect("members table"); - let main = member_table - .get("main") - .and_then(|v| v.as_array()) - .expect("members.main array"); - assert!( - main.is_empty(), - "expected members.main to remain empty (no file writes), got: {main:?}" - ); -} - -#[test] -fn new_errors_when_target_path_is_file() { - let tmp = TempDir::new().expect("tempdir"); - let target_file = tmp.path().join("not_a_dir"); - std::fs::write(&target_file, "hello").expect("write file"); - - let (output, exit_code) = run_fe(&["new", target_file.to_str().unwrap()], tmp.path()); - assert_ne!(exit_code, 0, "expected `fe new` to fail, got:\n{output}"); - assert!( - output.contains("exists and is a file; expected directory"), - "expected file-target error, got:\n{output}" - ); -} - -#[test] -fn new_refuses_to_overwrite_existing_fe_toml() { - let tmp = TempDir::new().expect("tempdir"); - let ingot_dir = tmp.path().join("my_ingot"); - std::fs::create_dir_all(&ingot_dir).expect("create ingot dir"); - std::fs::write( - ingot_dir.join("fe.toml"), - "[ingot]\nname = \"x\"\nversion = \"0.1.0\"\n", - ) - .expect("write fe.toml"); - - let (output, exit_code) = run_fe(&["new", ingot_dir.to_str().unwrap()], tmp.path()); - assert_ne!(exit_code, 0, "expected `fe new` to fail, got:\n{output}"); - assert!( - output.contains("Refusing to overwrite existing") && output.contains("fe.toml"), - "expected overwrite refusal for fe.toml, got:\n{output}" - ); -} - -#[test] -fn new_refuses_to_overwrite_existing_src_lib_fe() { - let tmp = TempDir::new().expect("tempdir"); - let ingot_dir = tmp.path().join("my_ingot"); - std::fs::create_dir_all(ingot_dir.join("src")).expect("create src dir"); - std::fs::write(ingot_dir.join("src/lib.fe"), "pub fn main() {}\n").expect("write lib.fe"); - - let (output, exit_code) = run_fe(&["new", ingot_dir.to_str().unwrap()], tmp.path()); - assert_ne!(exit_code, 0, "expected `fe new` to fail, got:\n{output}"); - assert!( - output.contains("Refusing to overwrite existing") - && (output.contains("src/lib.fe") || output.contains("src\\lib.fe")), - "expected overwrite refusal for src/lib.fe, got:\n{output}" - ); -} - -#[test] -fn new_does_not_print_workspace_suggestion_outside_workspace() { - let tmp = TempDir::new().expect("tempdir"); - let ingot_dir = tmp.path().join("my_ingot"); - - let (output, exit_code) = run_fe(&["new", ingot_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - assert!( - !output.contains("Workspace detected at"), - "expected no workspace suggestion outside a workspace, got:\n{output}" - ); -} - -#[test] -fn new_does_not_suggest_member_when_already_explicitly_listed() { - let tmp = TempDir::new().expect("tempdir"); - let ws_dir = tmp.path().join("ws"); - std::fs::create_dir_all(&ws_dir).expect("create ws"); - std::fs::write( - ws_dir.join("fe.toml"), - r#"[workspace] -name = "ws" -version = "0.1.0" -members = ["app"] -exclude = ["target"] -"#, - ) - .expect("write fe.toml"); - - let member_dir = ws_dir.join("app"); - let (output, exit_code) = run_fe(&["new", member_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - assert!( - !output.contains("Workspace detected at"), - "expected `fe new` to print no suggestion when member is already listed, got:\n{output}" - ); -} - -#[test] -fn new_suggests_member_for_nested_path_when_parent_dirs_do_not_exist() { - let tmp = TempDir::new().expect("tempdir"); - let ws_dir = tmp.path().join("ws"); - std::fs::create_dir_all(&ws_dir).expect("create ws"); - std::fs::write( - ws_dir.join("fe.toml"), - r#"[workspace] -name = "ws" -version = "0.1.0" -members = [] -exclude = ["target"] -"#, - ) - .expect("write fe.toml"); - - let member_dir = ws_dir.join("packages").join("app"); - let (output, exit_code) = run_fe(&["new", member_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - assert!( - output.contains("add \"packages/app\" to [workspace].members"), - "expected `fe new` to suggest the nested member path, got:\n{output}" - ); - assert!( - member_dir.join("fe.toml").is_file(), - "expected ingot fe.toml to be created" - ); - assert!( - member_dir.join("src/lib.fe").is_file(), - "expected ingot src/lib.fe to be created" - ); -} - -#[test] -fn new_warns_when_workspace_members_field_is_invalid_type() { - let tmp = TempDir::new().expect("tempdir"); - let ws_dir = tmp.path().join("ws"); - std::fs::create_dir_all(&ws_dir).expect("create ws"); - std::fs::write( - ws_dir.join("fe.toml"), - r#"[workspace] -name = "ws" -version = "0.1.0" -members = "oops" -exclude = ["target"] -"#, - ) - .expect("write fe.toml"); - - let member_dir = ws_dir.join("app"); - let (output, exit_code) = run_fe(&["new", member_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - assert!( - output.contains("failed to check workspace members"), - "expected warning when members is invalid type, got:\n{output}" - ); - assert!( - member_dir.join("fe.toml").is_file(), - "expected ingot fe.toml to be created" - ); -} - -#[test] -fn new_generated_project_passes_fe_test() { - let tmp = TempDir::new().expect("tempdir"); - let ingot_dir = tmp.path().join("my_counter"); - - let (output, exit_code) = run_fe(&["new", ingot_dir.to_str().unwrap()], tmp.path()); - assert_eq!(exit_code, 0, "fe new failed:\n{output}"); - - let (output, exit_code) = run_fe(&["test"], &ingot_dir); - assert_eq!(exit_code, 0, "fe test failed:\n{output}"); - assert!( - output.contains("test_counter") && output.contains("ok"), - "expected test_counter to pass, got:\n{output}" - ); -} diff --git a/crates/fe/tests/cli_output.rs b/crates/fe/tests/cli_output.rs deleted file mode 100644 index 402a3dd903..0000000000 --- a/crates/fe/tests/cli_output.rs +++ /dev/null @@ -1,1802 +0,0 @@ -use dir_test::{Fixture, dir_test}; -use std::{fs, io::IsTerminal, path::Path, process::Command, sync::OnceLock}; -use tempfile::tempdir; -use test_utils::{ - normalize::{normalize_newlines, normalize_path_separators, replace_path_token}, - snap_test, -}; - -// Helper function to normalize paths in output for portability -fn normalize_output(output: &str) -> String { - let output = normalize_newlines(output); - let output = normalize_path_separators(output.as_ref()); - - let manifest_dir = env!("CARGO_MANIFEST_DIR"); - let project_root = std::path::Path::new(manifest_dir) - .parent() - .expect("parent") - .parent() - .expect("parent"); - - let normalized = replace_path_token(&output, project_root, ""); - normalize_timing_output(&normalized) -} - -fn normalize_timing_output(output: &str) -> String { - let has_trailing_newline = output.ends_with('\n'); - let mut normalized = output - .lines() - .map(normalize_timing_line) - .collect::>() - .join("\n"); - if has_trailing_newline { - normalized.push('\n'); - } - normalized -} - -fn normalize_timing_line(line: &str) -> String { - let Some(status_idx) = ["PASS [", "FAIL [", "READY [", "ERROR ["] - .into_iter() - .filter_map(|marker| line.find(marker)) - .min() - else { - return line.to_string(); - }; - let Some(open_rel) = line[status_idx..].find('[') else { - return line.to_string(); - }; - let open = status_idx + open_rel; - let Some(close_rel) = line[open..].find(']') else { - return line.to_string(); - }; - let close = open + close_rel; - let bracket = &line[open + 1..close]; - let Some(seconds) = bracket.strip_suffix('s') else { - return line.to_string(); - }; - if seconds.is_empty() - || !seconds - .chars() - .all(|ch| ch.is_ascii_digit() || ch == '.' || ch == ' ') - { - return line.to_string(); - } - - let mut normalized = String::new(); - normalized.push_str(&line[..open]); - normalized.push_str("[",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}());hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}());hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}());hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}());hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}());hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}());hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}());hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}());hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}());hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}());hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}());hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}());hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}());hljs.registerLanguage("http",function(){"use strict";return function(e){var n="HTTP/[0-9\\.]+";return{name:"HTTP",aliases:["https"],illegal:"\\S",contains:[{begin:"^"+n,end:"$",contains:[{className:"number",begin:"\\b\\d{3}\\b"}]},{begin:"^[A-Z]+ (.*?) "+n+"$",returnBegin:!0,end:"$",contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{begin:n},{className:"keyword",begin:"[A-Z]+"}]},{className:"attribute",begin:"^\\w",end:": ",excludeEnd:!0,illegal:"\\n|\\s|=",starts:{end:"$",relevance:0}},{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}]}}}());hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}());hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}());hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}());hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}());hljs.registerLanguage("ini",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(...n){return n.map(n=>e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}());hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}());hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}());hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}());hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}());hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}());hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}());hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:">>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}());hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}());hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}());hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}());hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}());hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}());hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}());hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}());hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}());hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}());hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}());hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}());hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}());hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}());hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}());hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}());hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); diff --git a/logo/fe_png/fe.png b/docs/images/fe.png similarity index 100% rename from logo/fe_png/fe.png rename to docs/images/fe.png diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000000..217fd49d8e --- /dev/null +++ b/docs/index.html @@ -0,0 +1,259 @@ + + + + + + Introduction - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+



+
Fe logo
+

What is Fe?

+

Fe is the next generation smart contract language for Ethereum.

+

Fe is a smart contract language that strives to make developing Ethereum smart contract development safer, simpler and more fun.

+

Smart contracts are programs executed by a computer embedded into Ethereum clients known as the Ethereum Virtual Machine (EVM). The EVM executes bytecode instructions that are not human readable. Therefore, developers use higher-level languages that compiles to EVM bytecode.

+

Fe is one of these languages.

+

Why Fe?

+

Fe aims to make writing secure smart contract code a great experience. With Fe, writing safe code feels natural and fun.

+

Fe shares similar syntax with the popular languages Rust and Python, easing the learning curve for new users. It also implements the best features from Rust to limit dynamic behaviour while also maximizing expressiveness, meaning you can write clean, readable code without sacrificing compile time guarantees.

+

Fe is:

+
    +
  • statically typed
  • +
  • expressive
  • +
  • compiled using Yul
  • +
  • built to a detailed language specification
  • +
  • able to limit dynamic behaviour
  • +
  • rapidly evolving!
  • +
+

Who is Fe for?

+

Fe is for anyone that develops using the EVM!

+

Fe compiles to EVM bytecode that can be deployed directly onto Ethereum and EVM-equivalent blockchains.

+

Fe's syntax will feel familiar to Rust and Python developers.

+

Here's what a minimal contract looks like in Fe:

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+      self.messages[ctx.msg_sender()] = book_msg
+  }
+}
+
+

What problems does Fe solve?

+

One of the pain points with smart contract languages is that there can be ambiguities in how the compiler translates the human readable code into EVM bytecode. This can lead to security flaws and unexpected behaviours.

+

The details of the EVM can also cause the higher level languages to be less intuitive and harder to master than some other languages. These are some of the pain points Fe aims to solve. By striving to maximize both human readability and bytecode predictability, Fe will provide an enhanced developer experience for everyone working with the EVM.

+

Get Started

+

You can read much more information about Fe in these docs. If you want to get building, you can begin with our Quickstart guide.

+

You can also get involved in the Fe community by contributing code or documentation to the project Github or joining the conversation on Discord. Learn more on our Contributing page.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/mark.min.js b/docs/mark.min.js new file mode 100644 index 0000000000..1636231883 --- /dev/null +++ b/docs/mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** +* mark.js v8.11.1 +* https://markjs.io/ +* Copyright (c) 2014–2018, Julian Kühnel +* Released under the MIT license https://git.io/vwTVl +*****************************************************/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c + + + + + The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+



+
Fe logo
+

What is Fe?

+

Fe is the next generation smart contract language for Ethereum.

+

Fe is a smart contract language that strives to make developing Ethereum smart contract development safer, simpler and more fun.

+

Smart contracts are programs executed by a computer embedded into Ethereum clients known as the Ethereum Virtual Machine (EVM). The EVM executes bytecode instructions that are not human readable. Therefore, developers use higher-level languages that compiles to EVM bytecode.

+

Fe is one of these languages.

+

Why Fe?

+

Fe aims to make writing secure smart contract code a great experience. With Fe, writing safe code feels natural and fun.

+

Fe shares similar syntax with the popular languages Rust and Python, easing the learning curve for new users. It also implements the best features from Rust to limit dynamic behaviour while also maximizing expressiveness, meaning you can write clean, readable code without sacrificing compile time guarantees.

+

Fe is:

+
    +
  • statically typed
  • +
  • expressive
  • +
  • compiled using Yul
  • +
  • built to a detailed language specification
  • +
  • able to limit dynamic behaviour
  • +
  • rapidly evolving!
  • +
+

Who is Fe for?

+

Fe is for anyone that develops using the EVM!

+

Fe compiles to EVM bytecode that can be deployed directly onto Ethereum and EVM-equivalent blockchains.

+

Fe's syntax will feel familiar to Rust and Python developers.

+

Here's what a minimal contract looks like in Fe:

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+      self.messages[ctx.msg_sender()] = book_msg
+  }
+}
+
+

What problems does Fe solve?

+

One of the pain points with smart contract languages is that there can be ambiguities in how the compiler translates the human readable code into EVM bytecode. This can lead to security flaws and unexpected behaviours.

+

The details of the EVM can also cause the higher level languages to be less intuitive and harder to master than some other languages. These are some of the pain points Fe aims to solve. By striving to maximize both human readability and bytecode predictability, Fe will provide an enhanced developer experience for everyone working with the EVM.

+

Get Started

+

You can read much more information about Fe in these docs. If you want to get building, you can begin with our Quickstart guide.

+

You can also get involved in the Fe community by contributing code or documentation to the project Github or joining the conversation on Discord. Learn more on our Contributing page.

+

Quickstart

+

Let's get started with Fe!

+

In this section you will learn how to write and deploy your first contract.

+ +

Download and install Fe

+

Before you dive in, you need to download and install Fe. +For this quickstart you should simply download the binary from fe-lang.org.

+

Then change the name and file permissions:

+
mv fe_amd64 fe
+chmod +x fe
+
+

Now you are ready to do the quickstart tutorial!

+

For more detailed information on installing Fe, or to troubleshoot, see the Installation page in our user guide.

+

Write your first Fe contract

+

Now that we have the compiler installed let's write our first contract. A contract contains the code that will be deployed to the Ethereum blockchain and resides at a specific address.

+

The code of the contract dictates how:

+
    +
  • it manipulates its own state
  • +
  • interacts with other contracts
  • +
  • exposes external APIs to be called from other contracts or users
  • +
+

To keep things simple we will just write a basic guestbook where people can leave a message associated with their Ethereum address.

+
+

Note: Real code would not instrument the Ethereum blockchain in such a way as it is a waste of precious resources. This code is for demo purposes only.

+
+

Create a guest_book.fe file

+

Fe code is written in files ending on the .fe file extension. Let's create a file guest_book.fe and put in the following content.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+}
+
+

Here we're using a map to associate messages with Ethereum addresses. +The messages will simply be a string of a maximum length of 100 written as String<100>. +The addresses are represented by the builtin address type.

+

Execute ./fe build guest_book.fe to compile the file. The compiler tells us that it compiled our contract and that it has put the artifacts into a subdirectory called output.

+
Compiled guest_book.fe. Outputs in `output`
+
+

If we examine the output directory we'll find a subdirectory GuestBook with a GuestBook_abi.json and a GuestBook.bin file.

+
├── fe
+├── guest_book.fe
+└── output
+    └── GuestBook
+        ├── GuestBook_abi.json
+        └── GuestBook.bin
+
+

The GuestBook_abi.json is a JSON representation that describes the binary interface of our contract but since our contract doesn't yet expose anything useful its content for now resembles an empty array.

+

The GuestBook.bin is slightly more interesting containing what looks like a gibberish of characters which in fact is the compiled binary contract code written in hexadecimal characters.

+

We don't need to do anything further yet with these files that the compiler produces but they will become important when we get to the point where we want to deploy our code to the Ethereum blockchain.

+

Add a method to sign the guest book

+

Let's focus on the functionality of our world changing application and add a method to sign the guestbook.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+      self.messages[ctx.msg_sender()] = book_msg
+  }
+}
+
+

In Fe, every method that is defined without the pub keyword becomes private. Since we want people to interact with our contract and call the sign method we have to prefix it with pub.

+

Let's recompile the contract again and see what happens.

+
Failed to write output to directory: `output`. Error: Directory 'output' is not empty. Use --overwrite to overwrite.
+
+

Oops, the compiler is telling us that the output directory is a non-empty directory and plays it safe by asking us if we are sure that we want to overwrite it. We have to use the --overwrite flag to allow the compiler to overwrite what is stored in the output directory.

+

Let's try it again with ./fe build guest_book.fe --overwrite.

+

This time it worked and we can also see that the GuestBook_abi.json has become slightly more interesting.

+
[
+  {
+    "name": "sign",
+    "type": "function",
+    "inputs": [
+      {
+        "name": "book_msg",
+        "type": "bytes100"
+      }
+    ],
+    "outputs": []
+  }
+]
+
+

Since our contract now has a public sign method the corresponding ABI has changed accordingly.

+

Add a method to read a message

+

To make the guest book more useful we will also add a method get_msg to read entries from a given address.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+      self.messages[ctx.msg_sender()] = book_msg
+  }
+
+  pub fn get_msg(self, addr: address) -> String<100> {
+      return self.messages[addr]
+  }
+}
+
+

However, we will hit another error as we try to recompile the current code.

+
Unable to compile guest_book.fe.
+error: value must be copied to memory
+  ┌─ guest_book.fe:10:14
+  │
+8 │       return self.messages[addr]
+  │              ^^^^^^^^^^^^^^^^^^^ this value is in storage
+  │
+  = Hint: values located in storage can be copied to memory using the `to_mem` function.
+  = Example: `self.my_array.to_mem()`
+
+

When we try to return a reference type such as an array from the storage of the contract we have to explicitly copy it to memory using the to_mem() function.

+
+

Note: In the future Fe will likely introduce immutable storage pointers which might affect these semantics.

+
+

The code should compile fine when we change it accordingly.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+      self.messages[ctx.msg_sender()] = book_msg
+  }
+
+  pub fn get_msg(self, addr: address) -> String<100> {
+      return self.messages[addr].to_mem()
+  }
+}
+
+

Congratulations! You finished your first little Fe project. 👏 +In the next chapter we will learn how to deploy our code and tweak it a bit further.

+

Deploy your contract.

+

Prerequisites

+

You should have compiled the GuestBook contract and have both Guestbook_abi.json and GuestBook.bin available in your outputs folder. +If you don't have any of these components, please revisit Write your first contract.

+

Introduction

+

When you develop smart contracts it is common to test them on local blockchains first because they are quick and easy to create and it doesn't matter if you make mistakes - there is nothing of real value secured by the blockchain as it only exists on your computer. Later, you can deploy your contract on a public test network to see how it behaves in a more realistic environment where other developers are also testing their code. Finally, when you are very confident that your contract is ready, you can deploy to Ethereum Mainnet (or one of its live Layer-2 networks). Once the contract is deployed on a "live" network, you are handling assets with real-world value!

+

In this guide, you will deploy your contract to a local blockchain. This will be an "ephemeral" blockchain, meaning it is completely destroyed every time you shut it down and recreated from scratch every time you start it up - it won't save its state when you shut it down. The benefit of this is quick and easy development, and you don't need to find test ETH to pay gas fees. Later in the guide, you will learn how to deploy to a live public test network too.

+

Your developer environment

+

Everything in this tutorial can be done by sending JSON data directly to an Ethereum node. However, this is often awkward and error-prone, so a rich ecosystem of tooling has been developed to allow developers to interact with Ethereum in familiar languages or using abstractions that simplify the process.

+

In this guide, you will use Foundry which is a very lightweight set of command-line tools for managing smart contract development. If you already have Foundry installed, head straight to the next section. If you need to install Foundry, head to getfoundry.sh and follow the installation steps.

+
+

Note: If you are a seasoned smart contract developer, feel free to follow the tutorial using your own toolchain.

+
+

Deploying to a local network

+

Foundry has its own local network called Anvil. You can use it to create a local blockchain on your computer. Open a terminal and run the following very simple command:

+
anvil 
+
+

You will see some ASCII art and configuration details in the terminal. Anvil creates a set of accounts that you can use on this network. The account addresses and private keys are displayed in the console (never use these accounts to interact with any live network). You will also see a line reading listening on 127.0.0.1:8545. This indicates that your local node is listening for HTTP traffic on your local network on port 8545 - this is important because this is how you will send the necessary information to your node so that it can be added to the blockchain, and how you will interact with the contract after it is deployed.

+
+

Note: Anvil needs to keep running throughout this tutorial - if you close the terminal your blockchain will cease to exist. Once Anvil has started, open a new terminal tab/window to run the rest of the commands in this guide.

+
+

Making the deployment transaction

+

In the previous guide you wrote the following contract, and compiled it using ./fe build guest_book.fe --overwrite to obtain the contract bytecode. This compilation stage converts the human-readable Fe code into a format that can be efficiently executed by Ethereum's embedded computer, known as the Ethereum Virtual Machine (EVM). The bytecode is stored at an address on the blockchain. The contract functions are invoked by sending instructions in a transaction to that address.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+    self.messages[ctx.msg_sender()] = book_msg
+  }
+
+  pub fn get_msg(self, addr: address) -> String<100> {
+    return self.messages[addr].to_mem()
+  }
+}
+
+

To make the deployment, we will need to send a transaction to your node via its exposed HTTP port (8545).

+

The following command deploys the Guestbook contract to your local network. Grab the private key of one of your accounts from the information displayed in the terminal running Anvil.

+
cast send --rpc-url localhost:8545 --private-key <your-private-key> --create $(cat output/GuestBook/GuestBook.bin)
+
+

Here's what the response was at the time of writing this tutorial.

+
blockHash               0xcee9ff7c0b57822c5f6dd4fbd3a7e9eadb594b84d770f56f393f137785a52702
+blockNumber             1
+contractAddress         0x5FbDB2315678afecb367f032d93F642f64180aa3
+cumulativeGasUsed       196992
+effectiveGasPrice       4000000000
+gasUsed                 196992
+logs                    []
+logsBloom               0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+root                    
+status                  1
+transactionHash         0x3fbde2a994bf2dec8c11fb0390e9d7fbc0fa1150f5eab8f33c130b4561052622
+transactionIndex        0
+type                    2
+
+

This response tells you that your contract has been deployed to the blockchain. The transaction was included in block number 1, and the address it was deployed to is provided in the contractAddress field - you need this address to interact with the contract.

+
+

Note: Don't assume responses to be identical when following the tutorial. Due to the nature of the blockchain environment the content of the responses will always differ slightly.

+
+

Signing the guest book

+

Now that the contract is deployed to the blockchain, you can send a transaction to sign it with a custom message. You will sign it from the same address that was used to deploy the contract, but there is nothing preventing you from using any account for which you have the private key (you could experiment by signing from all ten accounts created by Anvil, for example).

+

The following command will send a transaction to call sign(string) on our freshly deployed Guestbook contract sitting at address 0x810cbd4365396165874c054d01b1ede4cc249265 with the message "We <3 Fe".

+
cast send --rpc-url http://localhost:8545 --private-key <your-private-key> <contract-address> "sign(string)" '"We <3 Fe"'
+
+

The response will look approximately as follows:

+
blockHash               0xb286898484ae737d22838e27b29899b327804ec45309e47a75b18cfd7d595cc7
+blockNumber             2
+contractAddress         
+cumulativeGasUsed       36278
+effectiveGasPrice       3767596722
+gasUsed                 36278
+logs                    []
+logsBloom               0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+root                    
+status                  1
+transactionHash         0x309bcea0a77801c15bb7534beab9e33dcb613c93cbea1f12d7f92e4be5ecab8c
+transactionIndex        0
+type                    2
+
+

Reading the signatures

+

The get_msg(address) API allows you to read the messages added to the guestbook for a given address. It will give us a response of 100 zero bytes for any address that hasn't yet signed the guestbook.

+

Since reading the messages doesn't change any state within the blockchain, you don't have to send an actual transaction. Instead, you can perform a call against the local state of the node that you are querying.

+

To do that run:

+
$ cast call --rpc-url http://localhost:8545 <contract-address> "get_msg(address)" <your-account-address-that-signed-the-guestbook>
+
+

Notice that the command doesn't need to provide a private key simply because we are not sending an actual transaction.

+

The response arrives in the form of hex-encoded bytes padded with zeroes:

+
0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000
+
+

Foundry provides a built-in method to convert this hex string into human-readable ASCII. You can do this as follows:

+
cast to_ascii "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000"
+
+

or simply pipe the output of the cast call to to_ascii to do the query and conversion in a single command:

+
cast call --rpc-url https://rpc.sepolia.org <contract-address> "get_msg(address)" <your-account-address-that-signed-the-guestbook> | cast --to-ascii
+
+

Either way, the response will be the message you passed to the sign(string) function.

+
"We <3 Fe"
+
+

Congratulations! You've deployed real Fe code to a local blockchain! 🤖

+

Deploying to a public test network

+

Now you have learned how to deploy your contract to a local blockchain, you can consider deploying it to a public test network too. For more complex projects this can be very beneficial because it allows many users to interact with your contract, simulates real network conditions and allows you to interact with other existing contracts on the network. However, to use a public testnet you need to obtain some of that testnet's gas token.

+

In this guide you will use the Sepolia test network, meaning you will need some SepoliaETH. SepoliaETH has no real-world value - it is only required to pay gas fees on the network. If you don't have any SepoliaETH yet, you can request some SepoliaETH from one of the faucets that are listed on the ethereum.org website.

+
+

IMPORTANT: It is good practice to never use an Ethereum account for a testnet that is also used for the actual Ethereum mainnet.

+
+

Assuming you have some SepoliaETH, you can repeat the steps from the local blockchain example, however, instead of pointing Foundry to the RPC endpoint for your Anvil node, you need to point it to a node connected to the Sepolia network. There are several options for this:

+
    +
  • If you run your own node, connect it to the Sepolia network and let it sync. make sure you expose an http port or enable IPC transport.
  • +
  • You can use an RPC provider such as Alchemy or Infura
  • +
  • You can use an open public node such as https://rpc.sepolia.org.
  • +
+

Whichever method you choose, you will have an RPC endpoint for a node connected to Sepolia. You can replace the http://localhost:8545 in the commands with your new endpoint. For example, to deploy the contract using the open public endpoint:

+
cast send --rpc-url https://rpc.sepolia.org --private-key <your-private-key> --create $(cat output/GuestBook/GuestBook.bin)
+
+

Now you have deployed the contract to a public network and anyone can interact with it.

+

To demonstrate, you can check out previous versions of this contract deployed on Sepolia in the past:

+
+ + +
addresslink
deploy tx hash0x31b41a4177d7eb66f5ea814959b2c147366b6323f17b6f7060ecff424b58df76etherscan
contract address0x810cbd4365396165874C054d01B1Ede4cc249265etherscan
+
+

Note that calling the sign(string) function will cost you some SepoliaETH because the function changes the state of the blockchain (it adds a message to the contract storage). However, get_msg(address) does not cost any gas because it is a simple lookup in the node's local database.

+

Congratulations! You've deployed real Fe code to a live network 🤖

+

Summary

+

Well done!

+

You have now written and compiled a Fe contract and deployed it to both a local blockchain and a live public test network! You also learned how to interact with the deployed contract using transactions and calls.

+

Here's some ideas for what you could do next:

+
    +
  • Experiment with different developer tooling
  • +
  • Get more comfortable with Foundry by exploring the documentation
  • +
  • Repeat the steps in this guide but for a more complex contract - be creative!
  • +
  • Continue to the Using Fe pages to explore Fe more deeply.
  • +
+

User guide

+

Welcome to the Fe user guide!

+

Here you can find information about how to use Fe to develop smart contracts.

+

Read more about:

+ +

We are still building this section of the site, but you can expect to find other materials such as reference documentation, project examples and walkthrough guides here soon!

+

Installation

+

At this point Fe is available for Linux and MacOS natively but can also be installed on Windows via WSL.

+
+

Note: If you happen to be a Windows developer, consider getting involved +and help us to support the Windows platform natively. Here would be a good place to start.

+
+

On a computer with MacOS and an ARM chip, you need to install Rosetta, Apple's x86-to-ARM translator, to be able to run the executable.

+
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
+
+

Package managers

+

Fe can be installed from Homebrew. Homebrew is available for Mac, Linux and Windows (via WSL). The following command installs Fe and exposes it as fe without any further configuration necessary:

+
brew install fe-lang/tap/fe
+
+

Download the compiler

+

Fe is distributed via a single executable file linked from the home page. In the future we will make sure it can be installed through a variety of popular package managers such as apt.

+

Depending on your operating system, the file that you download is either named fe_amd64 or fe_mac.

+
+

Note: We will rename the file to fe and assume that name for the rest of the guide. In the future when Fe can be installed via other mechanisms we can assume fe to become the canonical command name.

+
+

Add permission to execute

+

In order to be able to execute the Fe compiler we will have to make the file executable. This can be done by navigating to the directory where the file is located and executing chmod + x <filename> (e.g. chmod +x fe).

+

After we have set the proper permissions we should be able to run ./fe and an output that should be roughly comparable to:

+
fe 0.21.0-alpha
+The Fe Developers <snakecharmers@ethereum.org>
+An implementation of the Fe smart contract language
+
+USAGE:
+    fe_amd64_latest <SUBCOMMAND>
+
+OPTIONS:
+    -h, --help       Print help information
+    -V, --version    Print version information
+
+SUBCOMMANDS:
+    build    Build the current project
+    check    Analyze the current project and report errors, but don't build artifacts
+    help     Print this message or the help of the given subcommand(s)
+    new      Create new fe project
+
+

Building from source

+

You can also build Fe from the source code provided in our Github repository. To do this you will need to have Rust installed. Then, clone the github repository using:

+
git clone https://github.com/ethereum/fe.git
+
+

Depending on your environment you may need to install some additional packages before building the Fe binary, specifically libboost-all-dev, libclang and cmake. For example, on a Linux system:

+
sudo apt-get update &&\
+ apt-get install libboost-all-dev &&\
+ apt-get install libclang-dev &&\
+ apt-get install cmake
+
+

Navigate to the folder containing the Fe source code.

+
cd fe
+
+

Now, use Rust to build the Fe binary. To run Fe, you need to build using solc-backend.

+
cargo build -r --feature solc-backend
+
+

You will now find your Fe binary in /target/release. Check the build with:

+
./target/release/fe --version
+
+

If everything worked, you should see the Fe version printed to the terminal:

+
fe 0.24.0
+
+

You can run the built-in tests using:

+
cargo test --workspace --features solc-backend
+
+

Editor support & Syntax highlighting

+

Fe is a new language and editor support is still in its early days. However, basic syntax highlighting is available for Visual Studio Code via this VS Code extension.

+

In Visual Studio Code open the extension sidebar (Ctrl-Shift-P / Cmd-Shift-P, then "Install Extension") and search for fe-lang.code-ve. Click on the extension and then click on the Install button.

+

We are currently working on a Language Server Protocol (LSP), which in the future will enable more advanced editor features such as code completion, go-to definition and refactoring.

+

Fe projects

+

A project is a collection of files containing Fe code and configuration data. Often, smart contract development can become too complex to contain all the necessary code inside a single file. In these cases, it is useful to organize your work into multiple files and directories. This allows you to group thematically linked code and selectively import the code you need when you need it.

+

Creating a project

+

You can start a project using the new subcommand:

+

$ fe new <my_project>

+

This will generate a template project containing the following:

+
    +
  • A src directory containing two .fe files.
  • +
  • A fe.toml manifest with basic project info and some local project imports.
  • +
+

Manifest

+

The fe.toml file is known as a manifest. The manifest is written in TOML format. The purpose of this file is to provide all the metadata that is required for the project to compile. The file begins with definitions for the project name and version, then the project dependencies are listed under a heading [dependencies]. Dependencies are files in the local filesystem that are required for your project to run.

+

For example:

+
name="my-project"
+version = "1.0"
+
+[dependencies]
+dependency_1 = "../lib"
+
+

You can also specify which version of a particular dependency you want to use, using curly braces:

+
name="my-project"
+version = "1.0"
+
+[dependencies]
+dependency_1 = {path = "../lib", version = "1.0"}
+
+

Project modes

+

There are two project modes: main and lib.

+

Main projects can import libraries and have code output.

+

Libraries on the other hand cannot import main projects and do not have code outputs. Their purpose is to be imported into other projects.

+

The mode of a project is determined automatically by the presence of either src/main.fe or src/lib.fe.

+

Importing

+

You can import code from external files with the following syntax:

+
#![allow(unused)]
+fn main() {
+use utils::get_42
+}
+

This will import the get_42 function from the file utils.fe.

+

You can also import using a custom name/alias:

+
#![allow(unused)]
+fn main() {
+use utils::get_42 as get_42
+}
+

Tests

+

The templates created using fe new include a simple test demonstrating the test syntax.

+

To write a unit test, create a function with a name beginning with test_. The function should instantiate your contract and call the contract function you want to test. You can use assert to check that the returned value matches an expected value.

+

For example, to test the say_hello function on Contract which is expected to return the string "hello":

+
#![allow(unused)]
+fn main() {
+fn test_contract(mut ctx: Context) {
+    let contract: Contract = Contract.create(ctx, 0)
+    assert main.say_hello() == "hello"
+}
+}
+

You can run all the tests in a project by running the following command:

+
fe test <project-root>
+
+

You will receive test results directly to the console.

+

Running your project

+

Once you have created a project, you can run the usual Fe CLI subcommands against the project path.

+

Tutorials

+

Welcome to the Tutorials section. We will be adding walkthrough guides for example Fe projects here!

+

For now, you can get started with:

+ +

Watch this space for more tutorials coming soon!

+

Auction contract

+

This tutorial aims to implement a simple auction contract in Fe. Along the way you will learn some foundational Fe concepts.

+

An open auction is one where prices are determined in real-time by live bidding. The winner is the participant who has made the highest bid at the time the auction ends.

+

The auction rules

+

To run an open auction, you need an item for sale, a seller, a pool of buyers and a deadline after which no more bids will be recognized. In this tutorial we will not have an item per se, the buyers are simply bidding to win! The highest bidder is provably crowned the winner, and the value of their bid is passed to the beneficiary. Bidders can also withdraw their bids at any time.

+

Get Started

+

To follow this guide you should have Fe installed on your computer. If you haven't installed Fe yet, follow the instructions on the Installation page.

+

With Fe installed, you can create a project folder, auction that will act as your project root. In that folder, create an empty file called auction.fe.

+

Now you are ready to start coding in Fe!

+

You will also need Foundry installed to follow the deployment instructions in this guide - you can use your alternative tooling for this if you prefer.

+

Writing the Contract

+

You can see the entire contract here. You can refer back to this at any time to check implementation details.

+

Defining the Contract and initializing variables

+

A contract in Fe is defined using the contract keyword. A contract requires a constructor function to initialize any state variables used by the contract. If no constructor is defined, Fe will add a default with no state variables. The skeleton of the contract can look as follows:

+
#![allow(unused)]
+fn main() {
+contract Auction {
+    pub fn __init__() {}
+}
+}
+

To run the auction you will need several state variables, some of which can be initialized at the time the contract is instantiated. +You will need to track the address of the beneficiary so you know who to pay out to. You will also need to keep track of the highest bidder, and the amount they have bid. You will also need to keep track of how much each specific address has sent into the contract, so you can refund them the right amount if they decide to withdraw. You will also need a flag that tracks whether or not the auction has ended. The following list of variables will suffice:

+
auction_end_time: u256
+beneficiary: address
+highest_bidder: address
+highest_bid: u256
+pending_returns: Map<address, u256>
+ended: bool
+
+

Notice that variables are named using snake case (lower case, underscore separated, like_this). +Addresses have their own type in Fe - it represents 20 hex-encoded bytes as per the Ethereum specification.

+

The variables that expect numbers are given the u256 type. This is an unsigned integer of length 256 bits. There are other choices for integers too, with both signed and unsigned integers between 8 and 256 bits in length.

+

The ended variable will be used to check whether the auction is live or not. If it has finished ended will be set to true. There are only two possible states for this, so it makes sense to declare it as a bool - i.e. true/false.

+

The pending_returns variable is a mapping between N keys and N values, with user addresses as the keys and their bids as values. For this, a Map type is used. In Fe, you define the types for the key and value in the Map definition - in this case, it is Map<address, u256>. Keys can be any numeric type, address, boolean or unit.

+

Now you should decide which of these variables will have values that are known at the time the contract is instantiated. It makes sense to set the beneficiary right away, so you can add that to the constructor arguments.

+

The other thing to consider here is how the contract will keep track of time. On its own, the contract has no concept of time. However, the contract does have access to the current block timestamp which is measured in seconds since the Unix epoch (Jan 1st 1970). This can be used to measure the time elapsed in a smart contract. In this contract, you can use this concept to set a deadline on the auction. By passing a length of time in seconds to the constructor, you can then add that value to the current block timestamp and create a deadline for bidding to end. Therefore, you should add a bidding_time argument to the constructor. Its type can be u256.

+

When you have implemented all this, your contract should look like this:

+
contract Auction {
+    // states
+    auction_end_time: u256
+    beneficiary: address
+    highest_bidder: address
+    highest_bid: u256
+    pending_returns: Map<address, u256>
+    ended: bool
+
+    // constructor
+    pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) {
+        self.beneficiary = beneficiary_addr
+        self.auction_end_time = ctx.block_timestamp() + bidding_time
+    }
+}
+
+

Notice that the constructor receives values for bidding_time and beneficiary_addr and uses them to initialize the contract's auction_end_time and beneficiary variables.

+

The other thing to notice about the constructor is that there are two additional arguments passed to the constructor: mut self and ctx: Context.

+

self

+

self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. 'self' in the context of classes in Python, or this in Javascript.

+

Here, you are not only using self but you are prepending it with mut. mut is a keyword inherited from Rust that indicates that the value can be overwritten - i.e. it is "mutable". Variables are not mutable by default - this is a safety feature that helps protect developers from unintended changes during runtime. If you do not make self mutable, then you will not be able to update the values it contains.

+

Context

+

Context is used to gate access to certain features including emitting logs, creating contracts, reading messages and transferring ETH. It is conventional to name the context object ctx. The Context object needs to be passed as the first parameter to a function unless the function also takes self, in which case the Context object should be passed as the second parameter. Context must be explicitly made mutable if it will invoke functions that changes the blockchain data, whereas an immutable reference to Context can be used where read-only access to the blockchain is needed.

+

Read more on Context in Fe

+

In Fe contracts ctx is where you can find transaction data such as msg.sender, msg.value, block.timestamp etc.

+

Bidding

+

Now that you have your contract constructor and state variables, you can implement some logic for receiving bids. To do this, you will create a method called bid. To handle a bid, you will first need to determine whether the auction is still open. If it has closed then the bid should revert. If the auction is open you need to record the address of the bidder and the amount and determine whether their bid was the highest. If their bid is highest, then their address should be assigned to the highest_bidder variable and the amount they sent recorded in the highest_bid variable.

+

This logic can be implemented as follows:

+
#![allow(unused)]
+fn main() {
+pub fn bid(mut self, mut ctx: Context) {
+    if ctx.block_timestamp() > self.auction_end_time {
+        revert AuctionAlreadyEnded()
+    }
+    if ctx.msg_value() <= self.highest_bid {
+        revert BidNotHighEnough(highest_bid: self.highest_bid)
+    }
+    if self.highest_bid != 0 {
+        self.pending_returns[self.highest_bidder] += self.highest_bid
+    }
+    self.highest_bidder = ctx.msg_sender()
+    self.highest_bid = ctx.msg_value()
+
+    ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))
+}
+}
+

The method first checks that the current block timestamp is not later than the contract's aution_end_time variable. If it is later, then the contract reverts. This is triggered using the revert keyword. The revert can accept a struct that becomes encoded as revert data. Here you can just revert without any arguments. Add the following definition somewhere in Auction.fe outside the main contract definition:

+
struct AuctionAlreadyEnded {
+}
+
+

The next check is whether the incoming bid exceeds the current highest bid. If not, the bid has failed and it may as well revert. We can repeat the same logic as for AuctionAlreadyEnded. We can also report the current highest bid in the revert message to help the user reprice if they want to. Add the following to auction.fe:

+
struct BidNotHighEnough {
+    pub highest_bid: u256
+}
+
+
+

Notice that the value being checked is msg.value which is included in the ctx object. ctx is where you can access incoming transaction data.

+
+

Next, if the incoming transaction is the highest bid, you need to track how much the sender should receive as a payout if their bid ends up being exceeded by another user (i.e. if they get outbid, they get their ETH back). To do this, you add a key-value pair to the pending_returns mapping, with the user address as the key and the transaction amount as the value. Both of these come from ctx in the form of msg.sender and msg.value.

+

Finally, if the incoming bid is the highest, you can emit an event. Events are useful because they provide a cheap way to return data from a contract as they use logs instead of contract storage. Unlike other smart contract languages, there is no emit keyword or Event type. Instead, you trigger an event by calling the emit method on the ctx object. You can pass this method a struct that defines the emitted message. You can add the following struct for this event:

+
struct HighestBidIncreased {
+    #indexed
+    pub bidder: address
+    pub amount: u256
+}
+
+

You have now implemented all the logic to handle a bid!

+

Withdrawing

+

A previous high-bidder will want to retrieve their ETH from the contract so they can either walk away or bid again. You therefore need to create a withdraw method that the user can call. The function will lookup the user address in pending_returns. If there is a non-zero value associated with the user's address, the contract should send that amount back to the sender's address. It is important to first update the value in pending_returns and then send the ETH to the user, otherwise you are exposing a re-entrancy vulnerability (where a user can repeatedly call the contract and receive the ETH multiple times).

+

Add the following to the contract to implement the withdraw method:

+
#![allow(unused)]
+fn main() {
+pub fn withdraw(mut self, mut ctx: Context) -> bool {
+    let amount: u256 = self.pending_returns[ctx.msg_sender()]
+
+    if amount > 0 {
+        self.pending_returns[ctx.msg_sender()] = 0
+        ctx.send_value(to: ctx.msg_sender(), wei: amount)
+    }
+    return true
+}
+}
+
+

Note that in this case mut is used with ctx because send_value is making changes to the blockchain (it is moving ETH from one address to another).

+
+

End the auction

+

Finally, you need to add a way to end the auction. This will check whether the bidding period is over, and if it is, automatically trigger the payment to the beneficiary and emit the address of the winner in an event.

+

First, check the auction is not still live - if the auction is live you cannot end it early. If an attempt to end the auction early is made, it should revert using a AuctionNotYetEnded struct, which can look as follows:

+
struct AuctionNotYetEnded {
+}
+
+

You should also check whether the auction was already ended by a previous valid call to this method. In this case, revert with a AuctionEndAlreadyCalled struct:

+
struct AuctionEndAlreadyCalled {}
+
+

If the auction is still live, you can end it. First set self.ended to true to update the contract state. Then emit the event using ctx.emit(). Then, send the ETH to the beneficiary. Again, the order is important - you should always send value last to protect against re-entrancy. +Your method can look as follows:

+
#![allow(unused)]
+fn main() {
+pub fn action_end(mut self, mut ctx: Context) {
+    if ctx.block_timestamp() <= self.auction_end_time {
+        revert AuctionNotYetEnded()
+    }
+    if self.ended {
+        revert AuctionEndAlreadyCalled()
+    }
+    self.ended = true
+    ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid))
+
+    ctx.send_value(to: self.beneficiary, wei: self.highest_bid)
+}
+}
+

Congratulations! You just wrote an open auction contract in Fe!

+

View functions

+

To help test the contract without having to decode transaction logs, you can add some simple functions to the contract that simply report the current values for some key state variables (specifically, highest_bidder, highest_bid and ended). This will allow a user to use eth_call to query these values in the contract. eth_call is used for functions that do not update the state of the blockchain and costs no gas because the queries can be performed on local data.

+

You can add the following functions to the contract:

+
#![allow(unused)]
+fn main() {
+pub fn check_highest_bidder(self) -> address {
+    return self.highest_bidder;
+}
+
+pub fn check_highest_bid(self) -> u256 {
+    return self.highest_bid;
+}
+
+pub fn check_ended(self) -> bool {
+    return self.ended;
+}
+}
+

Build and deploy the contract

+

Your contract is now ready to use! Compile it using

+
fe build auction.fe
+
+

You will find the contract ABI and bytecode in the newly created outputs directory.

+

Start a local blockchain to deploy your contract to:

+
anvil
+
+

There are constructor arguments (bidding_time: u256, beneficiary_addr: address) that have to be added to the contract bytecode so that the contract is instantiated with your desired values. To add constructor arguments you can encode them into bytecode and append them to the contract bytecode.

+

First, hex encode the value you want to pass to bidding_time. In this case, we will use a value of 10:

+
cast --to_hex(10)
+
+>> 0xa // this is 10 in hex
+
+

Ethereum addresses are already hex, so there is no further encoding required. The following command will take the constructor function and the hex-encoded arguments and concatenate them into a contiguous hex string and then deploy the contract with the constructor arguments.

+
cast send --from <your-address> --private-key <your-private-key> --create $(cat output/Auction/Auction.bin) $(cast abi-encode "__init__(uint256,address)" 0xa 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720)
+
+

You will see the contract address reported in your terminal.

+

Now you can interact with your contract. Start by sending an initial bid, let's say 100 ETH. For contract address 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35:

+
cast send 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "bid()" --value "100ether" --private-key <your-private-key> --from 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
+
+

You can check whether this was successful by calling the check_highest_bidder() function:

+
cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "check_highest_bidder()"
+
+

You will see a response looking similar to:

+
0x000000000000000000000000a0Ee7A142d267C1f36714E4a8F75612F20a79720
+
+

The characters after the leading zeros are the address for the highest bidder (notice they match the characters after the 0x in the bidding address).

+

You can do the same to check the highest bid:

+
cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "check_highest_bid()"
+
+

This returns:

+
0x0000000000000000000000000000000000000000000000056bc75e2d63100000
+
+

Converting the non-zero characters to binary gives the decimal value of your bid (in wei - divide by 1e18 to get the value in ETH):

+
cast --to-dec 56bc75e2d63100000
+
+>> 100000000000000000000 // 100 ETH in wei
+
+

Now you can repeat this process, outbidding the initial bid from another address and check the highest_bidder() and highest_bid() to confirm. Do this a few times, then call end_auction() to see the value of the highest bid get transferred to the beneficiary_addr. You can always check the balance of each address using:

+
cast balance <address>
+
+

And check whether the auction open time has expired using

+
cast <contract-address> "check_ended()"
+
+

Summary

+

Congratulations! You wrote an open auction contract in Fe and deployed it to a local blockchain!

+

If you are using a local Anvil blockchain, you can use the ten ephemeral addresses created when the network started to simulate a bidding war!

+

By following this tutorial, you learned:

+
    +
  • basic Fe types, such as bool, address, map and u256
  • +
  • basic Fe styles, such as snake case for variable names
  • +
  • how to create a contract with a constructor
  • +
  • how to revert
  • +
  • how to handle state variables
  • +
  • how to avoid reentrancy
  • +
  • how to use ctx to handle transaction data
  • +
  • how to emit events using ctx.emit
  • +
  • how to deploy a contract with constructor arguments using Foundry
  • +
  • how to interact with your contract
  • +
+

Example Contracts

+ +
// errors
+struct AuctionAlreadyEnded {
+}
+
+struct AuctionNotYetEnded {
+}
+
+struct AuctionEndAlreadyCalled {}
+
+struct BidNotHighEnough {
+    pub highest_bid: u256
+}
+
+// events
+struct HighestBidIncreased {
+    #indexed
+    pub bidder: address
+    pub amount: u256
+}
+
+struct AuctionEnded {
+    #indexed
+    pub winner: address
+    pub amount: u256
+}
+
+contract Auction {
+    // states
+    auction_end_time: u256
+    beneficiary: address
+
+    highest_bidder: address
+    highest_bid: u256
+
+    pending_returns: Map<address, u256>
+
+    ended: bool
+
+    // constructor
+    pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) {
+        self.beneficiary = beneficiary_addr
+        self.auction_end_time = ctx.block_timestamp() + bidding_time
+    }
+
+    //method
+    pub fn bid(mut self, mut ctx: Context) {
+        if ctx.block_timestamp() > self.auction_end_time {
+            revert AuctionAlreadyEnded()
+        }
+        if ctx.msg_value() <= self.highest_bid {
+            revert BidNotHighEnough(highest_bid: self.highest_bid)
+        }
+        if self.highest_bid != 0 {
+            self.pending_returns[self.highest_bidder] += self.highest_bid
+        }
+        self.highest_bidder = ctx.msg_sender()
+        self.highest_bid = ctx.msg_value()
+
+        ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))
+    }
+
+    pub fn withdraw(mut self, mut ctx: Context) -> bool {
+        let amount: u256 = self.pending_returns[ctx.msg_sender()]
+
+        if amount > 0 {
+            self.pending_returns[ctx.msg_sender()] = 0
+            ctx.send_value(to: ctx.msg_sender(), wei: amount)
+        }
+        return true
+    }
+
+    pub fn auction_end(mut self, mut ctx: Context) {
+        if ctx.block_timestamp() <= self.auction_end_time {
+            revert AuctionNotYetEnded()
+        }
+        if self.ended {
+            revert AuctionEndAlreadyCalled()
+        }
+        self.ended = true
+        ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid))
+
+        ctx.send_value(to: self.beneficiary, wei: self.highest_bid)
+    }
+
+    pub fn check_highest_bidder(self) -> address {
+        return self.highest_bidder;
+    }
+
+    pub fn check_highest_bid(self) -> u256 {
+        return self.highest_bid;
+    }
+
+    pub fn check_ended(self) -> bool {
+        return self.ended;
+    }
+}
+
+

Useful external links

+

There are not many resources for Fe outside of the official documentation at this time. This section lists useful links to external resources.

+

Tools

+ +

Projects

+
    +
  • Bountiful - Bug bounty platform written in Fe, live on Mainnet
  • +
  • Simple DAO - A Simple DAO written in Fe - live on Mainnet and Optimism
  • +
+

Hackathon projects

+

These are community projects written in Fe at various hackathons.

+
    +
  • +

    Fixed-Point Numerical Library - A fixed-point number representation and mathematical operations tailored for Fe. It can be used in financial computations, scientific simulations, and data analysis.

    +
  • +
  • +

    p256verifier - Secp256r1 (a.k.a p256) curve signature verifier which allows for verification of a P256 signature in fe.

    +
  • +
  • +

    Account Storage with Efficient Sparse Merkle Trees - Efficient Sparse Merkle Trees in Fe! SMTs enable inclusion and exclusion proofs for the entire set of Ethereum addresses.

    +
  • +
  • +

    Tic Tac Toe - An implementation of the classic tic tac toe game in Fe with a Python frontend.

    +
  • +
  • +

    Fecret Santa - Fecret Santa is an onchain Secret Santa event based on a "chain": gift a collectible (ERC721 or ERC1155) to the last Santa and you'll be the next to receive a gift!

    +
  • +
  • +

    Go do it - A commitment device to help you achieve your goals.

    +
  • +
  • +

    Powerbald - On chain lottery written in Fe

    +
  • +
  • +

    sspc-flutter-fe - Stupid Simple Payment Channel written in Fe

    +
  • +
+

Others

+ +

Blog posts

+ +

Videos

+ +

Development

+

Read how to become a Fe developer.

+ +

Build and test

+

Please make sure Rust is installed.

+

Basic

+

The following commands only build the Fe -> Yul compiler components.

+
    +
  • build the CLI: cargo build
  • +
  • test: cargo test --workspace
  • +
+

Full

+

The Fe compiler depends on the Solidity compiler for transforming Yul IR to EVM bytecode. We currently use solc-rust to perform this. In order to compile solc-rust, the following must be installed on your system:

+
    +
  • cmake
  • +
  • boost(1.65+)
  • +
  • libclang
  • +
+
    brew install boost
+
+

Once these have been installed, you may run the full build. This is enabled using the solc-backend feature.

+
    +
  • build the CLI: cargo build --features solc-backend
  • +
  • test: cargo test --workspace --features solc-backend
  • +
+

Release

+

Versioning

+

Make sure that version follows semver rules e.g (0.23.0).

+

Generate Release Notes

+

Prerequisite: Release notes are generated with towncrier. Ensure to have towncrier installed and the command is available.

+

Run make notes version=<version> where <version> is the version we are generating the release notes for e.g. 0.23.0.

+

Example:

+
make notes version=0.23.0
+
+

Examine the generated release notes and if needed perform and commit any manual changes.

+

Generate the release

+

Run make release version=<version>.

+

Example:

+
make release version=0.23.0
+
+

This will also run the tests again as the last step because some of them may need to be adjusted because of the changed version number.

+

Tag and push the release

+

Prerequisite: Make sure the central repository is configured as upstream, not origin.

+

After the tests are adjusted run make push-tag to create the tag and push it to Github.

+

Manually edit the release on GitHub

+

Running the previous command will push a new tag to Github and cause the CI to create a release with the Fe binaries attached. We may want to edit the release afterwards to put in some verbiage about the release.

+

Updating Docs & Website

+

A release of a new Fe compiler should usually go hand in hand with updating the website and documentation. For one, the front page of fe-lang.org links to the download of the compiler but won't automatically pick up the latest release without a fresh deployment. Furthermore, if code examples and other docs needed to be updated along with compiler changes, these updates are also only reflected online when the site gets redeployed. This is especially problematic since our docs do currently not have a version switcher to view documentation for different compiler versions (See GitHub issue #543).

+

Preview the sites locally

+

Run make serve-website and visit http://0.0.0.0:8000 to preview it locally. Ensure the front page displays the correct compiler version for download and that the docs render correctly.

+

Deploy website & docs

+

Prerequisite: Make sure the central repository is configured as upstream, not origin.

+

Run make deploy-website and validate that fe-lang.org renders the updated sites (Can take up to a few minutes).

+

Fe Standard Library

+

The standard library includes commonly used algorithms and data structures that come bundled as part of the language.

+ +

Precompiles

+

Precompiles are EVM functions that are prebuilt and optimized as part of the Fe standard library. There are currently nine precompiles available in Fe. The first four precompiles were defined in the original Ethereum Yellow Paper (ec_recover, SHA2_256, ripemd_160, identity). Four more were added during the Byzantium fork (mod_exp, ec_add, ec_mul and ec_pairing). A final precompile, blake2f was added in EIP-152 during the Istanbul fork.

+

The nine precompiles available in the Fe standard library are:

+ +

These precompiles are imported as follows:

+
use std::precompiles
+
+

ec_recover

+

ec_recover is a cryptographic function that retrieves a signer's address from a signed message. It is the fundamental operation used for verifying signatures in Ethereum. Ethereum uses the Elliptic Curve Digital Signature Algorithm (ECDSA) for verifying signatures. This algorithm uses two parameters, r and s. Ethereum's implementation also uses an additional 'recovery identifier' parameter, v, which is used to identify the correct elliptic curve point from those that can be calculated from r and s alone.

+

Parameters

+
    +
  • hash: the hash of the signed message, u256
  • +
  • v: the recovery identifier, a number in the range 27-30, u256
  • +
  • r: elliptic curve parameter, u256
  • +
  • s: elliptic curve parameter, u256
  • +
+

Returns

+

ec_recover returns an address.

+

Function signature

+
pub fn ec_recover(hash: u256, v: u256, r: u256, s: u256) -> address
+
+

Example

+
let result: address = precompiles::ec_recover(
+    hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3,
+    v: 28,
+    r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608,
+    s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada
+)
+
+

SHA2_256

+

SHA2_256 is a hash function. a hash function generates a unique string of characters of fixed length from arbitrary input data.

+

Parameters

+
    +
  • buf: a sequence of bytes to hash, MemoryBuffer
  • +
+

Returns

+

SHA2_256 returns a hash as a u256

+

Function signature

+
pub fn sha2_256(buf input_buf: MemoryBuffer) -> u256
+
+

Example

+
let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)
+let result: u256 = precompiles::sha2_256(buf)
+
+

ripemd_160

+

ripemd_160 is a hash function that is rarely used in Ethereum, but is included in many crypto libraries as it is used in Bitcoin core.

+

Parameters

+
    +
  • input_buf: a sequence of bytes to hash, MemoryBuffer
  • +
+

Returns

+

ripemd_160 returns a hash as a u256

+

Function signature

+
pub fn ripemd_160(buf input_buf: MemoryBuffer) -> u256
+
+
+

Example

+
let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)
+let result: u256 = precompiles::ripemd_160(buf)
+
+

identity

+

identity is a function that simply echoes the input of the function as its output. This can be used for efficient data copying.

+

Parameters

+
    +
  • input_buf: a sequence of bytes to hash, MemoryBuffer
  • +
+

Returns

+

identity returns a sequence of bytes, MemoryBuffer

+

Function signature

+
pub fn identity(buf input_buf: MemoryBuffer) -> MemoryBuffer
+
+
+

Example

+
let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0x42)
+let mut result: MemoryBufferReader = precompiles::identity(buf).reader()
+
+

mod_exp

+

mod_exp is a modular exponentiation function required for elliptic curve operations.

+

Parameters

+
    +
  • b: MemoryBuffer: the base (i.e. the number being raised to a power), MemoryBuffer
  • +
  • e: MemoryBuffer: the exponent (i.e. the power b is raised to), MemoryBuffer
  • +
  • m: MemoryBuffer: the modulus, MemoryBuffer
  • +
  • b_size: u256: the length of b in bytes, u256
  • +
  • e_size: u256: the length of e in bytes, u256
  • +
  • m_size: u256: then length of m in bytes, u256
  • +
+

Returns

+

mod_exp returns a sequence of bytes, MemoryBuffer

+

Function signature

+
pub fn mod_exp(
+    b_size: u256,
+    e_size: u256,
+    m_size: u256,
+    b: MemoryBuffer,
+    e: MemoryBuffer,
+    m: MemoryBuffer,
+) -> MemoryBuffer
+
+
+

Example

+
let mut result: MemoryBufferReader = precompiles::mod_exp(
+    b_size: 1,
+    e_size: 1,
+    m_size: 1,
+    b: MemoryBuffer::from_u8(value: 8),
+    e: MemoryBuffer::from_u8(value: 9),
+    m: MemoryBuffer::from_u8(value: 10),
+).reader()
+
+

ec_add

+

ec_add does point addition on elliptic curves.

+

Parameters

+
    +
  • x1: x-coordinate 1, u256
  • +
  • y1: y coordinate 1, u256
  • +
  • x2: x coordinate 2, u256
  • +
  • y2: y coordinate 2, u256
  • +
+

Function signature

+
pub fn ec_add(x1: u256, y1: u256, x2: u256, y2: u256)-> (u256,u256)
+
+

Returns

+

ec_add returns a tuple of u256, (u256, u256).

+

Example

+
let (x, y): (u256, u256) = precompiles::ec_add(x1: 1, y1: 2, x2: 1, y2: 2)
+
+

ec_mul

+

ec_mul is for multiplying elliptic curve points.

+

Parameters

+
    +
  • x: x-coordinate, u256
  • +
  • y: y coordinate, u256
  • +
  • s: multiplier, u256
  • +
+

Function signature

+
pub fn ec_mul(x: u256, y: u256, s: u256)-> (u256,u256)
+
+

Returns

+

ec_mul returns a tuple of u256, (u256, u256).

+

Example

+
let (x, y): (u256, u256) = precompiles::ec_mul(
+    x: 1,
+    y: 2,
+    s: 2
+)
+
+

ec_pairing

+

ec_pairing does elliptic curve pairing - a form of encrypted multiplication.

+

Parameters

+
    +
  • input_buf: sequence of bytes representing the result of the elliptic curve operation (G1 * G2) ^ k, as MemoryBuffer
  • +
+

Returns

+

ec_pairing returns a bool indicating whether the pairing is satisfied (true) or not (false).

+

Example

+
    let mut input_buf: MemoryBuffer = MemoryBuffer::new(len: 384)
+    let mut writer: MemoryBufferWriter = buf.writer()
+
+    writer.write(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da)
+    writer.write(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6)
+    writer.write(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc)
+    writer.write(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9)
+    writer.write(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90)
+    writer.write(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e)
+    writer.write(value: 0x0000000000000000000000000000000000000000000000000000000000000001)
+    writer.write(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45)
+    writer.write(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4)
+    writer.write(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7)
+    writer.write(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2)
+    writer.write(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc)
+
+    assert precompiles::ec_pairing(buf)
+}
+
+

blake_2f

+

blake_2f is a compression algorithm for the cryptographic hash function BLAKE2b. It takes as an argument the state vector h, message block vector m, offset counter t, final block indicator flag f, and number of rounds rounds. The state vector provided as the first parameter is modified by the function.

+

Parameters

+
    +
  • h: the state vector, Array<u64, 8>
  • +
  • m: message block vector, Array<u64, 16>
  • +
  • t: offset counter, Array<u64, 2>
  • +
  • f: bool
  • +
  • rounds: number of rounds of mixing, u32
  • +
+

Returns

+

blake_2f returns a modified state vector, Array<u64, 8>

+

Function signature

+
pub fn blake_2f(rounds: u32, h: Array<u64, 8>, m: Array<u64, 16>, t: Array<u64, 2>, f: bool) ->  Array<u64, 8>
+
+

Example

+
let result: Array<u64, 8> = precompiles::blake_2f(
+    rounds: 12,
+    h: [
+        0x48c9bdf267e6096a,
+        0x3ba7ca8485ae67bb,
+        0x2bf894fe72f36e3c,
+        0xf1361d5f3af54fa5,
+        0xd182e6ad7f520e51,
+        0x1f6c3e2b8c68059b,
+        0x6bbd41fbabd9831f,
+        0x79217e1319cde05b,
+    ],
+    m: [
+        0x6162630000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+    ],
+    t: [
+        0x0300000000000000,
+        0x0000000000000000,
+    ],
+    f: true
+)
+
+

Fe Language Specification

+
+ Warning: This is a work in progress document. It is incomplete and specifications aren't stable yet. +
+ +

Notation

+

Grammar

+

The following notations are used by the Lexer and Syntax grammar snippets:

+
+ + + + + + + + + + + + + + +
NotationExamplesMeaning
CAPITALKW_IFA token produced by the lexer
ItalicCamelCaseItemA syntactical production
stringx, while, *The exact character(s)
\x\n, \r, \t, \0The character represented by this escape
x?pub?An optional item
x*OuterAttribute*0 or more of x
x+MacroMatch+1 or more of x
xa..bHEX_DIGIT1..6a to b repetitions of x
|u8 | u16, Block | ItemEither one or another
[ ][b B]Any of the characters listed
[ - ][a-z]Any of the characters in the range
~[ ]~[b B]Any characters, except those listed
~string~\n, ~*/Any characters, except this sequence
( )(, Parameter)Groups items
+

Lexical Structure

+ +

Keywords

+

Fe divides keywords into two categories:

+ +

Strict keywords

+

These keywords can only be used in their correct contexts. They cannot +be used as the identifiers.

+
+

Lexer:
+KW_AS : as
+KW_BREAK : break
+KW_CONST : const
+KW_CONTINUE : continue
+KW_CONST : contract
+KW_FN : fn
+KW_ELSE : else
+KW_ENUM : enum
+KW_EVENT : event
+KW_FALSE : false
+KW_FOR : for
+KW_IDX : idx
+KW_IF : if
+KW_IN : in
+KW_LET : let
+KW_MATCH : match
+KW_MUT : mut
+KW_NONPAYABLE : nonpayable
+KW_PAYABLE : payable
+KW_PUB : pub
+KW_RETURN : return
+KW_REVERT : revert
+KW_SELFVALUE : self
+KW_STRUCT : struct
+KW_TRUE : true
+KW_USE : use
+KW_WHILE : while
+KW_ADDRESS : address

+
+

Reserved keywords

+

These keywords aren't used yet, but they are reserved for future use. They have +the same restrictions as strict keywords. The reasoning behind this is to make +current programs forward compatible with future versions of Fe by forbidding +them to use these keywords.

+
+

Lexer:
+KW_ABSTRACT : abstract
+KW_ASYNC : async
+KW_AWAIT : await
+KW_DO : do
+KW_EXTERNAL : external
+KW_FINAL : final
+KW_IMPL : impl
+KW_MACRO : macro
+KW_OVERRIDE : override
+KW_PURE : pure
+KW_SELFTYPE : Self
+KW_STATIC : static
+KW_SUPER : super
+KW_TRAIT : trait
+KW_TYPE : type
+KW_TYPEOF : typeof
+KW_VIEW : view
+KW_VIRTUAL : virtual
+KW_WHERE : where
+KW_YIELD : yield

+
+

Identifiers

+
+

Lexer:
+IDENTIFIER_OR_KEYWORD :
+      [a-z A-Z] [a-z A-Z 0-9 _]*
+   | _ [a-z A-Z 0-9 _]+ +Except a strict or reserved keyword

+
+

An identifier is any nonempty ASCII string of the following form:

+

Either

+
    +
  • The first character is a letter.
  • +
  • The remaining characters are alphanumeric or _.
  • +
+

Or

+
    +
  • The first character is _.
  • +
  • The identifier is more than one character. _ alone is not an identifier.
  • +
  • The remaining characters are alphanumeric or _.
  • +
+

Tokens

+

NEWLINE

+

A token that represents a new line.

+

Literals

+

A literal is an expression consisting of a single token, rather than a sequence +of tokens, that immediately and directly denotes the value it evaluates to, +rather than referring to it by name or some other evaluation rule. A literal is +a form of constant expression, so is evaluated (primarily) at compile time.

+

Examples

+

Strings

+
+ +
ExampleCharactersEscapes
String"hello"ASCII subsetQuote & ASCII
+
+

ASCII escapes

+
+ + + + +
Name
\nNewline
\rCarriage return
\tTab
\\Backslash
+
+

Quote escapes

+
+ +
Name
\"Double quote
+
+

Numbers

+
+ + + + +
Number literals*Example
Decimal integer98_222
Hex integer0xff
Octal integer0o77
Binary integer0b1111_0000
+
+

* All number literals allow _ as a visual separator: 1_234

+

Boolean literals

+
+

Lexer
+BOOLEAN_LITERAL :
+   true | false

+
+

String literals

+
+

Lexer
+STRING_LITERAL :
+   " (
+      PRINTABLE_ASCII_CHAR
+      | QUOTE_ESCAPE
+      | ASCII_ESCAPE
+   )* "

+

PRINTABLE_ASCII_CHAR :
+   Any ASCII character between 0x1F and 0x7E

+

QUOTE_ESCAPE :
+   \"

+

ASCII_ESCAPE :
+   | \n | \r | \t | \\

+
+

A string literal is a sequence of any characters that are in the set of +printable ASCII characters as well as a set of defined escape sequences.

+

Line breaks are allowed in string literals.

+

Integer literals

+
+

Lexer
+INTEGER_LITERAL :
+   ( DEC_LITERAL | BIN_LITERAL | OCT_LITERAL | HEX_LITERAL )

+

DEC_LITERAL :
+   DEC_DIGIT (DEC_DIGIT|_)*

+

BIN_LITERAL :
+   0b (BIN_DIGIT|_)* BIN_DIGIT (BIN_DIGIT|_)*

+

OCT_LITERAL :
+   0o (OCT_DIGIT|_)* OCT_DIGIT (OCT_DIGIT|_)*

+

HEX_LITERAL :
+   0x (HEX_DIGIT|_)* HEX_DIGIT (HEX_DIGIT|_)*

+

BIN_DIGIT : [0-1]

+

OCT_DIGIT : [0-7]

+

DEC_DIGIT : [0-9]

+

HEX_DIGIT : [0-9 a-f A-F]

+
+

An integer literal has one of four forms:

+
    +
  • A decimal literal starts with a decimal digit and continues with any +mixture of decimal digits and underscores.
  • +
  • A hex literal starts with the character sequence U+0030 U+0078 +(0x) and continues as any mixture (with at least one digit) of hex digits +and underscores.
  • +
  • An octal literal starts with the character sequence U+0030 U+006F +(0o) and continues as any mixture (with at least one digit) of octal digits +and underscores.
  • +
  • A binary literal starts with the character sequence U+0030 U+0062 +(0b) and continues as any mixture (with at least one digit) of binary digits +and underscores.
  • +
+

Examples of integer literals of various forms:

+
123                      // type u256
+0xff                     // type u256
+0o70                     // type u256
+0b1111_1111_1001_0000    // type u256
+0b1111_1111_1001_0000i64 // type u256
+
+

Comments

+
+

Lexer
+LINE_COMMENT :
+      // *

+
+

Items

+ +

Visibility and Privacy

+

These two terms are often used interchangeably, and what they are attempting to convey is the answer to the question "Can this item be used at this location?"

+

Fe knows two different types of visibility for functions and state variables: public and private. Visibility of private is the default and is used if no other visibility is specified.

+

Public: External functions are part of the contract interface, which means they can be called from other contracts and via transactions.

+

Private: Those functions and state variables can only be accessed internally from within the same contract. This is the default visibility.

+

For example, this is a function that can be called externally from a transaction:

+
pub fn answer_to_life_the_universe_and_everything() -> u256 {
+    return 42
+}
+
+

Top-level definitions in a Fe source file can also be specified as pub if the file exists within the context of an Ingot. Declaring a definition as pub enables other modules within an Ingot to use the definition.

+

For example, given an Ingot with the following structure:

+
example_ingot
+└── src
+    ├── ding
+    │   └── dong.fe
+    └── main.fe
+
+

With ding/dong.fe having the following contents:

+
pub struct Dang {
+    pub my_address: address
+    pub my_u256: u256
+    pub my_i8: i8
+}
+
+

Then main.fe can use the Dang struct since it is pub-qualified:

+
use ding::dong::Dang
+
+contract Foo {
+    pub fn hot_dang() -> Dang {
+        return Dang(
+            my_address: 8,
+            my_u256: 42,
+            my_i8: -1
+        )
+    }
+}
+
+

Structs

+
+

Syntax
+Struct :
+   struct IDENTIFIER {
+      StructField*
+      StructMethod*
+   }

+

StructField :
+   pub? IDENTIFIER : Type

+

StructMethod :
+   Function

+
+

A struct is a nominal struct type defined with the keyword struct.

+

An example of a struct item and its use:

+
struct Point {
+    pub x: u256
+    pub y: u256
+}
+
+fn pointy_stuff() {
+    let mut p: Point = Point(x: 10, y: 11)
+    let px: u256 = p.x
+    p.x = 100
+}
+
+

Builtin functions:

+
    +
  • abi_encode() encodes the struct as an ABI tuple and returns the encoded data as a fixed-size byte array that is equal in size to the encoding.
  • +
+

Traits

+
+

Syntax
+Trait :
+   trait IDENTIFIER {
+      TraitMethod*
+   }

+

TraitMethod :
+   fn IDENTIFIER
+      ( FunctionParameters? )
+      FunctionReturnType? ;

+
+

A trait is a collection of function signatures that a type can implement. Traits are implemented for specific types through separate implementations. A type can implement a trait by providing a function body for each of the trait's functions. Traits can be used as type bounds for generic functions to restrict the types that can be used with the function.

+

All traits define an implicit type parameter Self that refers to "the type that is implementing this interface".

+

Example of the Min trait from Fe's standard library:

+
pub trait Min {
+  fn min() -> Self;
+}
+
+

Example of the i8 type implementing the Min trait:

+
impl Min for i8 {
+  fn min() -> Self {
+    return -128
+  }
+}
+
+

Example of a function restricting a generic parameter to types implementing the Compute trait:

+
pub trait Compute {
+  fn compute(self) -> u256;
+}
+
+struct Example {
+  fn do_something<T: Compute>(val: T) -> u256 {
+    return val.compute()
+  }
+}
+
+

Enum

+
+

Syntax
+Enumeration :
+   enum IDENTIFIER {
+      EnumField*
+      EnumMethod*
+   }

+

EnumField :
+   IDENTIFIER | IDENTIFIER(TupleElements?)

+

EnumMethod :
+   Function

+

TupleElements :
+   Type ( , Type )*

+
+

An enum, also referred to as enumeration is a simultaneous definition of a +nominal Enum type, that can be used to create or pattern-match values of the corresponding type.

+

Enumerations are declared with the keyword enum.

+

An example of an enum item and its use:

+
enum Animal {
+    Dog
+    Cat
+    Bird(BirdType)
+    
+    pub fn bark(self) -> String<10> {
+        match self {
+            Animal::Dog => {
+                return "bow"
+            }
+
+            Animal::Cat => {
+                return "meow"
+            }
+            
+            Animal::Bird(BirdType::Duck) => {
+                return "quack"
+            }
+            
+            Animal::Bird(BirdType::Owl) => {
+                return "hoot"
+            }
+        }
+    }
+}
+
+enum BirdType {
+    Duck
+    Owl
+}
+
+fn f() {
+    let barker: Animal = Animal::Dog
+    barker.bark()
+}
+
+

Type aliases

+
+

Syntax
+TypeAlias :
+   type IDENTIFIER = Type

+
+

A type alias defines a new name for an existing type. Type aliases are +declared with the keyword type.

+

For example, the following defines the type BookMsg as a synonym for the type +u8[100], a sequence of 100 u8 numbers which is how sequences of bytes are represented in Fe.

+
type BookMsg = Array<u8, 100>
+
+

Contracts

+
+

Syntax
+Contract :
+   contract IDENTIFIER {
+  ContractMember*
+  _}

+

ContractMember:
+   Visibility?
+   (
+         ContractField
+      | Function
+      | Struct
+      | Enum
+   )

+

Visibility :
+   pub?

+

ContractField :
+   IDENTIFIER : Type

+
+

A contract is a piece of executable code stored at an address on the blockchain. See Appendix A. in the Yellow Paper for more info. Contracts can be written in high level languages, like Fe, and then compiled to EVM bytecode for deployment to the blockchain.

+

Once the code is deployed to the blockchain, the contract's functions can be invoked by sending a transaction to the contract address (or a call, for functions that do not modify blockchain data).

+

In Fe, contracts are defined in files with .fe extensions and compiled using fe build.

+

A contract is denoted using the contract keyword. A contract definition adds a new contract type to the module. This contract type may be used for calling existing contracts with the same interface or initializing new contracts with the create methods.

+

An example of a contract:

+
struct Signed {
+    pub book_msg: String<100>
+}
+
+contract GuestBook {
+    messages: Map<address, String<100>>
+
+    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
+        self.messages[ctx.msg_sender()] = book_msg
+        ctx.emit(Signed(book_msg: book_msg))
+    }
+
+    pub fn get_msg(self, addr: address) -> String<100> {
+        return self.messages[addr].to_mem()
+    }
+}
+
+

Multiple contracts can be compiled from a single .fe contract file.

+

pragma

+

An optional pragma statement can be placed at the beginning of a contract. They are used to enable developers to express that certain code is meant to be compiled with a specific compiler version such that non-matching compiler versions will reject it.

+

Read more on pragma

+

State variables

+

State variables are permanently stored in the contract storage on the blockchain. State variables must be declared inside the contract body but outside the scope of any individual contract function.

+
pub contract Example {
+    some_number: u256
+    _some_string: String<100>
+}
+
+

Contract functions

+

Functions are executable blocks of code. Contract functions are defined inside the body of a contract, but functions defined at module scope (outside of any contract) can be called from within a contract as well.

+

Individual functions can be called internally or externally depending upon their visibility (either private or public).

+

Functions can modify either (or neither) the contract instance or the blockchain. This can be inferred from the function signature by the presence of combinations of mut, self and Context. If a function modifies the contract instance it requires mut self as its first argument. If a function modifies the blockchain it requires Context as an argument.

+

Read more on functions.

+

The __init__() function

+

The __init__ function is a special contract function that can only be called at contract deployment time. It is mostly used to set initial values to state variables upon deployment. In other contexts, __init__() is commonly referred to as the constructor function.

+
pub contract Example {
+
+    _some_number: u256
+    _some_string: String<100>
+
+    pub fn __init__(mut self, number: u256, string: String<100>)  {
+        self._some_number=number;
+        self._some_string=string;
+    }
+}
+
+

It is not possible to call __init__ at runtime.

+

Structs

+

Structs might also exist inside a contract file. These are declared outside of the contract body and are used to define a group of variables that can be used for some specific purpose inside the contract. In Fe structs are also used to represent an Event or an Error.

+

Read more on structs.

+

Functions

+

Constant size values stored on the stack or in memory can be passed into and returned by functions.

+
+

Syntax
+Function :
+   FunctionQualifiers fn IDENTIFIER
+      ( FunctionParameters? )
+      FunctionReturnType?
+      {
+      FunctionStatements*
+      }

+

FunctionQualifiers :
+   pub?

+

FunctionStatements :
+         ReturnStatement
+      | VariableDeclarationStatement
+      | AssignStatement
+      | AugmentedAssignStatement
+      | ForStatement
+      | WhileStatement
+      | IfStatement
+      | AssertStatement
+      | BreakStatement
+      | ContinueStatement
+      | RevertStatement
+      | Expression

+

FunctionParameters :
+   self? | self,? FunctionParam (, FunctionParam)* ,?

+

FunctionParam :
+   FunctionParamLabel? IDENTIFIER : Types

+

FunctionParamLabel :
+   _ | IDENTIFIER

+

FunctionReturnType :
+   -> Types

+
+

A function definition consists of name and code block along with an optional +list of parameters and return value. Functions are declared with the +keyword fn. Functions may declare a set of input parameters, +through which the caller passes arguments into the function, and +the output type of the value the function will return to its caller +on completion.

+

When referred to, a function yields a first-class value of the +corresponding zero-sized function type, which +when called evaluates to a direct call to the function.

+

A function header prepends a set or curly brackets {...} which contain the function body.

+

For example, this is a simple function:

+
fn add(x: u256, y: u256) -> u256 {
+    return x + y
+}
+
+

Functions can be defined inside of a contract, inside of a struct, or at the +"top level" of a module (that is, not nested within another item).

+

Example:

+
fn add(_ x: u256, _ y: u256) -> u256 {
+    return x + y
+}
+
+contract CoolCoin {
+    balance: Map<address, u256>
+
+    fn transfer(mut self, from sender: address, to recipient: address, value: u256) -> bool {
+        if self.balance[sender] < value {
+            return false
+        }
+        self.balance[sender] -= value
+        self.balance[recipient] += value
+        return true
+    }
+    pub fn demo(mut self) {
+        let ann: address = 0xaa
+        let bob: address = 0xbb
+        self.balance[ann] = 100
+
+        let bonus: u256 = 2
+        let value: u256 = add(10, bonus)
+        let ok: bool = self.transfer(from: ann, to: bob, value)
+    }
+}
+
+

Function parameters have optional labels. When a function is called, the +arguments must be labeled and provided in the order specified in the +function definition.

+

The label of a parameter defaults to the parameter name; a different label +can be specified by adding an explicit label prior to the parameter name. +For example:

+
fn encrypt(msg cleartext: u256, key: u256) -> u256 {
+    return cleartext ^ key
+}
+
+fn demo() {
+    let out: u256 = encrypt(msg: 0xdecafbad, key: 0xfefefefe)
+}
+
+

Here, the first parameter of the encrypt function has the label msg, +which is used when calling the function, while the parameter name is +cleartext, which is used inside the function body. The parameter name +is an implementation detail of the function, and can be changed without +modifying any function calls, as long as the label remains the same.

+

When calling a function, a label can be omitted when the argument is +a variable with a name that matches the parameter label. Example:

+
let msg: u256 = 0xdecafbad
+let cyf: u256 = encrypt(msg, key: 0x1234)
+
+

A parameter can also be specified to have no label, by using _ in place of a +label in the function definition. In this case, when calling the function, the +corresponding argument must not be labeled. Example:

+
fn add(_ x: u256, _ y: u256) -> u256 {
+    return x + y
+}
+fn demo() {
+    let sum: u256 = add(16, 32)
+}
+
+

Functions defined inside of a contract or struct may take self as a +parameter. This gives the function the ability to read and write contract +storage or struct fields, respectively. If a function takes self +as a parameter, the function must be called via self. For example:

+
let ok: bool = self.transfer(from, to, value)
+
+

self is expected to come first parameter in the function's parameter list.

+

Functions can also take a Context object which gives access to EVM features that read or write +blockchain and transaction data. Context is expected to be first in the function's parameter list +unless the function takes self, in which case Context should come second.

+

Context

+

Context is used frequently in Fe smart contracts. It is used to gate access to EVM features for reading and modifying the blockchain.

+

Rationale

+

Smart contracts execute on the Ethereum Virtual Machine (EVM). The EVM exposes features that allow smart contracts to query or change some of the blockchain data, for example emitting logs that are included in transaction receipts, creating contracts, obtaining the current block number and altering the data stored at certain addresses.

+

To make Fe maximally explicit and as easy as possible to audit, these functions are gated behind a Context object. This is passed as an argument to functions, making it clear whether a function interacts with EVM features from the function signature alone.

+

For example, the following function looks pure from its signature (i.e. it is not expected to alter any blockchain data) but in reality it does modify the blockchain (by emitting a log).

+
pub fn looks_pure_but_isnt() {
+  // COMPILE ERROR
+  block_number()
+}
+
+

Using Context to control access to EVM functions such as emit solves this problem by requiring an instance of Context to be passed explicitly to the function, making it clear from the function signature that the function executes some blockchain interaction. The function above, rewritten using Context, looks as follows:

+
pub fn uses_context(ctx: Context) -> u256 {
+    return ctx.block_number()
+}
+
+

The Context object

+

The Context object gates access to features such as:

+
    +
  • emitting logs
  • +
  • creating contracts
  • +
  • transferring ether
  • +
  • reading message info
  • +
  • reading block info
  • +
+

The Context object needs to be passed as a parameter to the function. The Context object has a defined location in the parameter list. It is the first parameter unless the function also takes self. Context or self appearing at any other position in the parameter list causes a compile time error.

+

The Context object is automatically injected when a function is called externally but it has to be passed explicitly when the function is called from another Fe function e.g.

+
// The context object is automatically injected when this is called externally
+pub fn multiply_block_number(ctx: Context) -> u256 {
+  // but it has to be passed along in this function call
+  return retrieves_blocknumber(ctx) * 1000
+}
+
+fn retrieves_blocknumber(ctx: Context) -> u256 {
+  return ctx.block_number()
+}
+
+

Context mutability

+

All functionality that modifies the blockchain such as creating logs or contracts or transferring ether would require a mutable Context reference whereas read-only access such as ctx.block_number() does not need require a mutable reference to the context. To pass a mutable Context object, prepend the object name with mut in the function definition, e.g.:

+
struct SomeEvent{
+}
+
+pub fn mutable(mut ctx: Context) {
+    ctx.emit(SomeEvent())
+}
+
+

ABI conformity

+

The use of Context enables tighter rules and extra clarity compared wth the existing function categories in the ABI, especially when paired with self. The following table shows how combinations of self, mut self, Context and mut Context map to ABI function types.

+
+ + + + + + + + + +
CategoryCharacteristicsFe SyntaxABI
PureCan only operate on input arguments and not produce any information besides its return value. Can not take self and therefore has no access to things that would make it impurefoo(val: u256)pure
Read ContractReading information from the contract instance (broad definition includes reading constants from contract code)foo(self)view
Storage WritingWriting to contract storage (own or that of other contracts)foo(mut self)payable or nonpayable
Context ReadingReading contextual information from the blockchain (msg, block etc)foo(ctx: Context)view
Context ModifyingEmitting logs, transferring ether, creating contractsfoo(ctx: mut Context)payable or nonpayable
Read Contract & ContextReading information from the contract instance and Contextfoo(self, ctx:Context)view
Read Contract & write ContextReading information from the contract instance and modify Contextfoo(self, ctx: mut Context)view
Storage Writing & read ContextWriting to contract storage and read from Contextfoo(mut self, ctx: Context)payable or nonpayable
Storage Writing & write ContextWriting to contract storage and Contextfoo(mut self, ctx: mut Context)payable or nonpayable
+
+

This means Fe has nine different categories of function that can be derived from the function signatures that map to four different ABI types.

+

Examples

+

msg_sender and msg_value

+

Context includes information about inbound transactions. For example, the following function receives ether and adds the sender's address and the +transaction value to a mapping. No blockchain data is being changed, so Context does not need to be mutable.

+
#![allow(unused)]
+fn main() {
+// assumes existence of state variable named 'ledger' with type Map<address, u256>
+pub fn add_to_ledger(mut self, ctx: Context) {
+    self.ledger[ctx.msg_sender()] = ctx.msg_value();
+}
+}
+

Transferring ether

+

Transferring ether modifies the blockchain state, so it requires access to a mutable Context object.

+
pub fn send_ether(mut ctx: Context, _addr: address, amount: u256) {
+    ctx.send_value(to: _addr, wei: amount)
+}
+
+

create/create2

+

Creating a contract via create/create2 requires access to a mutable Context object because it modifies the blockchain state data:

+
#![allow(unused)]
+fn main() {
+pub fn creates_contract(ctx: mut Context):
+  ctx.create2(...)
+}
+

block number

+

Reading block chain information such as the current block number requires Context (but does not require it to be mutable).

+
pub fn retrieves_blocknumber(ctx: Context) {
+  ctx.block_number()
+}
+
+

Self

+

self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. self in the context of classes in Python, or this in Javascript. self gives access to constants from the contract code and state variables from contract storage.

+
+

Note: Here we focus on functions defined inside a contract, giving access to contract storage; however, self can also be used to read and write struct fields where functions are defined inside structs.

+
+

If a function takes self as a parameter, the function must be called via self. For example:

+
#![allow(unused)]
+fn main() {
+let ok: bool = self.transfer(from, to, value)
+}
+

Mutability

+

self is immutable and can be used for read-only operations on the contract storage (or struct fields). In order to write to the contract storage, you must use mut self. This makes the contract instance mutable and allows the contract storage to be updated.

+

Examples

+

Reading contract storage

+
contract example {
+
+    value: u256;
+
+    pub fn check_value(self) -> u256 {
+        return self.value;
+    }
+}
+
+

Writing contract storage

+
contract example {
+
+    value: u256;
+
+    pub fn update_value(mut self) {
+        self.value += 1;
+    }
+}
+
+

Statements

+ +

pragma statement

+
+

Syntax
+PragmaStatement :
+   pragma VersionRequirement

+

VersionRequirement :Following the semver implementation by cargo

+
+

The pragma statement is denoted with the keyword pragma. Evaluating a pragma +statement will cause the compiler to reject compilation if the version of the compiler does not conform to the given version requirement.

+

An example of a pragma statement:

+
pragma ^0.1.0
+
+

The version requirement syntax is identical to the one that is used by cargo (more info).

+

const statement

+
+

Syntax
+ConstStatement :
+   const IDENTIFIER: Type = Expression

+
+

A const statement introduces a named constant value. Constants are either directly inlined wherever they are used or loaded from the contract code depending on their type.

+

Example:

+
const TEN: u256 = 10
+const HUNDO: u256 = TEN * TEN
+
+contract Foo {
+  pub fn bar() -> u256 {
+    return HUNDO
+  }
+}
+
+

let statement

+
+

Syntax
+LetStatement :
+   let IDENTIFIER | TupleTarget : Type = Expression

+

TupleTarget :
+   ( TupleTargetItem (, TupleTargetItem) + )

+

TupleTargetItem :
+   IDENTIFIER | TupleTarget

+
+

A let statement introduces a new set of variables. Any variables introduced by a variable declaration are visible from the point of declaration until the end of the enclosing block scope.

+
+

Note: Support for nested tuples isn't yet implemented but can be tracked via this GitHub issue.

+
+

Example:

+
contract Foo {
+
+  pub fn bar() {
+    let val1: u256 = 1
+    let (val2):(u256) = (1,)
+    let (val3, val4):(u256, bool) = (1, false)
+    let (val5, val6, (val7, val8)):(u256, bool, (u256, u256)) = (1, false, (2, 4))
+  }
+}
+
+

Assignment statement

+
+

Syntax
+AssignmentStatement :
+   Expression = Expression

+
+

An assignment statement moves a value into a specified place. An assignment statement consists of an expression that holds a mutable place, followed by an equals sign (=) and a value expression.

+

Example:

+
contract Foo {
+  some_array: Array<u256, 10>
+
+
+  pub fn bar(mut self) {
+    let mut val1: u256 = 10
+    // Assignment of stack variable
+    val1 = 10
+
+    let mut values: (u256, u256) = (1, 2)
+    // Assignment of tuple item
+    values.item0 = 3
+
+    // Assignment of storage array slot
+    self.some_array[5] = 1000
+  }
+}
+
+

Augmenting Assignment statement

+
+

Syntax
+AssignmentStatement :
+      Expression = Expression
+   | Expression += Expression
+   | Expression -= Expression
+   | Expression %= Expression
+   | Expression **= Expression
+   | Expression <<= Expression
+   | Expression >>= Expression
+   | Expression |= Expression
+   | Expression ^= Expression
+   | Expression &= Expression

+
+

Augmenting assignment statements combine arithmetic and logical binary operators with assignment statements.

+

An augmenting assignment statement consists of an expression that holds a mutable place, followed by one of the arithmetic or logical binary operators, followed by an equals sign (=) and a value expression.

+

Example:

+
fn example() -> u8 {
+    let mut a: u8 = 1
+    let b: u8 = 2
+    a += b
+    a -= b
+    a *= b
+    a /= b
+    a %= b
+    a **= b
+    a <<= b
+    a >>= b
+    a |= b
+    a ^= b
+    a &= b
+    return a
+}
+
+

revert statement

+
+

Syntax
+RevertStatement :
+   revert Expression?

+
+

The revert statement is denoted with the keyword revert. Evaluating a revert +statement will cause to revert all state changes made by the call and return with an revert error to the caller. A revert statement may be followed by an expression that evaluates to a struct in which case the struct is encoded as revert data as defined by EIP-838.

+

An example of a revert statement without revert data:

+
contract Foo {
+    fn transfer(self, to: address, value: u256) {
+        if not self.in_whitelist(addr: to) {
+            revert
+        }
+        // more logic here
+    }
+
+    fn in_whitelist(self, addr: address) -> bool {
+        return false
+    }
+}
+
+

An example of a revert statement with revert data:

+
struct ApplicationError {
+    pub code: u8
+}
+
+contract Foo {
+    pub fn transfer(self, to: address, value: u256) {
+        if not self.in_whitelist(addr: to) {
+            revert ApplicationError(code: 5)
+        }
+        // more logic here
+    }
+
+    fn in_whitelist(self, addr: address) -> bool {
+        return false
+    }
+}
+
+

return statement

+
+

Syntax
+ReturnStatement :
+   return Expression?

+
+

The return statement is denoted with the keyword return. A return statement leaves the current function call with a return value which is either the value of the evaluated expression (if present) or () (unit type) if return is not followed by an expression explicitly.

+

An example of a return statement without explicit use of an expression:

+
contract Foo {
+    fn transfer(self, to: address, value: u256) {
+        if not self.in_whitelist(to) {
+            return
+        }
+    }
+
+    fn in_whitelist(self, to: address) -> bool {
+        // revert used as placeholder for actual logic
+        revert
+    }
+}
+
+

The above can also be written in a slightly more verbose form:

+
contract Foo {
+    fn transfer(self, to: address, value: u256) -> () {
+        if not self.in_whitelist(to) {
+            return ()
+        }
+    }
+
+    fn in_whitelist(self, to: address) -> bool {
+        // revert used as placeholder for actual logic
+        revert
+    }
+}
+
+

if statement

+
+

Syntax
+IfStatement :
+   if Expression{ +   (Statement | Expression)+
+   }
+   (else {
+   (Statement | Expression)+
+   })?

+
+

Example:

+
contract Foo {
+    pub fn bar(val: u256) -> u256 {
+        if val > 5 {
+            return 1
+        } else {
+            return 2
+        }
+    }
+}
+
+

The if statement is used for conditional execution.

+

for statement

+
+

Syntax
+ForStatement :
+   for IDENTIFIER in Expression {
+   (Statement | Expression)+
+   }

+
+

A for statement is a syntactic construct for looping over elements provided by an array type.

+

An example of a for loop over the contents of an array:

+

Example:

+
contract Foo {
+
+    pub fn bar(values: Array<u256, 10>) -> u256 {
+        let mut sum: u256 = 0
+        for i in values {
+            sum = sum + i
+        }
+        return sum
+    }
+}
+
+

while statement

+
+

Syntax
+WhileStatement :
+   while Expression {
+   (Statement | Expression)+
+   }

+
+

A while loop begins by evaluation the boolean loop conditional expression. If the loop conditional expression evaluates to true, the loop body block executes, then control returns to the loop conditional expression. If the loop conditional expression evaluates to false, the while expression completes.

+

Example:

+
contract Foo {
+
+    pub fn bar() -> u256 {
+        let mut sum: u256 = 0
+        while sum < 10 {
+            sum += 1
+        }
+        return sum
+    }
+}
+
+

break statement

+
+

Syntax
+BreakStatement :
+   break

+
+

The break statement can only be used within a for or while loop and causes the immediate termination of the loop.

+

If used within nested loops the break statement is associated with the innermost enclosing loop.

+

An example of a break statement used within a while loop.

+
contract Foo {
+
+    pub fn bar() -> u256 {
+        let mut sum: u256 = 0
+        while sum < 10 {
+            sum += 1
+
+            if some_abort_condition() {
+                break
+            }
+        }
+        return sum
+    }
+
+    fn some_abort_condition() -> bool {
+        // some complex logic
+        return true
+    }
+}
+
+

An example of a break statement used within a for loop.

+
contract Foo {
+
+    pub fn bar(values: Array<u256, 10>) -> u256 {
+        let mut sum: u256 = 0
+        for i in values {
+            sum = sum + i
+
+            if some_abort_condition() {
+                break
+            }
+        }
+        return sum
+    }
+
+    fn some_abort_condition() -> bool {
+        // some complex logic
+        return true
+    }
+}
+
+

continue statement

+
+

Syntax
+ContinueStatement :
+   continue

+
+

The continue statement can only be used within a for or while loop and causes the immediate termination of the current iteration, returning control to the loop head.

+

If used within nested loops the continue statement is associated with the innermost enclosing loop.

+

An example of a continue statement used within a while loop.

+
contract Foo {
+
+    pub fn bar() -> u256 {
+        let mut sum: u256 = 0
+        while sum < 10 {
+            sum += 1
+
+            if some_skip_condition() {
+                continue
+            }
+        }
+
+        return sum
+    }
+
+    fn some_skip_condition() -> bool {
+        // some complex logic
+        return true
+    }
+}
+
+

An example of a continue statement used within a for loop.

+
contract Foo {
+
+    pub fn bar(values: Array<u256, 10>) -> u256 {
+        let mut sum: u256 = 0
+        for i in values {
+            sum = sum + i
+
+            if some_skip_condition() {
+                continue
+            }
+        }
+        return sum
+    }
+
+    fn some_skip_condition() -> bool {
+        // some complex logic
+        return true
+    }
+}
+
+

match statement

+
+

Syntax
+MatchStatement :
+   match Expression {
+      ( Pattern => { Statement* } )+
+   }

+

Pattern :
+   PatternElem ( | PatternElem )*

+

PatternElem :
+   IDENTIFIER | BOOLEAN_LITERAL | _ | .. | Path |
+   Path( TuplePatterns? ) |( TuplePatterns? ) |
+   Path{ StructPatterns? }

+

TuplePatterns :
+   Pattern ( , Pattern )*

+

StructPatterns :
+   Field ( , Field)*(, ..)?

+

Field :
+   IDENTIFIER : Pattern

+
+

A match statements compares expression with patterns, then executes body of the matched arm.

+

Example:

+
enum MyEnum {
+    Unit
+    Tuple(u32, u256, bool)
+}
+
+contract Foo {
+    pub fn bar(self) -> u256 {
+        let val: MyEnum = MyEnum::Tuple(1, 10, false)
+        return self.eval(val)
+    }
+    
+    fn eval(self, val: MyEnum) -> u256 {
+        match val {
+            MyEnum::Unit => {
+                return 0
+            }
+            
+            MyEnum::Tuple(.., false) => {
+                return 1
+            }
+            
+            MyEnum::Tuple(a, b, true) => {
+                return u256(a) + b
+            }
+        }
+    }
+}
+
+

assert statement

+
+

Syntax
+AssertStatement :
+   assert Expression (, Expression)?

+
+

The assert statement is used express invariants in the code. It consists of a boolean expression optionally followed by a comma followed by a string expression.

+

If the boolean expression evaluates to false, the code reverts with a panic code of 0x01. In the case that the first expression evaluates to false and a second string expression is given, the code reverts with the given string as the error code.

+
+

Warning: +The current implementation of assert is under active discussion and likely to change.

+
+

An example of a assert statement without the optional message:

+
contract Foo {
+    fn bar(val: u256) {
+        assert val > 5
+    }
+}
+
+

An example of a assert statement with an error message:

+
contract Foo {
+
+    fn bar(val: u256) {
+        assert val > 5, "Must be greater than five"
+    }
+}
+
+

Expressions

+ +

Call expressions

+
+

Syntax
+CallExpression :
+   Expression GenericArgs? ( CallParams? )

+

GenericArgs :
+   < IDENTIFIER | INTEGER_LITERAL (, IDENTIFIER | INTEGER_LITERAL)* >

+

CallParams :
+   CallArg ( , CallArg )* ,?

+

CallArg :
+   (CallArgLabel =)? Expression

+

CallArgLabel :
+   IDENTIFIERLabel must correspond to the name of the called function argument at the given position. It can be omitted if parameter name and the name of the called function argument are equal.

+
+

A call expression calls a function. The syntax of a call expression is an expression, followed by a parenthesized comma-separated list of call arguments. Call arguments are expressions, and must be labeled and provided in the order specified in the function definition. If the function eventually returns, then the expression completes.

+

Example:

+
contract Foo {
+
+    pub fn demo(self) {
+        let ann: address = 0xaa
+        let bob: address = 0xbb
+        self.transfer(from: ann, to: bob, 25)
+    }
+
+    pub fn transfer(self, from: address, to: address, _ val: u256) {}
+}
+
+

Tuple expressions

+
+

Syntax
+TupleExpression :
+   ( TupleElements? )

+

TupleElements :
+   ( Expression , )+ Expression?

+
+

A tuple expression constructs tuple values.

+

The syntax for tuple expressions is a parenthesized, comma separated list of expressions, called the tuple initializer operands. The number of tuple initializer operands is the arity of the constructed tuple.

+

1-ary tuple expressions require a comma after their tuple initializer operand to be disambiguated with a parenthetical expression.

+

Tuple expressions without any tuple initializer operands produce the unit tuple.

+

For other tuple expressions, the first written tuple initializer operand initializes the field item0 and subsequent operands initializes the next highest field.

+

For example, in the tuple expression (true, false, 1), true initializes the value of the field item0, false field item1, and 1 field item2.

+

Examples of tuple expressions and their types:

+
+ + + + +
ExpressionType
()() (unit)
(0, 4)(u256, u256)
(true, )(bool, )
(true, -1, 1)(bool, i256, u256)
+
+

A tuple field can be accessed via an attribute expression.

+

Example:

+
contract Foo {
+    pub fn bar() {
+        // Creating a tuple via a tuple expression
+        let some_tuple: (u256, bool) = (1, false)
+
+        // Accessing the first tuple field via the `item0` field
+        baz(input: some_tuple.item0)
+    }
+    pub fn baz(input: u256) {}
+}
+
+

List expressions

+
+

Syntax
+ListExpression :
+   [ ListElements? ]

+

ListElements :
+   Expression (, Expression)* ,?

+
+

A list expression constructs array values.

+

The syntax for list expressions is a parenthesized, comma separated list of expressions, called the list initializer operands. The number of list initializer operands must be equal to the static size of the array type. The types of all list initializer operands must conform to the type of the array.

+

Examples of tuple expressions and their types:

+
+ + +
ExpressionType
[1, self.get_number()]u256[2]
[true, false, false]bool[3]
+
+

An array item can be accessed via an index expression.

+

Example:

+
contract Foo {
+
+    fn get_val3() -> u256 {
+        return 3
+    }
+
+    pub fn baz() {
+        let val1: u256 = 2
+        // A list expression
+        let foo: Array<u256, 3> = [1, val1, get_val3()]
+    }
+}
+
+

Struct expressions

+

TBW

+

Index expressions

+
+

Syntax
+IndexExpression :
+   Expression [ Expression ]

+
+

Array and Map types can be indexed by by writing a square-bracket-enclosed expression after them. For arrays, the type of the index key has to be u256 whereas for Map types it has to be equal to the key type of the map.

+

Example:

+
contract Foo {
+
+    balances: Map<address, u256>
+
+
+    pub fn baz(mut self, mut values: Array<u256, 10>) {
+        // Assign value at slot 5
+        values[5] = 1000
+        // Read value at slot 5
+        let val1: u256 = values[5]
+
+        // Assign value for address zero
+        self.balances[address(0)] = 10000
+
+        // Read balance of address zero
+        let bal: u256 = self.balances[address(0)]
+    }
+}
+
+

Attribute expressions

+
+

Syntax
+AttributeExpression :
+   Expression . IDENTIFIER

+
+

An attribute expression evaluates to the location of an attribute of a struct, tuple or contract.

+

The syntax for an attribute expression is an expression, then a . and finally an identifier.

+

Examples:

+
struct Point {
+    pub x: u256
+    pub y: u256
+}
+
+contract Foo {
+    some_point: Point
+    some_tuple: (bool, u256)
+
+    fn get_point() -> Point {
+        return Point(x: 100, y: 500)
+    }
+
+    pub fn baz(some_point: Point, some_tuple: (bool, u256)) {
+        // Different examples of attribute expressions
+        let bool_1: bool = some_tuple.item0
+        let x1: u256 = some_point.x
+        let point1: u256 = get_point().x
+        let point2: u256 = some_point.x
+    }
+}
+
+

Name expressions

+
+

Syntax
+NameExpression :
+   IDENTIFIER

+
+

A name expression resolves to a local variable.

+

Example:

+
contract Foo {
+    pub fn baz(foo: u256) {
+        // name expression resolving to the value of `foo`
+        foo
+    }
+}
+
+

Path expressions

+
+

Syntax
+PathExpression :
+   IDENTIFIER ( :: IDENTIFIER )*

+
+

A name expression resolves to a local variable.

+

Example:

+
contract Foo {
+    pub fn baz() {
+        // CONST_VALUE is defined in another module `my_mod`.
+        let foo: u32 = my_mod::CONST_VALUE
+    }
+}
+
+

Literal expressions

+
+

Syntax
+LiteralExpression :
+   | STRING_LITERAL
+   | INTEGER_LITERAL
+   | BOOLEAN_LITERAL

+
+

A literal expression consists of one of the literal forms described earlier. +It directly describes a number, string or boolean value.

+
"hello"   // string type
+5         // integer type
+true      // boolean type
+
+

Arithmetic Operators

+
+

Syntax
+ArithmeticExpression :
+     Expression + Expression
+   | Expression - Expression
+   | Expression * Expression
+   | Expression / Expression
+   | Expression % Expression
+   | Expression ** Expression
+   | Expression & Expression
+   | Expression | Expression
+   | Expression ^ Expression
+   | Expression << Expression
+   | Expression >> Expression

+
+

Binary operators expressions are all written with infix notation. +This table summarizes the behavior of arithmetic and logical binary operators on +primitive types.

+
+ + + + + + + + + + + +
SymbolInteger
+Addition
-Subtraction
*Multiplication
/Division*
%Remainder
**Exponentiation
&Bitwise AND
|Bitwise OR
^Bitwise XOR
<<Left Shift
>>Right Shift
+
+

* Integer division rounds towards zero.

+

Here are examples of these operators being used.

+
3 + 6 == 9
+6 - 3 == 3
+2 * 3 == 6
+6 / 3 == 2
+5 % 4 == 1
+2 ** 4 == 16
+12 & 25 == 8
+12 | 25 == 29
+12 ^ 25 == 21
+212 << 1 == 424
+212 >> 1 == 106
+
+

Comparison Operators

+
+

Syntax
+ComparisonExpression :
+      Expression == Expression
+   | Expression != Expression
+   | Expression > Expression
+   | Expression < Expression
+   | Expression >= Expression
+   | Expression <= Expression

+
+
+ + + + + + +
SymbolMeaning
==Equal
!=Not equal
>Greater than
<Less than
>=Greater than or equal to
<=Less than or equal to
+
+

Here are examples of the comparison operators being used.

+
123 == 123
+23 != -12
+12 > 11
+11 >= 11
+11 < 12
+11 <= 11
+
+

Boolean Operators

+
+

Syntax
+BooleanExpression :
+     Expression or Expression
+   | Expression and Expression

+
+

The operators or and and may be applied to operands of boolean type. The or operator denotes logical 'or', and the and operator denotes logical 'and'.

+

Example:

+
const x: bool = false or true // true
+
+

Unary Operators

+
+

Syntax
+UnaryExpression :
+     not Expression
+   | - Expression
+   | ~ Expression

+
+

The unary operators are used to negate expressions. The unary - (minus) operator yields the negation of its numeric argument. The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The unary not operator yields the inversion of its boolean argument.

+

Example:

+
fn f() {
+  let x: bool = not true  // false
+  let y: i256 = -1
+  let z: i256 = i256(~1)  // -2
+}
+
+

Type System

+

Types

+

Every variable, item, and value in a Fe program has a type. The _ of a +value defines the interpretation of the memory holding it and the operations +that may be performed on the value.

+

Built-in types are tightly integrated into the language, in nontrivial ways +that are not possible to emulate in user-defined types. User-defined types have +limited capabilities.

+

The list of types is:

+ +

Boolean type

+

The bool type is a data type which can be either true or false.

+

Example:

+
let x: bool = true
+
+

Contract types

+

An contract type is the type denoted by the name of an contract item.

+

A value of a given contract type carries the contract's public interface as +attribute functions. A new contract value can be created by either casting +an address to a contract type or by creating a new contract using the type +attribute functions create or create2.

+

Example:

+
contract Foo {
+    pub fn get_my_num() -> u256 {
+        return 42
+    }
+}
+
+contract FooFactory {
+    pub fn create2_foo(mut ctx: Context) -> address {
+        // `0` is the value being sent and `52` is the address salt
+        let foo: Foo = Foo.create2(ctx, 0, 52)
+        return address(foo)
+    }
+}
+
+

Numeric types

+

The unsigned integer types consist of:

+
+ + + + + + +
TypeMinimumMaximum
u8028-1
u160216-1
u320232-1
u640264-1
u12802128-1
u25602256-1
+
+

The signed two's complement integer types consist of:

+
+ + + + + + +
TypeMinimumMaximum
i8-(27)27-1
i16-(215)215-1
i32-(231)231-1
i64-(263)263-1
i128-(2127)2127-1
i256-(2255)2255-1
+

Tuple Types

+
+

Syntax
+TupleType :
+      ( )
+   | ( ( Type , )+ Type? )

+
+

Tuple types are a family of structural types1 for heterogeneous lists of other types.

+

The syntax for a tuple type is a parenthesized, comma-separated list of types.

+

A tuple type has a number of fields equal to the length of the list of types. +This number of fields determines the arity of the tuple. +A tuple with n fields is called an n-ary tuple. +For example, a tuple with 2 fields is a 2-ary tuple.

+

Fields of tuples are named using increasing numeric names matching their position in the list of types. +The first field is item0. +The second field is item1. +And so on. +The type of each field is the type of the same position in the tuple's list of types.

+

For convenience and historical reasons, the tuple type with no fields (()) is often called unit or the unit type. +Its one value is also called unit or the unit value.

+

Some examples of tuple types:

+
    +
  • () (also known as the unit or zero-sized type)
  • +
  • (u8, u8)
  • +
  • (bool, i32)
  • +
  • (i32, bool) (different type from the previous example)
  • +
+

Values of this type are constructed using a tuple expression. +Furthermore, various expressions will produce the unit value if there is no other meaningful value for it to evaluate to. +Tuple fields can be accessed via an attribute expression.

+
1 +

Structural types are always equivalent if their internal types are equivalent.

+
+

Array types

+
+

Syntax
+ArrayType :
+   Array<Type, INTEGER_LITERAL>

+
+

An array is a fixed-size sequence of N elements of type T. The array type +is written as Array<T, N>. The size is an integer literal.

+

Arrays are either stored in storage or memory but are never stored directly on the stack.

+

Examples:

+
contract Foo {
+  // An array in storage
+  bar: Array<u8, 10>
+
+  fn do_something() {
+    // An array in memory
+    let values: Array<u256, 3> = [10, 100, 100]
+  }
+}
+
+

All elements of arrays are always initialized, and access to an array is +always bounds-checked in safe methods and operators.

+

Struct types

+

A struct type is the type denoted by the name of an struct item. +A struct type is a heterogeneous product of other types, called the +fields of the type.

+

New instances of a struct can be constructed with a struct expression.

+

Struct types are either stored in storage or memory but are never stored directly on the stack.

+

Examples:

+
struct Rectangle {
+  pub width: u256
+  pub length: u256
+}
+
+contract Example {
+  // A Rectangle in storage
+  area: Rectangle
+
+  fn do_something() {
+    let length: u256 = 20
+    // A rectangle in memory
+    let square: Rectangle = Rectangle(width: 10, length)
+  }
+}
+
+

All fields of struct types are always initialized.

+

The data layout of a struct is not part of its external API and may be changed in any release.

+

The fields of a struct may be qualified by visibility modifiers, to allow +access to data in a struct outside a module.

+

Enum types

+

An enum type is the type denoted by the name of an enum item.

+

Address Type

+

The address type represents a 20 byte Ethereum address.

+

Example:

+
contract Example {
+  // An address in storage
+  someone: address
+
+  fn do_something() {
+    // A plain address (not part of a tuple, struct etc) remains on the stack
+    let dai_contract: address = 0x6b175474e89094c44da98b954eedeac495271d0f
+  }
+}
+
+

Map type

+

The type Map<K, V> is used to associate key values with data.

+

The following types can be used as key:

+ +

The values can be of any type including other maps, structs, tuples or arrays.

+

Example:

+
contract Foo {
+    bar: Map<address, Map<address, u256>>
+    baz: Map<address, Map<u256, bool>>
+
+    pub fn read_bar(self, a: address, b: address) -> u256 {
+        return self.bar[a][b]
+    }
+
+    pub fn write_bar(mut self, a: address, b: address, value: u256) {
+        self.bar[a][b] = value
+    }
+
+    pub fn read_baz(self, a: address, b: u256) -> bool {
+        return self.baz[a][b]
+    }
+
+    pub fn write_baz(mut self, a: address, b: u256, value: bool) {
+        self.baz[a][b] = value
+    }
+}
+
+

String Type

+

A value of type String<N> represents a sequence of unsigned bytes with the assumption that the data is valid UTF-8.

+

The String<N> type is generic over a constant value that has to be an integer literal. That value N constraints the maximum number of bytes that are available for storing the string's characters.

+

Note that the value of N does not restrict the type to hold exactly that number of bytes at all times which means that a type such as String<10> can hold a short word such as "fox" but it can not hold a full sentence such as "The brown fox jumps over the white fence".

+

Example:

+
contract Foo {
+
+  fn bar() {
+    let single_byte_string: String<1> = "a"
+    let longer_string: String<100> = "foo"
+  }
+}
+
+

Unit type

+

TBW

+

Function Types

+

TBW

+

Data Layout

+

There are three places where data can be stored on the EVM:

+
    +
  • stack: 256-bit values placed on the stack that are loaded using DUP operations.
  • +
  • storage: 256-bit address space where 256-bit values can be stored. Accessing higher +storage slots does not increase gas cost.
  • +
  • memory: 256-bit address space where 256-bit values can be stored. Accessing higher +memory slots increases gas cost.
  • +
+

Each data type can be stored in these locations. How data is stored is +described in this section.

+

Stack

+

The following can be stored on the stack:

+
    +
  • base type values
  • +
  • pointers to reference type values
  • +
+

The size of each value stored on the stack must not exceed 256 bits. Since all base types are less +than or equal to 256 bits in size, we store them on the stack. Pointers to values stored in memory or storage may also be stored on the stack.

+

Example:

+
fn f() {
+    let foo: u256 = 42 // foo is stored on the stack
+    let bar: Array<u256, 100> = [0; 100] // bar is a memory pointer stored on the stack
+}
+
+

Storage

+

All data types can be stored in storage.

+

Constant size values in storage

+

Storage pointers for constant size values are determined at compile time.

+

Example:

+
contract Cats {
+   population: u256 // assigned a static location by the compiler
+}
+
+

The value of a base type in storage is found by simply loading the value from storage at the +given pointer.

+

To find an element inside of a sequence type, the relative location of the element is added to the +given pointer.

+

Maps in storage

+

Maps are not assigned pointers, because they do not have a location in storage. They are instead +assigned a nonce that is used to derive the location of keyed values during runtime.

+

Example:

+
contract Foo {
+  bar: Map<address, u256> // bar is assigned a static nonce by the compiler
+  baz: Map<address, Map<address, u256>> // baz is assigned a static nonce by the compiler
+}
+
+

The expression bar[0x00] would resolve to the hash of both bar's nonce and the key value +.i.e. keccak256(<bar nonce>, 0x00). Similarly, the expression baz[0x00][0x01] would resolve to +a nested hash i.e. keccak256(keccak256(<baz nonce>, 0x00), 0x01).

+

The to_mem function

+

Reference type values can be copied from storage and into memory using the to_mem function.

+

Example:

+
let my_array_var: Array<u256, 10> = self.my_array_field.to_mem()
+
+

Memory

+

Only sequence types can be stored in memory.

+

The first memory slot (0x00) is used to keep track of the lowest available memory slot. Newly +allocated segments begin at the value given by this slot. When more memory has been allocated, +the value stored in 0x00 is increased.

+

We do not free memory after it is allocated.

+

Sequence types in memory

+

Sequence type values may exceed the 256-bit stack slot size, so we store them in memory and +reference them using pointers kept on the stack.

+

Example:

+
fn f() {
+    let foo: Array<u256, 100> = [0; 100] // foo is a pointer that references 100 * 256 bits in memory.
+}
+
+

To find an element inside of a sequence type, the relative location of the element is added to the +given pointer.

+

Contributing

+

You can contribute to Fe!

+

Ways to contribute:

+

1. Reporting or fixing issues.

+

If you find problems with Fe you can report them to the development team on the project Github. +You are also welcome to work on existing issues, especially any tagged good first issue on the project issue board.

+

2. Improving the docs.

+

We always appreciate improvements to the project documentation. This could be fixing any bugs you find, adding some detail to a description or explanation or developing a new user guide.

+

To add to the docs you can fork the Fe Github repository and make updates in the /docs directory. You can build and serve locally using mdbook build && mdbook serve. Then, when you are happy with your changes you can raise a pull request to the main repository.

+

3. Developing Fe

+

You are also welcome to work on Fe itself. There are many opportunities to help build the language, for example working on the compiler or the language specification, adding tests or developing tooling.

+

It is a good idea to connect with the existing Fe community to find out what are the priority areas that need attention and to discuss your idea in context before putting time into it. You can find Fe developers on the Discord or you can use the Github issue board.

+
+

Please note that there has been a substantial amount of work done on the fe-v2 branch of the repository that includes breaking changes. When merged fe-v2 will revert new contributions based on master.

+

To make your work v2 ready you can build off the fe-v2 branch. It is recommended to seek out issues tagged v2 in the Github Issue board.

+
+

4. Community engagement

+

We appreciate help answering questions on the Discord and other platforms such as Stack Exchange or Twitter.

+
+

Please note that this project has a Code of Conduct. By participating in this project — in the issues, pull requests, or Discord channel — you agree to abide by its terms.

+
+

Processes

+

Reporting issues

+

To report an issue, please use the Github issue board. When reporting issues, please mention the following details:

+
    +
  • Fe version.
  • +
  • your operating system.
  • +
  • the steps required to reproduce the issue
  • +
  • actual vs expected behaviour
  • +
  • any error messages or relevant logs
  • +
  • the specific source code where the issue originates
  • +
+

The appropriate place for technical discussions about the language itself is the Fe Discord.

+

Rasing Pull Requests

+

Please fork the Fe repository and raise pull requests against the master branch.

+

Your commit messages should be concise and explain the changes made. Your pull request description should explain why the changes were made and list the specific changes. If you have to pull in changes from master to your fork (e.g. to resolve merge conflicts), please use git rebase rather than git merge.

+

New features should be accompanied by appropriate tests.

+

Finally, please make sure you respect the coding style for this project.

+

Thank you for contributing to Fe!

+

Release Notes

+

🖥️ Download Binaries +📄 Draft Spec +ℹ️ Getting Started

+

Fe is moving fast. Read up on all the latest improvements.

+

0.26.0 "Zircon" (2023-11-03)

+

Features

+
    +
  • +

    Give option to produce runtime bytecode as compilation artifact

    +

    Previously, the compiler could only produce the bytecode that is used +for the deployment of the contract. Now it can also produce the runtime +bytecode which is the bytecode that is saved to storage.

    +

    Being able to obtain the runtime bytecode is useful for contract +verification.

    +

    To obtain the runtime bytecode use the runtime-bytecode option +of the --emit flag (multiple options allowed).

    +

    Example Output:

    +
      +
    • mycontract.bin (bytecode for deployment)
    • +
    • mycontract.runtime.bin (runtime bytecode) (#947)
    • +
    +
  • +
  • +

    New verify command to verify onchain contracts against local source code.

    +

    People need to be able to verify that a deployed contract matches the source code +that the author claims was used to deploy it. Previously, there was no simple +way to achieve this.

    +

    These are the steps to verify a contract with the verify command:

    +
      +
    1. Obtain the project's source code locally.
    2. +
    3. Ensure it is the same source code that was used to deploy the contract. (e.g. check out a specific tag)
    4. +
    5. From the project directory run fe verify <contract-address> <json-rpc-url>
    6. +
    +

    Example:

    +
    $ fe verify 0xf0adbb9ed4135d1509ad039505bada942d18755f https://example-eth-mainnet-rpc.com
    +It's a match!✨
    +
    +Onchain contract:
    +Address: 0xf0adbb9ed4135d1509ad039505bada942d18755f
    +Bytecode: 0x60008..76b90
    +
    +Local contract:
    +Contract name: SimpleDAO
    +Source file: /home/work/ef/simple_dao/fe_contracts/simpledao/src/main.fe
    +Bytecode: 0x60008..76b90
    +
    +Hint: Run with --verbose to see the contract's source code.
    +
    +

    (#948)

    +
  • +
+

Improved Documentation

+
    +
  • Added a new page on EVM precompiles (#944)
  • +
+

0.25.0 "Yoshiokaite" (2023-10-26)

+

Features

+
    +
  • +

    Use the project root as default path for fe test

    +

    Just run fe test from any directory of the project. (#913)

    +
  • +
  • +

    Completed std::buf::MemoryBuffer refactor. (#917)

    +
  • +
  • +

    Allow filtering tests to run via fe test --filter <some-filter

    +

    E.g. Running fe test --filter foo will run all tests that contain foo in their name. (#919)

    +
  • +
  • +

    Logs for successfully ran tests can be printed with the --logs parameter.

    +

    example:

    +
    // test_log.fe
    +
    +use std::evm::log0
    +use std::buf::MemoryBuffer
    +
    +struct MyEvent {
    +  pub foo: u256
    +  pub baz: bool
    +  pub bar: u256
    +}
    +
    +#test
    +fn test_log(mut ctx: Context) {
    +  ctx.emit(MyEvent(foo: 42, baz: false, bar: 26))
    +  unsafe { log0(buf: MemoryBuffer::new(len: 42)) }
    +}
    +
    +
    +
    $ fe test --logs test_log.fe
    +executing 1 test in test_log:
    +  test_log ... passed
    +
    +test_log produced the following logs:
    +  MyEvent emitted by 0x0000…002a with the following parameters [foo: 2a, baz: false, bar: 1a]
    +  Log { address: 0x000000000000000000000000000000000000002a, topics: [], data: b"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1a\0\0\0\0\0\0\0\0\0\0" }
    +
    +
    +1 test passed; 0 tests failed; 1 test executed
    +
    +

    Note: Logs are not collected for failing tests. (#933)

    +
  • +
  • +

    Adds 'functions' section to docs with information on self and Context. (#937)

    +
  • +
+

Bugfixes

+
    +
  • +

    Yul codegen was failing to include string literals used in test assertions. This resulted in a compiler error.

    +

    Example:

    +
    #test
    +fn foo() {
    +    assert false, "oops"
    +}
    +
    +

    The example code above was failing to compile, but now it compiles and executes as expected. (#926)

    +
  • +
+

Improved Documentation

+
    +
  • Added a new tutorial: Open Auction (#930)
  • +
+

0.24.0 "Xenotime" (2023-08-10)

+

Features

+
    +
  • +

    Added support for project manifests and project dependencies.

    +

    Example:

    +
    my_project
    +├── fe.toml
    +└── src
    +    └── main.fe
    +
    +
    # fe.toml
    +name = "my_project"
    +version = "1.0"
    +
    +[dependencies]
    +my_lib = { path = "../path/to/my_lib", version = "1.0" }
    +my_other_lib = "../path/to/my_other_lib"
    +
    +

    Note: The current implementation supports circular dependencies. (#908)

    +
  • +
+

Performance improvements

+
    +
  • MemoryBuffer now allocates an extra 31 bytes. This removes the need for runtime checks and bitshifting needed to ensure safe writing to a MemoryBuffer's region. (#898)
  • +
+

Improved Documentation

+
    +
  • Link to vs-code extension in Quickstart Guide (#910)
  • +
+

0.23.0 "Wiluite" (2023-06-01)

+

Features

+
    +
  • +

    Fixed an issue where generic parameters that were mut could not be satisfied at callsite.

    +

    For instance, the following code would previously cause a compile error but now works as expected:

    +
    #![allow(unused)]
    +fn main() {
    +struct Runner {
    +  pub fn run<T: Computable>(self, mut _ val: T) -> u256 {
    +    return val.compute(val: 1000)
    +  }
    +}
    +
    +contract Example {
    +  pub fn run_test(self) {
    +    let runner: Runner = Runner();
    +    let mut mac: Mac = Mac();
    +
    +    assert runner.run(mac) == 1001
    +  }
    +}
    +}
    +

    (#865)

    +
  • +
  • +

    The ctx parameter can now be passed into test functions.

    +

    example:

    +
    #test
    +fn my_test(ctx: Context) {
    +    assert ctx.block_number() == 0
    +}
    +
    +

    (#880)

    +
  • +
  • +

    The following has been added to the standard library:

    +

    Memory buffer abstraction

    +

    example:

    +
    use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}
    +use std::traits::Max
    +
    +#test
    +fn test_buf_rw() {
    +    let mut buf: MemoryBuffer = MemoryBuffer::new(len: 161) 
    +    let mut writer: MemoryBufferWriter = buf.writer()
    +    let mut reader: MemoryBufferReader = buf.reader()
    +
    +    writer.write(value: 42)
    +    writer.write(value: 42)
    +    writer.write(value: 26)
    +    writer.write(value: u8(26))
    +    writer.write(value: u256::max())
    +    writer.write(value: u128::max())
    +    writer.write(value: u64::max())
    +    writer.write(value: u32::max())
    +    writer.write(value: u16::max())
    +    writer.write(value: u8::max())
    +    writer.write(value: u8(0))
    +
    +    assert reader.read_u256() == 42
    +    assert reader.read_u256() == 42
    +    assert reader.read_u256() == 26
    +    assert reader.read_u8() == 26
    +    assert reader.read_u256() == u256::max()
    +    assert reader.read_u128() == u128::max()
    +    assert reader.read_u64() == u64::max()
    +    assert reader.read_u32() == u32::max()
    +    assert reader.read_u16() == u16::max()
    +    assert reader.read_u8() == u8::max()
    +    assert reader.read_u8() == 0
    +}
    +
    +

    Precompiles

    +

    example:

    +
    use std::precompiles
    +use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}
    +
    +#test
    +fn test_ec_recover() {
    +    let result: address = precompiles::ec_recover(
    +        hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3,
    +        v: 28,
    +        r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608,
    +        s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada
    +    )
    +
    +    assert result == address(0x7156526fbd7a3c72969b54f64e42c10fbb768c8a)
    +}
    +
    +

    ctx.raw_call()

    +

    example:

    +
    use std::buf::{
    +    RawCallBuffer,
    +    MemoryBufferReader, 
    +    MemoryBufferWriter
    +}
    +use std::evm
    +
    +contract Foo {
    +    pub unsafe fn __call__() {
    +        if evm::call_data_load(offset: 0) == 42 {
    +            evm::mstore(offset: 0, value: 26)
    +            evm::return_mem(offset: 0, len: 32)
    +        } else if evm::call_data_load(offset: 0) == 26 {
    +            revert
    +        }
    +    }
    +}
    +
    +#test
    +fn test_raw_call(mut ctx: Context) {
    +    let foo: Foo = Foo.create(ctx, 0)
    +
    +    let mut buf: RawCallBuffer = RawCallBuffer::new(
    +        input_len: 32, 
    +        output_len: 32
    +    )
    +    let mut writer: MemoryBufferWriter = buf.writer()
    +
    +    writer.write(value: 42)
    +    assert ctx.raw_call(addr: address(foo), value: 0, buf)
    +  
    +    let mut reader: MemoryBufferReader = buf.reader()
    +    assert reader.read_u256() == 26
    +
    +    assert not ctx.raw_call(addr: address(foo), value: 0, buf)
    +}
    +
    +

    (#885)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed an ICE when using aggregate types with aggregate type fields in public functions

    +

    This code would previously cause an ICE:

    +
    struct Tx {
    +  pub data: Array<u8, 320>
    +}
    +
    +contract Foo {
    +  pub fn bar(mut tx: Tx) {}
    +}
    +
    +

    (#867)

    +
  • +
  • +

    Fixed a regression where the compiler would not reject a method call on a struct in storage.

    +

    E.g. the follwing code should be rejected as it is missing a to_mem() call:

    +
    struct Bar {
    +    pub x: u256
    +
    +    pub fn get_x(self) -> u256{
    +        return self.x
    +    }
    +}
    +
    +contract Foo {
    +    bar: Bar
    +
    +    pub fn __init__(mut self) {
    +        self.bar = Bar( x: 2 )
    +    }
    +    fn yay(self) {
    +        self.bar.get_x()
    +    }
    +}
    +
    +

    The compiler will now reject the code and suggest a to_mem() before callingget_x(). (#881)

    +
  • +
+

0.22.0 "Vulcanite" (2023-04-05)

+

This is the first non-alpha release of Fe. Read our announcement for more details.

+

Features

+
    +
  • +

    Support for tests.

    +

    example:

    +
    #test
    +fn my_test() {
    +    assert 26 + 16 == 42
    +}
    +
    +

    Tests can be executed using the test subcommand.

    +

    example:

    +

    $ fe test foo.fe (#807)

    +
  • +
  • +

    Fixed broken trait orphan rule

    +

    Fe has an orphan rule for Traits similar to Rust's that requires +that either the trait or the type that we are implementing the trait for +are located in the same ingot as the impl. This rule was implemented +incorrectly so that instead of requiring them to be in the same ingot, +they were required to be in the same module. This change fixes this +so that the orphan rule is enforced correctly. +(#863)

    +
  • +
  • +

    address values can now be specified with a number literal, with no explicit +cast. So instead of let t: address = address(0xfe), one can now write +let t: address = 0xfe. This also means that it's possible to define const +addresses: const SOME_KNOWN_CONTRACT: address = 0xfefefefe +(#864)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed resolving of generic arguments to associated functions.

    +

    For example, this code would previously crash the compiler:

    +
    #![allow(unused)]
    +fn main() {
    +...
    +  // This function doesn't take self
    +  pub fn run_static<T: Computable>(_ val: T) -> u256 {
    +    return val.compute(val: 1000)
    +  }
    +...
    +
    +// Invoking it would previously crash the compiler
    +Runner::run_static(Mac())
    +...
    +}
    +

    (#861)

    +
  • +
+

Improved Documentation

+
    +
  • Changed the Deployment tutorial to use foundry and the Sepolia network (#853)
  • +
+

0.21.0-alpha (2023-02-28)

+

Features

+
    +
  • +

    Support for Self type

    +

    With this change Self (with capital S) can be used to refer +to the enclosing type in contracts, structs, impls and traits.

    +

    E.g.

    +
    trait Min {
    +  fn min() -> Self;
    +}
    +
    +impl Min for u8 {
    +  fn min() -> u8 { // Both `u8` or `Self` are valid here
    +    return 0
    +  }
    +}
    +
    +

    Usage: u8::min() (#803)

    +
  • +
  • +

    Added Min and Max traits to the std library. +The std library implements the traits for all numeric types.

    +

    Example

    +
    use std::traits::{Min, Max}
    +...
    +
    +assert u8::min() < u8::max()
    +``` ([#836](https://github.com/ethereum/fe/issues/836))
    +
    +
    +
  • +
  • +

    Upgraded underlying solc compiler to version 0.8.18

    +
  • +
+

Bugfixes

+
    +
  • the release contains minor bugfixes
  • +
+

0.20.0-alpha (2022-12-05)

+

Features

+
    +
  • +

    Removed the event type as well as the emit keyword. +Instead the struct type now automatically implements +the Emittable trait and can be emitted via ctx.emit(..).

    +

    Indexed fields can be annotated via the #indexed attribute.

    +

    E.g.

    +
    struct Signed {
    +    book_msg: String<100>
    +}
    +
    +contract GuestBook {
    +    messages: Map<address, String<100>>
    +
    +    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
    +        self.messages[ctx.msg_sender()] = book_msg
    +        ctx.emit(Signed(book_msg))
    +    }
    +}
    +
    +

    (#717)

    +
  • +
  • +

    Allow to call trait methods on types when trait is in scope

    +

    So far traits were only useful as bounds for generic functions. +With this change traits can also be used as illustrated with +the following example:

    +
    trait Double {
    +  fn double(self) -> u256;
    +}
    +
    +impl Double for (u256, u256) {
    +  fn double(self) -> u256 {
    +    return (self.item0 + self.item1) * 2
    +  }
    +}
    +
    +contract Example {
    +
    +  pub fn run_test(self) {
    +    assert (0, 1).double() == 2
    +  }
    +}
    +
    +

    If a call turns out to be ambigious the compiler currently asks the +user to disambiguate via renaming. In the future we will likely +introduce a syntax to allow to disambiguate at the callsite. (#757)

    +
  • +
  • +

    Allow contract associated functions to be called via ContractName::function_name() syntax. (#767)

    +
  • +
  • +

    Add enum types and match statement.

    +

    enum can now be defined, e.g.,

    +
    pub enum MyEnum {
    +    Unit
    +    Tuple(u32, u256, bool)
    +  
    +    fn unit() -> MyEnum {
    +        return MyEnum::Unit
    +    }
    +}
    +
    +

    Also, match statement is introduced, e.g.,

    +
    pub fn eval_enum()  -> u256{
    +    match MyEnum {
    +        MyEnum::Unit => { 
    +            return 0
    +        }
    +      
    +        MyEnum::Tuple(a, _, false) => {
    +            return u256(a)
    +        }
    +      
    +        MyEnum::Tuple(.., true) => {
    +            return u256(1)
    +        }
    +    }
    +}
    +
    +

    For now, available patterns are restricted to

    +
      +
    • Wildcard(_), which matches all patterns: _
    • +
    • Named variable, which matches all patterns and binds the value to make the value usable in the arm. e.g., a, b and c in MyEnum::Tuple(a, b, c)
    • +
    • Boolean literal(true and false)
    • +
    • Enum variant. e.g., MyEnum::Tuple(a, b, c)
    • +
    • Tuple pattern. e.g., (a, b, c)
    • +
    • Struct pattern. e.g., MyStruct {x: x1, y: y1, b: true}
    • +
    • Rest pattern(..), which matches the rest of the pattern. e.g., MyEnum::Tuple(.., true)
    • +
    • Or pattern(|). e.g., MyEnum::Unit | MyEnum::Tuple(.., true)
    • +
    +

    Fe compiler performs the exhaustiveness and usefulness checks for match statement.
    +So the compiler will emit an error when all patterns are not covered or an unreachable arm are detected. (#770)

    +
  • +
  • +

    Changed comments to use // instead of # (#776)

    +
  • +
  • +

    Added the mut keyword, to mark things as mutable. Any variable or function parameter +not marked mut is now immutable.

    +
    contract Counter {
    +    count: u256
    +
    +    pub fn increment(mut self) -> u256 {
    +        // `self` is mutable, so storage can be modified
    +        self.count += 1
    +        return self.count
    +    }
    +}
    +
    +struct Point {
    +    pub x: u32
    +    pub y: u32
    +
    +    pub fn add(mut self, _ other: Point) {
    +        self.x += other.x
    +        self.y += other.y
    +
    +        // other.x = 1000 // ERROR: `other` is not mutable
    +    }
    +}
    +
    +fn pointless() {
    +    let origin: Point = Point(x: 0, y: 0)
    +    // origin.x = 10 // ERROR: origin is not mutable
    +
    +    let x: u32 = 10
    +    // x_coord = 100 // ERROR: `x_coord` is not mutable
    +    let mut y: u32 = 0
    +    y = 10 // OK
    +
    +    let mut p: Point = origin // copies `origin`
    +    p.x = 10 // OK, doesn't modify `origin`
    +
    +    let mut q: Point = p // copies `p`
    +    q.x = 100            // doesn't modify `p`
    +
    +    p.add(q)
    +    assert p.x == 110
    +}
    +
    +

    Note that, in this release, primitive type function parameters +can't be mut. This restriction might be lifted in a future release.

    +

    For example:

    +
    fn increment(mut x: u256) { // ERROR: primitive type parameters can't be mut
    +    x += 1
    +}
    +
    +

    (#777)

    +
  • +
  • +

    The contents of the std::prelude module (currently just the Context struct) +are now automatically used by every module, so use std::context::Context is +no longer required. (#779)

    +
  • +
  • +

    When the Fe compiler generates a JSON ABI file for a contract, the +"stateMutability" field for each function now reflects whether the function can +read or modify chain or contract state, based on the presence or absence of the +self and ctx parameters, and whether those parameters are mutable.

    +

    If a function doesn't take self or ctx, it's "pure". +If a function takes self or ctx immutably, it can read state but not mutate +state, so it's a "view" +If a function takes mut self or mut ctx, it can mutate state, and is thus +marked "payable".

    +

    Note that we're following the convention set by Solidity for this field, which +isn't a perfect fit for Fe. The primary issue is that Fe doesn't currently +distinguish between "payable" and "nonpayable" functions; if you want a function +to revert when Eth is sent, you need to do it manually +(eg assert ctx.msg_value() == 0). (#783)

    +
  • +
  • +

    Trait associated functions

    +

    This change allows trait functions that do not take a self parameter. +The following demonstrates a possible trait associated function and its usage:

    +
    trait Max {
    +  fn max(self) -> u8;
    +}
    +
    +impl Max for u8 {
    +  fn max() -> u8 {
    +    return u8(255)
    +  }
    +}
    +
    +contract Example {
    +
    +  pub fn run_test(self) {
    +    assert u8::max() == 255
    +  }
    +}
    +
    +

    (#805)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fix issue where calls to assiciated functions did not enforce visibility rules.

    +

    E.g the following code should be rejected but previously wasn't:

    +
    struct Foo {
    +    fn do_private_things() {
    +    }
    +}
    +
    +contract Bar {
    +    fn test() {
    +        Foo::do_private_things()
    +    }
    +}
    +
    +

    With this change, the above code is now rejected because do_private_things is not pub. (#767)

    +
  • +
  • +

    Padding on bytes and string ABI types is zeroed out. (#769)

    +
  • +
  • +

    Ensure traits from other modules or even ingots can be implemented (#773)

    +
  • +
  • +

    Certain cases where the compiler would not reject pure functions +being called on instances are now properly rejected. (#775)

    +
  • +
  • +

    Reject calling to_mem() on primitive types in storage (#801)

    +
  • +
  • +

    Disallow importing private type via use

    +

    The following was previously allowed but will now error:

    +

    use foo::PrivateStruct (#815)

    +
  • +
+

0.19.1-alpha "Sunstone" (2022-07-06)

+

Features

+
    +
  • +

    Support returning nested struct.

    +

    Example:

    +
    pub struct InnerStruct {
    +    pub inner_s: String<10>
    +    pub inner_x: i256
    +}
    +
    +pub struct NestedStruct {
    +    pub inner: InnerStruct
    +    pub outer_x: i256
    +}
    +
    +contract Foo {
    +    pub fn return_nested_struct() -> NestedStruct {
    +        ...
    +    }
    +}
    +
    +

    (#635)

    +
  • +
  • +

    Made some small changes to how the Context object is used.

    +
      +
    • ctx is not required when casting an address to a contract type. Eg let foo: Foo = Foo(address(0))
    • +
    • ctx is required when calling an external contract function that requires ctx
    • +
    +

    Example:

    +
    use std::context::Context // see issue #679
    +
    +contract Foo {
    +  pub fn emit_stuff(ctx: Context) {
    +    emit Stuff(ctx)  # will be `ctx.emit(Stuff{})` someday
    +  }
    +}
    +contract Bar {
    +  pub fn call_foo_emit_stuff(ctx: Context) {
    +    Foo(address(0)).emit_stuff(ctx)
    +  }
    +}
    +event Stuff {}
    +
    +

    (#703)

    +
  • +
  • +

    Braces! Fe has abandoned python-style significant whitespace in favor of the +trusty curly brace.

    +

    In addition, elif is now spelled else if, and the pass +statement no longer exists.

    +

    Example:

    +
    pub struct SomeError {}
    +
    +contract Foo {
    +  x: u8
    +  y: u16
    +
    +  pub fn f(a: u8) -> u8 {
    +    if a > 10 {
    +      let x: u8 = 5
    +      return a + x
    +    } else if a == 0 {
    +      revert SomeError()
    +    } else {
    +      return a * 10
    +    }
    +  }
    +
    +  pub fn noop() {}
    +}
    +
    +

    (#707)

    +
  • +
  • +

    traits and generic function parameter

    +

    Traits can now be defined, e.g:

    +
    trait Computable {
    +  fn compute(self, val: u256) -> u256;
    +}
    +
    +

    The mechanism to implement a trait is via an impl block e.g:

    +
    struct Linux {
    +  pub counter: u256
    +  pub fn get_counter(self) -> u256 {
    +    return self.counter
    +  }
    +  pub fn something_static() -> u256 {
    +    return 5
    +  }
    +}
    +
    +impl Computable for Linux {
    +  fn compute(self, val: u256) -> u256 {
    +    return val + Linux::something_static() + self.get_counter()
    +  }
    +}
    +
    +

    Traits can only appear as bounds for generic functions e.g.:

    +
    struct Runner {
    +
    +  pub fn run<T: Computable>(self, _ val: T) -> u256 {
    +    return val.compute(val: 1000)
    +  }
    +}
    +
    +

    Only struct functions (not contract functions) can have generic parameters. +The run method of Runner can be called with any type that implements Computable e.g.

    +
    contract Example {
    +
    +  pub fn generic_compute(self) {
    +    let runner: Runner = Runner();
    +    assert runner.run(Mac()) == 1001
    +    assert runner.run(Linux(counter: 10)) == 1015
    +  }
    +}
    +
    +

    (#710)

    +
  • +
  • +

    Generate artifacts for all contracts of an ingot, not just for contracts that are defined in main.fe (#726)

    +
  • +
  • +

    Allow using complex type as array element type.

    +

    Example:

    +
    contract Foo {
    +    pub fn bar() -> i256 {
    +        let my_array: Array<Pair, 3> = [Pair::new(1, 0), Pair::new(2, 0), Pair::new(3, 0)]
    +
    +        let sum: i256 = 0
    +        for pair in my_array {
    +            sum += pair.x
    +        }
    +
    +        return sum
    +    }
    +}
    +
    +struct Pair {
    +    pub x: i256
    +    pub y: i256
    +
    +    pub fn new(_ x: i256, _ y: i256) -> Pair {
    +        return Pair(x, y)
    +    }
    +}
    +
    +

    (#730)

    +
  • +
  • +

    The fe CLI now has subcommands:

    +

    fe new myproject - creates a new project structure +fe check . - analyzes fe source code and prints errors +fe build . - builds a fe project (#732)

    +
  • +
  • +

    Support passing nested struct types to public functions.

    +

    Example:

    +
    pub struct InnerStruct {
    +    pub inner_s: String<10>
    +    pub inner_x: i256
    +}
    +
    +pub struct NestedStruct {
    +    pub inner: InnerStruct
    +    pub outer_x: i256
    +}
    +
    +contract Foo {
    +    pub fn f(arg: NestedStruct) {
    +        ...
    +    }
    +}
    +
    +

    (#733)

    +
  • +
  • +

    Added support for repeat expressions ([VALUE; LENGTH]).

    +

    e.g.

    +
    let my_array: Array<bool, 42> = [bool; 42]
    +
    +

    Also added checks to ensure array and struct types are initialized. These checks are currently performed at the declaration site, but will be loosened in the future. (#747)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fix a bug that incorrect instruction is selected when the operands of a comp instruction are a signed type. (#734)

    +
  • +
  • +

    Fix issue where a negative constant leads to an ICE

    +

    E.g. the following code would previously crash the compiler but shouldn't:

    +
    const INIT_VAL: i8 = -1
    +contract Foo {
    +  pub fn init_bar() {
    +    let x: i8 = INIT_VAL
    +  }
    +}
    +
    +

    (#745)

    +
  • +
  • +

    Fix a bug that causes ICE when nested if-statement has multiple exit point.

    +

    E.g. the following code would previously crash the compiler but shouldn't:

    +
     pub fn foo(self) {
    +    if true {
    +        if self.something {
    +            return
    +        }
    +    }
    +    if true {
    +        if self.something {
    +            return
    +        }
    +    }
    +}
    +
    +

    (#749)

    +
  • +
+

0.18.0-alpha "Ruby" (2022-05-27)

+

Features

+
    +
  • Added support for parsing of attribute calls with generic arguments (e.g. foo.bar<Baz>()). (#719)
  • +
+

Bugfixes

+
    +
  • Fix a regression where the stateMutability field would not be included in the generated ABI (#722)
  • +
  • Fix two regressions introduced in 0.17.0 +
      +
    • Properly lower right shift operation to yul's sar if operand is signed type
    • +
    • Properly lower negate operation to call safe_sub (#723)
    • +
    +
  • +
+

0.17.0-alpha "Quartz" (2022-05-26)

+

Features

+
    +
  • +

    Support for underscores in numbers to improve readability e.g. 100_000.

    +

    Example

    +
        let num: u256 = 1000_000_000_000
    +
    +

    (#149)

    +
  • +
  • +

    Optimized access of struct fields in storage (#249)

    +
  • +
  • +

    Unit type () is now ABI encodable (#442)

    +
  • +
  • +

    Temporary default stateMutability to payable in ABI

    +

    The ABI metadata that the compiler previously generated did not include the stateMutability field. This piece of information is important for tooling such as hardhat because it determines whether a function needs to be called with or without sending a transaction.

    +

    As soon as we have support for mut self and mut ctx we will be able to derive that information from the function signature. In the meantime we now default to payable. (#705)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed a crash caused by certain memory to memory assignments.

    +

    E.g. the following code would previously lead to a compiler crash:

    +
    my_struct.x = my_struct.y
    +
    +

    (#590)

    +
  • +
  • +

    Reject unary minus operation if the target type is an unsigned integer number.

    +

    Code below should be reject by fe compiler:

    +
    contract Foo:
    +    pub fn bar(self) -> u32:
    +        let unsigned: u32 = 1
    +        return -unsigned
    +
    +    pub fn foo():
    +        let a: i32 = 1
    +        let b: u32 = -a
    +
    +

    (#651)

    +
  • +
  • +

    Fixed crash when passing a struct that contains an array

    +

    E.g. the following would previously result in a compiler crash:

    +
    struct MyArray:
    +    pub x: Array<i32, 2>
    +
    +
    +contract Foo:
    +    pub fn bar(my_arr: MyArray):
    +        pass
    +
    +

    (#681)

    +
  • +
  • +

    reject infinite size struct definitions.

    +

    Fe structs having infinite size due to recursive definitions were not rejected earlier and would cause ICE in the analyzer since they were not properly handled. Now structs having infinite size are properly identified by detecting cycles in the dependency graph of the struct field definitions and an error is thrown by the analyzer. (#682)

    +
  • +
  • +

    Return instead of revert when contract is called without data.

    +

    If a contract is called without data so that no function is invoked, +we would previously revert but that would leave us without a +way to send ETH to a contract so instead it will cause a return now. (#694)

    +
  • +
  • +

    Resolve compiler crash when using certain reserved YUL words as struct field names.

    +

    E.g. the following would previously lead to a compiler crash because numer is +a reserved keyword in YUL.

    +
    struct Foo:
    +  pub number: u256
    +
    +contract Meh:
    +
    +  pub fn yay() -> Foo:
    +    return Foo(number:2)
    +
    +

    (#709)

    +
  • +
+

0.16.0-alpha (2022-05-05)

+

Features

+
    +
  • Change static function call syntax from Bar.foo() to Bar::foo() (#241)
  • +
  • Added support for retrieving the base fee via ctx.base_fee() (#503)
  • +
+

Bugfixes

+
    +
  • Resolve functions on structs via path (e.g. bi::ba::bums()) (#241)
  • +
+

0.15.0-alpha (2022-04-04)

+

Features

+
    +
  • +

    Labels are now required on function arguments. Labels can be omitted if the +argument is a variable with a name that matches the label, or if the function +definition specifies that an argument should have no label. Functions often take +several arguments of the same type; compiler-checked labels can help prevent +accidentally providing arguments in the wrong order.

    +

    Example:

    +
    contract CoolCoin:
    +  balance: Map<address, i256>
    +  loans: Map<(address, address), i256>
    +
    +  pub fn demo(self, ann: address, bob: address):
    +    let is_loan: bool = false
    +    self.give(from: ann, to: bob, 100, is_loan)
    +
    +  fn transfer(self, from sender: address, to recipient: address, _ val: u256, is_loan: bool):
    +    self.cred[sender] -= val
    +    self.cred[recipient] += val
    +    if is_loan:
    +      self.loans[(sender, recipient)] += val
    +
    +

    Note that arguments must be provided in the order specified in the function +definition.

    +

    A parameter's label defaults to the parameter name, but can be changed by +specifying a different label to the left of the parameter name. Labels should be +clear and convenient for the caller, while parameter names are only used in the +function body, and can thus be longer and more descriptive. +In the example above, we choose to use sender and recipient as identifiers +in the body of fn transfer, but use labels from: and to:.

    +

    In cases where it's ideal to not have labels, e.g. if a function takes a single +argument, or if types are sufficient to differentiate between arguments, use _ +to specify that a given parameter has no label. It's also fine to require labels +for some arguments, but not others.

    +

    Example:

    +
    fn add(_ x: u256, _ y: u256) -> u256:
    +  return x + y
    +
    +contract Foo:
    +  fn transfer(self, _ to: address, wei: u256):
    +    pass
    +
    +  pub fn demo(self):
    +    transfer(address(0), wei: add(1000, 42))
    +
    +

    (#397)

    +
  • +
+

Bugfixes

+
    +
  • The region of memory used to compute the slot of a storage map value was not being allocated. (#684)
  • +
+

0.14.0-alpha (2022-03-02)

+

Features

+
    +
  • +

    Events can now be defined outside of contracts.

    +

    Example:

    +
    event Transfer:
    +    idx sender: address
    +    idx receiver: address
    +    value: u256
    +
    +contract Foo:
    +    fn transferFoo(to: address, value: u256):
    +        emit Transfer(sender: msg.sender, receiver: to, value)
    +
    +contract Bar:
    +    fn transferBar(to: address, value: u256):
    +        emit Transfer(sender: msg.sender, receiver: to, value)
    +
    +

    (#80)

    +
  • +
  • +

    The Fe standard library now includes a std::evm module, which provides functions that perform low-level evm operations. +Many of these are marked unsafe, and thus can only be used inside of an unsafe function or an unsafe block.

    +

    Example:

    +
    use std::evm::{mstore, mload}
    +
    +fn memory_shenanigans():
    +  unsafe:
    +    mstore(0x20, 42)
    +    let x: u256 = mload(0x20)
    +    assert x == 42
    +
    +

    The global functions balance and balance_of have been removed; these can now be called as std::evm::balance(), etc. +The global function send_value has been ported to Fe, and is now available +as std::send_value. +(#629)

    +
  • +
  • +

    Support structs that have non-base type fields in storage.

    +

    Example:

    +
    struct Point:
    +    pub x: u256
    +    pub y: u256
    +
    +struct Bar:
    +    pub name: String<3>
    +    pub numbers: Array<u256, 2>
    +    pub point: Point
    +    pub something: (u256, bool)
    +
    +
    +contract Foo:
    +    my_bar: Bar
    +
    +    pub fn complex_struct_in_storage(self) -> String<3>:
    +        self.my_bar = Bar(
    +            name: "foo",
    +            numbers: [1, 2],
    +            point: Point(x: 100, y: 200),
    +            something: (1, true),
    +        )
    +
    +        # Asserting the values as they were set initially
    +        assert self.my_bar.numbers[0] == 1
    +        assert self.my_bar.numbers[1] == 2
    +        assert self.my_bar.point.x == 100
    +        assert self.my_bar.point.y == 200
    +        assert self.my_bar.something.item0 == 1
    +        assert self.my_bar.something.item1
    +
    +        # We can change the values of the array
    +        self.my_bar.numbers[0] = 10
    +        self.my_bar.numbers[1] = 20
    +        assert self.my_bar.numbers[0] == 10
    +        assert self.my_bar.numbers[1] == 20
    +        # We can set the array itself
    +        self.my_bar.numbers = [1, 2]
    +        assert self.my_bar.numbers[0] == 1
    +        assert self.my_bar.numbers[1] == 2
    +
    +        # We can change the values of the Point
    +        self.my_bar.point.x = 1000
    +        self.my_bar.point.y = 2000
    +        assert self.my_bar.point.x == 1000
    +        assert self.my_bar.point.y == 2000
    +        # We can set the point itself
    +        self.my_bar.point = Point(x=100, y=200)
    +        assert self.my_bar.point.x == 100
    +        assert self.my_bar.point.y == 200
    +
    +        # We can change the value of the tuple
    +        self.my_bar.something.item0 = 10
    +        self.my_bar.something.item1 = false
    +        assert self.my_bar.something.item0 == 10
    +        assert not self.my_bar.something.item1
    +        # We can set the tuple itself
    +        self.my_bar.something = (1, true)
    +        assert self.my_bar.something.item0 == 1
    +        assert self.my_bar.something.item1
    +
    +        return self.my_bar.name.to_mem()
    +
    +

    (#636)

    +
  • +
  • +

    Features that read and modify state outside of contracts are now implemented on a struct +named "Context". Context is included in the standard library and can be imported with +use std::context::Context. Instances of Context are created by calls to public functions +that declare it in the signature or by unsafe code.

    +

    Basic example:

    +
    use std::context::Context
    +
    +contract Foo:
    +    my_num: u256
    +
    +    pub fn baz(ctx: Context) -> u256:
    +        return ctx.block_number()
    +
    +    pub fn bing(self, new_num: u256) -> u256:
    +        self.my_num = new_num
    +        return self.my_num
    +
    +
    +contract Bar:
    +
    +    pub fn call_baz(ctx: Context, foo_addr: address) -> u256:
    +        # future syntax: `let foo = ctx.load<Foo>(foo_addr)`
    +        let foo: Foo = Foo(ctx, foo_addr)
    +        return foo.baz()
    +
    +    pub fn call_bing(ctx: Context) -> u256:
    +        # future syntax: `let foo = ctx.create<Foo>(0)`
    +        let foo: Foo = Foo.create(ctx, 0)
    +        return foo.bing(42)
    +
    +

    Example with __call__ and unsafe block:

    +
    use std::context::Context
    +use std::evm
    +
    +contract Foo:
    +
    +    pub fn __call__():
    +        unsafe:
    +            # creating an instance of `Context` is unsafe
    +            let ctx: Context = Context()
    +            let value: u256 = u256(bar(ctx))
    +
    +            # return `value`
    +            evm::mstore(0, value)
    +            evm::return_mem(0, 32)
    +
    +    fn bar(ctx: Context) -> address:
    +        return ctx.self_address()
    +
    +

    (#638)

    +
  • +
  • +

    Features

    +

    Support local constant

    +

    Example:

    +
    contract Foo:
    +    pub fn bar():
    +        const LOCAL_CONST: i32 = 1
    +
    +

    Support constant expression

    +

    Example:

    +
    const GLOBAL: i32 = 8
    +
    +contract Foo:
    +    pub fn bar():
    +        const LOCAL: i32 = GLOBAL * 8
    +
    +

    Support constant generics expression

    +

    Example:

    +
    const GLOBAL: u256= 8
    +const USE_GLOBAL: bool = false
    +type MY_ARRAY = Array<i32, { GLOBAL / 4 }>
    +
    +contract Foo:
    +    pub fn bar():
    +        let my_array: Array<i32, { GLOBAL if USE_GLOBAL else 4 }>
    +
    +

    Bug fixes

    +

    Fix ICE when constant type is mismatch

    +

    Example:

    +
    const GLOBAL: i32 = "FOO"
    +
    +contract Foo:
    +    pub fn bar():
    +        let FOO: i32 = GLOBAL
    +
    +

    Fix ICE when assigning value to constant twice

    +

    Example:

    +
    const BAR: i32 = 1
    +
    +contract FOO:
    +    pub fn bar():
    +        BAR = 10
    +
    +

    (#649)

    +
  • +
  • +

    Argument label syntax now uses : instead of =. Example:

    +
    struct Foo:
    +  x: u256
    +  y: u256
    +
    +let x: MyStruct = MyStruct(x: 10, y: 11)
    +# previously:     MyStruct(x = 10, y = 11)
    +
    +

    (#665)

    +
  • +
  • +

    Support module-level pub modifier, now default visibility of items in a module is private.

    +

    Example:

    +
    # This constant can be used outside of the module.
    +pub const PUBLIC:i32 = 1
    +
    +# This constant can NOT be used outside of the module.
    +const PRIVATE: i32 = 1
    +
    +

    (#677)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +
      +
    • Source files are now managed by a (salsa) SourceDb. A SourceFileId now corresponds to a salsa-interned File with a path. File content is a salsa input function. This is mostly so that the future (LSP) language server can update file content when the user types or saves, which will trigger a re-analysis of anything that changed.
    • +
    • An ingot's set of modules and dependencies are also salsa inputs, so that when the user adds/removes a file or dependency, analysis is rerun.
    • +
    • Standalone modules (eg a module compiled with fe fee.fe) now have a fake ingot parent. Each Ingot has an IngotMode (Lib, Main, StandaloneModule), which is used to disallow ingot::whatever paths in standalone modules, and to determine the correct root module file.
    • +
    • parse_module now always returns an ast::Module, and thus a ModuleId will always exist for a source file, even if it contains fatal parse errors. If the parsing fails, the body will end with a ModuleStmt::ParseError node. The parsing will stop at all but the simplest of syntax errors, but this at least allows partial analysis of source file with bad syntax.
    • +
    • ModuleId::ast(db) is now a query that parses the module's file on demand, rather than the AST being interned into salsa. This makes handling parse diagnostics cleaner, and removes the up-front parsing of every module at ingot creation time. (#628)
    • +
    +
  • +
+

0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)

+

Features

+
    +
  • +

    Support private fields on structs

    +

    Public fields now need to be declared with the pub modifier, otherwise they default to private fields. +If a struct contains private fields it can not be constructed directly except from within the +struct itself. The recommended way is to implement a method new(...) as demonstrated in the +following example.

    +
    struct House:
    +    pub price: u256
    +    pub size: u256
    +    vacant: bool
    +
    +    pub fn new(price: u256, size: u256) -> House
    +      return House(price=price, size=size, vacant=true)
    +
    +contract Manager:
    +
    +  house: House
    +
    +  pub fn create_house(price: u256, size: u256):
    +    self.house = House::new(price, size)
    +    let can_access_price: u256 = self.house.price
    +    # can not access `self.house.vacant` because the field is private
    +
    +

    (#214)

    +
  • +
  • +

    Support non-base type fields in structs

    +

    Support is currently limited in two ways:

    +
      +
    • Structs with complex fields can not be returned from public functions
    • +
    • Structs with complex fields can not be stored in storage (#343)
    • +
    +
  • +
  • +

    Addresses can now be explicitly cast to u256. For example:

    +
    fn f(addr: address) -> u256:
    +  return u256(addr)
    +
    +

    (#621)

    +
  • +
  • +

    A special function named __call__ can now be defined in contracts.

    +

    The body of this function will execute in place of the standard dispatcher when the contract is called.

    +

    example (with intrinsics):

    +
    contract Foo:
    +    pub fn __call__(self):
    +        unsafe:
    +            if __calldataload(0) == 1:
    +                __revert(0, 0)
    +            else:
    +                __return(0, 0)
    +
    +

    (#622)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed a crash that happend when using a certain unprintable ASCII char (#551)

    +
  • +
  • +

    The argument to revert wasn't being lowered by the compiler, +meaning that some revert calls would cause a compiler panic +in later stages. For example:

    +
    const BAD_MOJO: u256 = 0xdeaddead
    +
    +struct Error:
    +  code: u256
    +
    +fn fail():
    +  revert Error(code = BAD_MOJO)
    +
    +

    (#619)

    +
  • +
  • +

    Fixed a regression where an empty list expression ([]) would lead to a compiler crash. (#623)

    +
  • +
  • +

    Fixed a bug where int array elements were not sign extended in their ABI encodings. (#633)

    +
  • +
+

0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)

+

Features

+
    +
  • +

    Added unsafe low-level "intrinsic" functions, that perform raw evm operations. +For example:

    +
    fn foo():
    +  unsafe:
    +    __mtore(0, 5000)
    +    assert __mload(0) == 5000
    +
    +

    The functions available are exactly those defined in yul's "evm dialect": +https://docs.soliditylang.org/en/v0.8.11/yul.html#evm-dialect +but with a double-underscore prefix. Eg selfdestruct -> __selfdestruct.

    +

    These are intended to be used for implementing basic standard library functionality, +and shouldn't typically be needed in normal contract code.

    +

    Note: some intrinsic functions don't return a value (eg __log0); using these +functions in a context that assumes a return value of unit type (eg let x: () = __log0(a, b)) +will currently result in a compiler panic in the yul compilation phase. (#603)

    +
  • +
  • +

    Added an out of bounds check for accessing array items. +If an array index is retrieved at an index that is not within +the bounds of the array it now reverts with Panic(0x32). (#606)

    +
  • +
+

Bugfixes

+
    +
  • +

    Ensure ternary expression short circuit.

    +

    Example:

    +
    contract Foo:
    +
    +    pub fn bar(input: u256) -> u256:
    +        return 1 if input > 5 else revert_me()
    +
    +    fn revert_me() -> u256:
    +        revert
    +        return 0
    +
    +

    Previous to this change, the code above would always revert no matter +which branch of the ternary expressions it would resolve to. That is because +both sides were evaluated and then one side was discarded. With this change, +only the branch that doesn't get picked won't get evaluated at all.

    +

    The same is true for the boolean operations and and or. (#488)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +

    Added a globally available dummy std lib.

    +

    This library contains a single get_42 function, which can be called using std::get_42(). Once +low-level intrinsics have been added to the language, we can delete get_42 and start adding +useful code. (#601)

    +
  • +
+

0.11.0-alpha "Karlite" (2021-12-02)

+

Features

+
    +
  • +

    Added support for multi-file inputs.

    +

    Implementation details:

    +

    Mostly copied Rust's crate system, but use the term ingot instead of crate.

    +

    Below is an example of an ingot's file tree, as supported by the current implementation.

    +
    `-- basic_ingot
    +    `-- src
    +        |-- bar
    +        |   `-- baz.fe
    +        |-- bing.fe
    +        |-- ding
    +        |   |-- dang.fe
    +        |   `-- dong.fe
    +        `-- main.fe
    +
    +

    There are still a few features that will be worked on over the coming months:

    +
      +
    • source files accompanying each directory module (e.g. my_mod.fe)
    • +
    • configuration files and the ability to create library ingots
    • +
    • test directories
    • +
    • module-level pub modifier (all items in a module are public)
    • +
    • mod statements (all fe files in the input tree are public modules)
    • +
    +

    These things will be implemented in order of importance over the next few months. (#562)

    +
  • +
  • +

    The syntax for array types has changed to match other generic types. +For example, u8[4] is now written Array<u8, 4>. (#571)

    +
  • +
  • +

    Functions can now be defined on struct types. Example:

    +
    struct Point:
    +  x: u64
    +  y: u64
    +
    +  # Doesn't take `self`. Callable as `Point.origin()`.
    +  # Note that the syntax for this will soon be changed to `Point::origin()`.
    +  pub fn origin() -> Point:
    +    return Point(x=0, y=0)
    +
    +  # Takes `self`. Callable on a value of type `Point`.
    +  pub fn translate(self, x: u64, y: u64):
    +    self.x += x
    +    self.y += y
    +
    +  pub fn add(self, other: Point) -> Point:
    +    let x: u64 = self.x + other.x
    +    let y: u64 = self.y + other.y
    +    return Point(x, y)
    +
    +  pub fn hash(self) -> u256:
    +    return keccak256(self.abi_encode())
    +
    +pub fn do_pointy_things():
    +  let p1: Point = Point.origin()
    +  p1.translate(5, 10)
    +
    +  let p2: Point = Point(x=1, y=2)
    +  let p3: Point = p1.add(p2)
    +
    +  assert p3.x == 6 and p3.y == 12
    +
    +

    (#577)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed a rare compiler crash.

    +

    Example:

    +
    let my_array: i256[1] = [-1 << 1]
    +
    +

    Previous to this fix, the given example would lead to an ICE. (#550)

    +
  • +
  • +

    Contracts can now create an instance of a contract defined later in a file. +This issue was caused by a weakness in the way we generated yul. (#596)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +

    File IDs are now attached to Spans. (#587)

    +
  • +
  • +

    The fe analyzer now builds a dependency graph of source code "items" (functions, contracts, structs, etc). +This is used in the yulgen phase to determine which items are needed in the yul (intermediate representation) +output. Note that the yul output is still cluttered with utility functions that may or may not be needed by +a given contract. These utility functions are defined in the yulgen phase and aren't tracked in the dependency +graph, so it's not yet possible to filter out the unused functions. We plan to move the definition of many +of these utility functions into fe; when this happens they'll become part of the dependency graph and will only +be included in the yul output when needed.

    +

    The dependency graph will also enable future analyzer warnings about unused code. (#596)

    +
  • +
+

0.10.0-alpha (2021-10-31)

+

Features

+
    +
  • +

    Support for module level constants for base types

    +

    Example:

    +
    const TEN = 10
    +
    +contract
    +
    +  pub fn do_moon_math(self) -> u256:
    +    return 4711 * TEN
    +
    +

    The values of base type constants are always inlined. (#192)

    +
  • +
  • +

    Encode revert errors for ABI decoding as Error(0x103) not Panic(0x99) (#492)

    +
  • +
  • +

    Replaced import statements with use statements.

    +

    Example:

    +
    use foo::{bar::*, baz as baz26}
    +
    +

    Note: this only adds support for parsing use statements. (#547)

    +
  • +
  • +

    Functions can no be defined outside of contracts. Example:

    +
    fn add_bonus(x: u256) -> u256:
    +    return x + 10
    +
    +contract PointTracker:
    +    points: Map<address, u256>
    +
    +    pub fn add_points(self, user: address, val: u256):
    +        self.points[user] += add_bonus(val)
    +
    +

    (#566)

    +
  • +
  • +

    Implemented a send_value(to: address, value_in_wei: u256) function.

    +

    The function is similar to the sendValue function by OpenZeppelin with the differences being that:

    +
      +
    1. +

      It reverts with Error(0x100) instead of Error("Address: insufficient balance") to +safe more gas.

      +
    2. +
    3. +

      It uses selfbalance() instead of balance(address()) to safe more gas

      +
    4. +
    5. +

      It reverts with Error(0x101) instead of Error("Address: unable to send value, recipient may have reverted") also to safe more gas. (#567)

      +
    6. +
    +
  • +
  • +

    Added support for unsafe functions and unsafe blocks within functions. +Note that there's currently no functionality within Fe that requires the use +of unsafe, but we plan to add built-in unsafe functions that perform raw +evm operations which will only callable within an unsafe block or function. (#569)

    +
  • +
  • +

    Added balance() and balance_of(account: address) methods. (#572)

    +
  • +
  • +

    Added support for explicit casting between numeric types.

    +

    Example:

    +
    let a: i8 = i8(-1)
    +let a1: i16 = i16(a)
    +let a2: u16 = u16(a1)
    +
    +assert a2 == u16(65535)
    +
    +let b: i8 = i8(-1)
    +let b1: u8 = u8(b)
    +let b2: u16 = u16(b1)
    +
    +assert b2 == u16(255)
    +
    +

    Notice that Fe allows casting between any two numeric types but does not allow +to change both the sign and the size of the type in one step as that would leave +room for ambiguity as the example above demonstrates. (#576)

    +
  • +
+

Bugfixes

+
    +
  • +

    Adjust numeric values loaded from memory or storage

    +

    Previous to this fix numeric values that were loaded from either memory or storage +were not properly loaded on the stack which could result in numeric values not +treated as intended.

    +

    Example:

    +
    contract Foo:
    +
    +    pub fn bar() -> i8:
    +        let in_memory: i8[1] = [-3]
    +        return in_memory[0]
    +
    +

    In the example above bar() would not return -3 but 253 instead. (#524)

    +
  • +
  • +

    Propagate reverts from external contract calls.

    +

    Before this fix the following code to should_revert() or should_revert2() +would succeed even though it clearly should not.

    +
    contract A:
    +  contract_b: B
    +  pub fn __init__(contract_b: address):
    +    self.contract_b = B(contract_b)
    +
    +  pub fn should_revert():
    +    self.contract_b.fail()
    +
    +  pub fn should_revert2():
    +    self.contract_b.fail_with_custom_error()
    +
    +struct SomeError:
    +  pass
    +
    +contract B:
    +
    +  pub fn fail():
    +    revert
    +
    +  pub fn fail_with_custom_error():
    +    revert SomeError()
    +
    +

    With this fix the revert errors are properly passed upwards the call hierachy. (#574)

    +
  • +
  • +

    Fixed bug in left shift operation.

    +

    Example:

    +

    Let's consider the value 1 as an u8 which is represented as +the following 256 bit item on the EVM stack 00..|00000001|. +A left shift of 8 bits (val << 8) turns that into 00..01|00000000|.

    +

    Previous to this fix this resulted in the compiler taking 256 as the +value for the u8 when clearly 256 is not even in the range of u8 +anymore. With this fix the left shift operations was fixed to properly +"clean up" the result of the shift so that 00..01|00000000| turns into +00..00|00000000|. (#575)

    +
  • +
  • +

    Ensure negation is checked and reverts with over/underflow if needed.

    +

    Example:

    +

    The minimum value for an i8 is -128 but the maximum value of an i8 +is 127 which means that negating -128 should lead to an overflow since +128 does not fit into an i8. Before this fix, negation operations where +not checked for over/underflow resulting in returning the oversized value. (#578)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +

    In the analysis stage, all name resolution (of variable names, function names, +type names, etc used in code) now happens via a single resolve_name pathway, +so we can catch more cases of name collisions and log more helpful error messages. (#555)

    +
  • +
  • +

    Added a new category of tests: differential contract testing.

    +

    Each of these tests is pased on a pair of contracts where one implementation +is written in Fe and the other one is written in Solidity. The implementations +should have the same public APIs and are assumed to always return identical +results given equal inputs. The inputs are randomly generated using proptest +and hence are expected to discover unknown bugs. (#578)

    +
  • +
+

0.9.0-alpha (2021-09-29)

+

Features

+
    +
  • +

    The self variable is no longer implicitly defined in code blocks. It must now be declared +as the first parameter in a function signature.

    +

    Example:

    +
    contract Foo:
    +    my_stored_num: u256
    +
    +    pub fn bar(self, my_num: u256):
    +        self.my_stored_num = my_num
    +
    +    pub fn baz(self):
    +        self.bar(my_pure_func())
    +
    +    pub fn my_pure_func() -> u256:
    +        return 42 + 26
    +
    +

    (#520)

    +
  • +
  • +

    The analyzer now disallows defining a type, variable, or function whose +name conflicts with a built-in type, function, or object.

    +

    Example:

    +
    error: type name conflicts with built-in type
    +┌─ compile_errors/shadow_builtin_type.fe:1:6
    +│
    +1 │ type u256 = u8
    +│      ^^^^ `u256` is a built-in type
    +
    +

    (#539)

    +
  • +
+

Bugfixes

+
    +
  • Fixed cases where the analyzer would correctly reject code, but would panic instead of logging an error message. (#534)
  • +
  • Non-fatal parser errors (eg missing parentheses when defining a function that takes no arguments: fn foo:) +are no longer ignored if the semantic analysis stage succeeds. (#535)
  • +
  • Fixed issue #531 by adding a $ to the front of lowered tuple names. (#546)
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Implemented pretty printing of Fe AST. (#540)
  • +
+

0.8.0-alpha "Haxonite" (2021-08-31)

+

Features

+
    +
  • +

    Support quotes, tabs and carriage returns in string literals and otherwise +restrict string literals to the printable subset of the ASCII table. (#329)

    +
  • +
  • +

    The analyzer now uses a query-based system, which fixes some shortcomings of the previous implementation.

    +
      +
    • Types can now refer to other types defined later in the file. +Example:
    • +
    +
    type Posts = Map<PostId, PostBody>
    +type PostId = u256
    +type PostBody = String<140>
    +
    +
      +
    • Duplicate definition errors now show the location of the original definition.
    • +
    • The analysis of each function, type definition, etc happens independently, so an error in one +doesn't stop the analysis pass. This means fe can report more user errors in a single run of the compiler. (#468)
    • +
    +
  • +
  • +

    Function definitions are now denoted with the keyword fn instead of def. (#496)

    +
  • +
  • +

    Variable declarations are now preceded by the let keyword. Example: let x: u8 = 1. (#509)

    +
  • +
  • +

    Implemented support for numeric unary invert operator (~) (#526)

    +
  • +
+

Bugfixes

+
    +
  • +

    Calling self.__init__() now results in a nice error instead of a panic in the yul compilation stage. (#468)

    +
  • +
  • +

    Fixed an issue where certain expressions were not being moved to the correct location. (#493)

    +
  • +
  • +

    Fixed an issue with a missing return statement not properly detected.

    +

    Previous to this fix, the following code compiles but it should not:

    +
    contract Foo:
    +    pub fn bar(val: u256) -> u256:
    +        if val > 1:
    +            return 5
    +
    +

    With this change, the compiler rightfully detects that the code is missing +a return or revert statement after the if statement since it is not +guaranteed that the path of execution always follows the arm of the if statement. (#497)

    +
  • +
  • +

    Fixed a bug in the analyzer which allowed tuple item accessor names with a leading 0, +resulting in an internal compiler error in a later pass. Example: my_tuple.item001. +These are now rejected with an error message. (#510)

    +
  • +
  • +

    Check call argument labels for function calls.

    +

    Previously the compiler would not check any labels that were used +when making function calls on self or external contracts.

    +

    This can be especially problematic if gives developers the impression +that they could apply function arguments in any order as long as they +are named which is not the case.

    +
    contract Foo:
    +
    +    pub fn baz():
    +        self.bar(val2=1, doesnt_even_exist=2)
    +
    +    pub fn bar(val1: u256, val2: u256):
    +        pass
    +
    +

    Code as the one above is now rightfully rejected by the compiler. (#517)

    +
  • +
+

Improved Documentation

+
    +
  • +

    Various improvements and bug fixes to both the content and layout of the specification. (#489)

    +
  • +
  • +

    Document all remaining statements and expressions in the spec.

    +

    Also added a CI check to ensure code examples in the documentation +are validated against the latest compiler. (#514)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Separated Fe type traits between crates. (#485)
  • +
+

0.7.0-alpha "Galaxite" (2021-07-27)

+

Features

+
    +
  • +

    Enable the optimizer by default. The optimizer can still be disabled +by supplying --optimize=false as an argument. (#439)

    +
  • +
  • +

    The following checks are now performed while decoding data:

    +
      +
    • The size of the encoded data fits within the size range known at compile-time.
    • +
    • Values are correctly padded. +
        +
      • unsigned integers, addresses, and bools are checked to have correct left zero padding
      • +
      • the size of signed integers are checked
      • +
      • bytes and strings are checked to have correct right padding
      • +
      +
    • +
    • Data section offsets are consistent with the size of preceding values in the data section.
    • +
    • The dynamic size of strings does not exceed their maximum size.
    • +
    • The dynamic size of byte arrays (u8[n]) is equal to the size of the array. (#440)
    • +
    +
  • +
  • +

    Type aliases can now include tuples. Example:

    +
    type InternetPoints = (address, u256)
    +
    +

    (#459)

    +
  • +
  • +

    Revert with custom errors

    +

    Example:

    +
    struct PlatformError:
    +  code: u256
    +
    +pub fn do_something():
    +  revert PlatformError(code=4711)
    +
    +

    Error encoding follows Solidity which is based on EIP-838. This means that custom errors returned from Fe are fully compatible with Solidity. (#464)

    +
  • +
  • +
      +
    • The builtin value msg.sig now has type u256.
    • +
    • Removed the bytes[n] type. The type u8[n] can be used in its placed and will be encoded as a dynamically-sized, but checked, bytes component. (#472)
    • +
    +
  • +
  • +

    Encode certain reverts as panics.

    +

    With this change, the following reverts are encoded as Panic(uint256) with +the following panic codes:

    +
      +
    • 0x01: An assertion that failed and did not specify an error message
    • +
    • 0x11: An arithmetic expression resulted in an over- or underflow
    • +
    • 0x12: An arithmetic expression divided or modulo by zero
    • +
    +

    The panic codes are aligned with the panic codes that Solidity uses. (#476)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed a crash when trying to access an invalid attribute on a string.

    +

    Example:

    +
    contract Foo:
    +
    +  pub fn foo():
    +    "".does_not_exist
    +
    +

    The above now yields a proper user error. (#444)

    +
  • +
  • +

    Ensure String<N> type is capitalized in error messages (#445)

    +
  • +
  • +

    Fixed ICE when using a static string that spans over multiple lines.

    +

    Previous to this fix, the following code would lead to a compiler crash:

    +
    contract Foo:
    +    pub fn return_with_newline() -> String<16>:
    +        return "foo
    +        balu"
    +
    +

    The above code now works as intended. (#448)

    +
  • +
  • +

    Fixed ICE when using a tuple declaration and specifying a non-tuple type. +Fixed a second ICE when using a tuple declaration where the number of +target items doesn't match the number of items in the declared type. (#469)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +
      +
    • Cleaned up ABI encoding internals.
    • +
    • Improved yulc panic formatting. (#472)
    • +
    +
  • +
+

0.6.0-alpha "Feldspar" (2021-06-10)

+

Features

+
    +
  • +

    Support for pragma statement

    +

    Example: pragma ^0.1.0 (#361)

    +
  • +
  • +

    Add support for tuple destructuring

    +

    Example:

    +
    my_tuple: (u256, bool) = (42, true)
    +(x, y): (u256, bool) = my_tuple
    +
    +

    (#376)

    +
  • +
  • +
      +
    1. Call expression can now accept generic arguments
    2. +
    3. Replace stringN to String<N>
    4. +
    +

    Example:

    +
    s: String<10> = String<10>("HI")
    +
    +

    (#379)

    +
  • +
  • +
      +
    • Many analyzer errors now include helpful messages and underlined code.
    • +
    • Event and struct constructor arguments must now be labeled and in the order specified in the definition.
    • +
    • The analyzer now verifies that the left-hand side of an assignment is actually assignable. (#398)
    • +
    +
  • +
  • +

    Types of integer literal are now inferred, rather than defaulting to u256.

    +
    contract C:
    +
    +  fn f(x: u8) -> u16:
    +    y: u8 = 100   # had to use u8(100) before
    +    z: i8 = -129  # "literal out of range" error
    +
    +    return 1000   # had to use `return u16(1000)` before
    +
    +  fn g():
    +    self.f(50)
    +
    +

    Similar inference is done for empty array literals. Previously, empty array +literals caused a compiler crash, because the array element type couldn't +be determined.

    +
    contract C:
    +  fn f(xs: u8[10]):
    +    pass
    +
    +  fn g():
    +    self.f([])
    +
    +

    (Note that array length mismatch is still a type error, so this code won't +actually compile.) (#429)

    +
  • +
  • +

    The Map type name is now capitalized. Example:

    +
    contract GuestBook:
    +    guests: Map<address, String<100>>
    +
    +

    (#431)

    +
  • +
  • +

    Convert all remaining errors to use the new advanced error reporting system (#432)

    +
  • +
  • +

    Analyzer throws an error if __init__ is not public. (#435)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Refactored front-end "not implemented" errors into analyzer errors and removed questionable variants. Any panic is now considered to be a bug. (#437)
  • +
+

0.5.0-alpha (2021-05-27)

+

Features

+
    +
  • +

    Add support for hexadecimal/octal/binary numeric literals.

    +

    Example:

    +
    value_hex: u256 = 0xff
    +value_octal: u256 = 0o77
    +value_binary: u256 = 0b11
    +
    +

    (#333)

    +
  • +
  • +

    Added support for list expressions.

    +

    Example:

    +
    values: u256[3] = [10, 20, 30]
    +
    +# or anywhere else where expressions can be used such as in a call
    +
    +sum: u256 = self.sum([10, 20, 30])
    +
    +

    (#388)

    +
  • +
  • +

    Contracts, events, and structs can now be empty.

    +

    e.g.

    +
    event MyEvent:
    +    pass
    +
    +...
    +
    +contract MyContract:
    +    pass
    +
    +...
    +
    +struct MyStruct:
    +    pass
    +
    +

    (#406)

    +
  • +
  • +

    External calls can now handle dynamically-sized return types. (#415)

    +
  • +
+

Bugfixes

+
    +
  • The analyzer will return an error if a tuple attribute is not of the form item<index>. (#401)
  • +
+

Improved Documentation

+
    +
  • Created a landing page for Fe at https://fe-lang.org (#394)
  • +
  • Provide a Quickstart chapter in Fe Guide (#403)
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +

    Using insta to validate Analyzer outputs. (#387)

    +
  • +
  • +

    Analyzer now disallows using context.add_ methods to update attributes. (#392)

    +
  • +
  • +

    () now represents a distinct type internally called the unit type, instead of an empty tuple.

    +

    The lowering pass now does the following: Valueless return statements are given a () value and +functions without a return value are given explicit () returns. (#406)

    +
  • +
  • +

    Add CI check to ensure fragment files always end with a new line (#4711)

    +
  • +
+

0.4.0-alpha (2021-04-28)

+

Features

+
    +
  • +

    Support for revert messages in assert statements

    +

    E.g

    +
    assert a == b, "my revert statement"
    +
    +

    The provided string is abi-encoded as if it were a call +to a function Error(string). For example, the revert string "Not enough Ether provided." returns the following hexadecimal as error return data:

    +
    0x08c379a0                                                         // Function selector for Error(string)
    +0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
    +0x000000000000000000000000000000000000000000000000000000000000001a // String length
    +0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data
    +
    +

    (#288)

    +
  • +
  • +

    Added support for augmented assignments.

    +

    e.g.

    +
    contract Foo:
    +    pub fn add(a: u256, b: u256) -> u256:
    +        a += b
    +        return a
    +
    +    pub fn sub(a: u256, b: u256) -> u256:
    +        a -= b
    +        return a
    +
    +    pub fn mul(a: u256, b: u256) -> u256:
    +        a *= b
    +        return a
    +
    +    pub fn div(a: u256, b: u256) -> u256:
    +        a /= b
    +        return a
    +
    +    pub fn mod(a: u256, b: u256) -> u256:
    +        a %= b
    +        return a
    +
    +    pub fn pow(a: u256, b: u256) -> u256:
    +        a **= b
    +        return a
    +
    +    pub fn lshift(a: u8, b: u8) -> u8:
    +        a <<= b
    +        return a
    +
    +    pub fn rshift(a: u8, b: u8) -> u8:
    +        a >>= b
    +        return a
    +
    +    pub fn bit_or(a: u8, b: u8) -> u8:
    +        a |= b
    +        return a
    +
    +    pub fn bit_xor(a: u8, b: u8) -> u8:
    +        a ^= b
    +        return a
    +
    +    pub fn bit_and(a: u8, b: u8) -> u8:
    +        a &= b
    +        return a
    +
    +

    (#338)

    +
  • +
  • +

    A new parser implementation, which provides more helpful error messages +with fancy underlines and code context. (#346)

    +
  • +
  • +

    Added support for tuples with base type items.

    +

    e.g.

    +
    contract Foo:
    +    my_num: u256
    +
    +    pub fn bar(my_num: u256, my_bool: bool) -> (u256, bool):
    +        my_tuple: (u256, bool) = (my_num, my_bool)
    +        self.my_num = my_tuple.item0
    +        return my_tuple
    +
    +

    (#352)

    +
  • +
+

Bugfixes

+
    +
  • +

    Properly reject invalid emit (#211)

    +
  • +
  • +

    Properly tokenize numeric literals when they start with 0 (#331)

    +
  • +
  • +

    Reject non-string assert reasons as type error (#335)

    +
  • +
  • +

    Properly reject code that creates a circular dependency when using create or create2.

    +

    Example, the following code is now rightfully rejected because it tries to create an +instance of Foo from within the Foo contract itself.

    +
    contract Foo:
    +  pub fn bar()->address:
    +    foo:Foo=Foo.create(0)
    +
    +    return address(foo)
    +
    +

    (#362)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • AST nodes use Strings instead of &strs. This way we can perform incremental compilation on the AST. (#332)
  • +
  • Added support for running tests against solidity fixtures. +Also added tests that cover how solidity encodes revert reason strings. (#342)
  • +
  • Refactoring of binary operation type checking. (#347)
  • +
+

0.3.0-alpha "Calamine" (2021-03-24)

+

Features

+
    +
  • +

    Add over/underflow checks for multiplications of all integers (#271)

    +
  • +
  • +

    Add full support for empty Tuples. (#276)

    +

    All functions in Fe implicitly return an empty Tuple if they have no other return value. +However, before this change one was not able to use the empty Tuple syntax () explicitly.

    +

    With this change, all of these are treated equally:

    +
    contract Foo:
    +
    +  pub fn explicit_return_a1():
    +    return
    +
    +  pub fn explicit_return_a2():
    +    return ()
    +
    +  pub fn explicit_return_b1() ->():
    +    return
    +
    +  pub fn explicit_return_b2() ->():
    +    return ()
    +
    +  pub fn implicit_a1():
    +    pass
    +
    +  pub fn implicit_a2() ->():
    +    pass
    +
    +
  • +
  • +

    The JSON ABI builder now supports structs as both input and output. (#296)

    +
  • +
  • +

    Make subsequently defined contracts visible.

    +

    Before this change:

    +
    # can't see Bar
    +contract Foo:
    +   ...
    +# can see Foo
    +contract Bar:
    +   ...
    +
    +

    With this change the restriction is lifted and the following becomes possible. (#298)

    +
    contract Foo:
    +    bar: Bar
    +    pub fn external_bar() -> u256:
    +        return self.bar.bar()
    +contract Bar:
    +    foo: Foo
    +    pub fn external_foo() -> u256:
    +        return self.foo.foo()
    +
    +
  • +
  • +

    Perform checks for divison operations on integers (#308)

    +
  • +
  • +

    Support for msg.sig to read the function identifier. (#311)

    +
  • +
  • +

    Perform checks for modulo operations on integers (#312)

    +
  • +
  • +

    Perform over/underflow checks for exponentiation operations on integers (#313)

    +
  • +
+

Bugfixes

+
    +
  • +

    Properly reject emit not followed by an event invocation (#212)

    +
  • +
  • +

    Properly reject octal number literals (#222)

    +
  • +
  • +

    Properly reject code that tries to emit a non-existing event. (#250)

    +

    Example that now produces a compile time error:

    +
    emit DoesNotExist()
    +
    +
  • +
  • +

    Contracts that create other contracts can now include __init__ functions.

    +

    See https://github.com/ethereum/fe/issues/284 (#304)

    +
  • +
  • +

    Prevent multiple types with same name in one module. (#317)

    +

    Examples that now produce compile time errors:

    +
    type bar = u8
    +type bar = u16
    +
    +

    or

    +
    struct SomeStruct:
    +    some_field: u8
    +
    +struct SomeStruct:
    +    other: u8
    +
    +

    or

    +
    contract SomeContract:
    +    some_field: u8
    +
    +contract SomeContract:
    +    other: u8
    +
    +

    Prevent multiple fields with same name in one struct.

    +

    Example that now produces a compile time error:

    +
    struct SomeStruct:
    +    some_field: u8
    +    some_field: u8
    +
    +

    Prevent variable definition in child scope when name already taken in parent scope.

    +

    Example that now produces a compile time error:

    +
    pub fn bar():
    +    my_array: u256[3]
    +    sum: u256 = 0
    +    for i in my_array:
    +        sum: u256 = 0
    +
    +
  • +
  • +

    The CLI was using the overwrite flag to enable Yul optimization.

    +

    i.e.

    +
    # Would both overwrite output files and run the Yul optimizer.
    +$ fe my_contract.fe --overwrite
    +
    +

    Using the overwrite flag now only overwrites and optimization is enabled with the optimize flag. (#320)

    +
  • +
  • +

    Ensure analyzer rejects code that uses return values for __init__ functions. (#323)

    +

    An example that now produces a compile time error:

    +
    contract C:
    +    pub fn __init__() -> i32:
    +        return 0
    +
    +
  • +
  • +

    Properly reject calling an undefined function on an external contract (#324)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Added the Uniswap demo contracts to our testing fixtures and validated their behaviour. (#179)
  • +
  • IDs added to AST nodes. (#315)
  • +
  • Failures in the Yul generation phase now panic; any failure is a bug. (#327)
  • +
+

0.2.0-alpha "Borax" (2021-02-27)

+

Features

+
    +
  • +

    Add support for string literals.

    +

    Example:

    +
    fn get_ticker_symbol() -> string3:
    +    return "ETH"
    +
    +

    String literals are stored in and loaded from the compiled bytecode. (#186)

    +
  • +
  • +

    The CLI now compiles every contract in a module, not just the first one. (#197)

    +

    Sample compiler output with all targets enabled:

    +
    output
    +|-- Bar
    +|   |-- Bar.bin
    +|   |-- Bar_abi.json
    +|   `-- Bar_ir.yul
    +|-- Foo
    +|   |-- Foo.bin
    +|   |-- Foo_abi.json
    +|   `-- Foo_ir.yul
    +|-- module.ast
    +`-- module.tokens
    +
    +
  • +
  • +

    Add support for string type casts (#201)

    +

    Example:

    +
    val: string100 = string100("foo")
    +
    +
  • +
  • +

    Add basic support for structs. (#203)

    +

    Example:

    +
    struct House:
    +    price: u256
    +    size: u256
    +    vacant: bool
    +
    +contract City:
    +
    +    pub fn get_price() -> u256:
    +        building: House = House(300, 500, true)
    +
    +        assert building.size == 500
    +        assert building.price == 300
    +        assert building.vacant
    +
    +        return building.price
    +
    +
  • +
  • +

    Added support for external contract calls. Contract definitions now +add a type to the module scope, which may be used to create contract +values with the contract's public functions as callable attributes. (#204)

    +

    Example:

    +
    contract Foo:
    +    pub fn build_array(a: u256, b: u256) -> u256[3]:
    +        my_array: u256[3]
    +        my_array[0] = a
    +        my_array[1] = a * b
    +        my_array[2] = b
    +        return my_array
    +
    +contract FooProxy:
    +    pub fn call_build_array(
    +        foo_address: address,
    +        a: u256,
    +        b: u256,
    +    ) -> u256[3]:
    +        foo: Foo = Foo(foo_address)
    +        return foo.build_array(a, b)
    +
    +
  • +
  • +

    Add support for block, msg, chain, and tx properties: (#208)

    +
    block.coinbase: address
    +block.difficulty: u256
    +block.number: u256
    +block.timestamp: u256
    +chain.id: u256
    +msg.value: u256
    +tx.gas_price: u256
    +tx.origin: address
    +
    +

    (Note that msg.sender: address was added previously.)

    +

    Example:

    +
    fn post_fork() -> bool:
    +    return block.number > 2675000
    +
    +
  • +
  • +

    The CLI now panics if an error is encountered during Yul compilation. (#218)

    +
  • +
  • +

    Support for contract creations.

    +

    Example of create2, which takes a value and address salt as parameters.

    +
    contract Foo:
    +    pub fn get_my_num() -> u256:
    +        return 42
    +
    +contract FooFactory:
    +    pub fn create2_foo() -> address:
    +        # value and salt
    +        foo: Foo = Foo.create2(0, 52)
    +        return address(foo)
    +
    +

    Example of create, which just takes a value parameter.

    +
    contract Foo:
    +    pub fn get_my_num() -> u256:
    +        return 42
    +
    +contract FooFactory:
    +    pub fn create_foo() -> address:
    +        # value and salt
    +        foo: Foo = Foo.create(0)
    +        return address(foo)
    +
    +

    Note: We do not yet support init parameters. (#239)

    +
  • +
  • +

    Support updating individual struct fields in storage. (#246)

    +

    Example:

    +
     pub fn update_house_price(price: u256):
    +        self.my_house.price = price
    +
    +
  • +
  • +

    Implement global keccak256 method. The method expects one parameter of bytes[n] +and returns the hash as an u256. In a future version keccak256 will most likely +be moved behind an import so that it has to be imported (e.g. from std.crypto import keccak256). (#255)

    +

    Example:

    +
    pub fn hash_single_byte(val: bytes[1]) -> u256:
    +    return keccak256(val)
    +
    +
  • +
  • +

    Require structs to be initialized using keyword arguments.

    +

    Example:

    +
    struct House:
    +    vacant: bool
    +    price: u256
    +
    +

    Previously, House could be instantiated as House(true, 1000000). +With this change it is required to be instantiated like House(vacant=true, price=1000000)

    +

    This ensures property assignment is less prone to get mixed up. It also makes struct +initialization visually stand out more from function calls. (#260)

    +
  • +
  • +

    Implement support for boolean not operator. (#264)

    +

    Example:

    +
    if not covid_test.is_positive(person):
    +    allow_boarding(person)
    +
    +
  • +
  • +

    Do over/underflow checks for additions (SafeMath).

    +

    With this change all additions (e.g x + y) for signed and unsigned +integers check for over- and underflows and revert if necessary. (#265)

    +
  • +
  • +

    Added a builtin function abi_encode() that can be used to encode structs. The return type is a +fixed-size array of bytes that is equal in size to the encoding. The type system does not support +dynamically-sized arrays yet, which is why we used fixed. (#266)

    +

    Example:

    +
    struct House:
    +    price: u256
    +    size: u256
    +    rooms: u8
    +    vacant: bool
    +
    +contract Foo:
    +    pub fn hashed_house() -> u256:
    +        house: House = House(
    +            price=300,
    +            size=500,
    +            rooms=u8(20),
    +            vacant=true
    +        )
    +        return keccak256(house.abi_encode())
    +
    +
  • +
  • +

    Perform over/underflow checks for subtractions (SafeMath). (#267)

    +

    With this change all subtractions (e.g x - y) for signed and unsigned +integers check for over- and underflows and revert if necessary.

    +
  • +
  • +

    Support for the boolean operations and and or. (#270)

    +

    Examples:

    +
    contract Foo:
    +    pub fn bar(x: bool, y: bool) -> bool:
    +        return x and y
    +
    +
    contract Foo:
    +    pub fn bar(x: bool, y: bool) -> bool:
    +        return x or y
    +
    +

    Support for self.address.

    +

    This expression returns the address of the current contract.

    +

    Example:

    +
    contract Foo:
    +    pub fn bar() -> address:
    +        return self.address
    +
    +
  • +
+

Bugfixes

+
    +
  • +

    Perform type checking when calling event constructors

    +

    Previously, the following would not raise an error even though it should:

    +
    contract Foo:
    +    event MyEvent:
    +        val_1: string100
    +        val_2: u8
    +
    +    pub fn foo():
    +        emit MyEvent("foo", 1000)
    +
    +
    +

    Wit this change, the code fails with a type error as expected. (#202)

    +
  • +
  • +

    Fix bug where compilation of contracts without public functions would result in illegal YUL. (#219)

    +

    E.g without this change, the following doesn't compile to proper YUL

    +
    contract Empty:
    +  lonely: u256
    +
    +
  • +
  • +

    Ensure numeric literals can't exceed 256 bit range. Previously, this would result in a +non user friendly error at the YUL compilation stage. With this change it is caught +at the analyzer stage and presented to the user as a regular error. (#225)

    +
  • +
  • +

    Fix crash when return is used without value.

    +

    These two methods should both be treated as returning ()

    +
      pub fn explicit_return():
    +    return
    +
    +  pub fn implicit():
    +    pass
    +
    +

    Without this change, the explicit_return crashes the compiler. (#261)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Renamed the fe-semantics library to fe-analyzer. (#207)
  • +
  • Runtime testing utilities. (#243)
  • +
  • Values are stored more efficiently in storage. (#251)
  • +
+

0.1.0-alpha "Amethyst" (2021-01-20)

+

WARNING: This is an alpha version to share the development progress with developers and enthusiasts. It is NOT yet intended to be used for anything serious. At this point Fe is missing a lot of features and has a lot of bugs instead.

+

This is the first alpha release and kicks off our release schedule which will be one release every month in the future. Since we have just started tracking progress on changes, the following list of changes is incomplete, but will appropriately document progress between releases from now on.

+

Features

+
    +
  • +

    Added support for for loop, allows iteration over static arrays. (#134)

    +
  • +
  • +

    Enforce bounds on numeric literals in type constructors.

    +

    For instance calling u8(1000) or i8(-250) will give an error because +the literals 1000 and -250 do not fit into u8 or i8. (#145)

    +
  • +
  • +

    Added builtin copying methods clone() and to_mem() to reference types. (#155)

    +

    usage:

    +
    # copy a segment of storage into memory and assign the new pointer
    +my_mem_array = self.my_sto_array.to_mem()
    +
    +# copy a segment of memory into another segment of memory and assign the new pointer
    +my_other_mem_array = my_mem_array.clone()
    +
    +
  • +
  • +

    Support emitting JSON ABI via --emit abi. +The default value of --emit is now abi,bytecode. (#160)

    +
  • +
  • +

    Ensure integer type constructor reject all expressions that aren't a numeric literal. +For instance, previously the compiler would not reject the following code even though it could not be guaranteed that val would fit into an u16.

    +
    pub fn bar(val: u8) -> u16:
    +        return u16(val)
    +
    +

    Now such code is rejected and integer type constructor do only work with numeric literals such as 1 or -3. (#163)

    +
  • +
  • +

    Support for ABI decoding of all array type. (#172)

    +
  • +
  • +

    Support for value assignments in declaration.

    +

    Previously, this code would fail:

    +
    another_reference: u256[10] = my_array
    +
    +

    As a workaround declaration and assignment could be split apart.

    +
    another_reference: u256[10]
    +another_reference = my_array
    +
    +

    With this change, the shorter declaration with assignment syntax is supported. (#173)

    +
  • +
+

Improved Documentation

+
    +
  • Point to examples in the README (#162)
  • +
  • Overhaul README page to better reflect the current state of the project. (#177)
  • +
  • Added descriptions of the to_mem and clone functions to the spec. (#195)
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Updated the Solidity backend to v0.8.0. (#169)
  • +
  • Run CI tests on Mac and support creating Mac binaries for releases. (#178)
  • +
+

Contributor Covenant Code of Conduct

+

Our Pledge

+

We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual identity +and orientation.

+

We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community.

+

Our Standards

+

Examples of behavior that contributes to a positive environment for our +community include:

+
    +
  • Demonstrating empathy and kindness toward other people
  • +
  • Being respectful of differing opinions, viewpoints, and experiences
  • +
  • Giving and gracefully accepting constructive feedback
  • +
  • Accepting responsibility and apologizing to those affected by our mistakes, +and learning from the experience
  • +
  • Focusing on what is best not just for us as individuals, but for the +overall community
  • +
+

Examples of unacceptable behavior include:

+
    +
  • The use of sexualized language or imagery, and sexual attention or +advances of any kind
  • +
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • +
  • Public or private harassment
  • +
  • Publishing others' private information, such as a physical or email +address, without their explicit permission
  • +
  • Other conduct which could reasonably be considered inappropriate in a +professional setting
  • +
+

Enforcement Responsibilities

+

Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful.

+

Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate.

+

Scope

+

This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event.

+

Enforcement

+

Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +piper@pipermerriam.com. +All complaints will be reviewed and investigated promptly and fairly.

+

All community leaders are obligated to respect the privacy and security of the +reporter of any incident.

+

Enforcement Guidelines

+

Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct:

+

1. Correction

+

Community Impact: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community.

+

Consequence: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested.

+

2. Warning

+

Community Impact: A violation through a single incident or series +of actions.

+

Consequence: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban.

+

3. Temporary Ban

+

Community Impact: A serious violation of community standards, including +sustained inappropriate behavior.

+

Consequence: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban.

+

4. Permanent Ban

+

Community Impact: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals.

+

Consequence: A permanent ban from any sort of public interaction within +the community.

+

Attribution

+

This Code of Conduct is adapted from the Contributor Covenant, +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

+

Community Impact Guidelines were inspired by +Mozilla's code of conduct enforcement ladder.

+

For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available +at https://www.contributor-covenant.org/translations.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/quickstart/deploy_contract.html b/docs/quickstart/deploy_contract.html new file mode 100644 index 0000000000..10c7b01fbf --- /dev/null +++ b/docs/quickstart/deploy_contract.html @@ -0,0 +1,359 @@ + + + + + + Deploying a contract to a testnet - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Deploy your contract.

+

Prerequisites

+

You should have compiled the GuestBook contract and have both Guestbook_abi.json and GuestBook.bin available in your outputs folder. +If you don't have any of these components, please revisit Write your first contract.

+

Introduction

+

When you develop smart contracts it is common to test them on local blockchains first because they are quick and easy to create and it doesn't matter if you make mistakes - there is nothing of real value secured by the blockchain as it only exists on your computer. Later, you can deploy your contract on a public test network to see how it behaves in a more realistic environment where other developers are also testing their code. Finally, when you are very confident that your contract is ready, you can deploy to Ethereum Mainnet (or one of its live Layer-2 networks). Once the contract is deployed on a "live" network, you are handling assets with real-world value!

+

In this guide, you will deploy your contract to a local blockchain. This will be an "ephemeral" blockchain, meaning it is completely destroyed every time you shut it down and recreated from scratch every time you start it up - it won't save its state when you shut it down. The benefit of this is quick and easy development, and you don't need to find test ETH to pay gas fees. Later in the guide, you will learn how to deploy to a live public test network too.

+

Your developer environment

+

Everything in this tutorial can be done by sending JSON data directly to an Ethereum node. However, this is often awkward and error-prone, so a rich ecosystem of tooling has been developed to allow developers to interact with Ethereum in familiar languages or using abstractions that simplify the process.

+

In this guide, you will use Foundry which is a very lightweight set of command-line tools for managing smart contract development. If you already have Foundry installed, head straight to the next section. If you need to install Foundry, head to getfoundry.sh and follow the installation steps.

+
+

Note: If you are a seasoned smart contract developer, feel free to follow the tutorial using your own toolchain.

+
+

Deploying to a local network

+

Foundry has its own local network called Anvil. You can use it to create a local blockchain on your computer. Open a terminal and run the following very simple command:

+
anvil 
+
+

You will see some ASCII art and configuration details in the terminal. Anvil creates a set of accounts that you can use on this network. The account addresses and private keys are displayed in the console (never use these accounts to interact with any live network). You will also see a line reading listening on 127.0.0.1:8545. This indicates that your local node is listening for HTTP traffic on your local network on port 8545 - this is important because this is how you will send the necessary information to your node so that it can be added to the blockchain, and how you will interact with the contract after it is deployed.

+
+

Note: Anvil needs to keep running throughout this tutorial - if you close the terminal your blockchain will cease to exist. Once Anvil has started, open a new terminal tab/window to run the rest of the commands in this guide.

+
+

Making the deployment transaction

+

In the previous guide you wrote the following contract, and compiled it using ./fe build guest_book.fe --overwrite to obtain the contract bytecode. This compilation stage converts the human-readable Fe code into a format that can be efficiently executed by Ethereum's embedded computer, known as the Ethereum Virtual Machine (EVM). The bytecode is stored at an address on the blockchain. The contract functions are invoked by sending instructions in a transaction to that address.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+    self.messages[ctx.msg_sender()] = book_msg
+  }
+
+  pub fn get_msg(self, addr: address) -> String<100> {
+    return self.messages[addr].to_mem()
+  }
+}
+
+

To make the deployment, we will need to send a transaction to your node via its exposed HTTP port (8545).

+

The following command deploys the Guestbook contract to your local network. Grab the private key of one of your accounts from the information displayed in the terminal running Anvil.

+
cast send --rpc-url localhost:8545 --private-key <your-private-key> --create $(cat output/GuestBook/GuestBook.bin)
+
+

Here's what the response was at the time of writing this tutorial.

+
blockHash               0xcee9ff7c0b57822c5f6dd4fbd3a7e9eadb594b84d770f56f393f137785a52702
+blockNumber             1
+contractAddress         0x5FbDB2315678afecb367f032d93F642f64180aa3
+cumulativeGasUsed       196992
+effectiveGasPrice       4000000000
+gasUsed                 196992
+logs                    []
+logsBloom               0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+root                    
+status                  1
+transactionHash         0x3fbde2a994bf2dec8c11fb0390e9d7fbc0fa1150f5eab8f33c130b4561052622
+transactionIndex        0
+type                    2
+
+

This response tells you that your contract has been deployed to the blockchain. The transaction was included in block number 1, and the address it was deployed to is provided in the contractAddress field - you need this address to interact with the contract.

+
+

Note: Don't assume responses to be identical when following the tutorial. Due to the nature of the blockchain environment the content of the responses will always differ slightly.

+
+

Signing the guest book

+

Now that the contract is deployed to the blockchain, you can send a transaction to sign it with a custom message. You will sign it from the same address that was used to deploy the contract, but there is nothing preventing you from using any account for which you have the private key (you could experiment by signing from all ten accounts created by Anvil, for example).

+

The following command will send a transaction to call sign(string) on our freshly deployed Guestbook contract sitting at address 0x810cbd4365396165874c054d01b1ede4cc249265 with the message "We <3 Fe".

+
cast send --rpc-url http://localhost:8545 --private-key <your-private-key> <contract-address> "sign(string)" '"We <3 Fe"'
+
+

The response will look approximately as follows:

+
blockHash               0xb286898484ae737d22838e27b29899b327804ec45309e47a75b18cfd7d595cc7
+blockNumber             2
+contractAddress         
+cumulativeGasUsed       36278
+effectiveGasPrice       3767596722
+gasUsed                 36278
+logs                    []
+logsBloom               0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+root                    
+status                  1
+transactionHash         0x309bcea0a77801c15bb7534beab9e33dcb613c93cbea1f12d7f92e4be5ecab8c
+transactionIndex        0
+type                    2
+
+

Reading the signatures

+

The get_msg(address) API allows you to read the messages added to the guestbook for a given address. It will give us a response of 100 zero bytes for any address that hasn't yet signed the guestbook.

+

Since reading the messages doesn't change any state within the blockchain, you don't have to send an actual transaction. Instead, you can perform a call against the local state of the node that you are querying.

+

To do that run:

+
$ cast call --rpc-url http://localhost:8545 <contract-address> "get_msg(address)" <your-account-address-that-signed-the-guestbook>
+
+

Notice that the command doesn't need to provide a private key simply because we are not sending an actual transaction.

+

The response arrives in the form of hex-encoded bytes padded with zeroes:

+
0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000
+
+

Foundry provides a built-in method to convert this hex string into human-readable ASCII. You can do this as follows:

+
cast to_ascii "0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000"
+
+

or simply pipe the output of the cast call to to_ascii to do the query and conversion in a single command:

+
cast call --rpc-url https://rpc.sepolia.org <contract-address> "get_msg(address)" <your-account-address-that-signed-the-guestbook> | cast --to-ascii
+
+

Either way, the response will be the message you passed to the sign(string) function.

+
"We <3 Fe"
+
+

Congratulations! You've deployed real Fe code to a local blockchain! 🤖

+

Deploying to a public test network

+

Now you have learned how to deploy your contract to a local blockchain, you can consider deploying it to a public test network too. For more complex projects this can be very beneficial because it allows many users to interact with your contract, simulates real network conditions and allows you to interact with other existing contracts on the network. However, to use a public testnet you need to obtain some of that testnet's gas token.

+

In this guide you will use the Sepolia test network, meaning you will need some SepoliaETH. SepoliaETH has no real-world value - it is only required to pay gas fees on the network. If you don't have any SepoliaETH yet, you can request some SepoliaETH from one of the faucets that are listed on the ethereum.org website.

+
+

IMPORTANT: It is good practice to never use an Ethereum account for a testnet that is also used for the actual Ethereum mainnet.

+
+

Assuming you have some SepoliaETH, you can repeat the steps from the local blockchain example, however, instead of pointing Foundry to the RPC endpoint for your Anvil node, you need to point it to a node connected to the Sepolia network. There are several options for this:

+
    +
  • If you run your own node, connect it to the Sepolia network and let it sync. make sure you expose an http port or enable IPC transport.
  • +
  • You can use an RPC provider such as Alchemy or Infura
  • +
  • You can use an open public node such as https://rpc.sepolia.org.
  • +
+

Whichever method you choose, you will have an RPC endpoint for a node connected to Sepolia. You can replace the http://localhost:8545 in the commands with your new endpoint. For example, to deploy the contract using the open public endpoint:

+
cast send --rpc-url https://rpc.sepolia.org --private-key <your-private-key> --create $(cat output/GuestBook/GuestBook.bin)
+
+

Now you have deployed the contract to a public network and anyone can interact with it.

+

To demonstrate, you can check out previous versions of this contract deployed on Sepolia in the past:

+
+ + +
addresslink
deploy tx hash0x31b41a4177d7eb66f5ea814959b2c147366b6323f17b6f7060ecff424b58df76etherscan
contract address0x810cbd4365396165874C054d01B1Ede4cc249265etherscan
+
+

Note that calling the sign(string) function will cost you some SepoliaETH because the function changes the state of the blockchain (it adds a message to the contract storage). However, get_msg(address) does not cost any gas because it is a simple lookup in the node's local database.

+

Congratulations! You've deployed real Fe code to a live network 🤖

+

Summary

+

Well done!

+

You have now written and compiled a Fe contract and deployed it to both a local blockchain and a live public test network! You also learned how to interact with the deployed contract using transactions and calls.

+

Here's some ideas for what you could do next:

+
    +
  • Experiment with different developer tooling
  • +
  • Get more comfortable with Foundry by exploring the documentation
  • +
  • Repeat the steps in this guide but for a more complex contract - be creative!
  • +
  • Continue to the Using Fe pages to explore Fe more deeply.
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/quickstart/first_contract.html b/docs/quickstart/first_contract.html new file mode 100644 index 0000000000..905cc85c6a --- /dev/null +++ b/docs/quickstart/first_contract.html @@ -0,0 +1,338 @@ + + + + + + Write your first contract - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Write your first Fe contract

+

Now that we have the compiler installed let's write our first contract. A contract contains the code that will be deployed to the Ethereum blockchain and resides at a specific address.

+

The code of the contract dictates how:

+
    +
  • it manipulates its own state
  • +
  • interacts with other contracts
  • +
  • exposes external APIs to be called from other contracts or users
  • +
+

To keep things simple we will just write a basic guestbook where people can leave a message associated with their Ethereum address.

+
+

Note: Real code would not instrument the Ethereum blockchain in such a way as it is a waste of precious resources. This code is for demo purposes only.

+
+

Create a guest_book.fe file

+

Fe code is written in files ending on the .fe file extension. Let's create a file guest_book.fe and put in the following content.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+}
+
+

Here we're using a map to associate messages with Ethereum addresses. +The messages will simply be a string of a maximum length of 100 written as String<100>. +The addresses are represented by the builtin address type.

+

Execute ./fe build guest_book.fe to compile the file. The compiler tells us that it compiled our contract and that it has put the artifacts into a subdirectory called output.

+
Compiled guest_book.fe. Outputs in `output`
+
+

If we examine the output directory we'll find a subdirectory GuestBook with a GuestBook_abi.json and a GuestBook.bin file.

+
├── fe
+├── guest_book.fe
+└── output
+    └── GuestBook
+        ├── GuestBook_abi.json
+        └── GuestBook.bin
+
+

The GuestBook_abi.json is a JSON representation that describes the binary interface of our contract but since our contract doesn't yet expose anything useful its content for now resembles an empty array.

+

The GuestBook.bin is slightly more interesting containing what looks like a gibberish of characters which in fact is the compiled binary contract code written in hexadecimal characters.

+

We don't need to do anything further yet with these files that the compiler produces but they will become important when we get to the point where we want to deploy our code to the Ethereum blockchain.

+

Add a method to sign the guest book

+

Let's focus on the functionality of our world changing application and add a method to sign the guestbook.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+      self.messages[ctx.msg_sender()] = book_msg
+  }
+}
+
+

In Fe, every method that is defined without the pub keyword becomes private. Since we want people to interact with our contract and call the sign method we have to prefix it with pub.

+

Let's recompile the contract again and see what happens.

+
Failed to write output to directory: `output`. Error: Directory 'output' is not empty. Use --overwrite to overwrite.
+
+

Oops, the compiler is telling us that the output directory is a non-empty directory and plays it safe by asking us if we are sure that we want to overwrite it. We have to use the --overwrite flag to allow the compiler to overwrite what is stored in the output directory.

+

Let's try it again with ./fe build guest_book.fe --overwrite.

+

This time it worked and we can also see that the GuestBook_abi.json has become slightly more interesting.

+
[
+  {
+    "name": "sign",
+    "type": "function",
+    "inputs": [
+      {
+        "name": "book_msg",
+        "type": "bytes100"
+      }
+    ],
+    "outputs": []
+  }
+]
+
+

Since our contract now has a public sign method the corresponding ABI has changed accordingly.

+

Add a method to read a message

+

To make the guest book more useful we will also add a method get_msg to read entries from a given address.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+      self.messages[ctx.msg_sender()] = book_msg
+  }
+
+  pub fn get_msg(self, addr: address) -> String<100> {
+      return self.messages[addr]
+  }
+}
+
+

However, we will hit another error as we try to recompile the current code.

+
Unable to compile guest_book.fe.
+error: value must be copied to memory
+  ┌─ guest_book.fe:10:14
+  │
+8 │       return self.messages[addr]
+  │              ^^^^^^^^^^^^^^^^^^^ this value is in storage
+  │
+  = Hint: values located in storage can be copied to memory using the `to_mem` function.
+  = Example: `self.my_array.to_mem()`
+
+

When we try to return a reference type such as an array from the storage of the contract we have to explicitly copy it to memory using the to_mem() function.

+
+

Note: In the future Fe will likely introduce immutable storage pointers which might affect these semantics.

+
+

The code should compile fine when we change it accordingly.

+
contract GuestBook {
+  messages: Map<address, String<100>>
+
+  pub fn sign(mut self, ctx: Context, book_msg: String<100>) {
+      self.messages[ctx.msg_sender()] = book_msg
+  }
+
+  pub fn get_msg(self, addr: address) -> String<100> {
+      return self.messages[addr].to_mem()
+  }
+}
+
+

Congratulations! You finished your first little Fe project. 👏 +In the next chapter we will learn how to deploy our code and tweak it a bit further.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/quickstart/index.html b/docs/quickstart/index.html new file mode 100644 index 0000000000..f3df80ed42 --- /dev/null +++ b/docs/quickstart/index.html @@ -0,0 +1,243 @@ + + + + + + Quickstart - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Quickstart

+

Let's get started with Fe!

+

In this section you will learn how to write and deploy your first contract.

+ +

Download and install Fe

+

Before you dive in, you need to download and install Fe. +For this quickstart you should simply download the binary from fe-lang.org.

+

Then change the name and file permissions:

+
mv fe_amd64 fe
+chmod +x fe
+
+

Now you are ready to do the quickstart tutorial!

+

For more detailed information on installing Fe, or to troubleshoot, see the Installation page in our user guide.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/release_notes.html b/docs/release_notes.html new file mode 100644 index 0000000000..3d726842f0 --- /dev/null +++ b/docs/release_notes.html @@ -0,0 +1,2870 @@ + + + + + + Release Notes - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Release Notes

+

🖥️ Download Binaries +📄 Draft Spec +ℹ️ Getting Started

+

Fe is moving fast. Read up on all the latest improvements.

+

0.26.0 "Zircon" (2023-11-03)

+

Features

+
    +
  • +

    Give option to produce runtime bytecode as compilation artifact

    +

    Previously, the compiler could only produce the bytecode that is used +for the deployment of the contract. Now it can also produce the runtime +bytecode which is the bytecode that is saved to storage.

    +

    Being able to obtain the runtime bytecode is useful for contract +verification.

    +

    To obtain the runtime bytecode use the runtime-bytecode option +of the --emit flag (multiple options allowed).

    +

    Example Output:

    +
      +
    • mycontract.bin (bytecode for deployment)
    • +
    • mycontract.runtime.bin (runtime bytecode) (#947)
    • +
    +
  • +
  • +

    New verify command to verify onchain contracts against local source code.

    +

    People need to be able to verify that a deployed contract matches the source code +that the author claims was used to deploy it. Previously, there was no simple +way to achieve this.

    +

    These are the steps to verify a contract with the verify command:

    +
      +
    1. Obtain the project's source code locally.
    2. +
    3. Ensure it is the same source code that was used to deploy the contract. (e.g. check out a specific tag)
    4. +
    5. From the project directory run fe verify <contract-address> <json-rpc-url>
    6. +
    +

    Example:

    +
    $ fe verify 0xf0adbb9ed4135d1509ad039505bada942d18755f https://example-eth-mainnet-rpc.com
    +It's a match!✨
    +
    +Onchain contract:
    +Address: 0xf0adbb9ed4135d1509ad039505bada942d18755f
    +Bytecode: 0x60008..76b90
    +
    +Local contract:
    +Contract name: SimpleDAO
    +Source file: /home/work/ef/simple_dao/fe_contracts/simpledao/src/main.fe
    +Bytecode: 0x60008..76b90
    +
    +Hint: Run with --verbose to see the contract's source code.
    +
    +

    (#948)

    +
  • +
+

Improved Documentation

+
    +
  • Added a new page on EVM precompiles (#944)
  • +
+

0.25.0 "Yoshiokaite" (2023-10-26)

+

Features

+
    +
  • +

    Use the project root as default path for fe test

    +

    Just run fe test from any directory of the project. (#913)

    +
  • +
  • +

    Completed std::buf::MemoryBuffer refactor. (#917)

    +
  • +
  • +

    Allow filtering tests to run via fe test --filter <some-filter

    +

    E.g. Running fe test --filter foo will run all tests that contain foo in their name. (#919)

    +
  • +
  • +

    Logs for successfully ran tests can be printed with the --logs parameter.

    +

    example:

    +
    // test_log.fe
    +
    +use std::evm::log0
    +use std::buf::MemoryBuffer
    +
    +struct MyEvent {
    +  pub foo: u256
    +  pub baz: bool
    +  pub bar: u256
    +}
    +
    +#test
    +fn test_log(mut ctx: Context) {
    +  ctx.emit(MyEvent(foo: 42, baz: false, bar: 26))
    +  unsafe { log0(buf: MemoryBuffer::new(len: 42)) }
    +}
    +
    +
    +
    $ fe test --logs test_log.fe
    +executing 1 test in test_log:
    +  test_log ... passed
    +
    +test_log produced the following logs:
    +  MyEvent emitted by 0x0000…002a with the following parameters [foo: 2a, baz: false, bar: 1a]
    +  Log { address: 0x000000000000000000000000000000000000002a, topics: [], data: b"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1a\0\0\0\0\0\0\0\0\0\0" }
    +
    +
    +1 test passed; 0 tests failed; 1 test executed
    +
    +

    Note: Logs are not collected for failing tests. (#933)

    +
  • +
  • +

    Adds 'functions' section to docs with information on self and Context. (#937)

    +
  • +
+

Bugfixes

+
    +
  • +

    Yul codegen was failing to include string literals used in test assertions. This resulted in a compiler error.

    +

    Example:

    +
    #test
    +fn foo() {
    +    assert false, "oops"
    +}
    +
    +

    The example code above was failing to compile, but now it compiles and executes as expected. (#926)

    +
  • +
+

Improved Documentation

+
    +
  • Added a new tutorial: Open Auction (#930)
  • +
+

0.24.0 "Xenotime" (2023-08-10)

+

Features

+
    +
  • +

    Added support for project manifests and project dependencies.

    +

    Example:

    +
    my_project
    +├── fe.toml
    +└── src
    +    └── main.fe
    +
    +
    # fe.toml
    +name = "my_project"
    +version = "1.0"
    +
    +[dependencies]
    +my_lib = { path = "../path/to/my_lib", version = "1.0" }
    +my_other_lib = "../path/to/my_other_lib"
    +
    +

    Note: The current implementation supports circular dependencies. (#908)

    +
  • +
+

Performance improvements

+
    +
  • MemoryBuffer now allocates an extra 31 bytes. This removes the need for runtime checks and bitshifting needed to ensure safe writing to a MemoryBuffer's region. (#898)
  • +
+

Improved Documentation

+
    +
  • Link to vs-code extension in Quickstart Guide (#910)
  • +
+

0.23.0 "Wiluite" (2023-06-01)

+

Features

+
    +
  • +

    Fixed an issue where generic parameters that were mut could not be satisfied at callsite.

    +

    For instance, the following code would previously cause a compile error but now works as expected:

    +
    #![allow(unused)]
    +fn main() {
    +struct Runner {
    +  pub fn run<T: Computable>(self, mut _ val: T) -> u256 {
    +    return val.compute(val: 1000)
    +  }
    +}
    +
    +contract Example {
    +  pub fn run_test(self) {
    +    let runner: Runner = Runner();
    +    let mut mac: Mac = Mac();
    +
    +    assert runner.run(mac) == 1001
    +  }
    +}
    +}
    +

    (#865)

    +
  • +
  • +

    The ctx parameter can now be passed into test functions.

    +

    example:

    +
    #test
    +fn my_test(ctx: Context) {
    +    assert ctx.block_number() == 0
    +}
    +
    +

    (#880)

    +
  • +
  • +

    The following has been added to the standard library:

    +

    Memory buffer abstraction

    +

    example:

    +
    use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}
    +use std::traits::Max
    +
    +#test
    +fn test_buf_rw() {
    +    let mut buf: MemoryBuffer = MemoryBuffer::new(len: 161) 
    +    let mut writer: MemoryBufferWriter = buf.writer()
    +    let mut reader: MemoryBufferReader = buf.reader()
    +
    +    writer.write(value: 42)
    +    writer.write(value: 42)
    +    writer.write(value: 26)
    +    writer.write(value: u8(26))
    +    writer.write(value: u256::max())
    +    writer.write(value: u128::max())
    +    writer.write(value: u64::max())
    +    writer.write(value: u32::max())
    +    writer.write(value: u16::max())
    +    writer.write(value: u8::max())
    +    writer.write(value: u8(0))
    +
    +    assert reader.read_u256() == 42
    +    assert reader.read_u256() == 42
    +    assert reader.read_u256() == 26
    +    assert reader.read_u8() == 26
    +    assert reader.read_u256() == u256::max()
    +    assert reader.read_u128() == u128::max()
    +    assert reader.read_u64() == u64::max()
    +    assert reader.read_u32() == u32::max()
    +    assert reader.read_u16() == u16::max()
    +    assert reader.read_u8() == u8::max()
    +    assert reader.read_u8() == 0
    +}
    +
    +

    Precompiles

    +

    example:

    +
    use std::precompiles
    +use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}
    +
    +#test
    +fn test_ec_recover() {
    +    let result: address = precompiles::ec_recover(
    +        hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3,
    +        v: 28,
    +        r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608,
    +        s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada
    +    )
    +
    +    assert result == address(0x7156526fbd7a3c72969b54f64e42c10fbb768c8a)
    +}
    +
    +

    ctx.raw_call()

    +

    example:

    +
    use std::buf::{
    +    RawCallBuffer,
    +    MemoryBufferReader, 
    +    MemoryBufferWriter
    +}
    +use std::evm
    +
    +contract Foo {
    +    pub unsafe fn __call__() {
    +        if evm::call_data_load(offset: 0) == 42 {
    +            evm::mstore(offset: 0, value: 26)
    +            evm::return_mem(offset: 0, len: 32)
    +        } else if evm::call_data_load(offset: 0) == 26 {
    +            revert
    +        }
    +    }
    +}
    +
    +#test
    +fn test_raw_call(mut ctx: Context) {
    +    let foo: Foo = Foo.create(ctx, 0)
    +
    +    let mut buf: RawCallBuffer = RawCallBuffer::new(
    +        input_len: 32, 
    +        output_len: 32
    +    )
    +    let mut writer: MemoryBufferWriter = buf.writer()
    +
    +    writer.write(value: 42)
    +    assert ctx.raw_call(addr: address(foo), value: 0, buf)
    +  
    +    let mut reader: MemoryBufferReader = buf.reader()
    +    assert reader.read_u256() == 26
    +
    +    assert not ctx.raw_call(addr: address(foo), value: 0, buf)
    +}
    +
    +

    (#885)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed an ICE when using aggregate types with aggregate type fields in public functions

    +

    This code would previously cause an ICE:

    +
    struct Tx {
    +  pub data: Array<u8, 320>
    +}
    +
    +contract Foo {
    +  pub fn bar(mut tx: Tx) {}
    +}
    +
    +

    (#867)

    +
  • +
  • +

    Fixed a regression where the compiler would not reject a method call on a struct in storage.

    +

    E.g. the follwing code should be rejected as it is missing a to_mem() call:

    +
    struct Bar {
    +    pub x: u256
    +
    +    pub fn get_x(self) -> u256{
    +        return self.x
    +    }
    +}
    +
    +contract Foo {
    +    bar: Bar
    +
    +    pub fn __init__(mut self) {
    +        self.bar = Bar( x: 2 )
    +    }
    +    fn yay(self) {
    +        self.bar.get_x()
    +    }
    +}
    +
    +

    The compiler will now reject the code and suggest a to_mem() before callingget_x(). (#881)

    +
  • +
+

0.22.0 "Vulcanite" (2023-04-05)

+

This is the first non-alpha release of Fe. Read our announcement for more details.

+

Features

+
    +
  • +

    Support for tests.

    +

    example:

    +
    #test
    +fn my_test() {
    +    assert 26 + 16 == 42
    +}
    +
    +

    Tests can be executed using the test subcommand.

    +

    example:

    +

    $ fe test foo.fe (#807)

    +
  • +
  • +

    Fixed broken trait orphan rule

    +

    Fe has an orphan rule for Traits similar to Rust's that requires +that either the trait or the type that we are implementing the trait for +are located in the same ingot as the impl. This rule was implemented +incorrectly so that instead of requiring them to be in the same ingot, +they were required to be in the same module. This change fixes this +so that the orphan rule is enforced correctly. +(#863)

    +
  • +
  • +

    address values can now be specified with a number literal, with no explicit +cast. So instead of let t: address = address(0xfe), one can now write +let t: address = 0xfe. This also means that it's possible to define const +addresses: const SOME_KNOWN_CONTRACT: address = 0xfefefefe +(#864)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed resolving of generic arguments to associated functions.

    +

    For example, this code would previously crash the compiler:

    +
    #![allow(unused)]
    +fn main() {
    +...
    +  // This function doesn't take self
    +  pub fn run_static<T: Computable>(_ val: T) -> u256 {
    +    return val.compute(val: 1000)
    +  }
    +...
    +
    +// Invoking it would previously crash the compiler
    +Runner::run_static(Mac())
    +...
    +}
    +

    (#861)

    +
  • +
+

Improved Documentation

+
    +
  • Changed the Deployment tutorial to use foundry and the Sepolia network (#853)
  • +
+

0.21.0-alpha (2023-02-28)

+

Features

+
    +
  • +

    Support for Self type

    +

    With this change Self (with capital S) can be used to refer +to the enclosing type in contracts, structs, impls and traits.

    +

    E.g.

    +
    trait Min {
    +  fn min() -> Self;
    +}
    +
    +impl Min for u8 {
    +  fn min() -> u8 { // Both `u8` or `Self` are valid here
    +    return 0
    +  }
    +}
    +
    +

    Usage: u8::min() (#803)

    +
  • +
  • +

    Added Min and Max traits to the std library. +The std library implements the traits for all numeric types.

    +

    Example

    +
    use std::traits::{Min, Max}
    +...
    +
    +assert u8::min() < u8::max()
    +``` ([#836](https://github.com/ethereum/fe/issues/836))
    +
    +
    +
  • +
  • +

    Upgraded underlying solc compiler to version 0.8.18

    +
  • +
+

Bugfixes

+
    +
  • the release contains minor bugfixes
  • +
+

0.20.0-alpha (2022-12-05)

+

Features

+
    +
  • +

    Removed the event type as well as the emit keyword. +Instead the struct type now automatically implements +the Emittable trait and can be emitted via ctx.emit(..).

    +

    Indexed fields can be annotated via the #indexed attribute.

    +

    E.g.

    +
    struct Signed {
    +    book_msg: String<100>
    +}
    +
    +contract GuestBook {
    +    messages: Map<address, String<100>>
    +
    +    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
    +        self.messages[ctx.msg_sender()] = book_msg
    +        ctx.emit(Signed(book_msg))
    +    }
    +}
    +
    +

    (#717)

    +
  • +
  • +

    Allow to call trait methods on types when trait is in scope

    +

    So far traits were only useful as bounds for generic functions. +With this change traits can also be used as illustrated with +the following example:

    +
    trait Double {
    +  fn double(self) -> u256;
    +}
    +
    +impl Double for (u256, u256) {
    +  fn double(self) -> u256 {
    +    return (self.item0 + self.item1) * 2
    +  }
    +}
    +
    +contract Example {
    +
    +  pub fn run_test(self) {
    +    assert (0, 1).double() == 2
    +  }
    +}
    +
    +

    If a call turns out to be ambigious the compiler currently asks the +user to disambiguate via renaming. In the future we will likely +introduce a syntax to allow to disambiguate at the callsite. (#757)

    +
  • +
  • +

    Allow contract associated functions to be called via ContractName::function_name() syntax. (#767)

    +
  • +
  • +

    Add enum types and match statement.

    +

    enum can now be defined, e.g.,

    +
    pub enum MyEnum {
    +    Unit
    +    Tuple(u32, u256, bool)
    +  
    +    fn unit() -> MyEnum {
    +        return MyEnum::Unit
    +    }
    +}
    +
    +

    Also, match statement is introduced, e.g.,

    +
    pub fn eval_enum()  -> u256{
    +    match MyEnum {
    +        MyEnum::Unit => { 
    +            return 0
    +        }
    +      
    +        MyEnum::Tuple(a, _, false) => {
    +            return u256(a)
    +        }
    +      
    +        MyEnum::Tuple(.., true) => {
    +            return u256(1)
    +        }
    +    }
    +}
    +
    +

    For now, available patterns are restricted to

    +
      +
    • Wildcard(_), which matches all patterns: _
    • +
    • Named variable, which matches all patterns and binds the value to make the value usable in the arm. e.g., a, b and c in MyEnum::Tuple(a, b, c)
    • +
    • Boolean literal(true and false)
    • +
    • Enum variant. e.g., MyEnum::Tuple(a, b, c)
    • +
    • Tuple pattern. e.g., (a, b, c)
    • +
    • Struct pattern. e.g., MyStruct {x: x1, y: y1, b: true}
    • +
    • Rest pattern(..), which matches the rest of the pattern. e.g., MyEnum::Tuple(.., true)
    • +
    • Or pattern(|). e.g., MyEnum::Unit | MyEnum::Tuple(.., true)
    • +
    +

    Fe compiler performs the exhaustiveness and usefulness checks for match statement.
    +So the compiler will emit an error when all patterns are not covered or an unreachable arm are detected. (#770)

    +
  • +
  • +

    Changed comments to use // instead of # (#776)

    +
  • +
  • +

    Added the mut keyword, to mark things as mutable. Any variable or function parameter +not marked mut is now immutable.

    +
    contract Counter {
    +    count: u256
    +
    +    pub fn increment(mut self) -> u256 {
    +        // `self` is mutable, so storage can be modified
    +        self.count += 1
    +        return self.count
    +    }
    +}
    +
    +struct Point {
    +    pub x: u32
    +    pub y: u32
    +
    +    pub fn add(mut self, _ other: Point) {
    +        self.x += other.x
    +        self.y += other.y
    +
    +        // other.x = 1000 // ERROR: `other` is not mutable
    +    }
    +}
    +
    +fn pointless() {
    +    let origin: Point = Point(x: 0, y: 0)
    +    // origin.x = 10 // ERROR: origin is not mutable
    +
    +    let x: u32 = 10
    +    // x_coord = 100 // ERROR: `x_coord` is not mutable
    +    let mut y: u32 = 0
    +    y = 10 // OK
    +
    +    let mut p: Point = origin // copies `origin`
    +    p.x = 10 // OK, doesn't modify `origin`
    +
    +    let mut q: Point = p // copies `p`
    +    q.x = 100            // doesn't modify `p`
    +
    +    p.add(q)
    +    assert p.x == 110
    +}
    +
    +

    Note that, in this release, primitive type function parameters +can't be mut. This restriction might be lifted in a future release.

    +

    For example:

    +
    fn increment(mut x: u256) { // ERROR: primitive type parameters can't be mut
    +    x += 1
    +}
    +
    +

    (#777)

    +
  • +
  • +

    The contents of the std::prelude module (currently just the Context struct) +are now automatically used by every module, so use std::context::Context is +no longer required. (#779)

    +
  • +
  • +

    When the Fe compiler generates a JSON ABI file for a contract, the +"stateMutability" field for each function now reflects whether the function can +read or modify chain or contract state, based on the presence or absence of the +self and ctx parameters, and whether those parameters are mutable.

    +

    If a function doesn't take self or ctx, it's "pure". +If a function takes self or ctx immutably, it can read state but not mutate +state, so it's a "view" +If a function takes mut self or mut ctx, it can mutate state, and is thus +marked "payable".

    +

    Note that we're following the convention set by Solidity for this field, which +isn't a perfect fit for Fe. The primary issue is that Fe doesn't currently +distinguish between "payable" and "nonpayable" functions; if you want a function +to revert when Eth is sent, you need to do it manually +(eg assert ctx.msg_value() == 0). (#783)

    +
  • +
  • +

    Trait associated functions

    +

    This change allows trait functions that do not take a self parameter. +The following demonstrates a possible trait associated function and its usage:

    +
    trait Max {
    +  fn max(self) -> u8;
    +}
    +
    +impl Max for u8 {
    +  fn max() -> u8 {
    +    return u8(255)
    +  }
    +}
    +
    +contract Example {
    +
    +  pub fn run_test(self) {
    +    assert u8::max() == 255
    +  }
    +}
    +
    +

    (#805)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fix issue where calls to assiciated functions did not enforce visibility rules.

    +

    E.g the following code should be rejected but previously wasn't:

    +
    struct Foo {
    +    fn do_private_things() {
    +    }
    +}
    +
    +contract Bar {
    +    fn test() {
    +        Foo::do_private_things()
    +    }
    +}
    +
    +

    With this change, the above code is now rejected because do_private_things is not pub. (#767)

    +
  • +
  • +

    Padding on bytes and string ABI types is zeroed out. (#769)

    +
  • +
  • +

    Ensure traits from other modules or even ingots can be implemented (#773)

    +
  • +
  • +

    Certain cases where the compiler would not reject pure functions +being called on instances are now properly rejected. (#775)

    +
  • +
  • +

    Reject calling to_mem() on primitive types in storage (#801)

    +
  • +
  • +

    Disallow importing private type via use

    +

    The following was previously allowed but will now error:

    +

    use foo::PrivateStruct (#815)

    +
  • +
+

0.19.1-alpha "Sunstone" (2022-07-06)

+

Features

+
    +
  • +

    Support returning nested struct.

    +

    Example:

    +
    pub struct InnerStruct {
    +    pub inner_s: String<10>
    +    pub inner_x: i256
    +}
    +
    +pub struct NestedStruct {
    +    pub inner: InnerStruct
    +    pub outer_x: i256
    +}
    +
    +contract Foo {
    +    pub fn return_nested_struct() -> NestedStruct {
    +        ...
    +    }
    +}
    +
    +

    (#635)

    +
  • +
  • +

    Made some small changes to how the Context object is used.

    +
      +
    • ctx is not required when casting an address to a contract type. Eg let foo: Foo = Foo(address(0))
    • +
    • ctx is required when calling an external contract function that requires ctx
    • +
    +

    Example:

    +
    use std::context::Context // see issue #679
    +
    +contract Foo {
    +  pub fn emit_stuff(ctx: Context) {
    +    emit Stuff(ctx)  # will be `ctx.emit(Stuff{})` someday
    +  }
    +}
    +contract Bar {
    +  pub fn call_foo_emit_stuff(ctx: Context) {
    +    Foo(address(0)).emit_stuff(ctx)
    +  }
    +}
    +event Stuff {}
    +
    +

    (#703)

    +
  • +
  • +

    Braces! Fe has abandoned python-style significant whitespace in favor of the +trusty curly brace.

    +

    In addition, elif is now spelled else if, and the pass +statement no longer exists.

    +

    Example:

    +
    pub struct SomeError {}
    +
    +contract Foo {
    +  x: u8
    +  y: u16
    +
    +  pub fn f(a: u8) -> u8 {
    +    if a > 10 {
    +      let x: u8 = 5
    +      return a + x
    +    } else if a == 0 {
    +      revert SomeError()
    +    } else {
    +      return a * 10
    +    }
    +  }
    +
    +  pub fn noop() {}
    +}
    +
    +

    (#707)

    +
  • +
  • +

    traits and generic function parameter

    +

    Traits can now be defined, e.g:

    +
    trait Computable {
    +  fn compute(self, val: u256) -> u256;
    +}
    +
    +

    The mechanism to implement a trait is via an impl block e.g:

    +
    struct Linux {
    +  pub counter: u256
    +  pub fn get_counter(self) -> u256 {
    +    return self.counter
    +  }
    +  pub fn something_static() -> u256 {
    +    return 5
    +  }
    +}
    +
    +impl Computable for Linux {
    +  fn compute(self, val: u256) -> u256 {
    +    return val + Linux::something_static() + self.get_counter()
    +  }
    +}
    +
    +

    Traits can only appear as bounds for generic functions e.g.:

    +
    struct Runner {
    +
    +  pub fn run<T: Computable>(self, _ val: T) -> u256 {
    +    return val.compute(val: 1000)
    +  }
    +}
    +
    +

    Only struct functions (not contract functions) can have generic parameters. +The run method of Runner can be called with any type that implements Computable e.g.

    +
    contract Example {
    +
    +  pub fn generic_compute(self) {
    +    let runner: Runner = Runner();
    +    assert runner.run(Mac()) == 1001
    +    assert runner.run(Linux(counter: 10)) == 1015
    +  }
    +}
    +
    +

    (#710)

    +
  • +
  • +

    Generate artifacts for all contracts of an ingot, not just for contracts that are defined in main.fe (#726)

    +
  • +
  • +

    Allow using complex type as array element type.

    +

    Example:

    +
    contract Foo {
    +    pub fn bar() -> i256 {
    +        let my_array: Array<Pair, 3> = [Pair::new(1, 0), Pair::new(2, 0), Pair::new(3, 0)]
    +
    +        let sum: i256 = 0
    +        for pair in my_array {
    +            sum += pair.x
    +        }
    +
    +        return sum
    +    }
    +}
    +
    +struct Pair {
    +    pub x: i256
    +    pub y: i256
    +
    +    pub fn new(_ x: i256, _ y: i256) -> Pair {
    +        return Pair(x, y)
    +    }
    +}
    +
    +

    (#730)

    +
  • +
  • +

    The fe CLI now has subcommands:

    +

    fe new myproject - creates a new project structure +fe check . - analyzes fe source code and prints errors +fe build . - builds a fe project (#732)

    +
  • +
  • +

    Support passing nested struct types to public functions.

    +

    Example:

    +
    pub struct InnerStruct {
    +    pub inner_s: String<10>
    +    pub inner_x: i256
    +}
    +
    +pub struct NestedStruct {
    +    pub inner: InnerStruct
    +    pub outer_x: i256
    +}
    +
    +contract Foo {
    +    pub fn f(arg: NestedStruct) {
    +        ...
    +    }
    +}
    +
    +

    (#733)

    +
  • +
  • +

    Added support for repeat expressions ([VALUE; LENGTH]).

    +

    e.g.

    +
    let my_array: Array<bool, 42> = [bool; 42]
    +
    +

    Also added checks to ensure array and struct types are initialized. These checks are currently performed at the declaration site, but will be loosened in the future. (#747)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fix a bug that incorrect instruction is selected when the operands of a comp instruction are a signed type. (#734)

    +
  • +
  • +

    Fix issue where a negative constant leads to an ICE

    +

    E.g. the following code would previously crash the compiler but shouldn't:

    +
    const INIT_VAL: i8 = -1
    +contract Foo {
    +  pub fn init_bar() {
    +    let x: i8 = INIT_VAL
    +  }
    +}
    +
    +

    (#745)

    +
  • +
  • +

    Fix a bug that causes ICE when nested if-statement has multiple exit point.

    +

    E.g. the following code would previously crash the compiler but shouldn't:

    +
     pub fn foo(self) {
    +    if true {
    +        if self.something {
    +            return
    +        }
    +    }
    +    if true {
    +        if self.something {
    +            return
    +        }
    +    }
    +}
    +
    +

    (#749)

    +
  • +
+

0.18.0-alpha "Ruby" (2022-05-27)

+

Features

+
    +
  • Added support for parsing of attribute calls with generic arguments (e.g. foo.bar<Baz>()). (#719)
  • +
+

Bugfixes

+
    +
  • Fix a regression where the stateMutability field would not be included in the generated ABI (#722)
  • +
  • Fix two regressions introduced in 0.17.0 +
      +
    • Properly lower right shift operation to yul's sar if operand is signed type
    • +
    • Properly lower negate operation to call safe_sub (#723)
    • +
    +
  • +
+

0.17.0-alpha "Quartz" (2022-05-26)

+

Features

+
    +
  • +

    Support for underscores in numbers to improve readability e.g. 100_000.

    +

    Example

    +
        let num: u256 = 1000_000_000_000
    +
    +

    (#149)

    +
  • +
  • +

    Optimized access of struct fields in storage (#249)

    +
  • +
  • +

    Unit type () is now ABI encodable (#442)

    +
  • +
  • +

    Temporary default stateMutability to payable in ABI

    +

    The ABI metadata that the compiler previously generated did not include the stateMutability field. This piece of information is important for tooling such as hardhat because it determines whether a function needs to be called with or without sending a transaction.

    +

    As soon as we have support for mut self and mut ctx we will be able to derive that information from the function signature. In the meantime we now default to payable. (#705)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed a crash caused by certain memory to memory assignments.

    +

    E.g. the following code would previously lead to a compiler crash:

    +
    my_struct.x = my_struct.y
    +
    +

    (#590)

    +
  • +
  • +

    Reject unary minus operation if the target type is an unsigned integer number.

    +

    Code below should be reject by fe compiler:

    +
    contract Foo:
    +    pub fn bar(self) -> u32:
    +        let unsigned: u32 = 1
    +        return -unsigned
    +
    +    pub fn foo():
    +        let a: i32 = 1
    +        let b: u32 = -a
    +
    +

    (#651)

    +
  • +
  • +

    Fixed crash when passing a struct that contains an array

    +

    E.g. the following would previously result in a compiler crash:

    +
    struct MyArray:
    +    pub x: Array<i32, 2>
    +
    +
    +contract Foo:
    +    pub fn bar(my_arr: MyArray):
    +        pass
    +
    +

    (#681)

    +
  • +
  • +

    reject infinite size struct definitions.

    +

    Fe structs having infinite size due to recursive definitions were not rejected earlier and would cause ICE in the analyzer since they were not properly handled. Now structs having infinite size are properly identified by detecting cycles in the dependency graph of the struct field definitions and an error is thrown by the analyzer. (#682)

    +
  • +
  • +

    Return instead of revert when contract is called without data.

    +

    If a contract is called without data so that no function is invoked, +we would previously revert but that would leave us without a +way to send ETH to a contract so instead it will cause a return now. (#694)

    +
  • +
  • +

    Resolve compiler crash when using certain reserved YUL words as struct field names.

    +

    E.g. the following would previously lead to a compiler crash because numer is +a reserved keyword in YUL.

    +
    struct Foo:
    +  pub number: u256
    +
    +contract Meh:
    +
    +  pub fn yay() -> Foo:
    +    return Foo(number:2)
    +
    +

    (#709)

    +
  • +
+

0.16.0-alpha (2022-05-05)

+

Features

+
    +
  • Change static function call syntax from Bar.foo() to Bar::foo() (#241)
  • +
  • Added support for retrieving the base fee via ctx.base_fee() (#503)
  • +
+

Bugfixes

+
    +
  • Resolve functions on structs via path (e.g. bi::ba::bums()) (#241)
  • +
+

0.15.0-alpha (2022-04-04)

+

Features

+
    +
  • +

    Labels are now required on function arguments. Labels can be omitted if the +argument is a variable with a name that matches the label, or if the function +definition specifies that an argument should have no label. Functions often take +several arguments of the same type; compiler-checked labels can help prevent +accidentally providing arguments in the wrong order.

    +

    Example:

    +
    contract CoolCoin:
    +  balance: Map<address, i256>
    +  loans: Map<(address, address), i256>
    +
    +  pub fn demo(self, ann: address, bob: address):
    +    let is_loan: bool = false
    +    self.give(from: ann, to: bob, 100, is_loan)
    +
    +  fn transfer(self, from sender: address, to recipient: address, _ val: u256, is_loan: bool):
    +    self.cred[sender] -= val
    +    self.cred[recipient] += val
    +    if is_loan:
    +      self.loans[(sender, recipient)] += val
    +
    +

    Note that arguments must be provided in the order specified in the function +definition.

    +

    A parameter's label defaults to the parameter name, but can be changed by +specifying a different label to the left of the parameter name. Labels should be +clear and convenient for the caller, while parameter names are only used in the +function body, and can thus be longer and more descriptive. +In the example above, we choose to use sender and recipient as identifiers +in the body of fn transfer, but use labels from: and to:.

    +

    In cases where it's ideal to not have labels, e.g. if a function takes a single +argument, or if types are sufficient to differentiate between arguments, use _ +to specify that a given parameter has no label. It's also fine to require labels +for some arguments, but not others.

    +

    Example:

    +
    fn add(_ x: u256, _ y: u256) -> u256:
    +  return x + y
    +
    +contract Foo:
    +  fn transfer(self, _ to: address, wei: u256):
    +    pass
    +
    +  pub fn demo(self):
    +    transfer(address(0), wei: add(1000, 42))
    +
    +

    (#397)

    +
  • +
+

Bugfixes

+
    +
  • The region of memory used to compute the slot of a storage map value was not being allocated. (#684)
  • +
+

0.14.0-alpha (2022-03-02)

+

Features

+
    +
  • +

    Events can now be defined outside of contracts.

    +

    Example:

    +
    event Transfer:
    +    idx sender: address
    +    idx receiver: address
    +    value: u256
    +
    +contract Foo:
    +    fn transferFoo(to: address, value: u256):
    +        emit Transfer(sender: msg.sender, receiver: to, value)
    +
    +contract Bar:
    +    fn transferBar(to: address, value: u256):
    +        emit Transfer(sender: msg.sender, receiver: to, value)
    +
    +

    (#80)

    +
  • +
  • +

    The Fe standard library now includes a std::evm module, which provides functions that perform low-level evm operations. +Many of these are marked unsafe, and thus can only be used inside of an unsafe function or an unsafe block.

    +

    Example:

    +
    use std::evm::{mstore, mload}
    +
    +fn memory_shenanigans():
    +  unsafe:
    +    mstore(0x20, 42)
    +    let x: u256 = mload(0x20)
    +    assert x == 42
    +
    +

    The global functions balance and balance_of have been removed; these can now be called as std::evm::balance(), etc. +The global function send_value has been ported to Fe, and is now available +as std::send_value. +(#629)

    +
  • +
  • +

    Support structs that have non-base type fields in storage.

    +

    Example:

    +
    struct Point:
    +    pub x: u256
    +    pub y: u256
    +
    +struct Bar:
    +    pub name: String<3>
    +    pub numbers: Array<u256, 2>
    +    pub point: Point
    +    pub something: (u256, bool)
    +
    +
    +contract Foo:
    +    my_bar: Bar
    +
    +    pub fn complex_struct_in_storage(self) -> String<3>:
    +        self.my_bar = Bar(
    +            name: "foo",
    +            numbers: [1, 2],
    +            point: Point(x: 100, y: 200),
    +            something: (1, true),
    +        )
    +
    +        # Asserting the values as they were set initially
    +        assert self.my_bar.numbers[0] == 1
    +        assert self.my_bar.numbers[1] == 2
    +        assert self.my_bar.point.x == 100
    +        assert self.my_bar.point.y == 200
    +        assert self.my_bar.something.item0 == 1
    +        assert self.my_bar.something.item1
    +
    +        # We can change the values of the array
    +        self.my_bar.numbers[0] = 10
    +        self.my_bar.numbers[1] = 20
    +        assert self.my_bar.numbers[0] == 10
    +        assert self.my_bar.numbers[1] == 20
    +        # We can set the array itself
    +        self.my_bar.numbers = [1, 2]
    +        assert self.my_bar.numbers[0] == 1
    +        assert self.my_bar.numbers[1] == 2
    +
    +        # We can change the values of the Point
    +        self.my_bar.point.x = 1000
    +        self.my_bar.point.y = 2000
    +        assert self.my_bar.point.x == 1000
    +        assert self.my_bar.point.y == 2000
    +        # We can set the point itself
    +        self.my_bar.point = Point(x=100, y=200)
    +        assert self.my_bar.point.x == 100
    +        assert self.my_bar.point.y == 200
    +
    +        # We can change the value of the tuple
    +        self.my_bar.something.item0 = 10
    +        self.my_bar.something.item1 = false
    +        assert self.my_bar.something.item0 == 10
    +        assert not self.my_bar.something.item1
    +        # We can set the tuple itself
    +        self.my_bar.something = (1, true)
    +        assert self.my_bar.something.item0 == 1
    +        assert self.my_bar.something.item1
    +
    +        return self.my_bar.name.to_mem()
    +
    +

    (#636)

    +
  • +
  • +

    Features that read and modify state outside of contracts are now implemented on a struct +named "Context". Context is included in the standard library and can be imported with +use std::context::Context. Instances of Context are created by calls to public functions +that declare it in the signature or by unsafe code.

    +

    Basic example:

    +
    use std::context::Context
    +
    +contract Foo:
    +    my_num: u256
    +
    +    pub fn baz(ctx: Context) -> u256:
    +        return ctx.block_number()
    +
    +    pub fn bing(self, new_num: u256) -> u256:
    +        self.my_num = new_num
    +        return self.my_num
    +
    +
    +contract Bar:
    +
    +    pub fn call_baz(ctx: Context, foo_addr: address) -> u256:
    +        # future syntax: `let foo = ctx.load<Foo>(foo_addr)`
    +        let foo: Foo = Foo(ctx, foo_addr)
    +        return foo.baz()
    +
    +    pub fn call_bing(ctx: Context) -> u256:
    +        # future syntax: `let foo = ctx.create<Foo>(0)`
    +        let foo: Foo = Foo.create(ctx, 0)
    +        return foo.bing(42)
    +
    +

    Example with __call__ and unsafe block:

    +
    use std::context::Context
    +use std::evm
    +
    +contract Foo:
    +
    +    pub fn __call__():
    +        unsafe:
    +            # creating an instance of `Context` is unsafe
    +            let ctx: Context = Context()
    +            let value: u256 = u256(bar(ctx))
    +
    +            # return `value`
    +            evm::mstore(0, value)
    +            evm::return_mem(0, 32)
    +
    +    fn bar(ctx: Context) -> address:
    +        return ctx.self_address()
    +
    +

    (#638)

    +
  • +
  • +

    Features

    +

    Support local constant

    +

    Example:

    +
    contract Foo:
    +    pub fn bar():
    +        const LOCAL_CONST: i32 = 1
    +
    +

    Support constant expression

    +

    Example:

    +
    const GLOBAL: i32 = 8
    +
    +contract Foo:
    +    pub fn bar():
    +        const LOCAL: i32 = GLOBAL * 8
    +
    +

    Support constant generics expression

    +

    Example:

    +
    const GLOBAL: u256= 8
    +const USE_GLOBAL: bool = false
    +type MY_ARRAY = Array<i32, { GLOBAL / 4 }>
    +
    +contract Foo:
    +    pub fn bar():
    +        let my_array: Array<i32, { GLOBAL if USE_GLOBAL else 4 }>
    +
    +

    Bug fixes

    +

    Fix ICE when constant type is mismatch

    +

    Example:

    +
    const GLOBAL: i32 = "FOO"
    +
    +contract Foo:
    +    pub fn bar():
    +        let FOO: i32 = GLOBAL
    +
    +

    Fix ICE when assigning value to constant twice

    +

    Example:

    +
    const BAR: i32 = 1
    +
    +contract FOO:
    +    pub fn bar():
    +        BAR = 10
    +
    +

    (#649)

    +
  • +
  • +

    Argument label syntax now uses : instead of =. Example:

    +
    struct Foo:
    +  x: u256
    +  y: u256
    +
    +let x: MyStruct = MyStruct(x: 10, y: 11)
    +# previously:     MyStruct(x = 10, y = 11)
    +
    +

    (#665)

    +
  • +
  • +

    Support module-level pub modifier, now default visibility of items in a module is private.

    +

    Example:

    +
    # This constant can be used outside of the module.
    +pub const PUBLIC:i32 = 1
    +
    +# This constant can NOT be used outside of the module.
    +const PRIVATE: i32 = 1
    +
    +

    (#677)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +
      +
    • Source files are now managed by a (salsa) SourceDb. A SourceFileId now corresponds to a salsa-interned File with a path. File content is a salsa input function. This is mostly so that the future (LSP) language server can update file content when the user types or saves, which will trigger a re-analysis of anything that changed.
    • +
    • An ingot's set of modules and dependencies are also salsa inputs, so that when the user adds/removes a file or dependency, analysis is rerun.
    • +
    • Standalone modules (eg a module compiled with fe fee.fe) now have a fake ingot parent. Each Ingot has an IngotMode (Lib, Main, StandaloneModule), which is used to disallow ingot::whatever paths in standalone modules, and to determine the correct root module file.
    • +
    • parse_module now always returns an ast::Module, and thus a ModuleId will always exist for a source file, even if it contains fatal parse errors. If the parsing fails, the body will end with a ModuleStmt::ParseError node. The parsing will stop at all but the simplest of syntax errors, but this at least allows partial analysis of source file with bad syntax.
    • +
    • ModuleId::ast(db) is now a query that parses the module's file on demand, rather than the AST being interned into salsa. This makes handling parse diagnostics cleaner, and removes the up-front parsing of every module at ingot creation time. (#628)
    • +
    +
  • +
+

0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)

+

Features

+
    +
  • +

    Support private fields on structs

    +

    Public fields now need to be declared with the pub modifier, otherwise they default to private fields. +If a struct contains private fields it can not be constructed directly except from within the +struct itself. The recommended way is to implement a method new(...) as demonstrated in the +following example.

    +
    struct House:
    +    pub price: u256
    +    pub size: u256
    +    vacant: bool
    +
    +    pub fn new(price: u256, size: u256) -> House
    +      return House(price=price, size=size, vacant=true)
    +
    +contract Manager:
    +
    +  house: House
    +
    +  pub fn create_house(price: u256, size: u256):
    +    self.house = House::new(price, size)
    +    let can_access_price: u256 = self.house.price
    +    # can not access `self.house.vacant` because the field is private
    +
    +

    (#214)

    +
  • +
  • +

    Support non-base type fields in structs

    +

    Support is currently limited in two ways:

    +
      +
    • Structs with complex fields can not be returned from public functions
    • +
    • Structs with complex fields can not be stored in storage (#343)
    • +
    +
  • +
  • +

    Addresses can now be explicitly cast to u256. For example:

    +
    fn f(addr: address) -> u256:
    +  return u256(addr)
    +
    +

    (#621)

    +
  • +
  • +

    A special function named __call__ can now be defined in contracts.

    +

    The body of this function will execute in place of the standard dispatcher when the contract is called.

    +

    example (with intrinsics):

    +
    contract Foo:
    +    pub fn __call__(self):
    +        unsafe:
    +            if __calldataload(0) == 1:
    +                __revert(0, 0)
    +            else:
    +                __return(0, 0)
    +
    +

    (#622)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed a crash that happend when using a certain unprintable ASCII char (#551)

    +
  • +
  • +

    The argument to revert wasn't being lowered by the compiler, +meaning that some revert calls would cause a compiler panic +in later stages. For example:

    +
    const BAD_MOJO: u256 = 0xdeaddead
    +
    +struct Error:
    +  code: u256
    +
    +fn fail():
    +  revert Error(code = BAD_MOJO)
    +
    +

    (#619)

    +
  • +
  • +

    Fixed a regression where an empty list expression ([]) would lead to a compiler crash. (#623)

    +
  • +
  • +

    Fixed a bug where int array elements were not sign extended in their ABI encodings. (#633)

    +
  • +
+

0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)

+

Features

+
    +
  • +

    Added unsafe low-level "intrinsic" functions, that perform raw evm operations. +For example:

    +
    fn foo():
    +  unsafe:
    +    __mtore(0, 5000)
    +    assert __mload(0) == 5000
    +
    +

    The functions available are exactly those defined in yul's "evm dialect": +https://docs.soliditylang.org/en/v0.8.11/yul.html#evm-dialect +but with a double-underscore prefix. Eg selfdestruct -> __selfdestruct.

    +

    These are intended to be used for implementing basic standard library functionality, +and shouldn't typically be needed in normal contract code.

    +

    Note: some intrinsic functions don't return a value (eg __log0); using these +functions in a context that assumes a return value of unit type (eg let x: () = __log0(a, b)) +will currently result in a compiler panic in the yul compilation phase. (#603)

    +
  • +
  • +

    Added an out of bounds check for accessing array items. +If an array index is retrieved at an index that is not within +the bounds of the array it now reverts with Panic(0x32). (#606)

    +
  • +
+

Bugfixes

+
    +
  • +

    Ensure ternary expression short circuit.

    +

    Example:

    +
    contract Foo:
    +
    +    pub fn bar(input: u256) -> u256:
    +        return 1 if input > 5 else revert_me()
    +
    +    fn revert_me() -> u256:
    +        revert
    +        return 0
    +
    +

    Previous to this change, the code above would always revert no matter +which branch of the ternary expressions it would resolve to. That is because +both sides were evaluated and then one side was discarded. With this change, +only the branch that doesn't get picked won't get evaluated at all.

    +

    The same is true for the boolean operations and and or. (#488)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +

    Added a globally available dummy std lib.

    +

    This library contains a single get_42 function, which can be called using std::get_42(). Once +low-level intrinsics have been added to the language, we can delete get_42 and start adding +useful code. (#601)

    +
  • +
+

0.11.0-alpha "Karlite" (2021-12-02)

+

Features

+
    +
  • +

    Added support for multi-file inputs.

    +

    Implementation details:

    +

    Mostly copied Rust's crate system, but use the term ingot instead of crate.

    +

    Below is an example of an ingot's file tree, as supported by the current implementation.

    +
    `-- basic_ingot
    +    `-- src
    +        |-- bar
    +        |   `-- baz.fe
    +        |-- bing.fe
    +        |-- ding
    +        |   |-- dang.fe
    +        |   `-- dong.fe
    +        `-- main.fe
    +
    +

    There are still a few features that will be worked on over the coming months:

    +
      +
    • source files accompanying each directory module (e.g. my_mod.fe)
    • +
    • configuration files and the ability to create library ingots
    • +
    • test directories
    • +
    • module-level pub modifier (all items in a module are public)
    • +
    • mod statements (all fe files in the input tree are public modules)
    • +
    +

    These things will be implemented in order of importance over the next few months. (#562)

    +
  • +
  • +

    The syntax for array types has changed to match other generic types. +For example, u8[4] is now written Array<u8, 4>. (#571)

    +
  • +
  • +

    Functions can now be defined on struct types. Example:

    +
    struct Point:
    +  x: u64
    +  y: u64
    +
    +  # Doesn't take `self`. Callable as `Point.origin()`.
    +  # Note that the syntax for this will soon be changed to `Point::origin()`.
    +  pub fn origin() -> Point:
    +    return Point(x=0, y=0)
    +
    +  # Takes `self`. Callable on a value of type `Point`.
    +  pub fn translate(self, x: u64, y: u64):
    +    self.x += x
    +    self.y += y
    +
    +  pub fn add(self, other: Point) -> Point:
    +    let x: u64 = self.x + other.x
    +    let y: u64 = self.y + other.y
    +    return Point(x, y)
    +
    +  pub fn hash(self) -> u256:
    +    return keccak256(self.abi_encode())
    +
    +pub fn do_pointy_things():
    +  let p1: Point = Point.origin()
    +  p1.translate(5, 10)
    +
    +  let p2: Point = Point(x=1, y=2)
    +  let p3: Point = p1.add(p2)
    +
    +  assert p3.x == 6 and p3.y == 12
    +
    +

    (#577)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed a rare compiler crash.

    +

    Example:

    +
    let my_array: i256[1] = [-1 << 1]
    +
    +

    Previous to this fix, the given example would lead to an ICE. (#550)

    +
  • +
  • +

    Contracts can now create an instance of a contract defined later in a file. +This issue was caused by a weakness in the way we generated yul. (#596)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +

    File IDs are now attached to Spans. (#587)

    +
  • +
  • +

    The fe analyzer now builds a dependency graph of source code "items" (functions, contracts, structs, etc). +This is used in the yulgen phase to determine which items are needed in the yul (intermediate representation) +output. Note that the yul output is still cluttered with utility functions that may or may not be needed by +a given contract. These utility functions are defined in the yulgen phase and aren't tracked in the dependency +graph, so it's not yet possible to filter out the unused functions. We plan to move the definition of many +of these utility functions into fe; when this happens they'll become part of the dependency graph and will only +be included in the yul output when needed.

    +

    The dependency graph will also enable future analyzer warnings about unused code. (#596)

    +
  • +
+

0.10.0-alpha (2021-10-31)

+

Features

+
    +
  • +

    Support for module level constants for base types

    +

    Example:

    +
    const TEN = 10
    +
    +contract
    +
    +  pub fn do_moon_math(self) -> u256:
    +    return 4711 * TEN
    +
    +

    The values of base type constants are always inlined. (#192)

    +
  • +
  • +

    Encode revert errors for ABI decoding as Error(0x103) not Panic(0x99) (#492)

    +
  • +
  • +

    Replaced import statements with use statements.

    +

    Example:

    +
    use foo::{bar::*, baz as baz26}
    +
    +

    Note: this only adds support for parsing use statements. (#547)

    +
  • +
  • +

    Functions can no be defined outside of contracts. Example:

    +
    fn add_bonus(x: u256) -> u256:
    +    return x + 10
    +
    +contract PointTracker:
    +    points: Map<address, u256>
    +
    +    pub fn add_points(self, user: address, val: u256):
    +        self.points[user] += add_bonus(val)
    +
    +

    (#566)

    +
  • +
  • +

    Implemented a send_value(to: address, value_in_wei: u256) function.

    +

    The function is similar to the sendValue function by OpenZeppelin with the differences being that:

    +
      +
    1. +

      It reverts with Error(0x100) instead of Error("Address: insufficient balance") to +safe more gas.

      +
    2. +
    3. +

      It uses selfbalance() instead of balance(address()) to safe more gas

      +
    4. +
    5. +

      It reverts with Error(0x101) instead of Error("Address: unable to send value, recipient may have reverted") also to safe more gas. (#567)

      +
    6. +
    +
  • +
  • +

    Added support for unsafe functions and unsafe blocks within functions. +Note that there's currently no functionality within Fe that requires the use +of unsafe, but we plan to add built-in unsafe functions that perform raw +evm operations which will only callable within an unsafe block or function. (#569)

    +
  • +
  • +

    Added balance() and balance_of(account: address) methods. (#572)

    +
  • +
  • +

    Added support for explicit casting between numeric types.

    +

    Example:

    +
    let a: i8 = i8(-1)
    +let a1: i16 = i16(a)
    +let a2: u16 = u16(a1)
    +
    +assert a2 == u16(65535)
    +
    +let b: i8 = i8(-1)
    +let b1: u8 = u8(b)
    +let b2: u16 = u16(b1)
    +
    +assert b2 == u16(255)
    +
    +

    Notice that Fe allows casting between any two numeric types but does not allow +to change both the sign and the size of the type in one step as that would leave +room for ambiguity as the example above demonstrates. (#576)

    +
  • +
+

Bugfixes

+
    +
  • +

    Adjust numeric values loaded from memory or storage

    +

    Previous to this fix numeric values that were loaded from either memory or storage +were not properly loaded on the stack which could result in numeric values not +treated as intended.

    +

    Example:

    +
    contract Foo:
    +
    +    pub fn bar() -> i8:
    +        let in_memory: i8[1] = [-3]
    +        return in_memory[0]
    +
    +

    In the example above bar() would not return -3 but 253 instead. (#524)

    +
  • +
  • +

    Propagate reverts from external contract calls.

    +

    Before this fix the following code to should_revert() or should_revert2() +would succeed even though it clearly should not.

    +
    contract A:
    +  contract_b: B
    +  pub fn __init__(contract_b: address):
    +    self.contract_b = B(contract_b)
    +
    +  pub fn should_revert():
    +    self.contract_b.fail()
    +
    +  pub fn should_revert2():
    +    self.contract_b.fail_with_custom_error()
    +
    +struct SomeError:
    +  pass
    +
    +contract B:
    +
    +  pub fn fail():
    +    revert
    +
    +  pub fn fail_with_custom_error():
    +    revert SomeError()
    +
    +

    With this fix the revert errors are properly passed upwards the call hierachy. (#574)

    +
  • +
  • +

    Fixed bug in left shift operation.

    +

    Example:

    +

    Let's consider the value 1 as an u8 which is represented as +the following 256 bit item on the EVM stack 00..|00000001|. +A left shift of 8 bits (val << 8) turns that into 00..01|00000000|.

    +

    Previous to this fix this resulted in the compiler taking 256 as the +value for the u8 when clearly 256 is not even in the range of u8 +anymore. With this fix the left shift operations was fixed to properly +"clean up" the result of the shift so that 00..01|00000000| turns into +00..00|00000000|. (#575)

    +
  • +
  • +

    Ensure negation is checked and reverts with over/underflow if needed.

    +

    Example:

    +

    The minimum value for an i8 is -128 but the maximum value of an i8 +is 127 which means that negating -128 should lead to an overflow since +128 does not fit into an i8. Before this fix, negation operations where +not checked for over/underflow resulting in returning the oversized value. (#578)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +

    In the analysis stage, all name resolution (of variable names, function names, +type names, etc used in code) now happens via a single resolve_name pathway, +so we can catch more cases of name collisions and log more helpful error messages. (#555)

    +
  • +
  • +

    Added a new category of tests: differential contract testing.

    +

    Each of these tests is pased on a pair of contracts where one implementation +is written in Fe and the other one is written in Solidity. The implementations +should have the same public APIs and are assumed to always return identical +results given equal inputs. The inputs are randomly generated using proptest +and hence are expected to discover unknown bugs. (#578)

    +
  • +
+

0.9.0-alpha (2021-09-29)

+

Features

+
    +
  • +

    The self variable is no longer implicitly defined in code blocks. It must now be declared +as the first parameter in a function signature.

    +

    Example:

    +
    contract Foo:
    +    my_stored_num: u256
    +
    +    pub fn bar(self, my_num: u256):
    +        self.my_stored_num = my_num
    +
    +    pub fn baz(self):
    +        self.bar(my_pure_func())
    +
    +    pub fn my_pure_func() -> u256:
    +        return 42 + 26
    +
    +

    (#520)

    +
  • +
  • +

    The analyzer now disallows defining a type, variable, or function whose +name conflicts with a built-in type, function, or object.

    +

    Example:

    +
    error: type name conflicts with built-in type
    +┌─ compile_errors/shadow_builtin_type.fe:1:6
    +│
    +1 │ type u256 = u8
    +│      ^^^^ `u256` is a built-in type
    +
    +

    (#539)

    +
  • +
+

Bugfixes

+
    +
  • Fixed cases where the analyzer would correctly reject code, but would panic instead of logging an error message. (#534)
  • +
  • Non-fatal parser errors (eg missing parentheses when defining a function that takes no arguments: fn foo:) +are no longer ignored if the semantic analysis stage succeeds. (#535)
  • +
  • Fixed issue #531 by adding a $ to the front of lowered tuple names. (#546)
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Implemented pretty printing of Fe AST. (#540)
  • +
+

0.8.0-alpha "Haxonite" (2021-08-31)

+

Features

+
    +
  • +

    Support quotes, tabs and carriage returns in string literals and otherwise +restrict string literals to the printable subset of the ASCII table. (#329)

    +
  • +
  • +

    The analyzer now uses a query-based system, which fixes some shortcomings of the previous implementation.

    +
      +
    • Types can now refer to other types defined later in the file. +Example:
    • +
    +
    type Posts = Map<PostId, PostBody>
    +type PostId = u256
    +type PostBody = String<140>
    +
    +
      +
    • Duplicate definition errors now show the location of the original definition.
    • +
    • The analysis of each function, type definition, etc happens independently, so an error in one +doesn't stop the analysis pass. This means fe can report more user errors in a single run of the compiler. (#468)
    • +
    +
  • +
  • +

    Function definitions are now denoted with the keyword fn instead of def. (#496)

    +
  • +
  • +

    Variable declarations are now preceded by the let keyword. Example: let x: u8 = 1. (#509)

    +
  • +
  • +

    Implemented support for numeric unary invert operator (~) (#526)

    +
  • +
+

Bugfixes

+
    +
  • +

    Calling self.__init__() now results in a nice error instead of a panic in the yul compilation stage. (#468)

    +
  • +
  • +

    Fixed an issue where certain expressions were not being moved to the correct location. (#493)

    +
  • +
  • +

    Fixed an issue with a missing return statement not properly detected.

    +

    Previous to this fix, the following code compiles but it should not:

    +
    contract Foo:
    +    pub fn bar(val: u256) -> u256:
    +        if val > 1:
    +            return 5
    +
    +

    With this change, the compiler rightfully detects that the code is missing +a return or revert statement after the if statement since it is not +guaranteed that the path of execution always follows the arm of the if statement. (#497)

    +
  • +
  • +

    Fixed a bug in the analyzer which allowed tuple item accessor names with a leading 0, +resulting in an internal compiler error in a later pass. Example: my_tuple.item001. +These are now rejected with an error message. (#510)

    +
  • +
  • +

    Check call argument labels for function calls.

    +

    Previously the compiler would not check any labels that were used +when making function calls on self or external contracts.

    +

    This can be especially problematic if gives developers the impression +that they could apply function arguments in any order as long as they +are named which is not the case.

    +
    contract Foo:
    +
    +    pub fn baz():
    +        self.bar(val2=1, doesnt_even_exist=2)
    +
    +    pub fn bar(val1: u256, val2: u256):
    +        pass
    +
    +

    Code as the one above is now rightfully rejected by the compiler. (#517)

    +
  • +
+

Improved Documentation

+
    +
  • +

    Various improvements and bug fixes to both the content and layout of the specification. (#489)

    +
  • +
  • +

    Document all remaining statements and expressions in the spec.

    +

    Also added a CI check to ensure code examples in the documentation +are validated against the latest compiler. (#514)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Separated Fe type traits between crates. (#485)
  • +
+

0.7.0-alpha "Galaxite" (2021-07-27)

+

Features

+
    +
  • +

    Enable the optimizer by default. The optimizer can still be disabled +by supplying --optimize=false as an argument. (#439)

    +
  • +
  • +

    The following checks are now performed while decoding data:

    +
      +
    • The size of the encoded data fits within the size range known at compile-time.
    • +
    • Values are correctly padded. +
        +
      • unsigned integers, addresses, and bools are checked to have correct left zero padding
      • +
      • the size of signed integers are checked
      • +
      • bytes and strings are checked to have correct right padding
      • +
      +
    • +
    • Data section offsets are consistent with the size of preceding values in the data section.
    • +
    • The dynamic size of strings does not exceed their maximum size.
    • +
    • The dynamic size of byte arrays (u8[n]) is equal to the size of the array. (#440)
    • +
    +
  • +
  • +

    Type aliases can now include tuples. Example:

    +
    type InternetPoints = (address, u256)
    +
    +

    (#459)

    +
  • +
  • +

    Revert with custom errors

    +

    Example:

    +
    struct PlatformError:
    +  code: u256
    +
    +pub fn do_something():
    +  revert PlatformError(code=4711)
    +
    +

    Error encoding follows Solidity which is based on EIP-838. This means that custom errors returned from Fe are fully compatible with Solidity. (#464)

    +
  • +
  • +
      +
    • The builtin value msg.sig now has type u256.
    • +
    • Removed the bytes[n] type. The type u8[n] can be used in its placed and will be encoded as a dynamically-sized, but checked, bytes component. (#472)
    • +
    +
  • +
  • +

    Encode certain reverts as panics.

    +

    With this change, the following reverts are encoded as Panic(uint256) with +the following panic codes:

    +
      +
    • 0x01: An assertion that failed and did not specify an error message
    • +
    • 0x11: An arithmetic expression resulted in an over- or underflow
    • +
    • 0x12: An arithmetic expression divided or modulo by zero
    • +
    +

    The panic codes are aligned with the panic codes that Solidity uses. (#476)

    +
  • +
+

Bugfixes

+
    +
  • +

    Fixed a crash when trying to access an invalid attribute on a string.

    +

    Example:

    +
    contract Foo:
    +
    +  pub fn foo():
    +    "".does_not_exist
    +
    +

    The above now yields a proper user error. (#444)

    +
  • +
  • +

    Ensure String<N> type is capitalized in error messages (#445)

    +
  • +
  • +

    Fixed ICE when using a static string that spans over multiple lines.

    +

    Previous to this fix, the following code would lead to a compiler crash:

    +
    contract Foo:
    +    pub fn return_with_newline() -> String<16>:
    +        return "foo
    +        balu"
    +
    +

    The above code now works as intended. (#448)

    +
  • +
  • +

    Fixed ICE when using a tuple declaration and specifying a non-tuple type. +Fixed a second ICE when using a tuple declaration where the number of +target items doesn't match the number of items in the declared type. (#469)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +
      +
    • Cleaned up ABI encoding internals.
    • +
    • Improved yulc panic formatting. (#472)
    • +
    +
  • +
+

0.6.0-alpha "Feldspar" (2021-06-10)

+

Features

+
    +
  • +

    Support for pragma statement

    +

    Example: pragma ^0.1.0 (#361)

    +
  • +
  • +

    Add support for tuple destructuring

    +

    Example:

    +
    my_tuple: (u256, bool) = (42, true)
    +(x, y): (u256, bool) = my_tuple
    +
    +

    (#376)

    +
  • +
  • +
      +
    1. Call expression can now accept generic arguments
    2. +
    3. Replace stringN to String<N>
    4. +
    +

    Example:

    +
    s: String<10> = String<10>("HI")
    +
    +

    (#379)

    +
  • +
  • +
      +
    • Many analyzer errors now include helpful messages and underlined code.
    • +
    • Event and struct constructor arguments must now be labeled and in the order specified in the definition.
    • +
    • The analyzer now verifies that the left-hand side of an assignment is actually assignable. (#398)
    • +
    +
  • +
  • +

    Types of integer literal are now inferred, rather than defaulting to u256.

    +
    contract C:
    +
    +  fn f(x: u8) -> u16:
    +    y: u8 = 100   # had to use u8(100) before
    +    z: i8 = -129  # "literal out of range" error
    +
    +    return 1000   # had to use `return u16(1000)` before
    +
    +  fn g():
    +    self.f(50)
    +
    +

    Similar inference is done for empty array literals. Previously, empty array +literals caused a compiler crash, because the array element type couldn't +be determined.

    +
    contract C:
    +  fn f(xs: u8[10]):
    +    pass
    +
    +  fn g():
    +    self.f([])
    +
    +

    (Note that array length mismatch is still a type error, so this code won't +actually compile.) (#429)

    +
  • +
  • +

    The Map type name is now capitalized. Example:

    +
    contract GuestBook:
    +    guests: Map<address, String<100>>
    +
    +

    (#431)

    +
  • +
  • +

    Convert all remaining errors to use the new advanced error reporting system (#432)

    +
  • +
  • +

    Analyzer throws an error if __init__ is not public. (#435)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Refactored front-end "not implemented" errors into analyzer errors and removed questionable variants. Any panic is now considered to be a bug. (#437)
  • +
+

0.5.0-alpha (2021-05-27)

+

Features

+
    +
  • +

    Add support for hexadecimal/octal/binary numeric literals.

    +

    Example:

    +
    value_hex: u256 = 0xff
    +value_octal: u256 = 0o77
    +value_binary: u256 = 0b11
    +
    +

    (#333)

    +
  • +
  • +

    Added support for list expressions.

    +

    Example:

    +
    values: u256[3] = [10, 20, 30]
    +
    +# or anywhere else where expressions can be used such as in a call
    +
    +sum: u256 = self.sum([10, 20, 30])
    +
    +

    (#388)

    +
  • +
  • +

    Contracts, events, and structs can now be empty.

    +

    e.g.

    +
    event MyEvent:
    +    pass
    +
    +...
    +
    +contract MyContract:
    +    pass
    +
    +...
    +
    +struct MyStruct:
    +    pass
    +
    +

    (#406)

    +
  • +
  • +

    External calls can now handle dynamically-sized return types. (#415)

    +
  • +
+

Bugfixes

+
    +
  • The analyzer will return an error if a tuple attribute is not of the form item<index>. (#401)
  • +
+

Improved Documentation

+
    +
  • Created a landing page for Fe at https://fe-lang.org (#394)
  • +
  • Provide a Quickstart chapter in Fe Guide (#403)
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • +

    Using insta to validate Analyzer outputs. (#387)

    +
  • +
  • +

    Analyzer now disallows using context.add_ methods to update attributes. (#392)

    +
  • +
  • +

    () now represents a distinct type internally called the unit type, instead of an empty tuple.

    +

    The lowering pass now does the following: Valueless return statements are given a () value and +functions without a return value are given explicit () returns. (#406)

    +
  • +
  • +

    Add CI check to ensure fragment files always end with a new line (#4711)

    +
  • +
+

0.4.0-alpha (2021-04-28)

+

Features

+
    +
  • +

    Support for revert messages in assert statements

    +

    E.g

    +
    assert a == b, "my revert statement"
    +
    +

    The provided string is abi-encoded as if it were a call +to a function Error(string). For example, the revert string "Not enough Ether provided." returns the following hexadecimal as error return data:

    +
    0x08c379a0                                                         // Function selector for Error(string)
    +0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
    +0x000000000000000000000000000000000000000000000000000000000000001a // String length
    +0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data
    +
    +

    (#288)

    +
  • +
  • +

    Added support for augmented assignments.

    +

    e.g.

    +
    contract Foo:
    +    pub fn add(a: u256, b: u256) -> u256:
    +        a += b
    +        return a
    +
    +    pub fn sub(a: u256, b: u256) -> u256:
    +        a -= b
    +        return a
    +
    +    pub fn mul(a: u256, b: u256) -> u256:
    +        a *= b
    +        return a
    +
    +    pub fn div(a: u256, b: u256) -> u256:
    +        a /= b
    +        return a
    +
    +    pub fn mod(a: u256, b: u256) -> u256:
    +        a %= b
    +        return a
    +
    +    pub fn pow(a: u256, b: u256) -> u256:
    +        a **= b
    +        return a
    +
    +    pub fn lshift(a: u8, b: u8) -> u8:
    +        a <<= b
    +        return a
    +
    +    pub fn rshift(a: u8, b: u8) -> u8:
    +        a >>= b
    +        return a
    +
    +    pub fn bit_or(a: u8, b: u8) -> u8:
    +        a |= b
    +        return a
    +
    +    pub fn bit_xor(a: u8, b: u8) -> u8:
    +        a ^= b
    +        return a
    +
    +    pub fn bit_and(a: u8, b: u8) -> u8:
    +        a &= b
    +        return a
    +
    +

    (#338)

    +
  • +
  • +

    A new parser implementation, which provides more helpful error messages +with fancy underlines and code context. (#346)

    +
  • +
  • +

    Added support for tuples with base type items.

    +

    e.g.

    +
    contract Foo:
    +    my_num: u256
    +
    +    pub fn bar(my_num: u256, my_bool: bool) -> (u256, bool):
    +        my_tuple: (u256, bool) = (my_num, my_bool)
    +        self.my_num = my_tuple.item0
    +        return my_tuple
    +
    +

    (#352)

    +
  • +
+

Bugfixes

+
    +
  • +

    Properly reject invalid emit (#211)

    +
  • +
  • +

    Properly tokenize numeric literals when they start with 0 (#331)

    +
  • +
  • +

    Reject non-string assert reasons as type error (#335)

    +
  • +
  • +

    Properly reject code that creates a circular dependency when using create or create2.

    +

    Example, the following code is now rightfully rejected because it tries to create an +instance of Foo from within the Foo contract itself.

    +
    contract Foo:
    +  pub fn bar()->address:
    +    foo:Foo=Foo.create(0)
    +
    +    return address(foo)
    +
    +

    (#362)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • AST nodes use Strings instead of &strs. This way we can perform incremental compilation on the AST. (#332)
  • +
  • Added support for running tests against solidity fixtures. +Also added tests that cover how solidity encodes revert reason strings. (#342)
  • +
  • Refactoring of binary operation type checking. (#347)
  • +
+

0.3.0-alpha "Calamine" (2021-03-24)

+

Features

+
    +
  • +

    Add over/underflow checks for multiplications of all integers (#271)

    +
  • +
  • +

    Add full support for empty Tuples. (#276)

    +

    All functions in Fe implicitly return an empty Tuple if they have no other return value. +However, before this change one was not able to use the empty Tuple syntax () explicitly.

    +

    With this change, all of these are treated equally:

    +
    contract Foo:
    +
    +  pub fn explicit_return_a1():
    +    return
    +
    +  pub fn explicit_return_a2():
    +    return ()
    +
    +  pub fn explicit_return_b1() ->():
    +    return
    +
    +  pub fn explicit_return_b2() ->():
    +    return ()
    +
    +  pub fn implicit_a1():
    +    pass
    +
    +  pub fn implicit_a2() ->():
    +    pass
    +
    +
  • +
  • +

    The JSON ABI builder now supports structs as both input and output. (#296)

    +
  • +
  • +

    Make subsequently defined contracts visible.

    +

    Before this change:

    +
    # can't see Bar
    +contract Foo:
    +   ...
    +# can see Foo
    +contract Bar:
    +   ...
    +
    +

    With this change the restriction is lifted and the following becomes possible. (#298)

    +
    contract Foo:
    +    bar: Bar
    +    pub fn external_bar() -> u256:
    +        return self.bar.bar()
    +contract Bar:
    +    foo: Foo
    +    pub fn external_foo() -> u256:
    +        return self.foo.foo()
    +
    +
  • +
  • +

    Perform checks for divison operations on integers (#308)

    +
  • +
  • +

    Support for msg.sig to read the function identifier. (#311)

    +
  • +
  • +

    Perform checks for modulo operations on integers (#312)

    +
  • +
  • +

    Perform over/underflow checks for exponentiation operations on integers (#313)

    +
  • +
+

Bugfixes

+
    +
  • +

    Properly reject emit not followed by an event invocation (#212)

    +
  • +
  • +

    Properly reject octal number literals (#222)

    +
  • +
  • +

    Properly reject code that tries to emit a non-existing event. (#250)

    +

    Example that now produces a compile time error:

    +
    emit DoesNotExist()
    +
    +
  • +
  • +

    Contracts that create other contracts can now include __init__ functions.

    +

    See https://github.com/ethereum/fe/issues/284 (#304)

    +
  • +
  • +

    Prevent multiple types with same name in one module. (#317)

    +

    Examples that now produce compile time errors:

    +
    type bar = u8
    +type bar = u16
    +
    +

    or

    +
    struct SomeStruct:
    +    some_field: u8
    +
    +struct SomeStruct:
    +    other: u8
    +
    +

    or

    +
    contract SomeContract:
    +    some_field: u8
    +
    +contract SomeContract:
    +    other: u8
    +
    +

    Prevent multiple fields with same name in one struct.

    +

    Example that now produces a compile time error:

    +
    struct SomeStruct:
    +    some_field: u8
    +    some_field: u8
    +
    +

    Prevent variable definition in child scope when name already taken in parent scope.

    +

    Example that now produces a compile time error:

    +
    pub fn bar():
    +    my_array: u256[3]
    +    sum: u256 = 0
    +    for i in my_array:
    +        sum: u256 = 0
    +
    +
  • +
  • +

    The CLI was using the overwrite flag to enable Yul optimization.

    +

    i.e.

    +
    # Would both overwrite output files and run the Yul optimizer.
    +$ fe my_contract.fe --overwrite
    +
    +

    Using the overwrite flag now only overwrites and optimization is enabled with the optimize flag. (#320)

    +
  • +
  • +

    Ensure analyzer rejects code that uses return values for __init__ functions. (#323)

    +

    An example that now produces a compile time error:

    +
    contract C:
    +    pub fn __init__() -> i32:
    +        return 0
    +
    +
  • +
  • +

    Properly reject calling an undefined function on an external contract (#324)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Added the Uniswap demo contracts to our testing fixtures and validated their behaviour. (#179)
  • +
  • IDs added to AST nodes. (#315)
  • +
  • Failures in the Yul generation phase now panic; any failure is a bug. (#327)
  • +
+

0.2.0-alpha "Borax" (2021-02-27)

+

Features

+
    +
  • +

    Add support for string literals.

    +

    Example:

    +
    fn get_ticker_symbol() -> string3:
    +    return "ETH"
    +
    +

    String literals are stored in and loaded from the compiled bytecode. (#186)

    +
  • +
  • +

    The CLI now compiles every contract in a module, not just the first one. (#197)

    +

    Sample compiler output with all targets enabled:

    +
    output
    +|-- Bar
    +|   |-- Bar.bin
    +|   |-- Bar_abi.json
    +|   `-- Bar_ir.yul
    +|-- Foo
    +|   |-- Foo.bin
    +|   |-- Foo_abi.json
    +|   `-- Foo_ir.yul
    +|-- module.ast
    +`-- module.tokens
    +
    +
  • +
  • +

    Add support for string type casts (#201)

    +

    Example:

    +
    val: string100 = string100("foo")
    +
    +
  • +
  • +

    Add basic support for structs. (#203)

    +

    Example:

    +
    struct House:
    +    price: u256
    +    size: u256
    +    vacant: bool
    +
    +contract City:
    +
    +    pub fn get_price() -> u256:
    +        building: House = House(300, 500, true)
    +
    +        assert building.size == 500
    +        assert building.price == 300
    +        assert building.vacant
    +
    +        return building.price
    +
    +
  • +
  • +

    Added support for external contract calls. Contract definitions now +add a type to the module scope, which may be used to create contract +values with the contract's public functions as callable attributes. (#204)

    +

    Example:

    +
    contract Foo:
    +    pub fn build_array(a: u256, b: u256) -> u256[3]:
    +        my_array: u256[3]
    +        my_array[0] = a
    +        my_array[1] = a * b
    +        my_array[2] = b
    +        return my_array
    +
    +contract FooProxy:
    +    pub fn call_build_array(
    +        foo_address: address,
    +        a: u256,
    +        b: u256,
    +    ) -> u256[3]:
    +        foo: Foo = Foo(foo_address)
    +        return foo.build_array(a, b)
    +
    +
  • +
  • +

    Add support for block, msg, chain, and tx properties: (#208)

    +
    block.coinbase: address
    +block.difficulty: u256
    +block.number: u256
    +block.timestamp: u256
    +chain.id: u256
    +msg.value: u256
    +tx.gas_price: u256
    +tx.origin: address
    +
    +

    (Note that msg.sender: address was added previously.)

    +

    Example:

    +
    fn post_fork() -> bool:
    +    return block.number > 2675000
    +
    +
  • +
  • +

    The CLI now panics if an error is encountered during Yul compilation. (#218)

    +
  • +
  • +

    Support for contract creations.

    +

    Example of create2, which takes a value and address salt as parameters.

    +
    contract Foo:
    +    pub fn get_my_num() -> u256:
    +        return 42
    +
    +contract FooFactory:
    +    pub fn create2_foo() -> address:
    +        # value and salt
    +        foo: Foo = Foo.create2(0, 52)
    +        return address(foo)
    +
    +

    Example of create, which just takes a value parameter.

    +
    contract Foo:
    +    pub fn get_my_num() -> u256:
    +        return 42
    +
    +contract FooFactory:
    +    pub fn create_foo() -> address:
    +        # value and salt
    +        foo: Foo = Foo.create(0)
    +        return address(foo)
    +
    +

    Note: We do not yet support init parameters. (#239)

    +
  • +
  • +

    Support updating individual struct fields in storage. (#246)

    +

    Example:

    +
     pub fn update_house_price(price: u256):
    +        self.my_house.price = price
    +
    +
  • +
  • +

    Implement global keccak256 method. The method expects one parameter of bytes[n] +and returns the hash as an u256. In a future version keccak256 will most likely +be moved behind an import so that it has to be imported (e.g. from std.crypto import keccak256). (#255)

    +

    Example:

    +
    pub fn hash_single_byte(val: bytes[1]) -> u256:
    +    return keccak256(val)
    +
    +
  • +
  • +

    Require structs to be initialized using keyword arguments.

    +

    Example:

    +
    struct House:
    +    vacant: bool
    +    price: u256
    +
    +

    Previously, House could be instantiated as House(true, 1000000). +With this change it is required to be instantiated like House(vacant=true, price=1000000)

    +

    This ensures property assignment is less prone to get mixed up. It also makes struct +initialization visually stand out more from function calls. (#260)

    +
  • +
  • +

    Implement support for boolean not operator. (#264)

    +

    Example:

    +
    if not covid_test.is_positive(person):
    +    allow_boarding(person)
    +
    +
  • +
  • +

    Do over/underflow checks for additions (SafeMath).

    +

    With this change all additions (e.g x + y) for signed and unsigned +integers check for over- and underflows and revert if necessary. (#265)

    +
  • +
  • +

    Added a builtin function abi_encode() that can be used to encode structs. The return type is a +fixed-size array of bytes that is equal in size to the encoding. The type system does not support +dynamically-sized arrays yet, which is why we used fixed. (#266)

    +

    Example:

    +
    struct House:
    +    price: u256
    +    size: u256
    +    rooms: u8
    +    vacant: bool
    +
    +contract Foo:
    +    pub fn hashed_house() -> u256:
    +        house: House = House(
    +            price=300,
    +            size=500,
    +            rooms=u8(20),
    +            vacant=true
    +        )
    +        return keccak256(house.abi_encode())
    +
    +
  • +
  • +

    Perform over/underflow checks for subtractions (SafeMath). (#267)

    +

    With this change all subtractions (e.g x - y) for signed and unsigned +integers check for over- and underflows and revert if necessary.

    +
  • +
  • +

    Support for the boolean operations and and or. (#270)

    +

    Examples:

    +
    contract Foo:
    +    pub fn bar(x: bool, y: bool) -> bool:
    +        return x and y
    +
    +
    contract Foo:
    +    pub fn bar(x: bool, y: bool) -> bool:
    +        return x or y
    +
    +

    Support for self.address.

    +

    This expression returns the address of the current contract.

    +

    Example:

    +
    contract Foo:
    +    pub fn bar() -> address:
    +        return self.address
    +
    +
  • +
+

Bugfixes

+
    +
  • +

    Perform type checking when calling event constructors

    +

    Previously, the following would not raise an error even though it should:

    +
    contract Foo:
    +    event MyEvent:
    +        val_1: string100
    +        val_2: u8
    +
    +    pub fn foo():
    +        emit MyEvent("foo", 1000)
    +
    +
    +

    Wit this change, the code fails with a type error as expected. (#202)

    +
  • +
  • +

    Fix bug where compilation of contracts without public functions would result in illegal YUL. (#219)

    +

    E.g without this change, the following doesn't compile to proper YUL

    +
    contract Empty:
    +  lonely: u256
    +
    +
  • +
  • +

    Ensure numeric literals can't exceed 256 bit range. Previously, this would result in a +non user friendly error at the YUL compilation stage. With this change it is caught +at the analyzer stage and presented to the user as a regular error. (#225)

    +
  • +
  • +

    Fix crash when return is used without value.

    +

    These two methods should both be treated as returning ()

    +
      pub fn explicit_return():
    +    return
    +
    +  pub fn implicit():
    +    pass
    +
    +

    Without this change, the explicit_return crashes the compiler. (#261)

    +
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Renamed the fe-semantics library to fe-analyzer. (#207)
  • +
  • Runtime testing utilities. (#243)
  • +
  • Values are stored more efficiently in storage. (#251)
  • +
+

0.1.0-alpha "Amethyst" (2021-01-20)

+

WARNING: This is an alpha version to share the development progress with developers and enthusiasts. It is NOT yet intended to be used for anything serious. At this point Fe is missing a lot of features and has a lot of bugs instead.

+

This is the first alpha release and kicks off our release schedule which will be one release every month in the future. Since we have just started tracking progress on changes, the following list of changes is incomplete, but will appropriately document progress between releases from now on.

+

Features

+
    +
  • +

    Added support for for loop, allows iteration over static arrays. (#134)

    +
  • +
  • +

    Enforce bounds on numeric literals in type constructors.

    +

    For instance calling u8(1000) or i8(-250) will give an error because +the literals 1000 and -250 do not fit into u8 or i8. (#145)

    +
  • +
  • +

    Added builtin copying methods clone() and to_mem() to reference types. (#155)

    +

    usage:

    +
    # copy a segment of storage into memory and assign the new pointer
    +my_mem_array = self.my_sto_array.to_mem()
    +
    +# copy a segment of memory into another segment of memory and assign the new pointer
    +my_other_mem_array = my_mem_array.clone()
    +
    +
  • +
  • +

    Support emitting JSON ABI via --emit abi. +The default value of --emit is now abi,bytecode. (#160)

    +
  • +
  • +

    Ensure integer type constructor reject all expressions that aren't a numeric literal. +For instance, previously the compiler would not reject the following code even though it could not be guaranteed that val would fit into an u16.

    +
    pub fn bar(val: u8) -> u16:
    +        return u16(val)
    +
    +

    Now such code is rejected and integer type constructor do only work with numeric literals such as 1 or -3. (#163)

    +
  • +
  • +

    Support for ABI decoding of all array type. (#172)

    +
  • +
  • +

    Support for value assignments in declaration.

    +

    Previously, this code would fail:

    +
    another_reference: u256[10] = my_array
    +
    +

    As a workaround declaration and assignment could be split apart.

    +
    another_reference: u256[10]
    +another_reference = my_array
    +
    +

    With this change, the shorter declaration with assignment syntax is supported. (#173)

    +
  • +
+

Improved Documentation

+
    +
  • Point to examples in the README (#162)
  • +
  • Overhaul README page to better reflect the current state of the project. (#177)
  • +
  • Added descriptions of the to_mem and clone functions to the spec. (#195)
  • +
+

Internal Changes - for Fe Contributors

+
    +
  • Updated the Solidity backend to v0.8.0. (#169)
  • +
  • Run CI tests on Mac and support creating Mac binaries for releases. (#178)
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/searcher.js b/docs/searcher.js new file mode 100644 index 0000000000..d2b0aeed38 --- /dev/null +++ b/docs/searcher.js @@ -0,0 +1,483 @@ +"use strict"; +window.search = window.search || {}; +(function search(search) { + // Search functionality + // + // You can use !hasFocus() to prevent keyhandling in your key + // event handlers while the user is typing their search. + + if (!Mark || !elasticlunr) { + return; + } + + //IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(search, pos) { + return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; + }; + } + + var search_wrap = document.getElementById('search-wrapper'), + searchbar = document.getElementById('searchbar'), + searchbar_outer = document.getElementById('searchbar-outer'), + searchresults = document.getElementById('searchresults'), + searchresults_outer = document.getElementById('searchresults-outer'), + searchresults_header = document.getElementById('searchresults-header'), + searchicon = document.getElementById('search-toggle'), + content = document.getElementById('content'), + + searchindex = null, + doc_urls = [], + results_options = { + teaser_word_count: 30, + limit_results: 30, + }, + search_options = { + bool: "AND", + expand: true, + fields: { + title: {boost: 1}, + body: {boost: 1}, + breadcrumbs: {boost: 0} + } + }, + mark_exclude = [], + marker = new Mark(content), + current_searchterm = "", + URL_SEARCH_PARAM = 'search', + URL_MARK_PARAM = 'highlight', + teaser_count = 0, + + SEARCH_HOTKEY_KEYCODE = 83, + ESCAPE_KEYCODE = 27, + DOWN_KEYCODE = 40, + UP_KEYCODE = 38, + SELECT_KEYCODE = 13; + + function hasFocus() { + return searchbar === document.activeElement; + } + + function removeChildren(elem) { + while (elem.firstChild) { + elem.removeChild(elem.firstChild); + } + } + + // Helper to parse a url into its building blocks. + function parseURL(url) { + var a = document.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':',''), + host: a.hostname, + port: a.port, + params: (function(){ + var ret = {}; + var seg = a.search.replace(/^\?/,'').split('&'); + var len = seg.length, i = 0, s; + for (;i': '>', + '"': '"', + "'": ''' + }; + var repl = function(c) { return MAP[c]; }; + return function(s) { + return s.replace(/[&<>'"]/g, repl); + }; + })(); + + function formatSearchMetric(count, searchterm) { + if (count == 1) { + return count + " search result for '" + searchterm + "':"; + } else if (count == 0) { + return "No search results for '" + searchterm + "'."; + } else { + return count + " search results for '" + searchterm + "':"; + } + } + + function formatSearchResult(result, searchterms) { + var teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); + teaser_count++; + + // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor + var url = doc_urls[result.ref].split("#"); + if (url.length == 1) { // no anchor found + url.push(""); + } + + // encodeURIComponent escapes all chars that could allow an XSS except + // for '. Due to that we also manually replace ' with its url-encoded + // representation (%27). + var searchterms = encodeURIComponent(searchterms.join(" ")).replace(/\'/g, "%27"); + + return '' + result.doc.breadcrumbs + '' + + '' + + teaser + ''; + } + + function makeTeaser(body, searchterms) { + // The strategy is as follows: + // First, assign a value to each word in the document: + // Words that correspond to search terms (stemmer aware): 40 + // Normal words: 2 + // First word in a sentence: 8 + // Then use a sliding window with a constant number of words and count the + // sum of the values of the words within the window. Then use the window that got the + // maximum sum. If there are multiple maximas, then get the last one. + // Enclose the terms in . + var stemmed_searchterms = searchterms.map(function(w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + var searchterm_weight = 40; + var weighted = []; // contains elements of ["word", weight, index_in_document] + // split in sentences, then words + var sentences = body.toLowerCase().split('. '); + var index = 0; + var value = 0; + var searchterm_found = false; + for (var sentenceindex in sentences) { + var words = sentences[sentenceindex].split(' '); + value = 8; + for (var wordindex in words) { + var word = words[wordindex]; + if (word.length > 0) { + for (var searchtermindex in stemmed_searchterms) { + if (elasticlunr.stemmer(word).startsWith(stemmed_searchterms[searchtermindex])) { + value = searchterm_weight; + searchterm_found = true; + } + }; + weighted.push([word, value, index]); + value = 2; + } + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + }; + index += 1; // because we split at a two-char boundary '. ' + }; + + if (weighted.length == 0) { + return body; + } + + var window_weight = []; + var window_size = Math.min(weighted.length, results_options.teaser_word_count); + + var cur_sum = 0; + for (var wordindex = 0; wordindex < window_size; wordindex++) { + cur_sum += weighted[wordindex][1]; + }; + window_weight.push(cur_sum); + for (var wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { + cur_sum -= weighted[wordindex][1]; + cur_sum += weighted[wordindex + window_size][1]; + window_weight.push(cur_sum); + }; + + if (searchterm_found) { + var max_sum = 0; + var max_sum_window_index = 0; + // backwards + for (var i = window_weight.length - 1; i >= 0; i--) { + if (window_weight[i] > max_sum) { + max_sum = window_weight[i]; + max_sum_window_index = i; + } + }; + } else { + max_sum_window_index = 0; + } + + // add around searchterms + var teaser_split = []; + var index = weighted[max_sum_window_index][2]; + for (var i = max_sum_window_index; i < max_sum_window_index+window_size; i++) { + var word = weighted[i]; + if (index < word[2]) { + // missing text from index to start of `word` + teaser_split.push(body.substring(index, word[2])); + index = word[2]; + } + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + index = word[2] + word[0].length; + teaser_split.push(body.substring(word[2], index)); + if (word[1] == searchterm_weight) { + teaser_split.push("") + } + }; + + return teaser_split.join(''); + } + + function init(config) { + results_options = config.results_options; + search_options = config.search_options; + searchbar_outer = config.searchbar_outer; + doc_urls = config.doc_urls; + searchindex = elasticlunr.Index.load(config.index); + + // Set up events + searchicon.addEventListener('click', function(e) { searchIconClickHandler(); }, false); + searchbar.addEventListener('keyup', function(e) { searchbarKeyUpHandler(); }, false); + document.addEventListener('keydown', function(e) { globalKeyHandler(e); }, false); + // If the user uses the browser buttons, do the same as if a reload happened + window.onpopstate = function(e) { doSearchOrMarkFromUrl(); }; + // Suppress "submit" events so the page doesn't reload when the user presses Enter + document.addEventListener('submit', function(e) { e.preventDefault(); }, false); + + // If reloaded, do the search or mark again, depending on the current url parameters + doSearchOrMarkFromUrl(); + } + + function unfocusSearchbar() { + // hacky, but just focusing a div only works once + var tmp = document.createElement('input'); + tmp.setAttribute('style', 'position: absolute; opacity: 0;'); + searchicon.appendChild(tmp); + tmp.focus(); + tmp.remove(); + } + + // On reload or browser history backwards/forwards events, parse the url and do search or mark + function doSearchOrMarkFromUrl() { + // Check current URL for search request + var url = parseURL(window.location.href); + if (url.params.hasOwnProperty(URL_SEARCH_PARAM) + && url.params[URL_SEARCH_PARAM] != "") { + showSearch(true); + searchbar.value = decodeURIComponent( + (url.params[URL_SEARCH_PARAM]+'').replace(/\+/g, '%20')); + searchbarKeyUpHandler(); // -> doSearch() + } else { + showSearch(false); + } + + if (url.params.hasOwnProperty(URL_MARK_PARAM)) { + var words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); + marker.mark(words, { + exclude: mark_exclude + }); + + var markers = document.querySelectorAll("mark"); + function hide() { + for (var i = 0; i < markers.length; i++) { + markers[i].classList.add("fade-out"); + window.setTimeout(function(e) { marker.unmark(); }, 300); + } + } + for (var i = 0; i < markers.length; i++) { + markers[i].addEventListener('click', hide); + } + } + } + + // Eventhandler for keyevents on `document` + function globalKeyHandler(e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey || e.target.type === 'textarea' || e.target.type === 'text') { return; } + + if (e.keyCode === ESCAPE_KEYCODE) { + e.preventDefault(); + searchbar.classList.remove("active"); + setSearchUrlParameters("", + (searchbar.value.trim() !== "") ? "push" : "replace"); + if (hasFocus()) { + unfocusSearchbar(); + } + showSearch(false); + marker.unmark(); + } else if (!hasFocus() && e.keyCode === SEARCH_HOTKEY_KEYCODE) { + e.preventDefault(); + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else if (hasFocus() && e.keyCode === DOWN_KEYCODE) { + e.preventDefault(); + unfocusSearchbar(); + searchresults.firstElementChild.classList.add("focus"); + } else if (!hasFocus() && (e.keyCode === DOWN_KEYCODE + || e.keyCode === UP_KEYCODE + || e.keyCode === SELECT_KEYCODE)) { + // not `:focus` because browser does annoying scrolling + var focused = searchresults.querySelector("li.focus"); + if (!focused) return; + e.preventDefault(); + if (e.keyCode === DOWN_KEYCODE) { + var next = focused.nextElementSibling; + if (next) { + focused.classList.remove("focus"); + next.classList.add("focus"); + } + } else if (e.keyCode === UP_KEYCODE) { + focused.classList.remove("focus"); + var prev = focused.previousElementSibling; + if (prev) { + prev.classList.add("focus"); + } else { + searchbar.select(); + } + } else { // SELECT_KEYCODE + window.location.assign(focused.querySelector('a')); + } + } + } + + function showSearch(yes) { + if (yes) { + search_wrap.classList.remove('hidden'); + searchicon.setAttribute('aria-expanded', 'true'); + } else { + search_wrap.classList.add('hidden'); + searchicon.setAttribute('aria-expanded', 'false'); + var results = searchresults.children; + for (var i = 0; i < results.length; i++) { + results[i].classList.remove("focus"); + } + } + } + + function showResults(yes) { + if (yes) { + searchresults_outer.classList.remove('hidden'); + } else { + searchresults_outer.classList.add('hidden'); + } + } + + // Eventhandler for search icon + function searchIconClickHandler() { + if (search_wrap.classList.contains('hidden')) { + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else { + showSearch(false); + } + } + + // Eventhandler for keyevents while the searchbar is focused + function searchbarKeyUpHandler() { + var searchterm = searchbar.value.trim(); + if (searchterm != "") { + searchbar.classList.add("active"); + doSearch(searchterm); + } else { + searchbar.classList.remove("active"); + showResults(false); + removeChildren(searchresults); + } + + setSearchUrlParameters(searchterm, "push_if_new_search_else_replace"); + + // Remove marks + marker.unmark(); + } + + // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and #heading-anchor . + // `action` can be one of "push", "replace", "push_if_new_search_else_replace" + // and replaces or pushes a new browser history item. + // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet. + function setSearchUrlParameters(searchterm, action) { + var url = parseURL(window.location.href); + var first_search = ! url.params.hasOwnProperty(URL_SEARCH_PARAM); + if (searchterm != "" || action == "push_if_new_search_else_replace") { + url.params[URL_SEARCH_PARAM] = searchterm; + delete url.params[URL_MARK_PARAM]; + url.hash = ""; + } else { + delete url.params[URL_MARK_PARAM]; + delete url.params[URL_SEARCH_PARAM]; + } + // A new search will also add a new history item, so the user can go back + // to the page prior to searching. A updated search term will only replace + // the url. + if (action == "push" || (action == "push_if_new_search_else_replace" && first_search) ) { + history.pushState({}, document.title, renderURL(url)); + } else if (action == "replace" || (action == "push_if_new_search_else_replace" && !first_search) ) { + history.replaceState({}, document.title, renderURL(url)); + } + } + + function doSearch(searchterm) { + + // Don't search the same twice + if (current_searchterm == searchterm) { return; } + else { current_searchterm = searchterm; } + + if (searchindex == null) { return; } + + // Do the actual search + var results = searchindex.search(searchterm, search_options); + var resultcount = Math.min(results.length, results_options.limit_results); + + // Display search metrics + searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); + + // Clear and insert results + var searchterms = searchterm.split(' '); + removeChildren(searchresults); + for(var i = 0; i < resultcount ; i++){ + var resultElem = document.createElement('li'); + resultElem.innerHTML = formatSearchResult(results[i], searchterms); + searchresults.appendChild(resultElem); + } + + // Display results + showResults(true); + } + + fetch(path_to_root + 'searchindex.json') + .then(response => response.json()) + .then(json => init(json)) + .catch(error => { // Try to load searchindex.js if fetch failed + var script = document.createElement('script'); + script.src = path_to_root + 'searchindex.js'; + script.onload = () => init(window.search); + document.head.appendChild(script); + }); + + // Exported functions + search.hasFocus = hasFocus; +})(window.search); diff --git a/docs/searchindex.js b/docs/searchindex.js new file mode 100644 index 0000000000..a301c65782 --- /dev/null +++ b/docs/searchindex.js @@ -0,0 +1 @@ +Object.assign(window.search, {"doc_urls":["index.html#what-is-fe","index.html#why-fe","index.html#who-is-fe-for","index.html#what-problems-does-fe-solve","index.html#get-started","quickstart/index.html#quickstart","quickstart/index.html#download-and-install-fe","quickstart/first_contract.html#write-your-first-fe-contract","quickstart/first_contract.html#create-a-guest_bookfe-file","quickstart/first_contract.html#add-a-method-to-sign-the-guest-book","quickstart/first_contract.html#add-a-method-to-read-a-message","quickstart/deploy_contract.html#deploy-your-contract","quickstart/deploy_contract.html#prerequisites","quickstart/deploy_contract.html#introduction","quickstart/deploy_contract.html#your-developer-environment","quickstart/deploy_contract.html#deploying-to-a-local-network","quickstart/deploy_contract.html#making-the-deployment-transaction","quickstart/deploy_contract.html#signing-the-guest-book","quickstart/deploy_contract.html#reading-the-signatures","quickstart/deploy_contract.html#deploying-to-a-public-test-network","quickstart/deploy_contract.html#summary","user-guide/index.html#user-guide","user-guide/installation.html#installation","user-guide/installation.html#package-managers","user-guide/installation.html#download-the-compiler","user-guide/installation.html#add-permission-to-execute","user-guide/installation.html#building-from-source","user-guide/installation.html#editor-support--syntax-highlighting","user-guide/projects.html#fe-projects","user-guide/projects.html#creating-a-project","user-guide/projects.html#manifest","user-guide/projects.html#project-modes","user-guide/projects.html#importing","user-guide/projects.html#tests","user-guide/projects.html#running-your-project","user-guide/tutorials/index.html#tutorials","user-guide/tutorials/auction.html#auction-contract","user-guide/tutorials/auction.html#the-auction-rules","user-guide/tutorials/auction.html#get-started","user-guide/tutorials/auction.html#writing-the-contract","user-guide/tutorials/auction.html#defining-the-contract-and-initializing-variables","user-guide/tutorials/auction.html#bidding","user-guide/tutorials/auction.html#withdrawing","user-guide/tutorials/auction.html#end-the-auction","user-guide/tutorials/auction.html#view-functions","user-guide/tutorials/auction.html#build-and-deploy-the-contract","user-guide/tutorials/auction.html#summary","user-guide/example_contracts/index.html#example-contracts","user-guide/example_contracts/auction_contract.html","user-guide/external_links.html#useful-external-links","user-guide/external_links.html#tools","user-guide/external_links.html#projects","user-guide/external_links.html#hackathon-projects","user-guide/external_links.html#others","user-guide/external_links.html#blog-posts","user-guide/external_links.html#videos","development/index.html#development","development/build.html#build-and-test","development/release.html#release","development/release.html#versioning","development/release.html#generate-release-notes","development/release.html#generate-the-release","development/release.html#tag-and-push-the-release","development/release.html#manually-edit-the-release-on-github","development/release.html#updating-docs--website","development/release.html#preview-the-sites-locally","development/release.html#deploy-website--docs","std/index.html#fe-standard-library","std/precompiles.html#precompiles","std/precompiles.html#ec_recover","std/precompiles.html#parameters","std/precompiles.html#returns","std/precompiles.html#function-signature","std/precompiles.html#example","std/precompiles.html#sha2_256","std/precompiles.html#parameters-1","std/precompiles.html#returns-1","std/precompiles.html#function-signature-1","std/precompiles.html#example-1","std/precompiles.html#ripemd_160","std/precompiles.html#parameters-2","std/precompiles.html#returns-2","std/precompiles.html#function-signature-2","std/precompiles.html#example-2","std/precompiles.html#identity","std/precompiles.html#parameters-3","std/precompiles.html#returns-3","std/precompiles.html#function-signature-3","std/precompiles.html#example-3","std/precompiles.html#mod_exp","std/precompiles.html#parameters-4","std/precompiles.html#returns-4","std/precompiles.html#function-signature-4","std/precompiles.html#example-4","std/precompiles.html#ec_add","std/precompiles.html#parameters-5","std/precompiles.html#function-signature-5","std/precompiles.html#returns-5","std/precompiles.html#example-5","std/precompiles.html#ec_mul","std/precompiles.html#parameters-6","std/precompiles.html#function-signature-6","std/precompiles.html#returns-6","std/precompiles.html#example-6","std/precompiles.html#ec_pairing","std/precompiles.html#parameters-7","std/precompiles.html#returns-7","std/precompiles.html#example-7","std/precompiles.html#blake_2f","std/precompiles.html#parameters-8","std/precompiles.html#returns-8","std/precompiles.html#function-signature-7","std/precompiles.html#example-8","spec/index.html#fe-language-specification","spec/notation.html#notation","spec/notation.html#grammar","spec/lexical_structure/index.html#lexical-structure","spec/lexical_structure/keywords.html#keywords","spec/lexical_structure/keywords.html#strict-keywords","spec/lexical_structure/keywords.html#reserved-keywords","spec/lexical_structure/identifiers.html#identifiers","spec/lexical_structure/tokens.html#tokens","spec/lexical_structure/tokens.html#newline","spec/lexical_structure/tokens.html#literals","spec/lexical_structure/tokens.html#examples","spec/lexical_structure/tokens.html#boolean-literals","spec/lexical_structure/tokens.html#string-literals","spec/lexical_structure/tokens.html#integer-literals","spec/comments.html#comments","spec/items/index.html#items","spec/items/visibility_and_privacy.html#visibility-and-privacy","spec/items/structs.html#structs","spec/items/traits.html#traits","spec/items/enums.html#enum","spec/items/type_aliases.html#type-aliases","spec/items/contracts.html#contracts","spec/items/contracts.html#pragma","spec/items/contracts.html#state-variables","spec/items/contracts.html#contract-functions","spec/items/contracts.html#the-__init__-function","spec/items/contracts.html#structs","spec/items/functions/index.html#functions","spec/items/functions/context.html#context","spec/items/functions/context.html#rationale","spec/items/functions/context.html#the-context-object","spec/items/functions/context.html#context-mutability","spec/items/functions/context.html#abi-conformity","spec/items/functions/context.html#examples","spec/items/functions/context.html#msg_sender-and-msg_value","spec/items/functions/context.html#transferring-ether","spec/items/functions/context.html#createcreate2","spec/items/functions/context.html#block-number","spec/items/functions/self.html#self","spec/items/functions/self.html#mutability","spec/items/functions/self.html#examples","spec/items/functions/self.html#reading-contract-storage","spec/items/functions/self.html#writing-contract-storage","spec/statements/index.html#statements","spec/statements/pragma.html#pragma-statement","spec/statements/const.html#const-statement","spec/statements/let.html#let-statement","spec/statements/assign.html#assignment-statement","spec/statements/augassign.html#augmenting-assignment-statement","spec/statements/revert.html#revert-statement","spec/statements/return.html#return-statement","spec/statements/if.html#if-statement","spec/statements/for.html#for-statement","spec/statements/while.html#while-statement","spec/statements/break.html#break-statement","spec/statements/continue.html#continue-statement","spec/statements/match.html#match-statement","spec/statements/assert.html#assert-statement","spec/expressions/index.html#expressions","spec/expressions/call.html#call-expressions","spec/expressions/tuple.html#tuple-expressions","spec/expressions/list.html#list-expressions","spec/expressions/struct.html#struct-expressions","spec/expressions/indexing.html#index-expressions","spec/expressions/attribute.html#attribute-expressions","spec/expressions/name.html#name-expressions","spec/expressions/path.html#path-expressions","spec/expressions/literal.html#literal-expressions","spec/expressions/arithmetic_operators.html#arithmetic-operators","spec/expressions/comparison_operators.html#comparison-operators","spec/expressions/boolean_operators.html#boolean-operators","spec/expressions/unary_operators.html#unary-operators","spec/type_system/index.html#type-system","spec/type_system/types/index.html#types","spec/type_system/types/boolean.html#boolean-type","spec/type_system/types/contract.html#contract-types","spec/type_system/types/numeric.html#numeric-types","spec/type_system/types/tuple.html#tuple-types","spec/type_system/types/array.html#array-types","spec/type_system/types/struct.html#struct-types","spec/type_system/types/enum.html#enum-types","spec/type_system/types/address.html#address-type","spec/type_system/types/map.html#map-type","spec/type_system/types/string.html#string-type","spec/type_system/types/unit.html#unit-type","spec/type_system/types/function.html#function-types","spec/data_layout/index.html#data-layout","spec/data_layout/stack.html#stack","spec/data_layout/storage/index.html#storage","spec/data_layout/storage/constant_size_values_in_storage.html#constant-size-values-in-storage","spec/data_layout/storage/maps_in_storage.html#maps-in-storage","spec/data_layout/storage/to_mem_function.html#the-to_mem-function","spec/data_layout/memory/index.html#memory","spec/data_layout/memory/sequence_types_in_memory.html#sequence-types-in-memory","contributing.html#contributing","contributing.html#ways-to-contribute","contributing.html#1-reporting-or-fixing-issues","contributing.html#2-improving-the-docs","contributing.html#3-developing-fe","contributing.html#4-community-engagement","contributing.html#processes","contributing.html#reporting-issues","contributing.html#rasing-pull-requests","release_notes.html#release-notes","release_notes.html#0260-zircon-2023-11-03","release_notes.html#features","release_notes.html#improved-documentation","release_notes.html#0250-yoshiokaite-2023-10-26","release_notes.html#features-1","release_notes.html#bugfixes","release_notes.html#improved-documentation-1","release_notes.html#0240-xenotime-2023-08-10","release_notes.html#features-2","release_notes.html#performance-improvements","release_notes.html#improved-documentation-2","release_notes.html#0230-wiluite-2023-06-01","release_notes.html#features-3","release_notes.html#bugfixes-1","release_notes.html#0220-vulcanite-2023-04-05","release_notes.html#features-4","release_notes.html#bugfixes-2","release_notes.html#improved-documentation-3","release_notes.html#0210-alpha-2023-02-28","release_notes.html#features-5","release_notes.html#bugfixes-3","release_notes.html#0200-alpha-2022-12-05","release_notes.html#features-6","release_notes.html#bugfixes-4","release_notes.html#0191-alpha-sunstone-2022-07-06","release_notes.html#features-7","release_notes.html#bugfixes-5","release_notes.html#0180-alpha-ruby-2022-05-27","release_notes.html#features-8","release_notes.html#bugfixes-6","release_notes.html#0170-alpha-quartz-2022-05-26","release_notes.html#features-9","release_notes.html#bugfixes-7","release_notes.html#0160-alpha-2022-05-05","release_notes.html#features-10","release_notes.html#bugfixes-8","release_notes.html#0150-alpha-2022-04-04","release_notes.html#features-11","release_notes.html#bugfixes-9","release_notes.html#0140-alpha-2022-03-02","release_notes.html#features-12","release_notes.html#features-13","release_notes.html#support-local-constant","release_notes.html#support-constant-expression","release_notes.html#support-constant-generics-expression","release_notes.html#bug-fixes","release_notes.html#fix-ice-when-constant-type-is-mismatch","release_notes.html#fix-ice-when-assigning-value-to-constant-twice","release_notes.html#internal-changes---for-fe-contributors","release_notes.html#0130-alpha-2022-01-31-0130-alpha-2022-01-31","release_notes.html#features-14","release_notes.html#bugfixes-10","release_notes.html#0120-alpha-2021-12-31-0120-alpha-2021-12-31","release_notes.html#features-15","release_notes.html#bugfixes-11","release_notes.html#internal-changes---for-fe-contributors-1","release_notes.html#0110-alpha-karlite-2021-12-02","release_notes.html#features-16","release_notes.html#bugfixes-12","release_notes.html#internal-changes---for-fe-contributors-2","release_notes.html#0100-alpha-2021-10-31","release_notes.html#features-17","release_notes.html#bugfixes-13","release_notes.html#internal-changes---for-fe-contributors-3","release_notes.html#090-alpha-2021-09-29","release_notes.html#features-18","release_notes.html#bugfixes-14","release_notes.html#internal-changes---for-fe-contributors-4","release_notes.html#080-alpha-haxonite-2021-08-31","release_notes.html#features-19","release_notes.html#bugfixes-15","release_notes.html#improved-documentation-4","release_notes.html#internal-changes---for-fe-contributors-5","release_notes.html#070-alpha-galaxite-2021-07-27","release_notes.html#features-20","release_notes.html#bugfixes-16","release_notes.html#internal-changes---for-fe-contributors-6","release_notes.html#060-alpha-feldspar-2021-06-10","release_notes.html#features-21","release_notes.html#internal-changes---for-fe-contributors-7","release_notes.html#050-alpha-2021-05-27","release_notes.html#features-22","release_notes.html#bugfixes-17","release_notes.html#improved-documentation-5","release_notes.html#internal-changes---for-fe-contributors-8","release_notes.html#040-alpha-2021-04-28","release_notes.html#features-23","release_notes.html#bugfixes-18","release_notes.html#internal-changes---for-fe-contributors-9","release_notes.html#030-alpha-calamine-2021-03-24","release_notes.html#features-24","release_notes.html#bugfixes-19","release_notes.html#internal-changes---for-fe-contributors-10","release_notes.html#020-alpha-borax-2021-02-27","release_notes.html#features-25","release_notes.html#bugfixes-20","release_notes.html#internal-changes---for-fe-contributors-11","release_notes.html#010-alpha-amethyst-2021-01-20","release_notes.html#features-26","release_notes.html#improved-documentation-6","release_notes.html#internal-changes---for-fe-contributors-12","code_of_conduct.html#contributor-covenant-code-of-conduct","code_of_conduct.html#our-pledge","code_of_conduct.html#our-standards","code_of_conduct.html#enforcement-responsibilities","code_of_conduct.html#scope","code_of_conduct.html#enforcement","code_of_conduct.html#enforcement-guidelines","code_of_conduct.html#1-correction","code_of_conduct.html#2-warning","code_of_conduct.html#3-temporary-ban","code_of_conduct.html#4-permanent-ban","code_of_conduct.html#attribution"],"index":{"documentStore":{"docInfo":{"0":{"body":53,"breadcrumbs":2,"title":1},"1":{"body":65,"breadcrumbs":2,"title":1},"10":{"body":131,"breadcrumbs":8,"title":4},"100":{"body":11,"breadcrumbs":4,"title":1},"101":{"body":9,"breadcrumbs":5,"title":2},"102":{"body":6,"breadcrumbs":4,"title":1},"103":{"body":11,"breadcrumbs":4,"title":1},"104":{"body":7,"breadcrumbs":4,"title":1},"105":{"body":12,"breadcrumbs":4,"title":1},"106":{"body":9,"breadcrumbs":4,"title":1},"107":{"body":35,"breadcrumbs":4,"title":1},"108":{"body":34,"breadcrumbs":4,"title":1},"109":{"body":23,"breadcrumbs":4,"title":1},"11":{"body":0,"breadcrumbs":6,"title":2},"110":{"body":7,"breadcrumbs":4,"title":1},"111":{"body":17,"breadcrumbs":5,"title":2},"112":{"body":37,"breadcrumbs":4,"title":1},"113":{"body":113,"breadcrumbs":5,"title":3},"114":{"body":0,"breadcrumbs":4,"title":1},"115":{"body":77,"breadcrumbs":4,"title":1},"116":{"body":3,"breadcrumbs":6,"title":2},"117":{"body":7,"breadcrumbs":6,"title":1},"118":{"body":56,"breadcrumbs":7,"title":2},"119":{"body":62,"breadcrumbs":7,"title":2},"12":{"body":16,"breadcrumbs":5,"title":1},"120":{"body":46,"breadcrumbs":6,"title":1},"121":{"body":0,"breadcrumbs":6,"title":1},"122":{"body":4,"breadcrumbs":6,"title":1},"123":{"body":24,"breadcrumbs":6,"title":1},"124":{"body":49,"breadcrumbs":6,"title":1},"125":{"body":4,"breadcrumbs":7,"title":2},"126":{"body":34,"breadcrumbs":7,"title":2},"127":{"body":118,"breadcrumbs":7,"title":2},"128":{"body":2,"breadcrumbs":4,"title":1},"129":{"body":7,"breadcrumbs":4,"title":1},"13":{"body":102,"breadcrumbs":5,"title":1},"130":{"body":132,"breadcrumbs":7,"title":2},"131":{"body":62,"breadcrumbs":5,"title":1},"132":{"body":102,"breadcrumbs":5,"title":1},"133":{"body":71,"breadcrumbs":5,"title":1},"134":{"body":37,"breadcrumbs":7,"title":2},"135":{"body":132,"breadcrumbs":5,"title":1},"136":{"body":26,"breadcrumbs":5,"title":1},"137":{"body":25,"breadcrumbs":6,"title":2},"138":{"body":61,"breadcrumbs":6,"title":2},"139":{"body":45,"breadcrumbs":6,"title":2},"14":{"body":65,"breadcrumbs":6,"title":2},"140":{"body":27,"breadcrumbs":5,"title":1},"141":{"body":386,"breadcrumbs":5,"title":1},"142":{"body":14,"breadcrumbs":6,"title":1},"143":{"body":119,"breadcrumbs":6,"title":1},"144":{"body":85,"breadcrumbs":7,"title":2},"145":{"body":42,"breadcrumbs":7,"title":2},"146":{"body":174,"breadcrumbs":7,"title":2},"147":{"body":0,"breadcrumbs":6,"title":1},"148":{"body":40,"breadcrumbs":7,"title":2},"149":{"body":23,"breadcrumbs":7,"title":2},"15":{"body":90,"breadcrumbs":7,"title":3},"150":{"body":19,"breadcrumbs":6,"title":1},"151":{"body":17,"breadcrumbs":7,"title":2},"152":{"body":67,"breadcrumbs":6,"title":1},"153":{"body":24,"breadcrumbs":6,"title":1},"154":{"body":0,"breadcrumbs":6,"title":1},"155":{"body":10,"breadcrumbs":8,"title":3},"156":{"body":10,"breadcrumbs":8,"title":3},"157":{"body":25,"breadcrumbs":4,"title":1},"158":{"body":41,"breadcrumbs":7,"title":2},"159":{"body":40,"breadcrumbs":7,"title":2},"16":{"body":169,"breadcrumbs":7,"title":3},"160":{"body":66,"breadcrumbs":5,"title":1},"161":{"body":58,"breadcrumbs":7,"title":2},"162":{"body":73,"breadcrumbs":9,"title":3},"163":{"body":93,"breadcrumbs":7,"title":2},"164":{"body":78,"breadcrumbs":7,"title":2},"165":{"body":25,"breadcrumbs":5,"title":1},"166":{"body":38,"breadcrumbs":5,"title":1},"167":{"body":50,"breadcrumbs":5,"title":1},"168":{"body":85,"breadcrumbs":7,"title":2},"169":{"body":90,"breadcrumbs":7,"title":2},"17":{"body":84,"breadcrumbs":7,"title":3},"170":{"body":77,"breadcrumbs":7,"title":2},"171":{"body":81,"breadcrumbs":7,"title":2},"172":{"body":26,"breadcrumbs":4,"title":1},"173":{"body":87,"breadcrumbs":7,"title":2},"174":{"body":138,"breadcrumbs":7,"title":2},"175":{"body":80,"breadcrumbs":7,"title":2},"176":{"body":1,"breadcrumbs":7,"title":2},"177":{"body":65,"breadcrumbs":7,"title":2},"178":{"body":65,"breadcrumbs":7,"title":2},"179":{"body":21,"breadcrumbs":7,"title":2},"18":{"body":122,"breadcrumbs":6,"title":2},"180":{"body":23,"breadcrumbs":7,"title":2},"181":{"body":28,"breadcrumbs":7,"title":2},"182":{"body":98,"breadcrumbs":7,"title":2},"183":{"body":42,"breadcrumbs":7,"title":2},"184":{"body":24,"breadcrumbs":7,"title":2},"185":{"body":45,"breadcrumbs":7,"title":2},"186":{"body":0,"breadcrumbs":6,"title":2},"187":{"body":60,"breadcrumbs":6,"title":1},"188":{"body":10,"breadcrumbs":9,"title":2},"189":{"body":65,"breadcrumbs":9,"title":2},"19":{"body":213,"breadcrumbs":8,"title":4},"190":{"body":64,"breadcrumbs":9,"title":2},"191":{"body":136,"breadcrumbs":9,"title":2},"192":{"body":59,"breadcrumbs":9,"title":2},"193":{"body":81,"breadcrumbs":9,"title":2},"194":{"body":7,"breadcrumbs":9,"title":2},"195":{"body":27,"breadcrumbs":9,"title":2},"196":{"body":78,"breadcrumbs":9,"title":2},"197":{"body":69,"breadcrumbs":9,"title":2},"198":{"body":1,"breadcrumbs":9,"title":2},"199":{"body":1,"breadcrumbs":9,"title":2},"2":{"body":43,"breadcrumbs":2,"title":1},"20":{"body":49,"breadcrumbs":5,"title":1},"200":{"body":56,"breadcrumbs":6,"title":2},"201":{"body":53,"breadcrumbs":6,"title":1},"202":{"body":4,"breadcrumbs":6,"title":1},"203":{"body":39,"breadcrumbs":13,"title":4},"204":{"body":59,"breadcrumbs":9,"title":2},"205":{"body":14,"breadcrumbs":9,"title":2},"206":{"body":32,"breadcrumbs":6,"title":1},"207":{"body":42,"breadcrumbs":11,"title":3},"208":{"body":2,"breadcrumbs":2,"title":1},"209":{"body":0,"breadcrumbs":3,"title":2},"21":{"body":36,"breadcrumbs":4,"title":2},"210":{"body":20,"breadcrumbs":5,"title":4},"211":{"body":41,"breadcrumbs":4,"title":3},"212":{"body":82,"breadcrumbs":4,"title":3},"213":{"body":25,"breadcrumbs":4,"title":3},"214":{"body":0,"breadcrumbs":2,"title":1},"215":{"body":42,"breadcrumbs":3,"title":2},"216":{"body":55,"breadcrumbs":4,"title":3},"217":{"body":13,"breadcrumbs":4,"title":2},"218":{"body":0,"breadcrumbs":7,"title":5},"219":{"body":141,"breadcrumbs":3,"title":1},"22":{"body":44,"breadcrumbs":4,"title":1},"220":{"body":6,"breadcrumbs":4,"title":2},"221":{"body":0,"breadcrumbs":7,"title":5},"222":{"body":130,"breadcrumbs":3,"title":1},"223":{"body":29,"breadcrumbs":3,"title":1},"224":{"body":6,"breadcrumbs":4,"title":2},"225":{"body":0,"breadcrumbs":7,"title":5},"226":{"body":31,"breadcrumbs":3,"title":1},"227":{"body":18,"breadcrumbs":4,"title":2},"228":{"body":7,"breadcrumbs":4,"title":2},"229":{"body":0,"breadcrumbs":7,"title":5},"23":{"body":24,"breadcrumbs":5,"title":2},"230":{"body":245,"breadcrumbs":3,"title":1},"231":{"body":78,"breadcrumbs":3,"title":1},"232":{"body":9,"breadcrumbs":7,"title":5},"233":{"body":86,"breadcrumbs":3,"title":1},"234":{"body":31,"breadcrumbs":3,"title":1},"235":{"body":8,"breadcrumbs":4,"title":2},"236":{"body":0,"breadcrumbs":7,"title":5},"237":{"body":63,"breadcrumbs":3,"title":1},"238":{"body":4,"breadcrumbs":3,"title":1},"239":{"body":0,"breadcrumbs":7,"title":5},"24":{"body":47,"breadcrumbs":5,"title":2},"240":{"body":522,"breadcrumbs":3,"title":1},"241":{"body":80,"breadcrumbs":3,"title":1},"242":{"body":0,"breadcrumbs":8,"title":6},"243":{"body":375,"breadcrumbs":3,"title":1},"244":{"body":63,"breadcrumbs":3,"title":1},"245":{"body":0,"breadcrumbs":8,"title":6},"246":{"body":10,"breadcrumbs":3,"title":1},"247":{"body":30,"breadcrumbs":3,"title":1},"248":{"body":0,"breadcrumbs":8,"title":6},"249":{"body":66,"breadcrumbs":3,"title":1},"25":{"body":78,"breadcrumbs":6,"title":3},"250":{"body":175,"breadcrumbs":3,"title":1},"251":{"body":0,"breadcrumbs":7,"title":5},"252":{"body":16,"breadcrumbs":3,"title":1},"253":{"body":8,"breadcrumbs":3,"title":1},"254":{"body":0,"breadcrumbs":7,"title":5},"255":{"body":176,"breadcrumbs":3,"title":1},"256":{"body":11,"breadcrumbs":3,"title":1},"257":{"body":0,"breadcrumbs":7,"title":5},"258":{"body":374,"breadcrumbs":3,"title":1},"259":{"body":0,"breadcrumbs":3,"title":1},"26":{"body":104,"breadcrumbs":5,"title":2},"260":{"body":10,"breadcrumbs":5,"title":3},"261":{"body":15,"breadcrumbs":5,"title":3},"262":{"body":24,"breadcrumbs":6,"title":4},"263":{"body":0,"breadcrumbs":4,"title":2},"264":{"body":13,"breadcrumbs":7,"title":5},"265":{"body":67,"breadcrumbs":8,"title":6},"266":{"body":133,"breadcrumbs":6,"title":4},"267":{"body":0,"breadcrumbs":12,"title":10},"268":{"body":141,"breadcrumbs":3,"title":1},"269":{"body":57,"breadcrumbs":3,"title":1},"27":{"body":60,"breadcrumbs":7,"title":4},"270":{"body":0,"breadcrumbs":12,"title":10},"271":{"body":94,"breadcrumbs":3,"title":1},"272":{"body":52,"breadcrumbs":3,"title":1},"273":{"body":27,"breadcrumbs":6,"title":4},"274":{"body":0,"breadcrumbs":8,"title":6},"275":{"body":184,"breadcrumbs":3,"title":1},"276":{"body":31,"breadcrumbs":3,"title":1},"277":{"body":80,"breadcrumbs":6,"title":4},"278":{"body":0,"breadcrumbs":7,"title":5},"279":{"body":213,"breadcrumbs":3,"title":1},"28":{"body":36,"breadcrumbs":6,"title":2},"280":{"body":185,"breadcrumbs":3,"title":1},"281":{"body":72,"breadcrumbs":6,"title":4},"282":{"body":0,"breadcrumbs":7,"title":5},"283":{"body":67,"breadcrumbs":3,"title":1},"284":{"body":41,"breadcrumbs":3,"title":1},"285":{"body":6,"breadcrumbs":6,"title":4},"286":{"body":0,"breadcrumbs":8,"title":6},"287":{"body":102,"breadcrumbs":3,"title":1},"288":{"body":136,"breadcrumbs":3,"title":1},"289":{"body":26,"breadcrumbs":4,"title":2},"29":{"body":27,"breadcrumbs":6,"title":2},"290":{"body":7,"breadcrumbs":6,"title":4},"291":{"body":0,"breadcrumbs":8,"title":6},"292":{"body":170,"breadcrumbs":3,"title":1},"293":{"body":84,"breadcrumbs":3,"title":1},"294":{"body":10,"breadcrumbs":6,"title":4},"295":{"body":0,"breadcrumbs":8,"title":6},"296":{"body":167,"breadcrumbs":3,"title":1},"297":{"body":15,"breadcrumbs":6,"title":4},"298":{"body":0,"breadcrumbs":7,"title":5},"299":{"body":62,"breadcrumbs":3,"title":1},"3":{"body":50,"breadcrumbs":4,"title":3},"30":{"body":61,"breadcrumbs":5,"title":1},"300":{"body":8,"breadcrumbs":3,"title":1},"301":{"body":13,"breadcrumbs":4,"title":2},"302":{"body":54,"breadcrumbs":6,"title":4},"303":{"body":0,"breadcrumbs":7,"title":5},"304":{"body":192,"breadcrumbs":3,"title":1},"305":{"body":53,"breadcrumbs":3,"title":1},"306":{"body":34,"breadcrumbs":6,"title":4},"307":{"body":0,"breadcrumbs":8,"title":6},"308":{"body":135,"breadcrumbs":3,"title":1},"309":{"body":181,"breadcrumbs":3,"title":1},"31":{"body":28,"breadcrumbs":6,"title":2},"310":{"body":23,"breadcrumbs":6,"title":4},"311":{"body":0,"breadcrumbs":8,"title":6},"312":{"body":479,"breadcrumbs":3,"title":1},"313":{"body":108,"breadcrumbs":3,"title":1},"314":{"body":17,"breadcrumbs":6,"title":4},"315":{"body":44,"breadcrumbs":8,"title":6},"316":{"body":146,"breadcrumbs":3,"title":1},"317":{"body":20,"breadcrumbs":4,"title":2},"318":{"body":15,"breadcrumbs":6,"title":4},"319":{"body":0,"breadcrumbs":6,"title":4},"32":{"body":20,"breadcrumbs":5,"title":1},"320":{"body":51,"breadcrumbs":3,"title":1},"321":{"body":75,"breadcrumbs":3,"title":1},"322":{"body":42,"breadcrumbs":4,"title":2},"323":{"body":34,"breadcrumbs":3,"title":1},"324":{"body":25,"breadcrumbs":3,"title":1},"325":{"body":13,"breadcrumbs":4,"title":2},"326":{"body":27,"breadcrumbs":4,"title":2},"327":{"body":42,"breadcrumbs":4,"title":2},"328":{"body":41,"breadcrumbs":5,"title":3},"329":{"body":26,"breadcrumbs":5,"title":3},"33":{"body":70,"breadcrumbs":5,"title":1},"330":{"body":32,"breadcrumbs":3,"title":1},"34":{"body":11,"breadcrumbs":6,"title":2},"35":{"body":20,"breadcrumbs":4,"title":1},"36":{"body":30,"breadcrumbs":7,"title":2},"37":{"body":34,"breadcrumbs":7,"title":2},"38":{"body":43,"breadcrumbs":6,"title":1},"39":{"body":10,"breadcrumbs":7,"title":2},"4":{"body":26,"breadcrumbs":2,"title":1},"40":{"body":446,"breadcrumbs":9,"title":4},"41":{"body":264,"breadcrumbs":6,"title":1},"42":{"body":97,"breadcrumbs":6,"title":1},"43":{"body":118,"breadcrumbs":7,"title":2},"44":{"body":64,"breadcrumbs":7,"title":2},"45":{"body":228,"breadcrumbs":8,"title":3},"46":{"body":68,"breadcrumbs":6,"title":1},"47":{"body":3,"breadcrumbs":6,"title":2},"48":{"body":155,"breadcrumbs":6,"title":2},"49":{"body":13,"breadcrumbs":8,"title":3},"5":{"body":15,"breadcrumbs":2,"title":1},"50":{"body":6,"breadcrumbs":6,"title":1},"51":{"body":17,"breadcrumbs":6,"title":1},"52":{"body":109,"breadcrumbs":7,"title":2},"53":{"body":19,"breadcrumbs":6,"title":1},"54":{"body":5,"breadcrumbs":7,"title":2},"55":{"body":14,"breadcrumbs":6,"title":1},"56":{"body":7,"breadcrumbs":2,"title":1},"57":{"body":74,"breadcrumbs":5,"title":2},"58":{"body":0,"breadcrumbs":3,"title":1},"59":{"body":8,"breadcrumbs":3,"title":1},"6":{"body":37,"breadcrumbs":4,"title":3},"60":{"body":34,"breadcrumbs":5,"title":3},"61":{"body":18,"breadcrumbs":4,"title":2},"62":{"body":18,"breadcrumbs":5,"title":3},"63":{"body":21,"breadcrumbs":6,"title":4},"64":{"body":58,"breadcrumbs":5,"title":3},"65":{"body":19,"breadcrumbs":5,"title":3},"66":{"body":22,"breadcrumbs":5,"title":3},"67":{"body":13,"breadcrumbs":5,"title":3},"68":{"body":66,"breadcrumbs":4,"title":1},"69":{"body":49,"breadcrumbs":4,"title":1},"7":{"body":55,"breadcrumbs":8,"title":4},"70":{"body":23,"breadcrumbs":4,"title":1},"71":{"body":3,"breadcrumbs":4,"title":1},"72":{"body":11,"breadcrumbs":5,"title":2},"73":{"body":11,"breadcrumbs":4,"title":1},"74":{"body":14,"breadcrumbs":4,"title":1},"75":{"body":5,"breadcrumbs":4,"title":1},"76":{"body":4,"breadcrumbs":4,"title":1},"77":{"body":6,"breadcrumbs":5,"title":2},"78":{"body":7,"breadcrumbs":4,"title":1},"79":{"body":13,"breadcrumbs":4,"title":1},"8":{"body":124,"breadcrumbs":7,"title":3},"80":{"body":5,"breadcrumbs":4,"title":1},"81":{"body":4,"breadcrumbs":4,"title":1},"82":{"body":6,"breadcrumbs":5,"title":2},"83":{"body":7,"breadcrumbs":4,"title":1},"84":{"body":11,"breadcrumbs":4,"title":1},"85":{"body":5,"breadcrumbs":4,"title":1},"86":{"body":5,"breadcrumbs":4,"title":1},"87":{"body":6,"breadcrumbs":5,"title":2},"88":{"body":8,"breadcrumbs":4,"title":1},"89":{"body":8,"breadcrumbs":4,"title":1},"9":{"body":117,"breadcrumbs":9,"title":5},"90":{"body":39,"breadcrumbs":4,"title":1},"91":{"body":5,"breadcrumbs":4,"title":1},"92":{"body":16,"breadcrumbs":5,"title":2},"93":{"body":20,"breadcrumbs":4,"title":1},"94":{"body":5,"breadcrumbs":4,"title":1},"95":{"body":20,"breadcrumbs":4,"title":1},"96":{"body":11,"breadcrumbs":5,"title":2},"97":{"body":6,"breadcrumbs":4,"title":1},"98":{"body":12,"breadcrumbs":4,"title":1},"99":{"body":5,"breadcrumbs":4,"title":1}},"docs":{"0":{"body":"Fe is the next generation smart contract language for Ethereum . Fe is a smart contract language that strives to make developing Ethereum smart contract development safer, simpler and more fun . Smart contracts are programs executed by a computer embedded into Ethereum clients known as the Ethereum Virtual Machine (EVM) . The EVM executes bytecode instructions that are not human readable. Therefore, developers use higher-level languages that compiles to EVM bytecode. Fe is one of these languages.","breadcrumbs":"Introduction » What is Fe?","id":"0","title":"What is Fe?"},"1":{"body":"Fe aims to make writing secure smart contract code a great experience. With Fe, writing safe code feels natural and fun. Fe shares similar syntax with the popular languages Rust and Python , easing the learning curve for new users. It also implements the best features from Rust to limit dynamic behaviour while also maximizing expressiveness, meaning you can write clean, readable code without sacrificing compile time guarantees. Fe is: statically typed expressive compiled using Yul built to a detailed language specification able to limit dynamic behaviour rapidly evolving!","breadcrumbs":"Introduction » Why Fe?","id":"1","title":"Why Fe?"},"10":{"body":"To make the guest book more useful we will also add a method get_msg to read entries from a given address. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr] }\n} However, we will hit another error as we try to recompile the current code. Unable to compile guest_book.fe.\nerror: value must be copied to memory ┌─ guest_book.fe:10:14 │\n8 │ return self.messages[addr] │ ^^^^^^^^^^^^^^^^^^^ this value is in storage │ = Hint: values located in storage can be copied to memory using the `to_mem` function. = Example: `self.my_array.to_mem()` When we try to return a reference type such as an array from the storage of the contract we have to explicitly copy it to memory using the to_mem() function. Note: In the future Fe will likely introduce immutable storage pointers which might affect these semantics. The code should compile fine when we change it accordingly. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} Congratulations! You finished your first little Fe project. 👏 In the next chapter we will learn how to deploy our code and tweak it a bit further.","breadcrumbs":"Quickstart » Write your first contract » Add a method to read a message","id":"10","title":"Add a method to read a message"},"100":{"body":"x: x-coordinate, u256 y: y coordinate, u256 s: multiplier, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"100","title":"Parameters"},"101":{"body":"pub fn ec_mul(x: u256, y: u256, s: u256)-> (u256,u256)","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"101","title":"Function signature"},"102":{"body":"ec_mul returns a tuple of u256, (u256, u256).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"102","title":"Returns"},"103":{"body":"let (x, y): (u256, u256) = precompiles::ec_mul( x: 1, y: 2, s: 2\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"103","title":"Example"},"104":{"body":"ec_pairing does elliptic curve pairing - a form of encrypted multiplication.","breadcrumbs":"Standard Library » Precompiles » ec_pairing","id":"104","title":"ec_pairing"},"105":{"body":"input_buf: sequence of bytes representing the result of the elliptic curve operation (G1 * G2) ^ k, as MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"105","title":"Parameters"},"106":{"body":"ec_pairing returns a bool indicating whether the pairing is satisfied (true) or not (false).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"106","title":"Returns"},"107":{"body":"let mut input_buf: MemoryBuffer = MemoryBuffer::new(len: 384) let mut writer: MemoryBufferWriter = buf.writer() writer.write(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da) writer.write(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6) writer.write(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc) writer.write(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9) writer.write(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90) writer.write(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e) writer.write(value: 0x0000000000000000000000000000000000000000000000000000000000000001) writer.write(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45) writer.write(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4) writer.write(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7) writer.write(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2) writer.write(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc) assert precompiles::ec_pairing(buf)\n}","breadcrumbs":"Standard Library » Precompiles » Example","id":"107","title":"Example"},"108":{"body":"blake_2f is a compression algorithm for the cryptographic hash function BLAKE2b. It takes as an argument the state vector h, message block vector m, offset counter t, final block indicator flag f, and number of rounds rounds. The state vector provided as the first parameter is modified by the function.","breadcrumbs":"Standard Library » Precompiles » blake_2f","id":"108","title":"blake_2f"},"109":{"body":"h: the state vector, Array m: message block vector, Array t: offset counter, Array f: bool rounds: number of rounds of mixing, u32","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"109","title":"Parameters"},"11":{"body":"","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploy your contract.","id":"11","title":"Deploy your contract."},"110":{"body":"blake_2f returns a modified state vector, Array","breadcrumbs":"Standard Library » Precompiles » Returns","id":"110","title":"Returns"},"111":{"body":"pub fn blake_2f(rounds: u32, h: Array, m: Array, t: Array, f: bool) -> Array","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"111","title":"Function signature"},"112":{"body":"let result: Array = precompiles::blake_2f( rounds: 12, h: [ 0x48c9bdf267e6096a, 0x3ba7ca8485ae67bb, 0x2bf894fe72f36e3c, 0xf1361d5f3af54fa5, 0xd182e6ad7f520e51, 0x1f6c3e2b8c68059b, 0x6bbd41fbabd9831f, 0x79217e1319cde05b, ], m: [ 0x6162630000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], t: [ 0x0300000000000000, 0x0000000000000000, ], f: true\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"112","title":"Example"},"113":{"body":"Warning: This is a work in progress document. It is incomplete and specifications aren't stable yet. Notation Lexical Structure Keywords Identifiers Tokens Comments Items Visibility and Privacy Structs Traits Enums Type Aliases Contracts Functions Context Self Statements pragma Statement Assignment Statement Augmenting Assignment Statement const Statement let Statement revert Statement return Statement if Statement for Statement while Statement break Statement continue Statement assert Statement Expressions Call expressions Tuple expressions List expressions Index expressions Attribute expressions Name expressions Literal expressions Arithmetic Operators Comparison Operators Boolean Operators Unary Operators Type System Types Boolean Type Contract Type Numeric Types Tuple Types Array Types Struct Types Enum Types Address Type Map Type String Type Data Layout Stack Storage Constant size values in storage Maps in storage to_mem() function Memory Sequence types in memory","breadcrumbs":"Specification (WIP) » Fe Language Specification","id":"113","title":"Fe Language Specification"},"114":{"body":"","breadcrumbs":"Specification (WIP) » Notation » Notation","id":"114","title":"Notation"},"115":{"body":"The following notations are used by the Lexer and Syntax grammar snippets: Notation Examples Meaning CAPITAL KW_IF A token produced by the lexer ItalicCamelCase Item A syntactical production string x, while, * The exact character(s) \\x \\n, \\r, \\t, \\0 The character represented by this escape x? pub? An optional item x* OuterAttribute * 0 or more of x x+ MacroMatch + 1 or more of x xa..b HEX_DIGIT1..6 a to b repetitions of x | u8 | u16, Block | Item Either one or another [ ] [b B] Any of the characters listed [ - ] [a-z] Any of the characters in the range ~[ ] ~[b B] Any characters, except those listed ~string ~\\n, ~*/ Any characters, except this sequence ( ) (, Parameter ) Groups items","breadcrumbs":"Specification (WIP) » Notation » Grammar","id":"115","title":"Grammar"},"116":{"body":"Keywords Identifiers Tokens","breadcrumbs":"Specification (WIP) » Lexical Structure » Lexical Structure","id":"116","title":"Lexical Structure"},"117":{"body":"Fe divides keywords into two categories: strict reserved","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Keywords","id":"117","title":"Keywords"},"118":{"body":"These keywords can only be used in their correct contexts. They cannot be used as the identifiers . Lexer: KW_AS : as KW_BREAK : break KW_CONST : const KW_CONTINUE : continue KW_CONST : contract KW_FN : fn KW_ELSE : else KW_ENUM : enum KW_EVENT : event KW_FALSE : false KW_FOR : for KW_IDX : idx KW_IF : if KW_IN : in KW_LET : let KW_MATCH : match KW_MUT : mut KW_NONPAYABLE : nonpayable KW_PAYABLE : payable KW_PUB : pub KW_RETURN : return KW_REVERT : revert KW_SELFVALUE : self KW_STRUCT : struct KW_TRUE : true KW_USE : use KW_WHILE : while KW_ADDRESS : address","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Strict keywords","id":"118","title":"Strict keywords"},"119":{"body":"These keywords aren't used yet, but they are reserved for future use. They have the same restrictions as strict keywords. The reasoning behind this is to make current programs forward compatible with future versions of Fe by forbidding them to use these keywords. Lexer: KW_ABSTRACT : abstract KW_ASYNC : async KW_AWAIT : await KW_DO : do KW_EXTERNAL : external KW_FINAL : final KW_IMPL : impl KW_MACRO : macro KW_OVERRIDE : override KW_PURE : pure KW_SELFTYPE : Self KW_STATIC : static KW_SUPER : super KW_TRAIT : trait KW_TYPE : type KW_TYPEOF : typeof KW_VIEW : view KW_VIRTUAL : virtual KW_WHERE : where KW_YIELD : yield","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Reserved keywords","id":"119","title":"Reserved keywords"},"12":{"body":"You should have compiled the GuestBook contract and have both Guestbook_abi.json and GuestBook.bin available in your outputs folder. If you don't have any of these components, please revisit Write your first contract .","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Prerequisites","id":"12","title":"Prerequisites"},"120":{"body":"Lexer: IDENTIFIER_OR_KEYWORD : [a-z A-Z] [a-z A-Z 0-9 _]* | _ [a-z A-Z 0-9 _]+ Except a strict or reserved keyword An identifier is any nonempty ASCII string of the following form: Either The first character is a letter. The remaining characters are alphanumeric or _. Or The first character is _. The identifier is more than one character. _ alone is not an identifier. The remaining characters are alphanumeric or _.","breadcrumbs":"Specification (WIP) » Lexical Structure » Identifiers » Identifiers","id":"120","title":"Identifiers"},"121":{"body":"","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Tokens","id":"121","title":"Tokens"},"122":{"body":"A token that represents a new line.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » NEWLINE","id":"122","title":"NEWLINE"},"123":{"body":"A literal is an expression consisting of a single token, rather than a sequence of tokens, that immediately and directly denotes the value it evaluates to, rather than referring to it by name or some other evaluation rule. A literal is a form of constant expression, so is evaluated (primarily) at compile time.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Literals","id":"123","title":"Literals"},"124":{"body":"Strings Example Characters Escapes String \"hello\" ASCII subset Quote & ASCII ASCII escapes Name \\n Newline \\r Carriage return \\t Tab \\\\ Backslash Quote escapes Name \\\" Double quote Numbers Number literals * Example Decimal integer 98_222 Hex integer 0xff Octal integer 0o77 Binary integer 0b1111_0000 * All number literals allow _ as a visual separator: 1_234","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Examples","id":"124","title":"Examples"},"125":{"body":"Lexer BOOLEAN_LITERAL : true | false","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Boolean literals","id":"125","title":"Boolean literals"},"126":{"body":"Lexer STRING_LITERAL : \" ( PRINTABLE_ASCII_CHAR | QUOTE_ESCAPE | ASCII_ESCAPE )* \" PRINTABLE_ASCII_CHAR : Any ASCII character between 0x1F and 0x7E QUOTE_ESCAPE : \\\" ASCII_ESCAPE : | \\n | \\r | \\t | \\\\ A string literal is a sequence of any characters that are in the set of printable ASCII characters as well as a set of defined escape sequences. Line breaks are allowed in string literals.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » String literals","id":"126","title":"String literals"},"127":{"body":"Lexer INTEGER_LITERAL : ( DEC_LITERAL | BIN_LITERAL | OCT_LITERAL | HEX_LITERAL ) DEC_LITERAL : DEC_DIGIT (DEC_DIGIT|_)* BIN_LITERAL : 0b (BIN_DIGIT|_)* BIN_DIGIT (BIN_DIGIT|_)* OCT_LITERAL : 0o (OCT_DIGIT|_)* OCT_DIGIT (OCT_DIGIT|_)* HEX_LITERAL : 0x (HEX_DIGIT|_)* HEX_DIGIT (HEX_DIGIT|_)* BIN_DIGIT : [0-1] OCT_DIGIT : [0-7] DEC_DIGIT : [0-9] HEX_DIGIT : [0-9 a-f A-F] An integer literal has one of four forms: A decimal literal starts with a decimal digit and continues with any mixture of decimal digits and underscores . A hex literal starts with the character sequence U+0030 U+0078 (0x) and continues as any mixture (with at least one digit) of hex digits and underscores. An octal literal starts with the character sequence U+0030 U+006F (0o) and continues as any mixture (with at least one digit) of octal digits and underscores. A binary literal starts with the character sequence U+0030 U+0062 (0b) and continues as any mixture (with at least one digit) of binary digits and underscores. Examples of integer literals of various forms: 123 // type u256\n0xff // type u256\n0o70 // type u256\n0b1111_1111_1001_0000 // type u256\n0b1111_1111_1001_0000i64 // type u256","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Integer literals","id":"127","title":"Integer literals"},"128":{"body":"Lexer LINE_COMMENT : // *","breadcrumbs":"Specification (WIP) » Comments » Comments","id":"128","title":"Comments"},"129":{"body":"Visibility and Privacy Structs Enums Type Aliases Contracts","breadcrumbs":"Specification (WIP) » Items » Items","id":"129","title":"Items"},"13":{"body":"When you develop smart contracts it is common to test them on local blockchains first because they are quick and easy to create and it doesn't matter if you make mistakes - there is nothing of real value secured by the blockchain as it only exists on your computer. Later, you can deploy your contract on a public test network to see how it behaves in a more realistic environment where other developers are also testing their code. Finally, when you are very confident that your contract is ready, you can deploy to Ethereum Mainnet (or one of its live Layer-2 networks). Once the contract is deployed on a \"live\" network, you are handling assets with real-world value! In this guide, you will deploy your contract to a local blockchain . This will be an \"ephemeral\" blockchain, meaning it is completely destroyed every time you shut it down and recreated from scratch every time you start it up - it won't save its state when you shut it down. The benefit of this is quick and easy development, and you don't need to find test ETH to pay gas fees. Later in the guide, you will learn how to deploy to a live public test network too.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Introduction","id":"13","title":"Introduction"},"130":{"body":"These two terms are often used interchangeably, and what they are attempting to convey is the answer to the question \"Can this item be used at this location?\" Fe knows two different types of visibility for functions and state variables: public and private. Visibility of private is the default and is used if no other visibility is specified. Public: External functions are part of the contract interface, which means they can be called from other contracts and via transactions. Private: Those functions and state variables can only be accessed internally from within the same contract. This is the default visibility. For example, this is a function that can be called externally from a transaction: pub fn answer_to_life_the_universe_and_everything() -> u256 { return 42\n} Top-level definitions in a Fe source file can also be specified as pub if the file exists within the context of an Ingot. Declaring a definition as pub enables other modules within an Ingot to use the definition. For example, given an Ingot with the following structure: example_ingot\n└── src ├── ding │ └── dong.fe └── main.fe With ding/dong.fe having the following contents: pub struct Dang { pub my_address: address pub my_u256: u256 pub my_i8: i8\n} Then main.fe can use the Dang struct since it is pub-qualified: use ding::dong::Dang contract Foo { pub fn hot_dang() -> Dang { return Dang( my_address: 8, my_u256: 42, my_i8: -1 ) }\n}","breadcrumbs":"Specification (WIP) » Items » Visibility and Privacy » Visibility and Privacy","id":"130","title":"Visibility and Privacy"},"131":{"body":"Syntax Struct : struct IDENTIFIER { StructField * StructMethod * } StructField : pub? IDENTIFIER : Type StructMethod : Function A struct is a nominal struct type defined with the keyword struct. An example of a struct item and its use: struct Point { pub x: u256 pub y: u256\n} fn pointy_stuff() { let mut p: Point = Point(x: 10, y: 11) let px: u256 = p.x p.x = 100\n} Builtin functions: abi_encode() encodes the struct as an ABI tuple and returns the encoded data as a fixed-size byte array that is equal in size to the encoding.","breadcrumbs":"Specification (WIP) » Items » Structs » Structs","id":"131","title":"Structs"},"132":{"body":"Syntax Trait : trait IDENTIFIER { TraitMethod * } TraitMethod : fn IDENTIFIER ( FunctionParameters ? ) FunctionReturnType ? ; A trait is a collection of function signatures that a type can implement. Traits are implemented for specific types through separate implementations. A type can implement a trait by providing a function body for each of the trait's functions. Traits can be used as type bounds for generic functions to restrict the types that can be used with the function. All traits define an implicit type parameter Self that refers to \"the type that is implementing this interface\". Example of the Min trait from Fe's standard library: pub trait Min { fn min() -> Self;\n} Example of the i8 type implementing the Min trait: impl Min for i8 { fn min() -> Self { return -128 }\n} Example of a function restricting a generic parameter to types implementing the Compute trait: pub trait Compute { fn compute(self) -> u256;\n} struct Example { fn do_something(val: T) -> u256 { return val.compute() }\n}","breadcrumbs":"Specification (WIP) » Items » Traits » Traits","id":"132","title":"Traits"},"133":{"body":"Syntax Enumeration : enum IDENTIFIER { EnumField * EnumMethod * } EnumField : IDENTIFIER | IDENTIFIER ( TupleElements ?) EnumMethod : Function TupleElements : Type ( , Type )* An enum , also referred to as enumeration is a simultaneous definition of a nominal Enum type , that can be used to create or pattern-match values of the corresponding type. Enumerations are declared with the keyword enum. An example of an enum item and its use: enum Animal { Dog Cat Bird(BirdType) pub fn bark(self) -> String<10> { match self { Animal::Dog => { return \"bow\" } Animal::Cat => { return \"meow\" } Animal::Bird(BirdType::Duck) => { return \"quack\" } Animal::Bird(BirdType::Owl) => { return \"hoot\" } } }\n} enum BirdType { Duck Owl\n} fn f() { let barker: Animal = Animal::Dog barker.bark()\n}","breadcrumbs":"Specification (WIP) » Items » Enums » Enum","id":"133","title":"Enum"},"134":{"body":"Syntax TypeAlias : type IDENTIFIER = Type A type alias defines a new name for an existing type . Type aliases are declared with the keyword type. For example, the following defines the type BookMsg as a synonym for the type u8[100], a sequence of 100 u8 numbers which is how sequences of bytes are represented in Fe. type BookMsg = Array","breadcrumbs":"Specification (WIP) » Items » Type Aliases » Type aliases","id":"134","title":"Type aliases"},"135":{"body":"Syntax Contract : contract IDENTIFIER { ContractMember * _} ContractMember : Visibility ? ( ContractField | Function | Struct | Enum ) Visibility : pub? ContractField : IDENTIFIER : Type A contract is a piece of executable code stored at an address on the blockchain. See Appendix A. in the Yellow Paper for more info. Contracts can be written in high level languages, like Fe, and then compiled to EVM bytecode for deployment to the blockchain. Once the code is deployed to the blockchain, the contract's functions can be invoked by sending a transaction to the contract address (or a call, for functions that do not modify blockchain data). In Fe, contracts are defined in files with .fe extensions and compiled using fe build. A contract is denoted using the contract keyword. A contract definition adds a new contract type to the module. This contract type may be used for calling existing contracts with the same interface or initializing new contracts with the create methods. An example of a contract: struct Signed { pub book_msg: String<100>\n} contract GuestBook { messages: Map> pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg ctx.emit(Signed(book_msg: book_msg)) } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} Multiple contracts can be compiled from a single .fe contract file.","breadcrumbs":"Specification (WIP) » Items » Contracts » Contracts","id":"135","title":"Contracts"},"136":{"body":"An optional pragma statement can be placed at the beginning of a contract. They are used to enable developers to express that certain code is meant to be compiled with a specific compiler version such that non-matching compiler versions will reject it. Read more on pragma","breadcrumbs":"Specification (WIP) » Items » Contracts » pragma","id":"136","title":"pragma"},"137":{"body":"State variables are permanently stored in the contract storage on the blockchain. State variables must be declared inside the contract body but outside the scope of any individual contract function. pub contract Example { some_number: u256 _some_string: String<100>\n}","breadcrumbs":"Specification (WIP) » Items » Contracts » State variables","id":"137","title":"State variables"},"138":{"body":"Functions are executable blocks of code. Contract functions are defined inside the body of a contract, but functions defined at module scope (outside of any contract) can be called from within a contract as well. Individual functions can be called internally or externally depending upon their visibility (either private or public). Functions can modify either (or neither) the contract instance or the blockchain. This can be inferred from the function signature by the presence of combinations of mut, self and Context. If a function modifies the contract instance it requires mut self as its first argument. If a function modifies the blockchain it requires Context as an argument. Read more on functions .","breadcrumbs":"Specification (WIP) » Items » Contracts » Contract functions","id":"138","title":"Contract functions"},"139":{"body":"The __init__ function is a special contract function that can only be called at contract deployment time . It is mostly used to set initial values to state variables upon deployment. In other contexts, __init__() is commonly referred to as the constructor function. pub contract Example { _some_number: u256 _some_string: String<100> pub fn __init__(mut self, number: u256, string: String<100>) { self._some_number=number; self._some_string=string; }\n} It is not possible to call __init__ at runtime.","breadcrumbs":"Specification (WIP) » Items » Contracts » The __init__() function","id":"139","title":"The __init__() function"},"14":{"body":"Everything in this tutorial can be done by sending JSON data directly to an Ethereum node. However, this is often awkward and error-prone, so a rich ecosystem of tooling has been developed to allow developers to interact with Ethereum in familiar languages or using abstractions that simplify the process. In this guide, you will use Foundry which is a very lightweight set of command-line tools for managing smart contract development. If you already have Foundry installed, head straight to the next section. If you need to install Foundry, head to getfoundry.sh and follow the installation steps. Note: If you are a seasoned smart contract developer, feel free to follow the tutorial using your own toolchain.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Your developer environment","id":"14","title":"Your developer environment"},"140":{"body":"Structs might also exist inside a contract file. These are declared outside of the contract body and are used to define a group of variables that can be used for some specific purpose inside the contract. In Fe structs are also used to represent an Event or an Error. Read more on structs .","breadcrumbs":"Specification (WIP) » Items » Contracts » Structs","id":"140","title":"Structs"},"141":{"body":"Constant size values stored on the stack or in memory can be passed into and returned by functions. Syntax Function : FunctionQualifiers fn IDENTIFIER ( FunctionParameters ? ) FunctionReturnType ? { FunctionStatements * } FunctionQualifiers : pub? FunctionStatements : ReturnStatement | VariableDeclarationStatement | AssignStatement | AugmentedAssignStatement | ForStatement | WhileStatement | IfStatement | AssertStatement | BreakStatement | ContinueStatement | RevertStatement | Expression FunctionParameters : self? | self,? FunctionParam (, FunctionParam )* ,? FunctionParam : FunctionParamLabel ? IDENTIFIER : Types FunctionParamLabel : _ | IDENTIFIER FunctionReturnType : -> Types A function definition consists of name and code block along with an optional list of parameters and return value. Functions are declared with the keyword fn. Functions may declare a set of input parameters, through which the caller passes arguments into the function, and the output type of the value the function will return to its caller on completion. When referred to, a function yields a first-class value of the corresponding zero-sized function type , which when called evaluates to a direct call to the function. A function header prepends a set or curly brackets {...} which contain the function body. For example, this is a simple function: fn add(x: u256, y: u256) -> u256 { return x + y\n} Functions can be defined inside of a contract, inside of a struct, or at the \"top level\" of a module (that is, not nested within another item). Example: fn add(_ x: u256, _ y: u256) -> u256 { return x + y\n} contract CoolCoin { balance: Map fn transfer(mut self, from sender: address, to recipient: address, value: u256) -> bool { if self.balance[sender] < value { return false } self.balance[sender] -= value self.balance[recipient] += value return true } pub fn demo(mut self) { let ann: address = 0xaa let bob: address = 0xbb self.balance[ann] = 100 let bonus: u256 = 2 let value: u256 = add(10, bonus) let ok: bool = self.transfer(from: ann, to: bob, value) }\n} Function parameters have optional labels. When a function is called, the arguments must be labeled and provided in the order specified in the function definition. The label of a parameter defaults to the parameter name; a different label can be specified by adding an explicit label prior to the parameter name. For example: fn encrypt(msg cleartext: u256, key: u256) -> u256 { return cleartext ^ key\n} fn demo() { let out: u256 = encrypt(msg: 0xdecafbad, key: 0xfefefefe)\n} Here, the first parameter of the encrypt function has the label msg, which is used when calling the function, while the parameter name is cleartext, which is used inside the function body. The parameter name is an implementation detail of the function, and can be changed without modifying any function calls, as long as the label remains the same. When calling a function, a label can be omitted when the argument is a variable with a name that matches the parameter label. Example: let msg: u256 = 0xdecafbad\nlet cyf: u256 = encrypt(msg, key: 0x1234) A parameter can also be specified to have no label, by using _ in place of a label in the function definition. In this case, when calling the function, the corresponding argument must not be labeled. Example: fn add(_ x: u256, _ y: u256) -> u256 { return x + y\n}\nfn demo() { let sum: u256 = add(16, 32)\n} Functions defined inside of a contract or struct may take self as a parameter. This gives the function the ability to read and write contract storage or struct fields, respectively. If a function takes self as a parameter, the function must be called via self. For example: let ok: bool = self.transfer(from, to, value) self is expected to come first parameter in the function's parameter list. Functions can also take a Context object which gives access to EVM features that read or write blockchain and transaction data. Context is expected to be first in the function's parameter list unless the function takes self, in which case Context should come second.","breadcrumbs":"Specification (WIP) » Items » Functions » Functions","id":"141","title":"Functions"},"142":{"body":"Context is used frequently in Fe smart contracts. It is used to gate access to EVM features for reading and modifying the blockchain.","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Context","id":"142","title":"Context"},"143":{"body":"Smart contracts execute on the Ethereum Virtual Machine (EVM). The EVM exposes features that allow smart contracts to query or change some of the blockchain data, for example emitting logs that are included in transaction receipts, creating contracts, obtaining the current block number and altering the data stored at certain addresses. To make Fe maximally explicit and as easy as possible to audit, these functions are gated behind a Context object. This is passed as an argument to functions, making it clear whether a function interacts with EVM features from the function signature alone. For example, the following function looks pure from its signature (i.e. it is not expected to alter any blockchain data) but in reality it does modify the blockchain (by emitting a log). pub fn looks_pure_but_isnt() { // COMPILE ERROR block_number()\n} Using Context to control access to EVM functions such as emit solves this problem by requiring an instance of Context to be passed explicitly to the function, making it clear from the function signature that the function executes some blockchain interaction. The function above, rewritten using Context, looks as follows: pub fn uses_context(ctx: Context) -> u256 { return ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Rationale","id":"143","title":"Rationale"},"144":{"body":"The Context object gates access to features such as: emitting logs creating contracts transferring ether reading message info reading block info The Context object needs to be passed as a parameter to the function. The Context object has a defined location in the parameter list. It is the first parameter unless the function also takes self. Context or self appearing at any other position in the parameter list causes a compile time error. The Context object is automatically injected when a function is called externally but it has to be passed explicitly when the function is called from another Fe function e.g. // The context object is automatically injected when this is called externally\npub fn multiply_block_number(ctx: Context) -> u256 { // but it has to be passed along in this function call return retrieves_blocknumber(ctx) * 1000\n} fn retrieves_blocknumber(ctx: Context) -> u256 { return ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » The Context object","id":"144","title":"The Context object"},"145":{"body":"All functionality that modifies the blockchain such as creating logs or contracts or transferring ether would require a mutable Context reference whereas read-only access such as ctx.block_number() does not need require a mutable reference to the context. To pass a mutable Context object, prepend the object name with mut in the function definition, e.g.: struct SomeEvent{\n} pub fn mutable(mut ctx: Context) { ctx.emit(SomeEvent())\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Context mutability","id":"145","title":"Context mutability"},"146":{"body":"The use of Context enables tighter rules and extra clarity compared wth the existing function categories in the ABI, especially when paired with self . The following table shows how combinations of self, mut self, Context and mut Context map to ABI function types. Category Characteristics Fe Syntax ABI Pure Can only operate on input arguments and not produce any information besides its return value. Can not take self and therefore has no access to things that would make it impure foo(val: u256) pure Read Contract Reading information from the contract instance (broad definition includes reading constants from contract code) foo(self) view Storage Writing Writing to contract storage (own or that of other contracts) foo(mut self) payable or nonpayable Context Reading Reading contextual information from the blockchain (msg, block etc) foo(ctx: Context) view Context Modifying Emitting logs, transferring ether, creating contracts foo(ctx: mut Context) payable or nonpayable Read Contract & Context Reading information from the contract instance and Context foo(self, ctx:Context) view Read Contract & write Context Reading information from the contract instance and modify Context foo(self, ctx: mut Context) view Storage Writing & read Context Writing to contract storage and read from Context foo(mut self, ctx: Context) payable or nonpayable Storage Writing & write Context Writing to contract storage and Context foo(mut self, ctx: mut Context) payable or nonpayable This means Fe has nine different categories of function that can be derived from the function signatures that map to four different ABI types.","breadcrumbs":"Specification (WIP) » Items » Functions » Context » ABI conformity","id":"146","title":"ABI conformity"},"147":{"body":"","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Examples","id":"147","title":"Examples"},"148":{"body":"Context includes information about inbound transactions. For example, the following function receives ether and adds the sender's address and the transaction value to a mapping. No blockchain data is being changed, so Context does not need to be mutable. // assumes existence of state variable named 'ledger' with type Map\npub fn add_to_ledger(mut self, ctx: Context) { self.ledger[ctx.msg_sender()] = ctx.msg_value();\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » msg_sender and msg_value","id":"148","title":"msg_sender and msg_value"},"149":{"body":"Transferring ether modifies the blockchain state, so it requires access to a mutable Context object. pub fn send_ether(mut ctx: Context, _addr: address, amount: u256) { ctx.send_value(to: _addr, wei: amount)\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Transferring ether","id":"149","title":"Transferring ether"},"15":{"body":"Foundry has its own local network called Anvil . You can use it to create a local blockchain on your computer. Open a terminal and run the following very simple command: anvil You will see some ASCII art and configuration details in the terminal. Anvil creates a set of accounts that you can use on this network. The account addresses and private keys are displayed in the console ( never use these accounts to interact with any live network). You will also see a line reading listening on 127.0.0.1:8545. This indicates that your local node is listening for HTTP traffic on your local network on port 8545 - this is important because this is how you will send the necessary information to your node so that it can be added to the blockchain, and how you will interact with the contract after it is deployed. Note: Anvil needs to keep running throughout this tutorial - if you close the terminal your blockchain will cease to exist. Once Anvil has started, open a new terminal tab/window to run the rest of the commands in this guide.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploying to a local network","id":"15","title":"Deploying to a local network"},"150":{"body":"Creating a contract via create/create2 requires access to a mutable Context object because it modifies the blockchain state data: pub fn creates_contract(ctx: mut Context): ctx.create2(...)","breadcrumbs":"Specification (WIP) » Items » Functions » Context » create/create2","id":"150","title":"create/create2"},"151":{"body":"Reading block chain information such as the current block number requires Context (but does not require it to be mutable). pub fn retrieves_blocknumber(ctx: Context) { ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » block number","id":"151","title":"block number"},"152":{"body":"self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. self in the context of classes in Python, or this in Javascript. self gives access to constants from the contract code and state variables from contract storage. Note: Here we focus on functions defined inside a contract, giving access to contract storage; however, self can also be used to read and write struct fields where functions are defined inside structs. If a function takes self as a parameter, the function must be called via self. For example: let ok: bool = self.transfer(from, to, value)","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Self","id":"152","title":"Self"},"153":{"body":"self is immutable and can be used for read-only operations on the contract storage (or struct fields). In order to write to the contract storage, you must use mut self. This makes the contract instance mutable and allows the contract storage to be updated.","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Mutability","id":"153","title":"Mutability"},"154":{"body":"","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Examples","id":"154","title":"Examples"},"155":{"body":"contract example { value: u256; pub fn check_value(self) -> u256 { return self.value; }\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Reading contract storage","id":"155","title":"Reading contract storage"},"156":{"body":"contract example { value: u256; pub fn update_value(mut self) { self.value += 1; }\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Writing contract storage","id":"156","title":"Writing contract storage"},"157":{"body":"pragma Statement const Statement let Statement Assignment Statement Augmenting Assignment Statement revert Statement return Statemetn if Statement for Statement while Statement break Statement continue Statement match Statement assert Statement","breadcrumbs":"Specification (WIP) » Statements » Statements","id":"157","title":"Statements"},"158":{"body":"Syntax PragmaStatement : pragma VersionRequirement VersionRequirement :Following the semver implementation by cargo The pragma statement is denoted with the keyword pragma. Evaluating a pragma statement will cause the compiler to reject compilation if the version of the compiler does not conform to the given version requirement. An example of a pragma statement: pragma ^0.1.0 The version requirement syntax is identical to the one that is used by cargo ( more info ).","breadcrumbs":"Specification (WIP) » Statements » pragma Statement » pragma statement","id":"158","title":"pragma statement"},"159":{"body":"Syntax ConstStatement : const IDENTIFIER : Type = Expression A const statement introduces a named constant value. Constants are either directly inlined wherever they are used or loaded from the contract code depending on their type. Example: const TEN: u256 = 10\nconst HUNDO: u256 = TEN * TEN contract Foo { pub fn bar() -> u256 { return HUNDO }\n}","breadcrumbs":"Specification (WIP) » Statements » const Statement » const statement","id":"159","title":"const statement"},"16":{"body":"In the previous guide you wrote the following contract, and compiled it using ./fe build guest_book.fe --overwrite to obtain the contract bytecode. This compilation stage converts the human-readable Fe code into a format that can be efficiently executed by Ethereum's embedded computer, known as the Ethereum Virtual Machine (EVM). The bytecode is stored at an address on the blockchain. The contract functions are invoked by sending instructions in a transaction to that address. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} To make the deployment, we will need to send a transaction to your node via its exposed HTTP port (8545). The following command deploys the Guestbook contract to your local network. Grab the private key of one of your accounts from the information displayed in the terminal running Anvil. cast send --rpc-url localhost:8545 --private-key --create $(cat output/GuestBook/GuestBook.bin) Here's what the response was at the time of writing this tutorial. blockHash 0xcee9ff7c0b57822c5f6dd4fbd3a7e9eadb594b84d770f56f393f137785a52702\nblockNumber 1\ncontractAddress 0x5FbDB2315678afecb367f032d93F642f64180aa3\ncumulativeGasUsed 196992\neffectiveGasPrice 4000000000\ngasUsed 196992\nlogs []\nlogsBloom 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nroot status 1\ntransactionHash 0x3fbde2a994bf2dec8c11fb0390e9d7fbc0fa1150f5eab8f33c130b4561052622\ntransactionIndex 0\ntype 2 This response tells you that your contract has been deployed to the blockchain. The transaction was included in block number 1, and the address it was deployed to is provided in the contractAddress field - you need this address to interact with the contract. Note: Don't assume responses to be identical when following the tutorial. Due to the nature of the blockchain environment the content of the responses will always differ slightly.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Making the deployment transaction","id":"16","title":"Making the deployment transaction"},"160":{"body":"Syntax LetStatement : let IDENTIFIER | TupleTarget : Type = Expression TupleTarget : ( TupleTargetItem (, TupleTargetItem ) + ) TupleTargetItem : IDENTIFIER | TupleTarget A let statement introduces a new set of variables. Any variables introduced by a variable declaration are visible from the point of declaration until the end of the enclosing block scope. Note: Support for nested tuples isn't yet implemented but can be tracked via this GitHub issue . Example: contract Foo { pub fn bar() { let val1: u256 = 1 let (val2):(u256) = (1,) let (val3, val4):(u256, bool) = (1, false) let (val5, val6, (val7, val8)):(u256, bool, (u256, u256)) = (1, false, (2, 4)) }\n}","breadcrumbs":"Specification (WIP) » Statements » let Statement » let statement","id":"160","title":"let statement"},"161":{"body":"Syntax AssignmentStatement : Expression = Expression An assignment statement moves a value into a specified place. An assignment statement consists of an expression that holds a mutable place, followed by an equals sign (=) and a value expression. Example: contract Foo { some_array: Array pub fn bar(mut self) { let mut val1: u256 = 10 // Assignment of stack variable val1 = 10 let mut values: (u256, u256) = (1, 2) // Assignment of tuple item values.item0 = 3 // Assignment of storage array slot self.some_array[5] = 1000 }\n}","breadcrumbs":"Specification (WIP) » Statements » Assignment Statement » Assignment statement","id":"161","title":"Assignment statement"},"162":{"body":"Syntax AssignmentStatement : Expression = Expression | Expression += Expression | Expression -= Expression | Expression %= Expression | Expression **= Expression | Expression <<= Expression | Expression >>= Expression | Expression |= Expression | Expression ^= Expression | Expression &= Expression Augmenting assignment statements combine arithmetic and logical binary operators with assignment statements. An augmenting assignment statement consists of an expression that holds a mutable place, followed by one of the arithmetic or logical binary operators, followed by an equals sign (=) and a value expression. Example: fn example() -> u8 { let mut a: u8 = 1 let b: u8 = 2 a += b a -= b a *= b a /= b a %= b a **= b a <<= b a >>= b a |= b a ^= b a &= b return a\n}","breadcrumbs":"Specification (WIP) » Statements » Augmenting Assignment Statement » Augmenting Assignment statement","id":"162","title":"Augmenting Assignment statement"},"163":{"body":"Syntax RevertStatement : revert Expression ? The revert statement is denoted with the keyword revert. Evaluating a revert statement will cause to revert all state changes made by the call and return with an revert error to the caller. A revert statement may be followed by an expression that evaluates to a struct in which case the struct is encoded as revert data as defined by EIP-838 . An example of a revert statement without revert data: contract Foo { fn transfer(self, to: address, value: u256) { if not self.in_whitelist(addr: to) { revert } // more logic here } fn in_whitelist(self, addr: address) -> bool { return false }\n} An example of a revert statement with revert data: struct ApplicationError { pub code: u8\n} contract Foo { pub fn transfer(self, to: address, value: u256) { if not self.in_whitelist(addr: to) { revert ApplicationError(code: 5) } // more logic here } fn in_whitelist(self, addr: address) -> bool { return false }\n}","breadcrumbs":"Specification (WIP) » Statements » revert Statement » revert statement","id":"163","title":"revert statement"},"164":{"body":"Syntax ReturnStatement : return Expression ? The return statement is denoted with the keyword return. A return statement leaves the current function call with a return value which is either the value of the evaluated expression (if present) or () (unit type) if return is not followed by an expression explicitly. An example of a return statement without explicit use of an expression: contract Foo { fn transfer(self, to: address, value: u256) { if not self.in_whitelist(to) { return } } fn in_whitelist(self, to: address) -> bool { // revert used as placeholder for actual logic revert }\n} The above can also be written in a slightly more verbose form: contract Foo { fn transfer(self, to: address, value: u256) -> () { if not self.in_whitelist(to) { return () } } fn in_whitelist(self, to: address) -> bool { // revert used as placeholder for actual logic revert }\n}","breadcrumbs":"Specification (WIP) » Statements » return Statement » return statement","id":"164","title":"return statement"},"165":{"body":"Syntax IfStatement : if Expression { ( Statement | Expression )+ } (else { ( Statement | Expression )+ })? Example: contract Foo { pub fn bar(val: u256) -> u256 { if val > 5 { return 1 } else { return 2 } }\n} The if statement is used for conditional execution.","breadcrumbs":"Specification (WIP) » Statements » if Statement » if statement","id":"165","title":"if statement"},"166":{"body":"Syntax ForStatement : for IDENTIFIER in Expression { ( Statement | Expression )+ } A for statement is a syntactic construct for looping over elements provided by an array type . An example of a for loop over the contents of an array: Example: contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i } return sum }\n}","breadcrumbs":"Specification (WIP) » Statements » for Statement » for statement","id":"166","title":"for statement"},"167":{"body":"Syntax WhileStatement : while Expression { ( Statement | Expression )+ } A while loop begins by evaluation the boolean loop conditional expression. If the loop conditional expression evaluates to true, the loop body block executes, then control returns to the loop conditional expression. If the loop conditional expression evaluates to false, the while expression completes. Example: contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 } return sum }\n}","breadcrumbs":"Specification (WIP) » Statements » while Statement » while statement","id":"167","title":"while statement"},"168":{"body":"Syntax BreakStatement : break The break statement can only be used within a for or while loop and causes the immediate termination of the loop. If used within nested loops the break statement is associated with the innermost enclosing loop. An example of a break statement used within a while loop. contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 if some_abort_condition() { break } } return sum } fn some_abort_condition() -> bool { // some complex logic return true }\n} An example of a break statement used within a for loop. contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i if some_abort_condition() { break } } return sum } fn some_abort_condition() -> bool { // some complex logic return true }\n}","breadcrumbs":"Specification (WIP) » Statements » break Statement » break statement","id":"168","title":"break statement"},"169":{"body":"Syntax ContinueStatement : continue The continue statement can only be used within a for or while loop and causes the immediate termination of the current iteration, returning control to the loop head. If used within nested loops the continue statement is associated with the innermost enclosing loop. An example of a continue statement used within a while loop. contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 if some_skip_condition() { continue } } return sum } fn some_skip_condition() -> bool { // some complex logic return true }\n} An example of a continue statement used within a for loop. contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i if some_skip_condition() { continue } } return sum } fn some_skip_condition() -> bool { // some complex logic return true }\n}","breadcrumbs":"Specification (WIP) » Statements » continue Statement » continue statement","id":"169","title":"continue statement"},"17":{"body":"Now that the contract is deployed to the blockchain, you can send a transaction to sign it with a custom message. You will sign it from the same address that was used to deploy the contract, but there is nothing preventing you from using any account for which you have the private key (you could experiment by signing from all ten accounts created by Anvil, for example). The following command will send a transaction to call sign(string) on our freshly deployed Guestbook contract sitting at address 0x810cbd4365396165874c054d01b1ede4cc249265 with the message \"We <3 Fe\" . cast send --rpc-url http://localhost:8545 --private-key \"sign(string)\" '\"We <3 Fe\"' The response will look approximately as follows: blockHash 0xb286898484ae737d22838e27b29899b327804ec45309e47a75b18cfd7d595cc7\nblockNumber 2\ncontractAddress cumulativeGasUsed 36278\neffectiveGasPrice 3767596722\ngasUsed 36278\nlogs []\nlogsBloom 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nroot status 1\ntransactionHash 0x309bcea0a77801c15bb7534beab9e33dcb613c93cbea1f12d7f92e4be5ecab8c\ntransactionIndex 0\ntype 2","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Signing the guest book","id":"17","title":"Signing the guest book"},"170":{"body":"Syntax MatchStatement : match Expression { ( Pattern => { Statement * } )+ } Pattern : PatternElem ( | PatternElem )* PatternElem : IDENTIFIER | BOOLEAN_LITERAL | _ | .. | Path | Path ( TuplePatterns ? ) |( TuplePatterns ? ) | Path { StructPatterns ? } TuplePatterns : Pattern ( , Pattern )* StructPatterns : Field ( , Field )*(, ..)? Field : IDENTIFIER : Pattern A match statements compares expression with patterns, then executes body of the matched arm. Example: enum MyEnum { Unit Tuple(u32, u256, bool)\n} contract Foo { pub fn bar(self) -> u256 { let val: MyEnum = MyEnum::Tuple(1, 10, false) return self.eval(val) } fn eval(self, val: MyEnum) -> u256 { match val { MyEnum::Unit => { return 0 } MyEnum::Tuple(.., false) => { return 1 } MyEnum::Tuple(a, b, true) => { return u256(a) + b } } }\n}","breadcrumbs":"Specification (WIP) » Statements » match Statement » match statement","id":"170","title":"match statement"},"171":{"body":"Syntax AssertStatement : assert Expression (, Expression )? The assert statement is used express invariants in the code. It consists of a boolean expression optionally followed by a comma followed by a string expression. If the boolean expression evaluates to false, the code reverts with a panic code of 0x01. In the case that the first expression evaluates to false and a second string expression is given, the code reverts with the given string as the error code . Warning: The current implementation of assert is under active discussion and likely to change. An example of a assert statement without the optional message: contract Foo { fn bar(val: u256) { assert val > 5 }\n} An example of a assert statement with an error message: contract Foo { fn bar(val: u256) { assert val > 5, \"Must be greater than five\" }\n}","breadcrumbs":"Specification (WIP) » Statements » assert Statement » assert statement","id":"171","title":"assert statement"},"172":{"body":"Call expressions Tuple expressions List expressions Struct expressions Index expressions Attribute expressions Name expressions Name expressions Literal expressions Arithmetic Operators Comparison Operators Boolean Operators Unary Operators","breadcrumbs":"Specification (WIP) » Expressions » Expressions","id":"172","title":"Expressions"},"173":{"body":"Syntax CallExpression : Expression GenericArgs ? ( CallParams ? ) GenericArgs : < IDENTIFIER | INTEGER_LITERAL (, IDENTIFIER | INTEGER_LITERAL )* > CallParams : CallArg ( , CallArg )* ,? CallArg : ( CallArgLabel =)? Expression CallArgLabel : IDENTIFIER Label must correspond to the name of the called function argument at the given position. It can be omitted if parameter name and the name of the called function argument are equal. A call expression calls a function. The syntax of a call expression is an expression , followed by a parenthesized comma-separated list of call arguments. Call arguments are expressions, and must be labeled and provided in the order specified in the function definition . If the function eventually returns, then the expression completes. Example: contract Foo { pub fn demo(self) { let ann: address = 0xaa let bob: address = 0xbb self.transfer(from: ann, to: bob, 25) } pub fn transfer(self, from: address, to: address, _ val: u256) {}\n}","breadcrumbs":"Specification (WIP) » Expressions » Call expressions » Call expressions","id":"173","title":"Call expressions"},"174":{"body":"Syntax TupleExpression : ( TupleElements ? ) TupleElements : ( Expression , )+ Expression ? A tuple expression constructs tuple values . The syntax for tuple expressions is a parenthesized, comma separated list of expressions, called the tuple initializer operands . The number of tuple initializer operands is the arity of the constructed tuple. 1-ary tuple expressions require a comma after their tuple initializer operand to be disambiguated with a parenthetical expression. Tuple expressions without any tuple initializer operands produce the unit tuple. For other tuple expressions, the first written tuple initializer operand initializes the field item0 and subsequent operands initializes the next highest field. For example, in the tuple expression (true, false, 1), true initializes the value of the field item0, false field item1, and 1 field item2. Examples of tuple expressions and their types: Expression Type () () (unit) (0, 4) (u256, u256) (true, ) (bool, ) (true, -1, 1) (bool, i256, u256) A tuple field can be accessed via an attribute expression . Example: contract Foo { pub fn bar() { // Creating a tuple via a tuple expression let some_tuple: (u256, bool) = (1, false) // Accessing the first tuple field via the `item0` field baz(input: some_tuple.item0) } pub fn baz(input: u256) {}\n}","breadcrumbs":"Specification (WIP) » Expressions » Tuple expressions » Tuple expressions","id":"174","title":"Tuple expressions"},"175":{"body":"Syntax ListExpression : [ ListElements ? ] ListElements : Expression (, Expression )* ,? A list expression constructs array values . The syntax for list expressions is a parenthesized, comma separated list of expressions, called the list initializer operands . The number of list initializer operands must be equal to the static size of the array type. The types of all list initializer operands must conform to the type of the array. Examples of tuple expressions and their types: Expression Type [1, self.get_number()] u256[2] [true, false, false] bool[3] An array item can be accessed via an index expression . Example: contract Foo { fn get_val3() -> u256 { return 3 } pub fn baz() { let val1: u256 = 2 // A list expression let foo: Array = [1, val1, get_val3()] }\n}","breadcrumbs":"Specification (WIP) » Expressions » List expressions » List expressions","id":"175","title":"List expressions"},"176":{"body":"TBW","breadcrumbs":"Specification (WIP) » Expressions » Struct expressions » Struct expressions","id":"176","title":"Struct expressions"},"177":{"body":"Syntax IndexExpression : Expression [ Expression ] Array and Map types can be indexed by by writing a square-bracket-enclosed expression after them. For arrays, the type of the index key has to be u256 whereas for Map types it has to be equal to the key type of the map. Example: contract Foo { balances: Map pub fn baz(mut self, mut values: Array) { // Assign value at slot 5 values[5] = 1000 // Read value at slot 5 let val1: u256 = values[5] // Assign value for address zero self.balances[address(0)] = 10000 // Read balance of address zero let bal: u256 = self.balances[address(0)] }\n}","breadcrumbs":"Specification (WIP) » Expressions » Index expressions » Index expressions","id":"177","title":"Index expressions"},"178":{"body":"Syntax AttributeExpression : Expression . IDENTIFIER An attribute expression evaluates to the location of an attribute of a struct , tuple or contract . The syntax for an attribute expression is an expression, then a . and finally an identifier. Examples: struct Point { pub x: u256 pub y: u256\n} contract Foo { some_point: Point some_tuple: (bool, u256) fn get_point() -> Point { return Point(x: 100, y: 500) } pub fn baz(some_point: Point, some_tuple: (bool, u256)) { // Different examples of attribute expressions let bool_1: bool = some_tuple.item0 let x1: u256 = some_point.x let point1: u256 = get_point().x let point2: u256 = some_point.x }\n}","breadcrumbs":"Specification (WIP) » Expressions » Attribute expressions » Attribute expressions","id":"178","title":"Attribute expressions"},"179":{"body":"Syntax NameExpression : IDENTIFIER A name expression resolves to a local variable. Example: contract Foo { pub fn baz(foo: u256) { // name expression resolving to the value of `foo` foo }\n}","breadcrumbs":"Specification (WIP) » Expressions » Name expressions » Name expressions","id":"179","title":"Name expressions"},"18":{"body":"The get_msg(address) API allows you to read the messages added to the guestbook for a given address. It will give us a response of 100 zero bytes for any address that hasn't yet signed the guestbook. Since reading the messages doesn't change any state within the blockchain, you don't have to send an actual transaction. Instead, you can perform a call against the local state of the node that you are querying. To do that run: $ cast call --rpc-url http://localhost:8545 \"get_msg(address)\" Notice that the command doesn't need to provide a private key simply because we are not sending an actual transaction. The response arrives in the form of hex-encoded bytes padded with zeroes: 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000 Foundry provides a built-in method to convert this hex string into human-readable ASCII. You can do this as follows: cast to_ascii \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000\" or simply pipe the output of the cast call to to_ascii to do the query and conversion in a single command: cast call --rpc-url https://rpc.sepolia.org \"get_msg(address)\" | cast --to-ascii Either way, the response will be the message you passed to the sign(string) function. \"We <3 Fe\" Congratulations! You've deployed real Fe code to a local blockchain! 🤖","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Reading the signatures","id":"18","title":"Reading the signatures"},"180":{"body":"Syntax PathExpression : IDENTIFIER ( :: IDENTIFIER )* A name expression resolves to a local variable. Example: contract Foo { pub fn baz() { // CONST_VALUE is defined in another module `my_mod`. let foo: u32 = my_mod::CONST_VALUE }\n}","breadcrumbs":"Specification (WIP) » Expressions » Path expressions » Path expressions","id":"180","title":"Path expressions"},"181":{"body":"Syntax LiteralExpression : | STRING_LITERAL | INTEGER_LITERAL | BOOLEAN_LITERAL A literal expression consists of one of the literal forms described earlier. It directly describes a number, string or boolean value. \"hello\" // string type\n5 // integer type\ntrue // boolean type","breadcrumbs":"Specification (WIP) » Expressions » Literal expressions » Literal expressions","id":"181","title":"Literal expressions"},"182":{"body":"Syntax ArithmeticExpression : Expression + Expression | Expression - Expression | Expression * Expression | Expression / Expression | Expression % Expression | Expression ** Expression | Expression & Expression | Expression | Expression | Expression ^ Expression | Expression << Expression | Expression >> Expression Binary operators expressions are all written with infix notation . This table summarizes the behavior of arithmetic and logical binary operators on primitive types. Symbol Integer + Addition - Subtraction * Multiplication / Division* % Remainder ** Exponentiation & Bitwise AND | Bitwise OR ^ Bitwise XOR << Left Shift >> Right Shift * Integer division rounds towards zero. Here are examples of these operators being used. 3 + 6 == 9\n6 - 3 == 3\n2 * 3 == 6\n6 / 3 == 2\n5 % 4 == 1\n2 ** 4 == 16\n12 & 25 == 8\n12 | 25 == 29\n12 ^ 25 == 21\n212 << 1 == 424\n212 >> 1 == 106","breadcrumbs":"Specification (WIP) » Expressions » Arithmetic Operators » Arithmetic Operators","id":"182","title":"Arithmetic Operators"},"183":{"body":"Syntax ComparisonExpression : Expression == Expression | Expression != Expression | Expression > Expression | Expression < Expression | Expression >= Expression | Expression <= Expression Symbol Meaning == Equal != Not equal > Greater than < Less than >= Greater than or equal to <= Less than or equal to Here are examples of the comparison operators being used. 123 == 123\n23 != -12\n12 > 11\n11 >= 11\n11 < 12\n11 <= 11","breadcrumbs":"Specification (WIP) » Expressions » Comparison Operators » Comparison Operators","id":"183","title":"Comparison Operators"},"184":{"body":"Syntax BooleanExpression : Expression or Expression | Expression and Expression The operators or and and may be applied to operands of boolean type. The or operator denotes logical 'or', and the and operator denotes logical 'and'. Example: const x: bool = false or true // true","breadcrumbs":"Specification (WIP) » Expressions » Boolean Operators » Boolean Operators","id":"184","title":"Boolean Operators"},"185":{"body":"Syntax UnaryExpression : not Expression | - Expression | ~ Expression The unary operators are used to negate expressions. The unary - (minus) operator yields the negation of its numeric argument. The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The unary not operator yields the inversion of its boolean argument. Example: fn f() { let x: bool = not true // false let y: i256 = -1 let z: i256 = i256(~1) // -2\n}","breadcrumbs":"Specification (WIP) » Expressions » Unary Operators » Unary Operators","id":"185","title":"Unary Operators"},"186":{"body":"","breadcrumbs":"Specification (WIP) » Type System » Type System","id":"186","title":"Type System"},"187":{"body":"Every variable, item, and value in a Fe program has a type. The _ of a value defines the interpretation of the memory holding it and the operations that may be performed on the value. Built-in types are tightly integrated into the language, in nontrivial ways that are not possible to emulate in user-defined types. User-defined types have limited capabilities. The list of types is: Data types Base types: Boolean — true or false Address - Ethereum address Numeric — integer Reference types: Sequence types Tuple Array String Struct Enum Map Other types: Unit Contract Function","breadcrumbs":"Specification (WIP) » Type System » Types » Types","id":"187","title":"Types"},"188":{"body":"The bool type is a data type which can be either true or false. Example: let x: bool = true","breadcrumbs":"Specification (WIP) » Type System » Types » Boolean Type » Boolean type","id":"188","title":"Boolean type"},"189":{"body":"An contract type is the type denoted by the name of an contract item . A value of a given contract type carries the contract's public interface as attribute functions. A new contract value can be created by either casting an address to a contract type or by creating a new contract using the type attribute functions create or create2. Example: contract Foo { pub fn get_my_num() -> u256 { return 42 }\n} contract FooFactory { pub fn create2_foo(mut ctx: Context) -> address { // `0` is the value being sent and `52` is the address salt let foo: Foo = Foo.create2(ctx, 0, 52) return address(foo) }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Contract Type » Contract types","id":"189","title":"Contract types"},"19":{"body":"Now you have learned how to deploy your contract to a local blockchain, you can consider deploying it to a public test network too. For more complex projects this can be very beneficial because it allows many users to interact with your contract, simulates real network conditions and allows you to interact with other existing contracts on the network. However, to use a public testnet you need to obtain some of that testnet's gas token. In this guide you will use the Sepolia test network, meaning you will need some SepoliaETH. SepoliaETH has no real-world value - it is only required to pay gas fees on the network. If you don't have any SepoliaETH yet, you can request some SepoliaETH from one of the faucets that are listed on the ethereum.org website. IMPORTANT : It is good practice to never use an Ethereum account for a testnet that is also used for the actual Ethereum mainnet. Assuming you have some SepoliaETH, you can repeat the steps from the local blockchain example, however, instead of pointing Foundry to the RPC endpoint for your Anvil node, you need to point it to a node connected to the Sepolia network. There are several options for this: If you run your own node, connect it to the Sepolia network and let it sync. make sure you expose an http port or enable IPC transport. You can use an RPC provider such as Alchemy or Infura You can use an open public node such as https://rpc.sepolia.org. Whichever method you choose, you will have an RPC endpoint for a node connected to Sepolia. You can replace the http://localhost:8545 in the commands with your new endpoint. For example, to deploy the contract using the open public endpoint: cast send --rpc-url https://rpc.sepolia.org --private-key --create $(cat output/GuestBook/GuestBook.bin) Now you have deployed the contract to a public network and anyone can interact with it. To demonstrate, you can check out previous versions of this contract deployed on Sepolia in the past: address link deploy tx hash 0x31b41a4177d7eb66f5ea814959b2c147366b6323f17b6f7060ecff424b58df76 etherscan contract address 0x810cbd4365396165874C054d01B1Ede4cc249265 etherscan Note that calling the sign(string) function will cost you some SepoliaETH because the function changes the state of the blockchain (it adds a message to the contract storage). However, get_msg(address) does not cost any gas because it is a simple lookup in the node's local database. Congratulations! You've deployed real Fe code to a live network 🤖","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploying to a public test network","id":"19","title":"Deploying to a public test network"},"190":{"body":"The unsigned integer types consist of: Type Minimum Maximum u8 0 28-1 u16 0 216-1 u32 0 232-1 u64 0 264-1 u128 0 2128-1 u256 0 2256-1 The signed two's complement integer types consist of: Type Minimum Maximum i8 -(27) 27-1 i16 -(215) 215-1 i32 -(231) 231-1 i64 -(263) 263-1 i128 -(2127) 2127-1 i256 -(2255) 2255-1","breadcrumbs":"Specification (WIP) » Type System » Types » Numeric Types » Numeric types","id":"190","title":"Numeric types"},"191":{"body":"Syntax TupleType : ( ) | ( ( Type , )+ Type ? ) Tuple types are a family of structural types [1] for heterogeneous lists of other types. The syntax for a tuple type is a parenthesized, comma-separated list of types. A tuple type has a number of fields equal to the length of the list of types. This number of fields determines the arity of the tuple. A tuple with n fields is called an n-ary tuple . For example, a tuple with 2 fields is a 2-ary tuple. Fields of tuples are named using increasing numeric names matching their position in the list of types. The first field is item0. The second field is item1. And so on. The type of each field is the type of the same position in the tuple's list of types. For convenience and historical reasons, the tuple type with no fields (()) is often called unit or the unit type . Its one value is also called unit or the unit value . Some examples of tuple types: () (also known as the unit or zero-sized type ) (u8, u8) (bool, i32) (i32, bool) (different type from the previous example) Values of this type are constructed using a tuple expression . Furthermore, various expressions will produce the unit value if there is no other meaningful value for it to evaluate to. Tuple fields can be accessed via an attribute expression . Structural types are always equivalent if their internal types are equivalent.","breadcrumbs":"Specification (WIP) » Type System » Types » Tuple Types » Tuple Types","id":"191","title":"Tuple Types"},"192":{"body":"Syntax ArrayType : Array< Type , INTEGER_LITERAL > An array is a fixed-size sequence of N elements of type T. The array type is written as Array. The size is an integer literal. Arrays are either stored in storage or memory but are never stored directly on the stack. Examples: contract Foo { // An array in storage bar: Array fn do_something() { // An array in memory let values: Array = [10, 100, 100] }\n} All elements of arrays are always initialized, and access to an array is always bounds-checked in safe methods and operators.","breadcrumbs":"Specification (WIP) » Type System » Types » Array Types » Array types","id":"192","title":"Array types"},"193":{"body":"A struct type is the type denoted by the name of an struct item . A struct type is a heterogeneous product of other types, called the fields of the type. New instances of a struct can be constructed with a struct expression . Struct types are either stored in storage or memory but are never stored directly on the stack. Examples: struct Rectangle { pub width: u256 pub length: u256\n} contract Example { // A Rectangle in storage area: Rectangle fn do_something() { let length: u256 = 20 // A rectangle in memory let square: Rectangle = Rectangle(width: 10, length) }\n} All fields of struct types are always initialized. The data layout of a struct is not part of its external API and may be changed in any release. The fields of a struct may be qualified by visibility modifiers , to allow access to data in a struct outside a module.","breadcrumbs":"Specification (WIP) » Type System » Types » Struct Types » Struct types","id":"193","title":"Struct types"},"194":{"body":"An enum type is the type denoted by the name of an enum item .","breadcrumbs":"Specification (WIP) » Type System » Types » Enum Types » Enum types","id":"194","title":"Enum types"},"195":{"body":"The address type represents a 20 byte Ethereum address. Example: contract Example { // An address in storage someone: address fn do_something() { // A plain address (not part of a tuple, struct etc) remains on the stack let dai_contract: address = 0x6b175474e89094c44da98b954eedeac495271d0f }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Address Type » Address Type","id":"195","title":"Address Type"},"196":{"body":"The type Map is used to associate key values with data. The following types can be used as key: unit type boolean type address type numeric types The values can be of any type including other maps, structs , tuples or arrays . Example: contract Foo { bar: Map> baz: Map> pub fn read_bar(self, a: address, b: address) -> u256 { return self.bar[a][b] } pub fn write_bar(mut self, a: address, b: address, value: u256) { self.bar[a][b] = value } pub fn read_baz(self, a: address, b: u256) -> bool { return self.baz[a][b] } pub fn write_baz(mut self, a: address, b: u256, value: bool) { self.baz[a][b] = value }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Map Type » Map type","id":"196","title":"Map type"},"197":{"body":"A value of type String represents a sequence of unsigned bytes with the assumption that the data is valid UTF-8. The String type is generic over a constant value that has to be an integer literal. That value N constraints the maximum number of bytes that are available for storing the string's characters. Note that the value of N does not restrict the type to hold exactly that number of bytes at all times which means that a type such as String<10> can hold a short word such as \"fox\" but it can not hold a full sentence such as \"The brown fox jumps over the white fence\". Example: contract Foo { fn bar() { let single_byte_string: String<1> = \"a\" let longer_string: String<100> = \"foo\" }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » String Type » String Type","id":"197","title":"String Type"},"198":{"body":"TBW","breadcrumbs":"Specification (WIP) » Type System » Types » Unit Type » Unit type","id":"198","title":"Unit type"},"199":{"body":"TBW","breadcrumbs":"Specification (WIP) » Type System » Types » Function Type » Function Types","id":"199","title":"Function Types"},"2":{"body":"Fe is for anyone that develops using the EVM ! Fe compiles to EVM bytecode that can be deployed directly onto Ethereum and EVM-equivalent blockchains. Fe's syntax will feel familiar to Rust and Python developers. Here's what a minimal contract looks like in Fe: contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg }\n}","breadcrumbs":"Introduction » Who is Fe for?","id":"2","title":"Who is Fe for?"},"20":{"body":"Well done! You have now written and compiled a Fe contract and deployed it to both a local blockchain and a live public test network! You also learned how to interact with the deployed contract using transactions and calls. Here's some ideas for what you could do next: Experiment with different developer tooling Get more comfortable with Foundry by exploring the documentation Repeat the steps in this guide but for a more complex contract - be creative! Continue to the Using Fe pages to explore Fe more deeply.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Summary","id":"20","title":"Summary"},"200":{"body":"There are three places where data can be stored on the EVM: stack : 256-bit values placed on the stack that are loaded using DUP operations. storage : 256-bit address space where 256-bit values can be stored. Accessing higher storage slots does not increase gas cost. memory : 256-bit address space where 256-bit values can be stored. Accessing higher memory slots increases gas cost. Each data type can be stored in these locations. How data is stored is described in this section.","breadcrumbs":"Specification (WIP) » Data Layout » Data Layout","id":"200","title":"Data Layout"},"201":{"body":"The following can be stored on the stack: base type values pointers to reference type values The size of each value stored on the stack must not exceed 256 bits. Since all base types are less than or equal to 256 bits in size, we store them on the stack. Pointers to values stored in memory or storage may also be stored on the stack. Example: fn f() { let foo: u256 = 42 // foo is stored on the stack let bar: Array = [0; 100] // bar is a memory pointer stored on the stack\n}","breadcrumbs":"Specification (WIP) » Data Layout » Stack » Stack","id":"201","title":"Stack"},"202":{"body":"All data types can be stored in storage.","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Storage","id":"202","title":"Storage"},"203":{"body":"Storage pointers for constant size values are determined at compile time. Example: contract Cats { population: u256 // assigned a static location by the compiler\n} The value of a base type in storage is found by simply loading the value from storage at the given pointer. To find an element inside of a sequence type, the relative location of the element is added to the given pointer.","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Constant size values in storage » Constant size values in storage","id":"203","title":"Constant size values in storage"},"204":{"body":"Maps are not assigned pointers, because they do not have a location in storage. They are instead assigned a nonce that is used to derive the location of keyed values during runtime. Example: contract Foo { bar: Map // bar is assigned a static nonce by the compiler baz: Map> // baz is assigned a static nonce by the compiler\n} The expression bar[0x00] would resolve to the hash of both bar's nonce and the key value .i.e. keccak256(, 0x00). Similarly, the expression baz[0x00][0x01] would resolve to a nested hash i.e. keccak256(keccak256(, 0x00), 0x01).","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Maps in storage » Maps in storage","id":"204","title":"Maps in storage"},"205":{"body":"Reference type values can be copied from storage and into memory using the to_mem function. Example: let my_array_var: Array = self.my_array_field.to_mem()","breadcrumbs":"Specification (WIP) » Data Layout » Storage » to_mem() function » The to_mem function","id":"205","title":"The to_mem function"},"206":{"body":"Only sequence types can be stored in memory. The first memory slot (0x00) is used to keep track of the lowest available memory slot. Newly allocated segments begin at the value given by this slot. When more memory has been allocated, the value stored in 0x00 is increased. We do not free memory after it is allocated.","breadcrumbs":"Specification (WIP) » Data Layout » Memory » Memory","id":"206","title":"Memory"},"207":{"body":"Sequence type values may exceed the 256-bit stack slot size, so we store them in memory and reference them using pointers kept on the stack. Example: fn f() { let foo: Array = [0; 100] // foo is a pointer that references 100 * 256 bits in memory.\n} To find an element inside of a sequence type, the relative location of the element is added to the given pointer.","breadcrumbs":"Specification (WIP) » Data Layout » Memory » Sequence types in memory » Sequence types in memory","id":"207","title":"Sequence types in memory"},"208":{"body":"You can contribute to Fe!","breadcrumbs":"Contributing » Contributing","id":"208","title":"Contributing"},"209":{"body":"","breadcrumbs":"Contributing » Ways to contribute:","id":"209","title":"Ways to contribute:"},"21":{"body":"Welcome to the Fe user guide! Here you can find information about how to use Fe to develop smart contracts. Read more about: Installing Fe organizing your code using projects We are still building this section of the site, but you can expect to find other materials such as reference documentation, project examples and walkthrough guides here soon!","breadcrumbs":"Using Fe » User guide","id":"21","title":"User guide"},"210":{"body":"If you find problems with Fe you can report them to the development team on the project Github . You are also welcome to work on existing issues, especially any tagged good first issue on the project issue board.","breadcrumbs":"Contributing » 1. Reporting or fixing issues.","id":"210","title":"1. Reporting or fixing issues."},"211":{"body":"We always appreciate improvements to the project documentation. This could be fixing any bugs you find, adding some detail to a description or explanation or developing a new user guide. To add to the docs you can fork the Fe Github repository and make updates in the /docs directory. You can build and serve locally using mdbook build && mdbook serve. Then, when you are happy with your changes you can raise a pull request to the main repository.","breadcrumbs":"Contributing » 2. Improving the docs.","id":"211","title":"2. Improving the docs."},"212":{"body":"You are also welcome to work on Fe itself. There are many opportunities to help build the language, for example working on the compiler or the language specification, adding tests or developing tooling. It is a good idea to connect with the existing Fe community to find out what are the priority areas that need attention and to discuss your idea in context before putting time into it. You can find Fe developers on the Discord or you can use the Github issue board . Please note that there has been a substantial amount of work done on the fe-v2 branch of the repository that includes breaking changes. When merged fe-v2 will revert new contributions based on master. To make your work v2 ready you can build off the fe-v2 branch. It is recommended to seek out issues tagged v2 in the Github Issue board.","breadcrumbs":"Contributing » 3. Developing Fe","id":"212","title":"3. Developing Fe"},"213":{"body":"We appreciate help answering questions on the Discord and other platforms such as Stack Exchange or Twitter. Please note that this project has a Code of Conduct . By participating in this project — in the issues, pull requests, or Discord channel — you agree to abide by its terms.","breadcrumbs":"Contributing » 4. Community engagement","id":"213","title":"4. Community engagement"},"214":{"body":"","breadcrumbs":"Contributing » Processes","id":"214","title":"Processes"},"215":{"body":"To report an issue, please use the Github issue board . When reporting issues, please mention the following details: Fe version. your operating system. the steps required to reproduce the issue actual vs expected behaviour any error messages or relevant logs the specific source code where the issue originates The appropriate place for technical discussions about the language itself is the Fe Discord .","breadcrumbs":"Contributing » Reporting issues","id":"215","title":"Reporting issues"},"216":{"body":"Please fork the Fe repository and raise pull requests against the master branch. Your commit messages should be concise and explain the changes made. Your pull request description should explain why the changes were made and list the specific changes. If you have to pull in changes from master to your fork (e.g. to resolve merge conflicts), please use git rebase rather than git merge. New features should be accompanied by appropriate tests. Finally, please make sure you respect the coding style for this project. Thank you for contributing to Fe!","breadcrumbs":"Contributing » Rasing Pull Requests","id":"216","title":"Rasing Pull Requests"},"217":{"body":"🖥️ Download Binaries 📄 Draft Spec ℹ️ Getting Started Fe is moving fast. Read up on all the latest improvements.","breadcrumbs":"Release Notes » Release Notes","id":"217","title":"Release Notes"},"218":{"body":"","breadcrumbs":"Release Notes » 0.26.0 \"Zircon\" (2023-11-03)","id":"218","title":"0.26.0 \"Zircon\" (2023-11-03)"},"219":{"body":"Give option to produce runtime bytecode as compilation artifact Previously, the compiler could only produce the bytecode that is used for the deployment of the contract. Now it can also produce the runtime bytecode which is the bytecode that is saved to storage. Being able to obtain the runtime bytecode is useful for contract verification. To obtain the runtime bytecode use the runtime-bytecode option of the --emit flag (multiple options allowed). Example Output: mycontract.bin (bytecode for deployment) mycontract.runtime.bin (runtime bytecode) ( #947 ) New verify command to verify onchain contracts against local source code. People need to be able to verify that a deployed contract matches the source code that the author claims was used to deploy it. Previously, there was no simple way to achieve this. These are the steps to verify a contract with the verify command: Obtain the project's source code locally. Ensure it is the same source code that was used to deploy the contract. (e.g. check out a specific tag) From the project directory run fe verify Example: $ fe verify 0xf0adbb9ed4135d1509ad039505bada942d18755f https://example-eth-mainnet-rpc.com\nIt's a match!✨ Onchain contract:\nAddress: 0xf0adbb9ed4135d1509ad039505bada942d18755f\nBytecode: 0x60008..76b90 Local contract:\nContract name: SimpleDAO\nSource file: /home/work/ef/simple_dao/fe_contracts/simpledao/src/main.fe\nBytecode: 0x60008..76b90 Hint: Run with --verbose to see the contract's source code. ( #948 )","breadcrumbs":"Release Notes » Features","id":"219","title":"Features"},"22":{"body":"At this point Fe is available for Linux and MacOS natively but can also be installed on Windows via WSL . Note: If you happen to be a Windows developer, consider getting involved and help us to support the Windows platform natively. Here would be a good place to start. On a computer with MacOS and an ARM chip, you need to install Rosetta, Apple's x86-to-ARM translator, to be able to run the executable. /usr/sbin/softwareupdate --install-rosetta --agree-to-license","breadcrumbs":"Using Fe » Installation » Installation","id":"22","title":"Installation"},"220":{"body":"Added a new page on EVM precompiles ( #944 )","breadcrumbs":"Release Notes » Improved Documentation","id":"220","title":"Improved Documentation"},"221":{"body":"","breadcrumbs":"Release Notes » 0.25.0 \"Yoshiokaite\" (2023-10-26)","id":"221","title":"0.25.0 \"Yoshiokaite\" (2023-10-26)"},"222":{"body":"Use the project root as default path for fe test Just run fe test from any directory of the project. ( #913 ) Completed std::buf::MemoryBuffer refactor. ( #917 ) Allow filtering tests to run via fe test --filter (self, mut _ val: T) -> u256 { return val.compute(val: 1000) }\n} contract Example { pub fn run_test(self) { let runner: Runner = Runner(); let mut mac: Mac = Mac(); assert runner.run(mac) == 1001 }\n} ( #865 ) The ctx parameter can now be passed into test functions. example: #test\nfn my_test(ctx: Context) { assert ctx.block_number() == 0\n} ( #880 ) The following has been added to the standard library: Memory buffer abstraction example: use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}\nuse std::traits::Max #test\nfn test_buf_rw() { let mut buf: MemoryBuffer = MemoryBuffer::new(len: 161) let mut writer: MemoryBufferWriter = buf.writer() let mut reader: MemoryBufferReader = buf.reader() writer.write(value: 42) writer.write(value: 42) writer.write(value: 26) writer.write(value: u8(26)) writer.write(value: u256::max()) writer.write(value: u128::max()) writer.write(value: u64::max()) writer.write(value: u32::max()) writer.write(value: u16::max()) writer.write(value: u8::max()) writer.write(value: u8(0)) assert reader.read_u256() == 42 assert reader.read_u256() == 42 assert reader.read_u256() == 26 assert reader.read_u8() == 26 assert reader.read_u256() == u256::max() assert reader.read_u128() == u128::max() assert reader.read_u64() == u64::max() assert reader.read_u32() == u32::max() assert reader.read_u16() == u16::max() assert reader.read_u8() == u8::max() assert reader.read_u8() == 0\n} Precompiles example: use std::precompiles\nuse std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter} #test\nfn test_ec_recover() { let result: address = precompiles::ec_recover( hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3, v: 28, r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608, s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada ) assert result == address(0x7156526fbd7a3c72969b54f64e42c10fbb768c8a)\n} ctx.raw_call() example: use std::buf::{ RawCallBuffer, MemoryBufferReader, MemoryBufferWriter\n}\nuse std::evm contract Foo { pub unsafe fn __call__() { if evm::call_data_load(offset: 0) == 42 { evm::mstore(offset: 0, value: 26) evm::return_mem(offset: 0, len: 32) } else if evm::call_data_load(offset: 0) == 26 { revert } }\n} #test\nfn test_raw_call(mut ctx: Context) { let foo: Foo = Foo.create(ctx, 0) let mut buf: RawCallBuffer = RawCallBuffer::new( input_len: 32, output_len: 32 ) let mut writer: MemoryBufferWriter = buf.writer() writer.write(value: 42) assert ctx.raw_call(addr: address(foo), value: 0, buf) let mut reader: MemoryBufferReader = buf.reader() assert reader.read_u256() == 26 assert not ctx.raw_call(addr: address(foo), value: 0, buf)\n} ( #885 )","breadcrumbs":"Release Notes » Features","id":"230","title":"Features"},"231":{"body":"Fixed an ICE when using aggregate types with aggregate type fields in public functions This code would previously cause an ICE: struct Tx { pub data: Array\n} contract Foo { pub fn bar(mut tx: Tx) {}\n} ( #867 ) Fixed a regression where the compiler would not reject a method call on a struct in storage. E.g. the follwing code should be rejected as it is missing a to_mem() call: struct Bar { pub x: u256 pub fn get_x(self) -> u256{ return self.x }\n} contract Foo { bar: Bar pub fn __init__(mut self) { self.bar = Bar( x: 2 ) } fn yay(self) { self.bar.get_x() }\n} The compiler will now reject the code and suggest a to_mem() before callingget_x(). ( #881 )","breadcrumbs":"Release Notes » Bugfixes","id":"231","title":"Bugfixes"},"232":{"body":"This is the first non-alpha release of Fe. Read our announcement for more details.","breadcrumbs":"Release Notes » 0.22.0 \"Vulcanite\" (2023-04-05)","id":"232","title":"0.22.0 \"Vulcanite\" (2023-04-05)"},"233":{"body":"Support for tests. example: #test\nfn my_test() { assert 26 + 16 == 42\n} Tests can be executed using the test subcommand. example: $ fe test foo.fe ( #807 ) Fixed broken trait orphan rule Fe has an orphan rule for Traits similar to Rust's that requires that either the trait or the type that we are implementing the trait for are located in the same ingot as the impl. This rule was implemented incorrectly so that instead of requiring them to be in the same ingot, they were required to be in the same module. This change fixes this so that the orphan rule is enforced correctly. ( #863 ) address values can now be specified with a number literal, with no explicit cast. So instead of let t: address = address(0xfe), one can now write let t: address = 0xfe. This also means that it's possible to define const addresses: const SOME_KNOWN_CONTRACT: address = 0xfefefefe ( #864 )","breadcrumbs":"Release Notes » Features","id":"233","title":"Features"},"234":{"body":"Fixed resolving of generic arguments to associated functions. For example, this code would previously crash the compiler: ... // This function doesn't take self pub fn run_static(_ val: T) -> u256 { return val.compute(val: 1000) }\n... // Invoking it would previously crash the compiler\nRunner::run_static(Mac())\n... ( #861 )","breadcrumbs":"Release Notes » Bugfixes","id":"234","title":"Bugfixes"},"235":{"body":"Changed the Deployment tutorial to use foundry and the Sepolia network ( #853 )","breadcrumbs":"Release Notes » Improved Documentation","id":"235","title":"Improved Documentation"},"236":{"body":"","breadcrumbs":"Release Notes » 0.21.0-alpha (2023-02-28)","id":"236","title":"0.21.0-alpha (2023-02-28)"},"237":{"body":"Support for Self type With this change Self (with capital S) can be used to refer to the enclosing type in contracts, structs, impls and traits. E.g. trait Min { fn min() -> Self;\n} impl Min for u8 { fn min() -> u8 { // Both `u8` or `Self` are valid here return 0 }\n} Usage: u8::min() ( #803 ) Added Min and Max traits to the std library. The std library implements the traits for all numeric types. Example use std::traits::{Min, Max}\n... assert u8::min() < u8::max()\n``` ([#836](https://github.com/ethereum/fe/issues/836)) Upgraded underlying solc compiler to version 0.8.18","breadcrumbs":"Release Notes » Features","id":"237","title":"Features"},"238":{"body":"the release contains minor bugfixes","breadcrumbs":"Release Notes » Bugfixes","id":"238","title":"Bugfixes"},"239":{"body":"","breadcrumbs":"Release Notes » 0.20.0-alpha (2022-12-05)","id":"239","title":"0.20.0-alpha (2022-12-05)"},"24":{"body":"Fe is distributed via a single executable file linked from the home page . In the future we will make sure it can be installed through a variety of popular package managers such as apt. Depending on your operating system, the file that you download is either named fe_amd64 or fe_mac. Note: We will rename the file to fe and assume that name for the rest of the guide. In the future when Fe can be installed via other mechanisms we can assume fe to become the canonical command name.","breadcrumbs":"Using Fe » Installation » Download the compiler","id":"24","title":"Download the compiler"},"240":{"body":"Removed the event type as well as the emit keyword. Instead the struct type now automatically implements the Emittable trait and can be emitted via ctx.emit(..). Indexed fields can be annotated via the #indexed attribute. E.g. struct Signed { book_msg: String<100>\n} contract GuestBook { messages: Map> pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg ctx.emit(Signed(book_msg)) }\n} ( #717 ) Allow to call trait methods on types when trait is in scope So far traits were only useful as bounds for generic functions. With this change traits can also be used as illustrated with the following example: trait Double { fn double(self) -> u256;\n} impl Double for (u256, u256) { fn double(self) -> u256 { return (self.item0 + self.item1) * 2 }\n} contract Example { pub fn run_test(self) { assert (0, 1).double() == 2 }\n} If a call turns out to be ambigious the compiler currently asks the user to disambiguate via renaming. In the future we will likely introduce a syntax to allow to disambiguate at the callsite. ( #757 ) Allow contract associated functions to be called via ContractName::function_name() syntax. ( #767 ) Add enum types and match statement. enum can now be defined, e.g., pub enum MyEnum { Unit Tuple(u32, u256, bool) fn unit() -> MyEnum { return MyEnum::Unit }\n} Also, match statement is introduced, e.g., pub fn eval_enum() -> u256{ match MyEnum { MyEnum::Unit => { return 0 } MyEnum::Tuple(a, _, false) => { return u256(a) } MyEnum::Tuple(.., true) => { return u256(1) } }\n} For now, available patterns are restricted to Wildcard(_), which matches all patterns: _ Named variable, which matches all patterns and binds the value to make the value usable in the arm. e.g., a, b and c in MyEnum::Tuple(a, b, c) Boolean literal(true and false) Enum variant. e.g., MyEnum::Tuple(a, b, c) Tuple pattern. e.g., (a, b, c) Struct pattern. e.g., MyStruct {x: x1, y: y1, b: true} Rest pattern(..), which matches the rest of the pattern. e.g., MyEnum::Tuple(.., true) Or pattern(|). e.g., MyEnum::Unit | MyEnum::Tuple(.., true) Fe compiler performs the exhaustiveness and usefulness checks for match statement. So the compiler will emit an error when all patterns are not covered or an unreachable arm are detected. ( #770 ) Changed comments to use // instead of # ( #776 ) Added the mut keyword, to mark things as mutable. Any variable or function parameter not marked mut is now immutable. contract Counter { count: u256 pub fn increment(mut self) -> u256 { // `self` is mutable, so storage can be modified self.count += 1 return self.count }\n} struct Point { pub x: u32 pub y: u32 pub fn add(mut self, _ other: Point) { self.x += other.x self.y += other.y // other.x = 1000 // ERROR: `other` is not mutable }\n} fn pointless() { let origin: Point = Point(x: 0, y: 0) // origin.x = 10 // ERROR: origin is not mutable let x: u32 = 10 // x_coord = 100 // ERROR: `x_coord` is not mutable let mut y: u32 = 0 y = 10 // OK let mut p: Point = origin // copies `origin` p.x = 10 // OK, doesn't modify `origin` let mut q: Point = p // copies `p` q.x = 100 // doesn't modify `p` p.add(q) assert p.x == 110\n} Note that, in this release, primitive type function parameters can't be mut. This restriction might be lifted in a future release. For example: fn increment(mut x: u256) { // ERROR: primitive type parameters can't be mut x += 1\n} ( #777 ) The contents of the std::prelude module (currently just the Context struct) are now automatically used by every module, so use std::context::Context is no longer required. ( #779 ) When the Fe compiler generates a JSON ABI file for a contract, the \"stateMutability\" field for each function now reflects whether the function can read or modify chain or contract state, based on the presence or absence of the self and ctx parameters, and whether those parameters are mutable. If a function doesn't take self or ctx, it's \"pure\". If a function takes self or ctx immutably, it can read state but not mutate state, so it's a \"view\" If a function takes mut self or mut ctx, it can mutate state, and is thus marked \"payable\". Note that we're following the convention set by Solidity for this field, which isn't a perfect fit for Fe. The primary issue is that Fe doesn't currently distinguish between \"payable\" and \"nonpayable\" functions; if you want a function to revert when Eth is sent, you need to do it manually (eg assert ctx.msg_value() == 0). ( #783 ) Trait associated functions This change allows trait functions that do not take a self parameter. The following demonstrates a possible trait associated function and its usage: trait Max { fn max(self) -> u8;\n} impl Max for u8 { fn max() -> u8 { return u8(255) }\n} contract Example { pub fn run_test(self) { assert u8::max() == 255 }\n} ( #805 )","breadcrumbs":"Release Notes » Features","id":"240","title":"Features"},"241":{"body":"Fix issue where calls to assiciated functions did not enforce visibility rules. E.g the following code should be rejected but previously wasn't: struct Foo { fn do_private_things() { }\n} contract Bar { fn test() { Foo::do_private_things() }\n} With this change, the above code is now rejected because do_private_things is not pub. ( #767 ) Padding on bytes and string ABI types is zeroed out. ( #769 ) Ensure traits from other modules or even ingots can be implemented ( #773 ) Certain cases where the compiler would not reject pure functions being called on instances are now properly rejected. ( #775 ) Reject calling to_mem() on primitive types in storage ( #801 ) Disallow importing private type via use The following was previously allowed but will now error: use foo::PrivateStruct ( #815 )","breadcrumbs":"Release Notes » Bugfixes","id":"241","title":"Bugfixes"},"242":{"body":"","breadcrumbs":"Release Notes » 0.19.1-alpha \"Sunstone\" (2022-07-06)","id":"242","title":"0.19.1-alpha \"Sunstone\" (2022-07-06)"},"243":{"body":"Support returning nested struct. Example: pub struct InnerStruct { pub inner_s: String<10> pub inner_x: i256\n} pub struct NestedStruct { pub inner: InnerStruct pub outer_x: i256\n} contract Foo { pub fn return_nested_struct() -> NestedStruct { ... }\n} ( #635 ) Made some small changes to how the Context object is used. ctx is not required when casting an address to a contract type. Eg let foo: Foo = Foo(address(0)) ctx is required when calling an external contract function that requires ctx Example: use std::context::Context // see issue #679 contract Foo { pub fn emit_stuff(ctx: Context) { emit Stuff(ctx) # will be `ctx.emit(Stuff{})` someday }\n}\ncontract Bar { pub fn call_foo_emit_stuff(ctx: Context) { Foo(address(0)).emit_stuff(ctx) }\n}\nevent Stuff {} ( #703 ) Braces! Fe has abandoned python-style significant whitespace in favor of the trusty curly brace. In addition, elif is now spelled else if, and the pass statement no longer exists. Example: pub struct SomeError {} contract Foo { x: u8 y: u16 pub fn f(a: u8) -> u8 { if a > 10 { let x: u8 = 5 return a + x } else if a == 0 { revert SomeError() } else { return a * 10 } } pub fn noop() {}\n} ( #707 ) traits and generic function parameter Traits can now be defined, e.g: trait Computable { fn compute(self, val: u256) -> u256;\n} The mechanism to implement a trait is via an impl block e.g: struct Linux { pub counter: u256 pub fn get_counter(self) -> u256 { return self.counter } pub fn something_static() -> u256 { return 5 }\n} impl Computable for Linux { fn compute(self, val: u256) -> u256 { return val + Linux::something_static() + self.get_counter() }\n} Traits can only appear as bounds for generic functions e.g.: struct Runner { pub fn run(self, _ val: T) -> u256 { return val.compute(val: 1000) }\n} Only struct functions (not contract functions) can have generic parameters. The run method of Runner can be called with any type that implements Computable e.g. contract Example { pub fn generic_compute(self) { let runner: Runner = Runner(); assert runner.run(Mac()) == 1001 assert runner.run(Linux(counter: 10)) == 1015 }\n} ( #710 ) Generate artifacts for all contracts of an ingot, not just for contracts that are defined in main.fe ( #726 ) Allow using complex type as array element type. Example: contract Foo { pub fn bar() -> i256 { let my_array: Array = [Pair::new(1, 0), Pair::new(2, 0), Pair::new(3, 0)] let sum: i256 = 0 for pair in my_array { sum += pair.x } return sum }\n} struct Pair { pub x: i256 pub y: i256 pub fn new(_ x: i256, _ y: i256) -> Pair { return Pair(x, y) }\n} ( #730 ) The fe CLI now has subcommands: fe new myproject - creates a new project structure fe check . - analyzes fe source code and prints errors fe build . - builds a fe project ( #732 ) Support passing nested struct types to public functions. Example: pub struct InnerStruct { pub inner_s: String<10> pub inner_x: i256\n} pub struct NestedStruct { pub inner: InnerStruct pub outer_x: i256\n} contract Foo { pub fn f(arg: NestedStruct) { ... }\n} ( #733 ) Added support for repeat expressions ([VALUE; LENGTH]). e.g. let my_array: Array = [bool; 42] Also added checks to ensure array and struct types are initialized. These checks are currently performed at the declaration site, but will be loosened in the future. ( #747 )","breadcrumbs":"Release Notes » Features","id":"243","title":"Features"},"244":{"body":"Fix a bug that incorrect instruction is selected when the operands of a comp instruction are a signed type. ( #734 ) Fix issue where a negative constant leads to an ICE E.g. the following code would previously crash the compiler but shouldn't: const INIT_VAL: i8 = -1\ncontract Foo { pub fn init_bar() { let x: i8 = INIT_VAL }\n} ( #745 ) Fix a bug that causes ICE when nested if-statement has multiple exit point. E.g. the following code would previously crash the compiler but shouldn't: pub fn foo(self) { if true { if self.something { return } } if true { if self.something { return } }\n} ( #749 )","breadcrumbs":"Release Notes » Bugfixes","id":"244","title":"Bugfixes"},"245":{"body":"","breadcrumbs":"Release Notes » 0.18.0-alpha \"Ruby\" (2022-05-27)","id":"245","title":"0.18.0-alpha \"Ruby\" (2022-05-27)"},"246":{"body":"Added support for parsing of attribute calls with generic arguments (e.g. foo.bar()). ( #719 )","breadcrumbs":"Release Notes » Features","id":"246","title":"Features"},"247":{"body":"Fix a regression where the stateMutability field would not be included in the generated ABI ( #722 ) Fix two regressions introduced in 0.17.0 Properly lower right shift operation to yul's sar if operand is signed type Properly lower negate operation to call safe_sub ( #723 )","breadcrumbs":"Release Notes » Bugfixes","id":"247","title":"Bugfixes"},"248":{"body":"","breadcrumbs":"Release Notes » 0.17.0-alpha \"Quartz\" (2022-05-26)","id":"248","title":"0.17.0-alpha \"Quartz\" (2022-05-26)"},"249":{"body":"Support for underscores in numbers to improve readability e.g. 100_000. Example let num: u256 = 1000_000_000_000 ( #149 ) Optimized access of struct fields in storage ( #249 ) Unit type () is now ABI encodable ( #442 ) Temporary default stateMutability to payable in ABI The ABI metadata that the compiler previously generated did not include the stateMutability field. This piece of information is important for tooling such as hardhat because it determines whether a function needs to be called with or without sending a transaction. As soon as we have support for mut self and mut ctx we will be able to derive that information from the function signature. In the meantime we now default to payable. ( #705 )","breadcrumbs":"Release Notes » Features","id":"249","title":"Features"},"25":{"body":"In order to be able to execute the Fe compiler we will have to make the file executable . This can be done by navigating to the directory where the file is located and executing chmod + x (e.g. chmod +x fe). After we have set the proper permissions we should be able to run ./fe and an output that should be roughly comparable to: fe 0.21.0-alpha\nThe Fe Developers \nAn implementation of the Fe smart contract language USAGE: fe_amd64_latest OPTIONS: -h, --help Print help information -V, --version Print version information SUBCOMMANDS: build Build the current project check Analyze the current project and report errors, but don't build artifacts help Print this message or the help of the given subcommand(s) new Create new fe project","breadcrumbs":"Using Fe » Installation » Add permission to execute","id":"25","title":"Add permission to execute"},"250":{"body":"Fixed a crash caused by certain memory to memory assignments. E.g. the following code would previously lead to a compiler crash: my_struct.x = my_struct.y ( #590 ) Reject unary minus operation if the target type is an unsigned integer number. Code below should be reject by fe compiler: contract Foo: pub fn bar(self) -> u32: let unsigned: u32 = 1 return -unsigned pub fn foo(): let a: i32 = 1 let b: u32 = -a ( #651 ) Fixed crash when passing a struct that contains an array E.g. the following would previously result in a compiler crash: struct MyArray: pub x: Array contract Foo: pub fn bar(my_arr: MyArray): pass ( #681 ) reject infinite size struct definitions. Fe structs having infinite size due to recursive definitions were not rejected earlier and would cause ICE in the analyzer since they were not properly handled. Now structs having infinite size are properly identified by detecting cycles in the dependency graph of the struct field definitions and an error is thrown by the analyzer. ( #682 ) Return instead of revert when contract is called without data. If a contract is called without data so that no function is invoked, we would previously revert but that would leave us without a way to send ETH to a contract so instead it will cause a return now. ( #694 ) Resolve compiler crash when using certain reserved YUL words as struct field names. E.g. the following would previously lead to a compiler crash because numer is a reserved keyword in YUL. struct Foo: pub number: u256 contract Meh: pub fn yay() -> Foo: return Foo(number:2) ( #709 )","breadcrumbs":"Release Notes » Bugfixes","id":"250","title":"Bugfixes"},"251":{"body":"","breadcrumbs":"Release Notes » 0.16.0-alpha (2022-05-05)","id":"251","title":"0.16.0-alpha (2022-05-05)"},"252":{"body":"Change static function call syntax from Bar.foo() to Bar::foo() ( #241 ) Added support for retrieving the base fee via ctx.base_fee() ( #503 )","breadcrumbs":"Release Notes » Features","id":"252","title":"Features"},"253":{"body":"Resolve functions on structs via path (e.g. bi::ba::bums()) ( #241 )","breadcrumbs":"Release Notes » Bugfixes","id":"253","title":"Bugfixes"},"254":{"body":"","breadcrumbs":"Release Notes » 0.15.0-alpha (2022-04-04)","id":"254","title":"0.15.0-alpha (2022-04-04)"},"255":{"body":"Labels are now required on function arguments. Labels can be omitted if the argument is a variable with a name that matches the label, or if the function definition specifies that an argument should have no label. Functions often take several arguments of the same type; compiler-checked labels can help prevent accidentally providing arguments in the wrong order. Example: contract CoolCoin: balance: Map loans: Map<(address, address), i256> pub fn demo(self, ann: address, bob: address): let is_loan: bool = false self.give(from: ann, to: bob, 100, is_loan) fn transfer(self, from sender: address, to recipient: address, _ val: u256, is_loan: bool): self.cred[sender] -= val self.cred[recipient] += val if is_loan: self.loans[(sender, recipient)] += val Note that arguments must be provided in the order specified in the function definition. A parameter's label defaults to the parameter name, but can be changed by specifying a different label to the left of the parameter name. Labels should be clear and convenient for the caller, while parameter names are only used in the function body, and can thus be longer and more descriptive. In the example above, we choose to use sender and recipient as identifiers in the body of fn transfer, but use labels from: and to:. In cases where it's ideal to not have labels, e.g. if a function takes a single argument, or if types are sufficient to differentiate between arguments, use _ to specify that a given parameter has no label. It's also fine to require labels for some arguments, but not others. Example: fn add(_ x: u256, _ y: u256) -> u256: return x + y contract Foo: fn transfer(self, _ to: address, wei: u256): pass pub fn demo(self): transfer(address(0), wei: add(1000, 42)) ( #397 )","breadcrumbs":"Release Notes » Features","id":"255","title":"Features"},"256":{"body":"The region of memory used to compute the slot of a storage map value was not being allocated. ( #684 )","breadcrumbs":"Release Notes » Bugfixes","id":"256","title":"Bugfixes"},"257":{"body":"","breadcrumbs":"Release Notes » 0.14.0-alpha (2022-03-02)","id":"257","title":"0.14.0-alpha (2022-03-02)"},"258":{"body":"Events can now be defined outside of contracts. Example: event Transfer: idx sender: address idx receiver: address value: u256 contract Foo: fn transferFoo(to: address, value: u256): emit Transfer(sender: msg.sender, receiver: to, value) contract Bar: fn transferBar(to: address, value: u256): emit Transfer(sender: msg.sender, receiver: to, value) ( #80 ) The Fe standard library now includes a std::evm module, which provides functions that perform low-level evm operations. Many of these are marked unsafe, and thus can only be used inside of an unsafe function or an unsafe block. Example: use std::evm::{mstore, mload} fn memory_shenanigans(): unsafe: mstore(0x20, 42) let x: u256 = mload(0x20) assert x == 42 The global functions balance and balance_of have been removed; these can now be called as std::evm::balance(), etc. The global function send_value has been ported to Fe, and is now available as std::send_value. ( #629 ) Support structs that have non-base type fields in storage. Example: struct Point: pub x: u256 pub y: u256 struct Bar: pub name: String<3> pub numbers: Array pub point: Point pub something: (u256, bool) contract Foo: my_bar: Bar pub fn complex_struct_in_storage(self) -> String<3>: self.my_bar = Bar( name: \"foo\", numbers: [1, 2], point: Point(x: 100, y: 200), something: (1, true), ) # Asserting the values as they were set initially assert self.my_bar.numbers[0] == 1 assert self.my_bar.numbers[1] == 2 assert self.my_bar.point.x == 100 assert self.my_bar.point.y == 200 assert self.my_bar.something.item0 == 1 assert self.my_bar.something.item1 # We can change the values of the array self.my_bar.numbers[0] = 10 self.my_bar.numbers[1] = 20 assert self.my_bar.numbers[0] == 10 assert self.my_bar.numbers[1] == 20 # We can set the array itself self.my_bar.numbers = [1, 2] assert self.my_bar.numbers[0] == 1 assert self.my_bar.numbers[1] == 2 # We can change the values of the Point self.my_bar.point.x = 1000 self.my_bar.point.y = 2000 assert self.my_bar.point.x == 1000 assert self.my_bar.point.y == 2000 # We can set the point itself self.my_bar.point = Point(x=100, y=200) assert self.my_bar.point.x == 100 assert self.my_bar.point.y == 200 # We can change the value of the tuple self.my_bar.something.item0 = 10 self.my_bar.something.item1 = false assert self.my_bar.something.item0 == 10 assert not self.my_bar.something.item1 # We can set the tuple itself self.my_bar.something = (1, true) assert self.my_bar.something.item0 == 1 assert self.my_bar.something.item1 return self.my_bar.name.to_mem() ( #636 ) Features that read and modify state outside of contracts are now implemented on a struct named \"Context\". Context is included in the standard library and can be imported with use std::context::Context. Instances of Context are created by calls to public functions that declare it in the signature or by unsafe code. Basic example: use std::context::Context contract Foo: my_num: u256 pub fn baz(ctx: Context) -> u256: return ctx.block_number() pub fn bing(self, new_num: u256) -> u256: self.my_num = new_num return self.my_num contract Bar: pub fn call_baz(ctx: Context, foo_addr: address) -> u256: # future syntax: `let foo = ctx.load(foo_addr)` let foo: Foo = Foo(ctx, foo_addr) return foo.baz() pub fn call_bing(ctx: Context) -> u256: # future syntax: `let foo = ctx.create(0)` let foo: Foo = Foo.create(ctx, 0) return foo.bing(42) Example with __call__ and unsafe block: use std::context::Context\nuse std::evm contract Foo: pub fn __call__(): unsafe: # creating an instance of `Context` is unsafe let ctx: Context = Context() let value: u256 = u256(bar(ctx)) # return `value` evm::mstore(0, value) evm::return_mem(0, 32) fn bar(ctx: Context) -> address: return ctx.self_address() ( #638 )","breadcrumbs":"Release Notes » Features","id":"258","title":"Features"},"259":{"body":"","breadcrumbs":"Release Notes » Features","id":"259","title":"Features"},"26":{"body":"You can also build Fe from the source code provided in our Github repository . To do this you will need to have Rust installed. Then, clone the github repository using: git clone https://github.com/ethereum/fe.git Depending on your environment you may need to install some additional packages before building the Fe binary, specifically libboost-all-dev, libclang and cmake. For example, on a Linux system: sudo apt-get update &&\\ apt-get install libboost-all-dev &&\\ apt-get install libclang-dev &&\\ apt-get install cmake Navigate to the folder containing the Fe source code. cd fe Now, use Rust to build the Fe binary. To run Fe, you need to build using solc-backend. cargo build -r --feature solc-backend You will now find your Fe binary in /target/release. Check the build with: ./target/release/fe --version If everything worked, you should see the Fe version printed to the terminal: fe 0.24.0 You can run the built-in tests using: cargo test --workspace --features solc-backend","breadcrumbs":"Using Fe » Installation » Building from source","id":"26","title":"Building from source"},"260":{"body":"Example: contract Foo: pub fn bar(): const LOCAL_CONST: i32 = 1","breadcrumbs":"Release Notes » Support local constant","id":"260","title":"Support local constant"},"261":{"body":"Example: const GLOBAL: i32 = 8 contract Foo: pub fn bar(): const LOCAL: i32 = GLOBAL * 8","breadcrumbs":"Release Notes » Support constant expression","id":"261","title":"Support constant expression"},"262":{"body":"Example: const GLOBAL: u256= 8\nconst USE_GLOBAL: bool = false\ntype MY_ARRAY = Array contract Foo: pub fn bar(): let my_array: Array","breadcrumbs":"Release Notes » Support constant generics expression","id":"262","title":"Support constant generics expression"},"263":{"body":"","breadcrumbs":"Release Notes » Bug fixes","id":"263","title":"Bug fixes"},"264":{"body":"Example: const GLOBAL: i32 = \"FOO\" contract Foo: pub fn bar(): let FOO: i32 = GLOBAL","breadcrumbs":"Release Notes » Fix ICE when constant type is mismatch","id":"264","title":"Fix ICE when constant type is mismatch"},"265":{"body":"Example: const BAR: i32 = 1 contract FOO: pub fn bar(): BAR = 10 ( #649 ) Argument label syntax now uses : instead of =. Example: struct Foo: x: u256 y: u256 let x: MyStruct = MyStruct(x: 10, y: 11)\n# previously: MyStruct(x = 10, y = 11) ( #665 ) Support module-level pub modifier, now default visibility of items in a module is private. Example: # This constant can be used outside of the module.\npub const PUBLIC:i32 = 1 # This constant can NOT be used outside of the module.\nconst PRIVATE: i32 = 1 ( #677 )","breadcrumbs":"Release Notes » Fix ICE when assigning value to constant twice","id":"265","title":"Fix ICE when assigning value to constant twice"},"266":{"body":"Source files are now managed by a (salsa) SourceDb. A SourceFileId now corresponds to a salsa-interned File with a path. File content is a salsa input function. This is mostly so that the future (LSP) language server can update file content when the user types or saves, which will trigger a re-analysis of anything that changed. An ingot's set of modules and dependencies are also salsa inputs, so that when the user adds/removes a file or dependency, analysis is rerun. Standalone modules (eg a module compiled with fe fee.fe) now have a fake ingot parent. Each Ingot has an IngotMode (Lib, Main, StandaloneModule), which is used to disallow ingot::whatever paths in standalone modules, and to determine the correct root module file. parse_module now always returns an ast::Module, and thus a ModuleId will always exist for a source file, even if it contains fatal parse errors. If the parsing fails, the body will end with a ModuleStmt::ParseError node. The parsing will stop at all but the simplest of syntax errors, but this at least allows partial analysis of source file with bad syntax. ModuleId::ast(db) is now a query that parses the module's file on demand, rather than the AST being interned into salsa. This makes handling parse diagnostics cleaner, and removes the up-front parsing of every module at ingot creation time. ( #628 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"266","title":"Internal Changes - for Fe Contributors"},"267":{"body":"","breadcrumbs":"Release Notes » 0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)","id":"267","title":"0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)"},"268":{"body":"Support private fields on structs Public fields now need to be declared with the pub modifier, otherwise they default to private fields. If a struct contains private fields it can not be constructed directly except from within the struct itself. The recommended way is to implement a method new(...) as demonstrated in the following example. struct House: pub price: u256 pub size: u256 vacant: bool pub fn new(price: u256, size: u256) -> House return House(price=price, size=size, vacant=true) contract Manager: house: House pub fn create_house(price: u256, size: u256): self.house = House::new(price, size) let can_access_price: u256 = self.house.price # can not access `self.house.vacant` because the field is private ( #214 ) Support non-base type fields in structs Support is currently limited in two ways: Structs with complex fields can not be returned from public functions Structs with complex fields can not be stored in storage ( #343 ) Addresses can now be explicitly cast to u256. For example: fn f(addr: address) -> u256: return u256(addr) ( #621 ) A special function named __call__ can now be defined in contracts. The body of this function will execute in place of the standard dispatcher when the contract is called. example (with intrinsics): contract Foo: pub fn __call__(self): unsafe: if __calldataload(0) == 1: __revert(0, 0) else: __return(0, 0) ( #622 )","breadcrumbs":"Release Notes » Features","id":"268","title":"Features"},"269":{"body":"Fixed a crash that happend when using a certain unprintable ASCII char ( #551 ) The argument to revert wasn't being lowered by the compiler, meaning that some revert calls would cause a compiler panic in later stages. For example: const BAD_MOJO: u256 = 0xdeaddead struct Error: code: u256 fn fail(): revert Error(code = BAD_MOJO) ( #619 ) Fixed a regression where an empty list expression ([]) would lead to a compiler crash. ( #623 ) Fixed a bug where int array elements were not sign extended in their ABI encodings. ( #633 )","breadcrumbs":"Release Notes » Bugfixes","id":"269","title":"Bugfixes"},"27":{"body":"Fe is a new language and editor support is still in its early days. However, basic syntax highlighting is available for Visual Studio Code via this VS Code extension . In Visual Studio Code open the extension sidebar (Ctrl-Shift-P / Cmd-Shift-P, then \"Install Extension\") and search for fe-lang.code-ve. Click on the extension and then click on the Install button. We are currently working on a Language Server Protocol (LSP), which in the future will enable more advanced editor features such as code completion, go-to definition and refactoring.","breadcrumbs":"Using Fe » Installation » Editor support & Syntax highlighting","id":"27","title":"Editor support & Syntax highlighting"},"270":{"body":"","breadcrumbs":"Release Notes » 0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)","id":"270","title":"0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)"},"271":{"body":"Added unsafe low-level \"intrinsic\" functions, that perform raw evm operations. For example: fn foo(): unsafe: __mtore(0, 5000) assert __mload(0) == 5000 The functions available are exactly those defined in yul's \"evm dialect\": https://docs.soliditylang.org/en/v0.8.11/yul.html#evm-dialect but with a double-underscore prefix. Eg selfdestruct -> __selfdestruct. These are intended to be used for implementing basic standard library functionality, and shouldn't typically be needed in normal contract code. Note: some intrinsic functions don't return a value (eg __log0); using these functions in a context that assumes a return value of unit type (eg let x: () = __log0(a, b)) will currently result in a compiler panic in the yul compilation phase. ( #603 ) Added an out of bounds check for accessing array items. If an array index is retrieved at an index that is not within the bounds of the array it now reverts with Panic(0x32). ( #606 )","breadcrumbs":"Release Notes » Features","id":"271","title":"Features"},"272":{"body":"Ensure ternary expression short circuit. Example: contract Foo: pub fn bar(input: u256) -> u256: return 1 if input > 5 else revert_me() fn revert_me() -> u256: revert return 0 Previous to this change, the code above would always revert no matter which branch of the ternary expressions it would resolve to. That is because both sides were evaluated and then one side was discarded. With this change, only the branch that doesn't get picked won't get evaluated at all. The same is true for the boolean operations and and or. ( #488 )","breadcrumbs":"Release Notes » Bugfixes","id":"272","title":"Bugfixes"},"273":{"body":"Added a globally available dummy std lib. This library contains a single get_42 function, which can be called using std::get_42(). Once low-level intrinsics have been added to the language, we can delete get_42 and start adding useful code. ( #601 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"273","title":"Internal Changes - for Fe Contributors"},"274":{"body":"","breadcrumbs":"Release Notes » 0.11.0-alpha \"Karlite\" (2021-12-02)","id":"274","title":"0.11.0-alpha \"Karlite\" (2021-12-02)"},"275":{"body":"Added support for multi-file inputs. Implementation details: Mostly copied Rust's crate system, but use the term ingot instead of crate. Below is an example of an ingot's file tree, as supported by the current implementation. `-- basic_ingot `-- src |-- bar | `-- baz.fe |-- bing.fe |-- ding | |-- dang.fe | `-- dong.fe `-- main.fe There are still a few features that will be worked on over the coming months: source files accompanying each directory module (e.g. my_mod.fe) configuration files and the ability to create library ingots test directories module-level pub modifier (all items in a module are public) mod statements (all fe files in the input tree are public modules) These things will be implemented in order of importance over the next few months. ( #562 ) The syntax for array types has changed to match other generic types. For example, u8[4] is now written Array. ( #571 ) Functions can now be defined on struct types. Example: struct Point: x: u64 y: u64 # Doesn't take `self`. Callable as `Point.origin()`. # Note that the syntax for this will soon be changed to `Point::origin()`. pub fn origin() -> Point: return Point(x=0, y=0) # Takes `self`. Callable on a value of type `Point`. pub fn translate(self, x: u64, y: u64): self.x += x self.y += y pub fn add(self, other: Point) -> Point: let x: u64 = self.x + other.x let y: u64 = self.y + other.y return Point(x, y) pub fn hash(self) -> u256: return keccak256(self.abi_encode()) pub fn do_pointy_things(): let p1: Point = Point.origin() p1.translate(5, 10) let p2: Point = Point(x=1, y=2) let p3: Point = p1.add(p2) assert p3.x == 6 and p3.y == 12 ( #577 )","breadcrumbs":"Release Notes » Features","id":"275","title":"Features"},"276":{"body":"Fixed a rare compiler crash. Example: let my_array: i256[1] = [-1 << 1] Previous to this fix, the given example would lead to an ICE. ( #550 ) Contracts can now create an instance of a contract defined later in a file. This issue was caused by a weakness in the way we generated yul. ( #596 )","breadcrumbs":"Release Notes » Bugfixes","id":"276","title":"Bugfixes"},"277":{"body":"File IDs are now attached to Spans. ( #587 ) The fe analyzer now builds a dependency graph of source code \"items\" (functions, contracts, structs, etc). This is used in the yulgen phase to determine which items are needed in the yul (intermediate representation) output. Note that the yul output is still cluttered with utility functions that may or may not be needed by a given contract. These utility functions are defined in the yulgen phase and aren't tracked in the dependency graph, so it's not yet possible to filter out the unused functions. We plan to move the definition of many of these utility functions into fe; when this happens they'll become part of the dependency graph and will only be included in the yul output when needed. The dependency graph will also enable future analyzer warnings about unused code. ( #596 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"277","title":"Internal Changes - for Fe Contributors"},"278":{"body":"","breadcrumbs":"Release Notes » 0.10.0-alpha (2021-10-31)","id":"278","title":"0.10.0-alpha (2021-10-31)"},"279":{"body":"Support for module level constants for base types Example: const TEN = 10 contract pub fn do_moon_math(self) -> u256: return 4711 * TEN The values of base type constants are always inlined. ( #192 ) Encode revert errors for ABI decoding as Error(0x103) not Panic(0x99) ( #492 ) Replaced import statements with use statements. Example: use foo::{bar::*, baz as baz26} Note: this only adds support for parsing use statements. ( #547 ) Functions can no be defined outside of contracts. Example: fn add_bonus(x: u256) -> u256: return x + 10 contract PointTracker: points: Map pub fn add_points(self, user: address, val: u256): self.points[user] += add_bonus(val) ( #566 ) Implemented a send_value(to: address, value_in_wei: u256) function. The function is similar to the sendValue function by OpenZeppelin with the differences being that: It reverts with Error(0x100) instead of Error(\"Address: insufficient balance\") to safe more gas. It uses selfbalance() instead of balance(address()) to safe more gas It reverts with Error(0x101) instead of Error(\"Address: unable to send value, recipient may have reverted\") also to safe more gas. ( #567 ) Added support for unsafe functions and unsafe blocks within functions. Note that there's currently no functionality within Fe that requires the use of unsafe, but we plan to add built-in unsafe functions that perform raw evm operations which will only callable within an unsafe block or function. ( #569 ) Added balance() and balance_of(account: address) methods. ( #572 ) Added support for explicit casting between numeric types. Example: let a: i8 = i8(-1)\nlet a1: i16 = i16(a)\nlet a2: u16 = u16(a1) assert a2 == u16(65535) let b: i8 = i8(-1)\nlet b1: u8 = u8(b)\nlet b2: u16 = u16(b1) assert b2 == u16(255) Notice that Fe allows casting between any two numeric types but does not allow to change both the sign and the size of the type in one step as that would leave room for ambiguity as the example above demonstrates. ( #576 )","breadcrumbs":"Release Notes » Features","id":"279","title":"Features"},"28":{"body":"A project is a collection of files containing Fe code and configuration data. Often, smart contract development can become too complex to contain all the necessary code inside a single file. In these cases, it is useful to organize your work into multiple files and directories. This allows you to group thematically linked code and selectively import the code you need when you need it.","breadcrumbs":"Using Fe » Using projects » Fe projects","id":"28","title":"Fe projects"},"280":{"body":"Adjust numeric values loaded from memory or storage Previous to this fix numeric values that were loaded from either memory or storage were not properly loaded on the stack which could result in numeric values not treated as intended. Example: contract Foo: pub fn bar() -> i8: let in_memory: i8[1] = [-3] return in_memory[0] In the example above bar() would not return -3 but 253 instead. ( #524 ) Propagate reverts from external contract calls. Before this fix the following code to should_revert() or should_revert2() would succeed even though it clearly should not. contract A: contract_b: B pub fn __init__(contract_b: address): self.contract_b = B(contract_b) pub fn should_revert(): self.contract_b.fail() pub fn should_revert2(): self.contract_b.fail_with_custom_error() struct SomeError: pass contract B: pub fn fail(): revert pub fn fail_with_custom_error(): revert SomeError() With this fix the revert errors are properly passed upwards the call hierachy. ( #574 ) Fixed bug in left shift operation. Example: Let's consider the value 1 as an u8 which is represented as the following 256 bit item on the EVM stack 00..|00000001|. A left shift of 8 bits (val << 8) turns that into 00..01|00000000|. Previous to this fix this resulted in the compiler taking 256 as the value for the u8 when clearly 256 is not even in the range of u8 anymore. With this fix the left shift operations was fixed to properly \"clean up\" the result of the shift so that 00..01|00000000| turns into 00..00|00000000|. ( #575 ) Ensure negation is checked and reverts with over/underflow if needed. Example: The minimum value for an i8 is -128 but the maximum value of an i8 is 127 which means that negating -128 should lead to an overflow since 128 does not fit into an i8. Before this fix, negation operations where not checked for over/underflow resulting in returning the oversized value. ( #578 )","breadcrumbs":"Release Notes » Bugfixes","id":"280","title":"Bugfixes"},"281":{"body":"In the analysis stage, all name resolution (of variable names, function names, type names, etc used in code) now happens via a single resolve_name pathway, so we can catch more cases of name collisions and log more helpful error messages. ( #555 ) Added a new category of tests: differential contract testing. Each of these tests is pased on a pair of contracts where one implementation is written in Fe and the other one is written in Solidity. The implementations should have the same public APIs and are assumed to always return identical results given equal inputs. The inputs are randomly generated using proptest and hence are expected to discover unknown bugs. ( #578 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"281","title":"Internal Changes - for Fe Contributors"},"282":{"body":"","breadcrumbs":"Release Notes » 0.9.0-alpha (2021-09-29)","id":"282","title":"0.9.0-alpha (2021-09-29)"},"283":{"body":"The self variable is no longer implicitly defined in code blocks. It must now be declared as the first parameter in a function signature. Example: contract Foo: my_stored_num: u256 pub fn bar(self, my_num: u256): self.my_stored_num = my_num pub fn baz(self): self.bar(my_pure_func()) pub fn my_pure_func() -> u256: return 42 + 26 ( #520 ) The analyzer now disallows defining a type, variable, or function whose name conflicts with a built-in type, function, or object. Example: error: type name conflicts with built-in type\n┌─ compile_errors/shadow_builtin_type.fe:1:6\n│\n1 │ type u256 = u8\n│ ^^^^ `u256` is a built-in type ( #539 )","breadcrumbs":"Release Notes » Features","id":"283","title":"Features"},"284":{"body":"Fixed cases where the analyzer would correctly reject code, but would panic instead of logging an error message. ( #534 ) Non-fatal parser errors (eg missing parentheses when defining a function that takes no arguments: fn foo:) are no longer ignored if the semantic analysis stage succeeds. ( #535 ) Fixed issue #531 by adding a $ to the front of lowered tuple names. ( #546 )","breadcrumbs":"Release Notes » Bugfixes","id":"284","title":"Bugfixes"},"285":{"body":"Implemented pretty printing of Fe AST. ( #540 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"285","title":"Internal Changes - for Fe Contributors"},"286":{"body":"","breadcrumbs":"Release Notes » 0.8.0-alpha \"Haxonite\" (2021-08-31)","id":"286","title":"0.8.0-alpha \"Haxonite\" (2021-08-31)"},"287":{"body":"Support quotes, tabs and carriage returns in string literals and otherwise restrict string literals to the printable subset of the ASCII table. ( #329 ) The analyzer now uses a query-based system, which fixes some shortcomings of the previous implementation. Types can now refer to other types defined later in the file. Example: type Posts = Map\ntype PostId = u256\ntype PostBody = String<140> Duplicate definition errors now show the location of the original definition. The analysis of each function, type definition, etc happens independently, so an error in one doesn't stop the analysis pass. This means fe can report more user errors in a single run of the compiler. ( #468 ) Function definitions are now denoted with the keyword fn instead of def. ( #496 ) Variable declarations are now preceded by the let keyword. Example: let x: u8 = 1. ( #509 ) Implemented support for numeric unary invert operator (~) ( #526 )","breadcrumbs":"Release Notes » Features","id":"287","title":"Features"},"288":{"body":"Calling self.__init__() now results in a nice error instead of a panic in the yul compilation stage. ( #468 ) Fixed an issue where certain expressions were not being moved to the correct location. ( #493 ) Fixed an issue with a missing return statement not properly detected. Previous to this fix, the following code compiles but it should not: contract Foo: pub fn bar(val: u256) -> u256: if val > 1: return 5 With this change, the compiler rightfully detects that the code is missing a return or revert statement after the if statement since it is not guaranteed that the path of execution always follows the arm of the if statement. ( #497 ) Fixed a bug in the analyzer which allowed tuple item accessor names with a leading 0, resulting in an internal compiler error in a later pass. Example: my_tuple.item001. These are now rejected with an error message. ( #510 ) Check call argument labels for function calls. Previously the compiler would not check any labels that were used when making function calls on self or external contracts. This can be especially problematic if gives developers the impression that they could apply function arguments in any order as long as they are named which is not the case. contract Foo: pub fn baz(): self.bar(val2=1, doesnt_even_exist=2) pub fn bar(val1: u256, val2: u256): pass Code as the one above is now rightfully rejected by the compiler. ( #517 )","breadcrumbs":"Release Notes » Bugfixes","id":"288","title":"Bugfixes"},"289":{"body":"Various improvements and bug fixes to both the content and layout of the specification. ( #489 ) Document all remaining statements and expressions in the spec. Also added a CI check to ensure code examples in the documentation are validated against the latest compiler. ( #514 )","breadcrumbs":"Release Notes » Improved Documentation","id":"289","title":"Improved Documentation"},"29":{"body":"You can start a project using the new subcommand: $ fe new This will generate a template project containing the following: A src directory containing two .fe files. A fe.toml manifest with basic project info and some local project imports.","breadcrumbs":"Using Fe » Using projects » Creating a project","id":"29","title":"Creating a project"},"290":{"body":"Separated Fe type traits between crates. ( #485 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"290","title":"Internal Changes - for Fe Contributors"},"291":{"body":"","breadcrumbs":"Release Notes » 0.7.0-alpha \"Galaxite\" (2021-07-27)","id":"291","title":"0.7.0-alpha \"Galaxite\" (2021-07-27)"},"292":{"body":"Enable the optimizer by default. The optimizer can still be disabled by supplying --optimize=false as an argument. ( #439 ) The following checks are now performed while decoding data: The size of the encoded data fits within the size range known at compile-time. Values are correctly padded. unsigned integers, addresses, and bools are checked to have correct left zero padding the size of signed integers are checked bytes and strings are checked to have correct right padding Data section offsets are consistent with the size of preceding values in the data section. The dynamic size of strings does not exceed their maximum size. The dynamic size of byte arrays (u8[n]) is equal to the size of the array. ( #440 ) Type aliases can now include tuples. Example: type InternetPoints = (address, u256) ( #459 ) Revert with custom errors Example: struct PlatformError: code: u256 pub fn do_something(): revert PlatformError(code=4711) Error encoding follows Solidity which is based on EIP-838 . This means that custom errors returned from Fe are fully compatible with Solidity. ( #464 ) The builtin value msg.sig now has type u256. Removed the bytes[n] type. The type u8[n] can be used in its placed and will be encoded as a dynamically-sized, but checked, bytes component. ( #472 ) Encode certain reverts as panics. With this change, the following reverts are encoded as Panic(uint256) with the following panic codes: 0x01: An assertion that failed and did not specify an error message 0x11: An arithmetic expression resulted in an over- or underflow 0x12: An arithmetic expression divided or modulo by zero The panic codes are aligned with the panic codes that Solidity uses . ( #476 )","breadcrumbs":"Release Notes » Features","id":"292","title":"Features"},"293":{"body":"Fixed a crash when trying to access an invalid attribute on a string. Example: contract Foo: pub fn foo(): \"\".does_not_exist The above now yields a proper user error. ( #444 ) Ensure String type is capitalized in error messages ( #445 ) Fixed ICE when using a static string that spans over multiple lines. Previous to this fix, the following code would lead to a compiler crash: contract Foo: pub fn return_with_newline() -> String<16>: return \"foo balu\" The above code now works as intended. ( #448 ) Fixed ICE when using a tuple declaration and specifying a non-tuple type. Fixed a second ICE when using a tuple declaration where the number of target items doesn't match the number of items in the declared type. ( #469 )","breadcrumbs":"Release Notes » Bugfixes","id":"293","title":"Bugfixes"},"294":{"body":"Cleaned up ABI encoding internals. Improved yulc panic formatting. ( #472 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"294","title":"Internal Changes - for Fe Contributors"},"295":{"body":"","breadcrumbs":"Release Notes » 0.6.0-alpha \"Feldspar\" (2021-06-10)","id":"295","title":"0.6.0-alpha \"Feldspar\" (2021-06-10)"},"296":{"body":"Support for pragma statement Example: pragma ^0.1.0 ( #361 ) Add support for tuple destructuring Example: my_tuple: (u256, bool) = (42, true)\n(x, y): (u256, bool) = my_tuple ( #376 ) Call expression can now accept generic arguments Replace stringN to String Example: s: String<10> = String<10>(\"HI\") ( #379 ) Many analyzer errors now include helpful messages and underlined code. Event and struct constructor arguments must now be labeled and in the order specified in the definition. The analyzer now verifies that the left-hand side of an assignment is actually assignable. ( #398 ) Types of integer literal are now inferred, rather than defaulting to u256. contract C: fn f(x: u8) -> u16: y: u8 = 100 # had to use u8(100) before z: i8 = -129 # \"literal out of range\" error return 1000 # had to use `return u16(1000)` before fn g(): self.f(50) Similar inference is done for empty array literals. Previously, empty array literals caused a compiler crash, because the array element type couldn't be determined. contract C: fn f(xs: u8[10]): pass fn g(): self.f([]) (Note that array length mismatch is still a type error, so this code won't actually compile.) ( #429 ) The Map type name is now capitalized. Example: contract GuestBook: guests: Map> ( #431 ) Convert all remaining errors to use the new advanced error reporting system ( #432 ) Analyzer throws an error if __init__ is not public. ( #435 )","breadcrumbs":"Release Notes » Features","id":"296","title":"Features"},"297":{"body":"Refactored front-end \"not implemented\" errors into analyzer errors and removed questionable variants. Any panic is now considered to be a bug. ( #437 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"297","title":"Internal Changes - for Fe Contributors"},"298":{"body":"","breadcrumbs":"Release Notes » 0.5.0-alpha (2021-05-27)","id":"298","title":"0.5.0-alpha (2021-05-27)"},"299":{"body":"Add support for hexadecimal/octal/binary numeric literals. Example: value_hex: u256 = 0xff\nvalue_octal: u256 = 0o77\nvalue_binary: u256 = 0b11 ( #333 ) Added support for list expressions. Example: values: u256[3] = [10, 20, 30] # or anywhere else where expressions can be used such as in a call sum: u256 = self.sum([10, 20, 30]) ( #388 ) Contracts, events, and structs can now be empty. e.g. event MyEvent: pass ... contract MyContract: pass ... struct MyStruct: pass ( #406 ) External calls can now handle dynamically-sized return types. ( #415 )","breadcrumbs":"Release Notes » Features","id":"299","title":"Features"},"3":{"body":"One of the pain points with smart contract languages is that there can be ambiguities in how the compiler translates the human readable code into EVM bytecode. This can lead to security flaws and unexpected behaviours. The details of the EVM can also cause the higher level languages to be less intuitive and harder to master than some other languages. These are some of the pain points Fe aims to solve. By striving to maximize both human readability and bytecode predictability , Fe will provide an enhanced developer experience for everyone working with the EVM.","breadcrumbs":"Introduction » What problems does Fe solve?","id":"3","title":"What problems does Fe solve?"},"30":{"body":"The fe.toml file is known as a manifest. The manifest is written in TOML format. The purpose of this file is to provide all the metadata that is required for the project to compile. The file begins with definitions for the project name and version, then the project dependencies are listed under a heading [dependencies]. Dependencies are files in the local filesystem that are required for your project to run. For example: name=\"my-project\"\nversion = \"1.0\" [dependencies]\ndependency_1 = \"../lib\" You can also specify which version of a particular dependency you want to use, using curly braces: name=\"my-project\"\nversion = \"1.0\" [dependencies]\ndependency_1 = {path = \"../lib\", version = \"1.0\"}","breadcrumbs":"Using Fe » Using projects » Manifest","id":"30","title":"Manifest"},"300":{"body":"The analyzer will return an error if a tuple attribute is not of the form item. ( #401 )","breadcrumbs":"Release Notes » Bugfixes","id":"300","title":"Bugfixes"},"301":{"body":"Created a landing page for Fe at https://fe-lang.org ( #394 ) Provide a Quickstart chapter in Fe Guide ( #403 )","breadcrumbs":"Release Notes » Improved Documentation","id":"301","title":"Improved Documentation"},"302":{"body":"Using insta to validate Analyzer outputs. ( #387 ) Analyzer now disallows using context.add_ methods to update attributes. ( #392 ) () now represents a distinct type internally called the unit type, instead of an empty tuple. The lowering pass now does the following: Valueless return statements are given a () value and functions without a return value are given explicit () returns. ( #406 ) Add CI check to ensure fragment files always end with a new line ( #4711 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"302","title":"Internal Changes - for Fe Contributors"},"303":{"body":"","breadcrumbs":"Release Notes » 0.4.0-alpha (2021-04-28)","id":"303","title":"0.4.0-alpha (2021-04-28)"},"304":{"body":"Support for revert messages in assert statements E.g assert a == b, \"my revert statement\" The provided string is abi-encoded as if it were a call to a function Error(string). For example, the revert string \"Not enough Ether provided.\" returns the following hexadecimal as error return data: 0x08c379a0 // Function selector for Error(string)\n0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset\n0x000000000000000000000000000000000000000000000000000000000000001a // String length\n0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data ( #288 ) Added support for augmented assignments. e.g. contract Foo: pub fn add(a: u256, b: u256) -> u256: a += b return a pub fn sub(a: u256, b: u256) -> u256: a -= b return a pub fn mul(a: u256, b: u256) -> u256: a *= b return a pub fn div(a: u256, b: u256) -> u256: a /= b return a pub fn mod(a: u256, b: u256) -> u256: a %= b return a pub fn pow(a: u256, b: u256) -> u256: a **= b return a pub fn lshift(a: u8, b: u8) -> u8: a <<= b return a pub fn rshift(a: u8, b: u8) -> u8: a >>= b return a pub fn bit_or(a: u8, b: u8) -> u8: a |= b return a pub fn bit_xor(a: u8, b: u8) -> u8: a ^= b return a pub fn bit_and(a: u8, b: u8) -> u8: a &= b return a ( #338 ) A new parser implementation, which provides more helpful error messages with fancy underlines and code context. ( #346 ) Added support for tuples with base type items. e.g. contract Foo: my_num: u256 pub fn bar(my_num: u256, my_bool: bool) -> (u256, bool): my_tuple: (u256, bool) = (my_num, my_bool) self.my_num = my_tuple.item0 return my_tuple ( #352 )","breadcrumbs":"Release Notes » Features","id":"304","title":"Features"},"305":{"body":"Properly reject invalid emit ( #211 ) Properly tokenize numeric literals when they start with 0 ( #331 ) Reject non-string assert reasons as type error ( #335 ) Properly reject code that creates a circular dependency when using create or create2. Example, the following code is now rightfully rejected because it tries to create an instance of Foo from within the Foo contract itself. contract Foo: pub fn bar()->address: foo:Foo=Foo.create(0) return address(foo) ( #362 )","breadcrumbs":"Release Notes » Bugfixes","id":"305","title":"Bugfixes"},"306":{"body":"AST nodes use Strings instead of &strs. This way we can perform incremental compilation on the AST. ( #332 ) Added support for running tests against solidity fixtures. Also added tests that cover how solidity encodes revert reason strings. ( #342 ) Refactoring of binary operation type checking. ( #347 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"306","title":"Internal Changes - for Fe Contributors"},"307":{"body":"","breadcrumbs":"Release Notes » 0.3.0-alpha \"Calamine\" (2021-03-24)","id":"307","title":"0.3.0-alpha \"Calamine\" (2021-03-24)"},"308":{"body":"Add over/underflow checks for multiplications of all integers ( #271 ) Add full support for empty Tuples. ( #276 ) All functions in Fe implicitly return an empty Tuple if they have no other return value. However, before this change one was not able to use the empty Tuple syntax () explicitly. With this change, all of these are treated equally: contract Foo: pub fn explicit_return_a1(): return pub fn explicit_return_a2(): return () pub fn explicit_return_b1() ->(): return pub fn explicit_return_b2() ->(): return () pub fn implicit_a1(): pass pub fn implicit_a2() ->(): pass The JSON ABI builder now supports structs as both input and output. ( #296 ) Make subsequently defined contracts visible. Before this change: # can't see Bar\ncontract Foo: ...\n# can see Foo\ncontract Bar: ... With this change the restriction is lifted and the following becomes possible. ( #298 ) contract Foo: bar: Bar pub fn external_bar() -> u256: return self.bar.bar()\ncontract Bar: foo: Foo pub fn external_foo() -> u256: return self.foo.foo() Perform checks for divison operations on integers ( #308 ) Support for msg.sig to read the function identifier. ( #311 ) Perform checks for modulo operations on integers ( #312 ) Perform over/underflow checks for exponentiation operations on integers ( #313 )","breadcrumbs":"Release Notes » Features","id":"308","title":"Features"},"309":{"body":"Properly reject emit not followed by an event invocation ( #212 ) Properly reject octal number literals ( #222 ) Properly reject code that tries to emit a non-existing event. ( #250 ) Example that now produces a compile time error: emit DoesNotExist() Contracts that create other contracts can now include __init__ functions. See https://github.com/ethereum/fe/issues/284 ( #304 ) Prevent multiple types with same name in one module. ( #317 ) Examples that now produce compile time errors: type bar = u8\ntype bar = u16 or struct SomeStruct: some_field: u8 struct SomeStruct: other: u8 or contract SomeContract: some_field: u8 contract SomeContract: other: u8 Prevent multiple fields with same name in one struct. Example that now produces a compile time error: struct SomeStruct: some_field: u8 some_field: u8 Prevent variable definition in child scope when name already taken in parent scope. Example that now produces a compile time error: pub fn bar(): my_array: u256[3] sum: u256 = 0 for i in my_array: sum: u256 = 0 The CLI was using the overwrite flag to enable Yul optimization. i.e. # Would both overwrite output files and run the Yul optimizer.\n$ fe my_contract.fe --overwrite Using the overwrite flag now only overwrites and optimization is enabled with the optimize flag. ( #320 ) Ensure analyzer rejects code that uses return values for __init__ functions. ( #323 ) An example that now produces a compile time error: contract C: pub fn __init__() -> i32: return 0 Properly reject calling an undefined function on an external contract ( #324 )","breadcrumbs":"Release Notes » Bugfixes","id":"309","title":"Bugfixes"},"31":{"body":"There are two project modes: main and lib. Main projects can import libraries and have code output. Libraries on the other hand cannot import main projects and do not have code outputs. Their purpose is to be imported into other projects. The mode of a project is determined automatically by the presence of either src/main.fe or src/lib.fe.","breadcrumbs":"Using Fe » Using projects » Project modes","id":"31","title":"Project modes"},"310":{"body":"Added the Uniswap demo contracts to our testing fixtures and validated their behaviour. ( #179 ) IDs added to AST nodes. ( #315 ) Failures in the Yul generation phase now panic; any failure is a bug. ( #327 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"310","title":"Internal Changes - for Fe Contributors"},"311":{"body":"","breadcrumbs":"Release Notes » 0.2.0-alpha \"Borax\" (2021-02-27)","id":"311","title":"0.2.0-alpha \"Borax\" (2021-02-27)"},"312":{"body":"Add support for string literals. Example: fn get_ticker_symbol() -> string3: return \"ETH\" String literals are stored in and loaded from the compiled bytecode. ( #186 ) The CLI now compiles every contract in a module, not just the first one. ( #197 ) Sample compiler output with all targets enabled: output\n|-- Bar\n| |-- Bar.bin\n| |-- Bar_abi.json\n| `-- Bar_ir.yul\n|-- Foo\n| |-- Foo.bin\n| |-- Foo_abi.json\n| `-- Foo_ir.yul\n|-- module.ast\n`-- module.tokens Add support for string type casts ( #201 ) Example: val: string100 = string100(\"foo\") Add basic support for structs. ( #203 ) Example: struct House: price: u256 size: u256 vacant: bool contract City: pub fn get_price() -> u256: building: House = House(300, 500, true) assert building.size == 500 assert building.price == 300 assert building.vacant return building.price Added support for external contract calls. Contract definitions now add a type to the module scope, which may be used to create contract values with the contract's public functions as callable attributes. ( #204 ) Example: contract Foo: pub fn build_array(a: u256, b: u256) -> u256[3]: my_array: u256[3] my_array[0] = a my_array[1] = a * b my_array[2] = b return my_array contract FooProxy: pub fn call_build_array( foo_address: address, a: u256, b: u256, ) -> u256[3]: foo: Foo = Foo(foo_address) return foo.build_array(a, b) Add support for block, msg, chain, and tx properties: ( #208 ) block.coinbase: address\nblock.difficulty: u256\nblock.number: u256\nblock.timestamp: u256\nchain.id: u256\nmsg.value: u256\ntx.gas_price: u256\ntx.origin: address (Note that msg.sender: address was added previously.) Example: fn post_fork() -> bool: return block.number > 2675000 The CLI now panics if an error is encountered during Yul compilation. ( #218 ) Support for contract creations. Example of create2, which takes a value and address salt as parameters. contract Foo: pub fn get_my_num() -> u256: return 42 contract FooFactory: pub fn create2_foo() -> address: # value and salt foo: Foo = Foo.create2(0, 52) return address(foo) Example of create, which just takes a value parameter. contract Foo: pub fn get_my_num() -> u256: return 42 contract FooFactory: pub fn create_foo() -> address: # value and salt foo: Foo = Foo.create(0) return address(foo) Note: We do not yet support init parameters. ( #239 ) Support updating individual struct fields in storage. ( #246 ) Example: pub fn update_house_price(price: u256): self.my_house.price = price Implement global keccak256 method. The method expects one parameter of bytes[n] and returns the hash as an u256. In a future version keccak256 will most likely be moved behind an import so that it has to be imported (e.g. from std.crypto import keccak256). ( #255 ) Example: pub fn hash_single_byte(val: bytes[1]) -> u256: return keccak256(val) Require structs to be initialized using keyword arguments. Example: struct House: vacant: bool price: u256 Previously, House could be instantiated as House(true, 1000000). With this change it is required to be instantiated like House(vacant=true, price=1000000) This ensures property assignment is less prone to get mixed up. It also makes struct initialization visually stand out more from function calls. ( #260 ) Implement support for boolean not operator. ( #264 ) Example: if not covid_test.is_positive(person): allow_boarding(person) Do over/underflow checks for additions (SafeMath). With this change all additions (e.g x + y) for signed and unsigned integers check for over- and underflows and revert if necessary. ( #265 ) Added a builtin function abi_encode() that can be used to encode structs. The return type is a fixed-size array of bytes that is equal in size to the encoding. The type system does not support dynamically-sized arrays yet, which is why we used fixed. ( #266 ) Example: struct House: price: u256 size: u256 rooms: u8 vacant: bool contract Foo: pub fn hashed_house() -> u256: house: House = House( price=300, size=500, rooms=u8(20), vacant=true ) return keccak256(house.abi_encode()) Perform over/underflow checks for subtractions (SafeMath). ( #267 ) With this change all subtractions (e.g x - y) for signed and unsigned integers check for over- and underflows and revert if necessary. Support for the boolean operations and and or. ( #270 ) Examples: contract Foo: pub fn bar(x: bool, y: bool) -> bool: return x and y contract Foo: pub fn bar(x: bool, y: bool) -> bool: return x or y Support for self.address. This expression returns the address of the current contract. Example: contract Foo: pub fn bar() -> address: return self.address","breadcrumbs":"Release Notes » Features","id":"312","title":"Features"},"313":{"body":"Perform type checking when calling event constructors Previously, the following would not raise an error even though it should: contract Foo: event MyEvent: val_1: string100 val_2: u8 pub fn foo(): emit MyEvent(\"foo\", 1000) Wit this change, the code fails with a type error as expected. ( #202 ) Fix bug where compilation of contracts without public functions would result in illegal YUL. ( #219 ) E.g without this change, the following doesn't compile to proper YUL contract Empty: lonely: u256 Ensure numeric literals can't exceed 256 bit range. Previously, this would result in a non user friendly error at the YUL compilation stage. With this change it is caught at the analyzer stage and presented to the user as a regular error. ( #225 ) Fix crash when return is used without value. These two methods should both be treated as returning () pub fn explicit_return(): return pub fn implicit(): pass Without this change, the explicit_return crashes the compiler. ( #261 )","breadcrumbs":"Release Notes » Bugfixes","id":"313","title":"Bugfixes"},"314":{"body":"Renamed the fe-semantics library to fe-analyzer. ( #207 ) Runtime testing utilities. ( #243 ) Values are stored more efficiently in storage. ( #251 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"314","title":"Internal Changes - for Fe Contributors"},"315":{"body":"WARNING: This is an alpha version to share the development progress with developers and enthusiasts. It is NOT yet intended to be used for anything serious. At this point Fe is missing a lot of features and has a lot of bugs instead. This is the first alpha release and kicks off our release schedule which will be one release every month in the future. Since we have just started tracking progress on changes, the following list of changes is incomplete, but will appropriately document progress between releases from now on.","breadcrumbs":"Release Notes » 0.1.0-alpha \"Amethyst\" (2021-01-20)","id":"315","title":"0.1.0-alpha \"Amethyst\" (2021-01-20)"},"316":{"body":"Added support for for loop, allows iteration over static arrays. ( #134 ) Enforce bounds on numeric literals in type constructors. For instance calling u8(1000) or i8(-250) will give an error because the literals 1000 and -250 do not fit into u8 or i8. ( #145 ) Added builtin copying methods clone() and to_mem() to reference types. ( #155 ) usage: # copy a segment of storage into memory and assign the new pointer\nmy_mem_array = self.my_sto_array.to_mem() # copy a segment of memory into another segment of memory and assign the new pointer\nmy_other_mem_array = my_mem_array.clone() Support emitting JSON ABI via --emit abi. The default value of --emit is now abi,bytecode. ( #160 ) Ensure integer type constructor reject all expressions that aren't a numeric literal. For instance, previously the compiler would not reject the following code even though it could not be guaranteed that val would fit into an u16. pub fn bar(val: u8) -> u16: return u16(val) Now such code is rejected and integer type constructor do only work with numeric literals such as 1 or -3. ( #163 ) Support for ABI decoding of all array type. ( #172 ) Support for value assignments in declaration. Previously, this code would fail: another_reference: u256[10] = my_array As a workaround declaration and assignment could be split apart. another_reference: u256[10]\nanother_reference = my_array With this change, the shorter declaration with assignment syntax is supported. ( #173 )","breadcrumbs":"Release Notes » Features","id":"316","title":"Features"},"317":{"body":"Point to examples in the README ( #162 ) Overhaul README page to better reflect the current state of the project. ( #177 ) Added descriptions of the to_mem and clone functions to the spec. ( #195 )","breadcrumbs":"Release Notes » Improved Documentation","id":"317","title":"Improved Documentation"},"318":{"body":"Updated the Solidity backend to v0.8.0. ( #169 ) Run CI tests on Mac and support creating Mac binaries for releases. ( #178 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"318","title":"Internal Changes - for Fe Contributors"},"319":{"body":"","breadcrumbs":"Code of Conduct » Contributor Covenant Code of Conduct","id":"319","title":"Contributor Covenant Code of Conduct"},"32":{"body":"You can import code from external files with the following syntax: use utils::get_42 This will import the get_42 function from the file utils.fe. You can also import using a custom name/alias: use utils::get_42 as get_42","breadcrumbs":"Using Fe » Using projects » Importing","id":"32","title":"Importing"},"320":{"body":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","breadcrumbs":"Code of Conduct » Our Pledge","id":"320","title":"Our Pledge"},"321":{"body":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others' private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","breadcrumbs":"Code of Conduct » Our Standards","id":"321","title":"Our Standards"},"322":{"body":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","breadcrumbs":"Code of Conduct » Enforcement Responsibilities","id":"322","title":"Enforcement Responsibilities"},"323":{"body":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","breadcrumbs":"Code of Conduct » Scope","id":"323","title":"Scope"},"324":{"body":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at piper@pipermerriam.com. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","breadcrumbs":"Code of Conduct » Enforcement","id":"324","title":"Enforcement"},"325":{"body":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","breadcrumbs":"Code of Conduct » Enforcement Guidelines","id":"325","title":"Enforcement Guidelines"},"326":{"body":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","breadcrumbs":"Code of Conduct » 1. Correction","id":"326","title":"1. Correction"},"327":{"body":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","breadcrumbs":"Code of Conduct » 2. Warning","id":"327","title":"2. Warning"},"328":{"body":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","breadcrumbs":"Code of Conduct » 3. Temporary Ban","id":"328","title":"3. Temporary Ban"},"329":{"body":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","breadcrumbs":"Code of Conduct » 4. Permanent Ban","id":"329","title":"4. Permanent Ban"},"33":{"body":"The templates created using fe new include a simple test demonstrating the test syntax. To write a unit test, create a function with a name beginning with test_. The function should instantiate your contract and call the contract function you want to test. You can use assert to check that the returned value matches an expected value. For example, to test the say_hello function on Contract which is expected to return the string \"hello\": fn test_contract(mut ctx: Context) { let contract: Contract = Contract.create(ctx, 0) assert main.say_hello() == \"hello\"\n} You can run all the tests in a project by running the following command: fe test You will receive test results directly to the console.","breadcrumbs":"Using Fe » Using projects » Tests","id":"33","title":"Tests"},"330":{"body":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","breadcrumbs":"Code of Conduct » Attribution","id":"330","title":"Attribution"},"34":{"body":"Once you have created a project, you can run the usual Fe CLI subcommands against the project path.","breadcrumbs":"Using Fe » Using projects » Running your project","id":"34","title":"Running your project"},"35":{"body":"Welcome to the Tutorials section. We will be adding walkthrough guides for example Fe projects here! For now, you can get started with: Open auction Watch this space for more tutorials coming soon!","breadcrumbs":"Using Fe » Tutorials » Tutorials","id":"35","title":"Tutorials"},"36":{"body":"This tutorial aims to implement a simple auction contract in Fe. Along the way you will learn some foundational Fe concepts. An open auction is one where prices are determined in real-time by live bidding. The winner is the participant who has made the highest bid at the time the auction ends.","breadcrumbs":"Using Fe » Tutorials » Open auction » Auction contract","id":"36","title":"Auction contract"},"37":{"body":"To run an open auction, you need an item for sale, a seller, a pool of buyers and a deadline after which no more bids will be recognized. In this tutorial we will not have an item per se, the buyers are simply bidding to win! The highest bidder is provably crowned the winner, and the value of their bid is passed to the beneficiary. Bidders can also withdraw their bids at any time.","breadcrumbs":"Using Fe » Tutorials » Open auction » The auction rules","id":"37","title":"The auction rules"},"38":{"body":"To follow this guide you should have Fe installed on your computer. If you haven't installed Fe yet, follow the instructions on the Installation page. With Fe installed, you can create a project folder, auction that will act as your project root. In that folder, create an empty file called auction.fe. Now you are ready to start coding in Fe! You will also need Foundry installed to follow the deployment instructions in this guide - you can use your alternative tooling for this if you prefer.","breadcrumbs":"Using Fe » Tutorials » Open auction » Get Started","id":"38","title":"Get Started"},"39":{"body":"You can see the entire contract here . You can refer back to this at any time to check implementation details.","breadcrumbs":"Using Fe » Tutorials » Open auction » Writing the Contract","id":"39","title":"Writing the Contract"},"4":{"body":"You can read much more information about Fe in these docs. If you want to get building, you can begin with our Quickstart guide . You can also get involved in the Fe community by contributing code or documentation to the project Github or joining the conversation on Discord . Learn more on our Contributing page.","breadcrumbs":"Introduction » Get Started","id":"4","title":"Get Started"},"40":{"body":"A contract in Fe is defined using the contract keyword. A contract requires a constructor function to initialize any state variables used by the contract. If no constructor is defined, Fe will add a default with no state variables. The skeleton of the contract can look as follows: contract Auction { pub fn __init__() {}\n} To run the auction you will need several state variables, some of which can be initialized at the time the contract is instantiated. You will need to track the address of the beneficiary so you know who to pay out to. You will also need to keep track of the highest bidder, and the amount they have bid. You will also need to keep track of how much each specific address has sent into the contract, so you can refund them the right amount if they decide to withdraw. You will also need a flag that tracks whether or not the auction has ended. The following list of variables will suffice: auction_end_time: u256\nbeneficiary: address\nhighest_bidder: address\nhighest_bid: u256\npending_returns: Map\nended: bool Notice that variables are named using snake case (lower case, underscore separated, like_this). Addresses have their own type in Fe - it represents 20 hex-encoded bytes as per the Ethereum specification. The variables that expect numbers are given the u256 type. This is an unsigned integer of length 256 bits. There are other choices for integers too, with both signed and unsigned integers between 8 and 256 bits in length. The ended variable will be used to check whether the auction is live or not. If it has finished ended will be set to true. There are only two possible states for this, so it makes sense to declare it as a bool - i.e. true/false. The pending_returns variable is a mapping between N keys and N values, with user addresses as the keys and their bids as values. For this, a Map type is used. In Fe, you define the types for the key and value in the Map definition - in this case, it is Map. Keys can be any numeric type, address, boolean or unit. Now you should decide which of these variables will have values that are known at the time the contract is instantiated. It makes sense to set the beneficiary right away, so you can add that to the constructor arguments. The other thing to consider here is how the contract will keep track of time. On its own, the contract has no concept of time. However, the contract does have access to the current block timestamp which is measured in seconds since the Unix epoch (Jan 1st 1970). This can be used to measure the time elapsed in a smart contract. In this contract, you can use this concept to set a deadline on the auction. By passing a length of time in seconds to the constructor, you can then add that value to the current block timestamp and create a deadline for bidding to end. Therefore, you should add a bidding_time argument to the constructor. Its type can be u256. When you have implemented all this, your contract should look like this: contract Auction { // states auction_end_time: u256 beneficiary: address highest_bidder: address highest_bid: u256 pending_returns: Map ended: bool // constructor pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) { self.beneficiary = beneficiary_addr self.auction_end_time = ctx.block_timestamp() + bidding_time }\n} Notice that the constructor receives values for bidding_time and beneficiary_addr and uses them to initialize the contract's auction_end_time and beneficiary variables. The other thing to notice about the constructor is that there are two additional arguments passed to the constructor: mut self and ctx: Context. self self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. 'self' in the context of classes in Python, or this in Javascript. Here, you are not only using self but you are prepending it with mut. mut is a keyword inherited from Rust that indicates that the value can be overwritten - i.e. it is \"mutable\". Variables are not mutable by default - this is a safety feature that helps protect developers from unintended changes during runtime. If you do not make self mutable, then you will not be able to update the values it contains. Context Context is used to gate access to certain features including emitting logs, creating contracts, reading messages and transferring ETH. It is conventional to name the context object ctx. The Context object needs to be passed as the first parameter to a function unless the function also takes self, in which case the Context object should be passed as the second parameter. Context must be explicitly made mutable if it will invoke functions that changes the blockchain data, whereas an immutable reference to Context can be used where read-only access to the blockchain is needed. Read more on Context in Fe In Fe contracts ctx is where you can find transaction data such as msg.sender, msg.value, block.timestamp etc.","breadcrumbs":"Using Fe » Tutorials » Open auction » Defining the Contract and initializing variables","id":"40","title":"Defining the Contract and initializing variables"},"41":{"body":"Now that you have your contract constructor and state variables, you can implement some logic for receiving bids. To do this, you will create a method called bid. To handle a bid, you will first need to determine whether the auction is still open. If it has closed then the bid should revert. If the auction is open you need to record the address of the bidder and the amount and determine whether their bid was the highest. If their bid is highest, then their address should be assigned to the highest_bidder variable and the amount they sent recorded in the highest_bid variable. This logic can be implemented as follows: pub fn bid(mut self, mut ctx: Context) { if ctx.block_timestamp() > self.auction_end_time { revert AuctionAlreadyEnded() } if ctx.msg_value() <= self.highest_bid { revert BidNotHighEnough(highest_bid: self.highest_bid) } if self.highest_bid != 0 { self.pending_returns[self.highest_bidder] += self.highest_bid } self.highest_bidder = ctx.msg_sender() self.highest_bid = ctx.msg_value() ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))\n} The method first checks that the current block timestamp is not later than the contract's aution_end_time variable. If it is later, then the contract reverts. This is triggered using the revert keyword. The revert can accept a struct that becomes encoded as revert data . Here you can just revert without any arguments. Add the following definition somewhere in Auction.fe outside the main contract definition: struct AuctionAlreadyEnded {\n} The next check is whether the incoming bid exceeds the current highest bid. If not, the bid has failed and it may as well revert. We can repeat the same logic as for AuctionAlreadyEnded. We can also report the current highest bid in the revert message to help the user reprice if they want to. Add the following to auction.fe: struct BidNotHighEnough { pub highest_bid: u256\n} Notice that the value being checked is msg.value which is included in the ctx object. ctx is where you can access incoming transaction data. Next, if the incoming transaction is the highest bid, you need to track how much the sender should receive as a payout if their bid ends up being exceeded by another user (i.e. if they get outbid, they get their ETH back). To do this, you add a key-value pair to the pending_returns mapping, with the user address as the key and the transaction amount as the value. Both of these come from ctx in the form of msg.sender and msg.value. Finally, if the incoming bid is the highest, you can emit an event. Events are useful because they provide a cheap way to return data from a contract as they use logs instead of contract storage. Unlike other smart contract languages, there is no emit keyword or Event type. Instead, you trigger an event by calling the emit method on the ctx object. You can pass this method a struct that defines the emitted message. You can add the following struct for this event: struct HighestBidIncreased { #indexed pub bidder: address pub amount: u256\n} You have now implemented all the logic to handle a bid!","breadcrumbs":"Using Fe » Tutorials » Open auction » Bidding","id":"41","title":"Bidding"},"42":{"body":"A previous high-bidder will want to retrieve their ETH from the contract so they can either walk away or bid again. You therefore need to create a withdraw method that the user can call. The function will lookup the user address in pending_returns. If there is a non-zero value associated with the user's address, the contract should send that amount back to the sender's address. It is important to first update the value in pending_returns and then send the ETH to the user, otherwise you are exposing a re-entrancy vulnerability (where a user can repeatedly call the contract and receive the ETH multiple times). Add the following to the contract to implement the withdraw method: pub fn withdraw(mut self, mut ctx: Context) -> bool { let amount: u256 = self.pending_returns[ctx.msg_sender()] if amount > 0 { self.pending_returns[ctx.msg_sender()] = 0 ctx.send_value(to: ctx.msg_sender(), wei: amount) } return true\n} Note that in this case mut is used with ctx because send_value is making changes to the blockchain (it is moving ETH from one address to another).","breadcrumbs":"Using Fe » Tutorials » Open auction » Withdrawing","id":"42","title":"Withdrawing"},"43":{"body":"Finally, you need to add a way to end the auction. This will check whether the bidding period is over, and if it is, automatically trigger the payment to the beneficiary and emit the address of the winner in an event. First, check the auction is not still live - if the auction is live you cannot end it early. If an attempt to end the auction early is made, it should revert using a AuctionNotYetEnded struct, which can look as follows: struct AuctionNotYetEnded {\n} You should also check whether the auction was already ended by a previous valid call to this method. In this case, revert with a AuctionEndAlreadyCalled struct: struct AuctionEndAlreadyCalled {} If the auction is still live, you can end it. First set self.ended to true to update the contract state. Then emit the event using ctx.emit(). Then, send the ETH to the beneficiary. Again, the order is important - you should always send value last to protect against re-entrancy. Your method can look as follows: pub fn action_end(mut self, mut ctx: Context) { if ctx.block_timestamp() <= self.auction_end_time { revert AuctionNotYetEnded() } if self.ended { revert AuctionEndAlreadyCalled() } self.ended = true ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid)) ctx.send_value(to: self.beneficiary, wei: self.highest_bid)\n} Congratulations! You just wrote an open auction contract in Fe!","breadcrumbs":"Using Fe » Tutorials » Open auction » End the auction","id":"43","title":"End the auction"},"44":{"body":"To help test the contract without having to decode transaction logs, you can add some simple functions to the contract that simply report the current values for some key state variables (specifically, highest_bidder, highest_bid and ended). This will allow a user to use eth_call to query these values in the contract. eth_call is used for functions that do not update the state of the blockchain and costs no gas because the queries can be performed on local data. You can add the following functions to the contract: pub fn check_highest_bidder(self) -> address { return self.highest_bidder;\n} pub fn check_highest_bid(self) -> u256 { return self.highest_bid;\n} pub fn check_ended(self) -> bool { return self.ended;\n}","breadcrumbs":"Using Fe » Tutorials » Open auction » View functions","id":"44","title":"View functions"},"45":{"body":"Your contract is now ready to use! Compile it using fe build auction.fe You will find the contract ABI and bytecode in the newly created outputs directory. Start a local blockchain to deploy your contract to: anvil There are constructor arguments (bidding_time: u256, beneficiary_addr: address) that have to be added to the contract bytecode so that the contract is instantiated with your desired values. To add constructor arguments you can encode them into bytecode and append them to the contract bytecode. First, hex encode the value you want to pass to bidding_time. In this case, we will use a value of 10: cast --to_hex(10) >> 0xa // this is 10 in hex Ethereum addresses are already hex, so there is no further encoding required. The following command will take the constructor function and the hex-encoded arguments and concatenate them into a contiguous hex string and then deploy the contract with the constructor arguments. cast send --from --private-key --create $(cat output/Auction/Auction.bin) $(cast abi-encode \"__init__(uint256,address)\" 0xa 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720) You will see the contract address reported in your terminal. Now you can interact with your contract. Start by sending an initial bid, let's say 100 ETH. For contract address 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35: cast send 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"bid()\" --value \"100ether\" --private-key --from 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 You can check whether this was successful by calling the check_highest_bidder() function: cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"check_highest_bidder()\" You will see a response looking similar to: 0x000000000000000000000000a0Ee7A142d267C1f36714E4a8F75612F20a79720 The characters after the leading zeros are the address for the highest bidder (notice they match the characters after the 0x in the bidding address). You can do the same to check the highest bid: cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"check_highest_bid()\" This returns: 0x0000000000000000000000000000000000000000000000056bc75e2d63100000 Converting the non-zero characters to binary gives the decimal value of your bid (in wei - divide by 1e18 to get the value in ETH): cast --to-dec 56bc75e2d63100000 >> 100000000000000000000 // 100 ETH in wei Now you can repeat this process, outbidding the initial bid from another address and check the highest_bidder() and highest_bid() to confirm. Do this a few times, then call end_auction() to see the value of the highest bid get transferred to the beneficiary_addr. You can always check the balance of each address using: cast balance
And check whether the auction open time has expired using cast \"check_ended()\"","breadcrumbs":"Using Fe » Tutorials » Open auction » Build and deploy the contract","id":"45","title":"Build and deploy the contract"},"46":{"body":"Congratulations! You wrote an open auction contract in Fe and deployed it to a local blockchain! If you are using a local Anvil blockchain, you can use the ten ephemeral addresses created when the network started to simulate a bidding war! By following this tutorial, you learned: basic Fe types, such as bool, address, map and u256 basic Fe styles, such as snake case for variable names how to create a contract with a constructor how to revert how to handle state variables how to avoid reentrancy how to use ctx to handle transaction data how to emit events using ctx.emit how to deploy a contract with constructor arguments using Foundry how to interact with your contract","breadcrumbs":"Using Fe » Tutorials » Open auction » Summary","id":"46","title":"Summary"},"47":{"body":"Simple open auction","breadcrumbs":"Using Fe » Example Contracts » Example Contracts","id":"47","title":"Example Contracts"},"48":{"body":"// errors\nstruct AuctionAlreadyEnded {\n} struct AuctionNotYetEnded {\n} struct AuctionEndAlreadyCalled {} struct BidNotHighEnough { pub highest_bid: u256\n} // events\nstruct HighestBidIncreased { #indexed pub bidder: address pub amount: u256\n} struct AuctionEnded { #indexed pub winner: address pub amount: u256\n} contract Auction { // states auction_end_time: u256 beneficiary: address highest_bidder: address highest_bid: u256 pending_returns: Map ended: bool // constructor pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) { self.beneficiary = beneficiary_addr self.auction_end_time = ctx.block_timestamp() + bidding_time } //method pub fn bid(mut self, mut ctx: Context) { if ctx.block_timestamp() > self.auction_end_time { revert AuctionAlreadyEnded() } if ctx.msg_value() <= self.highest_bid { revert BidNotHighEnough(highest_bid: self.highest_bid) } if self.highest_bid != 0 { self.pending_returns[self.highest_bidder] += self.highest_bid } self.highest_bidder = ctx.msg_sender() self.highest_bid = ctx.msg_value() ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value())) } pub fn withdraw(mut self, mut ctx: Context) -> bool { let amount: u256 = self.pending_returns[ctx.msg_sender()] if amount > 0 { self.pending_returns[ctx.msg_sender()] = 0 ctx.send_value(to: ctx.msg_sender(), wei: amount) } return true } pub fn auction_end(mut self, mut ctx: Context) { if ctx.block_timestamp() <= self.auction_end_time { revert AuctionNotYetEnded() } if self.ended { revert AuctionEndAlreadyCalled() } self.ended = true ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid)) ctx.send_value(to: self.beneficiary, wei: self.highest_bid) } pub fn check_highest_bidder(self) -> address { return self.highest_bidder; } pub fn check_highest_bid(self) -> u256 { return self.highest_bid; } pub fn check_ended(self) -> bool { return self.ended; }\n}","breadcrumbs":"Using Fe » Example Contracts » Open auction","id":"48","title":"Using Fe"},"49":{"body":"There are not many resources for Fe outside of the official documentation at this time. This section lists useful links to external resources.","breadcrumbs":"Using Fe » Useful external links » Useful external links","id":"49","title":"Useful external links"},"5":{"body":"Let's get started with Fe! In this section you will learn how to write and deploy your first contract. Writing your first contract Deploying a contract to a testnet","breadcrumbs":"Quickstart » Quickstart","id":"5","title":"Quickstart"},"50":{"body":"VS Code extension Foundry Fe Support","breadcrumbs":"Using Fe » Useful external links » Tools","id":"50","title":"Tools"},"51":{"body":"Bountiful - Bug bounty platform written in Fe, live on Mainnet Simple DAO - A Simple DAO written in Fe - live on Mainnet and Optimism","breadcrumbs":"Using Fe » Useful external links » Projects","id":"51","title":"Projects"},"52":{"body":"These are community projects written in Fe at various hackathons. Fixed-Point Numerical Library - A fixed-point number representation and mathematical operations tailored for Fe. It can be used in financial computations, scientific simulations, and data analysis. p256verifier - Secp256r1 (a.k.a p256) curve signature verifier which allows for verification of a P256 signature in fe. Account Storage with Efficient Sparse Merkle Trees - Efficient Sparse Merkle Trees in Fe! SMTs enable inclusion and exclusion proofs for the entire set of Ethereum addresses. Tic Tac Toe - An implementation of the classic tic tac toe game in Fe with a Python frontend. Fecret Santa - Fecret Santa is an onchain Secret Santa event based on a \"chain\": gift a collectible (ERC721 or ERC1155) to the last Santa and you'll be the next to receive a gift! Go do it - A commitment device to help you achieve your goals. Powerbald - On chain lottery written in Fe sspc-flutter-fe - Stupid Simple Payment Channel written in Fe","breadcrumbs":"Using Fe » Useful external links » Hackathon projects","id":"52","title":"Hackathon projects"},"53":{"body":"Fe standard library - The Fe standard library comes bundled with the compiler but it is also a useful example for real world Fe code. Implementing an UniswapV3 trade in Fe","breadcrumbs":"Using Fe » Useful external links » Others","id":"53","title":"Others"},"54":{"body":"Fe or Solidity, which is better? by Ahmed Castro","breadcrumbs":"Using Fe » Useful external links » Blog posts","id":"54","title":"Blog posts"},"55":{"body":"Fe or Solidity, which is better? by Ahmed Castro Fe o Solidity, ¿cuál es es mejor? by Ahmed Castro","breadcrumbs":"Using Fe » Useful external links » Videos","id":"55","title":"Videos"},"56":{"body":"Read how to become a Fe developer. Build & Test Release","breadcrumbs":"Development » Development","id":"56","title":"Development"},"57":{"body":"Please make sure Rust is installed . Basic The following commands only build the Fe -> Yul compiler components. build the CLI: cargo build test: cargo test --workspace Full The Fe compiler depends on the Solidity compiler for transforming Yul IR to EVM bytecode. We currently use solc-rust to perform this. In order to compile solc-rust, the following must be installed on your system: cmake boost(1.65+) libclang brew install boost Once these have been installed, you may run the full build. This is enabled using the solc-backend feature. build the CLI: cargo build --features solc-backend test: cargo test --workspace --features solc-backend","breadcrumbs":"Development » Build & Test » Build and test","id":"57","title":"Build and test"},"58":{"body":"","breadcrumbs":"Development » Release » Release","id":"58","title":"Release"},"59":{"body":"Make sure that version follows semver rules e.g (0.23.0).","breadcrumbs":"Development » Release » Versioning","id":"59","title":"Versioning"},"6":{"body":"Before you dive in, you need to download and install Fe. For this quickstart you should simply download the binary from fe-lang.org . Then change the name and file permissions: mv fe_amd64 fe\nchmod +x fe Now you are ready to do the quickstart tutorial! For more detailed information on installing Fe, or to troubleshoot, see the Installation page in our user guide.","breadcrumbs":"Quickstart » Download and install Fe","id":"6","title":"Download and install Fe"},"60":{"body":"Prerequisite : Release notes are generated with towncrier . Ensure to have towncrier installed and the command is available. Run make notes version= where is the version we are generating the release notes for e.g. 0.23.0. Example: make notes version=0.23.0 Examine the generated release notes and if needed perform and commit any manual changes.","breadcrumbs":"Development » Release » Generate Release Notes","id":"60","title":"Generate Release Notes"},"61":{"body":"Run make release version=. Example: make release version=0.23.0 This will also run the tests again as the last step because some of them may need to be adjusted because of the changed version number.","breadcrumbs":"Development » Release » Generate the release","id":"61","title":"Generate the release"},"62":{"body":"Prerequisite : Make sure the central repository is configured as upstream, not origin. After the tests are adjusted run make push-tag to create the tag and push it to Github.","breadcrumbs":"Development » Release » Tag and push the release","id":"62","title":"Tag and push the release"},"63":{"body":"Running the previous command will push a new tag to Github and cause the CI to create a release with the Fe binaries attached. We may want to edit the release afterwards to put in some verbiage about the release.","breadcrumbs":"Development » Release » Manually edit the release on GitHub","id":"63","title":"Manually edit the release on GitHub"},"64":{"body":"A release of a new Fe compiler should usually go hand in hand with updating the website and documentation. For one, the front page of fe-lang.org links to the download of the compiler but won't automatically pick up the latest release without a fresh deployment. Furthermore, if code examples and other docs needed to be updated along with compiler changes, these updates are also only reflected online when the site gets redeployed. This is especially problematic since our docs do currently not have a version switcher to view documentation for different compiler versions ( See GitHub issue #543 ).","breadcrumbs":"Development » Release » Updating Docs & Website","id":"64","title":"Updating Docs & Website"},"65":{"body":"Run make serve-website and visit http://0.0.0.0:8000 to preview it locally. Ensure the front page displays the correct compiler version for download and that the docs render correctly.","breadcrumbs":"Development » Release » Preview the sites locally","id":"65","title":"Preview the sites locally"},"66":{"body":"Prerequisite : Make sure the central repository is configured as upstream, not origin. Run make deploy-website and validate that fe-lang.org renders the updated sites (Can take up to a few minutes).","breadcrumbs":"Development » Release » Deploy website & docs","id":"66","title":"Deploy website & docs"},"67":{"body":"The standard library includes commonly used algorithms and data structures that come bundled as part of the language. Precompiles","breadcrumbs":"Standard Library » Fe Standard Library","id":"67","title":"Fe Standard Library"},"68":{"body":"Precompiles are EVM functions that are prebuilt and optimized as part of the Fe standard library. There are currently nine precompiles available in Fe. The first four precompiles were defined in the original Ethereum Yellow Paper (ec_recover, SHA2_256, ripemd_160, identity). Four more were added during the Byzantium fork (mod_exp, ec_add, ec_mul and ec_pairing). A final precompile, blake2f was added in EIP-152 during the Istanbul fork . The nine precompiles available in the Fe standard library are: ec_recover SHA2 256 ripemd160 identity mod_exp ec_add ec_mul ec_pairing blake2f These precompiles are imported as follows: use std::precompiles","breadcrumbs":"Standard Library » Precompiles » Precompiles","id":"68","title":"Precompiles"},"69":{"body":"ec_recover is a cryptographic function that retrieves a signer's address from a signed message. It is the fundamental operation used for verifying signatures in Ethereum. Ethereum uses the Elliptic Curve Digital Signature Algorithm (ECDSA) for verifying signatures. This algorithm uses two parameters, r and s. Ethereum's implementation also uses an additional 'recovery identifier' parameter, v, which is used to identify the correct elliptic curve point from those that can be calculated from r and s alone.","breadcrumbs":"Standard Library » Precompiles » ec_recover","id":"69","title":"ec_recover"},"7":{"body":"Now that we have the compiler installed let's write our first contract. A contract contains the code that will be deployed to the Ethereum blockchain and resides at a specific address. The code of the contract dictates how: it manipulates its own state interacts with other contracts exposes external APIs to be called from other contracts or users To keep things simple we will just write a basic guestbook where people can leave a message associated with their Ethereum address. Note: Real code would not instrument the Ethereum blockchain in such a way as it is a waste of precious resources. This code is for demo purposes only.","breadcrumbs":"Quickstart » Write your first contract » Write your first Fe contract","id":"7","title":"Write your first Fe contract"},"70":{"body":"hash: the hash of the signed message, u256 v: the recovery identifier, a number in the range 27-30, u256 r: elliptic curve parameter, u256 s: elliptic curve parameter, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"70","title":"Parameters"},"71":{"body":"ec_recover returns an address.","breadcrumbs":"Standard Library » Precompiles » Returns","id":"71","title":"Returns"},"72":{"body":"pub fn ec_recover(hash: u256, v: u256, r: u256, s: u256) -> address","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"72","title":"Function signature"},"73":{"body":"let result: address = precompiles::ec_recover( hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3, v: 28, r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608, s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"73","title":"Example"},"74":{"body":"SHA2_256 is a hash function. a hash function generates a unique string of characters of fixed length from arbitrary input data.","breadcrumbs":"Standard Library » Precompiles » SHA2_256","id":"74","title":"SHA2_256"},"75":{"body":"buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"75","title":"Parameters"},"76":{"body":"SHA2_256 returns a hash as a u256","breadcrumbs":"Standard Library » Precompiles » Returns","id":"76","title":"Returns"},"77":{"body":"pub fn sha2_256(buf input_buf: MemoryBuffer) -> u256","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"77","title":"Function signature"},"78":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)\nlet result: u256 = precompiles::sha2_256(buf)","breadcrumbs":"Standard Library » Precompiles » Example","id":"78","title":"Example"},"79":{"body":"ripemd_160 is a hash function that is rarely used in Ethereum, but is included in many crypto libraries as it is used in Bitcoin core.","breadcrumbs":"Standard Library » Precompiles » ripemd_160","id":"79","title":"ripemd_160"},"8":{"body":"Fe code is written in files ending on the .fe file extension. Let's create a file guest_book.fe and put in the following content. contract GuestBook { messages: Map>\n} Here we're using a map to associate messages with Ethereum addresses. The messages will simply be a string of a maximum length of 100 written as String<100>. The addresses are represented by the builtin address type. Execute ./fe build guest_book.fe to compile the file. The compiler tells us that it compiled our contract and that it has put the artifacts into a subdirectory called output. Compiled guest_book.fe. Outputs in `output` If we examine the output directory we'll find a subdirectory GuestBook with a GuestBook_abi.json and a GuestBook.bin file. ├── fe\n├── guest_book.fe\n└── output └── GuestBook ├── GuestBook_abi.json └── GuestBook.bin The GuestBook_abi.json is a JSON representation that describes the binary interface of our contract but since our contract doesn't yet expose anything useful its content for now resembles an empty array. The GuestBook.bin is slightly more interesting containing what looks like a gibberish of characters which in fact is the compiled binary contract code written in hexadecimal characters. We don't need to do anything further yet with these files that the compiler produces but they will become important when we get to the point where we want to deploy our code to the Ethereum blockchain.","breadcrumbs":"Quickstart » Write your first contract » Create a guest_book.fe file","id":"8","title":"Create a guest_book.fe file"},"80":{"body":"input_buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"80","title":"Parameters"},"81":{"body":"ripemd_160 returns a hash as a u256","breadcrumbs":"Standard Library » Precompiles » Returns","id":"81","title":"Returns"},"82":{"body":"pub fn ripemd_160(buf input_buf: MemoryBuffer) -> u256","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"82","title":"Function signature"},"83":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)\nlet result: u256 = precompiles::ripemd_160(buf)","breadcrumbs":"Standard Library » Precompiles » Example","id":"83","title":"Example"},"84":{"body":"identity is a function that simply echoes the input of the function as its output. This can be used for efficient data copying.","breadcrumbs":"Standard Library » Precompiles » identity","id":"84","title":"identity"},"85":{"body":"input_buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"85","title":"Parameters"},"86":{"body":"identity returns a sequence of bytes, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Returns","id":"86","title":"Returns"},"87":{"body":"pub fn identity(buf input_buf: MemoryBuffer) -> MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"87","title":"Function signature"},"88":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0x42)\nlet mut result: MemoryBufferReader = precompiles::identity(buf).reader()","breadcrumbs":"Standard Library » Precompiles » Example","id":"88","title":"Example"},"89":{"body":"mod_exp is a modular exponentiation function required for elliptic curve operations.","breadcrumbs":"Standard Library » Precompiles » mod_exp","id":"89","title":"mod_exp"},"9":{"body":"Let's focus on the functionality of our world changing application and add a method to sign the guestbook. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg }\n} In Fe, every method that is defined without the pub keyword becomes private. Since we want people to interact with our contract and call the sign method we have to prefix it with pub. Let's recompile the contract again and see what happens. Failed to write output to directory: `output`. Error: Directory 'output' is not empty. Use --overwrite to overwrite. Oops, the compiler is telling us that the output directory is a non-empty directory and plays it safe by asking us if we are sure that we want to overwrite it. We have to use the --overwrite flag to allow the compiler to overwrite what is stored in the output directory. Let's try it again with ./fe build guest_book.fe --overwrite. This time it worked and we can also see that the GuestBook_abi.json has become slightly more interesting. [ { \"name\": \"sign\", \"type\": \"function\", \"inputs\": [ { \"name\": \"book_msg\", \"type\": \"bytes100\" } ], \"outputs\": [] }\n] Since our contract now has a public sign method the corresponding ABI has changed accordingly.","breadcrumbs":"Quickstart » Write your first contract » Add a method to sign the guest book","id":"9","title":"Add a method to sign the guest book"},"90":{"body":"b: MemoryBuffer: the base (i.e. the number being raised to a power), MemoryBuffer e: MemoryBuffer: the exponent (i.e. the power b is raised to), MemoryBuffer m: MemoryBuffer: the modulus, MemoryBuffer b_size: u256: the length of b in bytes, u256 e_size: u256: the length of e in bytes, u256 m_size: u256: then length of m in bytes, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"90","title":"Parameters"},"91":{"body":"mod_exp returns a sequence of bytes, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Returns","id":"91","title":"Returns"},"92":{"body":"pub fn mod_exp( b_size: u256, e_size: u256, m_size: u256, b: MemoryBuffer, e: MemoryBuffer, m: MemoryBuffer,\n) -> MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"92","title":"Function signature"},"93":{"body":"let mut result: MemoryBufferReader = precompiles::mod_exp( b_size: 1, e_size: 1, m_size: 1, b: MemoryBuffer::from_u8(value: 8), e: MemoryBuffer::from_u8(value: 9), m: MemoryBuffer::from_u8(value: 10),\n).reader()","breadcrumbs":"Standard Library » Precompiles » Example","id":"93","title":"Example"},"94":{"body":"ec_add does point addition on elliptic curves.","breadcrumbs":"Standard Library » Precompiles » ec_add","id":"94","title":"ec_add"},"95":{"body":"x1: x-coordinate 1, u256 y1: y coordinate 1, u256 x2: x coordinate 2, u256 y2: y coordinate 2, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"95","title":"Parameters"},"96":{"body":"pub fn ec_add(x1: u256, y1: u256, x2: u256, y2: u256)-> (u256,u256)","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"96","title":"Function signature"},"97":{"body":"ec_add returns a tuple of u256, (u256, u256).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"97","title":"Returns"},"98":{"body":"let (x, y): (u256, u256) = precompiles::ec_add(x1: 1, y1: 2, x2: 1, y2: 2)","breadcrumbs":"Standard Library » Precompiles » Example","id":"98","title":"Example"},"99":{"body":"ec_mul is for multiplying elliptic curve points.","breadcrumbs":"Standard Library » Precompiles » ec_mul","id":"99","title":"ec_mul"}},"length":331,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{"1":{".":{"0":{"df":3,"docs":{"158":{"tf":1.0},"296":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":2,"docs":{"247":{"tf":1.0},"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":2,"docs":{"236":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":3,"docs":{"229":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":2,"docs":{"225":{"tf":1.0},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.0}}},"1":{"8":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"0":{"0":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.0},"267":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"2":{"df":4,"docs":{"236":{"tf":1.0},"257":{"tf":1.0},"274":{"tf":1.0},"311":{"tf":1.0}}},"3":{"df":3,"docs":{"218":{"tf":1.0},"257":{"tf":1.0},"307":{"tf":1.0}}},"4":{"df":3,"docs":{"232":{"tf":1.0},"254":{"tf":1.4142135623730951},"303":{"tf":1.0}}},"5":{"df":6,"docs":{"232":{"tf":1.0},"239":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.4142135623730951},"298":{"tf":1.0}}},"6":{"df":3,"docs":{"229":{"tf":1.0},"242":{"tf":1.0},"295":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"291":{"tf":1.0}}},"8":{"df":2,"docs":{"225":{"tf":1.0},"286":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"1":{"1":{"_":{"1":{"0":{"0":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"6":{"4":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":30,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"127":{"tf":2.0},"16":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.4142135623730951},"190":{"tf":2.449489742783178},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":3.0},"237":{"tf":1.0},"240":{"tf":2.449489742783178},"243":{"tf":2.23606797749979},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.7320508075688772}},"o":{"7":{"0":{"df":1,"docs":{"127":{"tf":1.0}}},"7":{"df":2,"docs":{"124":{"tf":1.0},"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"1":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"6":{"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"112":{"tf":4.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"…":{"0":{"0":{"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"204":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"171":{"tf":1.0},"204":{"tf":1.0},"292":{"tf":1.0}}},"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"c":{"3":{"7":{"9":{"a":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"1":{"0":{"5":{"8":{"a":{"3":{"1":{"4":{"1":{"8":{"2":{"2":{"9":{"8":{"5":{"7":{"3":{"3":{"c":{"b":{"d":{"d":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"d":{"0":{"df":0,"docs":{},"f":{"d":{"8":{"d":{"6":{"c":{"1":{"0":{"4":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"b":{"df":0,"docs":{},"f":{"5":{"a":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"9":{"a":{"b":{"1":{"6":{"3":{"b":{"c":{"7":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"3":{"4":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}},"9":{"7":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"4":{"7":{"1":{"b":{"0":{"9":{"df":0,"docs":{},"f":{"a":{"9":{"3":{"c":{"a":{"a":{"df":0,"docs":{},"f":{"1":{"3":{"c":{"b":{"df":0,"docs":{},"f":{"4":{"4":{"3":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"0":{"9":{"c":{"c":{"4":{"3":{"2":{"8":{"df":0,"docs":{},"f":{"5":{"a":{"6":{"2":{"a":{"a":{"d":{"4":{"5":{"df":0,"docs":{},"f":{"4":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"6":{"c":{"3":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"c":{"6":{"8":{"0":{"5":{"9":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"9":{"b":{"b":{"4":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"b":{"9":{"df":0,"docs":{},"e":{"4":{"4":{"df":0,"docs":{},"e":{"2":{"a":{"3":{"2":{"2":{"3":{"4":{"d":{"a":{"8":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"6":{"1":{"c":{"d":{"6":{"3":{"9":{"1":{"9":{"3":{"5":{"4":{"b":{"c":{"0":{"6":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"1":{"df":0,"docs":{},"e":{"3":{"c":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"b":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"126":{"tf":1.0}}}},"2":{"2":{"6":{"0":{"6":{"8":{"4":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"8":{"6":{"7":{"9":{"3":{"9":{"1":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"df":0,"docs":{},"e":{"2":{"1":{"d":{"df":0,"docs":{},"f":{"5":{"4":{"4":{"c":{"3":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"2":{"df":0,"docs":{},"f":{"3":{"5":{"0":{"4":{"d":{"df":0,"docs":{},"e":{"8":{"a":{"7":{"9":{"d":{"9":{"1":{"5":{"9":{"df":0,"docs":{},"e":{"c":{"a":{"2":{"d":{"9":{"8":{"d":{"9":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"a":{"8":{"df":0,"docs":{},"e":{"b":{"0":{"b":{"0":{"9":{"9":{"6":{"2":{"5":{"2":{"c":{"b":{"5":{"4":{"8":{"a":{"4":{"4":{"8":{"7":{"d":{"a":{"9":{"7":{"b":{"0":{"2":{"4":{"2":{"2":{"df":0,"docs":{},"e":{"b":{"c":{"0":{"df":0,"docs":{},"e":{"8":{"3":{"4":{"6":{"1":{"3":{"df":0,"docs":{},"f":{"9":{"5":{"4":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"7":{"df":0,"docs":{},"e":{"0":{"a":{"df":0,"docs":{},"f":{"d":{"c":{"1":{"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"2":{"3":{"a":{"df":0,"docs":{},"f":{"9":{"a":{"5":{"c":{"df":0,"docs":{},"e":{"2":{"b":{"a":{"2":{"7":{"9":{"6":{"c":{"1":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"4":{"5":{"3":{"a":{"3":{"7":{"0":{"df":0,"docs":{},"e":{"b":{"0":{"a":{"df":0,"docs":{},"f":{"8":{"c":{"2":{"1":{"2":{"d":{"9":{"d":{"c":{"9":{"a":{"c":{"d":{"8":{"df":0,"docs":{},"f":{"c":{"0":{"2":{"c":{"2":{"df":0,"docs":{},"e":{"9":{"0":{"7":{"b":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"3":{"6":{"8":{"df":0,"docs":{},"e":{"2":{"8":{"3":{"8":{"1":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"c":{"c":{"b":{"5":{"df":0,"docs":{},"f":{"a":{"8":{"1":{"df":0,"docs":{},"f":{"c":{"2":{"6":{"c":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"f":{"0":{"4":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"b":{"df":0,"docs":{},"f":{"d":{"d":{"8":{"5":{"d":{"7":{"df":0,"docs":{},"e":{"d":{"3":{"a":{"b":{"3":{"6":{"9":{"8":{"d":{"6":{"3":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"9":{"0":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"8":{"9":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"f":{"3":{"6":{"df":0,"docs":{},"e":{"3":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"0":{"df":0,"docs":{},"f":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"5":{"2":{"1":{"1":{"0":{"c":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"9":{"1":{"0":{"8":{"9":{"2":{"4":{"9":{"2":{"6":{"df":0,"docs":{},"e":{"4":{"5":{"df":0,"docs":{},"f":{"0":{"b":{"0":{"c":{"8":{"6":{"8":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"d":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"1":{"6":{"d":{"3":{"2":{"4":{"2":{"d":{"c":{"7":{"1":{"5":{"df":0,"docs":{},"f":{"6":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"4":{"4":{"4":{"9":{"9":{"d":{"5":{"d":{"2":{"7":{"b":{"b":{"1":{"8":{"6":{"3":{"0":{"8":{"b":{"7":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"df":0,"docs":{},"f":{"0":{"2":{"a":{"c":{"5":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"6":{"a":{"3":{"d":{"1":{"4":{"7":{"c":{"1":{"8":{"6":{"b":{"2":{"1":{"df":0,"docs":{},"f":{"b":{"1":{"b":{"7":{"6":{"df":0,"docs":{},"e":{"1":{"8":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"0":{"2":{"df":0,"docs":{},"e":{"4":{"7":{"8":{"8":{"7":{"5":{"0":{"7":{"a":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"7":{"4":{"3":{"c":{"b":{"a":{"c":{"6":{"b":{"a":{"2":{"9":{"1":{"df":0,"docs":{},"e":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"9":{"b":{"df":0,"docs":{},"e":{"6":{"b":{"d":{"7":{"6":{"3":{"9":{"5":{"0":{"b":{"b":{"1":{"6":{"0":{"4":{"1":{"a":{"0":{"a":{"8":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"0":{"6":{"4":{"4":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"a":{"0":{"2":{"9":{"b":{"8":{"5":{"0":{"4":{"5":{"b":{"6":{"8":{"1":{"8":{"1":{"5":{"8":{"5":{"d":{"9":{"7":{"8":{"1":{"6":{"a":{"9":{"1":{"6":{"8":{"7":{"1":{"c":{"a":{"8":{"d":{"3":{"c":{"2":{"0":{"8":{"c":{"1":{"6":{"d":{"8":{"7":{"c":{"df":0,"docs":{},"f":{"d":{"4":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"b":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"7":{"7":{"8":{"0":{"1":{"c":{"1":{"5":{"b":{"b":{"7":{"5":{"3":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"b":{"9":{"df":0,"docs":{},"e":{"3":{"3":{"d":{"c":{"b":{"6":{"1":{"3":{"c":{"9":{"3":{"c":{"b":{"df":0,"docs":{},"e":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"b":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"e":{"c":{"a":{"b":{"8":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"b":{"4":{"1":{"a":{"4":{"1":{"7":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"b":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"8":{"1":{"4":{"9":{"5":{"9":{"b":{"2":{"c":{"1":{"4":{"7":{"3":{"6":{"6":{"b":{"6":{"3":{"2":{"3":{"df":0,"docs":{},"f":{"1":{"7":{"b":{"6":{"df":0,"docs":{},"f":{"7":{"0":{"6":{"0":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"2":{"4":{"b":{"5":{"8":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"a":{"7":{"c":{"a":{"8":{"4":{"8":{"5":{"a":{"df":0,"docs":{},"e":{"6":{"7":{"b":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"b":{"d":{"df":0,"docs":{},"e":{"2":{"a":{"9":{"9":{"4":{"b":{"df":0,"docs":{},"f":{"2":{"d":{"df":0,"docs":{},"e":{"c":{"8":{"c":{"1":{"1":{"df":0,"docs":{},"f":{"b":{"0":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"9":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"0":{"df":0,"docs":{},"f":{"a":{"1":{"1":{"5":{"0":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"b":{"8":{"df":0,"docs":{},"f":{"3":{"3":{"c":{"1":{"3":{"0":{"b":{"4":{"5":{"6":{"1":{"0":{"5":{"2":{"6":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"4":{"2":{"df":1,"docs":{"88":{"tf":1.0}}},"5":{"6":{"df":0,"docs":{},"e":{"9":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"df":0,"docs":{},"e":{"1":{"9":{"7":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"3":{"df":0,"docs":{},"e":{"8":{"5":{"a":{"3":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"0":{"4":{"9":{"a":{"3":{"b":{"a":{"3":{"4":{"c":{"2":{"2":{"8":{"9":{"b":{"4":{"c":{"8":{"6":{"0":{"df":0,"docs":{},"f":{"c":{"0":{"b":{"0":{"c":{"6":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"8":{"c":{"9":{"b":{"d":{"df":0,"docs":{},"f":{"2":{"6":{"7":{"df":0,"docs":{},"e":{"6":{"0":{"9":{"6":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"2":{"0":{"6":{"5":{"6":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"7":{"6":{"8":{"2":{"0":{"4":{"5":{"7":{"4":{"6":{"8":{"6":{"5":{"7":{"2":{"2":{"0":{"7":{"0":{"7":{"2":{"6":{"df":0,"docs":{},"f":{"7":{"6":{"6":{"9":{"6":{"4":{"6":{"5":{"6":{"4":{"2":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"f":{"8":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"d":{"7":{"5":{"3":{"5":{"2":{"4":{"8":{"d":{"0":{"b":{"d":{"4":{"4":{"8":{"2":{"9":{"8":{"c":{"c":{"2":{"df":0,"docs":{},"e":{"2":{"0":{"7":{"1":{"df":0,"docs":{},"e":{"5":{"6":{"9":{"9":{"2":{"d":{"0":{"7":{"7":{"4":{"d":{"c":{"3":{"4":{"0":{"c":{"3":{"6":{"8":{"a":{"df":0,"docs":{},"e":{"9":{"5":{"0":{"8":{"5":{"2":{"a":{"d":{"a":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":0,"docs":{},"f":{"b":{"d":{"b":{"2":{"3":{"1":{"5":{"6":{"7":{"8":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"b":{"3":{"6":{"7":{"df":0,"docs":{},"f":{"0":{"3":{"2":{"d":{"9":{"3":{"df":0,"docs":{},"f":{"6":{"4":{"2":{"df":0,"docs":{},"f":{"6":{"4":{"1":{"8":{"0":{"a":{"a":{"3":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"0":{"0":{"0":{"8":{".":{".":{"7":{"6":{"b":{"9":{"0":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"6":{"2":{"6":{"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"7":{"5":{"4":{"7":{"4":{"df":0,"docs":{},"e":{"8":{"9":{"0":{"9":{"4":{"c":{"4":{"4":{"d":{"a":{"9":{"8":{"b":{"9":{"5":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"a":{"c":{"4":{"9":{"5":{"2":{"7":{"1":{"d":{"0":{"df":0,"docs":{},"f":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"4":{"1":{"df":0,"docs":{},"f":{"b":{"a":{"b":{"d":{"9":{"8":{"3":{"1":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"b":{"6":{"a":{"6":{"0":{"c":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"6":{"df":0,"docs":{},"f":{"0":{"6":{"5":{"7":{"5":{"3":{"d":{"8":{"d":{"c":{"b":{"9":{"6":{"5":{"3":{"d":{"b":{"a":{"d":{"3":{"5":{"df":1,"docs":{"45":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"1":{"7":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"9":{"c":{"d":{"df":0,"docs":{},"e":{"0":{"5":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"126":{"tf":1.0}}}},"8":{"1":{"0":{"c":{"b":{"d":{"4":{"3":{"6":{"5":{"3":{"9":{"6":{"1":{"6":{"5":{"8":{"7":{"4":{"c":{"0":{"5":{"4":{"d":{"0":{"1":{"b":{"1":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"4":{"c":{"c":{"2":{"4":{"9":{"2":{"6":{"5":{"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"4":{"2":{"6":{"8":{"5":{"b":{"df":0,"docs":{},"f":{"1":{"6":{"1":{"7":{"9":{"3":{"c":{"c":{"2":{"5":{"6":{"0":{"3":{"c":{"2":{"3":{"1":{"b":{"c":{"2":{"df":0,"docs":{},"f":{"5":{"6":{"8":{"df":0,"docs":{},"e":{"b":{"6":{"3":{"0":{"df":0,"docs":{},"e":{"a":{"1":{"6":{"a":{"a":{"1":{"3":{"7":{"d":{"2":{"6":{"6":{"4":{"a":{"c":{"8":{"0":{"3":{"8":{"8":{"2":{"5":{"6":{"0":{"8":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"b":{"2":{"8":{"6":{"8":{"9":{"8":{"4":{"8":{"4":{"a":{"df":0,"docs":{},"e":{"7":{"3":{"7":{"d":{"2":{"2":{"8":{"3":{"8":{"df":0,"docs":{},"e":{"2":{"7":{"b":{"2":{"9":{"8":{"9":{"9":{"b":{"3":{"2":{"7":{"8":{"0":{"4":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"3":{"0":{"9":{"df":0,"docs":{},"e":{"4":{"7":{"a":{"7":{"5":{"b":{"1":{"8":{"c":{"df":0,"docs":{},"f":{"d":{"7":{"d":{"5":{"9":{"5":{"c":{"c":{"7":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"b":{"5":{"7":{"8":{"2":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"6":{"d":{"d":{"4":{"df":0,"docs":{},"f":{"b":{"d":{"3":{"a":{"7":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"a":{"d":{"b":{"5":{"9":{"4":{"b":{"8":{"4":{"d":{"7":{"7":{"0":{"df":0,"docs":{},"f":{"5":{"6":{"df":0,"docs":{},"f":{"3":{"9":{"3":{"df":0,"docs":{},"f":{"1":{"3":{"7":{"7":{"8":{"5":{"a":{"5":{"2":{"7":{"0":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"1":{"8":{"2":{"df":0,"docs":{},"e":{"6":{"a":{"d":{"7":{"df":0,"docs":{},"f":{"5":{"2":{"0":{"df":0,"docs":{},"e":{"5":{"1":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"f":{"b":{"a":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"127":{"tf":1.4142135623730951},"45":{"tf":1.0}},"f":{"0":{"a":{"d":{"b":{"b":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"1":{"3":{"5":{"d":{"1":{"5":{"0":{"9":{"a":{"d":{"0":{"3":{"9":{"5":{"0":{"5":{"b":{"a":{"d":{"a":{"9":{"4":{"2":{"d":{"1":{"8":{"7":{"5":{"5":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"3":{"6":{"1":{"d":{"5":{"df":0,"docs":{},"f":{"3":{"a":{"df":0,"docs":{},"f":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"5":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"233":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"233":{"tf":1.0}}}}}}}},"f":{"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.0},"299":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0}}}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"0":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"177":{"tf":1.0}}},"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"144":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}},"1":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"131":{"tf":1.0},"134":{"tf":1.4142135623730951},"141":{"tf":1.0},"178":{"tf":1.0},"18":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"296":{"tf":1.0},"45":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}},"1":{"5":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"182":{"tf":1.0}}},"df":25,"docs":{"131":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"205":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.7320508075688772},"258":{"tf":2.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"295":{"tf":1.0},"299":{"tf":1.0},"45":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"df":4,"docs":{"131":{"tf":1.0},"183":{"tf":2.449489742783178},"218":{"tf":1.0},"265":{"tf":1.4142135623730951}}},"2":{"3":{"df":2,"docs":{"127":{"tf":1.0},"183":{"tf":1.4142135623730951}}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"280":{"tf":1.0}}},"8":{"df":2,"docs":{"132":{"tf":1.0},"280":{"tf":1.7320508075688772}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":7,"docs":{"112":{"tf":1.0},"182":{"tf":1.7320508075688772},"183":{"tf":1.7320508075688772},"239":{"tf":1.0},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"68":{"tf":1.0}}},"5":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"1":{"df":1,"docs":{"230":{"tf":1.0}}},"2":{"df":1,"docs":{"317":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"318":{"tf":1.0}}},"df":4,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"182":{"tf":1.0},"233":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"7":{"df":1,"docs":{"317":{"tf":1.0}}},"8":{"df":1,"docs":{"318":{"tf":1.0}}},"9":{"df":1,"docs":{"310":{"tf":1.0}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"5":{"df":1,"docs":{"317":{"tf":1.0}}},"6":{"9":{"9":{"2":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"2":{"3":{"4":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":42,"docs":{"103":{"tf":1.0},"115":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"190":{"tf":3.4641016151377544},"191":{"tf":1.0},"210":{"tf":1.0},"222":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"326":{"tf":1.0},"93":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"1":{"8":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"2":{".":{"0":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":1,"docs":{"258":{"tf":1.7320508075688772}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"1":{"df":12,"docs":{"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"2":{"df":8,"docs":{"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951}}},"3":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"236":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"df":1,"docs":{"314":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"193":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"315":{"tf":1.0},"40":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"7":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"4":{"df":1,"docs":{"268":{"tf":1.0}}},"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"313":{"tf":1.0}}},"df":1,"docs":{"182":{"tf":1.0}}},"2":{"2":{"df":1,"docs":{"309":{"tf":1.0}}},"5":{"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"190":{"tf":1.0}}},"9":{"df":1,"docs":{"312":{"tf":1.0}}},"df":1,"docs":{"183":{"tf":1.0}}},"4":{"1":{"df":2,"docs":{"252":{"tf":1.0},"253":{"tf":1.0}}},"3":{"df":1,"docs":{"314":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":1,"docs":{"307":{"tf":1.0}}},"5":{"0":{"df":2,"docs":{"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"314":{"tf":1.0}}},"3":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":2,"docs":{"240":{"tf":1.0},"312":{"tf":1.0}}},"6":{"df":7,"docs":{"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":2,"docs":{"173":{"tf":1.0},"182":{"tf":1.7320508075688772}}},"6":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"190":{"tf":1.0},"312":{"tf":1.0}}},"5":{"df":1,"docs":{"312":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"5":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"221":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"248":{"tf":1.0},"283":{"tf":1.0}}},"7":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"308":{"tf":1.0}}},"6":{"df":1,"docs":{"308":{"tf":1.0}}},"df":6,"docs":{"190":{"tf":1.4142135623730951},"245":{"tf":1.0},"291":{"tf":1.0},"298":{"tf":1.0},"311":{"tf":1.0},"70":{"tf":1.0}}},"8":{"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":5,"docs":{"190":{"tf":1.0},"230":{"tf":1.0},"236":{"tf":1.0},"303":{"tf":1.0},"73":{"tf":1.0}}},"9":{"6":{"df":1,"docs":{"308":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.0},"282":{"tf":1.0}}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":23,"docs":{"103":{"tf":1.4142135623730951},"109":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.0},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"211":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":2.23606797749979},"327":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"299":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"3":{"df":1,"docs":{"308":{"tf":1.0}}},"5":{"df":1,"docs":{"310":{"tf":1.0}}},"7":{"df":1,"docs":{"309":{"tf":1.0}}},"df":5,"docs":{"227":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"278":{"tf":1.0},"286":{"tf":1.0}}},"2":{"0":{"df":2,"docs":{"231":{"tf":1.0},"309":{"tf":1.0}}},"3":{"df":1,"docs":{"309":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"7":{"df":1,"docs":{"310":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":3,"docs":{"141":{"tf":1.0},"230":{"tf":1.7320508075688772},"258":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"299":{"tf":1.0}}},"5":{"df":1,"docs":{"305":{"tf":1.0}}},"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"268":{"tf":1.0}}},"6":{"df":1,"docs":{"304":{"tf":1.0}}},"7":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"7":{"8":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"7":{"6":{"7":{"5":{"9":{"6":{"7":{"2":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"7":{"df":1,"docs":{"302":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"301":{"tf":1.0}}},"7":{"df":1,"docs":{"255":{"tf":1.0}}},"8":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"161":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"18":{"tf":1.0},"182":{"tf":2.23606797749979},"192":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.0},"328":{"tf":1.0}}},"4":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"300":{"tf":1.0}}},"3":{"df":1,"docs":{"301":{"tf":1.0}}},"6":{"df":2,"docs":{"299":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":12,"docs":{"130":{"tf":1.4142135623730951},"189":{"tf":1.0},"201":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"243":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"283":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"df":1,"docs":{"296":{"tf":1.0}}},"5":{"df":1,"docs":{"296":{"tf":1.0}}},"7":{"df":1,"docs":{"297":{"tf":1.0}}},"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"df":1,"docs":{"249":{"tf":1.0}}},"4":{"df":1,"docs":{"293":{"tf":1.0}}},"5":{"df":1,"docs":{"293":{"tf":1.0}}},"8":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"292":{"tf":1.0}}},"8":{"df":2,"docs":{"287":{"tf":1.0},"288":{"tf":1.0}}},"9":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"1":{"df":2,"docs":{"279":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":2,"docs":{"292":{"tf":1.0},"294":{"tf":1.0}}},"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"290":{"tf":1.0}}},"8":{"df":1,"docs":{"272":{"tf":1.0}}},"9":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"288":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":7,"docs":{"160":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.4142135623730951},"213":{"tf":1.0},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"329":{"tf":1.0}}},"5":{"0":{"0":{"0":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}},"df":2,"docs":{"178":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"252":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"288":{"tf":1.0}}},"4":{"df":1,"docs":{"289":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"df":2,"docs":{"189":{"tf":1.4142135623730951},"312":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"284":{"tf":1.0}}},"4":{"df":1,"docs":{"284":{"tf":1.0}}},"5":{"df":1,"docs":{"284":{"tf":1.0}}},"9":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"3":{"df":1,"docs":{"64":{"tf":1.0}}},"6":{"df":1,"docs":{"284":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"1":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"9":{"df":1,"docs":{"279":{"tf":1.0}}},"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"275":{"tf":1.0}}},"8":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"250":{"tf":1.0}}},"6":{"df":2,"docs":{"276":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":9,"docs":{"163":{"tf":1.0},"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.0},"243":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0}}},"6":{"0":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":1,"docs":{"271":{"tf":1.0}}},"6":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"268":{"tf":1.0}}},"2":{"df":1,"docs":{"268":{"tf":1.0}}},"3":{"df":1,"docs":{"269":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"243":{"tf":1.0}}},"6":{"df":1,"docs":{"258":{"tf":1.0}}},"8":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"5":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"6":{"5":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"7":{"7":{"df":1,"docs":{"265":{"tf":1.0}}},"9":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"8":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"2":{"df":1,"docs":{"250":{"tf":1.0}}},"4":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":2.0},"275":{"tf":1.0}}},"7":{"0":{"3":{"df":1,"docs":{"243":{"tf":1.0}}},"5":{"df":1,"docs":{"249":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"246":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"247":{"tf":1.0}}},"3":{"df":1,"docs":{"247":{"tf":1.0}}},"6":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"4":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"244":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"5":{"7":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.0}}},"9":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"241":{"tf":1.0}}},"5":{"df":1,"docs":{"241":{"tf":1.0}}},"6":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"8":{"3":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.0}}},"8":{"0":{"1":{"df":1,"docs":{"241":{"tf":1.0}}},"3":{"df":1,"docs":{"237":{"tf":1.0}}},"5":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"233":{"tf":1.0}}},"df":1,"docs":{"258":{"tf":1.0}}},"1":{"5":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"3":{"6":{"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"8":{"3":{"6":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":2,"docs":{"163":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"5":{"3":{"df":1,"docs":{"235":{"tf":1.0}}},"4":{"5":{"df":2,"docs":{"15":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"234":{"tf":1.0}}},"3":{"df":1,"docs":{"233":{"tf":1.0}}},"4":{"df":1,"docs":{"233":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"7":{"df":1,"docs":{"231":{"tf":1.0}}},"df":0,"docs":{}},"8":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"df":1,"docs":{"231":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"9":{"8":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.0},"130":{"tf":1.0},"182":{"tf":1.0},"197":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"280":{"tf":1.4142135623730951},"40":{"tf":1.0},"93":{"tf":1.0}}},"9":{"0":{"8":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"228":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"9":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"223":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"224":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"220":{"tf":1.0}}},"7":{"df":1,"docs":{"219":{"tf":1.0}}},"8":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"120":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951},"182":{"tf":1.0},"93":{"tf":1.0}}},"_":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"_":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"268":{"tf":1.0}}}}}}},"df":3,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"231":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{",":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"139":{"tf":2.0},"296":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"(":{"a":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"120":{"tf":2.6457513110645907},"124":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":2.0},"170":{"tf":1.0},"173":{"tf":1.0},"187":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"255":{"tf":2.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"137":{"tf":1.0},"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"a":{".":{"df":0,"docs":{},"k":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"b":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{",":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"131":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"213":{"tf":1.0}}},"df":14,"docs":{"131":{"tf":1.0},"146":{"tf":2.23606797749979},"240":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0},"294":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"df":2,"docs":{"141":{"tf":1.0},"275":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"143":{"tf":1.0},"164":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"119":{"tf":1.0},"14":{"tf":1.0},"230":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"296":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.4142135623730951},"249":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"288":{"tf":1.0}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"216":{"tf":1.0},"275":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"323":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"320":{"tf":1.0},"323":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0}}}},"v":{"df":1,"docs":{"171":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"164":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"215":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"330":{"tf":1.0}}}}},"d":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.0}}},"6":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":2,"docs":{"141":{"tf":1.4142135623730951},"255":{"tf":1.0}}},"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"141":{"tf":1.0}}}},"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"279":{"tf":1.0}}},"x":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":21,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"148":{"tf":1.0},"19":{"tf":1.0},"211":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"312":{"tf":2.23606797749979},"40":{"tf":2.0},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"182":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"94":{"tf":1.0}}}},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":0,"docs":{},"x":{"7":{"1":{"5":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"a":{"3":{"c":{"7":{"2":{"9":{"6":{"9":{"b":{"5":{"4":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"4":{"2":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"b":{"b":{"7":{"6":{"8":{"c":{"8":{"a":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":4,"docs":{"189":{"tf":1.0},"230":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":53,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"143":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":2.23606797749979},"163":{"tf":2.0},"164":{"tf":2.0},"17":{"tf":1.7320508075688772},"173":{"tf":2.0},"177":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"187":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"19":{"tf":1.4142135623730951},"195":{"tf":2.6457513110645907},"196":{"tf":2.6457513110645907},"200":{"tf":1.4142135623730951},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":2.23606797749979},"243":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.449489742783178},"268":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"292":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":3.0},"321":{"tf":1.0},"323":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":2.0},"42":{"tf":2.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":3.3166247903554},"46":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"52":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":33,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"252":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951},"317":{"tf":1.0},"35":{"tf":1.0},"45":{"tf":1.0},"68":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"27":{"tf":1.0},"296":{"tf":1.0},"321":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"42":{"tf":1.0},"43":{"tf":1.0},"61":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"18":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"34":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":1,"docs":{"320":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"231":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"213":{"tf":1.0},"22":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":3,"docs":{"108":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}}}}}},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}},"s":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":1.4142135623730951},"292":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"322":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"206":{"tf":1.7320508075688772},"227":{"tf":1.0},"256":{"tf":1.0}}},"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"124":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"143":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"193":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"279":{"tf":1.4142135623730951},"28":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"328":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"143":{"tf":1.0},"69":{"tf":1.0}},"g":{"df":4,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"36":{"tf":1.0},"64":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":23,"docs":{"232":{"tf":1.0},"236":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.7320508075688772}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"14":{"tf":1.0},"309":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"143":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"16":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"211":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":2,"docs":{"279":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"149":{"tf":1.4142135623730951},"212":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":2.0},"43":{"tf":1.0},"48":{"tf":2.6457513110645907}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":5,"docs":{"266":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"52":{"tf":1.0}}}},"z":{"df":15,"docs":{"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"133":{"tf":1.4142135623730951}}}},"n":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"10":{"tf":1.0},"115":{"tf":1.0},"141":{"tf":1.0},"144":{"tf":1.0},"180":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"330":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"15":{"tf":2.23606797749979},"16":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"19":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"266":{"tf":1.0},"315":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"18":{"tf":1.0},"193":{"tf":1.0},"281":{"tf":1.0},"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"321":{"tf":1.0},"326":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"144":{"tf":1.0},"243":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"135":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"163":{"tf":1.0}}}}}}}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":3,"docs":{"184":{"tf":1.0},"288":{"tf":1.0},"323":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"211":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"215":{"tf":1.0},"216":{"tf":1.0},"315":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":2.0}}}},"r":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"193":{"tf":1.0},"212":{"tf":1.0}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"277":{"tf":1.0},"316":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":2.0},"143":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":2.0},"185":{"tf":1.7320508075688772},"234":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":3.0},"265":{"tf":1.0},"269":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"182":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}}},"m":{"df":4,"docs":{"170":{"tf":1.0},"22":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"288":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"250":{"tf":1.0},"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"192":{"tf":1.0}}},"u":{"2":{"5":{"6":{"df":11,"docs":{"161":{"tf":1.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"df":4,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":2.0},"112":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":4,"docs":{"134":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":21,"docs":{"10":{"tf":1.0},"113":{"tf":1.0},"131":{"tf":1.0},"161":{"tf":1.0},"166":{"tf":1.4142135623730951},"175":{"tf":2.0},"177":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":3.0},"196":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.4142135623730951},"269":{"tf":1.0},"271":{"tf":1.7320508075688772},"275":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"8":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"192":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"219":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":7,"docs":{"120":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"269":{"tf":1.0},"287":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"107":{"tf":1.0},"113":{"tf":1.0},"157":{"tf":1.0},"171":{"tf":2.8284271247461903},"223":{"tf":1.4142135623730951},"230":{"tf":4.123105625617661},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"292":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"171":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":14,"docs":{"113":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"161":{"tf":2.449489742783178},"162":{"tf":2.0},"177":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":2.0},"250":{"tf":1.0},"265":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":2.23606797749979},"41":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"168":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.7320508075688772},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"148":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.4142135623730951},"271":{"tf":1.0},"281":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"266":{"tf":1.0},"285":{"tf":1.0},"306":{"tf":1.4142135623730951},"310":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"277":{"tf":1.0},"63":{"tf":1.0}}},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"43":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"212":{"tf":1.0},"321":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":1.0},"178":{"tf":2.23606797749979},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"240":{"tf":1.0},"246":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"330":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"48":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"41":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":12,"docs":{"224":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.4142135623730951},"43":{"tf":2.8284271247461903},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.7320508075688772},"304":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"219":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"144":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"31":{"tf":1.0},"43":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":13,"docs":{"12":{"tf":1.0},"197":{"tf":1.0},"206":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"330":{"tf":1.4142135623730951},"60":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"327":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"b":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"39":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"26":{"tf":1.7320508075688772},"318":{"tf":1.0},"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":1,"docs":{"269":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":6,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}},"e":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"(":{"a":{"c":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"177":{"tf":1.0}},"u":{"df":1,"docs":{"293":{"tf":1.0}}}},"n":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.7320508075688772},"329":{"tf":1.4142135623730951}}},"r":{"'":{"df":1,"docs":{"204":{"tf":1.0}}},"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"231":{"tf":1.0}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"170":{"tf":1.0},"250":{"tf":1.0},"283":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":4,"docs":{"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"288":{"tf":1.0},"316":{"tf":1.0}},"u":{"df":3,"docs":{"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}},".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"159":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"231":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"280":{"tf":1.4142135623730951},"305":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951}},"k":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"b":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"133":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"187":{"tf":1.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"212":{"tf":1.0},"240":{"tf":1.0},"252":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}}},"i":{"c":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}},"df":8,"docs":{"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"29":{"tf":1.0},"312":{"tf":1.0},"46":{"tf":1.4142135623730951},"57":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.4142135623730951}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"177":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"283":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"2":{"6":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"]":{"[":{"0":{"df":0,"docs":{},"x":{"0":{"1":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"175":{"tf":1.0},"180":{"tf":1.0},"196":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"279":{"tf":1.0},"288":{"tf":1.0}}}},"df":14,"docs":{"115":{"tf":2.23606797749979},"162":{"tf":3.4641016151377544},"170":{"tf":1.4142135623730951},"196":{"tf":2.0},"240":{"tf":2.23606797749979},"250":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"304":{"tf":4.795831523312719},"312":{"tf":2.23606797749979},"90":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"24":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"308":{"tf":1.0},"41":{"tf":1.0},"56":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"148":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"288":{"tf":1.0},"321":{"tf":1.0},"41":{"tf":1.4142135623730951},"90":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"212":{"tf":1.0},"231":{"tf":1.0},"26":{"tf":1.0},"280":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"136":{"tf":1.0},"167":{"tf":1.0},"206":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"13":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"182":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"324":{"tf":1.0},"326":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"215":{"tf":1.0},"3":{"tf":1.0},"310":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"250":{"tf":1.0},"275":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"37":{"tf":1.0},"40":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"48":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":3,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"1":{"tf":1.0},"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"317":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"126":{"tf":1.0},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.4142135623730951},"290":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}}}},"i":{":":{":":{"b":{"a":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"253":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"37":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"36":{"tf":1.4142135623730951},"37":{"tf":2.0},"40":{"tf":1.7320508075688772},"41":{"tf":3.872983346207417},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.6457513110645907},"46":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}}}}}}}}}}}},"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":12,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"182":{"tf":1.4142135623730951},"217":{"tf":1.0},"26":{"tf":1.7320508075688772},"306":{"tf":1.0},"318":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"df":7,"docs":{"10":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"40":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"227":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"182":{"tf":1.7320508075688772},"185":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"2":{"b":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}}},"_":{"2":{"df":0,"docs":{},"f":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"108":{"tf":1.4142135623730951},"110":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"312":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":26,"docs":{"13":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.7320508075688772},"150":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"20":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"115":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.0},"151":{"tf":1.7320508075688772},"16":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"210":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"i":{"df":11,"docs":{"132":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":6,"docs":{"10":{"tf":2.0},"135":{"tf":2.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}},"l":{"[":{"3":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}},"df":34,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"141":{"tf":1.7320508075688772},"152":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":1.7320508075688772},"178":{"tf":1.7320508075688772},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"222":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"312":{"tf":3.1622776601683795},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"125":{"tf":1.0},"170":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":15,"docs":{"113":{"tf":1.4142135623730951},"125":{"tf":1.0},"167":{"tf":1.0},"171":{"tf":1.4142135623730951},"172":{"tf":1.0},"181":{"tf":1.4142135623730951},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"272":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"184":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"(":{"1":{".":{"6":{"5":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"237":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"289":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"132":{"tf":1.0},"192":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"271":{"tf":1.4142135623730951},"316":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"177":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"212":{"tf":1.4142135623730951},"216":{"tf":1.0},"272":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":6,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"126":{"tf":1.0},"157":{"tf":1.0},"168":{"tf":2.8284271247461903},"212":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"168":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"w":{"df":2,"docs":{"23":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"a":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"230":{"tf":2.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"g":{"df":13,"docs":{"211":{"tf":1.0},"244":{"tf":1.4142135623730951},"263":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"51":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"256":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":16,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.4142135623730951},"212":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":2.6457513110645907},"277":{"tf":1.0},"312":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"56":{"tf":1.0},"57":{"tf":2.6457513110645907},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"312":{"tf":1.0}}},"v":{"a":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"26":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"131":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"53":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":9,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"219":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"312":{"tf":1.0},"45":{"tf":2.0},"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"105":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"18":{"tf":1.4142135623730951},"195":{"tf":1.0},"197":{"tf":1.7320508075688772},"227":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772},"312":{"tf":1.0},"40":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.0}},"s":{"1":{"0":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"1":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.7320508075688772}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":53,"docs":{"113":{"tf":1.0},"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"144":{"tf":2.0},"15":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":2.8284271247461903},"174":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"20":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"269":{"tf":1.0},"273":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":2.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"304":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":2.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"255":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.0}}}}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.4142135623730951},"308":{"tf":1.0},"313":{"tf":1.0}}}},"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"p":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"115":{"tf":1.0},"237":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"158":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"57":{"tf":2.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"df":1,"docs":{"189":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}},"t":{"df":12,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"189":{"tf":1.0},"19":{"tf":1.0},"233":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"312":{"tf":1.0},"320":{"tf":1.0},"45":{"tf":3.0}},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"203":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"117":{"tf":1.0},"146":{"tf":1.7320508075688772},"281":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"s":{"df":14,"docs":{"144":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"269":{"tf":1.0},"276":{"tf":1.0},"296":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}}}}},"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":3,"docs":{"240":{"tf":2.0},"296":{"tf":1.4142135623730951},"309":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"136":{"tf":1.0},"143":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"151":{"tf":1.0},"240":{"tf":1.0},"312":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":51,"docs":{"10":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"266":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"273":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"292":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"313":{"tf":2.0},"314":{"tf":1.0},"315":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"213":{"tf":1.0},"327":{"tf":1.0},"52":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"301":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"115":{"tf":2.23606797749979},"120":{"tf":2.23606797749979},"124":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.7320508075688772},"197":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"146":{"tf":1.0},"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"269":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"155":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":25,"docs":{"19":{"tf":1.0},"192":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"255":{"tf":1.0},"26":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.0},"292":{"tf":2.23606797749979},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":2.0},"313":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"43":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"22":{"tf":1.0}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"19":{"tf":1.0},"255":{"tf":1.0}}}}}},"i":{"df":4,"docs":{"289":{"tf":1.0},"302":{"tf":1.0},"318":{"tf":1.0},"63":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"226":{"tf":1.0},"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"146":{"tf":1.0},"326":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"329":{"tf":1.0},"40":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"1":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}},"r":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"255":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":5,"docs":{"243":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"34":{"tf":1.0},"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"41":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":69,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":2.23606797749979},"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"223":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"27":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"28":{"tf":2.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.7320508075688772},"289":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.0},"32":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772},"38":{"tf":1.0},"4":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"64":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"223":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"132":{"tf":1.0},"222":{"tf":1.0},"28":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"281":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"138":{"tf":1.0},"146":{"tf":1.0},"162":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":6,"docs":{"141":{"tf":1.4142135623730951},"275":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"67":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"m":{"a":{"df":5,"docs":{"171":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0}},"n":{"d":{"df":14,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"128":{"tf":1.0},"240":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"216":{"tf":1.0},"322":{"tf":1.0},"52":{"tf":1.0},"60":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"330":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"67":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":15,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"327":{"tf":1.4142135623730951},"328":{"tf":2.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"4":{"tf":1.0},"52":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"146":{"tf":1.0},"170":{"tf":1.0},"25":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"183":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}}}}}}}},"t":{"df":2,"docs":{"119":{"tf":1.0},"292":{"tf":1.0}}}},"df":1,"docs":{"244":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"123":{"tf":1.0},"135":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"143":{"tf":1.0},"144":{"tf":1.0},"158":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"223":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"237":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"276":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":2.449489742783178},"289":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":2.0},"313":{"tf":2.0},"316":{"tf":1.0},"45":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":2.0},"64":{"tf":2.0},"65":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{":":{"1":{":":{"6":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"t":{"df":6,"docs":{"13":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.0},"27":{"tf":1.0}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":7,"docs":{"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.4142135623730951},"28":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"292":{"tf":1.0},"57":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{">":{"(":{"_":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"243":{"tf":1.7320508075688772},"256":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"132":{"tf":1.0},"243":{"tf":1.4142135623730951}}}}}}},">":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"165":{"tf":1.0},"167":{"tf":2.0},"19":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"213":{"tf":1.0},"319":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"216":{"tf":1.0},"283":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"146":{"tf":1.0},"158":{"tf":1.0},"175":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.7320508075688772},"212":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}},"i":{"d":{"df":6,"docs":{"19":{"tf":1.0},"22":{"tf":1.0},"280":{"tf":1.0},"297":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"123":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"171":{"tf":1.0},"181":{"tf":1.0},"190":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"33":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.4142135623730951},"197":{"tf":1.0},"203":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":2.23606797749979},"184":{"tf":1.0},"233":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"268":{"tf":1.0},"321":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"139":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":3.0},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"141":{"tf":1.0},"222":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"40":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"130":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"df":1,"docs":{"302":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":36,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":2.23606797749979},"144":{"tf":3.0},"145":{"tf":2.23606797749979},"146":{"tf":4.242640687119285},"148":{"tf":1.7320508075688772},"149":{"tf":1.4142135623730951},"150":{"tf":1.4142135623730951},"151":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"258":{"tf":3.1622776601683795},"271":{"tf":1.0},"304":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":3.3166247903554},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}},"u":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"45":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":7,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":2.0},"157":{"tf":1.0},"169":{"tf":2.8284271247461903},"20":{"tf":1.0},"327":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"'":{"df":6,"docs":{"135":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}},".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":119,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.0},"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"12":{"tf":1.4142135623730951},"129":{"tf":1.0},"13":{"tf":2.23606797749979},"130":{"tf":2.0},"135":{"tf":4.242640687119285},"136":{"tf":1.0},"137":{"tf":2.0},"138":{"tf":2.6457513110645907},"139":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"140":{"tf":1.7320508075688772},"141":{"tf":2.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":3.4641016151377544},"15":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":2.449489742783178},"153":{"tf":2.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"16":{"tf":2.6457513110645907},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":2.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":3.0},"19":{"tf":2.8284271247461903},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":1.7320508075688772},"203":{"tf":1.0},"204":{"tf":1.0},"21":{"tf":1.0},"219":{"tf":3.1622776601683795},"230":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"244":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"28":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"299":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"308":{"tf":2.449489742783178},"309":{"tf":2.449489742783178},"310":{"tf":1.0},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"33":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"40":{"tf":4.58257569495584},"41":{"tf":2.449489742783178},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":2.0},"45":{"tf":3.4641016151377544},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.7320508075688772},"7":{"tf":2.449489742783178},"8":{"tf":2.23606797749979},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"208":{"tf":1.4142135623730951},"209":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"4":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":16,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.0},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"143":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"255":{"tf":1.0}}},"t":{"df":2,"docs":{"240":{"tf":1.0},"40":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.0}}},"t":{"df":4,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}}}},"y":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"141":{"tf":1.0},"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"95":{"tf":2.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"205":{"tf":1.0},"240":{"tf":1.4142135623730951},"275":{"tf":1.0},"316":{"tf":1.7320508075688772},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"79":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.4142135623730951},"322":{"tf":1.0},"326":{"tf":1.0},"65":{"tf":1.0},"69":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"284":{"tf":1.0},"292":{"tf":1.0},"65":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"133":{"tf":1.0},"141":{"tf":1.4142135623730951},"173":{"tf":1.0},"266":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"44":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"q":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"2":{"/":{"0":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"319":{"tf":1.0},"330":{"tf":1.0}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"306":{"tf":1.0}}}},"i":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"234":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"269":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":36,"docs":{"13":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"29":{"tf":1.0},"301":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"2":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"189":{"tf":1.0}}}}}},"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":3,"docs":{"189":{"tf":1.0},"305":{"tf":1.0},"312":{"tf":1.0}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"150":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"266":{"tf":1.0},"312":{"tf":1.0}}}},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"79":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"108":{"tf":1.0},"69":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"x":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":6,"docs":{"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"151":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"43":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":2,"docs":{"135":{"tf":1.0},"240":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"145":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}}},"df":3,"docs":{"240":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"148":{"tf":1.0},"240":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"230":{"tf":1.0}},"l":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"149":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":23,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.7320508075688772},"148":{"tf":1.0},"149":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":1.7320508075688772},"249":{"tf":1.0},"258":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"243":{"tf":1.0},"30":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":24,"docs":{"10":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"312":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"68":{"tf":1.0}}}}}},"v":{"df":9,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"292":{"tf":1.4142135623730951},"32":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"141":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"130":{"tf":2.0}}}},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{}},"df":30,"docs":{"113":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.7320508075688772},"148":{"tf":1.0},"150":{"tf":1.0},"163":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"200":{"tf":2.0},"202":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"250":{"tf":1.4142135623730951},"28":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"c":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"45":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.7320508075688772},"45":{"tf":1.0}}},"s":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":15,"docs":{"130":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.7320508075688772},"316":{"tf":1.7320508075688772},"40":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":4,"docs":{"279":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"44":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":11,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"255":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"287":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":31,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"144":{"tf":1.0},"152":{"tf":1.4142135623730951},"163":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"287":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"68":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":18,"docs":{"130":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":1.0},"250":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"27":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":2.0},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"310":{"tf":1.0},"7":{"tf":1.0}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":7,"docs":{"19":{"tf":1.0},"240":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0},"33":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"184":{"tf":1.4142135623730951},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"287":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":11,"docs":{"138":{"tf":1.0},"159":{"tf":1.0},"226":{"tf":1.7320508075688772},"24":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"277":{"tf":2.0},"30":{"tf":2.449489742783178},"305":{"tf":1.0},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"1":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":22,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":2.23606797749979},"135":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":2.23606797749979},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":2.8284271247461903},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"219":{"tf":2.23606797749979},"235":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.7320508075688772},"46":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"146":{"tf":1.0},"204":{"tf":1.0},"249":{"tf":1.0}}}},"o":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"181":{"tf":1.4142135623730951},"200":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"255":{"tf":1.0},"317":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":1.0},"211":{"tf":1.0},"215":{"tf":1.0},"232":{"tf":1.0},"275":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"250":{"tf":1.0},"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"191":{"tf":1.0},"203":{"tf":1.0},"249":{"tf":1.0},"266":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"325":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}}},"v":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":18,"docs":{"0":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"136":{"tf":1.0},"14":{"tf":2.23606797749979},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"21":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.7320508075688772},"22":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"315":{"tf":1.4142135623730951},"40":{"tf":1.0},"56":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.4142135623730951},"16":{"tf":1.0},"178":{"tf":1.0},"191":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"64":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"255":{"tf":1.0},"281":{"tf":1.0}}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":2.8284271247461903},"69":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":9,"docs":{"123":{"tf":1.0},"14":{"tf":1.0},"159":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"2":{"tf":1.0},"268":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"211":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"292":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":4,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":1.0},"302":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"215":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":1,"docs":{"281":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"171":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"117":{"tf":1.0},"292":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"308":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"275":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"c":{"df":6,"docs":{"211":{"tf":1.7320508075688772},"222":{"tf":1.0},"4":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.7320508075688772},"301":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"4":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":10,"docs":{"13":{"tf":1.0},"18":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":2.0},"272":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.0}}}}}}}}},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"=":{"2":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"g":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"'":{"df":0,"docs":{},"t":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"25":{"tf":1.0},"271":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"14":{"tf":1.0},"20":{"tf":1.0},"212":{"tf":1.0},"25":{"tf":1.0},"296":{"tf":1.0}}},"g":{".":{"df":0,"docs":{},"f":{"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"240":{"tf":1.4142135623730951},"271":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":5,"docs":{"217":{"tf":1.0},"24":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"16":{"tf":1.0},"250":{"tf":1.0}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}},"p":{"df":1,"docs":{"200":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"204":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.0},"40":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":26,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"152":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.7320508075688772},"253":{"tf":1.0},"255":{"tf":1.0},"275":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":11,"docs":{"132":{"tf":1.0},"191":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"27":{"tf":1.0},"43":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"181":{"tf":1.0},"250":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"143":{"tf":1.0}}}}},"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"68":{"tf":1.4142135623730951},"94":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":3,"docs":{"102":{"tf":1.0},"68":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":3,"docs":{"68":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"72":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}},"u":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"323":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"314":{"tf":1.0},"52":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.7320508075688772},"284":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"163":{"tf":1.0},"292":{"tf":1.0},"68":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"192":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"243":{"tf":1.0},"269":{"tf":1.0},"296":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"0":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"146":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.0}},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":9,"docs":{"269":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.7320508075688772},"313":{"tf":1.0},"38":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"130":{"tf":1.0},"136":{"tf":1.0},"146":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"177":{"tf":1.0},"237":{"tf":1.0}}}}},"o":{"d":{"df":14,"docs":{"131":{"tf":1.7320508075688772},"163":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":2.23606797749979},"294":{"tf":1.0},"304":{"tf":1.0},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":2.23606797749979}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}},"df":2,"docs":{"104":{"tf":1.0},"141":{"tf":1.0}}}}}}},"d":{"_":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"160":{"tf":1.0},"266":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"43":{"tf":2.449489742783178},"44":{"tf":1.0},"48":{"tf":1.0},"8":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"233":{"tf":1.0},"241":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":15,"docs":{"219":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"289":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"60":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"42":{"tf":1.0},"43":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":9,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"133":{"tf":2.8284271247461903},"135":{"tf":1.0},"170":{"tf":1.0},"187":{"tf":1.0},"194":{"tf":1.7320508075688772},"240":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.7320508075688772}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"26":{"tf":1.0},"321":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"46":{"tf":1.0}}}}}}},"o":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":13,"docs":{"131":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"173":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"183":{"tf":2.0},"191":{"tf":1.0},"201":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"191":{"tf":1.4142135623730951},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"c":{"1":{"1":{"5":{"5":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"x":{"1":{"0":{"0":{"df":1,"docs":{"279":{"tf":1.0}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"14":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.4142135623730951},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.4142135623730951},"269":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.4142135623730951},"300":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":1.0},"313":{"tf":2.0},"316":{"tf":1.0},"48":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"146":{"tf":1.0},"210":{"tf":1.0},"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":7,"docs":{"146":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"250":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.4142135623730951},"304":{"tf":1.0}},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"'":{"df":2,"docs":{"16":{"tf":1.0},"69":{"tf":1.0}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":17,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.0},"16":{"tf":1.0},"187":{"tf":1.0},"19":{"tf":1.4142135623730951},"195":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"79":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"s":{"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":10,"docs":{"123":{"tf":1.7320508075688772},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"167":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"178":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0}},"t":{"df":15,"docs":{"118":{"tf":1.0},"140":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"323":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0}},"u":{"df":1,"docs":{"173":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"320":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"26":{"tf":1.0}}}}}}},"m":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"135":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.7320508075688772},"200":{"tf":1.0},"220":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.0},"3":{"tf":1.7320508075688772},"57":{"tf":1.0},"68":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"197":{"tf":1.0},"271":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"60":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":121,"docs":{"10":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"127":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":2.449489742783178},"143":{"tf":1.4142135623730951},"147":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.4142135623730951},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"195":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"226":{"tf":1.0},"230":{"tf":2.23606797749979},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":2.449489742783178},"249":{"tf":1.0},"255":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.7320508075688772},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979},"280":{"tf":2.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":2.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":3.7416573867739413},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":5,"docs":{"201":{"tf":1.0},"207":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"41":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"268":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.4142135623730951},"16":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"233":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":2.0},"268":{"tf":1.0},"288":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"13":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"309":{"tf":1.0}}}},"t":{"df":1,"docs":{"244":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"21":{"tf":1.0},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"281":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"33":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"n":{"df":2,"docs":{"211":{"tf":1.0},"326":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"313":{"tf":1.4142135623730951}}}}}}}}},"df":7,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"164":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"321":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"10":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"164":{"tf":1.0},"268":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"182":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}}}}}},"s":{"df":7,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":46,"docs":{"1":{"tf":1.4142135623730951},"113":{"tf":2.8284271247461903},"123":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":2.6457513110645907},"170":{"tf":1.4142135623730951},"171":{"tf":2.8284271247461903},"172":{"tf":3.1622776601683795},"173":{"tf":2.8284271247461903},"174":{"tf":3.872983346207417},"175":{"tf":3.1622776601683795},"176":{"tf":1.0},"177":{"tf":2.0},"178":{"tf":2.449489742783178},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"181":{"tf":1.4142135623730951},"182":{"tf":4.795831523312719},"183":{"tf":3.4641016151377544},"184":{"tf":2.0},"185":{"tf":2.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"204":{"tf":1.4142135623730951},"243":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.0},"320":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":5,"docs":{"135":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":2.0},"50":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":15,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"144":{"tf":1.4142135623730951},"193":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"32":{"tf":1.0},"327":{"tf":1.0},"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"146":{"tf":1.0},"227":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{},"x":{"df":1,"docs":{"296":{"tf":1.4142135623730951}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"266":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"322":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":21,"docs":{"106":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"184":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"262":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":1,"docs":{"191":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":1,"docs":{"330":{"tf":1.0}}},"r":{"df":1,"docs":{"240":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"266":{"tf":1.0},"284":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":9,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.4142135623730951},"133":{"tf":1.0},"185":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0}},"e":{"'":{"df":2,"docs":{"132":{"tf":1.0},"2":{"tf":1.0}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"m":{"d":{"6":{"4":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":38,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"259":{"tf":1.0},"26":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}},"df":98,"docs":{"0":{"tf":2.0},"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"187":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":2.0},"20":{"tf":1.7320508075688772},"208":{"tf":1.0},"21":{"tf":1.7320508075688772},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.6457513110645907},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.23606797749979},"23":{"tf":2.0},"232":{"tf":1.0},"233":{"tf":1.4142135623730951},"24":{"tf":2.0},"240":{"tf":2.0},"243":{"tf":2.6457513110645907},"25":{"tf":2.6457513110645907},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"26":{"tf":3.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"287":{"tf":1.0},"29":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951},"292":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"3":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.7320508075688772},"315":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"38":{"tf":2.0},"4":{"tf":1.4142135623730951},"40":{"tf":2.6457513110645907},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.7320508075688772},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":2.8284271247461903},"53":{"tf":2.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"6":{"tf":2.449489742783178},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"266":{"tf":1.0}}}},"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"252":{"tf":1.0}},"l":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"45":{"tf":1.0},"66":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.0},"170":{"tf":1.7320508075688772},"174":{"tf":2.8284271247461903},"191":{"tf":3.1622776601683795},"193":{"tf":1.7320508075688772},"231":{"tf":1.0},"240":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":2.8284271247461903},"309":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":21,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"219":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"266":{"tf":3.0},"275":{"tf":2.23606797749979},"276":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.0},"309":{"tf":1.0},"32":{"tf":1.4142135623730951},"38":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":2.6457513110645907}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"222":{"tf":2.0},"277":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"178":{"tf":1.0},"216":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":11,"docs":{"13":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"26":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"255":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"10":{"tf":1.0},"40":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":25,"docs":{"10":{"tf":1.0},"108":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.4142135623730951},"13":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"206":{"tf":1.0},"210":{"tf":1.0},"232":{"tf":1.0},"283":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.4142135623730951},"68":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"t":{"df":4,"docs":{"240":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"x":{"df":27,"docs":{"131":{"tf":1.0},"192":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.7320508075688772},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"269":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"284":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":2.0},"289":{"tf":1.0},"293":{"tf":2.23606797749979},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"74":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"306":{"tf":1.0},"310":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"108":{"tf":1.0},"219":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0},"9":{"tf":1.0}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"n":{"df":105,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":2.0},"164":{"tf":2.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":2.0},"197":{"tf":1.0},"2":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":2.6457513110645907},"231":{"tf":2.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"241":{"tf":1.4142135623730951},"243":{"tf":3.7416573867739413},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":2.449489742783178},"258":{"tf":3.1622776601683795},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"275":{"tf":2.23606797749979},"279":{"tf":1.7320508075688772},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.0},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.872983346207417},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":2.6457513110645907},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"152":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":58,"docs":{"115":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":1.4142135623730951},"23":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"325":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}},"w":{"df":1,"docs":{"231":{"tf":1.0}}}}},"o":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{")":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"146":{"tf":1.4142135623730951},"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.7320508075688772}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"2":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"146":{"tf":1.7320508075688772},"244":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}},"g":{"(":{"4":{"2":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.0}}}}},"df":0,"docs":{}},"2":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"189":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}},":":{":":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"{":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"=":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":55,"docs":{"130":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"204":{"tf":1.0},"207":{"tf":1.4142135623730951},"222":{"tf":2.0},"223":{"tf":1.0},"230":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":2.6457513110645907},"244":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"258":{"tf":3.3166247903554},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"293":{"tf":2.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.7320508075688772},"308":{"tf":2.449489742783178},"312":{"tf":3.7416573867739413},"313":{"tf":1.4142135623730951}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":3,"docs":{"211":{"tf":1.0},"216":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"m":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"294":{"tf":1.0},"30":{"tf":1.0}}}},"df":9,"docs":{"104":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.4142135623730951},"164":{"tf":1.0},"18":{"tf":1.0},"181":{"tf":1.0},"300":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"235":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"127":{"tf":1.0},"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"197":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"206":{"tf":1.0},"320":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"266":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"197":{"tf":1.0},"308":{"tf":1.0},"57":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"292":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":80,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"108":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.4142135623730951},"130":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.449489742783178},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"137":{"tf":1.0},"138":{"tf":3.1622776601683795},"139":{"tf":2.0},"141":{"tf":5.656854249492381},"143":{"tf":3.1622776601683795},"144":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"146":{"tf":2.0},"148":{"tf":1.0},"152":{"tf":2.0},"16":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":2.23606797749979},"18":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"199":{"tf":1.0},"205":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":3.7416573867739413},"241":{"tf":1.4142135623730951},"243":{"tf":2.449489742783178},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":2.23606797749979},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":2.23606797749979},"279":{"tf":3.0},"281":{"tf":1.0},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.7320508075688772},"302":{"tf":1.0},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":2.0},"40":{"tf":2.0},"42":{"tf":1.0},"44":{"tf":2.0},"45":{"tf":1.4142135623730951},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.0},"74":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0},"89":{"tf":1.0},"9":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"141":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.0},"23":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"64":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.0},"119":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0}}}}}}},"g":{"1":{"df":1,"docs":{"105":{"tf":1.0}}},"2":{"df":1,"docs":{"105":{"tf":1.0}}},"a":{"df":5,"docs":{"13":{"tf":1.0},"19":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"44":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"df":1,"docs":{"296":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"0":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":2.0},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"262":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.0},"296":{"tf":1.0},"310":{"tf":1.0},"60":{"tf":2.0},"61":{"tf":1.0},"74":{"tf":1.0}},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"_":{"4":{"2":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.7320508075688772},"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0}}}}}}},"df":1,"docs":{"10":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"178":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"3":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"217":{"tf":1.0},"22":{"tf":1.0},"64":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"216":{"tf":1.4142135623730951},"26":{"tf":1.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"160":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.4142135623730951},"64":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.4142135623730951},"18":{"tf":1.0},"219":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":17,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"206":{"tf":1.0},"207":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"258":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"264":{"tf":1.4142135623730951},"273":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":3,"docs":{"27":{"tf":1.0},"52":{"tf":1.0},"64":{"tf":1.0}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"b":{"df":1,"docs":{"16":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"250":{"tf":1.0},"277":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"171":{"tf":1.0},"183":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"140":{"tf":1.0},"28":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"8":{"tf":2.23606797749979},"9":{"tf":1.0}},"e":{":":{"1":{"0":{":":{"1":{"4":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.0},"2":{"tf":1.0},"240":{"tf":1.0},"296":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}}},"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"296":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"d":{"df":15,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"325":{"tf":1.4142135623730951},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"296":{"tf":1.0},"31":{"tf":1.0},"64":{"tf":1.4142135623730951}},"l":{"df":6,"docs":{"13":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"299":{"tf":1.0},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":5,"docs":{"22":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":1,"docs":{"211":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"320":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"329":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"249":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":14,"docs":{"108":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.4142135623730951},"230":{"tf":1.0},"312":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"85":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"130":{"tf":1.0},"250":{"tf":1.4142135623730951},"44":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.0}}}}}}}},"df":5,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"25":{"tf":1.0}},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"169":{"tf":1.0},"30":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":3,"docs":{"124":{"tf":1.0},"181":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"p":{"df":12,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":2.0},"255":{"tf":1.0},"281":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0}}}},"n":{"c":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}},"df":13,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.4142135623730951},"182":{"tf":1.0},"183":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"237":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"193":{"tf":1.0}}}}}}}}},"x":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"1":{".":{".":{"6":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"304":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":2.23606797749979}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"135":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"200":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}},"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":6,"docs":{"174":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.449489742783178},"45":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"187":{"tf":1.0},"197":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"24":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"t":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"268":{"tf":2.0},"312":{"tf":2.8284271247461903}},"e":{"(":{"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}},"v":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0}},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"v":{"0":{".":{"8":{".":{"1":{"1":{"/":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{"df":1,"docs":{"271":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"219":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"301":{"tf":1.0}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"2":{"8":{"4":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"i":{".":{"df":6,"docs":{"143":{"tf":1.0},"204":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"1":{"2":{"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"a":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"279":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"df":0,"docs":{},"~":{"1":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}}},"[":{"1":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"174":{"tf":1.0},"185":{"tf":1.4142135623730951},"190":{"tf":1.0},"243":{"tf":3.1622776601683795},"255":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":8,"docs":{"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"250":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"8":{"[":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":8,"docs":{"130":{"tf":1.0},"132":{"tf":1.4142135623730951},"190":{"tf":1.0},"244":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.0},"296":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"c":{"df":7,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"276":{"tf":1.0},"293":{"tf":1.7320508075688772}}},"d":{"df":2,"docs":{"277":{"tf":1.0},"310":{"tf":1.0}},"e":{"a":{"df":2,"docs":{"20":{"tf":1.0},"212":{"tf":1.4142135623730951}},"l":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"158":{"tf":1.0},"16":{"tf":1.0},"281":{"tf":1.0},"320":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":23,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"166":{"tf":1.0},"170":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"308":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"118":{"tf":1.0},"258":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"165":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"284":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"313":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"240":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"1":{"tf":1.0},"132":{"tf":2.6457513110645907},"141":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"297":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.4142135623730951},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"69":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"132":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"283":{"tf":1.0},"308":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":16,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"32":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"288":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"v":{"df":12,"docs":{"211":{"tf":1.4142135623730951},"217":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0},"289":{"tf":1.4142135623730951},"294":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}},"y":{"[":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}}}}},"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"324":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"d":{"df":24,"docs":{"143":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"196":{"tf":1.0},"212":{"tf":1.0},"223":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"309":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0},"79":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"320":{"tf":1.0},"52":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":2.0}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"233":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"191":{"tf":1.0},"200":{"tf":1.4142135623730951},"206":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":8,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"41":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"177":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":4,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"15":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":6,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"312":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"138":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"250":{"tf":1.7320508075688772}}}}},"x":{"df":1,"docs":{"182":{"tf":1.0}}}},"o":{"df":4,"docs":{"135":{"tf":1.0},"144":{"tf":1.4142135623730951},"158":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":12,"docs":{"146":{"tf":2.23606797749979},"148":{"tf":1.0},"15":{"tf":1.0},"151":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"266":{"tf":1.0},"275":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"130":{"tf":1.7320508075688772},"233":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}},"df":1,"docs":{"312":{"tf":1.0}},"i":{"df":11,"docs":{"135":{"tf":1.0},"139":{"tf":1.0},"174":{"tf":2.8284271247461903},"175":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":2.0},"45":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"159":{"tf":1.0},"279":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":1,"docs":{"243":{"tf":1.4142135623730951}},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"df":1,"docs":{"243":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"168":{"tf":1.0},"169":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":7,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":10,"docs":{"141":{"tf":1.0},"146":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":2.0},"152":{"tf":1.4142135623730951},"203":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"t":{"a":{"df":1,"docs":{"302":{"tf":1.0}},"l":{"df":12,"docs":{"14":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"26":{"tf":2.23606797749979},"27":{"tf":1.4142135623730951},"38":{"tf":2.23606797749979},"57":{"tf":2.0},"6":{"tf":2.0},"60":{"tf":1.0},"7":{"tf":1.0}}},"n":{"c":{"df":14,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"146":{"tf":1.7320508075688772},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"193":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"258":{"tf":1.4142135623730951},"276":{"tf":1.0},"305":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.0},"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"312":{"tf":1.4142135623730951},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":17,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"265":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"315":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"244":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"269":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":16,"docs":{"124":{"tf":2.0},"127":{"tf":1.7320508075688772},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":1.0},"173":{"tf":1.4142135623730951},"181":{"tf":1.0},"192":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"187":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"271":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"14":{"tf":1.0},"143":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"320":{"tf":1.0},"327":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"329":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"9":{"tf":1.0}}}}},"f":{"a":{"c":{"df":5,"docs":{"130":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"189":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":17,"docs":{"130":{"tf":1.0},"138":{"tf":1.0},"191":{"tf":1.0},"266":{"tf":1.7320508075688772},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.0},"302":{"tf":1.4142135623730951},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":3,"docs":{"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"10":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"247":{"tf":1.0}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"293":{"tf":1.0},"305":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"171":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"185":{"tf":1.0},"287":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}},"o":{"c":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":5,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"40":{"tf":1.0}}},"l":{"df":0,"docs":{},"v":{"df":4,"docs":{"22":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"4":{"tf":1.0}}}}}}},"p":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"57":{"tf":1.0}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":15,"docs":{"160":{"tf":1.0},"210":{"tf":2.0},"212":{"tf":1.7320508075688772},"213":{"tf":1.0},"215":{"tf":2.449489742783178},"230":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"322":{"tf":1.0},"64":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"'":{"df":5,"docs":{"219":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"277":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.7320508075688772},"191":{"tf":1.0}}},"1":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}},"2":{"df":1,"docs":{"174":{"tf":1.0}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"300":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":22,"docs":{"113":{"tf":1.0},"115":{"tf":2.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"175":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.4142135623730951},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":1.0},"37":{"tf":1.4142135623730951}}},"r":{"df":2,"docs":{"169":{"tf":1.0},"316":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"212":{"tf":1.0},"215":{"tf":1.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"305":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"14":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}},"df":1,"docs":{"105":{"tf":1.0}},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":1,"docs":{"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":4,"docs":{"15":{"tf":1.0},"206":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"207":{"tf":1.0}}}},"y":{"df":13,"docs":{"141":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"177":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"40":{"tf":2.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":2.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":21,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":2.0},"120":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"287":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"315":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"130":{"tf":1.0},"40":{"tf":1.0}},"n":{"df":6,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"191":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0}}}}}},"w":{"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"118":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"115":{"tf":1.0},"118":{"tf":1.0}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":6,"docs":{"141":{"tf":3.4641016151377544},"173":{"tf":1.4142135623730951},"255":{"tf":3.4641016151377544},"265":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0}}}}},"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{},"g":{".":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":4,"docs":{"301":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"113":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"187":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"3":{"tf":1.7320508075688772},"321":{"tf":1.0},"326":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"43":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"64":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.0},"289":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":11,"docs":{"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"321":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}}}},"v":{"df":4,"docs":{"164":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"255":{"tf":1.0},"280":{"tf":1.7320508075688772},"292":{"tf":1.0},"296":{"tf":1.0}}}},"n":{"df":1,"docs":{"230":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"191":{"tf":1.0},"193":{"tf":1.7320508075688772},"243":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.0},"90":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"201":{"tf":1.0},"3":{"tf":1.0},"312":{"tf":1.0}}}},"t":{"'":{"df":6,"docs":{"280":{"tf":1.0},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":12,"docs":{"0":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"115":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"113":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":4,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":14,"docs":{"132":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"31":{"tf":1.4142135623730951},"314":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"79":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"308":{"tf":1.0}}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"187":{"tf":1.0},"268":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"128":{"tf":1.0}}}}},"df":0,"docs":{}},"df":6,"docs":{"122":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}}},"k":{"df":6,"docs":{"19":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"49":{"tf":1.4142135623730951},"64":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"243":{"tf":1.4142135623730951},"26":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":2.8284271247461903},"187":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"216":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"30":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}}},"df":20,"docs":{"113":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":2.6457513110645907},"172":{"tf":1.0},"181":{"tf":1.7320508075688772},"192":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"233":{"tf":1.0},"287":{"tf":1.4142135623730951},"296":{"tf":2.0},"299":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":2.0}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"13":{"tf":1.7320508075688772},"15":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.7320508075688772},"51":{"tf":1.4142135623730951}}}}},"o":{"a":{"d":{"df":5,"docs":{"159":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.0},"280":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"211":{"tf":1.0},"219":{"tf":1.7320508075688772},"260":{"tf":1.0},"261":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"65":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"144":{"tf":1.0},"178":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"207":{"tf":1.0},"233":{"tf":1.0},"25":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":2.449489742783178},"281":{"tf":1.0},"284":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0}},"i":{"c":{"df":8,"docs":{"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"182":{"tf":1.0},"184":{"tf":1.4142135623730951},"41":{"tf":2.0}}},"df":0,"docs":{}},"s":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"313":{"tf":1.0}}},"g":{"df":2,"docs":{"141":{"tf":1.0},"288":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":7,"docs":{"143":{"tf":1.4142135623730951},"17":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"19":{"tf":1.0},"42":{"tf":1.0}}}}},"p":{"df":5,"docs":{"166":{"tf":1.4142135623730951},"167":{"tf":2.449489742783178},"168":{"tf":2.449489742783178},"169":{"tf":2.449489742783178},"316":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"w":{"df":3,"docs":{"258":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"247":{"tf":1.4142135623730951},"269":{"tf":1.0},"284":{"tf":1.0},"302":{"tf":1.0},"40":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":3,"docs":{"23":{"tf":1.0},"230":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}}},"o":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"163":{"tf":1.0},"216":{"tf":1.4142135623730951},"243":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}},"n":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"130":{"tf":1.4142135623730951},"226":{"tf":1.0},"243":{"tf":1.0},"275":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"211":{"tf":1.0},"266":{"tf":1.0},"31":{"tf":1.7320508075688772},"41":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"51":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"e":{"df":30,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":1.0},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"14":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":7,"docs":{"19":{"tf":1.0},"212":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"49":{"tf":1.0},"79":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"226":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.7320508075688772}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"240":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"<":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":17,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.7320508075688772},"2":{"tf":1.0},"204":{"tf":1.7320508075688772},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"48":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":1,"docs":{"196":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":13,"docs":{"113":{"tf":1.4142135623730951},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"177":{"tf":1.7320508075688772},"187":{"tf":1.0},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"256":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.7320508075688772},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":14,"docs":{"118":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":2.23606797749979},"191":{"tf":1.0},"219":{"tf":1.4142135623730951},"240":{"tf":2.6457513110645907},"255":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"272":{"tf":1.0}}}}}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"143":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":5,"docs":{"190":{"tf":1.4142135623730951},"197":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":7,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":1.0},"183":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"191":{"tf":1.0}}}}},"t":{"df":1,"docs":{"136":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"249":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":1,"docs":{"250":{"tf":1.0}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":16,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"141":{"tf":1.0},"187":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":2.449489742783178},"207":{"tf":1.7320508075688772},"230":{"tf":1.0},"250":{"tf":1.4142135623730951},"256":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":17,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"90":{"tf":2.449489742783178},"91":{"tf":1.0},"92":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"227":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"8":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"107":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"230":{"tf":2.23606797749979},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":2.23606797749979}}}}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"215":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":29,"docs":{"10":{"tf":1.7320508075688772},"108":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"2":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"69":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"249":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":19,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"48":{"tf":1.0},"9":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"132":{"tf":2.449489742783178},"237":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"280":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"238":{"tf":1.0}}}},"u":{"df":2,"docs":{"185":{"tf":1.0},"250":{"tf":1.0}},"t":{"df":1,"docs":{"66":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"264":{"tf":1.0},"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":4,"docs":{"231":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"13":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"x":{"df":2,"docs":{"109":{"tf":1.0},"312":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":2.0}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":4,"docs":{"68":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"91":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":1,"docs":{"275":{"tf":1.0}},"e":{"df":1,"docs":{"31":{"tf":1.7320508075688772}},"r":{"df":1,"docs":{"322":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":17,"docs":{"108":{"tf":1.0},"110":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"275":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"89":{"tf":1.0}}}},"df":16,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"180":{"tf":1.0},"193":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":2.0},"266":{"tf":2.449489742783178},"275":{"tf":2.0},"279":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951}},"e":{"'":{"df":1,"docs":{"266":{"tf":1.0}}},".":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"d":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}},"u":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"315":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":33,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"13":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.7320508075688772},"206":{"tf":1.0},"21":{"tf":1.0},"232":{"tf":1.0},"255":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"35":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"139":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":6,"docs":{"161":{"tf":1.0},"217":{"tf":1.0},"277":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"42":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"'":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"258":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"146":{"tf":1.0},"312":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"l":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"104":{"tf":1.0},"135":{"tf":1.0},"182":{"tf":1.0},"219":{"tf":1.0},"244":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"42":{"tf":1.0}},"i":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"144":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"145":{"tf":2.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":1.0},"240":{"tf":2.449489742783178},"40":{"tf":2.0}},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"145":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}},"df":26,"docs":{"107":{"tf":1.4142135623730951},"118":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":2.23606797749979},"150":{"tf":1.0},"153":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"177":{"tf":1.0},"230":{"tf":3.0},"240":{"tf":3.1622776601683795},"249":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"48":{"tf":1.7320508075688772},"88":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":1,"docs":{"6":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"205":{"tf":1.0}}}},"df":0,"docs":{}}},"df":6,"docs":{"243":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"276":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"258":{"tf":1.0},"283":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"250":{"tf":1.0}}},"x":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"233":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"296":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"0":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}},"e":{"(":{"1":{"df":1,"docs":{"170":{"tf":1.0}}},"a":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"313":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"222":{"tf":1.4142135623730951},"299":{"tf":1.0},"313":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":3,"docs":{"240":{"tf":1.0},"265":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":37,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"134":{"tf":1.0},"141":{"tf":2.449489742783178},"145":{"tf":1.0},"148":{"tf":1.0},"159":{"tf":1.0},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"179":{"tf":1.7320508075688772},"180":{"tf":1.0},"189":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"194":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"281":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"46":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}},"v":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"16":{"tf":1.0},"326":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":7,"docs":{"115":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":32,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"212":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"249":{"tf":1.0},"26":{"tf":1.7320508075688772},"268":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"280":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"185":{"tf":1.4142135623730951},"247":{"tf":1.0},"280":{"tf":1.7320508075688772}}}},"df":1,"docs":{"244":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"141":{"tf":1.0},"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"204":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":7,"docs":{"13":{"tf":2.0},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"19":{"tf":3.1622776601683795},"20":{"tf":1.0},"235":{"tf":1.0},"46":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0}}}}},"w":{"(":{"_":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}},"df":28,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.4142135623730951},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":2,"docs":{"122":{"tf":1.0},"124":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.0},"174":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"41":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"266":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"131":{"tf":1.0},"133":{"tf":1.0}}}}},"n":{"c":{"df":1,"docs":{"204":{"tf":2.449489742783178}}},"df":12,"docs":{"136":{"tf":1.0},"232":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"284":{"tf":1.0},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"182":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":26,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"42":{"tf":1.0},"60":{"tf":2.449489742783178},"7":{"tf":1.0}}},"h":{"df":2,"docs":{"13":{"tf":1.0},"17":{"tf":1.0}}},"i":{"c":{"df":5,"docs":{"18":{"tf":1.0},"279":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":50,"docs":{"17":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"219":{"tf":1.0},"223":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.4142135623730951},"231":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"268":{"tf":1.7320508075688772},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":2.23606797749979},"288":{"tf":1.7320508075688772},"292":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":2.6457513110645907},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"35":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":24,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.7320508075688772},"134":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.4142135623730951},"16":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"191":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"233":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}}}},"df":1,"docs":{"249":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"196":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"299":{"tf":1.0},"305":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":10,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"243":{"tf":1.0},"283":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"55":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"323":{"tf":1.7320508075688772},"49":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"240":{"tf":1.4142135623730951}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"141":{"tf":1.0},"173":{"tf":1.0},"255":{"tf":1.0}}}}},"n":{"c":{"df":6,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0},"273":{"tf":1.0},"34":{"tf":1.0},"57":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":25,"docs":{"0":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":2.0},"13":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"181":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"233":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"64":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"223":{"tf":1.0},"9":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"15":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"224":{"tf":1.0},"27":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"174":{"tf":2.449489742783178},"175":{"tf":1.7320508075688772},"184":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":29,"docs":{"105":{"tf":1.0},"113":{"tf":2.0},"146":{"tf":1.0},"153":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":2.0},"182":{"tf":2.0},"183":{"tf":1.4142135623730951},"184":{"tf":2.0},"185":{"tf":2.23606797749979},"187":{"tf":1.0},"192":{"tf":1.0},"200":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951},"52":{"tf":1.0},"69":{"tf":1.0},"89":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"212":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"249":{"tf":1.0},"292":{"tf":1.4142135623730951},"309":{"tf":2.0},"51":{"tf":1.0},"68":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"292":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":7,"docs":{"115":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.7320508075688772},"25":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"141":{"tf":1.0},"153":{"tf":1.0},"173":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"43":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":7,"docs":{"215":{"tf":1.0},"240":{"tf":2.23606797749979},"275":{"tf":1.0},"287":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"68":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.0}}},"x":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"275":{"tf":1.0}}}},"df":3,"docs":{"255":{"tf":1.0},"321":{"tf":1.0},"53":{"tf":1.0}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"268":{"tf":1.0},"287":{"tf":1.0},"324":{"tf":1.0},"42":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"141":{"tf":1.0},"19":{"tf":1.0},"212":{"tf":1.4142135623730951},"219":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"16":{"tf":1.0},"19":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":15,"docs":{"12":{"tf":1.0},"141":{"tf":1.0},"18":{"tf":1.0},"219":{"tf":1.0},"25":{"tf":1.0},"277":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":2.23606797749979},"84":{"tf":1.0},"9":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"193":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"279":{"tf":1.0},"41":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"280":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":8,"docs":{"166":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.0},"43":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"280":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"280":{"tf":1.0}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"309":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}}}},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}},"p":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"q":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":2,"docs":{"131":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951}}}},"1":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"275":{"tf":1.0}}},"2":{"5":{"6":{"df":1,"docs":{"52":{"tf":1.4142135623730951}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}}},"x":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"275":{"tf":1.0}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"23":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":3,"docs":{"18":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":10,"docs":{"20":{"tf":1.0},"220":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"r":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},".":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"146":{"tf":1.0},"243":{"tf":1.7320508075688772},"281":{"tf":1.0},"41":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"c":{"(":{"0":{"df":0,"docs":{},"x":{"3":{"2":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"171":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":2.0},"294":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":25,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"115":{"tf":1.0},"132":{"tf":1.4142135623730951},"141":{"tf":4.0},"144":{"tf":2.0},"152":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"243":{"tf":1.4142135623730951},"255":{"tf":2.0},"283":{"tf":1.0},"312":{"tf":2.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":1.7320508075688772},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"266":{"tf":1.0},"309":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":5,"docs":{"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"284":{"tf":1.0}}},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}},"s":{"df":3,"docs":{"246":{"tf":1.0},"266":{"tf":2.449489742783178},"279":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":2,"docs":{"284":{"tf":1.0},"304":{"tf":1.0}}}}},"t":{"df":6,"docs":{"130":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"277":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"213":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"281":{"tf":1.0}}},"s":{"df":22,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.7320508075688772},"145":{"tf":1.0},"18":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"313":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"t":{"df":1,"docs":{"19":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":9,"docs":{"170":{"tf":1.7320508075688772},"180":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"253":{"tf":1.0},"266":{"tf":1.4142135623730951},"288":{"tf":1.0},"30":{"tf":1.0},"34":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"133":{"tf":1.0},"170":{"tf":2.449489742783178},"240":{"tf":3.0},"329":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}}}}},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"40":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"52":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":3,"docs":{"131":{"tf":1.0},"240":{"tf":2.0},"27":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"219":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":16,"docs":{"18":{"tf":1.0},"187":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.0},"313":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.4142135623730951},"43":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"137":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"271":{"tf":1.0},"277":{"tf":1.4142135623730951},"310":{"tf":1.0}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"321":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"272":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"135":{"tf":1.0},"249":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}},"r":{"@":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"200":{"tf":1.4142135623730951},"215":{"tf":1.0},"22":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"n":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"213":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"=":{"4":{"7":{"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}}}},"y":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"57":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"1":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"131":{"tf":1.0},"178":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0}}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.4142135623730951}}}}}}}}},"1":{"df":1,"docs":{"178":{"tf":1.0}}},"2":{"df":1,"docs":{"178":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"131":{"tf":1.4142135623730951},"160":{"tf":1.0},"178":{"tf":2.0},"19":{"tf":1.4142135623730951},"22":{"tf":1.0},"240":{"tf":2.23606797749979},"244":{"tf":1.0},"258":{"tf":2.449489742783178},"275":{"tf":2.8284271247461903},"279":{"tf":1.0},"3":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"201":{"tf":1.7320508075688772},"203":{"tf":1.7320508075688772},"204":{"tf":1.0},"207":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"131":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"24":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"144":{"tf":1.0},"173":{"tf":1.0},"191":{"tf":1.4142135623730951},"321":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":1.0},"143":{"tf":1.0},"187":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.0},"277":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"287":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":3,"docs":{"287":{"tf":1.0},"323":{"tf":1.0},"54":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.4142135623730951}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"113":{"tf":1.0},"136":{"tf":1.7320508075688772},"157":{"tf":1.0},"158":{"tf":2.6457513110645907},"296":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"68":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"287":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"220":{"tf":1.0},"230":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":2.6457513110645907}},"e":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"107":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"271":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"141":{"tf":1.0},"145":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"138":{"tf":1.0},"240":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"164":{"tf":1.0},"313":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"285":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"17":{"tf":1.0},"255":{"tf":1.0},"309":{"tf":1.7320508075688772}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":12,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":14,"docs":{"219":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":2.0},"265":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"=":{"1":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"268":{"tf":1.0},"312":{"tf":2.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"182":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"287":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"222":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"285":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":15,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"241":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":2.0},"321":{"tf":1.4142135623730951},"326":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":3,"docs":{"143":{"tf":1.0},"210":{"tf":1.0},"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"214":{"tf":1.0},"45":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":8,"docs":{"115":{"tf":1.0},"146":{"tf":1.0},"174":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.7320508075688772},"222":{"tf":1.0},"309":{"tf":2.23606797749979},"8":{"tf":1.0}},"t":{"df":2,"docs":{"115":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"187":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"219":{"tf":1.0}}},"df":24,"docs":{"10":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"213":{"tf":1.4142135623730951},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"29":{"tf":2.23606797749979},"30":{"tf":2.449489742783178},"31":{"tf":2.449489742783178},"317":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"312":{"tf":1.0}}}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"25":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"241":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"288":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":2.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":17,"docs":{"108":{"tf":1.0},"132":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"173":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"301":{"tf":1.0},"304":{"tf":1.7320508075688772},"326":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":89,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":3.0},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.0},"189":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"196":{"tf":2.0},"2":{"tf":1.0},"222":{"tf":1.7320508075688772},"230":{"tf":1.7320508075688772},"231":{"tf":2.23606797749979},"234":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":5.291502622129181},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":2.449489742783178},"272":{"tf":1.0},"275":{"tf":2.449489742783178},"279":{"tf":1.4142135623730951},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.605551275463989},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":3.4641016151377544},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{":":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":21,"docs":{"13":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.449489742783178},"20":{"tf":1.0},"231":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"281":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.0}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":4,"docs":{"140":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"62":{"tf":1.7320508075688772},"63":{"tf":1.0}}}},"t":{"df":3,"docs":{"212":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"131":{"tf":1.0}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"152":{"tf":1.0},"2":{"tf":1.0},"243":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}}},"q":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":1,"docs":{"240":{"tf":1.0}},"u":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"130":{"tf":1.0},"193":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"143":{"tf":1.0},"18":{"tf":1.4142135623730951},"266":{"tf":1.0},"287":{"tf":1.0},"44":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"297":{"tf":1.0},"330":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"228":{"tf":1.0},"301":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"124":{"tf":1.7320508075688772},"287":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"313":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":1,"docs":{"222":{"tf":1.0}},"g":{"df":6,"docs":{"115":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"70":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"276":{"tf":1.0},"79":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"271":{"tf":1.0},"279":{"tf":1.0}}}},"df":9,"docs":{"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"230":{"tf":1.0},"26":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"d":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":25,"docs":{"10":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":3.3166247903554},"15":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"155":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"21":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"240":{"tf":1.4142135623730951},"258":{"tf":1.0},"308":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.7320508075688772},"56":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"df":1,"docs":{"230":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"230":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"230":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"i":{"df":5,"docs":{"13":{"tf":1.0},"212":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}}},"m":{"df":1,"docs":{"317":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"36":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"119":{"tf":1.0},"191":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"v":{"df":7,"docs":{"148":{"tf":1.0},"258":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"255":{"tf":1.7320508075688772},"279":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"212":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"69":{"tf":1.0},"70":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":2.23606797749979}},"e":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"64":{"tf":1.0}}}}}}}},"df":3,"docs":{"266":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"222":{"tf":1.0},"27":{"tf":1.0},"297":{"tf":1.0},"306":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"145":{"tf":1.4142135623730951},"187":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.4142135623730951},"21":{"tf":1.0},"237":{"tf":1.0},"287":{"tf":1.0},"316":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"317":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"256":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"269":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"313":{"tf":1.0}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"158":{"tf":1.0},"231":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"250":{"tf":2.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"305":{"tf":2.0},"309":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"322":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":2,"docs":{"203":{"tf":1.0},"207":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":14,"docs":{"193":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":1.4142135623730951},"315":{"tf":2.0},"318":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":2.0},"61":{"tf":1.7320508075688772},"62":{"tf":1.0},"63":{"tf":2.0},"64":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"215":{"tf":1.0}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"182":{"tf":1.0}}},"df":5,"docs":{"120":{"tf":1.4142135623730951},"141":{"tf":1.0},"195":{"tf":1.0},"289":{"tf":1.0},"296":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":7,"docs":{"227":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"297":{"tf":1.0},"322":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"24":{"tf":1.0},"240":{"tf":1.0},"314":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"65":{"tf":1.0},"66":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":3,"docs":{"19":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"210":{"tf":1.4142135623730951},"215":{"tf":1.7320508075688772},"25":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"324":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"211":{"tf":1.4142135623730951},"212":{"tf":1.0},"216":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":13,"docs":{"105":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.0},"280":{"tf":1.0},"302":{"tf":1.0},"323":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"277":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":1.7320508075688772},"326":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":20,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"174":{"tf":1.0},"19":{"tf":1.0},"215":{"tf":1.0},"233":{"tf":1.7320508075688772},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"279":{"tf":1.0},"30":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"89":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"117":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"250":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}},"v":{"df":8,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"204":{"tf":1.4142135623730951},"216":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"272":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"141":{"tf":1.0},"216":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":7,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.0},"324":{"tf":1.0},"45":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"240":{"tf":1.4142135623730951},"287":{"tf":1.0},"308":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":17,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.4142135623730951},"250":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"313":{"tf":1.4142135623730951},"33":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":4,"docs":{"252":{"tf":1.0},"271":{"tf":1.0},"42":{"tf":1.0},"69":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"144":{"tf":1.4142135623730951},"151":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":80,"docs":{"10":{"tf":2.0},"102":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":2.0},"135":{"tf":1.0},"141":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.7320508075688772},"164":{"tf":3.1622776601683795},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.23606797749979},"170":{"tf":2.0},"173":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.0},"189":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"243":{"tf":3.0},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":1.0},"258":{"tf":2.6457513110645907},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"281":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.7320508075688772},"304":{"tf":3.7416573867739413},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":1.0},"48":{"tf":2.0},"71":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951},"86":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"164":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}},"df":25,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":3.872983346207417},"164":{"tf":2.0},"171":{"tf":1.4142135623730951},"212":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.23606797749979},"288":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"41":{"tf":3.1622776601683795},"43":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":2.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"143":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"247":{"tf":1.0},"292":{"tf":1.0},"322":{"tf":1.0},"40":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"305":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"1":{"6":{"0":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"79":{"tf":1.4142135623730951},"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"279":{"tf":1.0},"312":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"u":{"8":{"(":{"2":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":6,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"222":{"tf":1.0},"266":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"d":{"df":4,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"182":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"c":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":2.0},"219":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":6,"docs":{"123":{"tf":1.0},"146":{"tf":1.0},"233":{"tf":2.0},"241":{"tf":1.0},"37":{"tf":1.0},"59":{"tf":1.0}}}},"n":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":26,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.0},"243":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"287":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"a":{"c":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"(":{"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":2.0},"243":{"tf":2.23606797749979}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":6,"docs":{"139":{"tf":1.0},"204":{"tf":1.0},"219":{"tf":2.449489742783178},"227":{"tf":1.0},"314":{"tf":1.0},"40":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"233":{"tf":1.0},"275":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"40":{"tf":1.0},"57":{"tf":1.7320508075688772}}}}}},"s":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}}},"df":5,"docs":{"1":{"tf":1.0},"192":{"tf":1.0},"227":{"tf":1.0},"279":{"tf":1.7320508075688772},"9":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}},"s":{"a":{"df":1,"docs":{"266":{"tf":2.23606797749979}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"df":16,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"152":{"tf":1.0},"17":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.0},"233":{"tf":1.7320508075688772},"255":{"tf":1.0},"272":{"tf":1.0},"281":{"tf":1.0},"309":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"52":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"247":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"230":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"266":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":7,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"323":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":10,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"141":{"tf":1.0},"171":{"tf":1.0},"191":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"p":{"2":{"5":{"6":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"14":{"tf":1.0},"200":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"292":{"tf":1.4142135623730951},"35":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"e":{"df":14,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.4142135623730951},"219":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.0},"330":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":1,"docs":{"212":{"tf":1.0}}}},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"206":{"tf":1.0},"316":{"tf":1.7320508075688772}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"28":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"=":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"[":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"2":{"=":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}},"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"z":{"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{".":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"243":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"d":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"(":{"5":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":4,"docs":{"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":4,"docs":{"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"48":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.4142135623730951}},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"163":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"1":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"258":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"[":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"x":{"df":1,"docs":{"258":{"tf":2.0}}}},"df":1,"docs":{"258":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"[":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"5":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}}}}},"u":{"df":0,"docs":{},"m":{"(":{"[":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"173":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":3,"docs":{"231":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":36,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.0},"144":{"tf":1.4142135623730951},"146":{"tf":2.6457513110645907},"148":{"tf":1.0},"152":{"tf":2.6457513110645907},"153":{"tf":1.4142135623730951},"156":{"tf":1.0},"16":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":2.0},"240":{"tf":3.0},"249":{"tf":1.0},"275":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.0}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"158":{"tf":1.0},"59":{"tf":1.0}}}}}},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"258":{"tf":1.0},"42":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":13,"docs":{"135":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"'":{"df":2,"docs":{"148":{"tf":1.0},"42":{"tf":1.0}}},"df":4,"docs":{"141":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"41":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"t":{"df":4,"docs":{"189":{"tf":1.0},"240":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":8,"docs":{"124":{"tf":1.0},"132":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"290":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"19":{"tf":2.23606797749979},"235":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"19":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":18,"docs":{"105":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.7320508075688772},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"315":{"tf":1.0},"328":{"tf":1.0}}}}},"v":{"df":2,"docs":{"211":{"tf":1.4142135623730951},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}}},"t":{"df":14,"docs":{"126":{"tf":1.4142135623730951},"139":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":2.0},"266":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.7320508075688772},"43":{"tf":1.0},"52":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"19":{"tf":1.0},"255":{"tf":1.0},"40":{"tf":1.0}}}}},"x":{"df":1,"docs":{"320":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"74":{"tf":1.4142135623730951},"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"315":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"182":{"tf":1.4142135623730951},"247":{"tf":1.0},"27":{"tf":1.4142135623730951},"280":{"tf":2.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"287":{"tf":1.0}}}}},"df":2,"docs":{"197":{"tf":1.0},"272":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"2":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.4142135623730951},"271":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":2,"docs":{"146":{"tf":1.0},"287":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"272":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"132":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"283":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":17,"docs":{"135":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":2.0},"18":{"tf":1.7320508075688772},"190":{"tf":1.0},"240":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"9":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"204":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":11,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}},"i":{"df":7,"docs":{"18":{"tf":1.4142135623730951},"203":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"19":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0},"255":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"327":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":5,"docs":{"21":{"tf":1.0},"243":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"=":{"5":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":16,"docs":{"113":{"tf":1.0},"131":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.0},"250":{"tf":1.7320508075688772},"268":{"tf":2.0},"279":{"tf":1.0},"292":{"tf":3.0},"299":{"tf":1.0},"312":{"tf":2.23606797749979},"320":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"164":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"t":{"df":6,"docs":{"161":{"tf":1.0},"177":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"256":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"40":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"c":{"df":3,"docs":{"237":{"tf":1.0},"26":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"240":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"318":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"143":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"m":{"df":0,"docs":{},"e":{"_":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"168":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":2.0}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"233":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"137":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.4142135623730951}}}},"df":1,"docs":{"178":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"169":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951}}}}}},"v":{"df":1,"docs":{"145":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.0},"249":{"tf":1.0},"275":{"tf":1.0},"35":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":8,"docs":{"130":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":1.7320508075688772},"266":{"tf":1.7320508075688772},"275":{"tf":1.0},"277":{"tf":1.0}},"e":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"200":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"277":{"tf":1.0},"293":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"317":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"139":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":15,"docs":{"1":{"tf":1.0},"113":{"tf":1.4142135623730951},"132":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.4142135623730951},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"26":{"tf":1.0},"289":{"tf":1.0},"40":{"tf":2.0},"44":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":12,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"161":{"tf":1.0},"173":{"tf":1.0},"233":{"tf":1.0},"255":{"tf":2.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"30":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"177":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"130":{"tf":1.0},"226":{"tf":1.0},"275":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"113":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":11,"docs":{"113":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":2.6457513110645907},"207":{"tf":1.4142135623730951},"213":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":6,"docs":{"16":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"r":{"d":{"df":12,"docs":{"132":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":15,"docs":{"127":{"tf":2.0},"13":{"tf":1.0},"15":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"273":{"tf":1.0},"29":{"tf":1.0},"305":{"tf":1.0},"315":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"5":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":24,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":1.7320508075688772},"139":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"7":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":27,"docs":{"113":{"tf":3.7416573867739413},"136":{"tf":1.0},"157":{"tf":3.7416573867739413},"158":{"tf":2.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"161":{"tf":1.7320508075688772},"162":{"tf":2.0},"163":{"tf":2.449489742783178},"164":{"tf":2.0},"165":{"tf":2.0},"166":{"tf":1.7320508075688772},"167":{"tf":1.4142135623730951},"168":{"tf":2.23606797749979},"169":{"tf":2.23606797749979},"170":{"tf":1.7320508075688772},"171":{"tf":2.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"288":{"tf":2.0},"289":{"tf":1.0},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"n":{"df":1,"docs":{"157":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":8,"docs":{"1":{"tf":1.0},"119":{"tf":1.0},"175":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"252":{"tf":1.0},"293":{"tf":1.0},"316":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"320":{"tf":1.0}}}}},"d":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"230":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{":":{":":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"230":{"tf":1.0},"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"273":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"14":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":1.0},"279":{"tf":1.0},"61":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"21":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"266":{"tf":1.0},"287":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":34,"docs":{"10":{"tf":2.0},"113":{"tf":1.7320508075688772},"137":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":2.449489742783178},"152":{"tf":1.4142135623730951},"153":{"tf":1.7320508075688772},"155":{"tf":1.0},"156":{"tf":1.0},"161":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.0},"202":{"tf":1.4142135623730951},"203":{"tf":2.0},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"219":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"312":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"135":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"197":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":2.6457513110645907},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"268":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":1,"docs":{"306":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"'":{"df":1,"docs":{"197":{"tf":1.0}}},"1":{"0":{"0":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"312":{"tf":1.0},"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"<":{"1":{"0":{"0":{"df":11,"docs":{"10":{"tf":2.449489742783178},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"296":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},">":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"296":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"133":{"tf":1.0},"197":{"tf":1.0},"243":{"tf":1.4142135623730951},"296":{"tf":1.0}}},"4":{"0":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"293":{"tf":1.0}}},"df":1,"docs":{"197":{"tf":1.0}}},"3":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":1.0}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"126":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":24,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"124":{"tf":1.4142135623730951},"126":{"tf":1.7320508075688772},"139":{"tf":1.0},"171":{"tf":1.7320508075688772},"18":{"tf":1.0},"181":{"tf":1.4142135623730951},"187":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"304":{"tf":2.0},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"33":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"296":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"3":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":46,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":3.0},"132":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":2.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"163":{"tf":1.7320508075688772},"172":{"tf":1.0},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"187":{"tf":1.0},"193":{"tf":3.4641016151377544},"195":{"tf":1.0},"196":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"253":{"tf":1.0},"258":{"tf":2.0},"265":{"tf":1.0},"268":{"tf":2.6457513110645907},"269":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":2.0},"312":{"tf":2.8284271247461903},"41":{"tf":2.449489742783178},"43":{"tf":2.0},"48":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"130":{"tf":1.0},"191":{"tf":1.4142135623730951},"243":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"216":{"tf":1.0},"243":{"tf":1.0},"46":{"tf":1.0}}}}}},"u":{"b":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"25":{"tf":1.0}}},"df":5,"docs":{"233":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"29":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"308":{"tf":1.0}}}},"t":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"182":{"tf":1.0},"312":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"280":{"tf":1.0},"284":{"tf":1.0}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"h":{"df":19,"docs":{"10":{"tf":1.0},"136":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.4142135623730951},"151":{"tf":1.0},"19":{"tf":1.4142135623730951},"197":{"tf":1.7320508075688772},"21":{"tf":1.0},"213":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"27":{"tf":1.0},"299":{"tf":1.0},"316":{"tf":1.4142135623730951},"321":{"tf":1.0},"40":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}},"i":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"m":{"df":8,"docs":{"141":{"tf":1.0},"166":{"tf":2.0},"167":{"tf":2.0},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"243":{"tf":1.7320508075688772},"299":{"tf":1.0},"309":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"df":2,"docs":{"20":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"292":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":28,"docs":{"160":{"tf":1.0},"22":{"tf":1.0},"226":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.7320508075688772},"246":{"tf":1.0},"249":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"279":{"tf":2.0},"287":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":3.4641016151377544},"316":{"tf":2.23606797749979},"318":{"tf":1.0},"50":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"19":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"182":{"tf":1.0},"183":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{},"x":{"df":49,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"308":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":10,"docs":{"113":{"tf":1.0},"186":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"57":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}},"l":{"df":3,"docs":{"146":{"tf":1.0},"182":{"tf":1.0},"287":{"tf":1.0}}}},"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":5,"docs":{"210":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.0},"62":{"tf":1.7320508075688772},"63":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":16,"docs":{"108":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":2.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"284":{"tf":1.0},"312":{"tf":1.4142135623730951},"322":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"250":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"w":{"df":3,"docs":{"176":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0}}}},"df":13,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"132":{"tf":1.0},"192":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"243":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"210":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"16":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"249":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"n":{"df":4,"docs":{"159":{"tf":1.7320508075688772},"17":{"tf":1.0},"279":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":5,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"275":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"26":{"tf":1.0},"45":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"33":{"tf":1.0}},"e":{"c":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}},"df":1,"docs":{"222":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":23,"docs":{"13":{"tf":2.23606797749979},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"222":{"tf":3.7416573867739413},"223":{"tf":1.4142135623730951},"230":{"tf":2.23606797749979},"233":{"tf":2.23606797749979},"241":{"tf":1.0},"26":{"tf":1.4142135623730951},"275":{"tf":1.0},"281":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":3.0},"44":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.23606797749979},"61":{"tf":1.0},"62":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":2,"docs":{"19":{"tf":1.4142135623730951},"5":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"216":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"146":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}}}},"y":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":8,"docs":{"115":{"tf":1.0},"130":{"tf":1.0},"240":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"69":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"280":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"200":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"132":{"tf":1.0},"141":{"tf":1.0},"24":{"tf":1.0},"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"w":{"df":1,"docs":{"296":{"tf":1.0}},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"u":{"df":4,"docs":{"240":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"e":{"df":22,"docs":{"1":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"139":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":2.449489742783178},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"1":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"205":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":8,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"19":{"tf":1.0},"305":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"212":{"tf":1.0},"249":{"tf":1.0},"38":{"tf":1.0},"50":{"tf":1.0}}}},"p":{"df":2,"docs":{"130":{"tf":1.0},"141":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"182":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"160":{"tf":1.0},"206":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"132":{"tf":1.0}}},"df":9,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":3.605551275463989},"233":{"tf":2.0},"237":{"tf":2.0},"240":{"tf":3.1622776601683795},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.4142135623730951},"16":{"tf":2.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"249":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"330":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"308":{"tf":1.0},"313":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951}}}},"i":{"df":5,"docs":{"10":{"tf":1.4142135623730951},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"9":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"266":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":26,"docs":{"106":{"tf":1.0},"112":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":2.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.4142135623730951},"240":{"tf":2.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"272":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":25,"docs":{"102":{"tf":1.0},"113":{"tf":1.4142135623730951},"131":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":4.47213595499958},"175":{"tf":1.0},"178":{"tf":1.0},"187":{"tf":1.0},"191":{"tf":3.7416573867739413},"195":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"296":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.7320508075688772},"97":{"tf":1.0}},"e":{"'":{"df":1,"docs":{"191":{"tf":1.0}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"160":{"tf":1.7320508075688772}}}}}}}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"191":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"240":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"224":{"tf":1.0},"235":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"37":{"tf":1.0},"46":{"tf":1.0},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}}}}},"o":{"'":{"df":1,"docs":{"190":{"tf":1.0}}},"df":10,"docs":{"117":{"tf":1.0},"130":{"tf":1.4142135623730951},"247":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.0}}}},"x":{".":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":3,"docs":{"19":{"tf":1.0},"231":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}}},"df":88,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"113":{"tf":3.7416573867739413},"119":{"tf":1.0},"127":{"tf":2.23606797749979},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":3.0},"133":{"tf":2.0},"134":{"tf":3.1622776601683795},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"159":{"tf":1.4142135623730951},"16":{"tf":1.0},"160":{"tf":1.0},"164":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":2.23606797749979},"177":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":1.0},"184":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":3.3166247903554},"188":{"tf":1.7320508075688772},"189":{"tf":2.449489742783178},"190":{"tf":2.23606797749979},"191":{"tf":4.69041575982343},"192":{"tf":2.0},"193":{"tf":2.8284271247461903},"194":{"tf":1.7320508075688772},"195":{"tf":1.4142135623730951},"196":{"tf":2.8284271247461903},"197":{"tf":2.23606797749979},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.7320508075688772},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":2.449489742783178},"244":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":2.23606797749979},"281":{"tf":1.0},"283":{"tf":2.449489742783178},"287":{"tf":2.449489742783178},"290":{"tf":1.0},"292":{"tf":2.23606797749979},"293":{"tf":1.7320508075688772},"296":{"tf":2.0},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"c":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"+":{"0":{"0":{"3":{"0":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"127":{"tf":1.0}}}},"7":{"8":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"2":{"8":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"5":{"5":{"3":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"115":{"tf":1.0},"190":{"tf":1.0},"243":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},",":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":2,"docs":{"101":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"[":{"1":{"0":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"3":{"df":3,"docs":{"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":92,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"127":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":4.47213595499958},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":2.23606797749979},"175":{"tf":1.4142135623730951},"177":{"tf":2.0},"178":{"tf":2.6457513110645907},"179":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"193":{"tf":1.7320508075688772},"196":{"tf":2.23606797749979},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":3.0},"243":{"tf":2.8284271247461903},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"258":{"tf":3.7416573867739413},"262":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":3.0},"269":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":2.449489742783178},"283":{"tf":2.23606797749979},"287":{"tf":1.0},"288":{"tf":2.0},"292":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":2.0},"304":{"tf":4.69041575982343},"308":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"312":{"tf":4.69041575982343},"313":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":3.0},"70":{"tf":2.0},"72":{"tf":2.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":2.449489742783178},"92":{"tf":1.7320508075688772},"95":{"tf":2.0},"96":{"tf":2.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"180":{"tf":1.0},"190":{"tf":1.0},"240":{"tf":2.0},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"275":{"tf":2.449489742783178}}},"df":0,"docs":{}},"8":{"(":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"0":{"0":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":3,"docs":{"230":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"[":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"292":{"tf":1.4142135623730951}}}},"df":19,"docs":{"115":{"tf":1.0},"134":{"tf":1.0},"162":{"tf":1.7320508075688772},"163":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"237":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"243":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"283":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":3.872983346207417},"309":{"tf":2.6457513110645907},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"279":{"tf":1.0}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"185":{"tf":2.23606797749979},"250":{"tf":1.0},"287":{"tf":1.0}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":2,"docs":{"171":{"tf":1.0},"30":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"237":{"tf":1.0}},"n":{"df":2,"docs":{"296":{"tf":1.0},"304":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":2.0},"249":{"tf":1.0},"271":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"310":{"tf":1.0}},"v":{"3":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":13,"docs":{"164":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.4142135623730951},"187":{"tf":1.0},"191":{"tf":2.449489742783178},"196":{"tf":1.0},"198":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"271":{"tf":1.0},"302":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0}}},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"269":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"326":{"tf":1.0}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"222":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":2.8284271247461903},"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"190":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.7320508075688772},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"327":{"tf":1.0},"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"160":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"326":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"153":{"tf":1.0},"211":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":2.0},"66":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":9,"docs":{"13":{"tf":1.0},"217":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0},"312":{"tf":1.0},"41":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"139":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"237":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"316":{"tf":1.0}}}},"df":117,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"130":{"tf":2.449489742783178},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"136":{"tf":1.0},"139":{"tf":1.0},"14":{"tf":1.7320508075688772},"140":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"15":{"tf":1.7320508075688772},"152":{"tf":1.7320508075688772},"153":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.7320508075688772},"165":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"191":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"200":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"211":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"222":{"tf":1.7320508075688772},"223":{"tf":1.0},"230":{"tf":2.449489742783178},"231":{"tf":1.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"250":{"tf":1.0},"255":{"tf":2.0},"256":{"tf":1.0},"258":{"tf":2.449489742783178},"26":{"tf":2.0},"265":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":2.23606797749979},"28":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"29":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":1.0},"30":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.0},"315":{"tf":1.0},"32":{"tf":1.7320508075688772},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"33":{"tf":1.4142135623730951},"38":{"tf":1.0},"40":{"tf":3.605551275463989},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.23606797749979},"46":{"tf":2.23606797749979},"48":{"tf":1.0},"49":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.23606797749979},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"84":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":17,"docs":{"1":{"tf":1.0},"187":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"211":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":2.0},"44":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"/":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"d":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"197":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"277":{"tf":1.7320508075688772},"314":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"32":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"0":{".":{"8":{".":{"0":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"212":{"tf":2.23606797749979}}},"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.0}}}}}},"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"v":{"df":3,"docs":{"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"1":{"df":4,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0}}},"2":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"288":{"tf":1.0}}},"3":{"df":1,"docs":{"160":{"tf":1.0}}},"4":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"160":{"tf":1.0}}},"6":{"df":1,"docs":{"160":{"tf":1.0}}},"7":{"df":1,"docs":{"160":{"tf":1.0}}},"8":{")":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"313":{"tf":1.0}}},"2":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"165":{"tf":1.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":2.0},"255":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}},"i":{"d":{"df":7,"docs":{"197":{"tf":1.0},"237":{"tf":1.0},"289":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"43":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":67,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":3.3166247903554},"146":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":2.0},"179":{"tf":1.0},"181":{"tf":1.0},"187":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"192":{"tf":1.0},"196":{"tf":2.449489742783178},"197":{"tf":2.0},"200":{"tf":1.7320508075688772},"201":{"tf":2.0},"203":{"tf":2.0},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"230":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":3.4641016151377544},"265":{"tf":1.0},"271":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":2.23606797749979},"313":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":2.6457513110645907}},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"299":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}}}}}},"[":{"5":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":22,"docs":{"130":{"tf":1.4142135623730951},"137":{"tf":1.7320508075688772},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.0},"309":{"tf":1.0},"40":{"tf":3.605551275463989},"41":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}},"e":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"297":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":4,"docs":{"127":{"tf":1.0},"191":{"tf":1.0},"289":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":7,"docs":{"196":{"tf":1.0},"230":{"tf":1.0},"25":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.7320508075688772},"109":{"tf":1.4142135623730951},"110":{"tf":1.0}}}}}},"df":1,"docs":{"27":{"tf":1.0}},"r":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"164":{"tf":1.0},"219":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0}},"f":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":4,"docs":{"219":{"tf":2.6457513110645907},"296":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"=":{"0":{".":{"2":{"3":{".":{"0":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"119":{"tf":1.0},"136":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"19":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"237":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"312":{"tf":1.0},"315":{"tf":1.0},"330":{"tf":1.0},"59":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}}}}}}}},"i":{"a":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.0},"191":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"316":{"tf":1.0},"323":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"119":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":2.23606797749979},"135":{"tf":1.4142135623730951},"138":{"tf":1.0},"160":{"tf":1.0},"193":{"tf":1.0},"241":{"tf":1.0},"265":{"tf":1.0},"308":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"27":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":4,"docs":{"215":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":1.0},"50":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"42":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.0},"35":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"240":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"46":{"tf":1.0}},"n":{"df":6,"docs":{"113":{"tf":1.0},"171":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"241":{"tf":1.0},"269":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":15,"docs":{"152":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"209":{"tf":1.0},"219":{"tf":1.0},"250":{"tf":1.0},"268":{"tf":1.4142135623730951},"276":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"8":{"tf":1.0}}}},"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"276":{"tf":1.0}}}},"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"19":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"i":{"df":6,"docs":{"149":{"tf":1.0},"255":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"21":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"126":{"tf":1.0},"138":{"tf":1.0},"20":{"tf":1.0},"240":{"tf":1.0},"327":{"tf":1.0},"41":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":3,"docs":{"145":{"tf":1.0},"177":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":1,"docs":{"159":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"106":{"tf":1.0},"143":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"167":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"197":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"(":{"_":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.0}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"313":{"tf":1.0}},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"48":{"tf":1.0}}}}}},"df":3,"docs":{"37":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"141":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"18":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.7320508075688772},"292":{"tf":1.0},"305":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.0},"23":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"302":{"tf":1.0},"313":{"tf":2.0},"321":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"272":{"tf":1.0},"296":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":2,"docs":{"197":{"tf":1.0},"250":{"tf":1.0}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"113":{"tf":1.0},"152":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":2.0},"230":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":2,"docs":{"26":{"tf":1.0},"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"53":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"141":{"tf":1.4142135623730951},"146":{"tf":2.8284271247461903},"152":{"tf":1.0},"153":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"227":{"tf":1.0},"233":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"9":{"tf":1.0}},"r":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"107":{"tf":3.4641016151377544},"230":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"135":{"tf":1.0},"164":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.0},"192":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.4142135623730951},"30":{"tf":1.0},"326":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"255":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"16":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"146":{"tf":1.0}}}}},"x":{"1":{"df":3,"docs":{"178":{"tf":1.0},"240":{"tf":1.0},"95":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"8":{"6":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"100":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"115":{"tf":2.8284271247461903},"131":{"tf":1.0},"141":{"tf":2.23606797749979},"178":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":2.23606797749979},"244":{"tf":1.0},"25":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":2.0},"6":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}}}}},"y":{"1":{"df":4,"docs":{"240":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":1,"docs":{"250":{"tf":1.0}}}},"df":17,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"141":{"tf":2.449489742783178},"178":{"tf":1.4142135623730951},"185":{"tf":1.0},"240":{"tf":2.23606797749979},"243":{"tf":2.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"265":{"tf":1.7320508075688772},"275":{"tf":2.23606797749979},"296":{"tf":1.4142135623730951},"312":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"119":{"tf":1.0},"141":{"tf":1.0},"185":{"tf":1.7320508075688772},"293":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"v":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"l":{"'":{"df":2,"docs":{"247":{"tf":1.0},"271":{"tf":1.0}}},"c":{"df":1,"docs":{"294":{"tf":1.0}}},"df":12,"docs":{"1":{"tf":1.0},"223":{"tf":1.0},"250":{"tf":1.4142135623730951},"271":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.7320508075688772},"288":{"tf":1.0},"309":{"tf":1.4142135623730951},"310":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.7320508075688772},"57":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}}}}}},"z":{"df":4,"docs":{"115":{"tf":1.0},"120":{"tf":2.449489742783178},"185":{"tf":1.0},"296":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":9,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"191":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"breadcrumbs":{"root":{"0":{".":{"1":{".":{"0":{"df":3,"docs":{"158":{"tf":1.0},"296":{"tf":1.0},"315":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":2,"docs":{"247":{"tf":1.0},"248":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":2,"docs":{"236":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":2,"docs":{"225":{"tf":1.4142135623730951},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.4142135623730951}}},"1":{"8":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"0":{"0":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"267":{"tf":2.0},"315":{"tf":1.4142135623730951}}},"2":{"df":4,"docs":{"236":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"274":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951}}},"3":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951}}},"4":{"df":3,"docs":{"232":{"tf":1.4142135623730951},"254":{"tf":2.0},"303":{"tf":1.4142135623730951}}},"5":{"df":6,"docs":{"232":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"251":{"tf":2.0},"298":{"tf":1.4142135623730951}}},"6":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951}}},"7":{"df":2,"docs":{"242":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}},"8":{"df":2,"docs":{"225":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951}}},"9":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"1":{"1":{"_":{"1":{"0":{"0":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"6":{"4":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":30,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"127":{"tf":2.0},"16":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.4142135623730951},"190":{"tf":2.449489742783178},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":3.0},"237":{"tf":1.0},"240":{"tf":2.449489742783178},"243":{"tf":2.23606797749979},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.7320508075688772}},"o":{"7":{"0":{"df":1,"docs":{"127":{"tf":1.0}}},"7":{"df":2,"docs":{"124":{"tf":1.0},"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"1":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"6":{"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"112":{"tf":4.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"…":{"0":{"0":{"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"204":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"171":{"tf":1.0},"204":{"tf":1.0},"292":{"tf":1.0}}},"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"c":{"3":{"7":{"9":{"a":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"1":{"0":{"5":{"8":{"a":{"3":{"1":{"4":{"1":{"8":{"2":{"2":{"9":{"8":{"5":{"7":{"3":{"3":{"c":{"b":{"d":{"d":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"d":{"0":{"df":0,"docs":{},"f":{"d":{"8":{"d":{"6":{"c":{"1":{"0":{"4":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"b":{"df":0,"docs":{},"f":{"5":{"a":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"9":{"a":{"b":{"1":{"6":{"3":{"b":{"c":{"7":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"3":{"4":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}},"9":{"7":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"4":{"7":{"1":{"b":{"0":{"9":{"df":0,"docs":{},"f":{"a":{"9":{"3":{"c":{"a":{"a":{"df":0,"docs":{},"f":{"1":{"3":{"c":{"b":{"df":0,"docs":{},"f":{"4":{"4":{"3":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"0":{"9":{"c":{"c":{"4":{"3":{"2":{"8":{"df":0,"docs":{},"f":{"5":{"a":{"6":{"2":{"a":{"a":{"d":{"4":{"5":{"df":0,"docs":{},"f":{"4":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"6":{"c":{"3":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"c":{"6":{"8":{"0":{"5":{"9":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"9":{"b":{"b":{"4":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"b":{"9":{"df":0,"docs":{},"e":{"4":{"4":{"df":0,"docs":{},"e":{"2":{"a":{"3":{"2":{"2":{"3":{"4":{"d":{"a":{"8":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"6":{"1":{"c":{"d":{"6":{"3":{"9":{"1":{"9":{"3":{"5":{"4":{"b":{"c":{"0":{"6":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"1":{"df":0,"docs":{},"e":{"3":{"c":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"b":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"126":{"tf":1.0}}}},"2":{"2":{"6":{"0":{"6":{"8":{"4":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"8":{"6":{"7":{"9":{"3":{"9":{"1":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"df":0,"docs":{},"e":{"2":{"1":{"d":{"df":0,"docs":{},"f":{"5":{"4":{"4":{"c":{"3":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"2":{"df":0,"docs":{},"f":{"3":{"5":{"0":{"4":{"d":{"df":0,"docs":{},"e":{"8":{"a":{"7":{"9":{"d":{"9":{"1":{"5":{"9":{"df":0,"docs":{},"e":{"c":{"a":{"2":{"d":{"9":{"8":{"d":{"9":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"a":{"8":{"df":0,"docs":{},"e":{"b":{"0":{"b":{"0":{"9":{"9":{"6":{"2":{"5":{"2":{"c":{"b":{"5":{"4":{"8":{"a":{"4":{"4":{"8":{"7":{"d":{"a":{"9":{"7":{"b":{"0":{"2":{"4":{"2":{"2":{"df":0,"docs":{},"e":{"b":{"c":{"0":{"df":0,"docs":{},"e":{"8":{"3":{"4":{"6":{"1":{"3":{"df":0,"docs":{},"f":{"9":{"5":{"4":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"7":{"df":0,"docs":{},"e":{"0":{"a":{"df":0,"docs":{},"f":{"d":{"c":{"1":{"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"2":{"3":{"a":{"df":0,"docs":{},"f":{"9":{"a":{"5":{"c":{"df":0,"docs":{},"e":{"2":{"b":{"a":{"2":{"7":{"9":{"6":{"c":{"1":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"4":{"5":{"3":{"a":{"3":{"7":{"0":{"df":0,"docs":{},"e":{"b":{"0":{"a":{"df":0,"docs":{},"f":{"8":{"c":{"2":{"1":{"2":{"d":{"9":{"d":{"c":{"9":{"a":{"c":{"d":{"8":{"df":0,"docs":{},"f":{"c":{"0":{"2":{"c":{"2":{"df":0,"docs":{},"e":{"9":{"0":{"7":{"b":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"3":{"6":{"8":{"df":0,"docs":{},"e":{"2":{"8":{"3":{"8":{"1":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"c":{"c":{"b":{"5":{"df":0,"docs":{},"f":{"a":{"8":{"1":{"df":0,"docs":{},"f":{"c":{"2":{"6":{"c":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"f":{"0":{"4":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"b":{"df":0,"docs":{},"f":{"d":{"d":{"8":{"5":{"d":{"7":{"df":0,"docs":{},"e":{"d":{"3":{"a":{"b":{"3":{"6":{"9":{"8":{"d":{"6":{"3":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"9":{"0":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"8":{"9":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"f":{"3":{"6":{"df":0,"docs":{},"e":{"3":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"0":{"df":0,"docs":{},"f":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"5":{"2":{"1":{"1":{"0":{"c":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"9":{"1":{"0":{"8":{"9":{"2":{"4":{"9":{"2":{"6":{"df":0,"docs":{},"e":{"4":{"5":{"df":0,"docs":{},"f":{"0":{"b":{"0":{"c":{"8":{"6":{"8":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"d":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"1":{"6":{"d":{"3":{"2":{"4":{"2":{"d":{"c":{"7":{"1":{"5":{"df":0,"docs":{},"f":{"6":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"4":{"4":{"4":{"9":{"9":{"d":{"5":{"d":{"2":{"7":{"b":{"b":{"1":{"8":{"6":{"3":{"0":{"8":{"b":{"7":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"df":0,"docs":{},"f":{"0":{"2":{"a":{"c":{"5":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"6":{"a":{"3":{"d":{"1":{"4":{"7":{"c":{"1":{"8":{"6":{"b":{"2":{"1":{"df":0,"docs":{},"f":{"b":{"1":{"b":{"7":{"6":{"df":0,"docs":{},"e":{"1":{"8":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"0":{"2":{"df":0,"docs":{},"e":{"4":{"7":{"8":{"8":{"7":{"5":{"0":{"7":{"a":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"7":{"4":{"3":{"c":{"b":{"a":{"c":{"6":{"b":{"a":{"2":{"9":{"1":{"df":0,"docs":{},"e":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"9":{"b":{"df":0,"docs":{},"e":{"6":{"b":{"d":{"7":{"6":{"3":{"9":{"5":{"0":{"b":{"b":{"1":{"6":{"0":{"4":{"1":{"a":{"0":{"a":{"8":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"0":{"6":{"4":{"4":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"a":{"0":{"2":{"9":{"b":{"8":{"5":{"0":{"4":{"5":{"b":{"6":{"8":{"1":{"8":{"1":{"5":{"8":{"5":{"d":{"9":{"7":{"8":{"1":{"6":{"a":{"9":{"1":{"6":{"8":{"7":{"1":{"c":{"a":{"8":{"d":{"3":{"c":{"2":{"0":{"8":{"c":{"1":{"6":{"d":{"8":{"7":{"c":{"df":0,"docs":{},"f":{"d":{"4":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"b":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"7":{"7":{"8":{"0":{"1":{"c":{"1":{"5":{"b":{"b":{"7":{"5":{"3":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"b":{"9":{"df":0,"docs":{},"e":{"3":{"3":{"d":{"c":{"b":{"6":{"1":{"3":{"c":{"9":{"3":{"c":{"b":{"df":0,"docs":{},"e":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"b":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"e":{"c":{"a":{"b":{"8":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"b":{"4":{"1":{"a":{"4":{"1":{"7":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"b":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"8":{"1":{"4":{"9":{"5":{"9":{"b":{"2":{"c":{"1":{"4":{"7":{"3":{"6":{"6":{"b":{"6":{"3":{"2":{"3":{"df":0,"docs":{},"f":{"1":{"7":{"b":{"6":{"df":0,"docs":{},"f":{"7":{"0":{"6":{"0":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"2":{"4":{"b":{"5":{"8":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"a":{"7":{"c":{"a":{"8":{"4":{"8":{"5":{"a":{"df":0,"docs":{},"e":{"6":{"7":{"b":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"b":{"d":{"df":0,"docs":{},"e":{"2":{"a":{"9":{"9":{"4":{"b":{"df":0,"docs":{},"f":{"2":{"d":{"df":0,"docs":{},"e":{"c":{"8":{"c":{"1":{"1":{"df":0,"docs":{},"f":{"b":{"0":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"9":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"0":{"df":0,"docs":{},"f":{"a":{"1":{"1":{"5":{"0":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"b":{"8":{"df":0,"docs":{},"f":{"3":{"3":{"c":{"1":{"3":{"0":{"b":{"4":{"5":{"6":{"1":{"0":{"5":{"2":{"6":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"4":{"2":{"df":1,"docs":{"88":{"tf":1.0}}},"5":{"6":{"df":0,"docs":{},"e":{"9":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"df":0,"docs":{},"e":{"1":{"9":{"7":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"3":{"df":0,"docs":{},"e":{"8":{"5":{"a":{"3":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"0":{"4":{"9":{"a":{"3":{"b":{"a":{"3":{"4":{"c":{"2":{"2":{"8":{"9":{"b":{"4":{"c":{"8":{"6":{"0":{"df":0,"docs":{},"f":{"c":{"0":{"b":{"0":{"c":{"6":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"8":{"c":{"9":{"b":{"d":{"df":0,"docs":{},"f":{"2":{"6":{"7":{"df":0,"docs":{},"e":{"6":{"0":{"9":{"6":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"2":{"0":{"6":{"5":{"6":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"7":{"6":{"8":{"2":{"0":{"4":{"5":{"7":{"4":{"6":{"8":{"6":{"5":{"7":{"2":{"2":{"0":{"7":{"0":{"7":{"2":{"6":{"df":0,"docs":{},"f":{"7":{"6":{"6":{"9":{"6":{"4":{"6":{"5":{"6":{"4":{"2":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"f":{"8":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"d":{"7":{"5":{"3":{"5":{"2":{"4":{"8":{"d":{"0":{"b":{"d":{"4":{"4":{"8":{"2":{"9":{"8":{"c":{"c":{"2":{"df":0,"docs":{},"e":{"2":{"0":{"7":{"1":{"df":0,"docs":{},"e":{"5":{"6":{"9":{"9":{"2":{"d":{"0":{"7":{"7":{"4":{"d":{"c":{"3":{"4":{"0":{"c":{"3":{"6":{"8":{"a":{"df":0,"docs":{},"e":{"9":{"5":{"0":{"8":{"5":{"2":{"a":{"d":{"a":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":0,"docs":{},"f":{"b":{"d":{"b":{"2":{"3":{"1":{"5":{"6":{"7":{"8":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"b":{"3":{"6":{"7":{"df":0,"docs":{},"f":{"0":{"3":{"2":{"d":{"9":{"3":{"df":0,"docs":{},"f":{"6":{"4":{"2":{"df":0,"docs":{},"f":{"6":{"4":{"1":{"8":{"0":{"a":{"a":{"3":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"0":{"0":{"0":{"8":{".":{".":{"7":{"6":{"b":{"9":{"0":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"6":{"2":{"6":{"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"7":{"5":{"4":{"7":{"4":{"df":0,"docs":{},"e":{"8":{"9":{"0":{"9":{"4":{"c":{"4":{"4":{"d":{"a":{"9":{"8":{"b":{"9":{"5":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"a":{"c":{"4":{"9":{"5":{"2":{"7":{"1":{"d":{"0":{"df":0,"docs":{},"f":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"4":{"1":{"df":0,"docs":{},"f":{"b":{"a":{"b":{"d":{"9":{"8":{"3":{"1":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"b":{"6":{"a":{"6":{"0":{"c":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"6":{"df":0,"docs":{},"f":{"0":{"6":{"5":{"7":{"5":{"3":{"d":{"8":{"d":{"c":{"b":{"9":{"6":{"5":{"3":{"d":{"b":{"a":{"d":{"3":{"5":{"df":1,"docs":{"45":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"1":{"7":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"9":{"c":{"d":{"df":0,"docs":{},"e":{"0":{"5":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"126":{"tf":1.0}}}},"8":{"1":{"0":{"c":{"b":{"d":{"4":{"3":{"6":{"5":{"3":{"9":{"6":{"1":{"6":{"5":{"8":{"7":{"4":{"c":{"0":{"5":{"4":{"d":{"0":{"1":{"b":{"1":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"4":{"c":{"c":{"2":{"4":{"9":{"2":{"6":{"5":{"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"4":{"2":{"6":{"8":{"5":{"b":{"df":0,"docs":{},"f":{"1":{"6":{"1":{"7":{"9":{"3":{"c":{"c":{"2":{"5":{"6":{"0":{"3":{"c":{"2":{"3":{"1":{"b":{"c":{"2":{"df":0,"docs":{},"f":{"5":{"6":{"8":{"df":0,"docs":{},"e":{"b":{"6":{"3":{"0":{"df":0,"docs":{},"e":{"a":{"1":{"6":{"a":{"a":{"1":{"3":{"7":{"d":{"2":{"6":{"6":{"4":{"a":{"c":{"8":{"0":{"3":{"8":{"8":{"2":{"5":{"6":{"0":{"8":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"b":{"2":{"8":{"6":{"8":{"9":{"8":{"4":{"8":{"4":{"a":{"df":0,"docs":{},"e":{"7":{"3":{"7":{"d":{"2":{"2":{"8":{"3":{"8":{"df":0,"docs":{},"e":{"2":{"7":{"b":{"2":{"9":{"8":{"9":{"9":{"b":{"3":{"2":{"7":{"8":{"0":{"4":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"3":{"0":{"9":{"df":0,"docs":{},"e":{"4":{"7":{"a":{"7":{"5":{"b":{"1":{"8":{"c":{"df":0,"docs":{},"f":{"d":{"7":{"d":{"5":{"9":{"5":{"c":{"c":{"7":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"b":{"5":{"7":{"8":{"2":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"6":{"d":{"d":{"4":{"df":0,"docs":{},"f":{"b":{"d":{"3":{"a":{"7":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"a":{"d":{"b":{"5":{"9":{"4":{"b":{"8":{"4":{"d":{"7":{"7":{"0":{"df":0,"docs":{},"f":{"5":{"6":{"df":0,"docs":{},"f":{"3":{"9":{"3":{"df":0,"docs":{},"f":{"1":{"3":{"7":{"7":{"8":{"5":{"a":{"5":{"2":{"7":{"0":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"1":{"8":{"2":{"df":0,"docs":{},"e":{"6":{"a":{"d":{"7":{"df":0,"docs":{},"f":{"5":{"2":{"0":{"df":0,"docs":{},"e":{"5":{"1":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"f":{"b":{"a":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"127":{"tf":1.4142135623730951},"45":{"tf":1.0}},"f":{"0":{"a":{"d":{"b":{"b":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"1":{"3":{"5":{"d":{"1":{"5":{"0":{"9":{"a":{"d":{"0":{"3":{"9":{"5":{"0":{"5":{"b":{"a":{"d":{"a":{"9":{"4":{"2":{"d":{"1":{"8":{"7":{"5":{"5":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"3":{"6":{"1":{"d":{"5":{"df":0,"docs":{},"f":{"3":{"a":{"df":0,"docs":{},"f":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"5":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"233":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"233":{"tf":1.0}}}}}}}},"f":{"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.0},"299":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0}}}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"0":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"177":{"tf":1.0}}},"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"144":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}},"1":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"131":{"tf":1.0},"134":{"tf":1.4142135623730951},"141":{"tf":1.0},"178":{"tf":1.0},"18":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"296":{"tf":1.0},"45":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}},"1":{"5":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"182":{"tf":1.0}}},"df":25,"docs":{"131":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"205":{"tf":1.0},"221":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"240":{"tf":2.0},"243":{"tf":1.7320508075688772},"258":{"tf":2.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"278":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"299":{"tf":1.0},"45":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"df":4,"docs":{"131":{"tf":1.0},"183":{"tf":2.449489742783178},"218":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951}}},"2":{"3":{"df":2,"docs":{"127":{"tf":1.0},"183":{"tf":1.4142135623730951}}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"280":{"tf":1.0}}},"8":{"df":2,"docs":{"132":{"tf":1.0},"280":{"tf":1.7320508075688772}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":7,"docs":{"112":{"tf":1.0},"182":{"tf":1.7320508075688772},"183":{"tf":1.7320508075688772},"239":{"tf":1.4142135623730951},"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"275":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"68":{"tf":1.0}}},"5":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"1":{"df":1,"docs":{"230":{"tf":1.0}}},"2":{"df":1,"docs":{"317":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"318":{"tf":1.0}}},"df":4,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"182":{"tf":1.0},"233":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"7":{"df":1,"docs":{"317":{"tf":1.0}}},"8":{"df":1,"docs":{"318":{"tf":1.0}}},"9":{"df":1,"docs":{"310":{"tf":1.0}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"5":{"df":1,"docs":{"317":{"tf":1.0}}},"6":{"9":{"9":{"2":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"2":{"3":{"4":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":42,"docs":{"103":{"tf":1.0},"115":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"190":{"tf":3.4641016151377544},"191":{"tf":1.0},"210":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"326":{"tf":1.4142135623730951},"93":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"1":{"8":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"2":{".":{"0":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":1,"docs":{"258":{"tf":1.7320508075688772}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"1":{"df":12,"docs":{"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951}}},"2":{"df":8,"docs":{"239":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"251":{"tf":1.4142135623730951},"254":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"267":{"tf":2.0}}},"3":{"df":6,"docs":{"218":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"236":{"tf":1.4142135623730951}}},"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"df":1,"docs":{"314":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"193":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951},"40":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"7":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"4":{"df":1,"docs":{"268":{"tf":1.0}}},"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"313":{"tf":1.0}}},"df":1,"docs":{"182":{"tf":1.0}}},"2":{"2":{"df":1,"docs":{"309":{"tf":1.0}}},"5":{"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"190":{"tf":1.0}}},"9":{"df":1,"docs":{"312":{"tf":1.0}}},"df":1,"docs":{"183":{"tf":1.0}}},"4":{"1":{"df":2,"docs":{"252":{"tf":1.0},"253":{"tf":1.0}}},"3":{"df":1,"docs":{"314":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":1,"docs":{"307":{"tf":1.4142135623730951}}},"5":{"0":{"df":2,"docs":{"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"314":{"tf":1.0}}},"3":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":2,"docs":{"240":{"tf":1.0},"312":{"tf":1.0}}},"6":{"df":7,"docs":{"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":2,"docs":{"173":{"tf":1.0},"182":{"tf":1.7320508075688772}}},"6":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"190":{"tf":1.0},"312":{"tf":1.0}}},"5":{"df":1,"docs":{"312":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"5":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"221":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"248":{"tf":1.4142135623730951},"283":{"tf":1.0}}},"7":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"308":{"tf":1.0}}},"6":{"df":1,"docs":{"308":{"tf":1.0}}},"df":6,"docs":{"190":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"8":{"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":5,"docs":{"190":{"tf":1.0},"230":{"tf":1.0},"236":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"9":{"6":{"df":1,"docs":{"308":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.0},"282":{"tf":1.4142135623730951}}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":23,"docs":{"103":{"tf":1.4142135623730951},"109":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.0},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"231":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":2.23606797749979},"327":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"299":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"3":{"df":1,"docs":{"308":{"tf":1.0}}},"5":{"df":1,"docs":{"310":{"tf":1.0}}},"7":{"df":1,"docs":{"309":{"tf":1.0}}},"df":5,"docs":{"227":{"tf":1.0},"267":{"tf":2.0},"270":{"tf":2.0},"278":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951}}},"2":{"0":{"df":2,"docs":{"231":{"tf":1.0},"309":{"tf":1.0}}},"3":{"df":1,"docs":{"309":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"7":{"df":1,"docs":{"310":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":3,"docs":{"141":{"tf":1.0},"230":{"tf":1.7320508075688772},"258":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"299":{"tf":1.0}}},"5":{"df":1,"docs":{"305":{"tf":1.0}}},"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"268":{"tf":1.0}}},"6":{"df":1,"docs":{"304":{"tf":1.0}}},"7":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"7":{"8":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"7":{"6":{"7":{"5":{"9":{"6":{"7":{"2":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"7":{"df":1,"docs":{"302":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"301":{"tf":1.0}}},"7":{"df":1,"docs":{"255":{"tf":1.0}}},"8":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"161":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"18":{"tf":1.0},"182":{"tf":2.23606797749979},"192":{"tf":1.0},"212":{"tf":1.4142135623730951},"243":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.0},"328":{"tf":1.4142135623730951}}},"4":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"300":{"tf":1.0}}},"3":{"df":1,"docs":{"301":{"tf":1.0}}},"6":{"df":2,"docs":{"299":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":12,"docs":{"130":{"tf":1.4142135623730951},"189":{"tf":1.0},"201":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"243":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"283":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"df":1,"docs":{"296":{"tf":1.0}}},"5":{"df":1,"docs":{"296":{"tf":1.0}}},"7":{"df":1,"docs":{"297":{"tf":1.0}}},"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"df":1,"docs":{"249":{"tf":1.0}}},"4":{"df":1,"docs":{"293":{"tf":1.0}}},"5":{"df":1,"docs":{"293":{"tf":1.0}}},"8":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"292":{"tf":1.0}}},"8":{"df":2,"docs":{"287":{"tf":1.0},"288":{"tf":1.0}}},"9":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"1":{"df":2,"docs":{"279":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":2,"docs":{"292":{"tf":1.0},"294":{"tf":1.0}}},"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"290":{"tf":1.0}}},"8":{"df":1,"docs":{"272":{"tf":1.0}}},"9":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"288":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":7,"docs":{"160":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.4142135623730951},"213":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"329":{"tf":1.4142135623730951}}},"5":{"0":{"0":{"0":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}},"df":2,"docs":{"178":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"252":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"288":{"tf":1.0}}},"4":{"df":1,"docs":{"289":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"df":2,"docs":{"189":{"tf":1.4142135623730951},"312":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"284":{"tf":1.0}}},"4":{"df":1,"docs":{"284":{"tf":1.0}}},"5":{"df":1,"docs":{"284":{"tf":1.0}}},"9":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"3":{"df":1,"docs":{"64":{"tf":1.0}}},"6":{"df":1,"docs":{"284":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"1":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"9":{"df":1,"docs":{"279":{"tf":1.0}}},"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"275":{"tf":1.0}}},"8":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"250":{"tf":1.0}}},"6":{"df":2,"docs":{"276":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":9,"docs":{"163":{"tf":1.0},"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.0},"243":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0}}},"6":{"0":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":1,"docs":{"271":{"tf":1.0}}},"6":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"268":{"tf":1.0}}},"2":{"df":1,"docs":{"268":{"tf":1.0}}},"3":{"df":1,"docs":{"269":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"243":{"tf":1.0}}},"6":{"df":1,"docs":{"258":{"tf":1.0}}},"8":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"5":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"6":{"5":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"7":{"7":{"df":1,"docs":{"265":{"tf":1.0}}},"9":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"8":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"2":{"df":1,"docs":{"250":{"tf":1.0}}},"4":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":2.0},"275":{"tf":1.0}}},"7":{"0":{"3":{"df":1,"docs":{"243":{"tf":1.0}}},"5":{"df":1,"docs":{"249":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"246":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"247":{"tf":1.0}}},"3":{"df":1,"docs":{"247":{"tf":1.0}}},"6":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"4":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"244":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"5":{"7":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.0}}},"9":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"241":{"tf":1.0}}},"5":{"df":1,"docs":{"241":{"tf":1.0}}},"6":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"8":{"3":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.0}}},"8":{"0":{"1":{"df":1,"docs":{"241":{"tf":1.0}}},"3":{"df":1,"docs":{"237":{"tf":1.0}}},"5":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"233":{"tf":1.0}}},"df":1,"docs":{"258":{"tf":1.0}}},"1":{"5":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"3":{"6":{"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"8":{"3":{"6":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":2,"docs":{"163":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"5":{"3":{"df":1,"docs":{"235":{"tf":1.0}}},"4":{"5":{"df":2,"docs":{"15":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"234":{"tf":1.0}}},"3":{"df":1,"docs":{"233":{"tf":1.0}}},"4":{"df":1,"docs":{"233":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"7":{"df":1,"docs":{"231":{"tf":1.0}}},"df":0,"docs":{}},"8":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"df":1,"docs":{"231":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"9":{"8":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.0},"130":{"tf":1.0},"182":{"tf":1.0},"197":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"280":{"tf":1.4142135623730951},"40":{"tf":1.0},"93":{"tf":1.0}}},"9":{"0":{"8":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"228":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"9":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"223":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"224":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"220":{"tf":1.0}}},"7":{"df":1,"docs":{"219":{"tf":1.0}}},"8":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"120":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951},"182":{"tf":1.0},"93":{"tf":1.0}}},"_":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"_":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"268":{"tf":1.0}}}}}}},"df":3,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"231":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{",":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"139":{"tf":2.23606797749979},"296":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"(":{"a":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"120":{"tf":2.6457513110645907},"124":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":2.0},"170":{"tf":1.0},"173":{"tf":1.0},"187":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"255":{"tf":2.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"137":{"tf":1.0},"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"a":{".":{"df":0,"docs":{},"k":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"b":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{",":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"131":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"213":{"tf":1.0}}},"df":14,"docs":{"131":{"tf":1.0},"146":{"tf":2.449489742783178},"240":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0},"294":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"df":2,"docs":{"141":{"tf":1.0},"275":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"143":{"tf":1.0},"164":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"119":{"tf":1.0},"14":{"tf":1.0},"230":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"296":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.4142135623730951},"249":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"288":{"tf":1.0}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"216":{"tf":1.0},"275":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"323":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"320":{"tf":1.0},"323":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0}}}},"v":{"df":1,"docs":{"171":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"164":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"215":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"330":{"tf":1.0}}}}},"d":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.0}}},"6":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":2,"docs":{"141":{"tf":1.4142135623730951},"255":{"tf":1.0}}},"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"141":{"tf":1.0}}}},"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"279":{"tf":1.0}}},"x":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":21,"docs":{"10":{"tf":1.7320508075688772},"135":{"tf":1.0},"148":{"tf":1.0},"19":{"tf":1.0},"211":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"312":{"tf":2.23606797749979},"40":{"tf":2.0},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"182":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"94":{"tf":1.0}}}},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":0,"docs":{},"x":{"7":{"1":{"5":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"a":{"3":{"c":{"7":{"2":{"9":{"6":{"9":{"b":{"5":{"4":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"4":{"2":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"b":{"b":{"7":{"6":{"8":{"c":{"8":{"a":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":4,"docs":{"189":{"tf":1.0},"230":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":53,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"143":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":2.23606797749979},"163":{"tf":2.0},"164":{"tf":2.0},"17":{"tf":1.7320508075688772},"173":{"tf":2.0},"177":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"187":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"19":{"tf":1.4142135623730951},"195":{"tf":3.0},"196":{"tf":2.6457513110645907},"200":{"tf":1.4142135623730951},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":2.23606797749979},"243":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.449489742783178},"268":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"292":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":3.0},"321":{"tf":1.0},"323":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":2.0},"42":{"tf":2.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":3.3166247903554},"46":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"52":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":33,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"252":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951},"317":{"tf":1.0},"35":{"tf":1.0},"45":{"tf":1.0},"68":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"27":{"tf":1.0},"296":{"tf":1.0},"321":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"42":{"tf":1.0},"43":{"tf":1.0},"61":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"18":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"34":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":1,"docs":{"320":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"231":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"213":{"tf":1.0},"22":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":3,"docs":{"108":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}}}}}},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}},"s":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":2.0},"292":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"322":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"206":{"tf":1.7320508075688772},"227":{"tf":1.0},"256":{"tf":1.0}}},"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"124":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"143":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"193":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"279":{"tf":1.4142135623730951},"28":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"328":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"143":{"tf":1.0},"69":{"tf":1.0}},"g":{"df":4,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"36":{"tf":1.0},"64":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":23,"docs":{"232":{"tf":1.0},"236":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"25":{"tf":1.0},"251":{"tf":1.4142135623730951},"254":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"267":{"tf":2.0},"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"315":{"tf":2.0}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"14":{"tf":1.0},"309":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"143":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"16":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"211":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":2,"docs":{"279":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"149":{"tf":1.4142135623730951},"212":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":2.0},"43":{"tf":1.0},"48":{"tf":2.6457513110645907}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":5,"docs":{"266":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"52":{"tf":1.0}}}},"z":{"df":15,"docs":{"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"133":{"tf":1.4142135623730951}}}},"n":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"10":{"tf":1.0},"115":{"tf":1.0},"141":{"tf":1.0},"144":{"tf":1.0},"180":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"330":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"15":{"tf":2.23606797749979},"16":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"19":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"266":{"tf":1.0},"315":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"18":{"tf":1.0},"193":{"tf":1.0},"281":{"tf":1.0},"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"321":{"tf":1.0},"326":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"144":{"tf":1.0},"243":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"135":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"163":{"tf":1.0}}}}}}}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":3,"docs":{"184":{"tf":1.0},"288":{"tf":1.0},"323":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"211":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"215":{"tf":1.0},"216":{"tf":1.0},"315":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":2.0}}}},"r":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"193":{"tf":1.0},"212":{"tf":1.0}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"277":{"tf":1.0},"316":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":2.0},"143":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":2.0},"185":{"tf":1.7320508075688772},"234":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":3.0},"265":{"tf":1.0},"269":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"182":{"tf":2.0},"292":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}}},"m":{"df":4,"docs":{"170":{"tf":1.0},"22":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"288":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"250":{"tf":1.0},"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"192":{"tf":1.0}}},"u":{"2":{"5":{"6":{"df":11,"docs":{"161":{"tf":1.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"df":4,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":2.0},"112":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":4,"docs":{"134":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":21,"docs":{"10":{"tf":1.0},"113":{"tf":1.0},"131":{"tf":1.0},"161":{"tf":1.0},"166":{"tf":1.4142135623730951},"175":{"tf":2.0},"177":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":3.3166247903554},"196":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.4142135623730951},"269":{"tf":1.0},"271":{"tf":1.7320508075688772},"275":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"8":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"192":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"219":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":7,"docs":{"120":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"269":{"tf":1.0},"287":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"107":{"tf":1.0},"113":{"tf":1.0},"157":{"tf":1.0},"171":{"tf":3.1622776601683795},"223":{"tf":1.4142135623730951},"230":{"tf":4.123105625617661},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"292":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"171":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":14,"docs":{"113":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"161":{"tf":2.8284271247461903},"162":{"tf":2.449489742783178},"177":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":2.0},"250":{"tf":1.0},"265":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"304":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":2.23606797749979},"41":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"168":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.7320508075688772},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"148":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.4142135623730951},"271":{"tf":1.0},"281":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"266":{"tf":1.0},"285":{"tf":1.0},"306":{"tf":1.4142135623730951},"310":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"277":{"tf":1.0},"63":{"tf":1.0}}},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"43":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"212":{"tf":1.0},"321":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":1.0},"178":{"tf":2.6457513110645907},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"240":{"tf":1.0},"246":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"330":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"48":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"41":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":15,"docs":{"224":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.449489742783178},"37":{"tf":2.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":3.1622776601683795},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":2.23606797749979},"304":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"219":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"144":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"31":{"tf":1.0},"43":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":13,"docs":{"12":{"tf":1.0},"197":{"tf":1.0},"206":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"330":{"tf":1.4142135623730951},"60":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"327":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"b":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"39":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"26":{"tf":1.7320508075688772},"318":{"tf":1.0},"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":1,"docs":{"269":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":6,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}},"e":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"(":{"a":{"c":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"177":{"tf":1.0}},"u":{"df":1,"docs":{"293":{"tf":1.0}}}},"n":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":2.0},"329":{"tf":1.7320508075688772}}},"r":{"'":{"df":1,"docs":{"204":{"tf":1.0}}},"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"231":{"tf":1.0}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"170":{"tf":1.0},"250":{"tf":1.0},"283":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":4,"docs":{"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"288":{"tf":1.0},"316":{"tf":1.0}},"u":{"df":3,"docs":{"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}},".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"159":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"231":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"280":{"tf":1.4142135623730951},"305":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951}},"k":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"b":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"133":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"187":{"tf":1.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"212":{"tf":1.0},"240":{"tf":1.0},"252":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}}},"i":{"c":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}},"df":8,"docs":{"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"29":{"tf":1.0},"312":{"tf":1.0},"46":{"tf":1.4142135623730951},"57":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.4142135623730951}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"177":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"283":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"2":{"6":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"]":{"[":{"0":{"df":0,"docs":{},"x":{"0":{"1":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"175":{"tf":1.0},"180":{"tf":1.0},"196":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"279":{"tf":1.0},"288":{"tf":1.0}}}},"df":14,"docs":{"115":{"tf":2.23606797749979},"162":{"tf":3.4641016151377544},"170":{"tf":1.4142135623730951},"196":{"tf":2.0},"240":{"tf":2.23606797749979},"250":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"304":{"tf":4.795831523312719},"312":{"tf":2.23606797749979},"90":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"24":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"308":{"tf":1.0},"41":{"tf":1.0},"56":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"148":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"288":{"tf":1.0},"321":{"tf":1.0},"41":{"tf":1.4142135623730951},"90":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"212":{"tf":1.0},"231":{"tf":1.0},"26":{"tf":1.0},"280":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"136":{"tf":1.0},"167":{"tf":1.0},"206":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"13":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"182":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"324":{"tf":1.0},"326":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"215":{"tf":1.0},"3":{"tf":1.0},"310":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"250":{"tf":1.0},"275":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"37":{"tf":1.0},"40":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"48":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":3,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"1":{"tf":1.0},"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"317":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"126":{"tf":1.0},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.4142135623730951},"290":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}}}},"i":{":":{":":{"b":{"a":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"253":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"37":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"36":{"tf":1.4142135623730951},"37":{"tf":2.0},"40":{"tf":1.7320508075688772},"41":{"tf":4.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.6457513110645907},"46":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}}}}}}}}}}}},"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":12,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"182":{"tf":1.4142135623730951},"217":{"tf":1.0},"26":{"tf":1.7320508075688772},"306":{"tf":1.0},"318":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"df":7,"docs":{"10":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"40":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"227":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"182":{"tf":1.7320508075688772},"185":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"2":{"b":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}}},"_":{"2":{"df":0,"docs":{},"f":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"108":{"tf":1.7320508075688772},"110":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"312":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":26,"docs":{"13":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.7320508075688772},"150":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"20":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"115":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.0},"151":{"tf":2.0},"16":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}}},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"210":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"i":{"df":11,"docs":{"132":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":6,"docs":{"10":{"tf":2.0},"135":{"tf":2.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}},"l":{"[":{"3":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}},"df":34,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"141":{"tf":1.7320508075688772},"152":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":1.7320508075688772},"178":{"tf":1.7320508075688772},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"222":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"312":{"tf":3.1622776601683795},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"125":{"tf":1.0},"170":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":15,"docs":{"113":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"171":{"tf":1.4142135623730951},"172":{"tf":1.0},"181":{"tf":1.4142135623730951},"184":{"tf":2.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.7320508075688772},"196":{"tf":1.0},"240":{"tf":1.0},"272":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"184":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"(":{"1":{".":{"6":{"5":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"237":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"289":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"132":{"tf":1.0},"192":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"271":{"tf":1.4142135623730951},"316":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"177":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"212":{"tf":1.4142135623730951},"216":{"tf":1.0},"272":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":6,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"126":{"tf":1.0},"157":{"tf":1.0},"168":{"tf":3.1622776601683795},"212":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"168":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"w":{"df":2,"docs":{"23":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"a":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"230":{"tf":2.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"g":{"df":13,"docs":{"211":{"tf":1.0},"244":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"269":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"51":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"253":{"tf":1.4142135623730951},"256":{"tf":1.4142135623730951},"269":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"276":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"284":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"300":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":16,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.4142135623730951},"212":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":2.8284271247461903},"277":{"tf":1.0},"312":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":3.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"312":{"tf":1.0}}},"v":{"a":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"26":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"131":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"53":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":9,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"219":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"312":{"tf":1.0},"45":{"tf":2.0},"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"105":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"18":{"tf":1.4142135623730951},"195":{"tf":1.0},"197":{"tf":1.7320508075688772},"227":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772},"312":{"tf":1.0},"40":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.0}},"s":{"1":{"0":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"1":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.7320508075688772}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":53,"docs":{"113":{"tf":1.0},"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"144":{"tf":2.0},"15":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":3.1622776601683795},"174":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"20":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"269":{"tf":1.0},"273":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":2.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"304":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":2.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"255":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.0}}}}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.4142135623730951},"308":{"tf":1.0},"313":{"tf":1.0}}}},"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"p":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"115":{"tf":1.0},"237":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"158":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"57":{"tf":2.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"df":1,"docs":{"189":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}},"t":{"df":12,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"189":{"tf":1.0},"19":{"tf":1.0},"233":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"312":{"tf":1.0},"320":{"tf":1.0},"45":{"tf":3.0}},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"203":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"117":{"tf":1.0},"146":{"tf":1.7320508075688772},"281":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"s":{"df":14,"docs":{"144":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"269":{"tf":1.0},"276":{"tf":1.0},"296":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}}}}},"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":3,"docs":{"240":{"tf":2.0},"296":{"tf":1.4142135623730951},"309":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"136":{"tf":1.0},"143":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"151":{"tf":1.0},"240":{"tf":1.0},"312":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":51,"docs":{"10":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"266":{"tf":1.7320508075688772},"272":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"288":{"tf":1.0},"290":{"tf":1.4142135623730951},"292":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"308":{"tf":2.0},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"313":{"tf":2.0},"314":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"213":{"tf":1.0},"327":{"tf":1.0},"52":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"301":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"115":{"tf":2.23606797749979},"120":{"tf":2.23606797749979},"124":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.7320508075688772},"197":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"146":{"tf":1.0},"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"269":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"155":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":25,"docs":{"19":{"tf":1.0},"192":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"255":{"tf":1.0},"26":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.0},"292":{"tf":2.23606797749979},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":2.0},"313":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"43":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"22":{"tf":1.0}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"19":{"tf":1.0},"255":{"tf":1.0}}}}}},"i":{"df":4,"docs":{"289":{"tf":1.0},"302":{"tf":1.0},"318":{"tf":1.0},"63":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"226":{"tf":1.0},"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"146":{"tf":1.0},"326":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"329":{"tf":1.0},"40":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"1":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}},"r":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"255":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":5,"docs":{"243":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"34":{"tf":1.0},"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"41":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":74,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":2.23606797749979},"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"223":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"27":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"28":{"tf":2.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.7320508075688772},"289":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.7320508075688772},"32":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"330":{"tf":2.0},"38":{"tf":1.0},"4":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"64":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"223":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"132":{"tf":1.0},"222":{"tf":1.0},"28":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"281":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"138":{"tf":1.0},"146":{"tf":1.0},"162":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":6,"docs":{"141":{"tf":1.4142135623730951},"275":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"67":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"m":{"a":{"df":5,"docs":{"171":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0}},"n":{"d":{"df":14,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"128":{"tf":1.7320508075688772},"240":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"216":{"tf":1.0},"322":{"tf":1.0},"52":{"tf":1.0},"60":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"330":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"67":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":15,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"327":{"tf":1.4142135623730951},"328":{"tf":2.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"4":{"tf":1.0},"52":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"146":{"tf":1.0},"170":{"tf":1.0},"25":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"183":{"tf":2.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}}}}}}}},"t":{"df":2,"docs":{"119":{"tf":1.0},"292":{"tf":1.0}}}},"df":1,"docs":{"244":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"123":{"tf":1.0},"135":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"143":{"tf":1.0},"144":{"tf":1.0},"158":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"223":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"237":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"276":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":2.449489742783178},"289":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":2.0},"313":{"tf":2.0},"316":{"tf":1.0},"45":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":2.0},"64":{"tf":2.0},"65":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{":":{"1":{":":{"6":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"t":{"df":6,"docs":{"13":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.0},"27":{"tf":1.0}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":7,"docs":{"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.4142135623730951},"28":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"292":{"tf":1.0},"57":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{">":{"(":{"_":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"243":{"tf":1.7320508075688772},"256":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"132":{"tf":1.0},"243":{"tf":1.4142135623730951}}}}}}},">":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"165":{"tf":1.0},"167":{"tf":2.0},"19":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"213":{"tf":1.0},"319":{"tf":1.7320508075688772},"320":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"330":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"216":{"tf":1.0},"283":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"146":{"tf":1.4142135623730951},"158":{"tf":1.0},"175":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.7320508075688772},"212":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}},"i":{"d":{"df":6,"docs":{"19":{"tf":1.0},"22":{"tf":1.0},"280":{"tf":1.0},"297":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"123":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"171":{"tf":1.0},"181":{"tf":1.0},"190":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"33":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.4142135623730951},"197":{"tf":1.0},"203":{"tf":2.0},"244":{"tf":1.0},"260":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":2.0},"279":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":2.6457513110645907},"184":{"tf":1.0},"233":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"268":{"tf":1.0},"321":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"139":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":3.0},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"141":{"tf":1.0},"222":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"40":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"130":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"df":1,"docs":{"302":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":2.0},"143":{"tf":2.449489742783178},"144":{"tf":3.3166247903554},"145":{"tf":2.6457513110645907},"146":{"tf":4.358898943540674},"147":{"tf":1.0},"148":{"tf":2.0},"149":{"tf":1.7320508075688772},"150":{"tf":1.7320508075688772},"151":{"tf":1.7320508075688772},"152":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"258":{"tf":3.1622776601683795},"271":{"tf":1.0},"304":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":3.3166247903554},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}},"u":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"45":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":7,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":2.0},"157":{"tf":1.0},"169":{"tf":3.1622776601683795},"20":{"tf":1.0},"327":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"'":{"df":6,"docs":{"135":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}},".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":119,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"12":{"tf":1.7320508075688772},"129":{"tf":1.0},"13":{"tf":2.449489742783178},"130":{"tf":2.0},"135":{"tf":4.47213595499958},"136":{"tf":1.4142135623730951},"137":{"tf":2.23606797749979},"138":{"tf":3.0},"139":{"tf":2.0},"14":{"tf":1.7320508075688772},"140":{"tf":2.0},"141":{"tf":2.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":3.4641016151377544},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"152":{"tf":2.449489742783178},"153":{"tf":2.0},"155":{"tf":1.7320508075688772},"156":{"tf":1.7320508075688772},"159":{"tf":1.4142135623730951},"16":{"tf":2.8284271247461903},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":2.23606797749979},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"18":{"tf":1.7320508075688772},"180":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":3.3166247903554},"19":{"tf":3.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":2.0},"203":{"tf":1.0},"204":{"tf":1.0},"21":{"tf":1.0},"219":{"tf":3.1622776601683795},"230":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"244":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"28":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"299":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"308":{"tf":2.449489742783178},"309":{"tf":2.449489742783178},"310":{"tf":1.0},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"33":{"tf":2.23606797749979},"36":{"tf":1.7320508075688772},"39":{"tf":1.7320508075688772},"40":{"tf":4.69041575982343},"41":{"tf":2.449489742783178},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":2.0},"45":{"tf":3.605551275463989},"46":{"tf":2.0},"47":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"7":{"tf":2.8284271247461903},"8":{"tf":2.449489742783178},"9":{"tf":2.23606797749979}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"208":{"tf":2.0},"209":{"tf":1.7320508075688772},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"213":{"tf":1.0},"214":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"4":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":16,"docs":{"266":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"143":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"255":{"tf":1.0}}},"t":{"df":2,"docs":{"240":{"tf":1.0},"40":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.0}}},"t":{"df":4,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}}}},"y":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"141":{"tf":1.0},"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"95":{"tf":2.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"205":{"tf":1.0},"240":{"tf":1.4142135623730951},"275":{"tf":1.0},"316":{"tf":1.7320508075688772},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"79":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.4142135623730951},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"65":{"tf":1.0},"69":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"284":{"tf":1.0},"292":{"tf":1.0},"65":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"133":{"tf":1.0},"141":{"tf":1.4142135623730951},"173":{"tf":1.0},"266":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"44":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"q":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"2":{"/":{"0":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"319":{"tf":1.4142135623730951},"330":{"tf":1.0}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"306":{"tf":1.0}}}},"i":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"234":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"269":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":36,"docs":{"13":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"29":{"tf":1.4142135623730951},"301":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.7320508075688772}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"2":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"189":{"tf":1.0}}}}}},"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":3,"docs":{"189":{"tf":1.0},"305":{"tf":1.0},"312":{"tf":1.0}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"150":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"266":{"tf":1.0},"312":{"tf":1.0}}}},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"79":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"108":{"tf":1.0},"69":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"x":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":6,"docs":{"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"151":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"43":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":2,"docs":{"135":{"tf":1.0},"240":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"145":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}}},"df":3,"docs":{"240":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"148":{"tf":1.0},"240":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"230":{"tf":1.0}},"l":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"149":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":23,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.7320508075688772},"148":{"tf":1.0},"149":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":1.7320508075688772},"249":{"tf":1.0},"258":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"243":{"tf":1.0},"30":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":24,"docs":{"10":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"312":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"68":{"tf":1.0}}}}}},"v":{"df":9,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"292":{"tf":1.4142135623730951},"32":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"141":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"130":{"tf":2.0}}}},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{}},"df":36,"docs":{"113":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.7320508075688772},"148":{"tf":1.0},"150":{"tf":1.0},"163":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"200":{"tf":2.449489742783178},"201":{"tf":1.0},"202":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"250":{"tf":1.4142135623730951},"28":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"c":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"45":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.7320508075688772},"45":{"tf":1.0}}},"s":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":15,"docs":{"130":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.7320508075688772},"316":{"tf":1.7320508075688772},"40":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":4,"docs":{"279":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"44":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":11,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"255":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"287":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":31,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"144":{"tf":1.0},"152":{"tf":1.4142135623730951},"163":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"287":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"68":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":18,"docs":{"130":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":1.0},"250":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"27":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":2.0},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"310":{"tf":1.0},"7":{"tf":1.0}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":7,"docs":{"19":{"tf":1.0},"240":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0},"33":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"184":{"tf":1.4142135623730951},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"287":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":11,"docs":{"138":{"tf":1.0},"159":{"tf":1.0},"226":{"tf":1.7320508075688772},"24":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"277":{"tf":2.0},"30":{"tf":2.449489742783178},"305":{"tf":1.0},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"1":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":24,"docs":{"10":{"tf":1.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.0},"13":{"tf":2.449489742783178},"135":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":2.0},"16":{"tf":2.6457513110645907},"17":{"tf":2.0},"18":{"tf":1.4142135623730951},"19":{"tf":3.1622776601683795},"2":{"tf":1.0},"20":{"tf":1.7320508075688772},"219":{"tf":2.23606797749979},"235":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"146":{"tf":1.0},"204":{"tf":1.0},"249":{"tf":1.0}}}},"o":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"181":{"tf":1.4142135623730951},"200":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"255":{"tf":1.0},"317":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":1.0},"211":{"tf":1.0},"215":{"tf":1.0},"232":{"tf":1.0},"275":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"250":{"tf":1.0},"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"191":{"tf":1.0},"203":{"tf":1.0},"249":{"tf":1.0},"266":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"325":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}}},"v":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":28,"docs":{"0":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"136":{"tf":1.0},"14":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"21":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.0},"22":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"315":{"tf":1.4142135623730951},"40":{"tf":1.0},"56":{"tf":2.0},"57":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}}}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.4142135623730951},"16":{"tf":1.0},"178":{"tf":1.0},"191":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"64":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"255":{"tf":1.0},"281":{"tf":1.0}}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":2.8284271247461903},"69":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":9,"docs":{"123":{"tf":1.0},"14":{"tf":1.0},"159":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"2":{"tf":1.0},"268":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"211":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"292":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":4,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":1.0},"302":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"215":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":1,"docs":{"281":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"171":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"117":{"tf":1.0},"292":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"308":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"275":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"c":{"df":6,"docs":{"211":{"tf":2.0},"222":{"tf":1.0},"4":{"tf":1.0},"64":{"tf":2.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.0},"220":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"289":{"tf":2.0},"301":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.4142135623730951},"4":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":10,"docs":{"13":{"tf":1.0},"18":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":2.0},"272":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.0}}}}}}}}},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"=":{"2":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"g":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"'":{"df":0,"docs":{},"t":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"25":{"tf":1.0},"271":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"14":{"tf":1.0},"20":{"tf":1.0},"212":{"tf":1.0},"25":{"tf":1.0},"296":{"tf":1.0}}},"g":{".":{"df":0,"docs":{},"f":{"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"240":{"tf":1.4142135623730951},"271":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":5,"docs":{"217":{"tf":1.0},"24":{"tf":1.7320508075688772},"6":{"tf":2.0},"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"16":{"tf":1.0},"250":{"tf":1.0}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}},"p":{"df":1,"docs":{"200":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"204":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.0},"40":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":26,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"152":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.7320508075688772},"253":{"tf":1.0},"255":{"tf":1.0},"275":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":11,"docs":{"132":{"tf":1.0},"191":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"27":{"tf":1.0},"43":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"181":{"tf":1.0},"250":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"143":{"tf":1.0}}}}},"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"68":{"tf":1.4142135623730951},"94":{"tf":1.7320508075688772},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":3,"docs":{"102":{"tf":1.0},"68":{"tf":1.4142135623730951},"99":{"tf":1.7320508075688772}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.7320508075688772},"106":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":3,"docs":{"68":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"72":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.4142135623730951},"63":{"tf":1.7320508075688772}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":2.0}}}}}},"u":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"323":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"314":{"tf":1.0},"52":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.7320508075688772},"284":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"163":{"tf":1.0},"292":{"tf":1.0},"68":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"192":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"243":{"tf":1.0},"269":{"tf":1.0},"296":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"0":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"146":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.0}},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":9,"docs":{"269":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.7320508075688772},"313":{"tf":1.0},"38":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"130":{"tf":1.0},"136":{"tf":1.0},"146":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"177":{"tf":1.0},"237":{"tf":1.0}}}}},"o":{"d":{"df":14,"docs":{"131":{"tf":1.7320508075688772},"163":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":2.23606797749979},"294":{"tf":1.0},"304":{"tf":1.0},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":2.23606797749979}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}},"df":2,"docs":{"104":{"tf":1.0},"141":{"tf":1.0}}}}}}},"d":{"_":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"160":{"tf":1.0},"266":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"43":{"tf":2.6457513110645907},"44":{"tf":1.0},"48":{"tf":1.0},"8":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"233":{"tf":1.0},"241":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":15,"docs":{"219":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"289":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"60":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"42":{"tf":1.0},"43":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":9,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"133":{"tf":3.1622776601683795},"135":{"tf":1.0},"170":{"tf":1.0},"187":{"tf":1.0},"194":{"tf":2.23606797749979},"240":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.7320508075688772}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"16":{"tf":1.0},"26":{"tf":1.0},"321":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"46":{"tf":1.0}}}}}}},"o":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":13,"docs":{"131":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"173":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"183":{"tf":2.0},"191":{"tf":1.0},"201":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"191":{"tf":1.4142135623730951},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"c":{"1":{"1":{"5":{"5":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"x":{"1":{"0":{"0":{"df":1,"docs":{"279":{"tf":1.0}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"14":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.4142135623730951},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.4142135623730951},"269":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.4142135623730951},"300":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":1.0},"313":{"tf":2.0},"316":{"tf":1.0},"48":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"146":{"tf":1.0},"210":{"tf":1.0},"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":7,"docs":{"146":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"250":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.7320508075688772},"304":{"tf":1.0}},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"'":{"df":2,"docs":{"16":{"tf":1.0},"69":{"tf":1.0}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":17,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.0},"16":{"tf":1.0},"187":{"tf":1.0},"19":{"tf":1.4142135623730951},"195":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"79":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"s":{"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":10,"docs":{"123":{"tf":1.7320508075688772},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"167":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"178":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0}},"t":{"df":15,"docs":{"118":{"tf":1.0},"140":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"323":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0}},"u":{"df":1,"docs":{"173":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"320":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"26":{"tf":1.0}}}}}}},"m":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"135":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.7320508075688772},"200":{"tf":1.0},"220":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.0},"3":{"tf":1.7320508075688772},"57":{"tf":1.0},"68":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"197":{"tf":1.0},"271":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"60":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":122,"docs":{"10":{"tf":1.0},"103":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951},"112":{"tf":1.4142135623730951},"115":{"tf":1.0},"124":{"tf":2.0},"127":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":2.449489742783178},"143":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"148":{"tf":1.0},"152":{"tf":1.0},"154":{"tf":1.4142135623730951},"155":{"tf":1.0},"156":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.4142135623730951},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"195":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"226":{"tf":1.0},"230":{"tf":2.23606797749979},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":2.449489742783178},"249":{"tf":1.0},"255":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.7320508075688772},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979},"280":{"tf":2.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":2.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":3.7416573867739413},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.7320508075688772},"48":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"83":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":5,"docs":{"201":{"tf":1.0},"207":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"41":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"268":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.4142135623730951},"16":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"233":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":2.23606797749979},"268":{"tf":1.0},"288":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"13":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"309":{"tf":1.0}}}},"t":{"df":1,"docs":{"244":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"21":{"tf":1.0},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"281":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"33":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"n":{"df":2,"docs":{"211":{"tf":1.0},"326":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"313":{"tf":1.4142135623730951}}}}}}}}},"df":7,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"164":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"321":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"10":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"164":{"tf":1.0},"268":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"182":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}}}}}},"s":{"df":7,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":46,"docs":{"1":{"tf":1.4142135623730951},"113":{"tf":2.8284271247461903},"123":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":2.6457513110645907},"170":{"tf":1.4142135623730951},"171":{"tf":2.8284271247461903},"172":{"tf":3.4641016151377544},"173":{"tf":3.3166247903554},"174":{"tf":4.242640687119285},"175":{"tf":3.605551275463989},"176":{"tf":2.0},"177":{"tf":2.6457513110645907},"178":{"tf":3.0},"179":{"tf":2.449489742783178},"180":{"tf":2.23606797749979},"181":{"tf":2.23606797749979},"182":{"tf":4.898979485566356},"183":{"tf":3.605551275463989},"184":{"tf":2.23606797749979},"185":{"tf":2.23606797749979},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"204":{"tf":1.4142135623730951},"243":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"269":{"tf":1.0},"272":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.0},"320":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":5,"docs":{"135":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":2.0},"50":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":21,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"144":{"tf":1.4142135623730951},"193":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"32":{"tf":1.0},"327":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"7":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"146":{"tf":1.0},"227":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{},"x":{"df":1,"docs":{"296":{"tf":1.4142135623730951}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"266":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"322":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":21,"docs":{"106":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"184":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"262":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":1,"docs":{"191":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":1,"docs":{"330":{"tf":1.0}}},"r":{"df":1,"docs":{"240":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"266":{"tf":1.0},"284":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":9,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.4142135623730951},"133":{"tf":1.0},"185":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0}},"e":{"'":{"df":2,"docs":{"132":{"tf":1.0},"2":{"tf":1.0}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"m":{"d":{"6":{"4":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":38,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"259":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"268":{"tf":1.4142135623730951},"27":{"tf":1.0},"271":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}},"df":107,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":2.449489742783178},"10":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"117":{"tf":1.0},"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"187":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":2.23606797749979},"20":{"tf":1.7320508075688772},"208":{"tf":1.0},"21":{"tf":2.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.8284271247461903},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"222":{"tf":2.23606797749979},"23":{"tf":2.23606797749979},"232":{"tf":1.0},"233":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979},"240":{"tf":2.0},"243":{"tf":2.6457513110645907},"25":{"tf":2.8284271247461903},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"26":{"tf":3.1622776601683795},"266":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":2.0},"279":{"tf":1.4142135623730951},"28":{"tf":2.0},"281":{"tf":1.7320508075688772},"285":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.7320508075688772},"290":{"tf":1.7320508075688772},"292":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"3":{"tf":2.0},"30":{"tf":1.0},"301":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.0},"310":{"tf":1.4142135623730951},"314":{"tf":2.0},"315":{"tf":1.0},"318":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"36":{"tf":1.7320508075688772},"37":{"tf":1.0},"38":{"tf":2.23606797749979},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"50":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"52":{"tf":3.0},"53":{"tf":2.23606797749979},"54":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"6":{"tf":2.6457513110645907},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.4142135623730951},"68":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"266":{"tf":1.0}}}},"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"252":{"tf":1.0}},"l":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"45":{"tf":1.0},"66":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.0},"170":{"tf":1.7320508075688772},"174":{"tf":2.8284271247461903},"191":{"tf":3.1622776601683795},"193":{"tf":1.7320508075688772},"231":{"tf":1.0},"240":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":2.8284271247461903},"309":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":21,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"219":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"266":{"tf":3.0},"275":{"tf":2.23606797749979},"276":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.0},"309":{"tf":1.0},"32":{"tf":1.4142135623730951},"38":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":2.8284271247461903}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"222":{"tf":2.0},"277":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"178":{"tf":1.0},"216":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":11,"docs":{"13":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"26":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"255":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"10":{"tf":1.0},"40":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":27,"docs":{"10":{"tf":1.4142135623730951},"108":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.4142135623730951},"13":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"206":{"tf":1.0},"210":{"tf":1.0},"232":{"tf":1.0},"283":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.4142135623730951},"68":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":4,"docs":{"240":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"x":{"df":27,"docs":{"131":{"tf":1.0},"192":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.7320508075688772},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"284":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":2.0},"289":{"tf":1.0},"293":{"tf":2.23606797749979},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"74":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"306":{"tf":1.0},"310":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"108":{"tf":1.0},"219":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0},"9":{"tf":1.0}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"n":{"df":105,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":2.0},"164":{"tf":2.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":2.0},"197":{"tf":1.0},"2":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":2.6457513110645907},"231":{"tf":2.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"241":{"tf":1.4142135623730951},"243":{"tf":3.7416573867739413},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":2.449489742783178},"258":{"tf":3.1622776601683795},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"275":{"tf":2.23606797749979},"279":{"tf":1.7320508075688772},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.0},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.872983346207417},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":2.6457513110645907},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"152":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":58,"docs":{"115":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":1.4142135623730951},"23":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"325":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}},"w":{"df":1,"docs":{"231":{"tf":1.0}}}}},"o":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{")":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"146":{"tf":1.4142135623730951},"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.7320508075688772}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"2":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"146":{"tf":1.7320508075688772},"244":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}},"g":{"(":{"4":{"2":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.0}}}}},"df":0,"docs":{}},"2":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"189":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}},":":{":":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"{":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"=":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":55,"docs":{"130":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"204":{"tf":1.0},"207":{"tf":1.4142135623730951},"222":{"tf":2.0},"223":{"tf":1.0},"230":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":2.6457513110645907},"244":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"258":{"tf":3.3166247903554},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"293":{"tf":2.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.7320508075688772},"308":{"tf":2.449489742783178},"312":{"tf":3.7416573867739413},"313":{"tf":1.4142135623730951}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":3,"docs":{"211":{"tf":1.0},"216":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"m":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"294":{"tf":1.0},"30":{"tf":1.0}}}},"df":9,"docs":{"104":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.4142135623730951},"164":{"tf":1.0},"18":{"tf":1.0},"181":{"tf":1.0},"300":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"235":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"127":{"tf":1.0},"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"197":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"206":{"tf":1.0},"320":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"266":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"197":{"tf":1.0},"308":{"tf":1.0},"57":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"292":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":89,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"130":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.449489742783178},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"137":{"tf":1.0},"138":{"tf":3.3166247903554},"139":{"tf":2.23606797749979},"141":{"tf":5.830951894845301},"142":{"tf":1.0},"143":{"tf":3.3166247903554},"144":{"tf":2.6457513110645907},"145":{"tf":1.7320508075688772},"146":{"tf":2.23606797749979},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":2.23606797749979},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":2.23606797749979},"18":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"199":{"tf":1.7320508075688772},"205":{"tf":2.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":3.7416573867739413},"241":{"tf":1.4142135623730951},"243":{"tf":2.449489742783178},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":2.23606797749979},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":2.23606797749979},"279":{"tf":3.0},"281":{"tf":1.0},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.7320508075688772},"302":{"tf":1.0},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":2.0},"40":{"tf":2.0},"42":{"tf":1.0},"44":{"tf":2.23606797749979},"45":{"tf":1.4142135623730951},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"79":{"tf":1.0},"82":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"89":{"tf":1.0},"9":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"141":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.0},"23":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"64":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.0},"119":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0}}}}}}},"g":{"1":{"df":1,"docs":{"105":{"tf":1.0}}},"2":{"df":1,"docs":{"105":{"tf":1.0}}},"a":{"df":5,"docs":{"13":{"tf":1.0},"19":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"44":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"df":1,"docs":{"296":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"0":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":2.0},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.0},"296":{"tf":1.0},"310":{"tf":1.0},"60":{"tf":2.23606797749979},"61":{"tf":1.4142135623730951},"74":{"tf":1.0}},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"_":{"4":{"2":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.7320508075688772},"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0}}}}}}},"df":1,"docs":{"10":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"178":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"3":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"217":{"tf":1.0},"22":{"tf":1.0},"64":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"216":{"tf":1.4142135623730951},"26":{"tf":1.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"160":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.7320508075688772},"64":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.4142135623730951},"18":{"tf":1.0},"219":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":17,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"206":{"tf":1.0},"207":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"258":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"264":{"tf":1.4142135623730951},"273":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":3,"docs":{"27":{"tf":1.0},"52":{"tf":1.0},"64":{"tf":1.0}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"b":{"df":1,"docs":{"16":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"250":{"tf":1.0},"277":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"171":{"tf":1.0},"183":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"140":{"tf":1.0},"28":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.0}},"e":{":":{"1":{"0":{":":{"1":{"4":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.0},"2":{"tf":1.0},"240":{"tf":1.0},"296":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}}},"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951},"296":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":15,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":2.0},"211":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"325":{"tf":1.7320508075688772},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"296":{"tf":1.0},"31":{"tf":1.0},"64":{"tf":1.4142135623730951}},"l":{"df":6,"docs":{"13":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"299":{"tf":1.0},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":5,"docs":{"22":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":1,"docs":{"211":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"320":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"329":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"249":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":14,"docs":{"108":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.4142135623730951},"230":{"tf":1.0},"312":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"85":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"130":{"tf":1.0},"250":{"tf":1.4142135623730951},"44":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.4142135623730951}}}}}}}},"df":5,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"25":{"tf":1.0}},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"169":{"tf":1.0},"30":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":3,"docs":{"124":{"tf":1.0},"181":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"p":{"df":12,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":2.0},"255":{"tf":1.0},"281":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0}}}},"n":{"c":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}},"df":13,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.4142135623730951},"182":{"tf":1.0},"183":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"237":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"193":{"tf":1.0}}}}}}}}},"x":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"1":{".":{".":{"6":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"304":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":2.23606797749979}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"135":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"200":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}},"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":6,"docs":{"174":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.449489742783178},"45":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"187":{"tf":1.0},"197":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"24":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"t":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"268":{"tf":2.0},"312":{"tf":2.8284271247461903}},"e":{"(":{"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}},"v":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0}},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"v":{"0":{".":{"8":{".":{"1":{"1":{"/":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{"df":1,"docs":{"271":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"219":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"301":{"tf":1.0}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"2":{"8":{"4":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"i":{".":{"df":6,"docs":{"143":{"tf":1.0},"204":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"1":{"2":{"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"a":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"279":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"df":0,"docs":{},"~":{"1":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}}},"[":{"1":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"174":{"tf":1.0},"185":{"tf":1.4142135623730951},"190":{"tf":1.0},"243":{"tf":3.1622776601683795},"255":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":8,"docs":{"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"250":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"8":{"[":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":8,"docs":{"130":{"tf":1.0},"132":{"tf":1.4142135623730951},"190":{"tf":1.0},"244":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.0},"296":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"c":{"df":7,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.0},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.7320508075688772}}},"d":{"df":2,"docs":{"277":{"tf":1.0},"310":{"tf":1.0}},"e":{"a":{"df":2,"docs":{"20":{"tf":1.0},"212":{"tf":1.4142135623730951}},"l":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"158":{"tf":1.0},"16":{"tf":1.0},"281":{"tf":1.0},"320":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"84":{"tf":1.7320508075688772},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":23,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":2.449489742783178},"131":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"166":{"tf":1.0},"170":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"308":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"118":{"tf":1.0},"258":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"165":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"284":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"313":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"240":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"1":{"tf":1.0},"132":{"tf":2.6457513110645907},"141":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"297":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.4142135623730951},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"69":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"132":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"283":{"tf":1.0},"308":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":16,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"32":{"tf":2.23606797749979},"42":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"288":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"v":{"df":12,"docs":{"211":{"tf":1.7320508075688772},"217":{"tf":1.0},"220":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"227":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"249":{"tf":1.0},"289":{"tf":1.7320508075688772},"294":{"tf":1.0},"301":{"tf":1.4142135623730951},"317":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}},"y":{"[":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}}}}},"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"324":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"d":{"df":24,"docs":{"143":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"196":{"tf":1.0},"212":{"tf":1.0},"223":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"309":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0},"79":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"320":{"tf":1.0},"52":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":2.0}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"233":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"191":{"tf":1.0},"200":{"tf":1.4142135623730951},"206":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":8,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":2.23606797749979},"240":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"41":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"177":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":4,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"15":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":6,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"312":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"138":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"250":{"tf":1.7320508075688772}}}}},"x":{"df":1,"docs":{"182":{"tf":1.0}}}},"o":{"df":4,"docs":{"135":{"tf":1.0},"144":{"tf":1.4142135623730951},"158":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":12,"docs":{"146":{"tf":2.23606797749979},"148":{"tf":1.0},"15":{"tf":1.0},"151":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"266":{"tf":1.0},"275":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"130":{"tf":1.7320508075688772},"233":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}},"df":1,"docs":{"312":{"tf":1.0}},"i":{"df":11,"docs":{"135":{"tf":1.0},"139":{"tf":1.0},"174":{"tf":2.8284271247461903},"175":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":2.23606797749979},"45":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"159":{"tf":1.0},"279":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":1,"docs":{"243":{"tf":1.4142135623730951}},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"df":1,"docs":{"243":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"168":{"tf":1.0},"169":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":7,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":10,"docs":{"141":{"tf":1.0},"146":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":2.0},"152":{"tf":1.4142135623730951},"203":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"t":{"a":{"df":1,"docs":{"302":{"tf":1.0}},"l":{"df":13,"docs":{"14":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"26":{"tf":2.449489742783178},"27":{"tf":1.7320508075688772},"38":{"tf":2.23606797749979},"57":{"tf":2.0},"6":{"tf":2.23606797749979},"60":{"tf":1.0},"7":{"tf":1.0}}},"n":{"c":{"df":14,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"146":{"tf":1.7320508075688772},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"193":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"258":{"tf":1.4142135623730951},"276":{"tf":1.0},"305":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.0},"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"312":{"tf":1.4142135623730951},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":17,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"265":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"315":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"244":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"269":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":16,"docs":{"124":{"tf":2.0},"127":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":1.0},"173":{"tf":1.4142135623730951},"181":{"tf":1.0},"192":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"187":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"271":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"14":{"tf":1.0},"143":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"320":{"tf":1.0},"327":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"329":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"9":{"tf":1.0}}}}},"f":{"a":{"c":{"df":5,"docs":{"130":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"189":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":17,"docs":{"130":{"tf":1.0},"138":{"tf":1.0},"191":{"tf":1.0},"266":{"tf":2.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"288":{"tf":1.0},"290":{"tf":1.4142135623730951},"294":{"tf":1.7320508075688772},"297":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":3,"docs":{"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"10":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"247":{"tf":1.0}},"t":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"293":{"tf":1.0},"305":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"171":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"185":{"tf":1.0},"287":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}},"o":{"c":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":5,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"40":{"tf":1.0}}},"l":{"df":0,"docs":{},"v":{"df":4,"docs":{"22":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"4":{"tf":1.0}}}}}}},"p":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"57":{"tf":1.0}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":15,"docs":{"160":{"tf":1.0},"210":{"tf":2.23606797749979},"212":{"tf":1.7320508075688772},"213":{"tf":1.0},"215":{"tf":2.6457513110645907},"230":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"322":{"tf":1.0},"64":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"'":{"df":5,"docs":{"219":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"277":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.7320508075688772},"191":{"tf":1.0}}},"1":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}},"2":{"df":1,"docs":{"174":{"tf":1.0}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"300":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":45,"docs":{"113":{"tf":1.0},"115":{"tf":2.0},"129":{"tf":1.7320508075688772},"130":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"132":{"tf":1.0},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"161":{"tf":1.0},"175":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.4142135623730951},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":1.0},"37":{"tf":1.4142135623730951}}},"r":{"df":2,"docs":{"169":{"tf":1.0},"316":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"212":{"tf":1.0},"215":{"tf":1.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"305":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"14":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"105":{"tf":1.0}},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":1,"docs":{"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":4,"docs":{"15":{"tf":1.0},"206":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"207":{"tf":1.0}}}},"y":{"df":13,"docs":{"141":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"177":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"40":{"tf":2.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":2.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":21,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":2.0},"118":{"tf":2.0},"119":{"tf":2.449489742783178},"120":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"287":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"315":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"130":{"tf":1.0},"40":{"tf":1.0}},"n":{"df":6,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"191":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0}}}}}},"w":{"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"118":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"115":{"tf":1.0},"118":{"tf":1.0}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":6,"docs":{"141":{"tf":3.4641016151377544},"173":{"tf":1.4142135623730951},"255":{"tf":3.4641016151377544},"265":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0}}}}},"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{},"g":{".":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":4,"docs":{"301":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"135":{"tf":1.0},"14":{"tf":1.0},"187":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"3":{"tf":1.7320508075688772},"321":{"tf":1.0},"326":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"43":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"64":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":11,"docs":{"113":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.7320508075688772},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"289":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":11,"docs":{"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"321":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}}}},"v":{"df":4,"docs":{"164":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"255":{"tf":1.0},"280":{"tf":1.7320508075688772},"292":{"tf":1.0},"296":{"tf":1.0}}}},"n":{"df":1,"docs":{"230":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"191":{"tf":1.0},"193":{"tf":1.7320508075688772},"243":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.0},"90":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"201":{"tf":1.0},"3":{"tf":1.0},"312":{"tf":1.0}}}},"t":{"'":{"df":6,"docs":{"280":{"tf":1.0},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":12,"docs":{"0":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"115":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"c":{"df":13,"docs":{"113":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":4,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":57,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"132":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"31":{"tf":1.4142135623730951},"314":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":2.0},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"308":{"tf":1.0}}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"187":{"tf":1.0},"268":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"128":{"tf":1.0}}}}},"df":0,"docs":{}},"df":6,"docs":{"122":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}}},"k":{"df":12,"docs":{"19":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"64":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"243":{"tf":1.4142135623730951},"26":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":3.1622776601683795},"187":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"216":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"30":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}}},"df":20,"docs":{"113":{"tf":1.0},"123":{"tf":2.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":2.0},"127":{"tf":2.8284271247461903},"172":{"tf":1.0},"181":{"tf":2.23606797749979},"192":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"233":{"tf":1.0},"287":{"tf":1.4142135623730951},"296":{"tf":2.0},"299":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":2.0}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"13":{"tf":1.7320508075688772},"15":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.7320508075688772},"51":{"tf":1.4142135623730951}}}}},"o":{"a":{"d":{"df":5,"docs":{"159":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.0},"280":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":1.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"211":{"tf":1.0},"219":{"tf":1.7320508075688772},"260":{"tf":1.4142135623730951},"261":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"65":{"tf":1.7320508075688772}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"144":{"tf":1.0},"178":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"207":{"tf":1.0},"233":{"tf":1.0},"25":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":2.449489742783178},"281":{"tf":1.0},"284":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0}},"i":{"c":{"df":8,"docs":{"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"182":{"tf":1.0},"184":{"tf":1.4142135623730951},"41":{"tf":2.0}}},"df":0,"docs":{}},"s":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"313":{"tf":1.0}}},"g":{"df":2,"docs":{"141":{"tf":1.0},"288":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":7,"docs":{"143":{"tf":1.4142135623730951},"17":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"19":{"tf":1.0},"42":{"tf":1.0}}}}},"p":{"df":5,"docs":{"166":{"tf":1.4142135623730951},"167":{"tf":2.449489742783178},"168":{"tf":2.449489742783178},"169":{"tf":2.449489742783178},"316":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"w":{"df":3,"docs":{"258":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"247":{"tf":1.4142135623730951},"269":{"tf":1.0},"284":{"tf":1.0},"302":{"tf":1.0},"40":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":3,"docs":{"23":{"tf":1.0},"230":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}}},"o":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"163":{"tf":1.0},"216":{"tf":1.4142135623730951},"243":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}},"n":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"130":{"tf":1.4142135623730951},"226":{"tf":1.0},"243":{"tf":1.0},"275":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"211":{"tf":1.0},"266":{"tf":1.0},"31":{"tf":1.7320508075688772},"41":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"51":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"e":{"df":30,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.7320508075688772},"19":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":1.0},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"14":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":7,"docs":{"19":{"tf":1.0},"212":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"49":{"tf":1.0},"79":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"226":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"240":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"<":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":17,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.7320508075688772},"2":{"tf":1.0},"204":{"tf":1.7320508075688772},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"48":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":1,"docs":{"196":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":13,"docs":{"113":{"tf":1.4142135623730951},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"177":{"tf":1.7320508075688772},"187":{"tf":1.0},"196":{"tf":2.0},"204":{"tf":2.0},"256":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.7320508075688772},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":14,"docs":{"118":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":2.6457513110645907},"191":{"tf":1.0},"219":{"tf":1.4142135623730951},"240":{"tf":2.6457513110645907},"255":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"272":{"tf":1.0}}}}}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"143":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":5,"docs":{"190":{"tf":1.4142135623730951},"197":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":7,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":1.0},"183":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"191":{"tf":1.0}}}}},"t":{"df":1,"docs":{"136":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"249":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":1,"docs":{"250":{"tf":1.0}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":16,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"141":{"tf":1.0},"187":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":2.8284271247461903},"207":{"tf":2.449489742783178},"230":{"tf":1.0},"250":{"tf":1.4142135623730951},"256":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":17,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"90":{"tf":2.449489742783178},"91":{"tf":1.0},"92":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"227":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"8":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"107":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"230":{"tf":2.23606797749979},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":2.23606797749979}}}}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"215":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":29,"docs":{"10":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"2":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"69":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"249":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":19,"docs":{"10":{"tf":1.7320508075688772},"135":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"48":{"tf":1.0},"9":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"132":{"tf":2.449489742783178},"237":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"280":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"238":{"tf":1.0}}}},"u":{"df":2,"docs":{"185":{"tf":1.0},"250":{"tf":1.0}},"t":{"df":1,"docs":{"66":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"264":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":4,"docs":{"231":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"13":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"x":{"df":2,"docs":{"109":{"tf":1.0},"312":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":2.0}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":4,"docs":{"68":{"tf":1.4142135623730951},"89":{"tf":1.7320508075688772},"91":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":1,"docs":{"275":{"tf":1.0}},"e":{"df":1,"docs":{"31":{"tf":2.0}},"r":{"df":1,"docs":{"322":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":17,"docs":{"108":{"tf":1.0},"110":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"275":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"89":{"tf":1.0}}}},"df":16,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"180":{"tf":1.0},"193":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":2.0},"266":{"tf":2.449489742783178},"275":{"tf":2.0},"279":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951}},"e":{"'":{"df":1,"docs":{"266":{"tf":1.0}}},".":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"d":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}},"u":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"315":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":33,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"13":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.7320508075688772},"206":{"tf":1.0},"21":{"tf":1.0},"232":{"tf":1.0},"255":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"35":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"139":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":6,"docs":{"161":{"tf":1.0},"217":{"tf":1.0},"277":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"42":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"'":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"258":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"146":{"tf":1.0},"312":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"l":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"104":{"tf":1.0},"135":{"tf":1.0},"182":{"tf":1.0},"219":{"tf":1.0},"244":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"42":{"tf":1.0}},"i":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"144":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"145":{"tf":2.23606797749979},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.0},"240":{"tf":2.449489742783178},"40":{"tf":2.0}},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"145":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}},"df":26,"docs":{"107":{"tf":1.4142135623730951},"118":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":2.23606797749979},"150":{"tf":1.0},"153":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"177":{"tf":1.0},"230":{"tf":3.0},"240":{"tf":3.1622776601683795},"249":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"48":{"tf":1.7320508075688772},"88":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":1,"docs":{"6":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"205":{"tf":1.0}}}},"df":0,"docs":{}}},"df":6,"docs":{"243":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"276":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"258":{"tf":1.0},"283":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"250":{"tf":1.0}}},"x":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"233":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"296":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"0":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}},"e":{"(":{"1":{"df":1,"docs":{"170":{"tf":1.0}}},"a":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"313":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"222":{"tf":1.4142135623730951},"299":{"tf":1.0},"313":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":3,"docs":{"240":{"tf":1.0},"265":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":37,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"134":{"tf":1.0},"141":{"tf":2.449489742783178},"145":{"tf":1.0},"148":{"tf":1.0},"159":{"tf":1.0},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"179":{"tf":2.23606797749979},"180":{"tf":1.0},"189":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"194":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"281":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"46":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}},"v":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"16":{"tf":1.0},"326":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":7,"docs":{"115":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":32,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"212":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"249":{"tf":1.0},"26":{"tf":1.7320508075688772},"268":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"280":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"185":{"tf":1.4142135623730951},"247":{"tf":1.0},"280":{"tf":1.7320508075688772}}}},"df":1,"docs":{"244":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"141":{"tf":1.0},"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"204":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":7,"docs":{"13":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":1.0},"19":{"tf":3.3166247903554},"20":{"tf":1.0},"235":{"tf":1.0},"46":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0}}}}},"w":{"(":{"_":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}},"df":28,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.4142135623730951},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":2,"docs":{"122":{"tf":1.4142135623730951},"124":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.0},"174":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"41":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"266":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"131":{"tf":1.0},"133":{"tf":1.0}}}}},"n":{"c":{"df":1,"docs":{"204":{"tf":2.449489742783178}}},"df":12,"docs":{"136":{"tf":1.0},"232":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"284":{"tf":1.0},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"115":{"tf":1.7320508075688772},"182":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":117,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"217":{"tf":1.7320508075688772},"218":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.4142135623730951},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.4142135623730951},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.4142135623730951},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.4142135623730951},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"42":{"tf":1.0},"60":{"tf":2.6457513110645907},"7":{"tf":1.0}}},"h":{"df":2,"docs":{"13":{"tf":1.0},"17":{"tf":1.0}}},"i":{"c":{"df":5,"docs":{"18":{"tf":1.0},"279":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":50,"docs":{"17":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"219":{"tf":1.0},"223":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.4142135623730951},"231":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"268":{"tf":1.7320508075688772},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":2.23606797749979},"288":{"tf":1.7320508075688772},"292":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":2.6457513110645907},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"35":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":24,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.7320508075688772},"134":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.7320508075688772},"16":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"191":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"233":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}}}},"df":1,"docs":{"249":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.7320508075688772},"191":{"tf":1.0},"196":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"299":{"tf":1.0},"305":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":10,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.6457513110645907},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"243":{"tf":1.0},"283":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"55":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"323":{"tf":1.7320508075688772},"49":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"240":{"tf":1.4142135623730951}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"141":{"tf":1.0},"173":{"tf":1.0},"255":{"tf":1.0}}}}},"n":{"c":{"df":6,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0},"273":{"tf":1.0},"34":{"tf":1.0},"57":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":25,"docs":{"0":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":2.0},"13":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"181":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"233":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"64":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"223":{"tf":1.0},"9":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":19,"docs":{"15":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"224":{"tf":1.0},"27":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.0}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"174":{"tf":2.449489742783178},"175":{"tf":1.7320508075688772},"184":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":29,"docs":{"105":{"tf":1.0},"113":{"tf":2.0},"146":{"tf":1.0},"153":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":2.0},"182":{"tf":2.449489742783178},"183":{"tf":2.0},"184":{"tf":2.449489742783178},"185":{"tf":2.6457513110645907},"187":{"tf":1.0},"192":{"tf":1.0},"200":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951},"52":{"tf":1.0},"69":{"tf":1.0},"89":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"212":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"249":{"tf":1.0},"292":{"tf":1.4142135623730951},"309":{"tf":2.0},"51":{"tf":1.0},"68":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"292":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":7,"docs":{"115":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.7320508075688772},"25":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"141":{"tf":1.0},"153":{"tf":1.0},"173":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"43":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":7,"docs":{"215":{"tf":1.0},"240":{"tf":2.23606797749979},"275":{"tf":1.0},"287":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"68":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.0}}},"x":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"275":{"tf":1.0}}}},"df":3,"docs":{"255":{"tf":1.0},"321":{"tf":1.0},"53":{"tf":1.4142135623730951}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"268":{"tf":1.0},"287":{"tf":1.0},"324":{"tf":1.0},"42":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"141":{"tf":1.0},"19":{"tf":1.0},"212":{"tf":1.4142135623730951},"219":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"16":{"tf":1.0},"19":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":15,"docs":{"12":{"tf":1.0},"141":{"tf":1.0},"18":{"tf":1.0},"219":{"tf":1.0},"25":{"tf":1.0},"277":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":2.23606797749979},"84":{"tf":1.0},"9":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"193":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"279":{"tf":1.0},"41":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"280":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":8,"docs":{"166":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.0},"43":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"280":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"280":{"tf":1.0}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"309":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}}}},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}},"p":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"q":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":2,"docs":{"131":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951}}}},"1":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"275":{"tf":1.0}}},"2":{"5":{"6":{"df":1,"docs":{"52":{"tf":1.4142135623730951}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}}},"x":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"275":{"tf":1.0}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":3,"docs":{"18":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":10,"docs":{"20":{"tf":1.0},"220":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"r":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},".":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"146":{"tf":1.0},"243":{"tf":1.7320508075688772},"281":{"tf":1.0},"41":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"c":{"(":{"0":{"df":0,"docs":{},"x":{"3":{"2":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"171":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":2.0},"294":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":25,"docs":{"100":{"tf":1.4142135623730951},"105":{"tf":1.4142135623730951},"108":{"tf":1.0},"109":{"tf":1.4142135623730951},"115":{"tf":1.0},"132":{"tf":1.4142135623730951},"141":{"tf":4.0},"144":{"tf":2.0},"152":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"243":{"tf":1.4142135623730951},"255":{"tf":2.0},"283":{"tf":1.0},"312":{"tf":2.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":2.0},"75":{"tf":1.4142135623730951},"80":{"tf":1.4142135623730951},"85":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"266":{"tf":1.0},"309":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":5,"docs":{"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"284":{"tf":1.0}}},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}},"s":{"df":3,"docs":{"246":{"tf":1.0},"266":{"tf":2.449489742783178},"279":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":2,"docs":{"284":{"tf":1.0},"304":{"tf":1.0}}}}},"t":{"df":6,"docs":{"130":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"277":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"213":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"281":{"tf":1.0}}},"s":{"df":22,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.7320508075688772},"145":{"tf":1.0},"18":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"313":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"t":{"df":1,"docs":{"19":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":9,"docs":{"170":{"tf":1.7320508075688772},"180":{"tf":1.7320508075688772},"222":{"tf":1.0},"226":{"tf":1.0},"253":{"tf":1.0},"266":{"tf":1.4142135623730951},"288":{"tf":1.0},"30":{"tf":1.0},"34":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"133":{"tf":1.0},"170":{"tf":2.449489742783178},"240":{"tf":3.0},"329":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}}}}},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"40":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"52":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":3,"docs":{"131":{"tf":1.0},"240":{"tf":2.0},"27":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"219":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":16,"docs":{"18":{"tf":1.0},"187":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.0},"313":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.4142135623730951},"43":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"137":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"25":{"tf":1.7320508075688772},"321":{"tf":1.0},"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"271":{"tf":1.0},"277":{"tf":1.4142135623730951},"310":{"tf":1.0}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"321":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"272":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"135":{"tf":1.0},"249":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}},"r":{"@":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"200":{"tf":1.4142135623730951},"215":{"tf":1.0},"22":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"n":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"213":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"=":{"4":{"7":{"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}}}},"y":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"57":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":2.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"1":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"131":{"tf":1.0},"178":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0}}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.4142135623730951}}}}}}}}},"1":{"df":1,"docs":{"178":{"tf":1.0}}},"2":{"df":1,"docs":{"178":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"131":{"tf":1.4142135623730951},"160":{"tf":1.0},"178":{"tf":2.0},"19":{"tf":1.4142135623730951},"22":{"tf":1.0},"240":{"tf":2.23606797749979},"244":{"tf":1.0},"258":{"tf":2.449489742783178},"275":{"tf":2.8284271247461903},"279":{"tf":1.0},"3":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"201":{"tf":1.7320508075688772},"203":{"tf":1.7320508075688772},"204":{"tf":1.0},"207":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"131":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"24":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"144":{"tf":1.0},"173":{"tf":1.0},"191":{"tf":1.4142135623730951},"321":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":1.0},"143":{"tf":1.0},"187":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.0},"277":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"287":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":3,"docs":{"287":{"tf":1.0},"323":{"tf":1.0},"54":{"tf":1.4142135623730951}},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.4142135623730951}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"113":{"tf":1.0},"136":{"tf":2.0},"157":{"tf":1.0},"158":{"tf":3.0},"296":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"68":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"287":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":48,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"220":{"tf":1.0},"230":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":3.0},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"107":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"271":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"141":{"tf":1.0},"145":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"138":{"tf":1.0},"240":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"164":{"tf":1.0},"313":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"285":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"17":{"tf":1.0},"255":{"tf":1.0},"309":{"tf":1.7320508075688772}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.7320508075688772}}}},"o":{"df":0,"docs":{},"u":{"df":12,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":14,"docs":{"219":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":2.0},"265":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"=":{"1":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"268":{"tf":1.0},"312":{"tf":2.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"182":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"287":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"222":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"285":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.7320508075688772},"324":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":15,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"241":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":2.0},"321":{"tf":1.4142135623730951},"326":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":3,"docs":{"143":{"tf":1.0},"210":{"tf":1.0},"3":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"214":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":8,"docs":{"115":{"tf":1.0},"146":{"tf":1.0},"174":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.7320508075688772},"222":{"tf":1.0},"309":{"tf":2.23606797749979},"8":{"tf":1.0}},"t":{"df":2,"docs":{"115":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"187":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"219":{"tf":1.0}}},"df":25,"docs":{"10":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"213":{"tf":1.4142135623730951},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"28":{"tf":2.0},"29":{"tf":2.6457513110645907},"30":{"tf":2.6457513110645907},"31":{"tf":2.8284271247461903},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":2.23606797749979},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"312":{"tf":1.0}}}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"25":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"241":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"288":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":2.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":17,"docs":{"108":{"tf":1.0},"132":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"173":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"301":{"tf":1.0},"304":{"tf":1.7320508075688772},"326":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":89,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":3.0},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.0},"189":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"196":{"tf":2.0},"2":{"tf":1.0},"222":{"tf":1.7320508075688772},"230":{"tf":1.7320508075688772},"231":{"tf":2.23606797749979},"234":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":5.291502622129181},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":2.449489742783178},"272":{"tf":1.0},"275":{"tf":2.449489742783178},"279":{"tf":1.4142135623730951},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.605551275463989},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":3.4641016151377544},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{":":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":21,"docs":{"13":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"20":{"tf":1.0},"231":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"281":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.23606797749979}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":4,"docs":{"140":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"62":{"tf":2.0},"63":{"tf":1.0}}}},"t":{"df":3,"docs":{"212":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"131":{"tf":1.0}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"152":{"tf":1.0},"2":{"tf":1.0},"243":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}}},"q":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":1,"docs":{"240":{"tf":1.0}},"u":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"130":{"tf":1.0},"193":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"143":{"tf":1.0},"18":{"tf":1.4142135623730951},"266":{"tf":1.0},"287":{"tf":1.0},"44":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"297":{"tf":1.0},"330":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"228":{"tf":1.0},"301":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"124":{"tf":1.7320508075688772},"287":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"313":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":1,"docs":{"222":{"tf":1.0}},"g":{"df":6,"docs":{"115":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"70":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"276":{"tf":1.0},"79":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"w":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"271":{"tf":1.0},"279":{"tf":1.0}}}},"df":9,"docs":{"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"230":{"tf":1.0},"26":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"d":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":25,"docs":{"10":{"tf":1.7320508075688772},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":3.3166247903554},"15":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"155":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"18":{"tf":2.0},"21":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"240":{"tf":1.4142135623730951},"258":{"tf":1.0},"308":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.7320508075688772},"56":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"df":1,"docs":{"230":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"230":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"230":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"i":{"df":5,"docs":{"13":{"tf":1.0},"212":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}}},"m":{"df":1,"docs":{"317":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"36":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"119":{"tf":1.0},"191":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"v":{"df":7,"docs":{"148":{"tf":1.0},"258":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"255":{"tf":1.7320508075688772},"279":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"212":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"69":{"tf":1.0},"70":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":2.23606797749979}},"e":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"64":{"tf":1.0}}}}}}}},"df":3,"docs":{"266":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"222":{"tf":1.0},"27":{"tf":1.0},"297":{"tf":1.0},"306":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"145":{"tf":1.4142135623730951},"187":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.4142135623730951},"21":{"tf":1.0},"237":{"tf":1.0},"287":{"tf":1.0},"316":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"317":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"256":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"269":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"313":{"tf":1.0}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"158":{"tf":1.0},"231":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"250":{"tf":2.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"305":{"tf":2.0},"309":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"322":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":2,"docs":{"203":{"tf":1.0},"207":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":113,"docs":{"193":{"tf":1.0},"217":{"tf":1.7320508075688772},"218":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.4142135623730951},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.4142135623730951},"239":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":2.23606797749979},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.4142135623730951},"56":{"tf":1.0},"58":{"tf":1.7320508075688772},"59":{"tf":1.0},"60":{"tf":2.449489742783178},"61":{"tf":2.23606797749979},"62":{"tf":1.7320508075688772},"63":{"tf":2.449489742783178},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"215":{"tf":1.0}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"182":{"tf":1.0}}},"df":5,"docs":{"120":{"tf":1.4142135623730951},"141":{"tf":1.0},"195":{"tf":1.0},"289":{"tf":1.0},"296":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":7,"docs":{"227":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"297":{"tf":1.0},"322":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"24":{"tf":1.0},"240":{"tf":1.0},"314":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"65":{"tf":1.0},"66":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":3,"docs":{"19":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"210":{"tf":1.7320508075688772},"215":{"tf":2.0},"25":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"324":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"211":{"tf":1.4142135623730951},"212":{"tf":1.0},"216":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":13,"docs":{"105":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.0},"280":{"tf":1.0},"302":{"tf":1.0},"323":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"277":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.0},"326":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":20,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"174":{"tf":1.0},"19":{"tf":1.0},"215":{"tf":1.0},"233":{"tf":1.7320508075688772},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"279":{"tf":1.0},"30":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"89":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"117":{"tf":1.0},"119":{"tf":1.7320508075688772},"120":{"tf":1.0},"250":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}},"v":{"df":8,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"204":{"tf":1.4142135623730951},"216":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"272":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"141":{"tf":1.0},"216":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":7,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"324":{"tf":1.0},"45":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"240":{"tf":1.4142135623730951},"287":{"tf":1.0},"308":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":17,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.4142135623730951},"250":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"313":{"tf":1.4142135623730951},"33":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":4,"docs":{"252":{"tf":1.0},"271":{"tf":1.0},"42":{"tf":1.0},"69":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"144":{"tf":1.4142135623730951},"151":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":80,"docs":{"10":{"tf":2.0},"102":{"tf":1.7320508075688772},"106":{"tf":1.7320508075688772},"110":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":2.0},"135":{"tf":1.0},"141":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.7320508075688772},"164":{"tf":3.4641016151377544},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.23606797749979},"170":{"tf":2.0},"173":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.0},"189":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"243":{"tf":3.0},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":1.0},"258":{"tf":2.6457513110645907},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"281":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.7320508075688772},"304":{"tf":3.7416573867739413},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":1.0},"48":{"tf":2.0},"71":{"tf":1.7320508075688772},"76":{"tf":1.7320508075688772},"81":{"tf":1.7320508075688772},"86":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"97":{"tf":1.7320508075688772}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"164":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}},"df":25,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":4.123105625617661},"164":{"tf":2.0},"171":{"tf":1.4142135623730951},"212":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.23606797749979},"288":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"41":{"tf":3.1622776601683795},"43":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":2.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"143":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"247":{"tf":1.0},"292":{"tf":1.0},"322":{"tf":1.0},"40":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"305":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"1":{"6":{"0":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"79":{"tf":1.7320508075688772},"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"279":{"tf":1.0},"312":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"u":{"8":{"(":{"2":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":6,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"222":{"tf":1.0},"266":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"d":{"df":4,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"182":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"c":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":2.0},"219":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":6,"docs":{"123":{"tf":1.0},"146":{"tf":1.0},"233":{"tf":2.0},"241":{"tf":1.0},"37":{"tf":1.4142135623730951},"59":{"tf":1.0}}}},"n":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":26,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.0},"243":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"287":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"37":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"a":{"c":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"(":{"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":2.0},"243":{"tf":2.23606797749979}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":6,"docs":{"139":{"tf":1.0},"204":{"tf":1.0},"219":{"tf":2.449489742783178},"227":{"tf":1.0},"314":{"tf":1.0},"40":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"233":{"tf":1.0},"275":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"40":{"tf":1.0},"57":{"tf":1.7320508075688772}}}}}},"s":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}}},"df":5,"docs":{"1":{"tf":1.0},"192":{"tf":1.0},"227":{"tf":1.0},"279":{"tf":1.7320508075688772},"9":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}},"s":{"a":{"df":1,"docs":{"266":{"tf":2.23606797749979}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"df":16,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"152":{"tf":1.0},"17":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.0},"233":{"tf":1.7320508075688772},"255":{"tf":1.0},"272":{"tf":1.0},"281":{"tf":1.0},"309":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"52":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"247":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"230":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"266":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":7,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"323":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":10,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"141":{"tf":1.0},"171":{"tf":1.0},"191":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"p":{"2":{"5":{"6":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"14":{"tf":1.0},"200":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"292":{"tf":1.4142135623730951},"35":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"e":{"df":14,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.4142135623730951},"219":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.0},"330":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":1,"docs":{"212":{"tf":1.0}}}},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"206":{"tf":1.0},"316":{"tf":1.7320508075688772}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"28":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"=":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"[":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"2":{"=":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}},"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"z":{"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{".":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"243":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"d":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"(":{"5":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":4,"docs":{"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":4,"docs":{"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"48":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.4142135623730951}},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"163":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"1":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"258":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"[":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"x":{"df":1,"docs":{"258":{"tf":2.0}}}},"df":1,"docs":{"258":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"[":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"5":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}}}}},"u":{"df":0,"docs":{},"m":{"(":{"[":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"173":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":3,"docs":{"231":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":38,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.0},"144":{"tf":1.4142135623730951},"146":{"tf":2.6457513110645907},"148":{"tf":1.0},"152":{"tf":3.0},"153":{"tf":1.7320508075688772},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"16":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":2.0},"240":{"tf":3.0},"249":{"tf":1.0},"275":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.0}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"158":{"tf":1.0},"59":{"tf":1.0}}}}}},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"258":{"tf":1.0},"42":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":13,"docs":{"135":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"'":{"df":2,"docs":{"148":{"tf":1.0},"42":{"tf":1.0}}},"df":4,"docs":{"141":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"41":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"t":{"df":4,"docs":{"189":{"tf":1.0},"240":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":8,"docs":{"124":{"tf":1.0},"132":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"290":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"19":{"tf":2.23606797749979},"235":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"19":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":18,"docs":{"105":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":2.23606797749979},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"315":{"tf":1.0},"328":{"tf":1.0}}}}},"v":{"df":2,"docs":{"211":{"tf":1.4142135623730951},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}}},"t":{"df":14,"docs":{"126":{"tf":1.4142135623730951},"139":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":2.0},"266":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.7320508075688772},"43":{"tf":1.0},"52":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"19":{"tf":1.0},"255":{"tf":1.0},"40":{"tf":1.0}}}}},"x":{"df":1,"docs":{"320":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"74":{"tf":1.7320508075688772},"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"315":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"182":{"tf":1.4142135623730951},"247":{"tf":1.0},"27":{"tf":1.4142135623730951},"280":{"tf":2.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"287":{"tf":1.0}}}}},"df":2,"docs":{"197":{"tf":1.0},"272":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"2":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.4142135623730951},"271":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":2,"docs":{"146":{"tf":1.0},"287":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"272":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"132":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"18":{"tf":1.4142135623730951},"249":{"tf":1.0},"258":{"tf":1.0},"283":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"72":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951}}}}}},"df":17,"docs":{"135":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":2.23606797749979},"18":{"tf":1.7320508075688772},"190":{"tf":1.0},"240":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"204":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":11,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}},"i":{"df":7,"docs":{"18":{"tf":1.4142135623730951},"203":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"19":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0},"255":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"327":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":5,"docs":{"21":{"tf":1.0},"243":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.4142135623730951},"66":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"=":{"5":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":16,"docs":{"113":{"tf":1.0},"131":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"203":{"tf":2.0},"207":{"tf":1.0},"250":{"tf":1.7320508075688772},"268":{"tf":2.0},"279":{"tf":1.0},"292":{"tf":3.0},"299":{"tf":1.0},"312":{"tf":2.23606797749979},"320":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"164":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"t":{"df":6,"docs":{"161":{"tf":1.0},"177":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"256":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"40":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"c":{"df":3,"docs":{"237":{"tf":1.0},"26":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"240":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"318":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"143":{"tf":1.0},"3":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"_":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"168":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":2.0}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"233":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"137":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.4142135623730951}}}},"df":1,"docs":{"178":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"169":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951}}}}}},"v":{"df":1,"docs":{"145":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.0},"249":{"tf":1.0},"275":{"tf":1.0},"35":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":8,"docs":{"130":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":2.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.0},"277":{"tf":1.0}},"e":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"200":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"277":{"tf":1.0},"293":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"317":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"139":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":105,"docs":{"1":{"tf":1.0},"113":{"tf":2.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.4142135623730951},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.7320508075688772},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"26":{"tf":1.0},"289":{"tf":1.0},"40":{"tf":2.0},"44":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":12,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"161":{"tf":1.0},"173":{"tf":1.0},"233":{"tf":1.0},"255":{"tf":2.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"30":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"177":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"130":{"tf":1.0},"226":{"tf":1.0},"275":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"113":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":11,"docs":{"113":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":3.0},"207":{"tf":1.4142135623730951},"213":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":6,"docs":{"16":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"r":{"d":{"df":56,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"132":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":2.0},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":15,"docs":{"127":{"tf":2.0},"13":{"tf":1.0},"15":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"273":{"tf":1.0},"29":{"tf":1.0},"305":{"tf":1.0},"315":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"5":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":24,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":2.0},"139":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"7":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":27,"docs":{"113":{"tf":3.7416573867739413},"136":{"tf":1.0},"157":{"tf":4.0},"158":{"tf":2.6457513110645907},"159":{"tf":2.23606797749979},"160":{"tf":2.23606797749979},"161":{"tf":2.449489742783178},"162":{"tf":2.6457513110645907},"163":{"tf":3.0},"164":{"tf":2.6457513110645907},"165":{"tf":2.6457513110645907},"166":{"tf":2.449489742783178},"167":{"tf":2.23606797749979},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"170":{"tf":2.449489742783178},"171":{"tf":2.6457513110645907},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"288":{"tf":2.0},"289":{"tf":1.0},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"n":{"df":1,"docs":{"157":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":8,"docs":{"1":{"tf":1.0},"119":{"tf":1.0},"175":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"252":{"tf":1.0},"293":{"tf":1.0},"316":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"320":{"tf":1.0}}}}},"d":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"230":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{":":{":":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"230":{"tf":1.0},"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"273":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"14":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":1.0},"279":{"tf":1.0},"61":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"21":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"266":{"tf":1.0},"287":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":34,"docs":{"10":{"tf":2.0},"113":{"tf":1.7320508075688772},"137":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":2.449489742783178},"152":{"tf":1.4142135623730951},"153":{"tf":1.7320508075688772},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"161":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.0},"202":{"tf":2.0},"203":{"tf":2.6457513110645907},"204":{"tf":2.23606797749979},"205":{"tf":1.4142135623730951},"219":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"312":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"135":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"197":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":2.6457513110645907},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"268":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":1,"docs":{"306":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"120":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"'":{"df":1,"docs":{"197":{"tf":1.0}}},"1":{"0":{"0":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"312":{"tf":1.0},"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"<":{"1":{"0":{"0":{"df":11,"docs":{"10":{"tf":2.449489742783178},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"296":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},">":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"296":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"133":{"tf":1.0},"197":{"tf":1.0},"243":{"tf":1.4142135623730951},"296":{"tf":1.0}}},"4":{"0":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"293":{"tf":1.0}}},"df":1,"docs":{"197":{"tf":1.0}}},"3":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":1.0}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"126":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":24,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"124":{"tf":1.4142135623730951},"126":{"tf":2.0},"139":{"tf":1.0},"171":{"tf":1.7320508075688772},"18":{"tf":1.0},"181":{"tf":1.4142135623730951},"187":{"tf":1.0},"197":{"tf":1.7320508075688772},"223":{"tf":1.0},"241":{"tf":1.0},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"304":{"tf":2.0},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"33":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"296":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"3":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":46,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":3.3166247903554},"132":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":2.23606797749979},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"163":{"tf":1.7320508075688772},"172":{"tf":1.0},"176":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"187":{"tf":1.0},"193":{"tf":3.7416573867739413},"195":{"tf":1.0},"196":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"253":{"tf":1.0},"258":{"tf":2.0},"265":{"tf":1.0},"268":{"tf":2.6457513110645907},"269":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":2.0},"312":{"tf":2.8284271247461903},"41":{"tf":2.449489742783178},"43":{"tf":2.0},"48":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"191":{"tf":1.4142135623730951},"243":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"216":{"tf":1.0},"243":{"tf":1.0},"46":{"tf":1.0}}}}}},"u":{"b":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"25":{"tf":1.0}}},"df":5,"docs":{"233":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"29":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"308":{"tf":1.0}}}},"t":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"182":{"tf":1.0},"312":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"280":{"tf":1.0},"284":{"tf":1.0}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"h":{"df":19,"docs":{"10":{"tf":1.0},"136":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.4142135623730951},"151":{"tf":1.0},"19":{"tf":1.4142135623730951},"197":{"tf":1.7320508075688772},"21":{"tf":1.0},"213":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"27":{"tf":1.0},"299":{"tf":1.0},"316":{"tf":1.4142135623730951},"321":{"tf":1.0},"40":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}},"i":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"m":{"df":8,"docs":{"141":{"tf":1.0},"166":{"tf":2.0},"167":{"tf":2.0},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"243":{"tf":1.7320508075688772},"299":{"tf":1.0},"309":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"292":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":28,"docs":{"160":{"tf":1.0},"22":{"tf":1.0},"226":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.7320508075688772},"246":{"tf":1.0},"249":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.0},"260":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"265":{"tf":1.0},"268":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951},"279":{"tf":2.0},"287":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":3.4641016151377544},"316":{"tf":2.23606797749979},"318":{"tf":1.0},"50":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"19":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"182":{"tf":1.0},"183":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{},"x":{"df":49,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951},"308":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":23,"docs":{"113":{"tf":1.0},"186":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"57":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}},"l":{"df":3,"docs":{"146":{"tf":1.0},"182":{"tf":1.0},"287":{"tf":1.0}}}},"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":5,"docs":{"210":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.0},"62":{"tf":2.0},"63":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":16,"docs":{"108":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":2.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"284":{"tf":1.0},"312":{"tf":1.4142135623730951},"322":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"250":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"w":{"df":3,"docs":{"176":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0}}}},"df":13,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"132":{"tf":1.0},"192":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"243":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"210":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"16":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"249":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"n":{"df":4,"docs":{"159":{"tf":1.7320508075688772},"17":{"tf":1.0},"279":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":5,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"275":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"26":{"tf":1.0},"45":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"33":{"tf":1.0}},"e":{"c":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}},"df":1,"docs":{"222":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":23,"docs":{"13":{"tf":2.23606797749979},"19":{"tf":2.0},"20":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"222":{"tf":3.7416573867739413},"223":{"tf":1.4142135623730951},"230":{"tf":2.23606797749979},"233":{"tf":2.23606797749979},"241":{"tf":1.0},"26":{"tf":1.4142135623730951},"275":{"tf":1.0},"281":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":3.1622776601683795},"44":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.6457513110645907},"61":{"tf":1.0},"62":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":11,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"5":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"216":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"146":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}}}},"y":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":8,"docs":{"115":{"tf":1.0},"130":{"tf":1.0},"240":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"69":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"280":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"200":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"132":{"tf":1.0},"141":{"tf":1.0},"24":{"tf":1.0},"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"w":{"df":1,"docs":{"296":{"tf":1.0}},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"u":{"df":4,"docs":{"240":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"e":{"df":22,"docs":{"1":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"139":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":2.449489742783178},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"1":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"205":{"tf":2.0},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":12,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.7320508075688772},"122":{"tf":1.4142135623730951},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"19":{"tf":1.0},"305":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"212":{"tf":1.0},"249":{"tf":1.0},"38":{"tf":1.0},"50":{"tf":1.4142135623730951}}}},"p":{"df":2,"docs":{"130":{"tf":1.0},"141":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"182":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"160":{"tf":1.0},"206":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"132":{"tf":1.0}}},"df":9,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":3.872983346207417},"233":{"tf":2.0},"237":{"tf":2.0},"240":{"tf":3.1622776601683795},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.4142135623730951},"16":{"tf":2.23606797749979},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"249":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.7320508075688772},"255":{"tf":1.0},"258":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"330":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"308":{"tf":1.0},"313":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951}}}},"i":{"df":5,"docs":{"10":{"tf":1.4142135623730951},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"9":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"266":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":26,"docs":{"106":{"tf":1.0},"112":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":2.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.4142135623730951},"240":{"tf":2.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"272":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":25,"docs":{"102":{"tf":1.0},"113":{"tf":1.4142135623730951},"131":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":4.69041575982343},"175":{"tf":1.0},"178":{"tf":1.0},"187":{"tf":1.0},"191":{"tf":4.0},"195":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"296":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.7320508075688772},"97":{"tf":1.0}},"e":{"'":{"df":1,"docs":{"191":{"tf":1.0}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"160":{"tf":1.7320508075688772}}}}}}}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"191":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"240":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":18,"docs":{"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"224":{"tf":1.0},"235":{"tf":1.0},"35":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}}}}},"o":{"'":{"df":1,"docs":{"190":{"tf":1.0}}},"df":10,"docs":{"117":{"tf":1.0},"130":{"tf":1.4142135623730951},"247":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.0}}}},"x":{".":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":3,"docs":{"19":{"tf":1.0},"231":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}}},"df":88,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"113":{"tf":3.7416573867739413},"119":{"tf":1.0},"127":{"tf":2.23606797749979},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":3.0},"133":{"tf":2.0},"134":{"tf":3.4641016151377544},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"159":{"tf":1.4142135623730951},"16":{"tf":1.0},"160":{"tf":1.0},"164":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":2.23606797749979},"177":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":1.0},"184":{"tf":1.0},"186":{"tf":1.7320508075688772},"187":{"tf":3.7416573867739413},"188":{"tf":2.6457513110645907},"189":{"tf":3.1622776601683795},"190":{"tf":3.0},"191":{"tf":5.0990195135927845},"192":{"tf":2.8284271247461903},"193":{"tf":3.4641016151377544},"194":{"tf":2.6457513110645907},"195":{"tf":2.449489742783178},"196":{"tf":3.4641016151377544},"197":{"tf":3.0},"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":2.23606797749979},"231":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.7320508075688772},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":2.449489742783178},"244":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":2.23606797749979},"281":{"tf":1.0},"283":{"tf":2.449489742783178},"287":{"tf":2.449489742783178},"290":{"tf":1.0},"292":{"tf":2.23606797749979},"293":{"tf":1.7320508075688772},"296":{"tf":2.0},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"c":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"+":{"0":{"0":{"3":{"0":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"127":{"tf":1.0}}}},"7":{"8":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"2":{"8":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"5":{"5":{"3":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"115":{"tf":1.0},"190":{"tf":1.0},"243":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},",":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":2,"docs":{"101":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"[":{"1":{"0":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"3":{"df":3,"docs":{"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":92,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"127":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":4.47213595499958},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":2.23606797749979},"175":{"tf":1.4142135623730951},"177":{"tf":2.0},"178":{"tf":2.6457513110645907},"179":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"193":{"tf":1.7320508075688772},"196":{"tf":2.23606797749979},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":3.0},"243":{"tf":2.8284271247461903},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"258":{"tf":3.7416573867739413},"262":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":3.0},"269":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":2.449489742783178},"283":{"tf":2.23606797749979},"287":{"tf":1.0},"288":{"tf":2.0},"292":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":2.0},"304":{"tf":4.69041575982343},"308":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"312":{"tf":4.69041575982343},"313":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":3.0},"70":{"tf":2.0},"72":{"tf":2.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":2.449489742783178},"92":{"tf":1.7320508075688772},"95":{"tf":2.0},"96":{"tf":2.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"180":{"tf":1.0},"190":{"tf":1.0},"240":{"tf":2.0},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"275":{"tf":2.449489742783178}}},"df":0,"docs":{}},"8":{"(":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"0":{"0":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":3,"docs":{"230":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"[":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"292":{"tf":1.4142135623730951}}}},"df":19,"docs":{"115":{"tf":1.0},"134":{"tf":1.0},"162":{"tf":1.7320508075688772},"163":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"237":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"243":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"283":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":3.872983346207417},"309":{"tf":2.6457513110645907},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"279":{"tf":1.0}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"185":{"tf":2.6457513110645907},"250":{"tf":1.0},"287":{"tf":1.0}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":2,"docs":{"171":{"tf":1.0},"30":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"237":{"tf":1.0}},"n":{"df":2,"docs":{"296":{"tf":1.0},"304":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":2.0},"249":{"tf":1.0},"271":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"310":{"tf":1.0}},"v":{"3":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":13,"docs":{"164":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.4142135623730951},"187":{"tf":1.0},"191":{"tf":2.449489742783178},"196":{"tf":1.0},"198":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"271":{"tf":1.0},"302":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0}}},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"269":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"326":{"tf":1.0}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"222":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":2.8284271247461903},"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"190":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.7320508075688772},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"327":{"tf":1.0},"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"160":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"326":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"153":{"tf":1.0},"211":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":2.23606797749979},"66":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":9,"docs":{"13":{"tf":1.0},"217":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0},"312":{"tf":1.0},"41":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"139":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"237":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"316":{"tf":1.0}}}},"df":133,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"130":{"tf":2.449489742783178},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"136":{"tf":1.0},"139":{"tf":1.0},"14":{"tf":1.7320508075688772},"140":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"15":{"tf":1.7320508075688772},"152":{"tf":1.7320508075688772},"153":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.7320508075688772},"165":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"191":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"200":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"22":{"tf":1.0},"222":{"tf":1.7320508075688772},"223":{"tf":1.0},"23":{"tf":1.0},"230":{"tf":2.449489742783178},"231":{"tf":1.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.4142135623730951},"24":{"tf":1.0},"240":{"tf":2.449489742783178},"241":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"256":{"tf":1.0},"258":{"tf":2.449489742783178},"26":{"tf":2.23606797749979},"265":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":2.23606797749979},"28":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"29":{"tf":1.7320508075688772},"292":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"312":{"tf":2.0},"313":{"tf":1.0},"315":{"tf":1.0},"32":{"tf":2.23606797749979},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.0},"40":{"tf":3.7416573867739413},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.7320508075688772},"44":{"tf":1.7320508075688772},"45":{"tf":2.449489742783178},"46":{"tf":2.449489742783178},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":2.23606797749979},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.23606797749979},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"84":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":17,"docs":{"1":{"tf":1.0},"187":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":2.0},"44":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"/":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"d":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"197":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"277":{"tf":1.7320508075688772},"314":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"32":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"0":{".":{"8":{".":{"0":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"212":{"tf":2.23606797749979}}},"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.0}}}}}},"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"v":{"df":3,"docs":{"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"1":{"df":4,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0}}},"2":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"288":{"tf":1.0}}},"3":{"df":1,"docs":{"160":{"tf":1.0}}},"4":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"160":{"tf":1.0}}},"6":{"df":1,"docs":{"160":{"tf":1.0}}},"7":{"df":1,"docs":{"160":{"tf":1.0}}},"8":{")":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"313":{"tf":1.0}}},"2":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"165":{"tf":1.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":2.0},"255":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}},"i":{"d":{"df":7,"docs":{"197":{"tf":1.0},"237":{"tf":1.0},"289":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"43":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":67,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":3.3166247903554},"146":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":2.0},"179":{"tf":1.0},"181":{"tf":1.0},"187":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"192":{"tf":1.0},"196":{"tf":2.449489742783178},"197":{"tf":2.0},"200":{"tf":1.7320508075688772},"201":{"tf":2.0},"203":{"tf":2.449489742783178},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"230":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":3.4641016151377544},"265":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":2.23606797749979},"313":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":2.6457513110645907}},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"299":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}}}}}},"[":{"5":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":22,"docs":{"130":{"tf":1.4142135623730951},"137":{"tf":2.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.0},"309":{"tf":1.0},"40":{"tf":3.7416573867739413},"41":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}},"e":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"297":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":4,"docs":{"127":{"tf":1.0},"191":{"tf":1.0},"289":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":7,"docs":{"196":{"tf":1.0},"230":{"tf":1.0},"25":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.7320508075688772},"109":{"tf":1.4142135623730951},"110":{"tf":1.0}}}}}},"df":1,"docs":{"27":{"tf":1.0}},"r":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"164":{"tf":1.0},"219":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0}},"f":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":4,"docs":{"219":{"tf":2.6457513110645907},"296":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"=":{"0":{".":{"2":{"3":{".":{"0":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"119":{"tf":1.0},"136":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"19":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"237":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"312":{"tf":1.0},"315":{"tf":1.0},"330":{"tf":1.0},"59":{"tf":1.7320508075688772},"60":{"tf":1.4142135623730951},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}}}}}}}},"i":{"a":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.0},"191":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"316":{"tf":1.0},"323":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"119":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0},"44":{"tf":1.4142135623730951},"64":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":2.6457513110645907},"135":{"tf":1.4142135623730951},"138":{"tf":1.0},"160":{"tf":1.0},"193":{"tf":1.0},"241":{"tf":1.0},"265":{"tf":1.0},"308":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"27":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":4,"docs":{"215":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":1.0},"50":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"42":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.0},"35":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"240":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"46":{"tf":1.0}},"n":{"df":6,"docs":{"113":{"tf":1.0},"171":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"241":{"tf":1.0},"269":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":15,"docs":{"152":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"209":{"tf":1.4142135623730951},"219":{"tf":1.0},"250":{"tf":1.0},"268":{"tf":1.4142135623730951},"276":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"8":{"tf":1.0}}}},"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"276":{"tf":1.0}}}},"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"19":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"i":{"df":6,"docs":{"149":{"tf":1.0},"255":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"21":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"126":{"tf":1.0},"138":{"tf":1.0},"20":{"tf":1.0},"240":{"tf":1.0},"327":{"tf":1.0},"41":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":3,"docs":{"145":{"tf":1.0},"177":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":1,"docs":{"159":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"106":{"tf":1.0},"143":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"167":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"197":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"(":{"_":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.4142135623730951}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.0}}}}}},"p":{"df":95,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0}}},"t":{"df":1,"docs":{"313":{"tf":1.0}},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"48":{"tf":1.0}}}}}},"df":3,"docs":{"37":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"141":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"18":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.7320508075688772},"292":{"tf":1.0},"305":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.0},"23":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"302":{"tf":1.0},"313":{"tf":2.0},"321":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"272":{"tf":1.0},"296":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":2,"docs":{"197":{"tf":1.0},"250":{"tf":1.0}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"113":{"tf":1.0},"152":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":2.0},"230":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":2,"docs":{"26":{"tf":1.0},"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"53":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":18,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.0},"12":{"tf":1.0},"141":{"tf":1.4142135623730951},"146":{"tf":2.8284271247461903},"152":{"tf":1.0},"153":{"tf":1.0},"156":{"tf":1.4142135623730951},"16":{"tf":1.0},"177":{"tf":1.0},"227":{"tf":1.0},"233":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"7":{"tf":2.23606797749979},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"r":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"107":{"tf":3.4641016151377544},"230":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"135":{"tf":1.0},"164":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.0},"192":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.4142135623730951},"30":{"tf":1.0},"326":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"255":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"16":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"146":{"tf":1.0}}}}},"x":{"1":{"df":3,"docs":{"178":{"tf":1.0},"240":{"tf":1.0},"95":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"8":{"6":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"100":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"115":{"tf":2.8284271247461903},"131":{"tf":1.0},"141":{"tf":2.23606797749979},"178":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":2.23606797749979},"244":{"tf":1.0},"25":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":2.0},"6":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}}}}},"y":{"1":{"df":4,"docs":{"240":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":1,"docs":{"250":{"tf":1.0}}}},"df":17,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"141":{"tf":2.449489742783178},"178":{"tf":1.4142135623730951},"185":{"tf":1.0},"240":{"tf":2.23606797749979},"243":{"tf":2.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"265":{"tf":1.7320508075688772},"275":{"tf":2.23606797749979},"296":{"tf":1.4142135623730951},"312":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"119":{"tf":1.0},"141":{"tf":1.0},"185":{"tf":1.7320508075688772},"293":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"u":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"v":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"l":{"'":{"df":2,"docs":{"247":{"tf":1.0},"271":{"tf":1.0}}},"c":{"df":1,"docs":{"294":{"tf":1.0}}},"df":12,"docs":{"1":{"tf":1.0},"223":{"tf":1.0},"250":{"tf":1.4142135623730951},"271":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.7320508075688772},"288":{"tf":1.0},"309":{"tf":1.4142135623730951},"310":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.7320508075688772},"57":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}}}}}},"z":{"df":4,"docs":{"115":{"tf":1.0},"120":{"tf":2.449489742783178},"185":{"tf":1.0},"296":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":9,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"191":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"title":{"root":{"0":{".":{"1":{".":{"0":{"df":1,"docs":{"315":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"236":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"229":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.0},"267":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"2":{"df":4,"docs":{"236":{"tf":1.0},"257":{"tf":1.0},"274":{"tf":1.0},"311":{"tf":1.0}}},"3":{"df":3,"docs":{"218":{"tf":1.0},"257":{"tf":1.0},"307":{"tf":1.0}}},"4":{"df":3,"docs":{"232":{"tf":1.0},"254":{"tf":1.4142135623730951},"303":{"tf":1.0}}},"5":{"df":6,"docs":{"232":{"tf":1.0},"239":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.4142135623730951},"298":{"tf":1.0}}},"6":{"df":3,"docs":{"229":{"tf":1.0},"242":{"tf":1.0},"295":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"291":{"tf":1.0}}},"8":{"df":2,"docs":{"225":{"tf":1.0},"286":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":4,"docs":{"221":{"tf":1.0},"225":{"tf":1.0},"278":{"tf":1.0},"295":{"tf":1.0}}},"1":{"df":1,"docs":{"218":{"tf":1.0}}},"2":{"df":3,"docs":{"239":{"tf":1.0},"270":{"tf":1.4142135623730951},"274":{"tf":1.0}}},"df":2,"docs":{"210":{"tf":1.0},"326":{"tf":1.0}}},"2":{"0":{"2":{"1":{"df":12,"docs":{"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"2":{"df":8,"docs":{"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951}}},"3":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"236":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"315":{"tf":1.0}}},"4":{"df":1,"docs":{"307":{"tf":1.0}}},"6":{"df":2,"docs":{"221":{"tf":1.0},"248":{"tf":1.0}}},"7":{"df":4,"docs":{"245":{"tf":1.0},"291":{"tf":1.0},"298":{"tf":1.0},"311":{"tf":1.0}}},"8":{"df":2,"docs":{"236":{"tf":1.0},"303":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"df":2,"docs":{"211":{"tf":1.0},"327":{"tf":1.0}}},"3":{"1":{"df":4,"docs":{"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"278":{"tf":1.0},"286":{"tf":1.0}}},"df":2,"docs":{"212":{"tf":1.0},"328":{"tf":1.0}}},"4":{"df":2,"docs":{"213":{"tf":1.0},"329":{"tf":1.0}}},"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"146":{"tf":1.0}}}},"d":{"d":{"df":3,"docs":{"10":{"tf":1.0},"25":{"tf":1.0},"9":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"195":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"134":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"h":{"a":{"df":21,"docs":{"236":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"192":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"171":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":3,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"265":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"178":{"tf":1.0},"330":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}}},"b":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"151":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"125":{"tf":1.0},"184":{"tf":1.0},"188":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"168":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"263":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"256":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"df":3,"docs":{"26":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":13,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"128":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"213":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"203":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0}}}}},"df":1,"docs":{"159":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"142":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"169":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":12,"docs":{"11":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"189":{"tf":1.0},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"47":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"208":{"tf":1.0},"209":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":14,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"326":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"8":{"tf":1.0}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"200":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":6,"docs":{"11":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"14":{"tf":1.0},"212":{"tf":1.0},"56":{"tf":1.0}}}}}}}},"o":{"c":{"df":3,"docs":{"211":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"220":{"tf":1.0},"224":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"99":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"322":{"tf":1.0},"324":{"tf":1.0},"325":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"133":{"tf":1.0},"194":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":13,"docs":{"103":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"124":{"tf":1.0},"147":{"tf":1.0},"154":{"tf":1.0},"47":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":12,"docs":{"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":27,"docs":{"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":24,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"113":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"3":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"48":{"tf":1.0},"6":{"tf":1.0},"67":{"tf":1.0},"7":{"tf":1.0}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"x":{"df":4,"docs":{"210":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":14,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"199":{"tf":1.0},"205":{"tf":1.0},"44":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"262":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"d":{"df":1,"docs":{"21":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"325":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":2,"docs":{"264":{"tf":1.0},"265":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":9,"docs":{"211":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"177":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"127":{"tf":1.0}}},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":2,"docs":{"210":{"tf":1.0},"215":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"129":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"200":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"67":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"49":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"181":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"260":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"196":{"tf":1.0},"204":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"207":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"264":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"89":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"145":{"tf":1.0},"153":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"15":{"tf":1.0},"19":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"217":{"tf":1.0},"60":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"190":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":9,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"109":{"tf":1.0},"70":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"227":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"136":{"tf":1.0},"158":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"214":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"216":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"62":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"10":{"tf":1.0},"155":{"tf":1.0},"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"217":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"210":{"tf":1.0},"215":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"216":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"119":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.0},"164":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"81":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"163":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}}},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"152":{"tf":1.0}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":9,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"18":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"65":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"203":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"3":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"201":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"321":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"4":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"137":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"155":{"tf":1.0},"156":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"126":{"tf":1.0},"197":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"131":{"tf":1.0},"140":{"tf":1.0},"176":{"tf":1.0},"193":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"27":{"tf":1.0}}}}}}}},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"186":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.0},"33":{"tf":1.0},"57":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"121":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"50":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":17,"docs":{"134":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"207":{"tf":1.0},"264":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"185":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"198":{"tf":1.0}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"64":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":2,"docs":{"48":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"203":{"tf":1.0},"265":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"137":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"59":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"44":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"327":{"tf":1.0}}}},"y":{"df":1,"docs":{"209":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"156":{"tf":1.0},"39":{"tf":1.0},"7":{"tf":1.0}}}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.0}}}}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}); \ No newline at end of file diff --git a/docs/searchindex.json b/docs/searchindex.json new file mode 100644 index 0000000000..742ee1e4ed --- /dev/null +++ b/docs/searchindex.json @@ -0,0 +1 @@ +{"doc_urls":["index.html#what-is-fe","index.html#why-fe","index.html#who-is-fe-for","index.html#what-problems-does-fe-solve","index.html#get-started","quickstart/index.html#quickstart","quickstart/index.html#download-and-install-fe","quickstart/first_contract.html#write-your-first-fe-contract","quickstart/first_contract.html#create-a-guest_bookfe-file","quickstart/first_contract.html#add-a-method-to-sign-the-guest-book","quickstart/first_contract.html#add-a-method-to-read-a-message","quickstart/deploy_contract.html#deploy-your-contract","quickstart/deploy_contract.html#prerequisites","quickstart/deploy_contract.html#introduction","quickstart/deploy_contract.html#your-developer-environment","quickstart/deploy_contract.html#deploying-to-a-local-network","quickstart/deploy_contract.html#making-the-deployment-transaction","quickstart/deploy_contract.html#signing-the-guest-book","quickstart/deploy_contract.html#reading-the-signatures","quickstart/deploy_contract.html#deploying-to-a-public-test-network","quickstart/deploy_contract.html#summary","user-guide/index.html#user-guide","user-guide/installation.html#installation","user-guide/installation.html#package-managers","user-guide/installation.html#download-the-compiler","user-guide/installation.html#add-permission-to-execute","user-guide/installation.html#building-from-source","user-guide/installation.html#editor-support--syntax-highlighting","user-guide/projects.html#fe-projects","user-guide/projects.html#creating-a-project","user-guide/projects.html#manifest","user-guide/projects.html#project-modes","user-guide/projects.html#importing","user-guide/projects.html#tests","user-guide/projects.html#running-your-project","user-guide/tutorials/index.html#tutorials","user-guide/tutorials/auction.html#auction-contract","user-guide/tutorials/auction.html#the-auction-rules","user-guide/tutorials/auction.html#get-started","user-guide/tutorials/auction.html#writing-the-contract","user-guide/tutorials/auction.html#defining-the-contract-and-initializing-variables","user-guide/tutorials/auction.html#bidding","user-guide/tutorials/auction.html#withdrawing","user-guide/tutorials/auction.html#end-the-auction","user-guide/tutorials/auction.html#view-functions","user-guide/tutorials/auction.html#build-and-deploy-the-contract","user-guide/tutorials/auction.html#summary","user-guide/example_contracts/index.html#example-contracts","user-guide/example_contracts/auction_contract.html","user-guide/external_links.html#useful-external-links","user-guide/external_links.html#tools","user-guide/external_links.html#projects","user-guide/external_links.html#hackathon-projects","user-guide/external_links.html#others","user-guide/external_links.html#blog-posts","user-guide/external_links.html#videos","development/index.html#development","development/build.html#build-and-test","development/release.html#release","development/release.html#versioning","development/release.html#generate-release-notes","development/release.html#generate-the-release","development/release.html#tag-and-push-the-release","development/release.html#manually-edit-the-release-on-github","development/release.html#updating-docs--website","development/release.html#preview-the-sites-locally","development/release.html#deploy-website--docs","std/index.html#fe-standard-library","std/precompiles.html#precompiles","std/precompiles.html#ec_recover","std/precompiles.html#parameters","std/precompiles.html#returns","std/precompiles.html#function-signature","std/precompiles.html#example","std/precompiles.html#sha2_256","std/precompiles.html#parameters-1","std/precompiles.html#returns-1","std/precompiles.html#function-signature-1","std/precompiles.html#example-1","std/precompiles.html#ripemd_160","std/precompiles.html#parameters-2","std/precompiles.html#returns-2","std/precompiles.html#function-signature-2","std/precompiles.html#example-2","std/precompiles.html#identity","std/precompiles.html#parameters-3","std/precompiles.html#returns-3","std/precompiles.html#function-signature-3","std/precompiles.html#example-3","std/precompiles.html#mod_exp","std/precompiles.html#parameters-4","std/precompiles.html#returns-4","std/precompiles.html#function-signature-4","std/precompiles.html#example-4","std/precompiles.html#ec_add","std/precompiles.html#parameters-5","std/precompiles.html#function-signature-5","std/precompiles.html#returns-5","std/precompiles.html#example-5","std/precompiles.html#ec_mul","std/precompiles.html#parameters-6","std/precompiles.html#function-signature-6","std/precompiles.html#returns-6","std/precompiles.html#example-6","std/precompiles.html#ec_pairing","std/precompiles.html#parameters-7","std/precompiles.html#returns-7","std/precompiles.html#example-7","std/precompiles.html#blake_2f","std/precompiles.html#parameters-8","std/precompiles.html#returns-8","std/precompiles.html#function-signature-7","std/precompiles.html#example-8","spec/index.html#fe-language-specification","spec/notation.html#notation","spec/notation.html#grammar","spec/lexical_structure/index.html#lexical-structure","spec/lexical_structure/keywords.html#keywords","spec/lexical_structure/keywords.html#strict-keywords","spec/lexical_structure/keywords.html#reserved-keywords","spec/lexical_structure/identifiers.html#identifiers","spec/lexical_structure/tokens.html#tokens","spec/lexical_structure/tokens.html#newline","spec/lexical_structure/tokens.html#literals","spec/lexical_structure/tokens.html#examples","spec/lexical_structure/tokens.html#boolean-literals","spec/lexical_structure/tokens.html#string-literals","spec/lexical_structure/tokens.html#integer-literals","spec/comments.html#comments","spec/items/index.html#items","spec/items/visibility_and_privacy.html#visibility-and-privacy","spec/items/structs.html#structs","spec/items/traits.html#traits","spec/items/enums.html#enum","spec/items/type_aliases.html#type-aliases","spec/items/contracts.html#contracts","spec/items/contracts.html#pragma","spec/items/contracts.html#state-variables","spec/items/contracts.html#contract-functions","spec/items/contracts.html#the-__init__-function","spec/items/contracts.html#structs","spec/items/functions/index.html#functions","spec/items/functions/context.html#context","spec/items/functions/context.html#rationale","spec/items/functions/context.html#the-context-object","spec/items/functions/context.html#context-mutability","spec/items/functions/context.html#abi-conformity","spec/items/functions/context.html#examples","spec/items/functions/context.html#msg_sender-and-msg_value","spec/items/functions/context.html#transferring-ether","spec/items/functions/context.html#createcreate2","spec/items/functions/context.html#block-number","spec/items/functions/self.html#self","spec/items/functions/self.html#mutability","spec/items/functions/self.html#examples","spec/items/functions/self.html#reading-contract-storage","spec/items/functions/self.html#writing-contract-storage","spec/statements/index.html#statements","spec/statements/pragma.html#pragma-statement","spec/statements/const.html#const-statement","spec/statements/let.html#let-statement","spec/statements/assign.html#assignment-statement","spec/statements/augassign.html#augmenting-assignment-statement","spec/statements/revert.html#revert-statement","spec/statements/return.html#return-statement","spec/statements/if.html#if-statement","spec/statements/for.html#for-statement","spec/statements/while.html#while-statement","spec/statements/break.html#break-statement","spec/statements/continue.html#continue-statement","spec/statements/match.html#match-statement","spec/statements/assert.html#assert-statement","spec/expressions/index.html#expressions","spec/expressions/call.html#call-expressions","spec/expressions/tuple.html#tuple-expressions","spec/expressions/list.html#list-expressions","spec/expressions/struct.html#struct-expressions","spec/expressions/indexing.html#index-expressions","spec/expressions/attribute.html#attribute-expressions","spec/expressions/name.html#name-expressions","spec/expressions/path.html#path-expressions","spec/expressions/literal.html#literal-expressions","spec/expressions/arithmetic_operators.html#arithmetic-operators","spec/expressions/comparison_operators.html#comparison-operators","spec/expressions/boolean_operators.html#boolean-operators","spec/expressions/unary_operators.html#unary-operators","spec/type_system/index.html#type-system","spec/type_system/types/index.html#types","spec/type_system/types/boolean.html#boolean-type","spec/type_system/types/contract.html#contract-types","spec/type_system/types/numeric.html#numeric-types","spec/type_system/types/tuple.html#tuple-types","spec/type_system/types/array.html#array-types","spec/type_system/types/struct.html#struct-types","spec/type_system/types/enum.html#enum-types","spec/type_system/types/address.html#address-type","spec/type_system/types/map.html#map-type","spec/type_system/types/string.html#string-type","spec/type_system/types/unit.html#unit-type","spec/type_system/types/function.html#function-types","spec/data_layout/index.html#data-layout","spec/data_layout/stack.html#stack","spec/data_layout/storage/index.html#storage","spec/data_layout/storage/constant_size_values_in_storage.html#constant-size-values-in-storage","spec/data_layout/storage/maps_in_storage.html#maps-in-storage","spec/data_layout/storage/to_mem_function.html#the-to_mem-function","spec/data_layout/memory/index.html#memory","spec/data_layout/memory/sequence_types_in_memory.html#sequence-types-in-memory","contributing.html#contributing","contributing.html#ways-to-contribute","contributing.html#1-reporting-or-fixing-issues","contributing.html#2-improving-the-docs","contributing.html#3-developing-fe","contributing.html#4-community-engagement","contributing.html#processes","contributing.html#reporting-issues","contributing.html#rasing-pull-requests","release_notes.html#release-notes","release_notes.html#0260-zircon-2023-11-03","release_notes.html#features","release_notes.html#improved-documentation","release_notes.html#0250-yoshiokaite-2023-10-26","release_notes.html#features-1","release_notes.html#bugfixes","release_notes.html#improved-documentation-1","release_notes.html#0240-xenotime-2023-08-10","release_notes.html#features-2","release_notes.html#performance-improvements","release_notes.html#improved-documentation-2","release_notes.html#0230-wiluite-2023-06-01","release_notes.html#features-3","release_notes.html#bugfixes-1","release_notes.html#0220-vulcanite-2023-04-05","release_notes.html#features-4","release_notes.html#bugfixes-2","release_notes.html#improved-documentation-3","release_notes.html#0210-alpha-2023-02-28","release_notes.html#features-5","release_notes.html#bugfixes-3","release_notes.html#0200-alpha-2022-12-05","release_notes.html#features-6","release_notes.html#bugfixes-4","release_notes.html#0191-alpha-sunstone-2022-07-06","release_notes.html#features-7","release_notes.html#bugfixes-5","release_notes.html#0180-alpha-ruby-2022-05-27","release_notes.html#features-8","release_notes.html#bugfixes-6","release_notes.html#0170-alpha-quartz-2022-05-26","release_notes.html#features-9","release_notes.html#bugfixes-7","release_notes.html#0160-alpha-2022-05-05","release_notes.html#features-10","release_notes.html#bugfixes-8","release_notes.html#0150-alpha-2022-04-04","release_notes.html#features-11","release_notes.html#bugfixes-9","release_notes.html#0140-alpha-2022-03-02","release_notes.html#features-12","release_notes.html#features-13","release_notes.html#support-local-constant","release_notes.html#support-constant-expression","release_notes.html#support-constant-generics-expression","release_notes.html#bug-fixes","release_notes.html#fix-ice-when-constant-type-is-mismatch","release_notes.html#fix-ice-when-assigning-value-to-constant-twice","release_notes.html#internal-changes---for-fe-contributors","release_notes.html#0130-alpha-2022-01-31-0130-alpha-2022-01-31","release_notes.html#features-14","release_notes.html#bugfixes-10","release_notes.html#0120-alpha-2021-12-31-0120-alpha-2021-12-31","release_notes.html#features-15","release_notes.html#bugfixes-11","release_notes.html#internal-changes---for-fe-contributors-1","release_notes.html#0110-alpha-karlite-2021-12-02","release_notes.html#features-16","release_notes.html#bugfixes-12","release_notes.html#internal-changes---for-fe-contributors-2","release_notes.html#0100-alpha-2021-10-31","release_notes.html#features-17","release_notes.html#bugfixes-13","release_notes.html#internal-changes---for-fe-contributors-3","release_notes.html#090-alpha-2021-09-29","release_notes.html#features-18","release_notes.html#bugfixes-14","release_notes.html#internal-changes---for-fe-contributors-4","release_notes.html#080-alpha-haxonite-2021-08-31","release_notes.html#features-19","release_notes.html#bugfixes-15","release_notes.html#improved-documentation-4","release_notes.html#internal-changes---for-fe-contributors-5","release_notes.html#070-alpha-galaxite-2021-07-27","release_notes.html#features-20","release_notes.html#bugfixes-16","release_notes.html#internal-changes---for-fe-contributors-6","release_notes.html#060-alpha-feldspar-2021-06-10","release_notes.html#features-21","release_notes.html#internal-changes---for-fe-contributors-7","release_notes.html#050-alpha-2021-05-27","release_notes.html#features-22","release_notes.html#bugfixes-17","release_notes.html#improved-documentation-5","release_notes.html#internal-changes---for-fe-contributors-8","release_notes.html#040-alpha-2021-04-28","release_notes.html#features-23","release_notes.html#bugfixes-18","release_notes.html#internal-changes---for-fe-contributors-9","release_notes.html#030-alpha-calamine-2021-03-24","release_notes.html#features-24","release_notes.html#bugfixes-19","release_notes.html#internal-changes---for-fe-contributors-10","release_notes.html#020-alpha-borax-2021-02-27","release_notes.html#features-25","release_notes.html#bugfixes-20","release_notes.html#internal-changes---for-fe-contributors-11","release_notes.html#010-alpha-amethyst-2021-01-20","release_notes.html#features-26","release_notes.html#improved-documentation-6","release_notes.html#internal-changes---for-fe-contributors-12","code_of_conduct.html#contributor-covenant-code-of-conduct","code_of_conduct.html#our-pledge","code_of_conduct.html#our-standards","code_of_conduct.html#enforcement-responsibilities","code_of_conduct.html#scope","code_of_conduct.html#enforcement","code_of_conduct.html#enforcement-guidelines","code_of_conduct.html#1-correction","code_of_conduct.html#2-warning","code_of_conduct.html#3-temporary-ban","code_of_conduct.html#4-permanent-ban","code_of_conduct.html#attribution"],"index":{"documentStore":{"docInfo":{"0":{"body":53,"breadcrumbs":2,"title":1},"1":{"body":65,"breadcrumbs":2,"title":1},"10":{"body":131,"breadcrumbs":8,"title":4},"100":{"body":11,"breadcrumbs":4,"title":1},"101":{"body":9,"breadcrumbs":5,"title":2},"102":{"body":6,"breadcrumbs":4,"title":1},"103":{"body":11,"breadcrumbs":4,"title":1},"104":{"body":7,"breadcrumbs":4,"title":1},"105":{"body":12,"breadcrumbs":4,"title":1},"106":{"body":9,"breadcrumbs":4,"title":1},"107":{"body":35,"breadcrumbs":4,"title":1},"108":{"body":34,"breadcrumbs":4,"title":1},"109":{"body":23,"breadcrumbs":4,"title":1},"11":{"body":0,"breadcrumbs":6,"title":2},"110":{"body":7,"breadcrumbs":4,"title":1},"111":{"body":17,"breadcrumbs":5,"title":2},"112":{"body":37,"breadcrumbs":4,"title":1},"113":{"body":113,"breadcrumbs":5,"title":3},"114":{"body":0,"breadcrumbs":4,"title":1},"115":{"body":77,"breadcrumbs":4,"title":1},"116":{"body":3,"breadcrumbs":6,"title":2},"117":{"body":7,"breadcrumbs":6,"title":1},"118":{"body":56,"breadcrumbs":7,"title":2},"119":{"body":62,"breadcrumbs":7,"title":2},"12":{"body":16,"breadcrumbs":5,"title":1},"120":{"body":46,"breadcrumbs":6,"title":1},"121":{"body":0,"breadcrumbs":6,"title":1},"122":{"body":4,"breadcrumbs":6,"title":1},"123":{"body":24,"breadcrumbs":6,"title":1},"124":{"body":49,"breadcrumbs":6,"title":1},"125":{"body":4,"breadcrumbs":7,"title":2},"126":{"body":34,"breadcrumbs":7,"title":2},"127":{"body":118,"breadcrumbs":7,"title":2},"128":{"body":2,"breadcrumbs":4,"title":1},"129":{"body":7,"breadcrumbs":4,"title":1},"13":{"body":102,"breadcrumbs":5,"title":1},"130":{"body":132,"breadcrumbs":7,"title":2},"131":{"body":62,"breadcrumbs":5,"title":1},"132":{"body":102,"breadcrumbs":5,"title":1},"133":{"body":71,"breadcrumbs":5,"title":1},"134":{"body":37,"breadcrumbs":7,"title":2},"135":{"body":132,"breadcrumbs":5,"title":1},"136":{"body":26,"breadcrumbs":5,"title":1},"137":{"body":25,"breadcrumbs":6,"title":2},"138":{"body":61,"breadcrumbs":6,"title":2},"139":{"body":45,"breadcrumbs":6,"title":2},"14":{"body":65,"breadcrumbs":6,"title":2},"140":{"body":27,"breadcrumbs":5,"title":1},"141":{"body":386,"breadcrumbs":5,"title":1},"142":{"body":14,"breadcrumbs":6,"title":1},"143":{"body":119,"breadcrumbs":6,"title":1},"144":{"body":85,"breadcrumbs":7,"title":2},"145":{"body":42,"breadcrumbs":7,"title":2},"146":{"body":174,"breadcrumbs":7,"title":2},"147":{"body":0,"breadcrumbs":6,"title":1},"148":{"body":40,"breadcrumbs":7,"title":2},"149":{"body":23,"breadcrumbs":7,"title":2},"15":{"body":90,"breadcrumbs":7,"title":3},"150":{"body":19,"breadcrumbs":6,"title":1},"151":{"body":17,"breadcrumbs":7,"title":2},"152":{"body":67,"breadcrumbs":6,"title":1},"153":{"body":24,"breadcrumbs":6,"title":1},"154":{"body":0,"breadcrumbs":6,"title":1},"155":{"body":10,"breadcrumbs":8,"title":3},"156":{"body":10,"breadcrumbs":8,"title":3},"157":{"body":25,"breadcrumbs":4,"title":1},"158":{"body":41,"breadcrumbs":7,"title":2},"159":{"body":40,"breadcrumbs":7,"title":2},"16":{"body":169,"breadcrumbs":7,"title":3},"160":{"body":66,"breadcrumbs":5,"title":1},"161":{"body":58,"breadcrumbs":7,"title":2},"162":{"body":73,"breadcrumbs":9,"title":3},"163":{"body":93,"breadcrumbs":7,"title":2},"164":{"body":78,"breadcrumbs":7,"title":2},"165":{"body":25,"breadcrumbs":5,"title":1},"166":{"body":38,"breadcrumbs":5,"title":1},"167":{"body":50,"breadcrumbs":5,"title":1},"168":{"body":85,"breadcrumbs":7,"title":2},"169":{"body":90,"breadcrumbs":7,"title":2},"17":{"body":84,"breadcrumbs":7,"title":3},"170":{"body":77,"breadcrumbs":7,"title":2},"171":{"body":81,"breadcrumbs":7,"title":2},"172":{"body":26,"breadcrumbs":4,"title":1},"173":{"body":87,"breadcrumbs":7,"title":2},"174":{"body":138,"breadcrumbs":7,"title":2},"175":{"body":80,"breadcrumbs":7,"title":2},"176":{"body":1,"breadcrumbs":7,"title":2},"177":{"body":65,"breadcrumbs":7,"title":2},"178":{"body":65,"breadcrumbs":7,"title":2},"179":{"body":21,"breadcrumbs":7,"title":2},"18":{"body":122,"breadcrumbs":6,"title":2},"180":{"body":23,"breadcrumbs":7,"title":2},"181":{"body":28,"breadcrumbs":7,"title":2},"182":{"body":98,"breadcrumbs":7,"title":2},"183":{"body":42,"breadcrumbs":7,"title":2},"184":{"body":24,"breadcrumbs":7,"title":2},"185":{"body":45,"breadcrumbs":7,"title":2},"186":{"body":0,"breadcrumbs":6,"title":2},"187":{"body":60,"breadcrumbs":6,"title":1},"188":{"body":10,"breadcrumbs":9,"title":2},"189":{"body":65,"breadcrumbs":9,"title":2},"19":{"body":213,"breadcrumbs":8,"title":4},"190":{"body":64,"breadcrumbs":9,"title":2},"191":{"body":136,"breadcrumbs":9,"title":2},"192":{"body":59,"breadcrumbs":9,"title":2},"193":{"body":81,"breadcrumbs":9,"title":2},"194":{"body":7,"breadcrumbs":9,"title":2},"195":{"body":27,"breadcrumbs":9,"title":2},"196":{"body":78,"breadcrumbs":9,"title":2},"197":{"body":69,"breadcrumbs":9,"title":2},"198":{"body":1,"breadcrumbs":9,"title":2},"199":{"body":1,"breadcrumbs":9,"title":2},"2":{"body":43,"breadcrumbs":2,"title":1},"20":{"body":49,"breadcrumbs":5,"title":1},"200":{"body":56,"breadcrumbs":6,"title":2},"201":{"body":53,"breadcrumbs":6,"title":1},"202":{"body":4,"breadcrumbs":6,"title":1},"203":{"body":39,"breadcrumbs":13,"title":4},"204":{"body":59,"breadcrumbs":9,"title":2},"205":{"body":14,"breadcrumbs":9,"title":2},"206":{"body":32,"breadcrumbs":6,"title":1},"207":{"body":42,"breadcrumbs":11,"title":3},"208":{"body":2,"breadcrumbs":2,"title":1},"209":{"body":0,"breadcrumbs":3,"title":2},"21":{"body":36,"breadcrumbs":4,"title":2},"210":{"body":20,"breadcrumbs":5,"title":4},"211":{"body":41,"breadcrumbs":4,"title":3},"212":{"body":82,"breadcrumbs":4,"title":3},"213":{"body":25,"breadcrumbs":4,"title":3},"214":{"body":0,"breadcrumbs":2,"title":1},"215":{"body":42,"breadcrumbs":3,"title":2},"216":{"body":55,"breadcrumbs":4,"title":3},"217":{"body":13,"breadcrumbs":4,"title":2},"218":{"body":0,"breadcrumbs":7,"title":5},"219":{"body":141,"breadcrumbs":3,"title":1},"22":{"body":44,"breadcrumbs":4,"title":1},"220":{"body":6,"breadcrumbs":4,"title":2},"221":{"body":0,"breadcrumbs":7,"title":5},"222":{"body":130,"breadcrumbs":3,"title":1},"223":{"body":29,"breadcrumbs":3,"title":1},"224":{"body":6,"breadcrumbs":4,"title":2},"225":{"body":0,"breadcrumbs":7,"title":5},"226":{"body":31,"breadcrumbs":3,"title":1},"227":{"body":18,"breadcrumbs":4,"title":2},"228":{"body":7,"breadcrumbs":4,"title":2},"229":{"body":0,"breadcrumbs":7,"title":5},"23":{"body":24,"breadcrumbs":5,"title":2},"230":{"body":245,"breadcrumbs":3,"title":1},"231":{"body":78,"breadcrumbs":3,"title":1},"232":{"body":9,"breadcrumbs":7,"title":5},"233":{"body":86,"breadcrumbs":3,"title":1},"234":{"body":31,"breadcrumbs":3,"title":1},"235":{"body":8,"breadcrumbs":4,"title":2},"236":{"body":0,"breadcrumbs":7,"title":5},"237":{"body":63,"breadcrumbs":3,"title":1},"238":{"body":4,"breadcrumbs":3,"title":1},"239":{"body":0,"breadcrumbs":7,"title":5},"24":{"body":47,"breadcrumbs":5,"title":2},"240":{"body":522,"breadcrumbs":3,"title":1},"241":{"body":80,"breadcrumbs":3,"title":1},"242":{"body":0,"breadcrumbs":8,"title":6},"243":{"body":375,"breadcrumbs":3,"title":1},"244":{"body":63,"breadcrumbs":3,"title":1},"245":{"body":0,"breadcrumbs":8,"title":6},"246":{"body":10,"breadcrumbs":3,"title":1},"247":{"body":30,"breadcrumbs":3,"title":1},"248":{"body":0,"breadcrumbs":8,"title":6},"249":{"body":66,"breadcrumbs":3,"title":1},"25":{"body":78,"breadcrumbs":6,"title":3},"250":{"body":175,"breadcrumbs":3,"title":1},"251":{"body":0,"breadcrumbs":7,"title":5},"252":{"body":16,"breadcrumbs":3,"title":1},"253":{"body":8,"breadcrumbs":3,"title":1},"254":{"body":0,"breadcrumbs":7,"title":5},"255":{"body":176,"breadcrumbs":3,"title":1},"256":{"body":11,"breadcrumbs":3,"title":1},"257":{"body":0,"breadcrumbs":7,"title":5},"258":{"body":374,"breadcrumbs":3,"title":1},"259":{"body":0,"breadcrumbs":3,"title":1},"26":{"body":104,"breadcrumbs":5,"title":2},"260":{"body":10,"breadcrumbs":5,"title":3},"261":{"body":15,"breadcrumbs":5,"title":3},"262":{"body":24,"breadcrumbs":6,"title":4},"263":{"body":0,"breadcrumbs":4,"title":2},"264":{"body":13,"breadcrumbs":7,"title":5},"265":{"body":67,"breadcrumbs":8,"title":6},"266":{"body":133,"breadcrumbs":6,"title":4},"267":{"body":0,"breadcrumbs":12,"title":10},"268":{"body":141,"breadcrumbs":3,"title":1},"269":{"body":57,"breadcrumbs":3,"title":1},"27":{"body":60,"breadcrumbs":7,"title":4},"270":{"body":0,"breadcrumbs":12,"title":10},"271":{"body":94,"breadcrumbs":3,"title":1},"272":{"body":52,"breadcrumbs":3,"title":1},"273":{"body":27,"breadcrumbs":6,"title":4},"274":{"body":0,"breadcrumbs":8,"title":6},"275":{"body":184,"breadcrumbs":3,"title":1},"276":{"body":31,"breadcrumbs":3,"title":1},"277":{"body":80,"breadcrumbs":6,"title":4},"278":{"body":0,"breadcrumbs":7,"title":5},"279":{"body":213,"breadcrumbs":3,"title":1},"28":{"body":36,"breadcrumbs":6,"title":2},"280":{"body":185,"breadcrumbs":3,"title":1},"281":{"body":72,"breadcrumbs":6,"title":4},"282":{"body":0,"breadcrumbs":7,"title":5},"283":{"body":67,"breadcrumbs":3,"title":1},"284":{"body":41,"breadcrumbs":3,"title":1},"285":{"body":6,"breadcrumbs":6,"title":4},"286":{"body":0,"breadcrumbs":8,"title":6},"287":{"body":102,"breadcrumbs":3,"title":1},"288":{"body":136,"breadcrumbs":3,"title":1},"289":{"body":26,"breadcrumbs":4,"title":2},"29":{"body":27,"breadcrumbs":6,"title":2},"290":{"body":7,"breadcrumbs":6,"title":4},"291":{"body":0,"breadcrumbs":8,"title":6},"292":{"body":170,"breadcrumbs":3,"title":1},"293":{"body":84,"breadcrumbs":3,"title":1},"294":{"body":10,"breadcrumbs":6,"title":4},"295":{"body":0,"breadcrumbs":8,"title":6},"296":{"body":167,"breadcrumbs":3,"title":1},"297":{"body":15,"breadcrumbs":6,"title":4},"298":{"body":0,"breadcrumbs":7,"title":5},"299":{"body":62,"breadcrumbs":3,"title":1},"3":{"body":50,"breadcrumbs":4,"title":3},"30":{"body":61,"breadcrumbs":5,"title":1},"300":{"body":8,"breadcrumbs":3,"title":1},"301":{"body":13,"breadcrumbs":4,"title":2},"302":{"body":54,"breadcrumbs":6,"title":4},"303":{"body":0,"breadcrumbs":7,"title":5},"304":{"body":192,"breadcrumbs":3,"title":1},"305":{"body":53,"breadcrumbs":3,"title":1},"306":{"body":34,"breadcrumbs":6,"title":4},"307":{"body":0,"breadcrumbs":8,"title":6},"308":{"body":135,"breadcrumbs":3,"title":1},"309":{"body":181,"breadcrumbs":3,"title":1},"31":{"body":28,"breadcrumbs":6,"title":2},"310":{"body":23,"breadcrumbs":6,"title":4},"311":{"body":0,"breadcrumbs":8,"title":6},"312":{"body":479,"breadcrumbs":3,"title":1},"313":{"body":108,"breadcrumbs":3,"title":1},"314":{"body":17,"breadcrumbs":6,"title":4},"315":{"body":44,"breadcrumbs":8,"title":6},"316":{"body":146,"breadcrumbs":3,"title":1},"317":{"body":20,"breadcrumbs":4,"title":2},"318":{"body":15,"breadcrumbs":6,"title":4},"319":{"body":0,"breadcrumbs":6,"title":4},"32":{"body":20,"breadcrumbs":5,"title":1},"320":{"body":51,"breadcrumbs":3,"title":1},"321":{"body":75,"breadcrumbs":3,"title":1},"322":{"body":42,"breadcrumbs":4,"title":2},"323":{"body":34,"breadcrumbs":3,"title":1},"324":{"body":25,"breadcrumbs":3,"title":1},"325":{"body":13,"breadcrumbs":4,"title":2},"326":{"body":27,"breadcrumbs":4,"title":2},"327":{"body":42,"breadcrumbs":4,"title":2},"328":{"body":41,"breadcrumbs":5,"title":3},"329":{"body":26,"breadcrumbs":5,"title":3},"33":{"body":70,"breadcrumbs":5,"title":1},"330":{"body":32,"breadcrumbs":3,"title":1},"34":{"body":11,"breadcrumbs":6,"title":2},"35":{"body":20,"breadcrumbs":4,"title":1},"36":{"body":30,"breadcrumbs":7,"title":2},"37":{"body":34,"breadcrumbs":7,"title":2},"38":{"body":43,"breadcrumbs":6,"title":1},"39":{"body":10,"breadcrumbs":7,"title":2},"4":{"body":26,"breadcrumbs":2,"title":1},"40":{"body":446,"breadcrumbs":9,"title":4},"41":{"body":264,"breadcrumbs":6,"title":1},"42":{"body":97,"breadcrumbs":6,"title":1},"43":{"body":118,"breadcrumbs":7,"title":2},"44":{"body":64,"breadcrumbs":7,"title":2},"45":{"body":228,"breadcrumbs":8,"title":3},"46":{"body":68,"breadcrumbs":6,"title":1},"47":{"body":3,"breadcrumbs":6,"title":2},"48":{"body":155,"breadcrumbs":6,"title":2},"49":{"body":13,"breadcrumbs":8,"title":3},"5":{"body":15,"breadcrumbs":2,"title":1},"50":{"body":6,"breadcrumbs":6,"title":1},"51":{"body":17,"breadcrumbs":6,"title":1},"52":{"body":109,"breadcrumbs":7,"title":2},"53":{"body":19,"breadcrumbs":6,"title":1},"54":{"body":5,"breadcrumbs":7,"title":2},"55":{"body":14,"breadcrumbs":6,"title":1},"56":{"body":7,"breadcrumbs":2,"title":1},"57":{"body":74,"breadcrumbs":5,"title":2},"58":{"body":0,"breadcrumbs":3,"title":1},"59":{"body":8,"breadcrumbs":3,"title":1},"6":{"body":37,"breadcrumbs":4,"title":3},"60":{"body":34,"breadcrumbs":5,"title":3},"61":{"body":18,"breadcrumbs":4,"title":2},"62":{"body":18,"breadcrumbs":5,"title":3},"63":{"body":21,"breadcrumbs":6,"title":4},"64":{"body":58,"breadcrumbs":5,"title":3},"65":{"body":19,"breadcrumbs":5,"title":3},"66":{"body":22,"breadcrumbs":5,"title":3},"67":{"body":13,"breadcrumbs":5,"title":3},"68":{"body":66,"breadcrumbs":4,"title":1},"69":{"body":49,"breadcrumbs":4,"title":1},"7":{"body":55,"breadcrumbs":8,"title":4},"70":{"body":23,"breadcrumbs":4,"title":1},"71":{"body":3,"breadcrumbs":4,"title":1},"72":{"body":11,"breadcrumbs":5,"title":2},"73":{"body":11,"breadcrumbs":4,"title":1},"74":{"body":14,"breadcrumbs":4,"title":1},"75":{"body":5,"breadcrumbs":4,"title":1},"76":{"body":4,"breadcrumbs":4,"title":1},"77":{"body":6,"breadcrumbs":5,"title":2},"78":{"body":7,"breadcrumbs":4,"title":1},"79":{"body":13,"breadcrumbs":4,"title":1},"8":{"body":124,"breadcrumbs":7,"title":3},"80":{"body":5,"breadcrumbs":4,"title":1},"81":{"body":4,"breadcrumbs":4,"title":1},"82":{"body":6,"breadcrumbs":5,"title":2},"83":{"body":7,"breadcrumbs":4,"title":1},"84":{"body":11,"breadcrumbs":4,"title":1},"85":{"body":5,"breadcrumbs":4,"title":1},"86":{"body":5,"breadcrumbs":4,"title":1},"87":{"body":6,"breadcrumbs":5,"title":2},"88":{"body":8,"breadcrumbs":4,"title":1},"89":{"body":8,"breadcrumbs":4,"title":1},"9":{"body":117,"breadcrumbs":9,"title":5},"90":{"body":39,"breadcrumbs":4,"title":1},"91":{"body":5,"breadcrumbs":4,"title":1},"92":{"body":16,"breadcrumbs":5,"title":2},"93":{"body":20,"breadcrumbs":4,"title":1},"94":{"body":5,"breadcrumbs":4,"title":1},"95":{"body":20,"breadcrumbs":4,"title":1},"96":{"body":11,"breadcrumbs":5,"title":2},"97":{"body":6,"breadcrumbs":4,"title":1},"98":{"body":12,"breadcrumbs":4,"title":1},"99":{"body":5,"breadcrumbs":4,"title":1}},"docs":{"0":{"body":"Fe is the next generation smart contract language for Ethereum . Fe is a smart contract language that strives to make developing Ethereum smart contract development safer, simpler and more fun . Smart contracts are programs executed by a computer embedded into Ethereum clients known as the Ethereum Virtual Machine (EVM) . The EVM executes bytecode instructions that are not human readable. Therefore, developers use higher-level languages that compiles to EVM bytecode. Fe is one of these languages.","breadcrumbs":"Introduction » What is Fe?","id":"0","title":"What is Fe?"},"1":{"body":"Fe aims to make writing secure smart contract code a great experience. With Fe, writing safe code feels natural and fun. Fe shares similar syntax with the popular languages Rust and Python , easing the learning curve for new users. It also implements the best features from Rust to limit dynamic behaviour while also maximizing expressiveness, meaning you can write clean, readable code without sacrificing compile time guarantees. Fe is: statically typed expressive compiled using Yul built to a detailed language specification able to limit dynamic behaviour rapidly evolving!","breadcrumbs":"Introduction » Why Fe?","id":"1","title":"Why Fe?"},"10":{"body":"To make the guest book more useful we will also add a method get_msg to read entries from a given address. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr] }\n} However, we will hit another error as we try to recompile the current code. Unable to compile guest_book.fe.\nerror: value must be copied to memory ┌─ guest_book.fe:10:14 │\n8 │ return self.messages[addr] │ ^^^^^^^^^^^^^^^^^^^ this value is in storage │ = Hint: values located in storage can be copied to memory using the `to_mem` function. = Example: `self.my_array.to_mem()` When we try to return a reference type such as an array from the storage of the contract we have to explicitly copy it to memory using the to_mem() function. Note: In the future Fe will likely introduce immutable storage pointers which might affect these semantics. The code should compile fine when we change it accordingly. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} Congratulations! You finished your first little Fe project. 👏 In the next chapter we will learn how to deploy our code and tweak it a bit further.","breadcrumbs":"Quickstart » Write your first contract » Add a method to read a message","id":"10","title":"Add a method to read a message"},"100":{"body":"x: x-coordinate, u256 y: y coordinate, u256 s: multiplier, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"100","title":"Parameters"},"101":{"body":"pub fn ec_mul(x: u256, y: u256, s: u256)-> (u256,u256)","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"101","title":"Function signature"},"102":{"body":"ec_mul returns a tuple of u256, (u256, u256).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"102","title":"Returns"},"103":{"body":"let (x, y): (u256, u256) = precompiles::ec_mul( x: 1, y: 2, s: 2\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"103","title":"Example"},"104":{"body":"ec_pairing does elliptic curve pairing - a form of encrypted multiplication.","breadcrumbs":"Standard Library » Precompiles » ec_pairing","id":"104","title":"ec_pairing"},"105":{"body":"input_buf: sequence of bytes representing the result of the elliptic curve operation (G1 * G2) ^ k, as MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"105","title":"Parameters"},"106":{"body":"ec_pairing returns a bool indicating whether the pairing is satisfied (true) or not (false).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"106","title":"Returns"},"107":{"body":"let mut input_buf: MemoryBuffer = MemoryBuffer::new(len: 384) let mut writer: MemoryBufferWriter = buf.writer() writer.write(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da) writer.write(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6) writer.write(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc) writer.write(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9) writer.write(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90) writer.write(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e) writer.write(value: 0x0000000000000000000000000000000000000000000000000000000000000001) writer.write(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45) writer.write(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4) writer.write(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7) writer.write(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2) writer.write(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc) assert precompiles::ec_pairing(buf)\n}","breadcrumbs":"Standard Library » Precompiles » Example","id":"107","title":"Example"},"108":{"body":"blake_2f is a compression algorithm for the cryptographic hash function BLAKE2b. It takes as an argument the state vector h, message block vector m, offset counter t, final block indicator flag f, and number of rounds rounds. The state vector provided as the first parameter is modified by the function.","breadcrumbs":"Standard Library » Precompiles » blake_2f","id":"108","title":"blake_2f"},"109":{"body":"h: the state vector, Array m: message block vector, Array t: offset counter, Array f: bool rounds: number of rounds of mixing, u32","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"109","title":"Parameters"},"11":{"body":"","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploy your contract.","id":"11","title":"Deploy your contract."},"110":{"body":"blake_2f returns a modified state vector, Array","breadcrumbs":"Standard Library » Precompiles » Returns","id":"110","title":"Returns"},"111":{"body":"pub fn blake_2f(rounds: u32, h: Array, m: Array, t: Array, f: bool) -> Array","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"111","title":"Function signature"},"112":{"body":"let result: Array = precompiles::blake_2f( rounds: 12, h: [ 0x48c9bdf267e6096a, 0x3ba7ca8485ae67bb, 0x2bf894fe72f36e3c, 0xf1361d5f3af54fa5, 0xd182e6ad7f520e51, 0x1f6c3e2b8c68059b, 0x6bbd41fbabd9831f, 0x79217e1319cde05b, ], m: [ 0x6162630000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, ], t: [ 0x0300000000000000, 0x0000000000000000, ], f: true\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"112","title":"Example"},"113":{"body":"Warning: This is a work in progress document. It is incomplete and specifications aren't stable yet. Notation Lexical Structure Keywords Identifiers Tokens Comments Items Visibility and Privacy Structs Traits Enums Type Aliases Contracts Functions Context Self Statements pragma Statement Assignment Statement Augmenting Assignment Statement const Statement let Statement revert Statement return Statement if Statement for Statement while Statement break Statement continue Statement assert Statement Expressions Call expressions Tuple expressions List expressions Index expressions Attribute expressions Name expressions Literal expressions Arithmetic Operators Comparison Operators Boolean Operators Unary Operators Type System Types Boolean Type Contract Type Numeric Types Tuple Types Array Types Struct Types Enum Types Address Type Map Type String Type Data Layout Stack Storage Constant size values in storage Maps in storage to_mem() function Memory Sequence types in memory","breadcrumbs":"Specification (WIP) » Fe Language Specification","id":"113","title":"Fe Language Specification"},"114":{"body":"","breadcrumbs":"Specification (WIP) » Notation » Notation","id":"114","title":"Notation"},"115":{"body":"The following notations are used by the Lexer and Syntax grammar snippets: Notation Examples Meaning CAPITAL KW_IF A token produced by the lexer ItalicCamelCase Item A syntactical production string x, while, * The exact character(s) \\x \\n, \\r, \\t, \\0 The character represented by this escape x? pub? An optional item x* OuterAttribute * 0 or more of x x+ MacroMatch + 1 or more of x xa..b HEX_DIGIT1..6 a to b repetitions of x | u8 | u16, Block | Item Either one or another [ ] [b B] Any of the characters listed [ - ] [a-z] Any of the characters in the range ~[ ] ~[b B] Any characters, except those listed ~string ~\\n, ~*/ Any characters, except this sequence ( ) (, Parameter ) Groups items","breadcrumbs":"Specification (WIP) » Notation » Grammar","id":"115","title":"Grammar"},"116":{"body":"Keywords Identifiers Tokens","breadcrumbs":"Specification (WIP) » Lexical Structure » Lexical Structure","id":"116","title":"Lexical Structure"},"117":{"body":"Fe divides keywords into two categories: strict reserved","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Keywords","id":"117","title":"Keywords"},"118":{"body":"These keywords can only be used in their correct contexts. They cannot be used as the identifiers . Lexer: KW_AS : as KW_BREAK : break KW_CONST : const KW_CONTINUE : continue KW_CONST : contract KW_FN : fn KW_ELSE : else KW_ENUM : enum KW_EVENT : event KW_FALSE : false KW_FOR : for KW_IDX : idx KW_IF : if KW_IN : in KW_LET : let KW_MATCH : match KW_MUT : mut KW_NONPAYABLE : nonpayable KW_PAYABLE : payable KW_PUB : pub KW_RETURN : return KW_REVERT : revert KW_SELFVALUE : self KW_STRUCT : struct KW_TRUE : true KW_USE : use KW_WHILE : while KW_ADDRESS : address","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Strict keywords","id":"118","title":"Strict keywords"},"119":{"body":"These keywords aren't used yet, but they are reserved for future use. They have the same restrictions as strict keywords. The reasoning behind this is to make current programs forward compatible with future versions of Fe by forbidding them to use these keywords. Lexer: KW_ABSTRACT : abstract KW_ASYNC : async KW_AWAIT : await KW_DO : do KW_EXTERNAL : external KW_FINAL : final KW_IMPL : impl KW_MACRO : macro KW_OVERRIDE : override KW_PURE : pure KW_SELFTYPE : Self KW_STATIC : static KW_SUPER : super KW_TRAIT : trait KW_TYPE : type KW_TYPEOF : typeof KW_VIEW : view KW_VIRTUAL : virtual KW_WHERE : where KW_YIELD : yield","breadcrumbs":"Specification (WIP) » Lexical Structure » Keywords » Reserved keywords","id":"119","title":"Reserved keywords"},"12":{"body":"You should have compiled the GuestBook contract and have both Guestbook_abi.json and GuestBook.bin available in your outputs folder. If you don't have any of these components, please revisit Write your first contract .","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Prerequisites","id":"12","title":"Prerequisites"},"120":{"body":"Lexer: IDENTIFIER_OR_KEYWORD : [a-z A-Z] [a-z A-Z 0-9 _]* | _ [a-z A-Z 0-9 _]+ Except a strict or reserved keyword An identifier is any nonempty ASCII string of the following form: Either The first character is a letter. The remaining characters are alphanumeric or _. Or The first character is _. The identifier is more than one character. _ alone is not an identifier. The remaining characters are alphanumeric or _.","breadcrumbs":"Specification (WIP) » Lexical Structure » Identifiers » Identifiers","id":"120","title":"Identifiers"},"121":{"body":"","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Tokens","id":"121","title":"Tokens"},"122":{"body":"A token that represents a new line.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » NEWLINE","id":"122","title":"NEWLINE"},"123":{"body":"A literal is an expression consisting of a single token, rather than a sequence of tokens, that immediately and directly denotes the value it evaluates to, rather than referring to it by name or some other evaluation rule. A literal is a form of constant expression, so is evaluated (primarily) at compile time.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Literals","id":"123","title":"Literals"},"124":{"body":"Strings Example Characters Escapes String \"hello\" ASCII subset Quote & ASCII ASCII escapes Name \\n Newline \\r Carriage return \\t Tab \\\\ Backslash Quote escapes Name \\\" Double quote Numbers Number literals * Example Decimal integer 98_222 Hex integer 0xff Octal integer 0o77 Binary integer 0b1111_0000 * All number literals allow _ as a visual separator: 1_234","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Examples","id":"124","title":"Examples"},"125":{"body":"Lexer BOOLEAN_LITERAL : true | false","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Boolean literals","id":"125","title":"Boolean literals"},"126":{"body":"Lexer STRING_LITERAL : \" ( PRINTABLE_ASCII_CHAR | QUOTE_ESCAPE | ASCII_ESCAPE )* \" PRINTABLE_ASCII_CHAR : Any ASCII character between 0x1F and 0x7E QUOTE_ESCAPE : \\\" ASCII_ESCAPE : | \\n | \\r | \\t | \\\\ A string literal is a sequence of any characters that are in the set of printable ASCII characters as well as a set of defined escape sequences. Line breaks are allowed in string literals.","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » String literals","id":"126","title":"String literals"},"127":{"body":"Lexer INTEGER_LITERAL : ( DEC_LITERAL | BIN_LITERAL | OCT_LITERAL | HEX_LITERAL ) DEC_LITERAL : DEC_DIGIT (DEC_DIGIT|_)* BIN_LITERAL : 0b (BIN_DIGIT|_)* BIN_DIGIT (BIN_DIGIT|_)* OCT_LITERAL : 0o (OCT_DIGIT|_)* OCT_DIGIT (OCT_DIGIT|_)* HEX_LITERAL : 0x (HEX_DIGIT|_)* HEX_DIGIT (HEX_DIGIT|_)* BIN_DIGIT : [0-1] OCT_DIGIT : [0-7] DEC_DIGIT : [0-9] HEX_DIGIT : [0-9 a-f A-F] An integer literal has one of four forms: A decimal literal starts with a decimal digit and continues with any mixture of decimal digits and underscores . A hex literal starts with the character sequence U+0030 U+0078 (0x) and continues as any mixture (with at least one digit) of hex digits and underscores. An octal literal starts with the character sequence U+0030 U+006F (0o) and continues as any mixture (with at least one digit) of octal digits and underscores. A binary literal starts with the character sequence U+0030 U+0062 (0b) and continues as any mixture (with at least one digit) of binary digits and underscores. Examples of integer literals of various forms: 123 // type u256\n0xff // type u256\n0o70 // type u256\n0b1111_1111_1001_0000 // type u256\n0b1111_1111_1001_0000i64 // type u256","breadcrumbs":"Specification (WIP) » Lexical Structure » Tokens » Integer literals","id":"127","title":"Integer literals"},"128":{"body":"Lexer LINE_COMMENT : // *","breadcrumbs":"Specification (WIP) » Comments » Comments","id":"128","title":"Comments"},"129":{"body":"Visibility and Privacy Structs Enums Type Aliases Contracts","breadcrumbs":"Specification (WIP) » Items » Items","id":"129","title":"Items"},"13":{"body":"When you develop smart contracts it is common to test them on local blockchains first because they are quick and easy to create and it doesn't matter if you make mistakes - there is nothing of real value secured by the blockchain as it only exists on your computer. Later, you can deploy your contract on a public test network to see how it behaves in a more realistic environment where other developers are also testing their code. Finally, when you are very confident that your contract is ready, you can deploy to Ethereum Mainnet (or one of its live Layer-2 networks). Once the contract is deployed on a \"live\" network, you are handling assets with real-world value! In this guide, you will deploy your contract to a local blockchain . This will be an \"ephemeral\" blockchain, meaning it is completely destroyed every time you shut it down and recreated from scratch every time you start it up - it won't save its state when you shut it down. The benefit of this is quick and easy development, and you don't need to find test ETH to pay gas fees. Later in the guide, you will learn how to deploy to a live public test network too.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Introduction","id":"13","title":"Introduction"},"130":{"body":"These two terms are often used interchangeably, and what they are attempting to convey is the answer to the question \"Can this item be used at this location?\" Fe knows two different types of visibility for functions and state variables: public and private. Visibility of private is the default and is used if no other visibility is specified. Public: External functions are part of the contract interface, which means they can be called from other contracts and via transactions. Private: Those functions and state variables can only be accessed internally from within the same contract. This is the default visibility. For example, this is a function that can be called externally from a transaction: pub fn answer_to_life_the_universe_and_everything() -> u256 { return 42\n} Top-level definitions in a Fe source file can also be specified as pub if the file exists within the context of an Ingot. Declaring a definition as pub enables other modules within an Ingot to use the definition. For example, given an Ingot with the following structure: example_ingot\n└── src ├── ding │ └── dong.fe └── main.fe With ding/dong.fe having the following contents: pub struct Dang { pub my_address: address pub my_u256: u256 pub my_i8: i8\n} Then main.fe can use the Dang struct since it is pub-qualified: use ding::dong::Dang contract Foo { pub fn hot_dang() -> Dang { return Dang( my_address: 8, my_u256: 42, my_i8: -1 ) }\n}","breadcrumbs":"Specification (WIP) » Items » Visibility and Privacy » Visibility and Privacy","id":"130","title":"Visibility and Privacy"},"131":{"body":"Syntax Struct : struct IDENTIFIER { StructField * StructMethod * } StructField : pub? IDENTIFIER : Type StructMethod : Function A struct is a nominal struct type defined with the keyword struct. An example of a struct item and its use: struct Point { pub x: u256 pub y: u256\n} fn pointy_stuff() { let mut p: Point = Point(x: 10, y: 11) let px: u256 = p.x p.x = 100\n} Builtin functions: abi_encode() encodes the struct as an ABI tuple and returns the encoded data as a fixed-size byte array that is equal in size to the encoding.","breadcrumbs":"Specification (WIP) » Items » Structs » Structs","id":"131","title":"Structs"},"132":{"body":"Syntax Trait : trait IDENTIFIER { TraitMethod * } TraitMethod : fn IDENTIFIER ( FunctionParameters ? ) FunctionReturnType ? ; A trait is a collection of function signatures that a type can implement. Traits are implemented for specific types through separate implementations. A type can implement a trait by providing a function body for each of the trait's functions. Traits can be used as type bounds for generic functions to restrict the types that can be used with the function. All traits define an implicit type parameter Self that refers to \"the type that is implementing this interface\". Example of the Min trait from Fe's standard library: pub trait Min { fn min() -> Self;\n} Example of the i8 type implementing the Min trait: impl Min for i8 { fn min() -> Self { return -128 }\n} Example of a function restricting a generic parameter to types implementing the Compute trait: pub trait Compute { fn compute(self) -> u256;\n} struct Example { fn do_something(val: T) -> u256 { return val.compute() }\n}","breadcrumbs":"Specification (WIP) » Items » Traits » Traits","id":"132","title":"Traits"},"133":{"body":"Syntax Enumeration : enum IDENTIFIER { EnumField * EnumMethod * } EnumField : IDENTIFIER | IDENTIFIER ( TupleElements ?) EnumMethod : Function TupleElements : Type ( , Type )* An enum , also referred to as enumeration is a simultaneous definition of a nominal Enum type , that can be used to create or pattern-match values of the corresponding type. Enumerations are declared with the keyword enum. An example of an enum item and its use: enum Animal { Dog Cat Bird(BirdType) pub fn bark(self) -> String<10> { match self { Animal::Dog => { return \"bow\" } Animal::Cat => { return \"meow\" } Animal::Bird(BirdType::Duck) => { return \"quack\" } Animal::Bird(BirdType::Owl) => { return \"hoot\" } } }\n} enum BirdType { Duck Owl\n} fn f() { let barker: Animal = Animal::Dog barker.bark()\n}","breadcrumbs":"Specification (WIP) » Items » Enums » Enum","id":"133","title":"Enum"},"134":{"body":"Syntax TypeAlias : type IDENTIFIER = Type A type alias defines a new name for an existing type . Type aliases are declared with the keyword type. For example, the following defines the type BookMsg as a synonym for the type u8[100], a sequence of 100 u8 numbers which is how sequences of bytes are represented in Fe. type BookMsg = Array","breadcrumbs":"Specification (WIP) » Items » Type Aliases » Type aliases","id":"134","title":"Type aliases"},"135":{"body":"Syntax Contract : contract IDENTIFIER { ContractMember * _} ContractMember : Visibility ? ( ContractField | Function | Struct | Enum ) Visibility : pub? ContractField : IDENTIFIER : Type A contract is a piece of executable code stored at an address on the blockchain. See Appendix A. in the Yellow Paper for more info. Contracts can be written in high level languages, like Fe, and then compiled to EVM bytecode for deployment to the blockchain. Once the code is deployed to the blockchain, the contract's functions can be invoked by sending a transaction to the contract address (or a call, for functions that do not modify blockchain data). In Fe, contracts are defined in files with .fe extensions and compiled using fe build. A contract is denoted using the contract keyword. A contract definition adds a new contract type to the module. This contract type may be used for calling existing contracts with the same interface or initializing new contracts with the create methods. An example of a contract: struct Signed { pub book_msg: String<100>\n} contract GuestBook { messages: Map> pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg ctx.emit(Signed(book_msg: book_msg)) } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} Multiple contracts can be compiled from a single .fe contract file.","breadcrumbs":"Specification (WIP) » Items » Contracts » Contracts","id":"135","title":"Contracts"},"136":{"body":"An optional pragma statement can be placed at the beginning of a contract. They are used to enable developers to express that certain code is meant to be compiled with a specific compiler version such that non-matching compiler versions will reject it. Read more on pragma","breadcrumbs":"Specification (WIP) » Items » Contracts » pragma","id":"136","title":"pragma"},"137":{"body":"State variables are permanently stored in the contract storage on the blockchain. State variables must be declared inside the contract body but outside the scope of any individual contract function. pub contract Example { some_number: u256 _some_string: String<100>\n}","breadcrumbs":"Specification (WIP) » Items » Contracts » State variables","id":"137","title":"State variables"},"138":{"body":"Functions are executable blocks of code. Contract functions are defined inside the body of a contract, but functions defined at module scope (outside of any contract) can be called from within a contract as well. Individual functions can be called internally or externally depending upon their visibility (either private or public). Functions can modify either (or neither) the contract instance or the blockchain. This can be inferred from the function signature by the presence of combinations of mut, self and Context. If a function modifies the contract instance it requires mut self as its first argument. If a function modifies the blockchain it requires Context as an argument. Read more on functions .","breadcrumbs":"Specification (WIP) » Items » Contracts » Contract functions","id":"138","title":"Contract functions"},"139":{"body":"The __init__ function is a special contract function that can only be called at contract deployment time . It is mostly used to set initial values to state variables upon deployment. In other contexts, __init__() is commonly referred to as the constructor function. pub contract Example { _some_number: u256 _some_string: String<100> pub fn __init__(mut self, number: u256, string: String<100>) { self._some_number=number; self._some_string=string; }\n} It is not possible to call __init__ at runtime.","breadcrumbs":"Specification (WIP) » Items » Contracts » The __init__() function","id":"139","title":"The __init__() function"},"14":{"body":"Everything in this tutorial can be done by sending JSON data directly to an Ethereum node. However, this is often awkward and error-prone, so a rich ecosystem of tooling has been developed to allow developers to interact with Ethereum in familiar languages or using abstractions that simplify the process. In this guide, you will use Foundry which is a very lightweight set of command-line tools for managing smart contract development. If you already have Foundry installed, head straight to the next section. If you need to install Foundry, head to getfoundry.sh and follow the installation steps. Note: If you are a seasoned smart contract developer, feel free to follow the tutorial using your own toolchain.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Your developer environment","id":"14","title":"Your developer environment"},"140":{"body":"Structs might also exist inside a contract file. These are declared outside of the contract body and are used to define a group of variables that can be used for some specific purpose inside the contract. In Fe structs are also used to represent an Event or an Error. Read more on structs .","breadcrumbs":"Specification (WIP) » Items » Contracts » Structs","id":"140","title":"Structs"},"141":{"body":"Constant size values stored on the stack or in memory can be passed into and returned by functions. Syntax Function : FunctionQualifiers fn IDENTIFIER ( FunctionParameters ? ) FunctionReturnType ? { FunctionStatements * } FunctionQualifiers : pub? FunctionStatements : ReturnStatement | VariableDeclarationStatement | AssignStatement | AugmentedAssignStatement | ForStatement | WhileStatement | IfStatement | AssertStatement | BreakStatement | ContinueStatement | RevertStatement | Expression FunctionParameters : self? | self,? FunctionParam (, FunctionParam )* ,? FunctionParam : FunctionParamLabel ? IDENTIFIER : Types FunctionParamLabel : _ | IDENTIFIER FunctionReturnType : -> Types A function definition consists of name and code block along with an optional list of parameters and return value. Functions are declared with the keyword fn. Functions may declare a set of input parameters, through which the caller passes arguments into the function, and the output type of the value the function will return to its caller on completion. When referred to, a function yields a first-class value of the corresponding zero-sized function type , which when called evaluates to a direct call to the function. A function header prepends a set or curly brackets {...} which contain the function body. For example, this is a simple function: fn add(x: u256, y: u256) -> u256 { return x + y\n} Functions can be defined inside of a contract, inside of a struct, or at the \"top level\" of a module (that is, not nested within another item). Example: fn add(_ x: u256, _ y: u256) -> u256 { return x + y\n} contract CoolCoin { balance: Map fn transfer(mut self, from sender: address, to recipient: address, value: u256) -> bool { if self.balance[sender] < value { return false } self.balance[sender] -= value self.balance[recipient] += value return true } pub fn demo(mut self) { let ann: address = 0xaa let bob: address = 0xbb self.balance[ann] = 100 let bonus: u256 = 2 let value: u256 = add(10, bonus) let ok: bool = self.transfer(from: ann, to: bob, value) }\n} Function parameters have optional labels. When a function is called, the arguments must be labeled and provided in the order specified in the function definition. The label of a parameter defaults to the parameter name; a different label can be specified by adding an explicit label prior to the parameter name. For example: fn encrypt(msg cleartext: u256, key: u256) -> u256 { return cleartext ^ key\n} fn demo() { let out: u256 = encrypt(msg: 0xdecafbad, key: 0xfefefefe)\n} Here, the first parameter of the encrypt function has the label msg, which is used when calling the function, while the parameter name is cleartext, which is used inside the function body. The parameter name is an implementation detail of the function, and can be changed without modifying any function calls, as long as the label remains the same. When calling a function, a label can be omitted when the argument is a variable with a name that matches the parameter label. Example: let msg: u256 = 0xdecafbad\nlet cyf: u256 = encrypt(msg, key: 0x1234) A parameter can also be specified to have no label, by using _ in place of a label in the function definition. In this case, when calling the function, the corresponding argument must not be labeled. Example: fn add(_ x: u256, _ y: u256) -> u256 { return x + y\n}\nfn demo() { let sum: u256 = add(16, 32)\n} Functions defined inside of a contract or struct may take self as a parameter. This gives the function the ability to read and write contract storage or struct fields, respectively. If a function takes self as a parameter, the function must be called via self. For example: let ok: bool = self.transfer(from, to, value) self is expected to come first parameter in the function's parameter list. Functions can also take a Context object which gives access to EVM features that read or write blockchain and transaction data. Context is expected to be first in the function's parameter list unless the function takes self, in which case Context should come second.","breadcrumbs":"Specification (WIP) » Items » Functions » Functions","id":"141","title":"Functions"},"142":{"body":"Context is used frequently in Fe smart contracts. It is used to gate access to EVM features for reading and modifying the blockchain.","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Context","id":"142","title":"Context"},"143":{"body":"Smart contracts execute on the Ethereum Virtual Machine (EVM). The EVM exposes features that allow smart contracts to query or change some of the blockchain data, for example emitting logs that are included in transaction receipts, creating contracts, obtaining the current block number and altering the data stored at certain addresses. To make Fe maximally explicit and as easy as possible to audit, these functions are gated behind a Context object. This is passed as an argument to functions, making it clear whether a function interacts with EVM features from the function signature alone. For example, the following function looks pure from its signature (i.e. it is not expected to alter any blockchain data) but in reality it does modify the blockchain (by emitting a log). pub fn looks_pure_but_isnt() { // COMPILE ERROR block_number()\n} Using Context to control access to EVM functions such as emit solves this problem by requiring an instance of Context to be passed explicitly to the function, making it clear from the function signature that the function executes some blockchain interaction. The function above, rewritten using Context, looks as follows: pub fn uses_context(ctx: Context) -> u256 { return ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Rationale","id":"143","title":"Rationale"},"144":{"body":"The Context object gates access to features such as: emitting logs creating contracts transferring ether reading message info reading block info The Context object needs to be passed as a parameter to the function. The Context object has a defined location in the parameter list. It is the first parameter unless the function also takes self. Context or self appearing at any other position in the parameter list causes a compile time error. The Context object is automatically injected when a function is called externally but it has to be passed explicitly when the function is called from another Fe function e.g. // The context object is automatically injected when this is called externally\npub fn multiply_block_number(ctx: Context) -> u256 { // but it has to be passed along in this function call return retrieves_blocknumber(ctx) * 1000\n} fn retrieves_blocknumber(ctx: Context) -> u256 { return ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » The Context object","id":"144","title":"The Context object"},"145":{"body":"All functionality that modifies the blockchain such as creating logs or contracts or transferring ether would require a mutable Context reference whereas read-only access such as ctx.block_number() does not need require a mutable reference to the context. To pass a mutable Context object, prepend the object name with mut in the function definition, e.g.: struct SomeEvent{\n} pub fn mutable(mut ctx: Context) { ctx.emit(SomeEvent())\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Context mutability","id":"145","title":"Context mutability"},"146":{"body":"The use of Context enables tighter rules and extra clarity compared wth the existing function categories in the ABI, especially when paired with self . The following table shows how combinations of self, mut self, Context and mut Context map to ABI function types. Category Characteristics Fe Syntax ABI Pure Can only operate on input arguments and not produce any information besides its return value. Can not take self and therefore has no access to things that would make it impure foo(val: u256) pure Read Contract Reading information from the contract instance (broad definition includes reading constants from contract code) foo(self) view Storage Writing Writing to contract storage (own or that of other contracts) foo(mut self) payable or nonpayable Context Reading Reading contextual information from the blockchain (msg, block etc) foo(ctx: Context) view Context Modifying Emitting logs, transferring ether, creating contracts foo(ctx: mut Context) payable or nonpayable Read Contract & Context Reading information from the contract instance and Context foo(self, ctx:Context) view Read Contract & write Context Reading information from the contract instance and modify Context foo(self, ctx: mut Context) view Storage Writing & read Context Writing to contract storage and read from Context foo(mut self, ctx: Context) payable or nonpayable Storage Writing & write Context Writing to contract storage and Context foo(mut self, ctx: mut Context) payable or nonpayable This means Fe has nine different categories of function that can be derived from the function signatures that map to four different ABI types.","breadcrumbs":"Specification (WIP) » Items » Functions » Context » ABI conformity","id":"146","title":"ABI conformity"},"147":{"body":"","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Examples","id":"147","title":"Examples"},"148":{"body":"Context includes information about inbound transactions. For example, the following function receives ether and adds the sender's address and the transaction value to a mapping. No blockchain data is being changed, so Context does not need to be mutable. // assumes existence of state variable named 'ledger' with type Map\npub fn add_to_ledger(mut self, ctx: Context) { self.ledger[ctx.msg_sender()] = ctx.msg_value();\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » msg_sender and msg_value","id":"148","title":"msg_sender and msg_value"},"149":{"body":"Transferring ether modifies the blockchain state, so it requires access to a mutable Context object. pub fn send_ether(mut ctx: Context, _addr: address, amount: u256) { ctx.send_value(to: _addr, wei: amount)\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » Transferring ether","id":"149","title":"Transferring ether"},"15":{"body":"Foundry has its own local network called Anvil . You can use it to create a local blockchain on your computer. Open a terminal and run the following very simple command: anvil You will see some ASCII art and configuration details in the terminal. Anvil creates a set of accounts that you can use on this network. The account addresses and private keys are displayed in the console ( never use these accounts to interact with any live network). You will also see a line reading listening on 127.0.0.1:8545. This indicates that your local node is listening for HTTP traffic on your local network on port 8545 - this is important because this is how you will send the necessary information to your node so that it can be added to the blockchain, and how you will interact with the contract after it is deployed. Note: Anvil needs to keep running throughout this tutorial - if you close the terminal your blockchain will cease to exist. Once Anvil has started, open a new terminal tab/window to run the rest of the commands in this guide.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploying to a local network","id":"15","title":"Deploying to a local network"},"150":{"body":"Creating a contract via create/create2 requires access to a mutable Context object because it modifies the blockchain state data: pub fn creates_contract(ctx: mut Context): ctx.create2(...)","breadcrumbs":"Specification (WIP) » Items » Functions » Context » create/create2","id":"150","title":"create/create2"},"151":{"body":"Reading block chain information such as the current block number requires Context (but does not require it to be mutable). pub fn retrieves_blocknumber(ctx: Context) { ctx.block_number()\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Context » block number","id":"151","title":"block number"},"152":{"body":"self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. self in the context of classes in Python, or this in Javascript. self gives access to constants from the contract code and state variables from contract storage. Note: Here we focus on functions defined inside a contract, giving access to contract storage; however, self can also be used to read and write struct fields where functions are defined inside structs. If a function takes self as a parameter, the function must be called via self. For example: let ok: bool = self.transfer(from, to, value)","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Self","id":"152","title":"Self"},"153":{"body":"self is immutable and can be used for read-only operations on the contract storage (or struct fields). In order to write to the contract storage, you must use mut self. This makes the contract instance mutable and allows the contract storage to be updated.","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Mutability","id":"153","title":"Mutability"},"154":{"body":"","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Examples","id":"154","title":"Examples"},"155":{"body":"contract example { value: u256; pub fn check_value(self) -> u256 { return self.value; }\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Reading contract storage","id":"155","title":"Reading contract storage"},"156":{"body":"contract example { value: u256; pub fn update_value(mut self) { self.value += 1; }\n}","breadcrumbs":"Specification (WIP) » Items » Functions » Self » Writing contract storage","id":"156","title":"Writing contract storage"},"157":{"body":"pragma Statement const Statement let Statement Assignment Statement Augmenting Assignment Statement revert Statement return Statemetn if Statement for Statement while Statement break Statement continue Statement match Statement assert Statement","breadcrumbs":"Specification (WIP) » Statements » Statements","id":"157","title":"Statements"},"158":{"body":"Syntax PragmaStatement : pragma VersionRequirement VersionRequirement :Following the semver implementation by cargo The pragma statement is denoted with the keyword pragma. Evaluating a pragma statement will cause the compiler to reject compilation if the version of the compiler does not conform to the given version requirement. An example of a pragma statement: pragma ^0.1.0 The version requirement syntax is identical to the one that is used by cargo ( more info ).","breadcrumbs":"Specification (WIP) » Statements » pragma Statement » pragma statement","id":"158","title":"pragma statement"},"159":{"body":"Syntax ConstStatement : const IDENTIFIER : Type = Expression A const statement introduces a named constant value. Constants are either directly inlined wherever they are used or loaded from the contract code depending on their type. Example: const TEN: u256 = 10\nconst HUNDO: u256 = TEN * TEN contract Foo { pub fn bar() -> u256 { return HUNDO }\n}","breadcrumbs":"Specification (WIP) » Statements » const Statement » const statement","id":"159","title":"const statement"},"16":{"body":"In the previous guide you wrote the following contract, and compiled it using ./fe build guest_book.fe --overwrite to obtain the contract bytecode. This compilation stage converts the human-readable Fe code into a format that can be efficiently executed by Ethereum's embedded computer, known as the Ethereum Virtual Machine (EVM). The bytecode is stored at an address on the blockchain. The contract functions are invoked by sending instructions in a transaction to that address. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg } pub fn get_msg(self, addr: address) -> String<100> { return self.messages[addr].to_mem() }\n} To make the deployment, we will need to send a transaction to your node via its exposed HTTP port (8545). The following command deploys the Guestbook contract to your local network. Grab the private key of one of your accounts from the information displayed in the terminal running Anvil. cast send --rpc-url localhost:8545 --private-key --create $(cat output/GuestBook/GuestBook.bin) Here's what the response was at the time of writing this tutorial. blockHash 0xcee9ff7c0b57822c5f6dd4fbd3a7e9eadb594b84d770f56f393f137785a52702\nblockNumber 1\ncontractAddress 0x5FbDB2315678afecb367f032d93F642f64180aa3\ncumulativeGasUsed 196992\neffectiveGasPrice 4000000000\ngasUsed 196992\nlogs []\nlogsBloom 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nroot status 1\ntransactionHash 0x3fbde2a994bf2dec8c11fb0390e9d7fbc0fa1150f5eab8f33c130b4561052622\ntransactionIndex 0\ntype 2 This response tells you that your contract has been deployed to the blockchain. The transaction was included in block number 1, and the address it was deployed to is provided in the contractAddress field - you need this address to interact with the contract. Note: Don't assume responses to be identical when following the tutorial. Due to the nature of the blockchain environment the content of the responses will always differ slightly.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Making the deployment transaction","id":"16","title":"Making the deployment transaction"},"160":{"body":"Syntax LetStatement : let IDENTIFIER | TupleTarget : Type = Expression TupleTarget : ( TupleTargetItem (, TupleTargetItem ) + ) TupleTargetItem : IDENTIFIER | TupleTarget A let statement introduces a new set of variables. Any variables introduced by a variable declaration are visible from the point of declaration until the end of the enclosing block scope. Note: Support for nested tuples isn't yet implemented but can be tracked via this GitHub issue . Example: contract Foo { pub fn bar() { let val1: u256 = 1 let (val2):(u256) = (1,) let (val3, val4):(u256, bool) = (1, false) let (val5, val6, (val7, val8)):(u256, bool, (u256, u256)) = (1, false, (2, 4)) }\n}","breadcrumbs":"Specification (WIP) » Statements » let Statement » let statement","id":"160","title":"let statement"},"161":{"body":"Syntax AssignmentStatement : Expression = Expression An assignment statement moves a value into a specified place. An assignment statement consists of an expression that holds a mutable place, followed by an equals sign (=) and a value expression. Example: contract Foo { some_array: Array pub fn bar(mut self) { let mut val1: u256 = 10 // Assignment of stack variable val1 = 10 let mut values: (u256, u256) = (1, 2) // Assignment of tuple item values.item0 = 3 // Assignment of storage array slot self.some_array[5] = 1000 }\n}","breadcrumbs":"Specification (WIP) » Statements » Assignment Statement » Assignment statement","id":"161","title":"Assignment statement"},"162":{"body":"Syntax AssignmentStatement : Expression = Expression | Expression += Expression | Expression -= Expression | Expression %= Expression | Expression **= Expression | Expression <<= Expression | Expression >>= Expression | Expression |= Expression | Expression ^= Expression | Expression &= Expression Augmenting assignment statements combine arithmetic and logical binary operators with assignment statements. An augmenting assignment statement consists of an expression that holds a mutable place, followed by one of the arithmetic or logical binary operators, followed by an equals sign (=) and a value expression. Example: fn example() -> u8 { let mut a: u8 = 1 let b: u8 = 2 a += b a -= b a *= b a /= b a %= b a **= b a <<= b a >>= b a |= b a ^= b a &= b return a\n}","breadcrumbs":"Specification (WIP) » Statements » Augmenting Assignment Statement » Augmenting Assignment statement","id":"162","title":"Augmenting Assignment statement"},"163":{"body":"Syntax RevertStatement : revert Expression ? The revert statement is denoted with the keyword revert. Evaluating a revert statement will cause to revert all state changes made by the call and return with an revert error to the caller. A revert statement may be followed by an expression that evaluates to a struct in which case the struct is encoded as revert data as defined by EIP-838 . An example of a revert statement without revert data: contract Foo { fn transfer(self, to: address, value: u256) { if not self.in_whitelist(addr: to) { revert } // more logic here } fn in_whitelist(self, addr: address) -> bool { return false }\n} An example of a revert statement with revert data: struct ApplicationError { pub code: u8\n} contract Foo { pub fn transfer(self, to: address, value: u256) { if not self.in_whitelist(addr: to) { revert ApplicationError(code: 5) } // more logic here } fn in_whitelist(self, addr: address) -> bool { return false }\n}","breadcrumbs":"Specification (WIP) » Statements » revert Statement » revert statement","id":"163","title":"revert statement"},"164":{"body":"Syntax ReturnStatement : return Expression ? The return statement is denoted with the keyword return. A return statement leaves the current function call with a return value which is either the value of the evaluated expression (if present) or () (unit type) if return is not followed by an expression explicitly. An example of a return statement without explicit use of an expression: contract Foo { fn transfer(self, to: address, value: u256) { if not self.in_whitelist(to) { return } } fn in_whitelist(self, to: address) -> bool { // revert used as placeholder for actual logic revert }\n} The above can also be written in a slightly more verbose form: contract Foo { fn transfer(self, to: address, value: u256) -> () { if not self.in_whitelist(to) { return () } } fn in_whitelist(self, to: address) -> bool { // revert used as placeholder for actual logic revert }\n}","breadcrumbs":"Specification (WIP) » Statements » return Statement » return statement","id":"164","title":"return statement"},"165":{"body":"Syntax IfStatement : if Expression { ( Statement | Expression )+ } (else { ( Statement | Expression )+ })? Example: contract Foo { pub fn bar(val: u256) -> u256 { if val > 5 { return 1 } else { return 2 } }\n} The if statement is used for conditional execution.","breadcrumbs":"Specification (WIP) » Statements » if Statement » if statement","id":"165","title":"if statement"},"166":{"body":"Syntax ForStatement : for IDENTIFIER in Expression { ( Statement | Expression )+ } A for statement is a syntactic construct for looping over elements provided by an array type . An example of a for loop over the contents of an array: Example: contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i } return sum }\n}","breadcrumbs":"Specification (WIP) » Statements » for Statement » for statement","id":"166","title":"for statement"},"167":{"body":"Syntax WhileStatement : while Expression { ( Statement | Expression )+ } A while loop begins by evaluation the boolean loop conditional expression. If the loop conditional expression evaluates to true, the loop body block executes, then control returns to the loop conditional expression. If the loop conditional expression evaluates to false, the while expression completes. Example: contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 } return sum }\n}","breadcrumbs":"Specification (WIP) » Statements » while Statement » while statement","id":"167","title":"while statement"},"168":{"body":"Syntax BreakStatement : break The break statement can only be used within a for or while loop and causes the immediate termination of the loop. If used within nested loops the break statement is associated with the innermost enclosing loop. An example of a break statement used within a while loop. contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 if some_abort_condition() { break } } return sum } fn some_abort_condition() -> bool { // some complex logic return true }\n} An example of a break statement used within a for loop. contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i if some_abort_condition() { break } } return sum } fn some_abort_condition() -> bool { // some complex logic return true }\n}","breadcrumbs":"Specification (WIP) » Statements » break Statement » break statement","id":"168","title":"break statement"},"169":{"body":"Syntax ContinueStatement : continue The continue statement can only be used within a for or while loop and causes the immediate termination of the current iteration, returning control to the loop head. If used within nested loops the continue statement is associated with the innermost enclosing loop. An example of a continue statement used within a while loop. contract Foo { pub fn bar() -> u256 { let mut sum: u256 = 0 while sum < 10 { sum += 1 if some_skip_condition() { continue } } return sum } fn some_skip_condition() -> bool { // some complex logic return true }\n} An example of a continue statement used within a for loop. contract Foo { pub fn bar(values: Array) -> u256 { let mut sum: u256 = 0 for i in values { sum = sum + i if some_skip_condition() { continue } } return sum } fn some_skip_condition() -> bool { // some complex logic return true }\n}","breadcrumbs":"Specification (WIP) » Statements » continue Statement » continue statement","id":"169","title":"continue statement"},"17":{"body":"Now that the contract is deployed to the blockchain, you can send a transaction to sign it with a custom message. You will sign it from the same address that was used to deploy the contract, but there is nothing preventing you from using any account for which you have the private key (you could experiment by signing from all ten accounts created by Anvil, for example). The following command will send a transaction to call sign(string) on our freshly deployed Guestbook contract sitting at address 0x810cbd4365396165874c054d01b1ede4cc249265 with the message \"We <3 Fe\" . cast send --rpc-url http://localhost:8545 --private-key \"sign(string)\" '\"We <3 Fe\"' The response will look approximately as follows: blockHash 0xb286898484ae737d22838e27b29899b327804ec45309e47a75b18cfd7d595cc7\nblockNumber 2\ncontractAddress cumulativeGasUsed 36278\neffectiveGasPrice 3767596722\ngasUsed 36278\nlogs []\nlogsBloom 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\nroot status 1\ntransactionHash 0x309bcea0a77801c15bb7534beab9e33dcb613c93cbea1f12d7f92e4be5ecab8c\ntransactionIndex 0\ntype 2","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Signing the guest book","id":"17","title":"Signing the guest book"},"170":{"body":"Syntax MatchStatement : match Expression { ( Pattern => { Statement * } )+ } Pattern : PatternElem ( | PatternElem )* PatternElem : IDENTIFIER | BOOLEAN_LITERAL | _ | .. | Path | Path ( TuplePatterns ? ) |( TuplePatterns ? ) | Path { StructPatterns ? } TuplePatterns : Pattern ( , Pattern )* StructPatterns : Field ( , Field )*(, ..)? Field : IDENTIFIER : Pattern A match statements compares expression with patterns, then executes body of the matched arm. Example: enum MyEnum { Unit Tuple(u32, u256, bool)\n} contract Foo { pub fn bar(self) -> u256 { let val: MyEnum = MyEnum::Tuple(1, 10, false) return self.eval(val) } fn eval(self, val: MyEnum) -> u256 { match val { MyEnum::Unit => { return 0 } MyEnum::Tuple(.., false) => { return 1 } MyEnum::Tuple(a, b, true) => { return u256(a) + b } } }\n}","breadcrumbs":"Specification (WIP) » Statements » match Statement » match statement","id":"170","title":"match statement"},"171":{"body":"Syntax AssertStatement : assert Expression (, Expression )? The assert statement is used express invariants in the code. It consists of a boolean expression optionally followed by a comma followed by a string expression. If the boolean expression evaluates to false, the code reverts with a panic code of 0x01. In the case that the first expression evaluates to false and a second string expression is given, the code reverts with the given string as the error code . Warning: The current implementation of assert is under active discussion and likely to change. An example of a assert statement without the optional message: contract Foo { fn bar(val: u256) { assert val > 5 }\n} An example of a assert statement with an error message: contract Foo { fn bar(val: u256) { assert val > 5, \"Must be greater than five\" }\n}","breadcrumbs":"Specification (WIP) » Statements » assert Statement » assert statement","id":"171","title":"assert statement"},"172":{"body":"Call expressions Tuple expressions List expressions Struct expressions Index expressions Attribute expressions Name expressions Name expressions Literal expressions Arithmetic Operators Comparison Operators Boolean Operators Unary Operators","breadcrumbs":"Specification (WIP) » Expressions » Expressions","id":"172","title":"Expressions"},"173":{"body":"Syntax CallExpression : Expression GenericArgs ? ( CallParams ? ) GenericArgs : < IDENTIFIER | INTEGER_LITERAL (, IDENTIFIER | INTEGER_LITERAL )* > CallParams : CallArg ( , CallArg )* ,? CallArg : ( CallArgLabel =)? Expression CallArgLabel : IDENTIFIER Label must correspond to the name of the called function argument at the given position. It can be omitted if parameter name and the name of the called function argument are equal. A call expression calls a function. The syntax of a call expression is an expression , followed by a parenthesized comma-separated list of call arguments. Call arguments are expressions, and must be labeled and provided in the order specified in the function definition . If the function eventually returns, then the expression completes. Example: contract Foo { pub fn demo(self) { let ann: address = 0xaa let bob: address = 0xbb self.transfer(from: ann, to: bob, 25) } pub fn transfer(self, from: address, to: address, _ val: u256) {}\n}","breadcrumbs":"Specification (WIP) » Expressions » Call expressions » Call expressions","id":"173","title":"Call expressions"},"174":{"body":"Syntax TupleExpression : ( TupleElements ? ) TupleElements : ( Expression , )+ Expression ? A tuple expression constructs tuple values . The syntax for tuple expressions is a parenthesized, comma separated list of expressions, called the tuple initializer operands . The number of tuple initializer operands is the arity of the constructed tuple. 1-ary tuple expressions require a comma after their tuple initializer operand to be disambiguated with a parenthetical expression. Tuple expressions without any tuple initializer operands produce the unit tuple. For other tuple expressions, the first written tuple initializer operand initializes the field item0 and subsequent operands initializes the next highest field. For example, in the tuple expression (true, false, 1), true initializes the value of the field item0, false field item1, and 1 field item2. Examples of tuple expressions and their types: Expression Type () () (unit) (0, 4) (u256, u256) (true, ) (bool, ) (true, -1, 1) (bool, i256, u256) A tuple field can be accessed via an attribute expression . Example: contract Foo { pub fn bar() { // Creating a tuple via a tuple expression let some_tuple: (u256, bool) = (1, false) // Accessing the first tuple field via the `item0` field baz(input: some_tuple.item0) } pub fn baz(input: u256) {}\n}","breadcrumbs":"Specification (WIP) » Expressions » Tuple expressions » Tuple expressions","id":"174","title":"Tuple expressions"},"175":{"body":"Syntax ListExpression : [ ListElements ? ] ListElements : Expression (, Expression )* ,? A list expression constructs array values . The syntax for list expressions is a parenthesized, comma separated list of expressions, called the list initializer operands . The number of list initializer operands must be equal to the static size of the array type. The types of all list initializer operands must conform to the type of the array. Examples of tuple expressions and their types: Expression Type [1, self.get_number()] u256[2] [true, false, false] bool[3] An array item can be accessed via an index expression . Example: contract Foo { fn get_val3() -> u256 { return 3 } pub fn baz() { let val1: u256 = 2 // A list expression let foo: Array = [1, val1, get_val3()] }\n}","breadcrumbs":"Specification (WIP) » Expressions » List expressions » List expressions","id":"175","title":"List expressions"},"176":{"body":"TBW","breadcrumbs":"Specification (WIP) » Expressions » Struct expressions » Struct expressions","id":"176","title":"Struct expressions"},"177":{"body":"Syntax IndexExpression : Expression [ Expression ] Array and Map types can be indexed by by writing a square-bracket-enclosed expression after them. For arrays, the type of the index key has to be u256 whereas for Map types it has to be equal to the key type of the map. Example: contract Foo { balances: Map pub fn baz(mut self, mut values: Array) { // Assign value at slot 5 values[5] = 1000 // Read value at slot 5 let val1: u256 = values[5] // Assign value for address zero self.balances[address(0)] = 10000 // Read balance of address zero let bal: u256 = self.balances[address(0)] }\n}","breadcrumbs":"Specification (WIP) » Expressions » Index expressions » Index expressions","id":"177","title":"Index expressions"},"178":{"body":"Syntax AttributeExpression : Expression . IDENTIFIER An attribute expression evaluates to the location of an attribute of a struct , tuple or contract . The syntax for an attribute expression is an expression, then a . and finally an identifier. Examples: struct Point { pub x: u256 pub y: u256\n} contract Foo { some_point: Point some_tuple: (bool, u256) fn get_point() -> Point { return Point(x: 100, y: 500) } pub fn baz(some_point: Point, some_tuple: (bool, u256)) { // Different examples of attribute expressions let bool_1: bool = some_tuple.item0 let x1: u256 = some_point.x let point1: u256 = get_point().x let point2: u256 = some_point.x }\n}","breadcrumbs":"Specification (WIP) » Expressions » Attribute expressions » Attribute expressions","id":"178","title":"Attribute expressions"},"179":{"body":"Syntax NameExpression : IDENTIFIER A name expression resolves to a local variable. Example: contract Foo { pub fn baz(foo: u256) { // name expression resolving to the value of `foo` foo }\n}","breadcrumbs":"Specification (WIP) » Expressions » Name expressions » Name expressions","id":"179","title":"Name expressions"},"18":{"body":"The get_msg(address) API allows you to read the messages added to the guestbook for a given address. It will give us a response of 100 zero bytes for any address that hasn't yet signed the guestbook. Since reading the messages doesn't change any state within the blockchain, you don't have to send an actual transaction. Instead, you can perform a call against the local state of the node that you are querying. To do that run: $ cast call --rpc-url http://localhost:8545 \"get_msg(address)\" Notice that the command doesn't need to provide a private key simply because we are not sending an actual transaction. The response arrives in the form of hex-encoded bytes padded with zeroes: 0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000 Foundry provides a built-in method to convert this hex string into human-readable ASCII. You can do this as follows: cast to_ascii \"0x000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000087765203c33204665000000000000000000000000000000000000000000000000\" or simply pipe the output of the cast call to to_ascii to do the query and conversion in a single command: cast call --rpc-url https://rpc.sepolia.org \"get_msg(address)\" | cast --to-ascii Either way, the response will be the message you passed to the sign(string) function. \"We <3 Fe\" Congratulations! You've deployed real Fe code to a local blockchain! 🤖","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Reading the signatures","id":"18","title":"Reading the signatures"},"180":{"body":"Syntax PathExpression : IDENTIFIER ( :: IDENTIFIER )* A name expression resolves to a local variable. Example: contract Foo { pub fn baz() { // CONST_VALUE is defined in another module `my_mod`. let foo: u32 = my_mod::CONST_VALUE }\n}","breadcrumbs":"Specification (WIP) » Expressions » Path expressions » Path expressions","id":"180","title":"Path expressions"},"181":{"body":"Syntax LiteralExpression : | STRING_LITERAL | INTEGER_LITERAL | BOOLEAN_LITERAL A literal expression consists of one of the literal forms described earlier. It directly describes a number, string or boolean value. \"hello\" // string type\n5 // integer type\ntrue // boolean type","breadcrumbs":"Specification (WIP) » Expressions » Literal expressions » Literal expressions","id":"181","title":"Literal expressions"},"182":{"body":"Syntax ArithmeticExpression : Expression + Expression | Expression - Expression | Expression * Expression | Expression / Expression | Expression % Expression | Expression ** Expression | Expression & Expression | Expression | Expression | Expression ^ Expression | Expression << Expression | Expression >> Expression Binary operators expressions are all written with infix notation . This table summarizes the behavior of arithmetic and logical binary operators on primitive types. Symbol Integer + Addition - Subtraction * Multiplication / Division* % Remainder ** Exponentiation & Bitwise AND | Bitwise OR ^ Bitwise XOR << Left Shift >> Right Shift * Integer division rounds towards zero. Here are examples of these operators being used. 3 + 6 == 9\n6 - 3 == 3\n2 * 3 == 6\n6 / 3 == 2\n5 % 4 == 1\n2 ** 4 == 16\n12 & 25 == 8\n12 | 25 == 29\n12 ^ 25 == 21\n212 << 1 == 424\n212 >> 1 == 106","breadcrumbs":"Specification (WIP) » Expressions » Arithmetic Operators » Arithmetic Operators","id":"182","title":"Arithmetic Operators"},"183":{"body":"Syntax ComparisonExpression : Expression == Expression | Expression != Expression | Expression > Expression | Expression < Expression | Expression >= Expression | Expression <= Expression Symbol Meaning == Equal != Not equal > Greater than < Less than >= Greater than or equal to <= Less than or equal to Here are examples of the comparison operators being used. 123 == 123\n23 != -12\n12 > 11\n11 >= 11\n11 < 12\n11 <= 11","breadcrumbs":"Specification (WIP) » Expressions » Comparison Operators » Comparison Operators","id":"183","title":"Comparison Operators"},"184":{"body":"Syntax BooleanExpression : Expression or Expression | Expression and Expression The operators or and and may be applied to operands of boolean type. The or operator denotes logical 'or', and the and operator denotes logical 'and'. Example: const x: bool = false or true // true","breadcrumbs":"Specification (WIP) » Expressions » Boolean Operators » Boolean Operators","id":"184","title":"Boolean Operators"},"185":{"body":"Syntax UnaryExpression : not Expression | - Expression | ~ Expression The unary operators are used to negate expressions. The unary - (minus) operator yields the negation of its numeric argument. The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The unary not operator yields the inversion of its boolean argument. Example: fn f() { let x: bool = not true // false let y: i256 = -1 let z: i256 = i256(~1) // -2\n}","breadcrumbs":"Specification (WIP) » Expressions » Unary Operators » Unary Operators","id":"185","title":"Unary Operators"},"186":{"body":"","breadcrumbs":"Specification (WIP) » Type System » Type System","id":"186","title":"Type System"},"187":{"body":"Every variable, item, and value in a Fe program has a type. The _ of a value defines the interpretation of the memory holding it and the operations that may be performed on the value. Built-in types are tightly integrated into the language, in nontrivial ways that are not possible to emulate in user-defined types. User-defined types have limited capabilities. The list of types is: Data types Base types: Boolean — true or false Address - Ethereum address Numeric — integer Reference types: Sequence types Tuple Array String Struct Enum Map Other types: Unit Contract Function","breadcrumbs":"Specification (WIP) » Type System » Types » Types","id":"187","title":"Types"},"188":{"body":"The bool type is a data type which can be either true or false. Example: let x: bool = true","breadcrumbs":"Specification (WIP) » Type System » Types » Boolean Type » Boolean type","id":"188","title":"Boolean type"},"189":{"body":"An contract type is the type denoted by the name of an contract item . A value of a given contract type carries the contract's public interface as attribute functions. A new contract value can be created by either casting an address to a contract type or by creating a new contract using the type attribute functions create or create2. Example: contract Foo { pub fn get_my_num() -> u256 { return 42 }\n} contract FooFactory { pub fn create2_foo(mut ctx: Context) -> address { // `0` is the value being sent and `52` is the address salt let foo: Foo = Foo.create2(ctx, 0, 52) return address(foo) }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Contract Type » Contract types","id":"189","title":"Contract types"},"19":{"body":"Now you have learned how to deploy your contract to a local blockchain, you can consider deploying it to a public test network too. For more complex projects this can be very beneficial because it allows many users to interact with your contract, simulates real network conditions and allows you to interact with other existing contracts on the network. However, to use a public testnet you need to obtain some of that testnet's gas token. In this guide you will use the Sepolia test network, meaning you will need some SepoliaETH. SepoliaETH has no real-world value - it is only required to pay gas fees on the network. If you don't have any SepoliaETH yet, you can request some SepoliaETH from one of the faucets that are listed on the ethereum.org website. IMPORTANT : It is good practice to never use an Ethereum account for a testnet that is also used for the actual Ethereum mainnet. Assuming you have some SepoliaETH, you can repeat the steps from the local blockchain example, however, instead of pointing Foundry to the RPC endpoint for your Anvil node, you need to point it to a node connected to the Sepolia network. There are several options for this: If you run your own node, connect it to the Sepolia network and let it sync. make sure you expose an http port or enable IPC transport. You can use an RPC provider such as Alchemy or Infura You can use an open public node such as https://rpc.sepolia.org. Whichever method you choose, you will have an RPC endpoint for a node connected to Sepolia. You can replace the http://localhost:8545 in the commands with your new endpoint. For example, to deploy the contract using the open public endpoint: cast send --rpc-url https://rpc.sepolia.org --private-key --create $(cat output/GuestBook/GuestBook.bin) Now you have deployed the contract to a public network and anyone can interact with it. To demonstrate, you can check out previous versions of this contract deployed on Sepolia in the past: address link deploy tx hash 0x31b41a4177d7eb66f5ea814959b2c147366b6323f17b6f7060ecff424b58df76 etherscan contract address 0x810cbd4365396165874C054d01B1Ede4cc249265 etherscan Note that calling the sign(string) function will cost you some SepoliaETH because the function changes the state of the blockchain (it adds a message to the contract storage). However, get_msg(address) does not cost any gas because it is a simple lookup in the node's local database. Congratulations! You've deployed real Fe code to a live network 🤖","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Deploying to a public test network","id":"19","title":"Deploying to a public test network"},"190":{"body":"The unsigned integer types consist of: Type Minimum Maximum u8 0 28-1 u16 0 216-1 u32 0 232-1 u64 0 264-1 u128 0 2128-1 u256 0 2256-1 The signed two's complement integer types consist of: Type Minimum Maximum i8 -(27) 27-1 i16 -(215) 215-1 i32 -(231) 231-1 i64 -(263) 263-1 i128 -(2127) 2127-1 i256 -(2255) 2255-1","breadcrumbs":"Specification (WIP) » Type System » Types » Numeric Types » Numeric types","id":"190","title":"Numeric types"},"191":{"body":"Syntax TupleType : ( ) | ( ( Type , )+ Type ? ) Tuple types are a family of structural types [1] for heterogeneous lists of other types. The syntax for a tuple type is a parenthesized, comma-separated list of types. A tuple type has a number of fields equal to the length of the list of types. This number of fields determines the arity of the tuple. A tuple with n fields is called an n-ary tuple . For example, a tuple with 2 fields is a 2-ary tuple. Fields of tuples are named using increasing numeric names matching their position in the list of types. The first field is item0. The second field is item1. And so on. The type of each field is the type of the same position in the tuple's list of types. For convenience and historical reasons, the tuple type with no fields (()) is often called unit or the unit type . Its one value is also called unit or the unit value . Some examples of tuple types: () (also known as the unit or zero-sized type ) (u8, u8) (bool, i32) (i32, bool) (different type from the previous example) Values of this type are constructed using a tuple expression . Furthermore, various expressions will produce the unit value if there is no other meaningful value for it to evaluate to. Tuple fields can be accessed via an attribute expression . Structural types are always equivalent if their internal types are equivalent.","breadcrumbs":"Specification (WIP) » Type System » Types » Tuple Types » Tuple Types","id":"191","title":"Tuple Types"},"192":{"body":"Syntax ArrayType : Array< Type , INTEGER_LITERAL > An array is a fixed-size sequence of N elements of type T. The array type is written as Array. The size is an integer literal. Arrays are either stored in storage or memory but are never stored directly on the stack. Examples: contract Foo { // An array in storage bar: Array fn do_something() { // An array in memory let values: Array = [10, 100, 100] }\n} All elements of arrays are always initialized, and access to an array is always bounds-checked in safe methods and operators.","breadcrumbs":"Specification (WIP) » Type System » Types » Array Types » Array types","id":"192","title":"Array types"},"193":{"body":"A struct type is the type denoted by the name of an struct item . A struct type is a heterogeneous product of other types, called the fields of the type. New instances of a struct can be constructed with a struct expression . Struct types are either stored in storage or memory but are never stored directly on the stack. Examples: struct Rectangle { pub width: u256 pub length: u256\n} contract Example { // A Rectangle in storage area: Rectangle fn do_something() { let length: u256 = 20 // A rectangle in memory let square: Rectangle = Rectangle(width: 10, length) }\n} All fields of struct types are always initialized. The data layout of a struct is not part of its external API and may be changed in any release. The fields of a struct may be qualified by visibility modifiers , to allow access to data in a struct outside a module.","breadcrumbs":"Specification (WIP) » Type System » Types » Struct Types » Struct types","id":"193","title":"Struct types"},"194":{"body":"An enum type is the type denoted by the name of an enum item .","breadcrumbs":"Specification (WIP) » Type System » Types » Enum Types » Enum types","id":"194","title":"Enum types"},"195":{"body":"The address type represents a 20 byte Ethereum address. Example: contract Example { // An address in storage someone: address fn do_something() { // A plain address (not part of a tuple, struct etc) remains on the stack let dai_contract: address = 0x6b175474e89094c44da98b954eedeac495271d0f }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Address Type » Address Type","id":"195","title":"Address Type"},"196":{"body":"The type Map is used to associate key values with data. The following types can be used as key: unit type boolean type address type numeric types The values can be of any type including other maps, structs , tuples or arrays . Example: contract Foo { bar: Map> baz: Map> pub fn read_bar(self, a: address, b: address) -> u256 { return self.bar[a][b] } pub fn write_bar(mut self, a: address, b: address, value: u256) { self.bar[a][b] = value } pub fn read_baz(self, a: address, b: u256) -> bool { return self.baz[a][b] } pub fn write_baz(mut self, a: address, b: u256, value: bool) { self.baz[a][b] = value }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » Map Type » Map type","id":"196","title":"Map type"},"197":{"body":"A value of type String represents a sequence of unsigned bytes with the assumption that the data is valid UTF-8. The String type is generic over a constant value that has to be an integer literal. That value N constraints the maximum number of bytes that are available for storing the string's characters. Note that the value of N does not restrict the type to hold exactly that number of bytes at all times which means that a type such as String<10> can hold a short word such as \"fox\" but it can not hold a full sentence such as \"The brown fox jumps over the white fence\". Example: contract Foo { fn bar() { let single_byte_string: String<1> = \"a\" let longer_string: String<100> = \"foo\" }\n}","breadcrumbs":"Specification (WIP) » Type System » Types » String Type » String Type","id":"197","title":"String Type"},"198":{"body":"TBW","breadcrumbs":"Specification (WIP) » Type System » Types » Unit Type » Unit type","id":"198","title":"Unit type"},"199":{"body":"TBW","breadcrumbs":"Specification (WIP) » Type System » Types » Function Type » Function Types","id":"199","title":"Function Types"},"2":{"body":"Fe is for anyone that develops using the EVM ! Fe compiles to EVM bytecode that can be deployed directly onto Ethereum and EVM-equivalent blockchains. Fe's syntax will feel familiar to Rust and Python developers. Here's what a minimal contract looks like in Fe: contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg }\n}","breadcrumbs":"Introduction » Who is Fe for?","id":"2","title":"Who is Fe for?"},"20":{"body":"Well done! You have now written and compiled a Fe contract and deployed it to both a local blockchain and a live public test network! You also learned how to interact with the deployed contract using transactions and calls. Here's some ideas for what you could do next: Experiment with different developer tooling Get more comfortable with Foundry by exploring the documentation Repeat the steps in this guide but for a more complex contract - be creative! Continue to the Using Fe pages to explore Fe more deeply.","breadcrumbs":"Quickstart » Deploying a contract to a testnet » Summary","id":"20","title":"Summary"},"200":{"body":"There are three places where data can be stored on the EVM: stack : 256-bit values placed on the stack that are loaded using DUP operations. storage : 256-bit address space where 256-bit values can be stored. Accessing higher storage slots does not increase gas cost. memory : 256-bit address space where 256-bit values can be stored. Accessing higher memory slots increases gas cost. Each data type can be stored in these locations. How data is stored is described in this section.","breadcrumbs":"Specification (WIP) » Data Layout » Data Layout","id":"200","title":"Data Layout"},"201":{"body":"The following can be stored on the stack: base type values pointers to reference type values The size of each value stored on the stack must not exceed 256 bits. Since all base types are less than or equal to 256 bits in size, we store them on the stack. Pointers to values stored in memory or storage may also be stored on the stack. Example: fn f() { let foo: u256 = 42 // foo is stored on the stack let bar: Array = [0; 100] // bar is a memory pointer stored on the stack\n}","breadcrumbs":"Specification (WIP) » Data Layout » Stack » Stack","id":"201","title":"Stack"},"202":{"body":"All data types can be stored in storage.","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Storage","id":"202","title":"Storage"},"203":{"body":"Storage pointers for constant size values are determined at compile time. Example: contract Cats { population: u256 // assigned a static location by the compiler\n} The value of a base type in storage is found by simply loading the value from storage at the given pointer. To find an element inside of a sequence type, the relative location of the element is added to the given pointer.","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Constant size values in storage » Constant size values in storage","id":"203","title":"Constant size values in storage"},"204":{"body":"Maps are not assigned pointers, because they do not have a location in storage. They are instead assigned a nonce that is used to derive the location of keyed values during runtime. Example: contract Foo { bar: Map // bar is assigned a static nonce by the compiler baz: Map> // baz is assigned a static nonce by the compiler\n} The expression bar[0x00] would resolve to the hash of both bar's nonce and the key value .i.e. keccak256(, 0x00). Similarly, the expression baz[0x00][0x01] would resolve to a nested hash i.e. keccak256(keccak256(, 0x00), 0x01).","breadcrumbs":"Specification (WIP) » Data Layout » Storage » Maps in storage » Maps in storage","id":"204","title":"Maps in storage"},"205":{"body":"Reference type values can be copied from storage and into memory using the to_mem function. Example: let my_array_var: Array = self.my_array_field.to_mem()","breadcrumbs":"Specification (WIP) » Data Layout » Storage » to_mem() function » The to_mem function","id":"205","title":"The to_mem function"},"206":{"body":"Only sequence types can be stored in memory. The first memory slot (0x00) is used to keep track of the lowest available memory slot. Newly allocated segments begin at the value given by this slot. When more memory has been allocated, the value stored in 0x00 is increased. We do not free memory after it is allocated.","breadcrumbs":"Specification (WIP) » Data Layout » Memory » Memory","id":"206","title":"Memory"},"207":{"body":"Sequence type values may exceed the 256-bit stack slot size, so we store them in memory and reference them using pointers kept on the stack. Example: fn f() { let foo: Array = [0; 100] // foo is a pointer that references 100 * 256 bits in memory.\n} To find an element inside of a sequence type, the relative location of the element is added to the given pointer.","breadcrumbs":"Specification (WIP) » Data Layout » Memory » Sequence types in memory » Sequence types in memory","id":"207","title":"Sequence types in memory"},"208":{"body":"You can contribute to Fe!","breadcrumbs":"Contributing » Contributing","id":"208","title":"Contributing"},"209":{"body":"","breadcrumbs":"Contributing » Ways to contribute:","id":"209","title":"Ways to contribute:"},"21":{"body":"Welcome to the Fe user guide! Here you can find information about how to use Fe to develop smart contracts. Read more about: Installing Fe organizing your code using projects We are still building this section of the site, but you can expect to find other materials such as reference documentation, project examples and walkthrough guides here soon!","breadcrumbs":"Using Fe » User guide","id":"21","title":"User guide"},"210":{"body":"If you find problems with Fe you can report them to the development team on the project Github . You are also welcome to work on existing issues, especially any tagged good first issue on the project issue board.","breadcrumbs":"Contributing » 1. Reporting or fixing issues.","id":"210","title":"1. Reporting or fixing issues."},"211":{"body":"We always appreciate improvements to the project documentation. This could be fixing any bugs you find, adding some detail to a description or explanation or developing a new user guide. To add to the docs you can fork the Fe Github repository and make updates in the /docs directory. You can build and serve locally using mdbook build && mdbook serve. Then, when you are happy with your changes you can raise a pull request to the main repository.","breadcrumbs":"Contributing » 2. Improving the docs.","id":"211","title":"2. Improving the docs."},"212":{"body":"You are also welcome to work on Fe itself. There are many opportunities to help build the language, for example working on the compiler or the language specification, adding tests or developing tooling. It is a good idea to connect with the existing Fe community to find out what are the priority areas that need attention and to discuss your idea in context before putting time into it. You can find Fe developers on the Discord or you can use the Github issue board . Please note that there has been a substantial amount of work done on the fe-v2 branch of the repository that includes breaking changes. When merged fe-v2 will revert new contributions based on master. To make your work v2 ready you can build off the fe-v2 branch. It is recommended to seek out issues tagged v2 in the Github Issue board.","breadcrumbs":"Contributing » 3. Developing Fe","id":"212","title":"3. Developing Fe"},"213":{"body":"We appreciate help answering questions on the Discord and other platforms such as Stack Exchange or Twitter. Please note that this project has a Code of Conduct . By participating in this project — in the issues, pull requests, or Discord channel — you agree to abide by its terms.","breadcrumbs":"Contributing » 4. Community engagement","id":"213","title":"4. Community engagement"},"214":{"body":"","breadcrumbs":"Contributing » Processes","id":"214","title":"Processes"},"215":{"body":"To report an issue, please use the Github issue board . When reporting issues, please mention the following details: Fe version. your operating system. the steps required to reproduce the issue actual vs expected behaviour any error messages or relevant logs the specific source code where the issue originates The appropriate place for technical discussions about the language itself is the Fe Discord .","breadcrumbs":"Contributing » Reporting issues","id":"215","title":"Reporting issues"},"216":{"body":"Please fork the Fe repository and raise pull requests against the master branch. Your commit messages should be concise and explain the changes made. Your pull request description should explain why the changes were made and list the specific changes. If you have to pull in changes from master to your fork (e.g. to resolve merge conflicts), please use git rebase rather than git merge. New features should be accompanied by appropriate tests. Finally, please make sure you respect the coding style for this project. Thank you for contributing to Fe!","breadcrumbs":"Contributing » Rasing Pull Requests","id":"216","title":"Rasing Pull Requests"},"217":{"body":"🖥️ Download Binaries 📄 Draft Spec ℹ️ Getting Started Fe is moving fast. Read up on all the latest improvements.","breadcrumbs":"Release Notes » Release Notes","id":"217","title":"Release Notes"},"218":{"body":"","breadcrumbs":"Release Notes » 0.26.0 \"Zircon\" (2023-11-03)","id":"218","title":"0.26.0 \"Zircon\" (2023-11-03)"},"219":{"body":"Give option to produce runtime bytecode as compilation artifact Previously, the compiler could only produce the bytecode that is used for the deployment of the contract. Now it can also produce the runtime bytecode which is the bytecode that is saved to storage. Being able to obtain the runtime bytecode is useful for contract verification. To obtain the runtime bytecode use the runtime-bytecode option of the --emit flag (multiple options allowed). Example Output: mycontract.bin (bytecode for deployment) mycontract.runtime.bin (runtime bytecode) ( #947 ) New verify command to verify onchain contracts against local source code. People need to be able to verify that a deployed contract matches the source code that the author claims was used to deploy it. Previously, there was no simple way to achieve this. These are the steps to verify a contract with the verify command: Obtain the project's source code locally. Ensure it is the same source code that was used to deploy the contract. (e.g. check out a specific tag) From the project directory run fe verify Example: $ fe verify 0xf0adbb9ed4135d1509ad039505bada942d18755f https://example-eth-mainnet-rpc.com\nIt's a match!✨ Onchain contract:\nAddress: 0xf0adbb9ed4135d1509ad039505bada942d18755f\nBytecode: 0x60008..76b90 Local contract:\nContract name: SimpleDAO\nSource file: /home/work/ef/simple_dao/fe_contracts/simpledao/src/main.fe\nBytecode: 0x60008..76b90 Hint: Run with --verbose to see the contract's source code. ( #948 )","breadcrumbs":"Release Notes » Features","id":"219","title":"Features"},"22":{"body":"At this point Fe is available for Linux and MacOS natively but can also be installed on Windows via WSL . Note: If you happen to be a Windows developer, consider getting involved and help us to support the Windows platform natively. Here would be a good place to start. On a computer with MacOS and an ARM chip, you need to install Rosetta, Apple's x86-to-ARM translator, to be able to run the executable. /usr/sbin/softwareupdate --install-rosetta --agree-to-license","breadcrumbs":"Using Fe » Installation » Installation","id":"22","title":"Installation"},"220":{"body":"Added a new page on EVM precompiles ( #944 )","breadcrumbs":"Release Notes » Improved Documentation","id":"220","title":"Improved Documentation"},"221":{"body":"","breadcrumbs":"Release Notes » 0.25.0 \"Yoshiokaite\" (2023-10-26)","id":"221","title":"0.25.0 \"Yoshiokaite\" (2023-10-26)"},"222":{"body":"Use the project root as default path for fe test Just run fe test from any directory of the project. ( #913 ) Completed std::buf::MemoryBuffer refactor. ( #917 ) Allow filtering tests to run via fe test --filter (self, mut _ val: T) -> u256 { return val.compute(val: 1000) }\n} contract Example { pub fn run_test(self) { let runner: Runner = Runner(); let mut mac: Mac = Mac(); assert runner.run(mac) == 1001 }\n} ( #865 ) The ctx parameter can now be passed into test functions. example: #test\nfn my_test(ctx: Context) { assert ctx.block_number() == 0\n} ( #880 ) The following has been added to the standard library: Memory buffer abstraction example: use std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter}\nuse std::traits::Max #test\nfn test_buf_rw() { let mut buf: MemoryBuffer = MemoryBuffer::new(len: 161) let mut writer: MemoryBufferWriter = buf.writer() let mut reader: MemoryBufferReader = buf.reader() writer.write(value: 42) writer.write(value: 42) writer.write(value: 26) writer.write(value: u8(26)) writer.write(value: u256::max()) writer.write(value: u128::max()) writer.write(value: u64::max()) writer.write(value: u32::max()) writer.write(value: u16::max()) writer.write(value: u8::max()) writer.write(value: u8(0)) assert reader.read_u256() == 42 assert reader.read_u256() == 42 assert reader.read_u256() == 26 assert reader.read_u8() == 26 assert reader.read_u256() == u256::max() assert reader.read_u128() == u128::max() assert reader.read_u64() == u64::max() assert reader.read_u32() == u32::max() assert reader.read_u16() == u16::max() assert reader.read_u8() == u8::max() assert reader.read_u8() == 0\n} Precompiles example: use std::precompiles\nuse std::buf::{MemoryBuffer, MemoryBufferReader, MemoryBufferWriter} #test\nfn test_ec_recover() { let result: address = precompiles::ec_recover( hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3, v: 28, r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608, s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada ) assert result == address(0x7156526fbd7a3c72969b54f64e42c10fbb768c8a)\n} ctx.raw_call() example: use std::buf::{ RawCallBuffer, MemoryBufferReader, MemoryBufferWriter\n}\nuse std::evm contract Foo { pub unsafe fn __call__() { if evm::call_data_load(offset: 0) == 42 { evm::mstore(offset: 0, value: 26) evm::return_mem(offset: 0, len: 32) } else if evm::call_data_load(offset: 0) == 26 { revert } }\n} #test\nfn test_raw_call(mut ctx: Context) { let foo: Foo = Foo.create(ctx, 0) let mut buf: RawCallBuffer = RawCallBuffer::new( input_len: 32, output_len: 32 ) let mut writer: MemoryBufferWriter = buf.writer() writer.write(value: 42) assert ctx.raw_call(addr: address(foo), value: 0, buf) let mut reader: MemoryBufferReader = buf.reader() assert reader.read_u256() == 26 assert not ctx.raw_call(addr: address(foo), value: 0, buf)\n} ( #885 )","breadcrumbs":"Release Notes » Features","id":"230","title":"Features"},"231":{"body":"Fixed an ICE when using aggregate types with aggregate type fields in public functions This code would previously cause an ICE: struct Tx { pub data: Array\n} contract Foo { pub fn bar(mut tx: Tx) {}\n} ( #867 ) Fixed a regression where the compiler would not reject a method call on a struct in storage. E.g. the follwing code should be rejected as it is missing a to_mem() call: struct Bar { pub x: u256 pub fn get_x(self) -> u256{ return self.x }\n} contract Foo { bar: Bar pub fn __init__(mut self) { self.bar = Bar( x: 2 ) } fn yay(self) { self.bar.get_x() }\n} The compiler will now reject the code and suggest a to_mem() before callingget_x(). ( #881 )","breadcrumbs":"Release Notes » Bugfixes","id":"231","title":"Bugfixes"},"232":{"body":"This is the first non-alpha release of Fe. Read our announcement for more details.","breadcrumbs":"Release Notes » 0.22.0 \"Vulcanite\" (2023-04-05)","id":"232","title":"0.22.0 \"Vulcanite\" (2023-04-05)"},"233":{"body":"Support for tests. example: #test\nfn my_test() { assert 26 + 16 == 42\n} Tests can be executed using the test subcommand. example: $ fe test foo.fe ( #807 ) Fixed broken trait orphan rule Fe has an orphan rule for Traits similar to Rust's that requires that either the trait or the type that we are implementing the trait for are located in the same ingot as the impl. This rule was implemented incorrectly so that instead of requiring them to be in the same ingot, they were required to be in the same module. This change fixes this so that the orphan rule is enforced correctly. ( #863 ) address values can now be specified with a number literal, with no explicit cast. So instead of let t: address = address(0xfe), one can now write let t: address = 0xfe. This also means that it's possible to define const addresses: const SOME_KNOWN_CONTRACT: address = 0xfefefefe ( #864 )","breadcrumbs":"Release Notes » Features","id":"233","title":"Features"},"234":{"body":"Fixed resolving of generic arguments to associated functions. For example, this code would previously crash the compiler: ... // This function doesn't take self pub fn run_static(_ val: T) -> u256 { return val.compute(val: 1000) }\n... // Invoking it would previously crash the compiler\nRunner::run_static(Mac())\n... ( #861 )","breadcrumbs":"Release Notes » Bugfixes","id":"234","title":"Bugfixes"},"235":{"body":"Changed the Deployment tutorial to use foundry and the Sepolia network ( #853 )","breadcrumbs":"Release Notes » Improved Documentation","id":"235","title":"Improved Documentation"},"236":{"body":"","breadcrumbs":"Release Notes » 0.21.0-alpha (2023-02-28)","id":"236","title":"0.21.0-alpha (2023-02-28)"},"237":{"body":"Support for Self type With this change Self (with capital S) can be used to refer to the enclosing type in contracts, structs, impls and traits. E.g. trait Min { fn min() -> Self;\n} impl Min for u8 { fn min() -> u8 { // Both `u8` or `Self` are valid here return 0 }\n} Usage: u8::min() ( #803 ) Added Min and Max traits to the std library. The std library implements the traits for all numeric types. Example use std::traits::{Min, Max}\n... assert u8::min() < u8::max()\n``` ([#836](https://github.com/ethereum/fe/issues/836)) Upgraded underlying solc compiler to version 0.8.18","breadcrumbs":"Release Notes » Features","id":"237","title":"Features"},"238":{"body":"the release contains minor bugfixes","breadcrumbs":"Release Notes » Bugfixes","id":"238","title":"Bugfixes"},"239":{"body":"","breadcrumbs":"Release Notes » 0.20.0-alpha (2022-12-05)","id":"239","title":"0.20.0-alpha (2022-12-05)"},"24":{"body":"Fe is distributed via a single executable file linked from the home page . In the future we will make sure it can be installed through a variety of popular package managers such as apt. Depending on your operating system, the file that you download is either named fe_amd64 or fe_mac. Note: We will rename the file to fe and assume that name for the rest of the guide. In the future when Fe can be installed via other mechanisms we can assume fe to become the canonical command name.","breadcrumbs":"Using Fe » Installation » Download the compiler","id":"24","title":"Download the compiler"},"240":{"body":"Removed the event type as well as the emit keyword. Instead the struct type now automatically implements the Emittable trait and can be emitted via ctx.emit(..). Indexed fields can be annotated via the #indexed attribute. E.g. struct Signed { book_msg: String<100>\n} contract GuestBook { messages: Map> pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg ctx.emit(Signed(book_msg)) }\n} ( #717 ) Allow to call trait methods on types when trait is in scope So far traits were only useful as bounds for generic functions. With this change traits can also be used as illustrated with the following example: trait Double { fn double(self) -> u256;\n} impl Double for (u256, u256) { fn double(self) -> u256 { return (self.item0 + self.item1) * 2 }\n} contract Example { pub fn run_test(self) { assert (0, 1).double() == 2 }\n} If a call turns out to be ambigious the compiler currently asks the user to disambiguate via renaming. In the future we will likely introduce a syntax to allow to disambiguate at the callsite. ( #757 ) Allow contract associated functions to be called via ContractName::function_name() syntax. ( #767 ) Add enum types and match statement. enum can now be defined, e.g., pub enum MyEnum { Unit Tuple(u32, u256, bool) fn unit() -> MyEnum { return MyEnum::Unit }\n} Also, match statement is introduced, e.g., pub fn eval_enum() -> u256{ match MyEnum { MyEnum::Unit => { return 0 } MyEnum::Tuple(a, _, false) => { return u256(a) } MyEnum::Tuple(.., true) => { return u256(1) } }\n} For now, available patterns are restricted to Wildcard(_), which matches all patterns: _ Named variable, which matches all patterns and binds the value to make the value usable in the arm. e.g., a, b and c in MyEnum::Tuple(a, b, c) Boolean literal(true and false) Enum variant. e.g., MyEnum::Tuple(a, b, c) Tuple pattern. e.g., (a, b, c) Struct pattern. e.g., MyStruct {x: x1, y: y1, b: true} Rest pattern(..), which matches the rest of the pattern. e.g., MyEnum::Tuple(.., true) Or pattern(|). e.g., MyEnum::Unit | MyEnum::Tuple(.., true) Fe compiler performs the exhaustiveness and usefulness checks for match statement. So the compiler will emit an error when all patterns are not covered or an unreachable arm are detected. ( #770 ) Changed comments to use // instead of # ( #776 ) Added the mut keyword, to mark things as mutable. Any variable or function parameter not marked mut is now immutable. contract Counter { count: u256 pub fn increment(mut self) -> u256 { // `self` is mutable, so storage can be modified self.count += 1 return self.count }\n} struct Point { pub x: u32 pub y: u32 pub fn add(mut self, _ other: Point) { self.x += other.x self.y += other.y // other.x = 1000 // ERROR: `other` is not mutable }\n} fn pointless() { let origin: Point = Point(x: 0, y: 0) // origin.x = 10 // ERROR: origin is not mutable let x: u32 = 10 // x_coord = 100 // ERROR: `x_coord` is not mutable let mut y: u32 = 0 y = 10 // OK let mut p: Point = origin // copies `origin` p.x = 10 // OK, doesn't modify `origin` let mut q: Point = p // copies `p` q.x = 100 // doesn't modify `p` p.add(q) assert p.x == 110\n} Note that, in this release, primitive type function parameters can't be mut. This restriction might be lifted in a future release. For example: fn increment(mut x: u256) { // ERROR: primitive type parameters can't be mut x += 1\n} ( #777 ) The contents of the std::prelude module (currently just the Context struct) are now automatically used by every module, so use std::context::Context is no longer required. ( #779 ) When the Fe compiler generates a JSON ABI file for a contract, the \"stateMutability\" field for each function now reflects whether the function can read or modify chain or contract state, based on the presence or absence of the self and ctx parameters, and whether those parameters are mutable. If a function doesn't take self or ctx, it's \"pure\". If a function takes self or ctx immutably, it can read state but not mutate state, so it's a \"view\" If a function takes mut self or mut ctx, it can mutate state, and is thus marked \"payable\". Note that we're following the convention set by Solidity for this field, which isn't a perfect fit for Fe. The primary issue is that Fe doesn't currently distinguish between \"payable\" and \"nonpayable\" functions; if you want a function to revert when Eth is sent, you need to do it manually (eg assert ctx.msg_value() == 0). ( #783 ) Trait associated functions This change allows trait functions that do not take a self parameter. The following demonstrates a possible trait associated function and its usage: trait Max { fn max(self) -> u8;\n} impl Max for u8 { fn max() -> u8 { return u8(255) }\n} contract Example { pub fn run_test(self) { assert u8::max() == 255 }\n} ( #805 )","breadcrumbs":"Release Notes » Features","id":"240","title":"Features"},"241":{"body":"Fix issue where calls to assiciated functions did not enforce visibility rules. E.g the following code should be rejected but previously wasn't: struct Foo { fn do_private_things() { }\n} contract Bar { fn test() { Foo::do_private_things() }\n} With this change, the above code is now rejected because do_private_things is not pub. ( #767 ) Padding on bytes and string ABI types is zeroed out. ( #769 ) Ensure traits from other modules or even ingots can be implemented ( #773 ) Certain cases where the compiler would not reject pure functions being called on instances are now properly rejected. ( #775 ) Reject calling to_mem() on primitive types in storage ( #801 ) Disallow importing private type via use The following was previously allowed but will now error: use foo::PrivateStruct ( #815 )","breadcrumbs":"Release Notes » Bugfixes","id":"241","title":"Bugfixes"},"242":{"body":"","breadcrumbs":"Release Notes » 0.19.1-alpha \"Sunstone\" (2022-07-06)","id":"242","title":"0.19.1-alpha \"Sunstone\" (2022-07-06)"},"243":{"body":"Support returning nested struct. Example: pub struct InnerStruct { pub inner_s: String<10> pub inner_x: i256\n} pub struct NestedStruct { pub inner: InnerStruct pub outer_x: i256\n} contract Foo { pub fn return_nested_struct() -> NestedStruct { ... }\n} ( #635 ) Made some small changes to how the Context object is used. ctx is not required when casting an address to a contract type. Eg let foo: Foo = Foo(address(0)) ctx is required when calling an external contract function that requires ctx Example: use std::context::Context // see issue #679 contract Foo { pub fn emit_stuff(ctx: Context) { emit Stuff(ctx) # will be `ctx.emit(Stuff{})` someday }\n}\ncontract Bar { pub fn call_foo_emit_stuff(ctx: Context) { Foo(address(0)).emit_stuff(ctx) }\n}\nevent Stuff {} ( #703 ) Braces! Fe has abandoned python-style significant whitespace in favor of the trusty curly brace. In addition, elif is now spelled else if, and the pass statement no longer exists. Example: pub struct SomeError {} contract Foo { x: u8 y: u16 pub fn f(a: u8) -> u8 { if a > 10 { let x: u8 = 5 return a + x } else if a == 0 { revert SomeError() } else { return a * 10 } } pub fn noop() {}\n} ( #707 ) traits and generic function parameter Traits can now be defined, e.g: trait Computable { fn compute(self, val: u256) -> u256;\n} The mechanism to implement a trait is via an impl block e.g: struct Linux { pub counter: u256 pub fn get_counter(self) -> u256 { return self.counter } pub fn something_static() -> u256 { return 5 }\n} impl Computable for Linux { fn compute(self, val: u256) -> u256 { return val + Linux::something_static() + self.get_counter() }\n} Traits can only appear as bounds for generic functions e.g.: struct Runner { pub fn run(self, _ val: T) -> u256 { return val.compute(val: 1000) }\n} Only struct functions (not contract functions) can have generic parameters. The run method of Runner can be called with any type that implements Computable e.g. contract Example { pub fn generic_compute(self) { let runner: Runner = Runner(); assert runner.run(Mac()) == 1001 assert runner.run(Linux(counter: 10)) == 1015 }\n} ( #710 ) Generate artifacts for all contracts of an ingot, not just for contracts that are defined in main.fe ( #726 ) Allow using complex type as array element type. Example: contract Foo { pub fn bar() -> i256 { let my_array: Array = [Pair::new(1, 0), Pair::new(2, 0), Pair::new(3, 0)] let sum: i256 = 0 for pair in my_array { sum += pair.x } return sum }\n} struct Pair { pub x: i256 pub y: i256 pub fn new(_ x: i256, _ y: i256) -> Pair { return Pair(x, y) }\n} ( #730 ) The fe CLI now has subcommands: fe new myproject - creates a new project structure fe check . - analyzes fe source code and prints errors fe build . - builds a fe project ( #732 ) Support passing nested struct types to public functions. Example: pub struct InnerStruct { pub inner_s: String<10> pub inner_x: i256\n} pub struct NestedStruct { pub inner: InnerStruct pub outer_x: i256\n} contract Foo { pub fn f(arg: NestedStruct) { ... }\n} ( #733 ) Added support for repeat expressions ([VALUE; LENGTH]). e.g. let my_array: Array = [bool; 42] Also added checks to ensure array and struct types are initialized. These checks are currently performed at the declaration site, but will be loosened in the future. ( #747 )","breadcrumbs":"Release Notes » Features","id":"243","title":"Features"},"244":{"body":"Fix a bug that incorrect instruction is selected when the operands of a comp instruction are a signed type. ( #734 ) Fix issue where a negative constant leads to an ICE E.g. the following code would previously crash the compiler but shouldn't: const INIT_VAL: i8 = -1\ncontract Foo { pub fn init_bar() { let x: i8 = INIT_VAL }\n} ( #745 ) Fix a bug that causes ICE when nested if-statement has multiple exit point. E.g. the following code would previously crash the compiler but shouldn't: pub fn foo(self) { if true { if self.something { return } } if true { if self.something { return } }\n} ( #749 )","breadcrumbs":"Release Notes » Bugfixes","id":"244","title":"Bugfixes"},"245":{"body":"","breadcrumbs":"Release Notes » 0.18.0-alpha \"Ruby\" (2022-05-27)","id":"245","title":"0.18.0-alpha \"Ruby\" (2022-05-27)"},"246":{"body":"Added support for parsing of attribute calls with generic arguments (e.g. foo.bar()). ( #719 )","breadcrumbs":"Release Notes » Features","id":"246","title":"Features"},"247":{"body":"Fix a regression where the stateMutability field would not be included in the generated ABI ( #722 ) Fix two regressions introduced in 0.17.0 Properly lower right shift operation to yul's sar if operand is signed type Properly lower negate operation to call safe_sub ( #723 )","breadcrumbs":"Release Notes » Bugfixes","id":"247","title":"Bugfixes"},"248":{"body":"","breadcrumbs":"Release Notes » 0.17.0-alpha \"Quartz\" (2022-05-26)","id":"248","title":"0.17.0-alpha \"Quartz\" (2022-05-26)"},"249":{"body":"Support for underscores in numbers to improve readability e.g. 100_000. Example let num: u256 = 1000_000_000_000 ( #149 ) Optimized access of struct fields in storage ( #249 ) Unit type () is now ABI encodable ( #442 ) Temporary default stateMutability to payable in ABI The ABI metadata that the compiler previously generated did not include the stateMutability field. This piece of information is important for tooling such as hardhat because it determines whether a function needs to be called with or without sending a transaction. As soon as we have support for mut self and mut ctx we will be able to derive that information from the function signature. In the meantime we now default to payable. ( #705 )","breadcrumbs":"Release Notes » Features","id":"249","title":"Features"},"25":{"body":"In order to be able to execute the Fe compiler we will have to make the file executable . This can be done by navigating to the directory where the file is located and executing chmod + x (e.g. chmod +x fe). After we have set the proper permissions we should be able to run ./fe and an output that should be roughly comparable to: fe 0.21.0-alpha\nThe Fe Developers \nAn implementation of the Fe smart contract language USAGE: fe_amd64_latest OPTIONS: -h, --help Print help information -V, --version Print version information SUBCOMMANDS: build Build the current project check Analyze the current project and report errors, but don't build artifacts help Print this message or the help of the given subcommand(s) new Create new fe project","breadcrumbs":"Using Fe » Installation » Add permission to execute","id":"25","title":"Add permission to execute"},"250":{"body":"Fixed a crash caused by certain memory to memory assignments. E.g. the following code would previously lead to a compiler crash: my_struct.x = my_struct.y ( #590 ) Reject unary minus operation if the target type is an unsigned integer number. Code below should be reject by fe compiler: contract Foo: pub fn bar(self) -> u32: let unsigned: u32 = 1 return -unsigned pub fn foo(): let a: i32 = 1 let b: u32 = -a ( #651 ) Fixed crash when passing a struct that contains an array E.g. the following would previously result in a compiler crash: struct MyArray: pub x: Array contract Foo: pub fn bar(my_arr: MyArray): pass ( #681 ) reject infinite size struct definitions. Fe structs having infinite size due to recursive definitions were not rejected earlier and would cause ICE in the analyzer since they were not properly handled. Now structs having infinite size are properly identified by detecting cycles in the dependency graph of the struct field definitions and an error is thrown by the analyzer. ( #682 ) Return instead of revert when contract is called without data. If a contract is called without data so that no function is invoked, we would previously revert but that would leave us without a way to send ETH to a contract so instead it will cause a return now. ( #694 ) Resolve compiler crash when using certain reserved YUL words as struct field names. E.g. the following would previously lead to a compiler crash because numer is a reserved keyword in YUL. struct Foo: pub number: u256 contract Meh: pub fn yay() -> Foo: return Foo(number:2) ( #709 )","breadcrumbs":"Release Notes » Bugfixes","id":"250","title":"Bugfixes"},"251":{"body":"","breadcrumbs":"Release Notes » 0.16.0-alpha (2022-05-05)","id":"251","title":"0.16.0-alpha (2022-05-05)"},"252":{"body":"Change static function call syntax from Bar.foo() to Bar::foo() ( #241 ) Added support for retrieving the base fee via ctx.base_fee() ( #503 )","breadcrumbs":"Release Notes » Features","id":"252","title":"Features"},"253":{"body":"Resolve functions on structs via path (e.g. bi::ba::bums()) ( #241 )","breadcrumbs":"Release Notes » Bugfixes","id":"253","title":"Bugfixes"},"254":{"body":"","breadcrumbs":"Release Notes » 0.15.0-alpha (2022-04-04)","id":"254","title":"0.15.0-alpha (2022-04-04)"},"255":{"body":"Labels are now required on function arguments. Labels can be omitted if the argument is a variable with a name that matches the label, or if the function definition specifies that an argument should have no label. Functions often take several arguments of the same type; compiler-checked labels can help prevent accidentally providing arguments in the wrong order. Example: contract CoolCoin: balance: Map loans: Map<(address, address), i256> pub fn demo(self, ann: address, bob: address): let is_loan: bool = false self.give(from: ann, to: bob, 100, is_loan) fn transfer(self, from sender: address, to recipient: address, _ val: u256, is_loan: bool): self.cred[sender] -= val self.cred[recipient] += val if is_loan: self.loans[(sender, recipient)] += val Note that arguments must be provided in the order specified in the function definition. A parameter's label defaults to the parameter name, but can be changed by specifying a different label to the left of the parameter name. Labels should be clear and convenient for the caller, while parameter names are only used in the function body, and can thus be longer and more descriptive. In the example above, we choose to use sender and recipient as identifiers in the body of fn transfer, but use labels from: and to:. In cases where it's ideal to not have labels, e.g. if a function takes a single argument, or if types are sufficient to differentiate between arguments, use _ to specify that a given parameter has no label. It's also fine to require labels for some arguments, but not others. Example: fn add(_ x: u256, _ y: u256) -> u256: return x + y contract Foo: fn transfer(self, _ to: address, wei: u256): pass pub fn demo(self): transfer(address(0), wei: add(1000, 42)) ( #397 )","breadcrumbs":"Release Notes » Features","id":"255","title":"Features"},"256":{"body":"The region of memory used to compute the slot of a storage map value was not being allocated. ( #684 )","breadcrumbs":"Release Notes » Bugfixes","id":"256","title":"Bugfixes"},"257":{"body":"","breadcrumbs":"Release Notes » 0.14.0-alpha (2022-03-02)","id":"257","title":"0.14.0-alpha (2022-03-02)"},"258":{"body":"Events can now be defined outside of contracts. Example: event Transfer: idx sender: address idx receiver: address value: u256 contract Foo: fn transferFoo(to: address, value: u256): emit Transfer(sender: msg.sender, receiver: to, value) contract Bar: fn transferBar(to: address, value: u256): emit Transfer(sender: msg.sender, receiver: to, value) ( #80 ) The Fe standard library now includes a std::evm module, which provides functions that perform low-level evm operations. Many of these are marked unsafe, and thus can only be used inside of an unsafe function or an unsafe block. Example: use std::evm::{mstore, mload} fn memory_shenanigans(): unsafe: mstore(0x20, 42) let x: u256 = mload(0x20) assert x == 42 The global functions balance and balance_of have been removed; these can now be called as std::evm::balance(), etc. The global function send_value has been ported to Fe, and is now available as std::send_value. ( #629 ) Support structs that have non-base type fields in storage. Example: struct Point: pub x: u256 pub y: u256 struct Bar: pub name: String<3> pub numbers: Array pub point: Point pub something: (u256, bool) contract Foo: my_bar: Bar pub fn complex_struct_in_storage(self) -> String<3>: self.my_bar = Bar( name: \"foo\", numbers: [1, 2], point: Point(x: 100, y: 200), something: (1, true), ) # Asserting the values as they were set initially assert self.my_bar.numbers[0] == 1 assert self.my_bar.numbers[1] == 2 assert self.my_bar.point.x == 100 assert self.my_bar.point.y == 200 assert self.my_bar.something.item0 == 1 assert self.my_bar.something.item1 # We can change the values of the array self.my_bar.numbers[0] = 10 self.my_bar.numbers[1] = 20 assert self.my_bar.numbers[0] == 10 assert self.my_bar.numbers[1] == 20 # We can set the array itself self.my_bar.numbers = [1, 2] assert self.my_bar.numbers[0] == 1 assert self.my_bar.numbers[1] == 2 # We can change the values of the Point self.my_bar.point.x = 1000 self.my_bar.point.y = 2000 assert self.my_bar.point.x == 1000 assert self.my_bar.point.y == 2000 # We can set the point itself self.my_bar.point = Point(x=100, y=200) assert self.my_bar.point.x == 100 assert self.my_bar.point.y == 200 # We can change the value of the tuple self.my_bar.something.item0 = 10 self.my_bar.something.item1 = false assert self.my_bar.something.item0 == 10 assert not self.my_bar.something.item1 # We can set the tuple itself self.my_bar.something = (1, true) assert self.my_bar.something.item0 == 1 assert self.my_bar.something.item1 return self.my_bar.name.to_mem() ( #636 ) Features that read and modify state outside of contracts are now implemented on a struct named \"Context\". Context is included in the standard library and can be imported with use std::context::Context. Instances of Context are created by calls to public functions that declare it in the signature or by unsafe code. Basic example: use std::context::Context contract Foo: my_num: u256 pub fn baz(ctx: Context) -> u256: return ctx.block_number() pub fn bing(self, new_num: u256) -> u256: self.my_num = new_num return self.my_num contract Bar: pub fn call_baz(ctx: Context, foo_addr: address) -> u256: # future syntax: `let foo = ctx.load(foo_addr)` let foo: Foo = Foo(ctx, foo_addr) return foo.baz() pub fn call_bing(ctx: Context) -> u256: # future syntax: `let foo = ctx.create(0)` let foo: Foo = Foo.create(ctx, 0) return foo.bing(42) Example with __call__ and unsafe block: use std::context::Context\nuse std::evm contract Foo: pub fn __call__(): unsafe: # creating an instance of `Context` is unsafe let ctx: Context = Context() let value: u256 = u256(bar(ctx)) # return `value` evm::mstore(0, value) evm::return_mem(0, 32) fn bar(ctx: Context) -> address: return ctx.self_address() ( #638 )","breadcrumbs":"Release Notes » Features","id":"258","title":"Features"},"259":{"body":"","breadcrumbs":"Release Notes » Features","id":"259","title":"Features"},"26":{"body":"You can also build Fe from the source code provided in our Github repository . To do this you will need to have Rust installed. Then, clone the github repository using: git clone https://github.com/ethereum/fe.git Depending on your environment you may need to install some additional packages before building the Fe binary, specifically libboost-all-dev, libclang and cmake. For example, on a Linux system: sudo apt-get update &&\\ apt-get install libboost-all-dev &&\\ apt-get install libclang-dev &&\\ apt-get install cmake Navigate to the folder containing the Fe source code. cd fe Now, use Rust to build the Fe binary. To run Fe, you need to build using solc-backend. cargo build -r --feature solc-backend You will now find your Fe binary in /target/release. Check the build with: ./target/release/fe --version If everything worked, you should see the Fe version printed to the terminal: fe 0.24.0 You can run the built-in tests using: cargo test --workspace --features solc-backend","breadcrumbs":"Using Fe » Installation » Building from source","id":"26","title":"Building from source"},"260":{"body":"Example: contract Foo: pub fn bar(): const LOCAL_CONST: i32 = 1","breadcrumbs":"Release Notes » Support local constant","id":"260","title":"Support local constant"},"261":{"body":"Example: const GLOBAL: i32 = 8 contract Foo: pub fn bar(): const LOCAL: i32 = GLOBAL * 8","breadcrumbs":"Release Notes » Support constant expression","id":"261","title":"Support constant expression"},"262":{"body":"Example: const GLOBAL: u256= 8\nconst USE_GLOBAL: bool = false\ntype MY_ARRAY = Array contract Foo: pub fn bar(): let my_array: Array","breadcrumbs":"Release Notes » Support constant generics expression","id":"262","title":"Support constant generics expression"},"263":{"body":"","breadcrumbs":"Release Notes » Bug fixes","id":"263","title":"Bug fixes"},"264":{"body":"Example: const GLOBAL: i32 = \"FOO\" contract Foo: pub fn bar(): let FOO: i32 = GLOBAL","breadcrumbs":"Release Notes » Fix ICE when constant type is mismatch","id":"264","title":"Fix ICE when constant type is mismatch"},"265":{"body":"Example: const BAR: i32 = 1 contract FOO: pub fn bar(): BAR = 10 ( #649 ) Argument label syntax now uses : instead of =. Example: struct Foo: x: u256 y: u256 let x: MyStruct = MyStruct(x: 10, y: 11)\n# previously: MyStruct(x = 10, y = 11) ( #665 ) Support module-level pub modifier, now default visibility of items in a module is private. Example: # This constant can be used outside of the module.\npub const PUBLIC:i32 = 1 # This constant can NOT be used outside of the module.\nconst PRIVATE: i32 = 1 ( #677 )","breadcrumbs":"Release Notes » Fix ICE when assigning value to constant twice","id":"265","title":"Fix ICE when assigning value to constant twice"},"266":{"body":"Source files are now managed by a (salsa) SourceDb. A SourceFileId now corresponds to a salsa-interned File with a path. File content is a salsa input function. This is mostly so that the future (LSP) language server can update file content when the user types or saves, which will trigger a re-analysis of anything that changed. An ingot's set of modules and dependencies are also salsa inputs, so that when the user adds/removes a file or dependency, analysis is rerun. Standalone modules (eg a module compiled with fe fee.fe) now have a fake ingot parent. Each Ingot has an IngotMode (Lib, Main, StandaloneModule), which is used to disallow ingot::whatever paths in standalone modules, and to determine the correct root module file. parse_module now always returns an ast::Module, and thus a ModuleId will always exist for a source file, even if it contains fatal parse errors. If the parsing fails, the body will end with a ModuleStmt::ParseError node. The parsing will stop at all but the simplest of syntax errors, but this at least allows partial analysis of source file with bad syntax. ModuleId::ast(db) is now a query that parses the module's file on demand, rather than the AST being interned into salsa. This makes handling parse diagnostics cleaner, and removes the up-front parsing of every module at ingot creation time. ( #628 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"266","title":"Internal Changes - for Fe Contributors"},"267":{"body":"","breadcrumbs":"Release Notes » 0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)","id":"267","title":"0.13.0-alpha (2022-01-31)## 0.13.0-alpha (2022-01-31)"},"268":{"body":"Support private fields on structs Public fields now need to be declared with the pub modifier, otherwise they default to private fields. If a struct contains private fields it can not be constructed directly except from within the struct itself. The recommended way is to implement a method new(...) as demonstrated in the following example. struct House: pub price: u256 pub size: u256 vacant: bool pub fn new(price: u256, size: u256) -> House return House(price=price, size=size, vacant=true) contract Manager: house: House pub fn create_house(price: u256, size: u256): self.house = House::new(price, size) let can_access_price: u256 = self.house.price # can not access `self.house.vacant` because the field is private ( #214 ) Support non-base type fields in structs Support is currently limited in two ways: Structs with complex fields can not be returned from public functions Structs with complex fields can not be stored in storage ( #343 ) Addresses can now be explicitly cast to u256. For example: fn f(addr: address) -> u256: return u256(addr) ( #621 ) A special function named __call__ can now be defined in contracts. The body of this function will execute in place of the standard dispatcher when the contract is called. example (with intrinsics): contract Foo: pub fn __call__(self): unsafe: if __calldataload(0) == 1: __revert(0, 0) else: __return(0, 0) ( #622 )","breadcrumbs":"Release Notes » Features","id":"268","title":"Features"},"269":{"body":"Fixed a crash that happend when using a certain unprintable ASCII char ( #551 ) The argument to revert wasn't being lowered by the compiler, meaning that some revert calls would cause a compiler panic in later stages. For example: const BAD_MOJO: u256 = 0xdeaddead struct Error: code: u256 fn fail(): revert Error(code = BAD_MOJO) ( #619 ) Fixed a regression where an empty list expression ([]) would lead to a compiler crash. ( #623 ) Fixed a bug where int array elements were not sign extended in their ABI encodings. ( #633 )","breadcrumbs":"Release Notes » Bugfixes","id":"269","title":"Bugfixes"},"27":{"body":"Fe is a new language and editor support is still in its early days. However, basic syntax highlighting is available for Visual Studio Code via this VS Code extension . In Visual Studio Code open the extension sidebar (Ctrl-Shift-P / Cmd-Shift-P, then \"Install Extension\") and search for fe-lang.code-ve. Click on the extension and then click on the Install button. We are currently working on a Language Server Protocol (LSP), which in the future will enable more advanced editor features such as code completion, go-to definition and refactoring.","breadcrumbs":"Using Fe » Installation » Editor support & Syntax highlighting","id":"27","title":"Editor support & Syntax highlighting"},"270":{"body":"","breadcrumbs":"Release Notes » 0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)","id":"270","title":"0.12.0-alpha (2021-12-31)## 0.12.0-alpha (2021-12-31)"},"271":{"body":"Added unsafe low-level \"intrinsic\" functions, that perform raw evm operations. For example: fn foo(): unsafe: __mtore(0, 5000) assert __mload(0) == 5000 The functions available are exactly those defined in yul's \"evm dialect\": https://docs.soliditylang.org/en/v0.8.11/yul.html#evm-dialect but with a double-underscore prefix. Eg selfdestruct -> __selfdestruct. These are intended to be used for implementing basic standard library functionality, and shouldn't typically be needed in normal contract code. Note: some intrinsic functions don't return a value (eg __log0); using these functions in a context that assumes a return value of unit type (eg let x: () = __log0(a, b)) will currently result in a compiler panic in the yul compilation phase. ( #603 ) Added an out of bounds check for accessing array items. If an array index is retrieved at an index that is not within the bounds of the array it now reverts with Panic(0x32). ( #606 )","breadcrumbs":"Release Notes » Features","id":"271","title":"Features"},"272":{"body":"Ensure ternary expression short circuit. Example: contract Foo: pub fn bar(input: u256) -> u256: return 1 if input > 5 else revert_me() fn revert_me() -> u256: revert return 0 Previous to this change, the code above would always revert no matter which branch of the ternary expressions it would resolve to. That is because both sides were evaluated and then one side was discarded. With this change, only the branch that doesn't get picked won't get evaluated at all. The same is true for the boolean operations and and or. ( #488 )","breadcrumbs":"Release Notes » Bugfixes","id":"272","title":"Bugfixes"},"273":{"body":"Added a globally available dummy std lib. This library contains a single get_42 function, which can be called using std::get_42(). Once low-level intrinsics have been added to the language, we can delete get_42 and start adding useful code. ( #601 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"273","title":"Internal Changes - for Fe Contributors"},"274":{"body":"","breadcrumbs":"Release Notes » 0.11.0-alpha \"Karlite\" (2021-12-02)","id":"274","title":"0.11.0-alpha \"Karlite\" (2021-12-02)"},"275":{"body":"Added support for multi-file inputs. Implementation details: Mostly copied Rust's crate system, but use the term ingot instead of crate. Below is an example of an ingot's file tree, as supported by the current implementation. `-- basic_ingot `-- src |-- bar | `-- baz.fe |-- bing.fe |-- ding | |-- dang.fe | `-- dong.fe `-- main.fe There are still a few features that will be worked on over the coming months: source files accompanying each directory module (e.g. my_mod.fe) configuration files and the ability to create library ingots test directories module-level pub modifier (all items in a module are public) mod statements (all fe files in the input tree are public modules) These things will be implemented in order of importance over the next few months. ( #562 ) The syntax for array types has changed to match other generic types. For example, u8[4] is now written Array. ( #571 ) Functions can now be defined on struct types. Example: struct Point: x: u64 y: u64 # Doesn't take `self`. Callable as `Point.origin()`. # Note that the syntax for this will soon be changed to `Point::origin()`. pub fn origin() -> Point: return Point(x=0, y=0) # Takes `self`. Callable on a value of type `Point`. pub fn translate(self, x: u64, y: u64): self.x += x self.y += y pub fn add(self, other: Point) -> Point: let x: u64 = self.x + other.x let y: u64 = self.y + other.y return Point(x, y) pub fn hash(self) -> u256: return keccak256(self.abi_encode()) pub fn do_pointy_things(): let p1: Point = Point.origin() p1.translate(5, 10) let p2: Point = Point(x=1, y=2) let p3: Point = p1.add(p2) assert p3.x == 6 and p3.y == 12 ( #577 )","breadcrumbs":"Release Notes » Features","id":"275","title":"Features"},"276":{"body":"Fixed a rare compiler crash. Example: let my_array: i256[1] = [-1 << 1] Previous to this fix, the given example would lead to an ICE. ( #550 ) Contracts can now create an instance of a contract defined later in a file. This issue was caused by a weakness in the way we generated yul. ( #596 )","breadcrumbs":"Release Notes » Bugfixes","id":"276","title":"Bugfixes"},"277":{"body":"File IDs are now attached to Spans. ( #587 ) The fe analyzer now builds a dependency graph of source code \"items\" (functions, contracts, structs, etc). This is used in the yulgen phase to determine which items are needed in the yul (intermediate representation) output. Note that the yul output is still cluttered with utility functions that may or may not be needed by a given contract. These utility functions are defined in the yulgen phase and aren't tracked in the dependency graph, so it's not yet possible to filter out the unused functions. We plan to move the definition of many of these utility functions into fe; when this happens they'll become part of the dependency graph and will only be included in the yul output when needed. The dependency graph will also enable future analyzer warnings about unused code. ( #596 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"277","title":"Internal Changes - for Fe Contributors"},"278":{"body":"","breadcrumbs":"Release Notes » 0.10.0-alpha (2021-10-31)","id":"278","title":"0.10.0-alpha (2021-10-31)"},"279":{"body":"Support for module level constants for base types Example: const TEN = 10 contract pub fn do_moon_math(self) -> u256: return 4711 * TEN The values of base type constants are always inlined. ( #192 ) Encode revert errors for ABI decoding as Error(0x103) not Panic(0x99) ( #492 ) Replaced import statements with use statements. Example: use foo::{bar::*, baz as baz26} Note: this only adds support for parsing use statements. ( #547 ) Functions can no be defined outside of contracts. Example: fn add_bonus(x: u256) -> u256: return x + 10 contract PointTracker: points: Map pub fn add_points(self, user: address, val: u256): self.points[user] += add_bonus(val) ( #566 ) Implemented a send_value(to: address, value_in_wei: u256) function. The function is similar to the sendValue function by OpenZeppelin with the differences being that: It reverts with Error(0x100) instead of Error(\"Address: insufficient balance\") to safe more gas. It uses selfbalance() instead of balance(address()) to safe more gas It reverts with Error(0x101) instead of Error(\"Address: unable to send value, recipient may have reverted\") also to safe more gas. ( #567 ) Added support for unsafe functions and unsafe blocks within functions. Note that there's currently no functionality within Fe that requires the use of unsafe, but we plan to add built-in unsafe functions that perform raw evm operations which will only callable within an unsafe block or function. ( #569 ) Added balance() and balance_of(account: address) methods. ( #572 ) Added support for explicit casting between numeric types. Example: let a: i8 = i8(-1)\nlet a1: i16 = i16(a)\nlet a2: u16 = u16(a1) assert a2 == u16(65535) let b: i8 = i8(-1)\nlet b1: u8 = u8(b)\nlet b2: u16 = u16(b1) assert b2 == u16(255) Notice that Fe allows casting between any two numeric types but does not allow to change both the sign and the size of the type in one step as that would leave room for ambiguity as the example above demonstrates. ( #576 )","breadcrumbs":"Release Notes » Features","id":"279","title":"Features"},"28":{"body":"A project is a collection of files containing Fe code and configuration data. Often, smart contract development can become too complex to contain all the necessary code inside a single file. In these cases, it is useful to organize your work into multiple files and directories. This allows you to group thematically linked code and selectively import the code you need when you need it.","breadcrumbs":"Using Fe » Using projects » Fe projects","id":"28","title":"Fe projects"},"280":{"body":"Adjust numeric values loaded from memory or storage Previous to this fix numeric values that were loaded from either memory or storage were not properly loaded on the stack which could result in numeric values not treated as intended. Example: contract Foo: pub fn bar() -> i8: let in_memory: i8[1] = [-3] return in_memory[0] In the example above bar() would not return -3 but 253 instead. ( #524 ) Propagate reverts from external contract calls. Before this fix the following code to should_revert() or should_revert2() would succeed even though it clearly should not. contract A: contract_b: B pub fn __init__(contract_b: address): self.contract_b = B(contract_b) pub fn should_revert(): self.contract_b.fail() pub fn should_revert2(): self.contract_b.fail_with_custom_error() struct SomeError: pass contract B: pub fn fail(): revert pub fn fail_with_custom_error(): revert SomeError() With this fix the revert errors are properly passed upwards the call hierachy. ( #574 ) Fixed bug in left shift operation. Example: Let's consider the value 1 as an u8 which is represented as the following 256 bit item on the EVM stack 00..|00000001|. A left shift of 8 bits (val << 8) turns that into 00..01|00000000|. Previous to this fix this resulted in the compiler taking 256 as the value for the u8 when clearly 256 is not even in the range of u8 anymore. With this fix the left shift operations was fixed to properly \"clean up\" the result of the shift so that 00..01|00000000| turns into 00..00|00000000|. ( #575 ) Ensure negation is checked and reverts with over/underflow if needed. Example: The minimum value for an i8 is -128 but the maximum value of an i8 is 127 which means that negating -128 should lead to an overflow since 128 does not fit into an i8. Before this fix, negation operations where not checked for over/underflow resulting in returning the oversized value. ( #578 )","breadcrumbs":"Release Notes » Bugfixes","id":"280","title":"Bugfixes"},"281":{"body":"In the analysis stage, all name resolution (of variable names, function names, type names, etc used in code) now happens via a single resolve_name pathway, so we can catch more cases of name collisions and log more helpful error messages. ( #555 ) Added a new category of tests: differential contract testing. Each of these tests is pased on a pair of contracts where one implementation is written in Fe and the other one is written in Solidity. The implementations should have the same public APIs and are assumed to always return identical results given equal inputs. The inputs are randomly generated using proptest and hence are expected to discover unknown bugs. ( #578 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"281","title":"Internal Changes - for Fe Contributors"},"282":{"body":"","breadcrumbs":"Release Notes » 0.9.0-alpha (2021-09-29)","id":"282","title":"0.9.0-alpha (2021-09-29)"},"283":{"body":"The self variable is no longer implicitly defined in code blocks. It must now be declared as the first parameter in a function signature. Example: contract Foo: my_stored_num: u256 pub fn bar(self, my_num: u256): self.my_stored_num = my_num pub fn baz(self): self.bar(my_pure_func()) pub fn my_pure_func() -> u256: return 42 + 26 ( #520 ) The analyzer now disallows defining a type, variable, or function whose name conflicts with a built-in type, function, or object. Example: error: type name conflicts with built-in type\n┌─ compile_errors/shadow_builtin_type.fe:1:6\n│\n1 │ type u256 = u8\n│ ^^^^ `u256` is a built-in type ( #539 )","breadcrumbs":"Release Notes » Features","id":"283","title":"Features"},"284":{"body":"Fixed cases where the analyzer would correctly reject code, but would panic instead of logging an error message. ( #534 ) Non-fatal parser errors (eg missing parentheses when defining a function that takes no arguments: fn foo:) are no longer ignored if the semantic analysis stage succeeds. ( #535 ) Fixed issue #531 by adding a $ to the front of lowered tuple names. ( #546 )","breadcrumbs":"Release Notes » Bugfixes","id":"284","title":"Bugfixes"},"285":{"body":"Implemented pretty printing of Fe AST. ( #540 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"285","title":"Internal Changes - for Fe Contributors"},"286":{"body":"","breadcrumbs":"Release Notes » 0.8.0-alpha \"Haxonite\" (2021-08-31)","id":"286","title":"0.8.0-alpha \"Haxonite\" (2021-08-31)"},"287":{"body":"Support quotes, tabs and carriage returns in string literals and otherwise restrict string literals to the printable subset of the ASCII table. ( #329 ) The analyzer now uses a query-based system, which fixes some shortcomings of the previous implementation. Types can now refer to other types defined later in the file. Example: type Posts = Map\ntype PostId = u256\ntype PostBody = String<140> Duplicate definition errors now show the location of the original definition. The analysis of each function, type definition, etc happens independently, so an error in one doesn't stop the analysis pass. This means fe can report more user errors in a single run of the compiler. ( #468 ) Function definitions are now denoted with the keyword fn instead of def. ( #496 ) Variable declarations are now preceded by the let keyword. Example: let x: u8 = 1. ( #509 ) Implemented support for numeric unary invert operator (~) ( #526 )","breadcrumbs":"Release Notes » Features","id":"287","title":"Features"},"288":{"body":"Calling self.__init__() now results in a nice error instead of a panic in the yul compilation stage. ( #468 ) Fixed an issue where certain expressions were not being moved to the correct location. ( #493 ) Fixed an issue with a missing return statement not properly detected. Previous to this fix, the following code compiles but it should not: contract Foo: pub fn bar(val: u256) -> u256: if val > 1: return 5 With this change, the compiler rightfully detects that the code is missing a return or revert statement after the if statement since it is not guaranteed that the path of execution always follows the arm of the if statement. ( #497 ) Fixed a bug in the analyzer which allowed tuple item accessor names with a leading 0, resulting in an internal compiler error in a later pass. Example: my_tuple.item001. These are now rejected with an error message. ( #510 ) Check call argument labels for function calls. Previously the compiler would not check any labels that were used when making function calls on self or external contracts. This can be especially problematic if gives developers the impression that they could apply function arguments in any order as long as they are named which is not the case. contract Foo: pub fn baz(): self.bar(val2=1, doesnt_even_exist=2) pub fn bar(val1: u256, val2: u256): pass Code as the one above is now rightfully rejected by the compiler. ( #517 )","breadcrumbs":"Release Notes » Bugfixes","id":"288","title":"Bugfixes"},"289":{"body":"Various improvements and bug fixes to both the content and layout of the specification. ( #489 ) Document all remaining statements and expressions in the spec. Also added a CI check to ensure code examples in the documentation are validated against the latest compiler. ( #514 )","breadcrumbs":"Release Notes » Improved Documentation","id":"289","title":"Improved Documentation"},"29":{"body":"You can start a project using the new subcommand: $ fe new This will generate a template project containing the following: A src directory containing two .fe files. A fe.toml manifest with basic project info and some local project imports.","breadcrumbs":"Using Fe » Using projects » Creating a project","id":"29","title":"Creating a project"},"290":{"body":"Separated Fe type traits between crates. ( #485 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"290","title":"Internal Changes - for Fe Contributors"},"291":{"body":"","breadcrumbs":"Release Notes » 0.7.0-alpha \"Galaxite\" (2021-07-27)","id":"291","title":"0.7.0-alpha \"Galaxite\" (2021-07-27)"},"292":{"body":"Enable the optimizer by default. The optimizer can still be disabled by supplying --optimize=false as an argument. ( #439 ) The following checks are now performed while decoding data: The size of the encoded data fits within the size range known at compile-time. Values are correctly padded. unsigned integers, addresses, and bools are checked to have correct left zero padding the size of signed integers are checked bytes and strings are checked to have correct right padding Data section offsets are consistent with the size of preceding values in the data section. The dynamic size of strings does not exceed their maximum size. The dynamic size of byte arrays (u8[n]) is equal to the size of the array. ( #440 ) Type aliases can now include tuples. Example: type InternetPoints = (address, u256) ( #459 ) Revert with custom errors Example: struct PlatformError: code: u256 pub fn do_something(): revert PlatformError(code=4711) Error encoding follows Solidity which is based on EIP-838 . This means that custom errors returned from Fe are fully compatible with Solidity. ( #464 ) The builtin value msg.sig now has type u256. Removed the bytes[n] type. The type u8[n] can be used in its placed and will be encoded as a dynamically-sized, but checked, bytes component. ( #472 ) Encode certain reverts as panics. With this change, the following reverts are encoded as Panic(uint256) with the following panic codes: 0x01: An assertion that failed and did not specify an error message 0x11: An arithmetic expression resulted in an over- or underflow 0x12: An arithmetic expression divided or modulo by zero The panic codes are aligned with the panic codes that Solidity uses . ( #476 )","breadcrumbs":"Release Notes » Features","id":"292","title":"Features"},"293":{"body":"Fixed a crash when trying to access an invalid attribute on a string. Example: contract Foo: pub fn foo(): \"\".does_not_exist The above now yields a proper user error. ( #444 ) Ensure String type is capitalized in error messages ( #445 ) Fixed ICE when using a static string that spans over multiple lines. Previous to this fix, the following code would lead to a compiler crash: contract Foo: pub fn return_with_newline() -> String<16>: return \"foo balu\" The above code now works as intended. ( #448 ) Fixed ICE when using a tuple declaration and specifying a non-tuple type. Fixed a second ICE when using a tuple declaration where the number of target items doesn't match the number of items in the declared type. ( #469 )","breadcrumbs":"Release Notes » Bugfixes","id":"293","title":"Bugfixes"},"294":{"body":"Cleaned up ABI encoding internals. Improved yulc panic formatting. ( #472 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"294","title":"Internal Changes - for Fe Contributors"},"295":{"body":"","breadcrumbs":"Release Notes » 0.6.0-alpha \"Feldspar\" (2021-06-10)","id":"295","title":"0.6.0-alpha \"Feldspar\" (2021-06-10)"},"296":{"body":"Support for pragma statement Example: pragma ^0.1.0 ( #361 ) Add support for tuple destructuring Example: my_tuple: (u256, bool) = (42, true)\n(x, y): (u256, bool) = my_tuple ( #376 ) Call expression can now accept generic arguments Replace stringN to String Example: s: String<10> = String<10>(\"HI\") ( #379 ) Many analyzer errors now include helpful messages and underlined code. Event and struct constructor arguments must now be labeled and in the order specified in the definition. The analyzer now verifies that the left-hand side of an assignment is actually assignable. ( #398 ) Types of integer literal are now inferred, rather than defaulting to u256. contract C: fn f(x: u8) -> u16: y: u8 = 100 # had to use u8(100) before z: i8 = -129 # \"literal out of range\" error return 1000 # had to use `return u16(1000)` before fn g(): self.f(50) Similar inference is done for empty array literals. Previously, empty array literals caused a compiler crash, because the array element type couldn't be determined. contract C: fn f(xs: u8[10]): pass fn g(): self.f([]) (Note that array length mismatch is still a type error, so this code won't actually compile.) ( #429 ) The Map type name is now capitalized. Example: contract GuestBook: guests: Map> ( #431 ) Convert all remaining errors to use the new advanced error reporting system ( #432 ) Analyzer throws an error if __init__ is not public. ( #435 )","breadcrumbs":"Release Notes » Features","id":"296","title":"Features"},"297":{"body":"Refactored front-end \"not implemented\" errors into analyzer errors and removed questionable variants. Any panic is now considered to be a bug. ( #437 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"297","title":"Internal Changes - for Fe Contributors"},"298":{"body":"","breadcrumbs":"Release Notes » 0.5.0-alpha (2021-05-27)","id":"298","title":"0.5.0-alpha (2021-05-27)"},"299":{"body":"Add support for hexadecimal/octal/binary numeric literals. Example: value_hex: u256 = 0xff\nvalue_octal: u256 = 0o77\nvalue_binary: u256 = 0b11 ( #333 ) Added support for list expressions. Example: values: u256[3] = [10, 20, 30] # or anywhere else where expressions can be used such as in a call sum: u256 = self.sum([10, 20, 30]) ( #388 ) Contracts, events, and structs can now be empty. e.g. event MyEvent: pass ... contract MyContract: pass ... struct MyStruct: pass ( #406 ) External calls can now handle dynamically-sized return types. ( #415 )","breadcrumbs":"Release Notes » Features","id":"299","title":"Features"},"3":{"body":"One of the pain points with smart contract languages is that there can be ambiguities in how the compiler translates the human readable code into EVM bytecode. This can lead to security flaws and unexpected behaviours. The details of the EVM can also cause the higher level languages to be less intuitive and harder to master than some other languages. These are some of the pain points Fe aims to solve. By striving to maximize both human readability and bytecode predictability , Fe will provide an enhanced developer experience for everyone working with the EVM.","breadcrumbs":"Introduction » What problems does Fe solve?","id":"3","title":"What problems does Fe solve?"},"30":{"body":"The fe.toml file is known as a manifest. The manifest is written in TOML format. The purpose of this file is to provide all the metadata that is required for the project to compile. The file begins with definitions for the project name and version, then the project dependencies are listed under a heading [dependencies]. Dependencies are files in the local filesystem that are required for your project to run. For example: name=\"my-project\"\nversion = \"1.0\" [dependencies]\ndependency_1 = \"../lib\" You can also specify which version of a particular dependency you want to use, using curly braces: name=\"my-project\"\nversion = \"1.0\" [dependencies]\ndependency_1 = {path = \"../lib\", version = \"1.0\"}","breadcrumbs":"Using Fe » Using projects » Manifest","id":"30","title":"Manifest"},"300":{"body":"The analyzer will return an error if a tuple attribute is not of the form item. ( #401 )","breadcrumbs":"Release Notes » Bugfixes","id":"300","title":"Bugfixes"},"301":{"body":"Created a landing page for Fe at https://fe-lang.org ( #394 ) Provide a Quickstart chapter in Fe Guide ( #403 )","breadcrumbs":"Release Notes » Improved Documentation","id":"301","title":"Improved Documentation"},"302":{"body":"Using insta to validate Analyzer outputs. ( #387 ) Analyzer now disallows using context.add_ methods to update attributes. ( #392 ) () now represents a distinct type internally called the unit type, instead of an empty tuple. The lowering pass now does the following: Valueless return statements are given a () value and functions without a return value are given explicit () returns. ( #406 ) Add CI check to ensure fragment files always end with a new line ( #4711 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"302","title":"Internal Changes - for Fe Contributors"},"303":{"body":"","breadcrumbs":"Release Notes » 0.4.0-alpha (2021-04-28)","id":"303","title":"0.4.0-alpha (2021-04-28)"},"304":{"body":"Support for revert messages in assert statements E.g assert a == b, \"my revert statement\" The provided string is abi-encoded as if it were a call to a function Error(string). For example, the revert string \"Not enough Ether provided.\" returns the following hexadecimal as error return data: 0x08c379a0 // Function selector for Error(string)\n0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset\n0x000000000000000000000000000000000000000000000000000000000000001a // String length\n0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data ( #288 ) Added support for augmented assignments. e.g. contract Foo: pub fn add(a: u256, b: u256) -> u256: a += b return a pub fn sub(a: u256, b: u256) -> u256: a -= b return a pub fn mul(a: u256, b: u256) -> u256: a *= b return a pub fn div(a: u256, b: u256) -> u256: a /= b return a pub fn mod(a: u256, b: u256) -> u256: a %= b return a pub fn pow(a: u256, b: u256) -> u256: a **= b return a pub fn lshift(a: u8, b: u8) -> u8: a <<= b return a pub fn rshift(a: u8, b: u8) -> u8: a >>= b return a pub fn bit_or(a: u8, b: u8) -> u8: a |= b return a pub fn bit_xor(a: u8, b: u8) -> u8: a ^= b return a pub fn bit_and(a: u8, b: u8) -> u8: a &= b return a ( #338 ) A new parser implementation, which provides more helpful error messages with fancy underlines and code context. ( #346 ) Added support for tuples with base type items. e.g. contract Foo: my_num: u256 pub fn bar(my_num: u256, my_bool: bool) -> (u256, bool): my_tuple: (u256, bool) = (my_num, my_bool) self.my_num = my_tuple.item0 return my_tuple ( #352 )","breadcrumbs":"Release Notes » Features","id":"304","title":"Features"},"305":{"body":"Properly reject invalid emit ( #211 ) Properly tokenize numeric literals when they start with 0 ( #331 ) Reject non-string assert reasons as type error ( #335 ) Properly reject code that creates a circular dependency when using create or create2. Example, the following code is now rightfully rejected because it tries to create an instance of Foo from within the Foo contract itself. contract Foo: pub fn bar()->address: foo:Foo=Foo.create(0) return address(foo) ( #362 )","breadcrumbs":"Release Notes » Bugfixes","id":"305","title":"Bugfixes"},"306":{"body":"AST nodes use Strings instead of &strs. This way we can perform incremental compilation on the AST. ( #332 ) Added support for running tests against solidity fixtures. Also added tests that cover how solidity encodes revert reason strings. ( #342 ) Refactoring of binary operation type checking. ( #347 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"306","title":"Internal Changes - for Fe Contributors"},"307":{"body":"","breadcrumbs":"Release Notes » 0.3.0-alpha \"Calamine\" (2021-03-24)","id":"307","title":"0.3.0-alpha \"Calamine\" (2021-03-24)"},"308":{"body":"Add over/underflow checks for multiplications of all integers ( #271 ) Add full support for empty Tuples. ( #276 ) All functions in Fe implicitly return an empty Tuple if they have no other return value. However, before this change one was not able to use the empty Tuple syntax () explicitly. With this change, all of these are treated equally: contract Foo: pub fn explicit_return_a1(): return pub fn explicit_return_a2(): return () pub fn explicit_return_b1() ->(): return pub fn explicit_return_b2() ->(): return () pub fn implicit_a1(): pass pub fn implicit_a2() ->(): pass The JSON ABI builder now supports structs as both input and output. ( #296 ) Make subsequently defined contracts visible. Before this change: # can't see Bar\ncontract Foo: ...\n# can see Foo\ncontract Bar: ... With this change the restriction is lifted and the following becomes possible. ( #298 ) contract Foo: bar: Bar pub fn external_bar() -> u256: return self.bar.bar()\ncontract Bar: foo: Foo pub fn external_foo() -> u256: return self.foo.foo() Perform checks for divison operations on integers ( #308 ) Support for msg.sig to read the function identifier. ( #311 ) Perform checks for modulo operations on integers ( #312 ) Perform over/underflow checks for exponentiation operations on integers ( #313 )","breadcrumbs":"Release Notes » Features","id":"308","title":"Features"},"309":{"body":"Properly reject emit not followed by an event invocation ( #212 ) Properly reject octal number literals ( #222 ) Properly reject code that tries to emit a non-existing event. ( #250 ) Example that now produces a compile time error: emit DoesNotExist() Contracts that create other contracts can now include __init__ functions. See https://github.com/ethereum/fe/issues/284 ( #304 ) Prevent multiple types with same name in one module. ( #317 ) Examples that now produce compile time errors: type bar = u8\ntype bar = u16 or struct SomeStruct: some_field: u8 struct SomeStruct: other: u8 or contract SomeContract: some_field: u8 contract SomeContract: other: u8 Prevent multiple fields with same name in one struct. Example that now produces a compile time error: struct SomeStruct: some_field: u8 some_field: u8 Prevent variable definition in child scope when name already taken in parent scope. Example that now produces a compile time error: pub fn bar(): my_array: u256[3] sum: u256 = 0 for i in my_array: sum: u256 = 0 The CLI was using the overwrite flag to enable Yul optimization. i.e. # Would both overwrite output files and run the Yul optimizer.\n$ fe my_contract.fe --overwrite Using the overwrite flag now only overwrites and optimization is enabled with the optimize flag. ( #320 ) Ensure analyzer rejects code that uses return values for __init__ functions. ( #323 ) An example that now produces a compile time error: contract C: pub fn __init__() -> i32: return 0 Properly reject calling an undefined function on an external contract ( #324 )","breadcrumbs":"Release Notes » Bugfixes","id":"309","title":"Bugfixes"},"31":{"body":"There are two project modes: main and lib. Main projects can import libraries and have code output. Libraries on the other hand cannot import main projects and do not have code outputs. Their purpose is to be imported into other projects. The mode of a project is determined automatically by the presence of either src/main.fe or src/lib.fe.","breadcrumbs":"Using Fe » Using projects » Project modes","id":"31","title":"Project modes"},"310":{"body":"Added the Uniswap demo contracts to our testing fixtures and validated their behaviour. ( #179 ) IDs added to AST nodes. ( #315 ) Failures in the Yul generation phase now panic; any failure is a bug. ( #327 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"310","title":"Internal Changes - for Fe Contributors"},"311":{"body":"","breadcrumbs":"Release Notes » 0.2.0-alpha \"Borax\" (2021-02-27)","id":"311","title":"0.2.0-alpha \"Borax\" (2021-02-27)"},"312":{"body":"Add support for string literals. Example: fn get_ticker_symbol() -> string3: return \"ETH\" String literals are stored in and loaded from the compiled bytecode. ( #186 ) The CLI now compiles every contract in a module, not just the first one. ( #197 ) Sample compiler output with all targets enabled: output\n|-- Bar\n| |-- Bar.bin\n| |-- Bar_abi.json\n| `-- Bar_ir.yul\n|-- Foo\n| |-- Foo.bin\n| |-- Foo_abi.json\n| `-- Foo_ir.yul\n|-- module.ast\n`-- module.tokens Add support for string type casts ( #201 ) Example: val: string100 = string100(\"foo\") Add basic support for structs. ( #203 ) Example: struct House: price: u256 size: u256 vacant: bool contract City: pub fn get_price() -> u256: building: House = House(300, 500, true) assert building.size == 500 assert building.price == 300 assert building.vacant return building.price Added support for external contract calls. Contract definitions now add a type to the module scope, which may be used to create contract values with the contract's public functions as callable attributes. ( #204 ) Example: contract Foo: pub fn build_array(a: u256, b: u256) -> u256[3]: my_array: u256[3] my_array[0] = a my_array[1] = a * b my_array[2] = b return my_array contract FooProxy: pub fn call_build_array( foo_address: address, a: u256, b: u256, ) -> u256[3]: foo: Foo = Foo(foo_address) return foo.build_array(a, b) Add support for block, msg, chain, and tx properties: ( #208 ) block.coinbase: address\nblock.difficulty: u256\nblock.number: u256\nblock.timestamp: u256\nchain.id: u256\nmsg.value: u256\ntx.gas_price: u256\ntx.origin: address (Note that msg.sender: address was added previously.) Example: fn post_fork() -> bool: return block.number > 2675000 The CLI now panics if an error is encountered during Yul compilation. ( #218 ) Support for contract creations. Example of create2, which takes a value and address salt as parameters. contract Foo: pub fn get_my_num() -> u256: return 42 contract FooFactory: pub fn create2_foo() -> address: # value and salt foo: Foo = Foo.create2(0, 52) return address(foo) Example of create, which just takes a value parameter. contract Foo: pub fn get_my_num() -> u256: return 42 contract FooFactory: pub fn create_foo() -> address: # value and salt foo: Foo = Foo.create(0) return address(foo) Note: We do not yet support init parameters. ( #239 ) Support updating individual struct fields in storage. ( #246 ) Example: pub fn update_house_price(price: u256): self.my_house.price = price Implement global keccak256 method. The method expects one parameter of bytes[n] and returns the hash as an u256. In a future version keccak256 will most likely be moved behind an import so that it has to be imported (e.g. from std.crypto import keccak256). ( #255 ) Example: pub fn hash_single_byte(val: bytes[1]) -> u256: return keccak256(val) Require structs to be initialized using keyword arguments. Example: struct House: vacant: bool price: u256 Previously, House could be instantiated as House(true, 1000000). With this change it is required to be instantiated like House(vacant=true, price=1000000) This ensures property assignment is less prone to get mixed up. It also makes struct initialization visually stand out more from function calls. ( #260 ) Implement support for boolean not operator. ( #264 ) Example: if not covid_test.is_positive(person): allow_boarding(person) Do over/underflow checks for additions (SafeMath). With this change all additions (e.g x + y) for signed and unsigned integers check for over- and underflows and revert if necessary. ( #265 ) Added a builtin function abi_encode() that can be used to encode structs. The return type is a fixed-size array of bytes that is equal in size to the encoding. The type system does not support dynamically-sized arrays yet, which is why we used fixed. ( #266 ) Example: struct House: price: u256 size: u256 rooms: u8 vacant: bool contract Foo: pub fn hashed_house() -> u256: house: House = House( price=300, size=500, rooms=u8(20), vacant=true ) return keccak256(house.abi_encode()) Perform over/underflow checks for subtractions (SafeMath). ( #267 ) With this change all subtractions (e.g x - y) for signed and unsigned integers check for over- and underflows and revert if necessary. Support for the boolean operations and and or. ( #270 ) Examples: contract Foo: pub fn bar(x: bool, y: bool) -> bool: return x and y contract Foo: pub fn bar(x: bool, y: bool) -> bool: return x or y Support for self.address. This expression returns the address of the current contract. Example: contract Foo: pub fn bar() -> address: return self.address","breadcrumbs":"Release Notes » Features","id":"312","title":"Features"},"313":{"body":"Perform type checking when calling event constructors Previously, the following would not raise an error even though it should: contract Foo: event MyEvent: val_1: string100 val_2: u8 pub fn foo(): emit MyEvent(\"foo\", 1000) Wit this change, the code fails with a type error as expected. ( #202 ) Fix bug where compilation of contracts without public functions would result in illegal YUL. ( #219 ) E.g without this change, the following doesn't compile to proper YUL contract Empty: lonely: u256 Ensure numeric literals can't exceed 256 bit range. Previously, this would result in a non user friendly error at the YUL compilation stage. With this change it is caught at the analyzer stage and presented to the user as a regular error. ( #225 ) Fix crash when return is used without value. These two methods should both be treated as returning () pub fn explicit_return(): return pub fn implicit(): pass Without this change, the explicit_return crashes the compiler. ( #261 )","breadcrumbs":"Release Notes » Bugfixes","id":"313","title":"Bugfixes"},"314":{"body":"Renamed the fe-semantics library to fe-analyzer. ( #207 ) Runtime testing utilities. ( #243 ) Values are stored more efficiently in storage. ( #251 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"314","title":"Internal Changes - for Fe Contributors"},"315":{"body":"WARNING: This is an alpha version to share the development progress with developers and enthusiasts. It is NOT yet intended to be used for anything serious. At this point Fe is missing a lot of features and has a lot of bugs instead. This is the first alpha release and kicks off our release schedule which will be one release every month in the future. Since we have just started tracking progress on changes, the following list of changes is incomplete, but will appropriately document progress between releases from now on.","breadcrumbs":"Release Notes » 0.1.0-alpha \"Amethyst\" (2021-01-20)","id":"315","title":"0.1.0-alpha \"Amethyst\" (2021-01-20)"},"316":{"body":"Added support for for loop, allows iteration over static arrays. ( #134 ) Enforce bounds on numeric literals in type constructors. For instance calling u8(1000) or i8(-250) will give an error because the literals 1000 and -250 do not fit into u8 or i8. ( #145 ) Added builtin copying methods clone() and to_mem() to reference types. ( #155 ) usage: # copy a segment of storage into memory and assign the new pointer\nmy_mem_array = self.my_sto_array.to_mem() # copy a segment of memory into another segment of memory and assign the new pointer\nmy_other_mem_array = my_mem_array.clone() Support emitting JSON ABI via --emit abi. The default value of --emit is now abi,bytecode. ( #160 ) Ensure integer type constructor reject all expressions that aren't a numeric literal. For instance, previously the compiler would not reject the following code even though it could not be guaranteed that val would fit into an u16. pub fn bar(val: u8) -> u16: return u16(val) Now such code is rejected and integer type constructor do only work with numeric literals such as 1 or -3. ( #163 ) Support for ABI decoding of all array type. ( #172 ) Support for value assignments in declaration. Previously, this code would fail: another_reference: u256[10] = my_array As a workaround declaration and assignment could be split apart. another_reference: u256[10]\nanother_reference = my_array With this change, the shorter declaration with assignment syntax is supported. ( #173 )","breadcrumbs":"Release Notes » Features","id":"316","title":"Features"},"317":{"body":"Point to examples in the README ( #162 ) Overhaul README page to better reflect the current state of the project. ( #177 ) Added descriptions of the to_mem and clone functions to the spec. ( #195 )","breadcrumbs":"Release Notes » Improved Documentation","id":"317","title":"Improved Documentation"},"318":{"body":"Updated the Solidity backend to v0.8.0. ( #169 ) Run CI tests on Mac and support creating Mac binaries for releases. ( #178 )","breadcrumbs":"Release Notes » Internal Changes - for Fe Contributors","id":"318","title":"Internal Changes - for Fe Contributors"},"319":{"body":"","breadcrumbs":"Code of Conduct » Contributor Covenant Code of Conduct","id":"319","title":"Contributor Covenant Code of Conduct"},"32":{"body":"You can import code from external files with the following syntax: use utils::get_42 This will import the get_42 function from the file utils.fe. You can also import using a custom name/alias: use utils::get_42 as get_42","breadcrumbs":"Using Fe » Using projects » Importing","id":"32","title":"Importing"},"320":{"body":"We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.","breadcrumbs":"Code of Conduct » Our Pledge","id":"320","title":"Our Pledge"},"321":{"body":"Examples of behavior that contributes to a positive environment for our community include: Demonstrating empathy and kindness toward other people Being respectful of differing opinions, viewpoints, and experiences Giving and gracefully accepting constructive feedback Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: The use of sexualized language or imagery, and sexual attention or advances of any kind Trolling, insulting or derogatory comments, and personal or political attacks Public or private harassment Publishing others' private information, such as a physical or email address, without their explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting","breadcrumbs":"Code of Conduct » Our Standards","id":"321","title":"Our Standards"},"322":{"body":"Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.","breadcrumbs":"Code of Conduct » Enforcement Responsibilities","id":"322","title":"Enforcement Responsibilities"},"323":{"body":"This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.","breadcrumbs":"Code of Conduct » Scope","id":"323","title":"Scope"},"324":{"body":"Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at piper@pipermerriam.com. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident.","breadcrumbs":"Code of Conduct » Enforcement","id":"324","title":"Enforcement"},"325":{"body":"Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:","breadcrumbs":"Code of Conduct » Enforcement Guidelines","id":"325","title":"Enforcement Guidelines"},"326":{"body":"Community Impact : Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. Consequence : A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.","breadcrumbs":"Code of Conduct » 1. Correction","id":"326","title":"1. Correction"},"327":{"body":"Community Impact : A violation through a single incident or series of actions. Consequence : A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.","breadcrumbs":"Code of Conduct » 2. Warning","id":"327","title":"2. Warning"},"328":{"body":"Community Impact : A serious violation of community standards, including sustained inappropriate behavior. Consequence : A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.","breadcrumbs":"Code of Conduct » 3. Temporary Ban","id":"328","title":"3. Temporary Ban"},"329":{"body":"Community Impact : Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. Consequence : A permanent ban from any sort of public interaction within the community.","breadcrumbs":"Code of Conduct » 4. Permanent Ban","id":"329","title":"4. Permanent Ban"},"33":{"body":"The templates created using fe new include a simple test demonstrating the test syntax. To write a unit test, create a function with a name beginning with test_. The function should instantiate your contract and call the contract function you want to test. You can use assert to check that the returned value matches an expected value. For example, to test the say_hello function on Contract which is expected to return the string \"hello\": fn test_contract(mut ctx: Context) { let contract: Contract = Contract.create(ctx, 0) assert main.say_hello() == \"hello\"\n} You can run all the tests in a project by running the following command: fe test You will receive test results directly to the console.","breadcrumbs":"Using Fe » Using projects » Tests","id":"33","title":"Tests"},"330":{"body":"This Code of Conduct is adapted from the Contributor Covenant , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html . Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder . For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq . Translations are available at https://www.contributor-covenant.org/translations .","breadcrumbs":"Code of Conduct » Attribution","id":"330","title":"Attribution"},"34":{"body":"Once you have created a project, you can run the usual Fe CLI subcommands against the project path.","breadcrumbs":"Using Fe » Using projects » Running your project","id":"34","title":"Running your project"},"35":{"body":"Welcome to the Tutorials section. We will be adding walkthrough guides for example Fe projects here! For now, you can get started with: Open auction Watch this space for more tutorials coming soon!","breadcrumbs":"Using Fe » Tutorials » Tutorials","id":"35","title":"Tutorials"},"36":{"body":"This tutorial aims to implement a simple auction contract in Fe. Along the way you will learn some foundational Fe concepts. An open auction is one where prices are determined in real-time by live bidding. The winner is the participant who has made the highest bid at the time the auction ends.","breadcrumbs":"Using Fe » Tutorials » Open auction » Auction contract","id":"36","title":"Auction contract"},"37":{"body":"To run an open auction, you need an item for sale, a seller, a pool of buyers and a deadline after which no more bids will be recognized. In this tutorial we will not have an item per se, the buyers are simply bidding to win! The highest bidder is provably crowned the winner, and the value of their bid is passed to the beneficiary. Bidders can also withdraw their bids at any time.","breadcrumbs":"Using Fe » Tutorials » Open auction » The auction rules","id":"37","title":"The auction rules"},"38":{"body":"To follow this guide you should have Fe installed on your computer. If you haven't installed Fe yet, follow the instructions on the Installation page. With Fe installed, you can create a project folder, auction that will act as your project root. In that folder, create an empty file called auction.fe. Now you are ready to start coding in Fe! You will also need Foundry installed to follow the deployment instructions in this guide - you can use your alternative tooling for this if you prefer.","breadcrumbs":"Using Fe » Tutorials » Open auction » Get Started","id":"38","title":"Get Started"},"39":{"body":"You can see the entire contract here . You can refer back to this at any time to check implementation details.","breadcrumbs":"Using Fe » Tutorials » Open auction » Writing the Contract","id":"39","title":"Writing the Contract"},"4":{"body":"You can read much more information about Fe in these docs. If you want to get building, you can begin with our Quickstart guide . You can also get involved in the Fe community by contributing code or documentation to the project Github or joining the conversation on Discord . Learn more on our Contributing page.","breadcrumbs":"Introduction » Get Started","id":"4","title":"Get Started"},"40":{"body":"A contract in Fe is defined using the contract keyword. A contract requires a constructor function to initialize any state variables used by the contract. If no constructor is defined, Fe will add a default with no state variables. The skeleton of the contract can look as follows: contract Auction { pub fn __init__() {}\n} To run the auction you will need several state variables, some of which can be initialized at the time the contract is instantiated. You will need to track the address of the beneficiary so you know who to pay out to. You will also need to keep track of the highest bidder, and the amount they have bid. You will also need to keep track of how much each specific address has sent into the contract, so you can refund them the right amount if they decide to withdraw. You will also need a flag that tracks whether or not the auction has ended. The following list of variables will suffice: auction_end_time: u256\nbeneficiary: address\nhighest_bidder: address\nhighest_bid: u256\npending_returns: Map\nended: bool Notice that variables are named using snake case (lower case, underscore separated, like_this). Addresses have their own type in Fe - it represents 20 hex-encoded bytes as per the Ethereum specification. The variables that expect numbers are given the u256 type. This is an unsigned integer of length 256 bits. There are other choices for integers too, with both signed and unsigned integers between 8 and 256 bits in length. The ended variable will be used to check whether the auction is live or not. If it has finished ended will be set to true. There are only two possible states for this, so it makes sense to declare it as a bool - i.e. true/false. The pending_returns variable is a mapping between N keys and N values, with user addresses as the keys and their bids as values. For this, a Map type is used. In Fe, you define the types for the key and value in the Map definition - in this case, it is Map. Keys can be any numeric type, address, boolean or unit. Now you should decide which of these variables will have values that are known at the time the contract is instantiated. It makes sense to set the beneficiary right away, so you can add that to the constructor arguments. The other thing to consider here is how the contract will keep track of time. On its own, the contract has no concept of time. However, the contract does have access to the current block timestamp which is measured in seconds since the Unix epoch (Jan 1st 1970). This can be used to measure the time elapsed in a smart contract. In this contract, you can use this concept to set a deadline on the auction. By passing a length of time in seconds to the constructor, you can then add that value to the current block timestamp and create a deadline for bidding to end. Therefore, you should add a bidding_time argument to the constructor. Its type can be u256. When you have implemented all this, your contract should look like this: contract Auction { // states auction_end_time: u256 beneficiary: address highest_bidder: address highest_bid: u256 pending_returns: Map ended: bool // constructor pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) { self.beneficiary = beneficiary_addr self.auction_end_time = ctx.block_timestamp() + bidding_time }\n} Notice that the constructor receives values for bidding_time and beneficiary_addr and uses them to initialize the contract's auction_end_time and beneficiary variables. The other thing to notice about the constructor is that there are two additional arguments passed to the constructor: mut self and ctx: Context. self self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. 'self' in the context of classes in Python, or this in Javascript. Here, you are not only using self but you are prepending it with mut. mut is a keyword inherited from Rust that indicates that the value can be overwritten - i.e. it is \"mutable\". Variables are not mutable by default - this is a safety feature that helps protect developers from unintended changes during runtime. If you do not make self mutable, then you will not be able to update the values it contains. Context Context is used to gate access to certain features including emitting logs, creating contracts, reading messages and transferring ETH. It is conventional to name the context object ctx. The Context object needs to be passed as the first parameter to a function unless the function also takes self, in which case the Context object should be passed as the second parameter. Context must be explicitly made mutable if it will invoke functions that changes the blockchain data, whereas an immutable reference to Context can be used where read-only access to the blockchain is needed. Read more on Context in Fe In Fe contracts ctx is where you can find transaction data such as msg.sender, msg.value, block.timestamp etc.","breadcrumbs":"Using Fe » Tutorials » Open auction » Defining the Contract and initializing variables","id":"40","title":"Defining the Contract and initializing variables"},"41":{"body":"Now that you have your contract constructor and state variables, you can implement some logic for receiving bids. To do this, you will create a method called bid. To handle a bid, you will first need to determine whether the auction is still open. If it has closed then the bid should revert. If the auction is open you need to record the address of the bidder and the amount and determine whether their bid was the highest. If their bid is highest, then their address should be assigned to the highest_bidder variable and the amount they sent recorded in the highest_bid variable. This logic can be implemented as follows: pub fn bid(mut self, mut ctx: Context) { if ctx.block_timestamp() > self.auction_end_time { revert AuctionAlreadyEnded() } if ctx.msg_value() <= self.highest_bid { revert BidNotHighEnough(highest_bid: self.highest_bid) } if self.highest_bid != 0 { self.pending_returns[self.highest_bidder] += self.highest_bid } self.highest_bidder = ctx.msg_sender() self.highest_bid = ctx.msg_value() ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))\n} The method first checks that the current block timestamp is not later than the contract's aution_end_time variable. If it is later, then the contract reverts. This is triggered using the revert keyword. The revert can accept a struct that becomes encoded as revert data . Here you can just revert without any arguments. Add the following definition somewhere in Auction.fe outside the main contract definition: struct AuctionAlreadyEnded {\n} The next check is whether the incoming bid exceeds the current highest bid. If not, the bid has failed and it may as well revert. We can repeat the same logic as for AuctionAlreadyEnded. We can also report the current highest bid in the revert message to help the user reprice if they want to. Add the following to auction.fe: struct BidNotHighEnough { pub highest_bid: u256\n} Notice that the value being checked is msg.value which is included in the ctx object. ctx is where you can access incoming transaction data. Next, if the incoming transaction is the highest bid, you need to track how much the sender should receive as a payout if their bid ends up being exceeded by another user (i.e. if they get outbid, they get their ETH back). To do this, you add a key-value pair to the pending_returns mapping, with the user address as the key and the transaction amount as the value. Both of these come from ctx in the form of msg.sender and msg.value. Finally, if the incoming bid is the highest, you can emit an event. Events are useful because they provide a cheap way to return data from a contract as they use logs instead of contract storage. Unlike other smart contract languages, there is no emit keyword or Event type. Instead, you trigger an event by calling the emit method on the ctx object. You can pass this method a struct that defines the emitted message. You can add the following struct for this event: struct HighestBidIncreased { #indexed pub bidder: address pub amount: u256\n} You have now implemented all the logic to handle a bid!","breadcrumbs":"Using Fe » Tutorials » Open auction » Bidding","id":"41","title":"Bidding"},"42":{"body":"A previous high-bidder will want to retrieve their ETH from the contract so they can either walk away or bid again. You therefore need to create a withdraw method that the user can call. The function will lookup the user address in pending_returns. If there is a non-zero value associated with the user's address, the contract should send that amount back to the sender's address. It is important to first update the value in pending_returns and then send the ETH to the user, otherwise you are exposing a re-entrancy vulnerability (where a user can repeatedly call the contract and receive the ETH multiple times). Add the following to the contract to implement the withdraw method: pub fn withdraw(mut self, mut ctx: Context) -> bool { let amount: u256 = self.pending_returns[ctx.msg_sender()] if amount > 0 { self.pending_returns[ctx.msg_sender()] = 0 ctx.send_value(to: ctx.msg_sender(), wei: amount) } return true\n} Note that in this case mut is used with ctx because send_value is making changes to the blockchain (it is moving ETH from one address to another).","breadcrumbs":"Using Fe » Tutorials » Open auction » Withdrawing","id":"42","title":"Withdrawing"},"43":{"body":"Finally, you need to add a way to end the auction. This will check whether the bidding period is over, and if it is, automatically trigger the payment to the beneficiary and emit the address of the winner in an event. First, check the auction is not still live - if the auction is live you cannot end it early. If an attempt to end the auction early is made, it should revert using a AuctionNotYetEnded struct, which can look as follows: struct AuctionNotYetEnded {\n} You should also check whether the auction was already ended by a previous valid call to this method. In this case, revert with a AuctionEndAlreadyCalled struct: struct AuctionEndAlreadyCalled {} If the auction is still live, you can end it. First set self.ended to true to update the contract state. Then emit the event using ctx.emit(). Then, send the ETH to the beneficiary. Again, the order is important - you should always send value last to protect against re-entrancy. Your method can look as follows: pub fn action_end(mut self, mut ctx: Context) { if ctx.block_timestamp() <= self.auction_end_time { revert AuctionNotYetEnded() } if self.ended { revert AuctionEndAlreadyCalled() } self.ended = true ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid)) ctx.send_value(to: self.beneficiary, wei: self.highest_bid)\n} Congratulations! You just wrote an open auction contract in Fe!","breadcrumbs":"Using Fe » Tutorials » Open auction » End the auction","id":"43","title":"End the auction"},"44":{"body":"To help test the contract without having to decode transaction logs, you can add some simple functions to the contract that simply report the current values for some key state variables (specifically, highest_bidder, highest_bid and ended). This will allow a user to use eth_call to query these values in the contract. eth_call is used for functions that do not update the state of the blockchain and costs no gas because the queries can be performed on local data. You can add the following functions to the contract: pub fn check_highest_bidder(self) -> address { return self.highest_bidder;\n} pub fn check_highest_bid(self) -> u256 { return self.highest_bid;\n} pub fn check_ended(self) -> bool { return self.ended;\n}","breadcrumbs":"Using Fe » Tutorials » Open auction » View functions","id":"44","title":"View functions"},"45":{"body":"Your contract is now ready to use! Compile it using fe build auction.fe You will find the contract ABI and bytecode in the newly created outputs directory. Start a local blockchain to deploy your contract to: anvil There are constructor arguments (bidding_time: u256, beneficiary_addr: address) that have to be added to the contract bytecode so that the contract is instantiated with your desired values. To add constructor arguments you can encode them into bytecode and append them to the contract bytecode. First, hex encode the value you want to pass to bidding_time. In this case, we will use a value of 10: cast --to_hex(10) >> 0xa // this is 10 in hex Ethereum addresses are already hex, so there is no further encoding required. The following command will take the constructor function and the hex-encoded arguments and concatenate them into a contiguous hex string and then deploy the contract with the constructor arguments. cast send --from --private-key --create $(cat output/Auction/Auction.bin) $(cast abi-encode \"__init__(uint256,address)\" 0xa 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720) You will see the contract address reported in your terminal. Now you can interact with your contract. Start by sending an initial bid, let's say 100 ETH. For contract address 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35: cast send 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"bid()\" --value \"100ether\" --private-key --from 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720 You can check whether this was successful by calling the check_highest_bidder() function: cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"check_highest_bidder()\" You will see a response looking similar to: 0x000000000000000000000000a0Ee7A142d267C1f36714E4a8F75612F20a79720 The characters after the leading zeros are the address for the highest bidder (notice they match the characters after the 0x in the bidding address). You can do the same to check the highest bid: cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 \"check_highest_bid()\" This returns: 0x0000000000000000000000000000000000000000000000056bc75e2d63100000 Converting the non-zero characters to binary gives the decimal value of your bid (in wei - divide by 1e18 to get the value in ETH): cast --to-dec 56bc75e2d63100000 >> 100000000000000000000 // 100 ETH in wei Now you can repeat this process, outbidding the initial bid from another address and check the highest_bidder() and highest_bid() to confirm. Do this a few times, then call end_auction() to see the value of the highest bid get transferred to the beneficiary_addr. You can always check the balance of each address using: cast balance
And check whether the auction open time has expired using cast \"check_ended()\"","breadcrumbs":"Using Fe » Tutorials » Open auction » Build and deploy the contract","id":"45","title":"Build and deploy the contract"},"46":{"body":"Congratulations! You wrote an open auction contract in Fe and deployed it to a local blockchain! If you are using a local Anvil blockchain, you can use the ten ephemeral addresses created when the network started to simulate a bidding war! By following this tutorial, you learned: basic Fe types, such as bool, address, map and u256 basic Fe styles, such as snake case for variable names how to create a contract with a constructor how to revert how to handle state variables how to avoid reentrancy how to use ctx to handle transaction data how to emit events using ctx.emit how to deploy a contract with constructor arguments using Foundry how to interact with your contract","breadcrumbs":"Using Fe » Tutorials » Open auction » Summary","id":"46","title":"Summary"},"47":{"body":"Simple open auction","breadcrumbs":"Using Fe » Example Contracts » Example Contracts","id":"47","title":"Example Contracts"},"48":{"body":"// errors\nstruct AuctionAlreadyEnded {\n} struct AuctionNotYetEnded {\n} struct AuctionEndAlreadyCalled {} struct BidNotHighEnough { pub highest_bid: u256\n} // events\nstruct HighestBidIncreased { #indexed pub bidder: address pub amount: u256\n} struct AuctionEnded { #indexed pub winner: address pub amount: u256\n} contract Auction { // states auction_end_time: u256 beneficiary: address highest_bidder: address highest_bid: u256 pending_returns: Map ended: bool // constructor pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) { self.beneficiary = beneficiary_addr self.auction_end_time = ctx.block_timestamp() + bidding_time } //method pub fn bid(mut self, mut ctx: Context) { if ctx.block_timestamp() > self.auction_end_time { revert AuctionAlreadyEnded() } if ctx.msg_value() <= self.highest_bid { revert BidNotHighEnough(highest_bid: self.highest_bid) } if self.highest_bid != 0 { self.pending_returns[self.highest_bidder] += self.highest_bid } self.highest_bidder = ctx.msg_sender() self.highest_bid = ctx.msg_value() ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value())) } pub fn withdraw(mut self, mut ctx: Context) -> bool { let amount: u256 = self.pending_returns[ctx.msg_sender()] if amount > 0 { self.pending_returns[ctx.msg_sender()] = 0 ctx.send_value(to: ctx.msg_sender(), wei: amount) } return true } pub fn auction_end(mut self, mut ctx: Context) { if ctx.block_timestamp() <= self.auction_end_time { revert AuctionNotYetEnded() } if self.ended { revert AuctionEndAlreadyCalled() } self.ended = true ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid)) ctx.send_value(to: self.beneficiary, wei: self.highest_bid) } pub fn check_highest_bidder(self) -> address { return self.highest_bidder; } pub fn check_highest_bid(self) -> u256 { return self.highest_bid; } pub fn check_ended(self) -> bool { return self.ended; }\n}","breadcrumbs":"Using Fe » Example Contracts » Open auction","id":"48","title":"Using Fe"},"49":{"body":"There are not many resources for Fe outside of the official documentation at this time. This section lists useful links to external resources.","breadcrumbs":"Using Fe » Useful external links » Useful external links","id":"49","title":"Useful external links"},"5":{"body":"Let's get started with Fe! In this section you will learn how to write and deploy your first contract. Writing your first contract Deploying a contract to a testnet","breadcrumbs":"Quickstart » Quickstart","id":"5","title":"Quickstart"},"50":{"body":"VS Code extension Foundry Fe Support","breadcrumbs":"Using Fe » Useful external links » Tools","id":"50","title":"Tools"},"51":{"body":"Bountiful - Bug bounty platform written in Fe, live on Mainnet Simple DAO - A Simple DAO written in Fe - live on Mainnet and Optimism","breadcrumbs":"Using Fe » Useful external links » Projects","id":"51","title":"Projects"},"52":{"body":"These are community projects written in Fe at various hackathons. Fixed-Point Numerical Library - A fixed-point number representation and mathematical operations tailored for Fe. It can be used in financial computations, scientific simulations, and data analysis. p256verifier - Secp256r1 (a.k.a p256) curve signature verifier which allows for verification of a P256 signature in fe. Account Storage with Efficient Sparse Merkle Trees - Efficient Sparse Merkle Trees in Fe! SMTs enable inclusion and exclusion proofs for the entire set of Ethereum addresses. Tic Tac Toe - An implementation of the classic tic tac toe game in Fe with a Python frontend. Fecret Santa - Fecret Santa is an onchain Secret Santa event based on a \"chain\": gift a collectible (ERC721 or ERC1155) to the last Santa and you'll be the next to receive a gift! Go do it - A commitment device to help you achieve your goals. Powerbald - On chain lottery written in Fe sspc-flutter-fe - Stupid Simple Payment Channel written in Fe","breadcrumbs":"Using Fe » Useful external links » Hackathon projects","id":"52","title":"Hackathon projects"},"53":{"body":"Fe standard library - The Fe standard library comes bundled with the compiler but it is also a useful example for real world Fe code. Implementing an UniswapV3 trade in Fe","breadcrumbs":"Using Fe » Useful external links » Others","id":"53","title":"Others"},"54":{"body":"Fe or Solidity, which is better? by Ahmed Castro","breadcrumbs":"Using Fe » Useful external links » Blog posts","id":"54","title":"Blog posts"},"55":{"body":"Fe or Solidity, which is better? by Ahmed Castro Fe o Solidity, ¿cuál es es mejor? by Ahmed Castro","breadcrumbs":"Using Fe » Useful external links » Videos","id":"55","title":"Videos"},"56":{"body":"Read how to become a Fe developer. Build & Test Release","breadcrumbs":"Development » Development","id":"56","title":"Development"},"57":{"body":"Please make sure Rust is installed . Basic The following commands only build the Fe -> Yul compiler components. build the CLI: cargo build test: cargo test --workspace Full The Fe compiler depends on the Solidity compiler for transforming Yul IR to EVM bytecode. We currently use solc-rust to perform this. In order to compile solc-rust, the following must be installed on your system: cmake boost(1.65+) libclang brew install boost Once these have been installed, you may run the full build. This is enabled using the solc-backend feature. build the CLI: cargo build --features solc-backend test: cargo test --workspace --features solc-backend","breadcrumbs":"Development » Build & Test » Build and test","id":"57","title":"Build and test"},"58":{"body":"","breadcrumbs":"Development » Release » Release","id":"58","title":"Release"},"59":{"body":"Make sure that version follows semver rules e.g (0.23.0).","breadcrumbs":"Development » Release » Versioning","id":"59","title":"Versioning"},"6":{"body":"Before you dive in, you need to download and install Fe. For this quickstart you should simply download the binary from fe-lang.org . Then change the name and file permissions: mv fe_amd64 fe\nchmod +x fe Now you are ready to do the quickstart tutorial! For more detailed information on installing Fe, or to troubleshoot, see the Installation page in our user guide.","breadcrumbs":"Quickstart » Download and install Fe","id":"6","title":"Download and install Fe"},"60":{"body":"Prerequisite : Release notes are generated with towncrier . Ensure to have towncrier installed and the command is available. Run make notes version= where is the version we are generating the release notes for e.g. 0.23.0. Example: make notes version=0.23.0 Examine the generated release notes and if needed perform and commit any manual changes.","breadcrumbs":"Development » Release » Generate Release Notes","id":"60","title":"Generate Release Notes"},"61":{"body":"Run make release version=. Example: make release version=0.23.0 This will also run the tests again as the last step because some of them may need to be adjusted because of the changed version number.","breadcrumbs":"Development » Release » Generate the release","id":"61","title":"Generate the release"},"62":{"body":"Prerequisite : Make sure the central repository is configured as upstream, not origin. After the tests are adjusted run make push-tag to create the tag and push it to Github.","breadcrumbs":"Development » Release » Tag and push the release","id":"62","title":"Tag and push the release"},"63":{"body":"Running the previous command will push a new tag to Github and cause the CI to create a release with the Fe binaries attached. We may want to edit the release afterwards to put in some verbiage about the release.","breadcrumbs":"Development » Release » Manually edit the release on GitHub","id":"63","title":"Manually edit the release on GitHub"},"64":{"body":"A release of a new Fe compiler should usually go hand in hand with updating the website and documentation. For one, the front page of fe-lang.org links to the download of the compiler but won't automatically pick up the latest release without a fresh deployment. Furthermore, if code examples and other docs needed to be updated along with compiler changes, these updates are also only reflected online when the site gets redeployed. This is especially problematic since our docs do currently not have a version switcher to view documentation for different compiler versions ( See GitHub issue #543 ).","breadcrumbs":"Development » Release » Updating Docs & Website","id":"64","title":"Updating Docs & Website"},"65":{"body":"Run make serve-website and visit http://0.0.0.0:8000 to preview it locally. Ensure the front page displays the correct compiler version for download and that the docs render correctly.","breadcrumbs":"Development » Release » Preview the sites locally","id":"65","title":"Preview the sites locally"},"66":{"body":"Prerequisite : Make sure the central repository is configured as upstream, not origin. Run make deploy-website and validate that fe-lang.org renders the updated sites (Can take up to a few minutes).","breadcrumbs":"Development » Release » Deploy website & docs","id":"66","title":"Deploy website & docs"},"67":{"body":"The standard library includes commonly used algorithms and data structures that come bundled as part of the language. Precompiles","breadcrumbs":"Standard Library » Fe Standard Library","id":"67","title":"Fe Standard Library"},"68":{"body":"Precompiles are EVM functions that are prebuilt and optimized as part of the Fe standard library. There are currently nine precompiles available in Fe. The first four precompiles were defined in the original Ethereum Yellow Paper (ec_recover, SHA2_256, ripemd_160, identity). Four more were added during the Byzantium fork (mod_exp, ec_add, ec_mul and ec_pairing). A final precompile, blake2f was added in EIP-152 during the Istanbul fork . The nine precompiles available in the Fe standard library are: ec_recover SHA2 256 ripemd160 identity mod_exp ec_add ec_mul ec_pairing blake2f These precompiles are imported as follows: use std::precompiles","breadcrumbs":"Standard Library » Precompiles » Precompiles","id":"68","title":"Precompiles"},"69":{"body":"ec_recover is a cryptographic function that retrieves a signer's address from a signed message. It is the fundamental operation used for verifying signatures in Ethereum. Ethereum uses the Elliptic Curve Digital Signature Algorithm (ECDSA) for verifying signatures. This algorithm uses two parameters, r and s. Ethereum's implementation also uses an additional 'recovery identifier' parameter, v, which is used to identify the correct elliptic curve point from those that can be calculated from r and s alone.","breadcrumbs":"Standard Library » Precompiles » ec_recover","id":"69","title":"ec_recover"},"7":{"body":"Now that we have the compiler installed let's write our first contract. A contract contains the code that will be deployed to the Ethereum blockchain and resides at a specific address. The code of the contract dictates how: it manipulates its own state interacts with other contracts exposes external APIs to be called from other contracts or users To keep things simple we will just write a basic guestbook where people can leave a message associated with their Ethereum address. Note: Real code would not instrument the Ethereum blockchain in such a way as it is a waste of precious resources. This code is for demo purposes only.","breadcrumbs":"Quickstart » Write your first contract » Write your first Fe contract","id":"7","title":"Write your first Fe contract"},"70":{"body":"hash: the hash of the signed message, u256 v: the recovery identifier, a number in the range 27-30, u256 r: elliptic curve parameter, u256 s: elliptic curve parameter, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"70","title":"Parameters"},"71":{"body":"ec_recover returns an address.","breadcrumbs":"Standard Library » Precompiles » Returns","id":"71","title":"Returns"},"72":{"body":"pub fn ec_recover(hash: u256, v: u256, r: u256, s: u256) -> address","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"72","title":"Function signature"},"73":{"body":"let result: address = precompiles::ec_recover( hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3, v: 28, r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608, s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada\n)","breadcrumbs":"Standard Library » Precompiles » Example","id":"73","title":"Example"},"74":{"body":"SHA2_256 is a hash function. a hash function generates a unique string of characters of fixed length from arbitrary input data.","breadcrumbs":"Standard Library » Precompiles » SHA2_256","id":"74","title":"SHA2_256"},"75":{"body":"buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"75","title":"Parameters"},"76":{"body":"SHA2_256 returns a hash as a u256","breadcrumbs":"Standard Library » Precompiles » Returns","id":"76","title":"Returns"},"77":{"body":"pub fn sha2_256(buf input_buf: MemoryBuffer) -> u256","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"77","title":"Function signature"},"78":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)\nlet result: u256 = precompiles::sha2_256(buf)","breadcrumbs":"Standard Library » Precompiles » Example","id":"78","title":"Example"},"79":{"body":"ripemd_160 is a hash function that is rarely used in Ethereum, but is included in many crypto libraries as it is used in Bitcoin core.","breadcrumbs":"Standard Library » Precompiles » ripemd_160","id":"79","title":"ripemd_160"},"8":{"body":"Fe code is written in files ending on the .fe file extension. Let's create a file guest_book.fe and put in the following content. contract GuestBook { messages: Map>\n} Here we're using a map to associate messages with Ethereum addresses. The messages will simply be a string of a maximum length of 100 written as String<100>. The addresses are represented by the builtin address type. Execute ./fe build guest_book.fe to compile the file. The compiler tells us that it compiled our contract and that it has put the artifacts into a subdirectory called output. Compiled guest_book.fe. Outputs in `output` If we examine the output directory we'll find a subdirectory GuestBook with a GuestBook_abi.json and a GuestBook.bin file. ├── fe\n├── guest_book.fe\n└── output └── GuestBook ├── GuestBook_abi.json └── GuestBook.bin The GuestBook_abi.json is a JSON representation that describes the binary interface of our contract but since our contract doesn't yet expose anything useful its content for now resembles an empty array. The GuestBook.bin is slightly more interesting containing what looks like a gibberish of characters which in fact is the compiled binary contract code written in hexadecimal characters. We don't need to do anything further yet with these files that the compiler produces but they will become important when we get to the point where we want to deploy our code to the Ethereum blockchain.","breadcrumbs":"Quickstart » Write your first contract » Create a guest_book.fe file","id":"8","title":"Create a guest_book.fe file"},"80":{"body":"input_buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"80","title":"Parameters"},"81":{"body":"ripemd_160 returns a hash as a u256","breadcrumbs":"Standard Library » Precompiles » Returns","id":"81","title":"Returns"},"82":{"body":"pub fn ripemd_160(buf input_buf: MemoryBuffer) -> u256","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"82","title":"Function signature"},"83":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)\nlet result: u256 = precompiles::ripemd_160(buf)","breadcrumbs":"Standard Library » Precompiles » Example","id":"83","title":"Example"},"84":{"body":"identity is a function that simply echoes the input of the function as its output. This can be used for efficient data copying.","breadcrumbs":"Standard Library » Precompiles » identity","id":"84","title":"identity"},"85":{"body":"input_buf: a sequence of bytes to hash, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"85","title":"Parameters"},"86":{"body":"identity returns a sequence of bytes, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Returns","id":"86","title":"Returns"},"87":{"body":"pub fn identity(buf input_buf: MemoryBuffer) -> MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"87","title":"Function signature"},"88":{"body":"let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0x42)\nlet mut result: MemoryBufferReader = precompiles::identity(buf).reader()","breadcrumbs":"Standard Library » Precompiles » Example","id":"88","title":"Example"},"89":{"body":"mod_exp is a modular exponentiation function required for elliptic curve operations.","breadcrumbs":"Standard Library » Precompiles » mod_exp","id":"89","title":"mod_exp"},"9":{"body":"Let's focus on the functionality of our world changing application and add a method to sign the guestbook. contract GuestBook { messages: Map> pub fn sign(mut self, ctx: Context, book_msg: String<100>) { self.messages[ctx.msg_sender()] = book_msg }\n} In Fe, every method that is defined without the pub keyword becomes private. Since we want people to interact with our contract and call the sign method we have to prefix it with pub. Let's recompile the contract again and see what happens. Failed to write output to directory: `output`. Error: Directory 'output' is not empty. Use --overwrite to overwrite. Oops, the compiler is telling us that the output directory is a non-empty directory and plays it safe by asking us if we are sure that we want to overwrite it. We have to use the --overwrite flag to allow the compiler to overwrite what is stored in the output directory. Let's try it again with ./fe build guest_book.fe --overwrite. This time it worked and we can also see that the GuestBook_abi.json has become slightly more interesting. [ { \"name\": \"sign\", \"type\": \"function\", \"inputs\": [ { \"name\": \"book_msg\", \"type\": \"bytes100\" } ], \"outputs\": [] }\n] Since our contract now has a public sign method the corresponding ABI has changed accordingly.","breadcrumbs":"Quickstart » Write your first contract » Add a method to sign the guest book","id":"9","title":"Add a method to sign the guest book"},"90":{"body":"b: MemoryBuffer: the base (i.e. the number being raised to a power), MemoryBuffer e: MemoryBuffer: the exponent (i.e. the power b is raised to), MemoryBuffer m: MemoryBuffer: the modulus, MemoryBuffer b_size: u256: the length of b in bytes, u256 e_size: u256: the length of e in bytes, u256 m_size: u256: then length of m in bytes, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"90","title":"Parameters"},"91":{"body":"mod_exp returns a sequence of bytes, MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Returns","id":"91","title":"Returns"},"92":{"body":"pub fn mod_exp( b_size: u256, e_size: u256, m_size: u256, b: MemoryBuffer, e: MemoryBuffer, m: MemoryBuffer,\n) -> MemoryBuffer","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"92","title":"Function signature"},"93":{"body":"let mut result: MemoryBufferReader = precompiles::mod_exp( b_size: 1, e_size: 1, m_size: 1, b: MemoryBuffer::from_u8(value: 8), e: MemoryBuffer::from_u8(value: 9), m: MemoryBuffer::from_u8(value: 10),\n).reader()","breadcrumbs":"Standard Library » Precompiles » Example","id":"93","title":"Example"},"94":{"body":"ec_add does point addition on elliptic curves.","breadcrumbs":"Standard Library » Precompiles » ec_add","id":"94","title":"ec_add"},"95":{"body":"x1: x-coordinate 1, u256 y1: y coordinate 1, u256 x2: x coordinate 2, u256 y2: y coordinate 2, u256","breadcrumbs":"Standard Library » Precompiles » Parameters","id":"95","title":"Parameters"},"96":{"body":"pub fn ec_add(x1: u256, y1: u256, x2: u256, y2: u256)-> (u256,u256)","breadcrumbs":"Standard Library » Precompiles » Function signature","id":"96","title":"Function signature"},"97":{"body":"ec_add returns a tuple of u256, (u256, u256).","breadcrumbs":"Standard Library » Precompiles » Returns","id":"97","title":"Returns"},"98":{"body":"let (x, y): (u256, u256) = precompiles::ec_add(x1: 1, y1: 2, x2: 1, y2: 2)","breadcrumbs":"Standard Library » Precompiles » Example","id":"98","title":"Example"},"99":{"body":"ec_mul is for multiplying elliptic curve points.","breadcrumbs":"Standard Library » Precompiles » ec_mul","id":"99","title":"ec_mul"}},"length":331,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{".":{"1":{".":{"0":{"df":3,"docs":{"158":{"tf":1.0},"296":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":2,"docs":{"247":{"tf":1.0},"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":2,"docs":{"236":{"tf":1.0},"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":3,"docs":{"229":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":2,"docs":{"225":{"tf":1.0},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.0}}},"1":{"8":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"0":{"0":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.0},"267":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"2":{"df":4,"docs":{"236":{"tf":1.0},"257":{"tf":1.0},"274":{"tf":1.0},"311":{"tf":1.0}}},"3":{"df":3,"docs":{"218":{"tf":1.0},"257":{"tf":1.0},"307":{"tf":1.0}}},"4":{"df":3,"docs":{"232":{"tf":1.0},"254":{"tf":1.4142135623730951},"303":{"tf":1.0}}},"5":{"df":6,"docs":{"232":{"tf":1.0},"239":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.4142135623730951},"298":{"tf":1.0}}},"6":{"df":3,"docs":{"229":{"tf":1.0},"242":{"tf":1.0},"295":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"291":{"tf":1.0}}},"8":{"df":2,"docs":{"225":{"tf":1.0},"286":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"1":{"1":{"_":{"1":{"0":{"0":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"6":{"4":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":30,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"127":{"tf":2.0},"16":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.4142135623730951},"190":{"tf":2.449489742783178},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":3.0},"237":{"tf":1.0},"240":{"tf":2.449489742783178},"243":{"tf":2.23606797749979},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.7320508075688772}},"o":{"7":{"0":{"df":1,"docs":{"127":{"tf":1.0}}},"7":{"df":2,"docs":{"124":{"tf":1.0},"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"1":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"6":{"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"112":{"tf":4.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"…":{"0":{"0":{"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"204":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"171":{"tf":1.0},"204":{"tf":1.0},"292":{"tf":1.0}}},"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"c":{"3":{"7":{"9":{"a":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"1":{"0":{"5":{"8":{"a":{"3":{"1":{"4":{"1":{"8":{"2":{"2":{"9":{"8":{"5":{"7":{"3":{"3":{"c":{"b":{"d":{"d":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"d":{"0":{"df":0,"docs":{},"f":{"d":{"8":{"d":{"6":{"c":{"1":{"0":{"4":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"b":{"df":0,"docs":{},"f":{"5":{"a":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"9":{"a":{"b":{"1":{"6":{"3":{"b":{"c":{"7":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"3":{"4":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}},"9":{"7":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"4":{"7":{"1":{"b":{"0":{"9":{"df":0,"docs":{},"f":{"a":{"9":{"3":{"c":{"a":{"a":{"df":0,"docs":{},"f":{"1":{"3":{"c":{"b":{"df":0,"docs":{},"f":{"4":{"4":{"3":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"0":{"9":{"c":{"c":{"4":{"3":{"2":{"8":{"df":0,"docs":{},"f":{"5":{"a":{"6":{"2":{"a":{"a":{"d":{"4":{"5":{"df":0,"docs":{},"f":{"4":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"6":{"c":{"3":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"c":{"6":{"8":{"0":{"5":{"9":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"9":{"b":{"b":{"4":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"b":{"9":{"df":0,"docs":{},"e":{"4":{"4":{"df":0,"docs":{},"e":{"2":{"a":{"3":{"2":{"2":{"3":{"4":{"d":{"a":{"8":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"6":{"1":{"c":{"d":{"6":{"3":{"9":{"1":{"9":{"3":{"5":{"4":{"b":{"c":{"0":{"6":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"1":{"df":0,"docs":{},"e":{"3":{"c":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"b":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"126":{"tf":1.0}}}},"2":{"2":{"6":{"0":{"6":{"8":{"4":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"8":{"6":{"7":{"9":{"3":{"9":{"1":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"df":0,"docs":{},"e":{"2":{"1":{"d":{"df":0,"docs":{},"f":{"5":{"4":{"4":{"c":{"3":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"2":{"df":0,"docs":{},"f":{"3":{"5":{"0":{"4":{"d":{"df":0,"docs":{},"e":{"8":{"a":{"7":{"9":{"d":{"9":{"1":{"5":{"9":{"df":0,"docs":{},"e":{"c":{"a":{"2":{"d":{"9":{"8":{"d":{"9":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"a":{"8":{"df":0,"docs":{},"e":{"b":{"0":{"b":{"0":{"9":{"9":{"6":{"2":{"5":{"2":{"c":{"b":{"5":{"4":{"8":{"a":{"4":{"4":{"8":{"7":{"d":{"a":{"9":{"7":{"b":{"0":{"2":{"4":{"2":{"2":{"df":0,"docs":{},"e":{"b":{"c":{"0":{"df":0,"docs":{},"e":{"8":{"3":{"4":{"6":{"1":{"3":{"df":0,"docs":{},"f":{"9":{"5":{"4":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"7":{"df":0,"docs":{},"e":{"0":{"a":{"df":0,"docs":{},"f":{"d":{"c":{"1":{"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"2":{"3":{"a":{"df":0,"docs":{},"f":{"9":{"a":{"5":{"c":{"df":0,"docs":{},"e":{"2":{"b":{"a":{"2":{"7":{"9":{"6":{"c":{"1":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"4":{"5":{"3":{"a":{"3":{"7":{"0":{"df":0,"docs":{},"e":{"b":{"0":{"a":{"df":0,"docs":{},"f":{"8":{"c":{"2":{"1":{"2":{"d":{"9":{"d":{"c":{"9":{"a":{"c":{"d":{"8":{"df":0,"docs":{},"f":{"c":{"0":{"2":{"c":{"2":{"df":0,"docs":{},"e":{"9":{"0":{"7":{"b":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"3":{"6":{"8":{"df":0,"docs":{},"e":{"2":{"8":{"3":{"8":{"1":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"c":{"c":{"b":{"5":{"df":0,"docs":{},"f":{"a":{"8":{"1":{"df":0,"docs":{},"f":{"c":{"2":{"6":{"c":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"f":{"0":{"4":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"b":{"df":0,"docs":{},"f":{"d":{"d":{"8":{"5":{"d":{"7":{"df":0,"docs":{},"e":{"d":{"3":{"a":{"b":{"3":{"6":{"9":{"8":{"d":{"6":{"3":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"9":{"0":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"8":{"9":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"f":{"3":{"6":{"df":0,"docs":{},"e":{"3":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"0":{"df":0,"docs":{},"f":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"5":{"2":{"1":{"1":{"0":{"c":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"9":{"1":{"0":{"8":{"9":{"2":{"4":{"9":{"2":{"6":{"df":0,"docs":{},"e":{"4":{"5":{"df":0,"docs":{},"f":{"0":{"b":{"0":{"c":{"8":{"6":{"8":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"d":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"1":{"6":{"d":{"3":{"2":{"4":{"2":{"d":{"c":{"7":{"1":{"5":{"df":0,"docs":{},"f":{"6":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"4":{"4":{"4":{"9":{"9":{"d":{"5":{"d":{"2":{"7":{"b":{"b":{"1":{"8":{"6":{"3":{"0":{"8":{"b":{"7":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"df":0,"docs":{},"f":{"0":{"2":{"a":{"c":{"5":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"6":{"a":{"3":{"d":{"1":{"4":{"7":{"c":{"1":{"8":{"6":{"b":{"2":{"1":{"df":0,"docs":{},"f":{"b":{"1":{"b":{"7":{"6":{"df":0,"docs":{},"e":{"1":{"8":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"0":{"2":{"df":0,"docs":{},"e":{"4":{"7":{"8":{"8":{"7":{"5":{"0":{"7":{"a":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"7":{"4":{"3":{"c":{"b":{"a":{"c":{"6":{"b":{"a":{"2":{"9":{"1":{"df":0,"docs":{},"e":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"9":{"b":{"df":0,"docs":{},"e":{"6":{"b":{"d":{"7":{"6":{"3":{"9":{"5":{"0":{"b":{"b":{"1":{"6":{"0":{"4":{"1":{"a":{"0":{"a":{"8":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"0":{"6":{"4":{"4":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"a":{"0":{"2":{"9":{"b":{"8":{"5":{"0":{"4":{"5":{"b":{"6":{"8":{"1":{"8":{"1":{"5":{"8":{"5":{"d":{"9":{"7":{"8":{"1":{"6":{"a":{"9":{"1":{"6":{"8":{"7":{"1":{"c":{"a":{"8":{"d":{"3":{"c":{"2":{"0":{"8":{"c":{"1":{"6":{"d":{"8":{"7":{"c":{"df":0,"docs":{},"f":{"d":{"4":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"b":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"7":{"7":{"8":{"0":{"1":{"c":{"1":{"5":{"b":{"b":{"7":{"5":{"3":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"b":{"9":{"df":0,"docs":{},"e":{"3":{"3":{"d":{"c":{"b":{"6":{"1":{"3":{"c":{"9":{"3":{"c":{"b":{"df":0,"docs":{},"e":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"b":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"e":{"c":{"a":{"b":{"8":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"b":{"4":{"1":{"a":{"4":{"1":{"7":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"b":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"8":{"1":{"4":{"9":{"5":{"9":{"b":{"2":{"c":{"1":{"4":{"7":{"3":{"6":{"6":{"b":{"6":{"3":{"2":{"3":{"df":0,"docs":{},"f":{"1":{"7":{"b":{"6":{"df":0,"docs":{},"f":{"7":{"0":{"6":{"0":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"2":{"4":{"b":{"5":{"8":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"a":{"7":{"c":{"a":{"8":{"4":{"8":{"5":{"a":{"df":0,"docs":{},"e":{"6":{"7":{"b":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"b":{"d":{"df":0,"docs":{},"e":{"2":{"a":{"9":{"9":{"4":{"b":{"df":0,"docs":{},"f":{"2":{"d":{"df":0,"docs":{},"e":{"c":{"8":{"c":{"1":{"1":{"df":0,"docs":{},"f":{"b":{"0":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"9":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"0":{"df":0,"docs":{},"f":{"a":{"1":{"1":{"5":{"0":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"b":{"8":{"df":0,"docs":{},"f":{"3":{"3":{"c":{"1":{"3":{"0":{"b":{"4":{"5":{"6":{"1":{"0":{"5":{"2":{"6":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"4":{"2":{"df":1,"docs":{"88":{"tf":1.0}}},"5":{"6":{"df":0,"docs":{},"e":{"9":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"df":0,"docs":{},"e":{"1":{"9":{"7":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"3":{"df":0,"docs":{},"e":{"8":{"5":{"a":{"3":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"0":{"4":{"9":{"a":{"3":{"b":{"a":{"3":{"4":{"c":{"2":{"2":{"8":{"9":{"b":{"4":{"c":{"8":{"6":{"0":{"df":0,"docs":{},"f":{"c":{"0":{"b":{"0":{"c":{"6":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"8":{"c":{"9":{"b":{"d":{"df":0,"docs":{},"f":{"2":{"6":{"7":{"df":0,"docs":{},"e":{"6":{"0":{"9":{"6":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"2":{"0":{"6":{"5":{"6":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"7":{"6":{"8":{"2":{"0":{"4":{"5":{"7":{"4":{"6":{"8":{"6":{"5":{"7":{"2":{"2":{"0":{"7":{"0":{"7":{"2":{"6":{"df":0,"docs":{},"f":{"7":{"6":{"6":{"9":{"6":{"4":{"6":{"5":{"6":{"4":{"2":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"f":{"8":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"d":{"7":{"5":{"3":{"5":{"2":{"4":{"8":{"d":{"0":{"b":{"d":{"4":{"4":{"8":{"2":{"9":{"8":{"c":{"c":{"2":{"df":0,"docs":{},"e":{"2":{"0":{"7":{"1":{"df":0,"docs":{},"e":{"5":{"6":{"9":{"9":{"2":{"d":{"0":{"7":{"7":{"4":{"d":{"c":{"3":{"4":{"0":{"c":{"3":{"6":{"8":{"a":{"df":0,"docs":{},"e":{"9":{"5":{"0":{"8":{"5":{"2":{"a":{"d":{"a":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":0,"docs":{},"f":{"b":{"d":{"b":{"2":{"3":{"1":{"5":{"6":{"7":{"8":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"b":{"3":{"6":{"7":{"df":0,"docs":{},"f":{"0":{"3":{"2":{"d":{"9":{"3":{"df":0,"docs":{},"f":{"6":{"4":{"2":{"df":0,"docs":{},"f":{"6":{"4":{"1":{"8":{"0":{"a":{"a":{"3":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"0":{"0":{"0":{"8":{".":{".":{"7":{"6":{"b":{"9":{"0":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"6":{"2":{"6":{"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"7":{"5":{"4":{"7":{"4":{"df":0,"docs":{},"e":{"8":{"9":{"0":{"9":{"4":{"c":{"4":{"4":{"d":{"a":{"9":{"8":{"b":{"9":{"5":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"a":{"c":{"4":{"9":{"5":{"2":{"7":{"1":{"d":{"0":{"df":0,"docs":{},"f":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"4":{"1":{"df":0,"docs":{},"f":{"b":{"a":{"b":{"d":{"9":{"8":{"3":{"1":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"b":{"6":{"a":{"6":{"0":{"c":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"6":{"df":0,"docs":{},"f":{"0":{"6":{"5":{"7":{"5":{"3":{"d":{"8":{"d":{"c":{"b":{"9":{"6":{"5":{"3":{"d":{"b":{"a":{"d":{"3":{"5":{"df":1,"docs":{"45":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"1":{"7":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"9":{"c":{"d":{"df":0,"docs":{},"e":{"0":{"5":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"126":{"tf":1.0}}}},"8":{"1":{"0":{"c":{"b":{"d":{"4":{"3":{"6":{"5":{"3":{"9":{"6":{"1":{"6":{"5":{"8":{"7":{"4":{"c":{"0":{"5":{"4":{"d":{"0":{"1":{"b":{"1":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"4":{"c":{"c":{"2":{"4":{"9":{"2":{"6":{"5":{"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"4":{"2":{"6":{"8":{"5":{"b":{"df":0,"docs":{},"f":{"1":{"6":{"1":{"7":{"9":{"3":{"c":{"c":{"2":{"5":{"6":{"0":{"3":{"c":{"2":{"3":{"1":{"b":{"c":{"2":{"df":0,"docs":{},"f":{"5":{"6":{"8":{"df":0,"docs":{},"e":{"b":{"6":{"3":{"0":{"df":0,"docs":{},"e":{"a":{"1":{"6":{"a":{"a":{"1":{"3":{"7":{"d":{"2":{"6":{"6":{"4":{"a":{"c":{"8":{"0":{"3":{"8":{"8":{"2":{"5":{"6":{"0":{"8":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"b":{"2":{"8":{"6":{"8":{"9":{"8":{"4":{"8":{"4":{"a":{"df":0,"docs":{},"e":{"7":{"3":{"7":{"d":{"2":{"2":{"8":{"3":{"8":{"df":0,"docs":{},"e":{"2":{"7":{"b":{"2":{"9":{"8":{"9":{"9":{"b":{"3":{"2":{"7":{"8":{"0":{"4":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"3":{"0":{"9":{"df":0,"docs":{},"e":{"4":{"7":{"a":{"7":{"5":{"b":{"1":{"8":{"c":{"df":0,"docs":{},"f":{"d":{"7":{"d":{"5":{"9":{"5":{"c":{"c":{"7":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"b":{"5":{"7":{"8":{"2":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"6":{"d":{"d":{"4":{"df":0,"docs":{},"f":{"b":{"d":{"3":{"a":{"7":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"a":{"d":{"b":{"5":{"9":{"4":{"b":{"8":{"4":{"d":{"7":{"7":{"0":{"df":0,"docs":{},"f":{"5":{"6":{"df":0,"docs":{},"f":{"3":{"9":{"3":{"df":0,"docs":{},"f":{"1":{"3":{"7":{"7":{"8":{"5":{"a":{"5":{"2":{"7":{"0":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"1":{"8":{"2":{"df":0,"docs":{},"e":{"6":{"a":{"d":{"7":{"df":0,"docs":{},"f":{"5":{"2":{"0":{"df":0,"docs":{},"e":{"5":{"1":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"f":{"b":{"a":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"127":{"tf":1.4142135623730951},"45":{"tf":1.0}},"f":{"0":{"a":{"d":{"b":{"b":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"1":{"3":{"5":{"d":{"1":{"5":{"0":{"9":{"a":{"d":{"0":{"3":{"9":{"5":{"0":{"5":{"b":{"a":{"d":{"a":{"9":{"4":{"2":{"d":{"1":{"8":{"7":{"5":{"5":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"3":{"6":{"1":{"d":{"5":{"df":0,"docs":{},"f":{"3":{"a":{"df":0,"docs":{},"f":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"5":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"233":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"233":{"tf":1.0}}}}}}}},"f":{"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.0},"299":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0}}}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"0":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"177":{"tf":1.0}}},"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"144":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}},"1":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"131":{"tf":1.0},"134":{"tf":1.4142135623730951},"141":{"tf":1.0},"178":{"tf":1.0},"18":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"296":{"tf":1.0},"45":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}},"1":{"5":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"182":{"tf":1.0}}},"df":25,"docs":{"131":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"205":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.7320508075688772},"258":{"tf":2.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.4142135623730951},"295":{"tf":1.0},"299":{"tf":1.0},"45":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"df":4,"docs":{"131":{"tf":1.0},"183":{"tf":2.449489742783178},"218":{"tf":1.0},"265":{"tf":1.4142135623730951}}},"2":{"3":{"df":2,"docs":{"127":{"tf":1.0},"183":{"tf":1.4142135623730951}}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"280":{"tf":1.0}}},"8":{"df":2,"docs":{"132":{"tf":1.0},"280":{"tf":1.7320508075688772}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":7,"docs":{"112":{"tf":1.0},"182":{"tf":1.7320508075688772},"183":{"tf":1.7320508075688772},"239":{"tf":1.0},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"275":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"68":{"tf":1.0}}},"5":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"1":{"df":1,"docs":{"230":{"tf":1.0}}},"2":{"df":1,"docs":{"317":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"318":{"tf":1.0}}},"df":4,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"182":{"tf":1.0},"233":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"7":{"df":1,"docs":{"317":{"tf":1.0}}},"8":{"df":1,"docs":{"318":{"tf":1.0}}},"9":{"df":1,"docs":{"310":{"tf":1.0}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"5":{"df":1,"docs":{"317":{"tf":1.0}}},"6":{"9":{"9":{"2":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"2":{"3":{"4":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":42,"docs":{"103":{"tf":1.0},"115":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"190":{"tf":3.4641016151377544},"191":{"tf":1.0},"210":{"tf":1.0},"222":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"326":{"tf":1.0},"93":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"1":{"8":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"2":{".":{"0":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":1,"docs":{"258":{"tf":1.7320508075688772}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"1":{"df":12,"docs":{"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"2":{"df":8,"docs":{"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951}}},"3":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"236":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"df":1,"docs":{"314":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"193":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"315":{"tf":1.0},"40":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"7":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"4":{"df":1,"docs":{"268":{"tf":1.0}}},"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"313":{"tf":1.0}}},"df":1,"docs":{"182":{"tf":1.0}}},"2":{"2":{"df":1,"docs":{"309":{"tf":1.0}}},"5":{"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"190":{"tf":1.0}}},"9":{"df":1,"docs":{"312":{"tf":1.0}}},"df":1,"docs":{"183":{"tf":1.0}}},"4":{"1":{"df":2,"docs":{"252":{"tf":1.0},"253":{"tf":1.0}}},"3":{"df":1,"docs":{"314":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":1,"docs":{"307":{"tf":1.0}}},"5":{"0":{"df":2,"docs":{"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"314":{"tf":1.0}}},"3":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":2,"docs":{"240":{"tf":1.0},"312":{"tf":1.0}}},"6":{"df":7,"docs":{"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":2,"docs":{"173":{"tf":1.0},"182":{"tf":1.7320508075688772}}},"6":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"190":{"tf":1.0},"312":{"tf":1.0}}},"5":{"df":1,"docs":{"312":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"5":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"221":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"248":{"tf":1.0},"283":{"tf":1.0}}},"7":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"308":{"tf":1.0}}},"6":{"df":1,"docs":{"308":{"tf":1.0}}},"df":6,"docs":{"190":{"tf":1.4142135623730951},"245":{"tf":1.0},"291":{"tf":1.0},"298":{"tf":1.0},"311":{"tf":1.0},"70":{"tf":1.0}}},"8":{"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":5,"docs":{"190":{"tf":1.0},"230":{"tf":1.0},"236":{"tf":1.0},"303":{"tf":1.0},"73":{"tf":1.0}}},"9":{"6":{"df":1,"docs":{"308":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.0},"282":{"tf":1.0}}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":23,"docs":{"103":{"tf":1.4142135623730951},"109":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.0},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"211":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":2.23606797749979},"327":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"299":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"3":{"df":1,"docs":{"308":{"tf":1.0}}},"5":{"df":1,"docs":{"310":{"tf":1.0}}},"7":{"df":1,"docs":{"309":{"tf":1.0}}},"df":5,"docs":{"227":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"278":{"tf":1.0},"286":{"tf":1.0}}},"2":{"0":{"df":2,"docs":{"231":{"tf":1.0},"309":{"tf":1.0}}},"3":{"df":1,"docs":{"309":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"7":{"df":1,"docs":{"310":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":3,"docs":{"141":{"tf":1.0},"230":{"tf":1.7320508075688772},"258":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"299":{"tf":1.0}}},"5":{"df":1,"docs":{"305":{"tf":1.0}}},"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"268":{"tf":1.0}}},"6":{"df":1,"docs":{"304":{"tf":1.0}}},"7":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"7":{"8":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"7":{"6":{"7":{"5":{"9":{"6":{"7":{"2":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"7":{"df":1,"docs":{"302":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"301":{"tf":1.0}}},"7":{"df":1,"docs":{"255":{"tf":1.0}}},"8":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"161":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"18":{"tf":1.0},"182":{"tf":2.23606797749979},"192":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.0},"328":{"tf":1.0}}},"4":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"300":{"tf":1.0}}},"3":{"df":1,"docs":{"301":{"tf":1.0}}},"6":{"df":2,"docs":{"299":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":12,"docs":{"130":{"tf":1.4142135623730951},"189":{"tf":1.0},"201":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"243":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"283":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"df":1,"docs":{"296":{"tf":1.0}}},"5":{"df":1,"docs":{"296":{"tf":1.0}}},"7":{"df":1,"docs":{"297":{"tf":1.0}}},"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"df":1,"docs":{"249":{"tf":1.0}}},"4":{"df":1,"docs":{"293":{"tf":1.0}}},"5":{"df":1,"docs":{"293":{"tf":1.0}}},"8":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"292":{"tf":1.0}}},"8":{"df":2,"docs":{"287":{"tf":1.0},"288":{"tf":1.0}}},"9":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"1":{"df":2,"docs":{"279":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":2,"docs":{"292":{"tf":1.0},"294":{"tf":1.0}}},"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"290":{"tf":1.0}}},"8":{"df":1,"docs":{"272":{"tf":1.0}}},"9":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"288":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":7,"docs":{"160":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.4142135623730951},"213":{"tf":1.0},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"329":{"tf":1.0}}},"5":{"0":{"0":{"0":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}},"df":2,"docs":{"178":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"252":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"288":{"tf":1.0}}},"4":{"df":1,"docs":{"289":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"df":2,"docs":{"189":{"tf":1.4142135623730951},"312":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"284":{"tf":1.0}}},"4":{"df":1,"docs":{"284":{"tf":1.0}}},"5":{"df":1,"docs":{"284":{"tf":1.0}}},"9":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"3":{"df":1,"docs":{"64":{"tf":1.0}}},"6":{"df":1,"docs":{"284":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"1":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"9":{"df":1,"docs":{"279":{"tf":1.0}}},"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"275":{"tf":1.0}}},"8":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"250":{"tf":1.0}}},"6":{"df":2,"docs":{"276":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":9,"docs":{"163":{"tf":1.0},"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.0},"243":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0}}},"6":{"0":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":1,"docs":{"271":{"tf":1.0}}},"6":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"268":{"tf":1.0}}},"2":{"df":1,"docs":{"268":{"tf":1.0}}},"3":{"df":1,"docs":{"269":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"243":{"tf":1.0}}},"6":{"df":1,"docs":{"258":{"tf":1.0}}},"8":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"5":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"6":{"5":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"7":{"7":{"df":1,"docs":{"265":{"tf":1.0}}},"9":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"8":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"2":{"df":1,"docs":{"250":{"tf":1.0}}},"4":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":2.0},"275":{"tf":1.0}}},"7":{"0":{"3":{"df":1,"docs":{"243":{"tf":1.0}}},"5":{"df":1,"docs":{"249":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"246":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"247":{"tf":1.0}}},"3":{"df":1,"docs":{"247":{"tf":1.0}}},"6":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"4":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"244":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"5":{"7":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.0}}},"9":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"241":{"tf":1.0}}},"5":{"df":1,"docs":{"241":{"tf":1.0}}},"6":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"8":{"3":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.0}}},"8":{"0":{"1":{"df":1,"docs":{"241":{"tf":1.0}}},"3":{"df":1,"docs":{"237":{"tf":1.0}}},"5":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"233":{"tf":1.0}}},"df":1,"docs":{"258":{"tf":1.0}}},"1":{"5":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"3":{"6":{"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"8":{"3":{"6":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":2,"docs":{"163":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"5":{"3":{"df":1,"docs":{"235":{"tf":1.0}}},"4":{"5":{"df":2,"docs":{"15":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"234":{"tf":1.0}}},"3":{"df":1,"docs":{"233":{"tf":1.0}}},"4":{"df":1,"docs":{"233":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"7":{"df":1,"docs":{"231":{"tf":1.0}}},"df":0,"docs":{}},"8":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"df":1,"docs":{"231":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"9":{"8":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.0},"130":{"tf":1.0},"182":{"tf":1.0},"197":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"280":{"tf":1.4142135623730951},"40":{"tf":1.0},"93":{"tf":1.0}}},"9":{"0":{"8":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"228":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"9":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"223":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"224":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"220":{"tf":1.0}}},"7":{"df":1,"docs":{"219":{"tf":1.0}}},"8":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"120":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951},"182":{"tf":1.0},"93":{"tf":1.0}}},"_":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"_":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"268":{"tf":1.0}}}}}}},"df":3,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"231":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{",":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"139":{"tf":2.0},"296":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"(":{"a":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"120":{"tf":2.6457513110645907},"124":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":2.0},"170":{"tf":1.0},"173":{"tf":1.0},"187":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"255":{"tf":2.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"137":{"tf":1.0},"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"a":{".":{"df":0,"docs":{},"k":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"b":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{",":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"131":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"213":{"tf":1.0}}},"df":14,"docs":{"131":{"tf":1.0},"146":{"tf":2.23606797749979},"240":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0},"294":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"df":2,"docs":{"141":{"tf":1.0},"275":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"143":{"tf":1.0},"164":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"119":{"tf":1.0},"14":{"tf":1.0},"230":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"296":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.4142135623730951},"249":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"288":{"tf":1.0}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"216":{"tf":1.0},"275":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"323":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"320":{"tf":1.0},"323":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0}}}},"v":{"df":1,"docs":{"171":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"164":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"215":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"330":{"tf":1.0}}}}},"d":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.0}}},"6":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":2,"docs":{"141":{"tf":1.4142135623730951},"255":{"tf":1.0}}},"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"141":{"tf":1.0}}}},"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"279":{"tf":1.0}}},"x":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":21,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"148":{"tf":1.0},"19":{"tf":1.0},"211":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"312":{"tf":2.23606797749979},"40":{"tf":2.0},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"182":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"94":{"tf":1.0}}}},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":0,"docs":{},"x":{"7":{"1":{"5":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"a":{"3":{"c":{"7":{"2":{"9":{"6":{"9":{"b":{"5":{"4":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"4":{"2":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"b":{"b":{"7":{"6":{"8":{"c":{"8":{"a":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":4,"docs":{"189":{"tf":1.0},"230":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":53,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"143":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":2.23606797749979},"163":{"tf":2.0},"164":{"tf":2.0},"17":{"tf":1.7320508075688772},"173":{"tf":2.0},"177":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"187":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"19":{"tf":1.4142135623730951},"195":{"tf":2.6457513110645907},"196":{"tf":2.6457513110645907},"200":{"tf":1.4142135623730951},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":2.23606797749979},"243":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.449489742783178},"268":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"292":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":3.0},"321":{"tf":1.0},"323":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":2.0},"42":{"tf":2.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":3.3166247903554},"46":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"52":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":33,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"252":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951},"317":{"tf":1.0},"35":{"tf":1.0},"45":{"tf":1.0},"68":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"27":{"tf":1.0},"296":{"tf":1.0},"321":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"42":{"tf":1.0},"43":{"tf":1.0},"61":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"18":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"34":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":1,"docs":{"320":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"231":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"213":{"tf":1.0},"22":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":3,"docs":{"108":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}}}}}},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}},"s":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":1.4142135623730951},"292":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"322":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"206":{"tf":1.7320508075688772},"227":{"tf":1.0},"256":{"tf":1.0}}},"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"124":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"143":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"193":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"279":{"tf":1.4142135623730951},"28":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"328":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"143":{"tf":1.0},"69":{"tf":1.0}},"g":{"df":4,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"36":{"tf":1.0},"64":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":23,"docs":{"232":{"tf":1.0},"236":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"25":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.7320508075688772}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"14":{"tf":1.0},"309":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"143":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"16":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"211":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":2,"docs":{"279":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"149":{"tf":1.4142135623730951},"212":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":2.0},"43":{"tf":1.0},"48":{"tf":2.6457513110645907}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":5,"docs":{"266":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"52":{"tf":1.0}}}},"z":{"df":15,"docs":{"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"133":{"tf":1.4142135623730951}}}},"n":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"10":{"tf":1.0},"115":{"tf":1.0},"141":{"tf":1.0},"144":{"tf":1.0},"180":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"330":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"15":{"tf":2.23606797749979},"16":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"19":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"266":{"tf":1.0},"315":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"18":{"tf":1.0},"193":{"tf":1.0},"281":{"tf":1.0},"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"321":{"tf":1.0},"326":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"144":{"tf":1.0},"243":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"135":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"163":{"tf":1.0}}}}}}}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":3,"docs":{"184":{"tf":1.0},"288":{"tf":1.0},"323":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"211":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"215":{"tf":1.0},"216":{"tf":1.0},"315":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":2.0}}}},"r":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"193":{"tf":1.0},"212":{"tf":1.0}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"277":{"tf":1.0},"316":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":2.0},"143":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":2.0},"185":{"tf":1.7320508075688772},"234":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":3.0},"265":{"tf":1.0},"269":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"182":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}}},"m":{"df":4,"docs":{"170":{"tf":1.0},"22":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"288":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"250":{"tf":1.0},"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"192":{"tf":1.0}}},"u":{"2":{"5":{"6":{"df":11,"docs":{"161":{"tf":1.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"df":4,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":2.0},"112":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":4,"docs":{"134":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":21,"docs":{"10":{"tf":1.0},"113":{"tf":1.0},"131":{"tf":1.0},"161":{"tf":1.0},"166":{"tf":1.4142135623730951},"175":{"tf":2.0},"177":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":3.0},"196":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.4142135623730951},"269":{"tf":1.0},"271":{"tf":1.7320508075688772},"275":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"8":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"192":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"219":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":7,"docs":{"120":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"269":{"tf":1.0},"287":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"107":{"tf":1.0},"113":{"tf":1.0},"157":{"tf":1.0},"171":{"tf":2.8284271247461903},"223":{"tf":1.4142135623730951},"230":{"tf":4.123105625617661},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"292":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"171":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":14,"docs":{"113":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"161":{"tf":2.449489742783178},"162":{"tf":2.0},"177":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":2.0},"250":{"tf":1.0},"265":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":2.23606797749979},"41":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"168":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.7320508075688772},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"148":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.4142135623730951},"271":{"tf":1.0},"281":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"266":{"tf":1.0},"285":{"tf":1.0},"306":{"tf":1.4142135623730951},"310":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"277":{"tf":1.0},"63":{"tf":1.0}}},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"43":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"212":{"tf":1.0},"321":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":1.0},"178":{"tf":2.23606797749979},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"240":{"tf":1.0},"246":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"330":{"tf":1.0}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"48":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"41":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":12,"docs":{"224":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.4142135623730951},"43":{"tf":2.8284271247461903},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":1.7320508075688772},"304":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"219":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"144":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"31":{"tf":1.0},"43":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":13,"docs":{"12":{"tf":1.0},"197":{"tf":1.0},"206":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"330":{"tf":1.4142135623730951},"60":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"327":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"b":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"39":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"26":{"tf":1.7320508075688772},"318":{"tf":1.0},"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":1,"docs":{"269":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":6,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}},"e":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"(":{"a":{"c":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"177":{"tf":1.0}},"u":{"df":1,"docs":{"293":{"tf":1.0}}}},"n":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.7320508075688772},"329":{"tf":1.4142135623730951}}},"r":{"'":{"df":1,"docs":{"204":{"tf":1.0}}},"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"231":{"tf":1.0}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"170":{"tf":1.0},"250":{"tf":1.0},"283":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":4,"docs":{"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"288":{"tf":1.0},"316":{"tf":1.0}},"u":{"df":3,"docs":{"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}},".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"159":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"231":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"280":{"tf":1.4142135623730951},"305":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951}},"k":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"b":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"133":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"187":{"tf":1.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"212":{"tf":1.0},"240":{"tf":1.0},"252":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}}},"i":{"c":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}},"df":8,"docs":{"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"29":{"tf":1.0},"312":{"tf":1.0},"46":{"tf":1.4142135623730951},"57":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.4142135623730951}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"177":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"283":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"2":{"6":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"]":{"[":{"0":{"df":0,"docs":{},"x":{"0":{"1":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"175":{"tf":1.0},"180":{"tf":1.0},"196":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"279":{"tf":1.0},"288":{"tf":1.0}}}},"df":14,"docs":{"115":{"tf":2.23606797749979},"162":{"tf":3.4641016151377544},"170":{"tf":1.4142135623730951},"196":{"tf":2.0},"240":{"tf":2.23606797749979},"250":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"304":{"tf":4.795831523312719},"312":{"tf":2.23606797749979},"90":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"24":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"308":{"tf":1.0},"41":{"tf":1.0},"56":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"148":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"288":{"tf":1.0},"321":{"tf":1.0},"41":{"tf":1.4142135623730951},"90":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"212":{"tf":1.0},"231":{"tf":1.0},"26":{"tf":1.0},"280":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"136":{"tf":1.0},"167":{"tf":1.0},"206":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"13":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"182":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"324":{"tf":1.0},"326":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"215":{"tf":1.0},"3":{"tf":1.0},"310":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"250":{"tf":1.0},"275":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"37":{"tf":1.0},"40":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"48":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":3,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"1":{"tf":1.0},"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"317":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"126":{"tf":1.0},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.4142135623730951},"290":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}}}},"i":{":":{":":{"b":{"a":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"253":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"37":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"36":{"tf":1.4142135623730951},"37":{"tf":2.0},"40":{"tf":1.7320508075688772},"41":{"tf":3.872983346207417},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.6457513110645907},"46":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}}}}}}}}}}}},"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":12,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"182":{"tf":1.4142135623730951},"217":{"tf":1.0},"26":{"tf":1.7320508075688772},"306":{"tf":1.0},"318":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"df":7,"docs":{"10":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"40":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"227":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"182":{"tf":1.7320508075688772},"185":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"2":{"b":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}}},"_":{"2":{"df":0,"docs":{},"f":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"108":{"tf":1.4142135623730951},"110":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"312":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":26,"docs":{"13":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.7320508075688772},"150":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"20":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"115":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.0},"151":{"tf":1.7320508075688772},"16":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.0}}}}},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"210":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"i":{"df":11,"docs":{"132":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":6,"docs":{"10":{"tf":2.0},"135":{"tf":2.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"9":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}},"l":{"[":{"3":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}},"df":34,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"141":{"tf":1.7320508075688772},"152":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":1.7320508075688772},"178":{"tf":1.7320508075688772},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"222":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"312":{"tf":3.1622776601683795},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"125":{"tf":1.0},"170":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":15,"docs":{"113":{"tf":1.4142135623730951},"125":{"tf":1.0},"167":{"tf":1.0},"171":{"tf":1.4142135623730951},"172":{"tf":1.0},"181":{"tf":1.4142135623730951},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"272":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"184":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"(":{"1":{".":{"6":{"5":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"237":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"289":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"132":{"tf":1.0},"192":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"271":{"tf":1.4142135623730951},"316":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"177":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"212":{"tf":1.4142135623730951},"216":{"tf":1.0},"272":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":6,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"126":{"tf":1.0},"157":{"tf":1.0},"168":{"tf":2.8284271247461903},"212":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"168":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"w":{"df":2,"docs":{"23":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"a":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"230":{"tf":2.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"g":{"df":13,"docs":{"211":{"tf":1.0},"244":{"tf":1.4142135623730951},"263":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"51":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.4142135623730951},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"256":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":16,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.4142135623730951},"212":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":2.6457513110645907},"277":{"tf":1.0},"312":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"56":{"tf":1.0},"57":{"tf":2.6457513110645907},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"312":{"tf":1.0}}},"v":{"a":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"26":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"131":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"53":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":9,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"219":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"312":{"tf":1.0},"45":{"tf":2.0},"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"105":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"18":{"tf":1.4142135623730951},"195":{"tf":1.0},"197":{"tf":1.7320508075688772},"227":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772},"312":{"tf":1.0},"40":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.0}},"s":{"1":{"0":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"1":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.7320508075688772}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":53,"docs":{"113":{"tf":1.0},"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"144":{"tf":2.0},"15":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":2.8284271247461903},"174":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"20":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"269":{"tf":1.0},"273":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":2.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"304":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":2.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"255":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.0}}}}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.4142135623730951},"308":{"tf":1.0},"313":{"tf":1.0}}}},"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"p":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"115":{"tf":1.0},"237":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"158":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"57":{"tf":2.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"df":1,"docs":{"189":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}},"t":{"df":12,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"189":{"tf":1.0},"19":{"tf":1.0},"233":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"312":{"tf":1.0},"320":{"tf":1.0},"45":{"tf":3.0}},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"203":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"117":{"tf":1.0},"146":{"tf":1.7320508075688772},"281":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"s":{"df":14,"docs":{"144":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"269":{"tf":1.0},"276":{"tf":1.0},"296":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}}}}},"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":3,"docs":{"240":{"tf":2.0},"296":{"tf":1.4142135623730951},"309":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"136":{"tf":1.0},"143":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"151":{"tf":1.0},"240":{"tf":1.0},"312":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":51,"docs":{"10":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"266":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"273":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"292":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"313":{"tf":2.0},"314":{"tf":1.0},"315":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"213":{"tf":1.0},"327":{"tf":1.0},"52":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"301":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"115":{"tf":2.23606797749979},"120":{"tf":2.23606797749979},"124":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.7320508075688772},"197":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"146":{"tf":1.0},"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"269":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"155":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":25,"docs":{"19":{"tf":1.0},"192":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"255":{"tf":1.0},"26":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.0},"292":{"tf":2.23606797749979},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":2.0},"313":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"43":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"22":{"tf":1.0}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"19":{"tf":1.0},"255":{"tf":1.0}}}}}},"i":{"df":4,"docs":{"289":{"tf":1.0},"302":{"tf":1.0},"318":{"tf":1.0},"63":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"226":{"tf":1.0},"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"146":{"tf":1.0},"326":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"329":{"tf":1.0},"40":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"1":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}},"r":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"255":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":5,"docs":{"243":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"34":{"tf":1.0},"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"41":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":69,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":2.23606797749979},"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"223":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"27":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"28":{"tf":2.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.7320508075688772},"289":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.0},"32":{"tf":1.0},"322":{"tf":1.4142135623730951},"323":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772},"38":{"tf":1.0},"4":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"64":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"223":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"132":{"tf":1.0},"222":{"tf":1.0},"28":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"281":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"138":{"tf":1.0},"146":{"tf":1.0},"162":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":6,"docs":{"141":{"tf":1.4142135623730951},"275":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"67":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"m":{"a":{"df":5,"docs":{"171":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0}},"n":{"d":{"df":14,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"128":{"tf":1.0},"240":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"216":{"tf":1.0},"322":{"tf":1.0},"52":{"tf":1.0},"60":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"330":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"67":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":15,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"327":{"tf":1.4142135623730951},"328":{"tf":2.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"4":{"tf":1.0},"52":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"146":{"tf":1.0},"170":{"tf":1.0},"25":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"183":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}}}}}}}},"t":{"df":2,"docs":{"119":{"tf":1.0},"292":{"tf":1.0}}}},"df":1,"docs":{"244":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"123":{"tf":1.0},"135":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"143":{"tf":1.0},"144":{"tf":1.0},"158":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"223":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"237":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"276":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":2.449489742783178},"289":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":2.0},"313":{"tf":2.0},"316":{"tf":1.0},"45":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":2.0},"64":{"tf":2.0},"65":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{":":{"1":{":":{"6":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"t":{"df":6,"docs":{"13":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.0},"27":{"tf":1.0}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":7,"docs":{"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.4142135623730951},"28":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"292":{"tf":1.0},"57":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{">":{"(":{"_":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"243":{"tf":1.7320508075688772},"256":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"132":{"tf":1.0},"243":{"tf":1.4142135623730951}}}}}}},">":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"165":{"tf":1.0},"167":{"tf":2.0},"19":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"213":{"tf":1.0},"319":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"323":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"216":{"tf":1.0},"283":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"146":{"tf":1.0},"158":{"tf":1.0},"175":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.7320508075688772},"212":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}},"i":{"d":{"df":6,"docs":{"19":{"tf":1.0},"22":{"tf":1.0},"280":{"tf":1.0},"297":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"123":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"171":{"tf":1.0},"181":{"tf":1.0},"190":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"33":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.4142135623730951},"197":{"tf":1.0},"203":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":2.23606797749979},"184":{"tf":1.0},"233":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"268":{"tf":1.0},"321":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"139":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":3.0},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"141":{"tf":1.0},"222":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"40":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"130":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"df":1,"docs":{"302":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":36,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":2.23606797749979},"144":{"tf":3.0},"145":{"tf":2.23606797749979},"146":{"tf":4.242640687119285},"148":{"tf":1.7320508075688772},"149":{"tf":1.4142135623730951},"150":{"tf":1.4142135623730951},"151":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"258":{"tf":3.1622776601683795},"271":{"tf":1.0},"304":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":3.3166247903554},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}},"u":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"45":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":7,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":2.0},"157":{"tf":1.0},"169":{"tf":2.8284271247461903},"20":{"tf":1.0},"327":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"'":{"df":6,"docs":{"135":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}},".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":119,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.0},"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"12":{"tf":1.4142135623730951},"129":{"tf":1.0},"13":{"tf":2.23606797749979},"130":{"tf":2.0},"135":{"tf":4.242640687119285},"136":{"tf":1.0},"137":{"tf":2.0},"138":{"tf":2.6457513110645907},"139":{"tf":1.7320508075688772},"14":{"tf":1.4142135623730951},"140":{"tf":1.7320508075688772},"141":{"tf":2.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":3.4641016151377544},"15":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":2.449489742783178},"153":{"tf":2.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"159":{"tf":1.4142135623730951},"16":{"tf":2.6457513110645907},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":2.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":3.0},"19":{"tf":2.8284271247461903},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":1.7320508075688772},"203":{"tf":1.0},"204":{"tf":1.0},"21":{"tf":1.0},"219":{"tf":3.1622776601683795},"230":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"244":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"28":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"299":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"308":{"tf":2.449489742783178},"309":{"tf":2.449489742783178},"310":{"tf":1.0},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"33":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"39":{"tf":1.4142135623730951},"40":{"tf":4.58257569495584},"41":{"tf":2.449489742783178},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":2.0},"45":{"tf":3.4641016151377544},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.7320508075688772},"7":{"tf":2.449489742783178},"8":{"tf":2.23606797749979},"9":{"tf":2.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":8,"docs":{"208":{"tf":1.4142135623730951},"209":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"4":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":16,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0},"320":{"tf":1.0},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"143":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"255":{"tf":1.0}}},"t":{"df":2,"docs":{"240":{"tf":1.0},"40":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.0}}},"t":{"df":4,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}}}},"y":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"141":{"tf":1.0},"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"95":{"tf":2.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"205":{"tf":1.0},"240":{"tf":1.4142135623730951},"275":{"tf":1.0},"316":{"tf":1.7320508075688772},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"79":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.4142135623730951},"322":{"tf":1.0},"326":{"tf":1.0},"65":{"tf":1.0},"69":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"284":{"tf":1.0},"292":{"tf":1.0},"65":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"133":{"tf":1.0},"141":{"tf":1.4142135623730951},"173":{"tf":1.0},"266":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"44":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"q":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"2":{"/":{"0":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"319":{"tf":1.0},"330":{"tf":1.0}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"306":{"tf":1.0}}}},"i":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"234":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"269":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":36,"docs":{"13":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"29":{"tf":1.0},"301":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"2":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"189":{"tf":1.0}}}}}},"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":3,"docs":{"189":{"tf":1.0},"305":{"tf":1.0},"312":{"tf":1.0}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"150":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"266":{"tf":1.0},"312":{"tf":1.0}}}},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"79":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"108":{"tf":1.0},"69":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"x":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":6,"docs":{"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"151":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"43":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":2,"docs":{"135":{"tf":1.0},"240":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"145":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}}},"df":3,"docs":{"240":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"148":{"tf":1.0},"240":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"230":{"tf":1.0}},"l":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"149":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":23,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.7320508075688772},"148":{"tf":1.0},"149":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":1.7320508075688772},"249":{"tf":1.0},"258":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"243":{"tf":1.0},"30":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":24,"docs":{"10":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"312":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"68":{"tf":1.0}}}}}},"v":{"df":9,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"292":{"tf":1.4142135623730951},"32":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"141":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"130":{"tf":2.0}}}},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{}},"df":30,"docs":{"113":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.7320508075688772},"148":{"tf":1.0},"150":{"tf":1.0},"163":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"200":{"tf":2.0},"202":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"250":{"tf":1.4142135623730951},"28":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"c":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"45":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.7320508075688772},"45":{"tf":1.0}}},"s":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":15,"docs":{"130":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.7320508075688772},"316":{"tf":1.7320508075688772},"40":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":4,"docs":{"279":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"44":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":11,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"255":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"287":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":31,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"144":{"tf":1.0},"152":{"tf":1.4142135623730951},"163":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"287":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"68":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":18,"docs":{"130":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":1.0},"250":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"27":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":2.0},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"310":{"tf":1.0},"7":{"tf":1.0}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":7,"docs":{"19":{"tf":1.0},"240":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0},"33":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"184":{"tf":1.4142135623730951},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"287":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":11,"docs":{"138":{"tf":1.0},"159":{"tf":1.0},"226":{"tf":1.7320508075688772},"24":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"277":{"tf":2.0},"30":{"tf":2.449489742783178},"305":{"tf":1.0},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"1":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":22,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"13":{"tf":2.23606797749979},"135":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":2.23606797749979},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":2.8284271247461903},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"219":{"tf":2.23606797749979},"235":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.7320508075688772},"46":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"146":{"tf":1.0},"204":{"tf":1.0},"249":{"tf":1.0}}}},"o":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"181":{"tf":1.4142135623730951},"200":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"255":{"tf":1.0},"317":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":1.0},"211":{"tf":1.0},"215":{"tf":1.0},"232":{"tf":1.0},"275":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"250":{"tf":1.0},"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"191":{"tf":1.0},"203":{"tf":1.0},"249":{"tf":1.0},"266":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"325":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}}},"v":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":18,"docs":{"0":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"136":{"tf":1.0},"14":{"tf":2.23606797749979},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"21":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.7320508075688772},"22":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"315":{"tf":1.4142135623730951},"40":{"tf":1.0},"56":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.4142135623730951},"16":{"tf":1.0},"178":{"tf":1.0},"191":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"64":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"255":{"tf":1.0},"281":{"tf":1.0}}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":2.8284271247461903},"69":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":9,"docs":{"123":{"tf":1.0},"14":{"tf":1.0},"159":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"2":{"tf":1.0},"268":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"211":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"292":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":4,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":1.0},"302":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"215":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":1,"docs":{"281":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"171":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"117":{"tf":1.0},"292":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"308":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"275":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"c":{"df":6,"docs":{"211":{"tf":1.7320508075688772},"222":{"tf":1.0},"4":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.7320508075688772},"301":{"tf":1.0},"315":{"tf":1.0},"317":{"tf":1.0},"4":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":10,"docs":{"13":{"tf":1.0},"18":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":2.0},"272":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.0}}}}}}}}},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"=":{"2":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"g":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"'":{"df":0,"docs":{},"t":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"25":{"tf":1.0},"271":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"14":{"tf":1.0},"20":{"tf":1.0},"212":{"tf":1.0},"25":{"tf":1.0},"296":{"tf":1.0}}},"g":{".":{"df":0,"docs":{},"f":{"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"240":{"tf":1.4142135623730951},"271":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":5,"docs":{"217":{"tf":1.0},"24":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772},"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"16":{"tf":1.0},"250":{"tf":1.0}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}},"p":{"df":1,"docs":{"200":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"204":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.0},"40":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":26,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"152":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.7320508075688772},"253":{"tf":1.0},"255":{"tf":1.0},"275":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":11,"docs":{"132":{"tf":1.0},"191":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"27":{"tf":1.0},"43":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"181":{"tf":1.0},"250":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"143":{"tf":1.0}}}}},"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"68":{"tf":1.4142135623730951},"94":{"tf":1.4142135623730951},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":3,"docs":{"102":{"tf":1.0},"68":{"tf":1.4142135623730951},"99":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.4142135623730951},"106":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":3,"docs":{"68":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"72":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.4142135623730951},"63":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}},"u":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"323":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"314":{"tf":1.0},"52":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.7320508075688772},"284":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"163":{"tf":1.0},"292":{"tf":1.0},"68":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"192":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"243":{"tf":1.0},"269":{"tf":1.0},"296":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"0":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"146":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.0}},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":9,"docs":{"269":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.7320508075688772},"313":{"tf":1.0},"38":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"130":{"tf":1.0},"136":{"tf":1.0},"146":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"177":{"tf":1.0},"237":{"tf":1.0}}}}},"o":{"d":{"df":14,"docs":{"131":{"tf":1.7320508075688772},"163":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":2.23606797749979},"294":{"tf":1.0},"304":{"tf":1.0},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":2.23606797749979}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}},"df":2,"docs":{"104":{"tf":1.0},"141":{"tf":1.0}}}}}}},"d":{"_":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"160":{"tf":1.0},"266":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"43":{"tf":2.449489742783178},"44":{"tf":1.0},"48":{"tf":1.0},"8":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"233":{"tf":1.0},"241":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":15,"docs":{"219":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"289":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"60":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"42":{"tf":1.0},"43":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":9,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"133":{"tf":2.8284271247461903},"135":{"tf":1.0},"170":{"tf":1.0},"187":{"tf":1.0},"194":{"tf":1.7320508075688772},"240":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.7320508075688772}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"26":{"tf":1.0},"321":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"46":{"tf":1.0}}}}}}},"o":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":13,"docs":{"131":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"173":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"183":{"tf":2.0},"191":{"tf":1.0},"201":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"191":{"tf":1.4142135623730951},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"c":{"1":{"1":{"5":{"5":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"x":{"1":{"0":{"0":{"df":1,"docs":{"279":{"tf":1.0}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"14":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.4142135623730951},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.4142135623730951},"269":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.4142135623730951},"300":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":1.0},"313":{"tf":2.0},"316":{"tf":1.0},"48":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"146":{"tf":1.0},"210":{"tf":1.0},"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":7,"docs":{"146":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"250":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.4142135623730951},"304":{"tf":1.0}},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"'":{"df":2,"docs":{"16":{"tf":1.0},"69":{"tf":1.0}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":17,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.0},"16":{"tf":1.0},"187":{"tf":1.0},"19":{"tf":1.4142135623730951},"195":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"79":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"s":{"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":10,"docs":{"123":{"tf":1.7320508075688772},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"167":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"178":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0}},"t":{"df":15,"docs":{"118":{"tf":1.0},"140":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"323":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0}},"u":{"df":1,"docs":{"173":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"320":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"26":{"tf":1.0}}}}}}},"m":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"135":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.7320508075688772},"200":{"tf":1.0},"220":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.0},"3":{"tf":1.7320508075688772},"57":{"tf":1.0},"68":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"197":{"tf":1.0},"271":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"60":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":121,"docs":{"10":{"tf":1.0},"103":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"127":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":2.449489742783178},"143":{"tf":1.4142135623730951},"147":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.4142135623730951},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"195":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"226":{"tf":1.0},"230":{"tf":2.23606797749979},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":2.449489742783178},"249":{"tf":1.0},"255":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.7320508075688772},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979},"280":{"tf":2.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":2.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":3.7416573867739413},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":5,"docs":{"201":{"tf":1.0},"207":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"41":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"268":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.4142135623730951},"16":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"233":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":2.0},"268":{"tf":1.0},"288":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"13":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"309":{"tf":1.0}}}},"t":{"df":1,"docs":{"244":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"21":{"tf":1.0},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"281":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"33":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"n":{"df":2,"docs":{"211":{"tf":1.0},"326":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"313":{"tf":1.4142135623730951}}}}}}}}},"df":7,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"164":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"321":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"10":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"164":{"tf":1.0},"268":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"182":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}}}}}},"s":{"df":7,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":46,"docs":{"1":{"tf":1.4142135623730951},"113":{"tf":2.8284271247461903},"123":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":2.6457513110645907},"170":{"tf":1.4142135623730951},"171":{"tf":2.8284271247461903},"172":{"tf":3.1622776601683795},"173":{"tf":2.8284271247461903},"174":{"tf":3.872983346207417},"175":{"tf":3.1622776601683795},"176":{"tf":1.0},"177":{"tf":2.0},"178":{"tf":2.449489742783178},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"181":{"tf":1.4142135623730951},"182":{"tf":4.795831523312719},"183":{"tf":3.4641016151377544},"184":{"tf":2.0},"185":{"tf":2.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"204":{"tf":1.4142135623730951},"243":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.0},"320":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":5,"docs":{"135":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":2.0},"50":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":15,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"144":{"tf":1.4142135623730951},"193":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"32":{"tf":1.0},"327":{"tf":1.0},"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"146":{"tf":1.0},"227":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{},"x":{"df":1,"docs":{"296":{"tf":1.4142135623730951}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"266":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"322":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":21,"docs":{"106":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"184":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"262":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":1,"docs":{"191":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":1,"docs":{"330":{"tf":1.0}}},"r":{"df":1,"docs":{"240":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"266":{"tf":1.0},"284":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":9,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.4142135623730951},"133":{"tf":1.0},"185":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0}},"e":{"'":{"df":2,"docs":{"132":{"tf":1.0},"2":{"tf":1.0}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"m":{"d":{"6":{"4":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":38,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"259":{"tf":1.0},"26":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}},"df":98,"docs":{"0":{"tf":2.0},"1":{"tf":2.23606797749979},"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"117":{"tf":1.0},"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"187":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":2.0},"20":{"tf":1.7320508075688772},"208":{"tf":1.0},"21":{"tf":1.7320508075688772},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.6457513110645907},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.23606797749979},"23":{"tf":2.0},"232":{"tf":1.0},"233":{"tf":1.4142135623730951},"24":{"tf":2.0},"240":{"tf":2.0},"243":{"tf":2.6457513110645907},"25":{"tf":2.6457513110645907},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"26":{"tf":3.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"287":{"tf":1.0},"29":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951},"292":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"3":{"tf":1.7320508075688772},"301":{"tf":1.4142135623730951},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.7320508075688772},"315":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"38":{"tf":2.0},"4":{"tf":1.4142135623730951},"40":{"tf":2.6457513110645907},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.7320508075688772},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":2.8284271247461903},"53":{"tf":2.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"6":{"tf":2.449489742783178},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"266":{"tf":1.0}}}},"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"252":{"tf":1.0}},"l":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"45":{"tf":1.0},"66":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.0},"170":{"tf":1.7320508075688772},"174":{"tf":2.8284271247461903},"191":{"tf":3.1622776601683795},"193":{"tf":1.7320508075688772},"231":{"tf":1.0},"240":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":2.8284271247461903},"309":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":21,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"219":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"266":{"tf":3.0},"275":{"tf":2.23606797749979},"276":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.0},"309":{"tf":1.0},"32":{"tf":1.4142135623730951},"38":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":2.6457513110645907}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"222":{"tf":2.0},"277":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"178":{"tf":1.0},"216":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":11,"docs":{"13":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"26":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"255":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"10":{"tf":1.0},"40":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":25,"docs":{"10":{"tf":1.0},"108":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.4142135623730951},"13":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"206":{"tf":1.0},"210":{"tf":1.0},"232":{"tf":1.0},"283":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.4142135623730951},"68":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"t":{"df":4,"docs":{"240":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"x":{"df":27,"docs":{"131":{"tf":1.0},"192":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.7320508075688772},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"269":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"284":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":2.0},"289":{"tf":1.0},"293":{"tf":2.23606797749979},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"74":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"306":{"tf":1.0},"310":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"108":{"tf":1.0},"219":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0},"9":{"tf":1.0}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"n":{"df":105,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":2.0},"164":{"tf":2.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":2.0},"197":{"tf":1.0},"2":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":2.6457513110645907},"231":{"tf":2.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"241":{"tf":1.4142135623730951},"243":{"tf":3.7416573867739413},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":2.449489742783178},"258":{"tf":3.1622776601683795},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"275":{"tf":2.23606797749979},"279":{"tf":1.7320508075688772},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.0},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.872983346207417},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":2.6457513110645907},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"152":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":58,"docs":{"115":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":1.4142135623730951},"23":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"325":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}},"w":{"df":1,"docs":{"231":{"tf":1.0}}}}},"o":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{")":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"146":{"tf":1.4142135623730951},"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.7320508075688772}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"2":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"146":{"tf":1.7320508075688772},"244":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}},"g":{"(":{"4":{"2":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.0}}}}},"df":0,"docs":{}},"2":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"189":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}},":":{":":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"{":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"=":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":55,"docs":{"130":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"204":{"tf":1.0},"207":{"tf":1.4142135623730951},"222":{"tf":2.0},"223":{"tf":1.0},"230":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":2.6457513110645907},"244":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"258":{"tf":3.3166247903554},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"293":{"tf":2.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.7320508075688772},"308":{"tf":2.449489742783178},"312":{"tf":3.7416573867739413},"313":{"tf":1.4142135623730951}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":3,"docs":{"211":{"tf":1.0},"216":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"m":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"294":{"tf":1.0},"30":{"tf":1.0}}}},"df":9,"docs":{"104":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.4142135623730951},"164":{"tf":1.0},"18":{"tf":1.0},"181":{"tf":1.0},"300":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"235":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"127":{"tf":1.0},"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"197":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"206":{"tf":1.0},"320":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"266":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"197":{"tf":1.0},"308":{"tf":1.0},"57":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"292":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":80,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.0},"108":{"tf":1.4142135623730951},"111":{"tf":1.0},"113":{"tf":1.4142135623730951},"130":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.449489742783178},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"137":{"tf":1.0},"138":{"tf":3.1622776601683795},"139":{"tf":2.0},"141":{"tf":5.656854249492381},"143":{"tf":3.1622776601683795},"144":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"146":{"tf":2.0},"148":{"tf":1.0},"152":{"tf":2.0},"16":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":2.23606797749979},"18":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"199":{"tf":1.0},"205":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":3.7416573867739413},"241":{"tf":1.4142135623730951},"243":{"tf":2.449489742783178},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":2.23606797749979},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":2.23606797749979},"279":{"tf":3.0},"281":{"tf":1.0},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.7320508075688772},"302":{"tf":1.0},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":2.0},"40":{"tf":2.0},"42":{"tf":1.0},"44":{"tf":2.0},"45":{"tf":1.4142135623730951},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.0},"74":{"tf":1.4142135623730951},"77":{"tf":1.0},"79":{"tf":1.0},"82":{"tf":1.0},"84":{"tf":1.4142135623730951},"87":{"tf":1.0},"89":{"tf":1.0},"9":{"tf":1.4142135623730951},"92":{"tf":1.0},"96":{"tf":1.0}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"141":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.0},"23":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"64":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.0},"119":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0}}}}}}},"g":{"1":{"df":1,"docs":{"105":{"tf":1.0}}},"2":{"df":1,"docs":{"105":{"tf":1.0}}},"a":{"df":5,"docs":{"13":{"tf":1.0},"19":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"44":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"df":1,"docs":{"296":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"0":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":2.0},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"262":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.0},"296":{"tf":1.0},"310":{"tf":1.0},"60":{"tf":2.0},"61":{"tf":1.0},"74":{"tf":1.0}},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"_":{"4":{"2":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.7320508075688772},"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0}}}}}}},"df":1,"docs":{"10":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"178":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"3":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"217":{"tf":1.0},"22":{"tf":1.0},"64":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"216":{"tf":1.4142135623730951},"26":{"tf":1.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"160":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.4142135623730951},"64":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.4142135623730951},"18":{"tf":1.0},"219":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":17,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"206":{"tf":1.0},"207":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"258":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"264":{"tf":1.4142135623730951},"273":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":3,"docs":{"27":{"tf":1.0},"52":{"tf":1.0},"64":{"tf":1.0}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"b":{"df":1,"docs":{"16":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"250":{"tf":1.0},"277":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"171":{"tf":1.0},"183":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"140":{"tf":1.0},"28":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"8":{"tf":2.23606797749979},"9":{"tf":1.0}},"e":{":":{"1":{"0":{":":{"1":{"4":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.0},"2":{"tf":1.0},"240":{"tf":1.0},"296":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}}},"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.0},"296":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"d":{"df":15,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"325":{"tf":1.4142135623730951},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"296":{"tf":1.0},"31":{"tf":1.0},"64":{"tf":1.4142135623730951}},"l":{"df":6,"docs":{"13":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"299":{"tf":1.0},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":5,"docs":{"22":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":1,"docs":{"211":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"320":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"329":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"249":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":14,"docs":{"108":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.4142135623730951},"230":{"tf":1.0},"312":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"85":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"130":{"tf":1.0},"250":{"tf":1.4142135623730951},"44":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.0}}}}}}}},"df":5,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"25":{"tf":1.0}},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"169":{"tf":1.0},"30":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":3,"docs":{"124":{"tf":1.0},"181":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"p":{"df":12,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":2.0},"255":{"tf":1.0},"281":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0}}}},"n":{"c":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}},"df":13,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.4142135623730951},"182":{"tf":1.0},"183":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"237":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"193":{"tf":1.0}}}}}}}}},"x":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"1":{".":{".":{"6":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"304":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":2.23606797749979}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"135":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"200":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}},"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":6,"docs":{"174":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.449489742783178},"45":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"187":{"tf":1.0},"197":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"24":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"t":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"268":{"tf":2.0},"312":{"tf":2.8284271247461903}},"e":{"(":{"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}},"v":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0}},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"v":{"0":{".":{"8":{".":{"1":{"1":{"/":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{"df":1,"docs":{"271":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"219":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"301":{"tf":1.0}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"2":{"8":{"4":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"i":{".":{"df":6,"docs":{"143":{"tf":1.0},"204":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"1":{"2":{"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"a":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"279":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"df":0,"docs":{},"~":{"1":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}}},"[":{"1":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"174":{"tf":1.0},"185":{"tf":1.4142135623730951},"190":{"tf":1.0},"243":{"tf":3.1622776601683795},"255":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":8,"docs":{"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"250":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"8":{"[":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":8,"docs":{"130":{"tf":1.0},"132":{"tf":1.4142135623730951},"190":{"tf":1.0},"244":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.0},"296":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"c":{"df":7,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"276":{"tf":1.0},"293":{"tf":1.7320508075688772}}},"d":{"df":2,"docs":{"277":{"tf":1.0},"310":{"tf":1.0}},"e":{"a":{"df":2,"docs":{"20":{"tf":1.0},"212":{"tf":1.4142135623730951}},"l":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"158":{"tf":1.0},"16":{"tf":1.0},"281":{"tf":1.0},"320":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":23,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"166":{"tf":1.0},"170":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"308":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"118":{"tf":1.0},"258":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"165":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"284":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"313":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"240":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"1":{"tf":1.0},"132":{"tf":2.6457513110645907},"141":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"297":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.4142135623730951},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"69":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"132":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"283":{"tf":1.0},"308":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":16,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"32":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"288":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"v":{"df":12,"docs":{"211":{"tf":1.4142135623730951},"217":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"249":{"tf":1.0},"289":{"tf":1.4142135623730951},"294":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}},"y":{"[":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}}}}},"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"324":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"d":{"df":24,"docs":{"143":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"196":{"tf":1.0},"212":{"tf":1.0},"223":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"309":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0},"79":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"320":{"tf":1.0},"52":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":2.0}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"233":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"191":{"tf":1.0},"200":{"tf":1.4142135623730951},"206":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":8,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"41":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"177":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":4,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"15":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":6,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"312":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"138":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"250":{"tf":1.7320508075688772}}}}},"x":{"df":1,"docs":{"182":{"tf":1.0}}}},"o":{"df":4,"docs":{"135":{"tf":1.0},"144":{"tf":1.4142135623730951},"158":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":12,"docs":{"146":{"tf":2.23606797749979},"148":{"tf":1.0},"15":{"tf":1.0},"151":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"266":{"tf":1.0},"275":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"130":{"tf":1.7320508075688772},"233":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}},"df":1,"docs":{"312":{"tf":1.0}},"i":{"df":11,"docs":{"135":{"tf":1.0},"139":{"tf":1.0},"174":{"tf":2.8284271247461903},"175":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":2.0},"45":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"159":{"tf":1.0},"279":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":1,"docs":{"243":{"tf":1.4142135623730951}},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"df":1,"docs":{"243":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"168":{"tf":1.0},"169":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":7,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":10,"docs":{"141":{"tf":1.0},"146":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":2.0},"152":{"tf":1.4142135623730951},"203":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"t":{"a":{"df":1,"docs":{"302":{"tf":1.0}},"l":{"df":12,"docs":{"14":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":2.0},"23":{"tf":1.7320508075688772},"24":{"tf":1.4142135623730951},"26":{"tf":2.23606797749979},"27":{"tf":1.4142135623730951},"38":{"tf":2.23606797749979},"57":{"tf":2.0},"6":{"tf":2.0},"60":{"tf":1.0},"7":{"tf":1.0}}},"n":{"c":{"df":14,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"146":{"tf":1.7320508075688772},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"193":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"258":{"tf":1.4142135623730951},"276":{"tf":1.0},"305":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.0},"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"312":{"tf":1.4142135623730951},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":17,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"265":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"315":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"244":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"269":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":16,"docs":{"124":{"tf":2.0},"127":{"tf":1.7320508075688772},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":1.0},"173":{"tf":1.4142135623730951},"181":{"tf":1.0},"192":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"187":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"271":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"14":{"tf":1.0},"143":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"320":{"tf":1.0},"327":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"329":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"9":{"tf":1.0}}}}},"f":{"a":{"c":{"df":5,"docs":{"130":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"189":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":17,"docs":{"130":{"tf":1.0},"138":{"tf":1.0},"191":{"tf":1.0},"266":{"tf":1.7320508075688772},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"288":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.0},"302":{"tf":1.4142135623730951},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":3,"docs":{"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"10":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"247":{"tf":1.0}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"293":{"tf":1.0},"305":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"171":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"185":{"tf":1.0},"287":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}},"o":{"c":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":5,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"40":{"tf":1.0}}},"l":{"df":0,"docs":{},"v":{"df":4,"docs":{"22":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"4":{"tf":1.0}}}}}}},"p":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"57":{"tf":1.0}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":15,"docs":{"160":{"tf":1.0},"210":{"tf":2.0},"212":{"tf":1.7320508075688772},"213":{"tf":1.0},"215":{"tf":2.449489742783178},"230":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"322":{"tf":1.0},"64":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"'":{"df":5,"docs":{"219":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"277":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.7320508075688772},"191":{"tf":1.0}}},"1":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}},"2":{"df":1,"docs":{"174":{"tf":1.0}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"300":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":22,"docs":{"113":{"tf":1.0},"115":{"tf":2.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"175":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.4142135623730951},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":1.0},"37":{"tf":1.4142135623730951}}},"r":{"df":2,"docs":{"169":{"tf":1.0},"316":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"212":{"tf":1.0},"215":{"tf":1.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"305":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"14":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}},"df":1,"docs":{"105":{"tf":1.0}},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":1,"docs":{"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":4,"docs":{"15":{"tf":1.0},"206":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"207":{"tf":1.0}}}},"y":{"df":13,"docs":{"141":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"177":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"40":{"tf":2.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":2.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":21,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.4142135623730951},"118":{"tf":1.4142135623730951},"119":{"tf":2.0},"120":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"287":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"315":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"130":{"tf":1.0},"40":{"tf":1.0}},"n":{"df":6,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"191":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0}}}}}},"w":{"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"118":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"115":{"tf":1.0},"118":{"tf":1.0}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":6,"docs":{"141":{"tf":3.4641016151377544},"173":{"tf":1.4142135623730951},"255":{"tf":3.4641016151377544},"265":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0}}}}},"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{},"g":{".":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":4,"docs":{"301":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"113":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"187":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"3":{"tf":1.7320508075688772},"321":{"tf":1.0},"326":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"43":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"64":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.0},"289":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":11,"docs":{"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"321":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}}}},"v":{"df":4,"docs":{"164":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"255":{"tf":1.0},"280":{"tf":1.7320508075688772},"292":{"tf":1.0},"296":{"tf":1.0}}}},"n":{"df":1,"docs":{"230":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"191":{"tf":1.0},"193":{"tf":1.7320508075688772},"243":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.0},"90":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"201":{"tf":1.0},"3":{"tf":1.0},"312":{"tf":1.0}}}},"t":{"'":{"df":6,"docs":{"280":{"tf":1.0},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":12,"docs":{"0":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"115":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"c":{"df":2,"docs":{"113":{"tf":1.0},"116":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":4,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":14,"docs":{"132":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"31":{"tf":1.4142135623730951},"314":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"79":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"308":{"tf":1.0}}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"187":{"tf":1.0},"268":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"128":{"tf":1.0}}}}},"df":0,"docs":{}},"df":6,"docs":{"122":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}}},"k":{"df":6,"docs":{"19":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"49":{"tf":1.4142135623730951},"64":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"243":{"tf":1.4142135623730951},"26":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":2.8284271247461903},"187":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"216":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"30":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}}},"df":20,"docs":{"113":{"tf":1.0},"123":{"tf":1.7320508075688772},"124":{"tf":1.4142135623730951},"125":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":2.6457513110645907},"172":{"tf":1.0},"181":{"tf":1.7320508075688772},"192":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"233":{"tf":1.0},"287":{"tf":1.4142135623730951},"296":{"tf":2.0},"299":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":2.0}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"13":{"tf":1.7320508075688772},"15":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.7320508075688772},"51":{"tf":1.4142135623730951}}}}},"o":{"a":{"d":{"df":5,"docs":{"159":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.0},"280":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"211":{"tf":1.0},"219":{"tf":1.7320508075688772},"260":{"tf":1.0},"261":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"65":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"144":{"tf":1.0},"178":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"207":{"tf":1.0},"233":{"tf":1.0},"25":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":2.449489742783178},"281":{"tf":1.0},"284":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0}},"i":{"c":{"df":8,"docs":{"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"182":{"tf":1.0},"184":{"tf":1.4142135623730951},"41":{"tf":2.0}}},"df":0,"docs":{}},"s":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"313":{"tf":1.0}}},"g":{"df":2,"docs":{"141":{"tf":1.0},"288":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":7,"docs":{"143":{"tf":1.4142135623730951},"17":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"19":{"tf":1.0},"42":{"tf":1.0}}}}},"p":{"df":5,"docs":{"166":{"tf":1.4142135623730951},"167":{"tf":2.449489742783178},"168":{"tf":2.449489742783178},"169":{"tf":2.449489742783178},"316":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"w":{"df":3,"docs":{"258":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"247":{"tf":1.4142135623730951},"269":{"tf":1.0},"284":{"tf":1.0},"302":{"tf":1.0},"40":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":3,"docs":{"23":{"tf":1.0},"230":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}}},"o":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"163":{"tf":1.0},"216":{"tf":1.4142135623730951},"243":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}},"n":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"130":{"tf":1.4142135623730951},"226":{"tf":1.0},"243":{"tf":1.0},"275":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"211":{"tf":1.0},"266":{"tf":1.0},"31":{"tf":1.7320508075688772},"41":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"51":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"e":{"df":30,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.4142135623730951},"19":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":1.0},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"14":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":7,"docs":{"19":{"tf":1.0},"212":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"49":{"tf":1.0},"79":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"226":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.7320508075688772}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"240":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"<":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":17,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.7320508075688772},"2":{"tf":1.0},"204":{"tf":1.7320508075688772},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"48":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":1,"docs":{"196":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":13,"docs":{"113":{"tf":1.4142135623730951},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"177":{"tf":1.7320508075688772},"187":{"tf":1.0},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"256":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.7320508075688772},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":14,"docs":{"118":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":2.23606797749979},"191":{"tf":1.0},"219":{"tf":1.4142135623730951},"240":{"tf":2.6457513110645907},"255":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"272":{"tf":1.0}}}}}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"143":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":5,"docs":{"190":{"tf":1.4142135623730951},"197":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":7,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":1.0},"183":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"191":{"tf":1.0}}}}},"t":{"df":1,"docs":{"136":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"249":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":1,"docs":{"250":{"tf":1.0}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":16,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"141":{"tf":1.0},"187":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":2.449489742783178},"207":{"tf":1.7320508075688772},"230":{"tf":1.0},"250":{"tf":1.4142135623730951},"256":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":17,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"90":{"tf":2.449489742783178},"91":{"tf":1.0},"92":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"227":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"8":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"107":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"230":{"tf":2.23606797749979},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":2.23606797749979}}}}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"215":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":29,"docs":{"10":{"tf":1.7320508075688772},"108":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"2":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"69":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"249":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":19,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"48":{"tf":1.0},"9":{"tf":2.23606797749979}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"132":{"tf":2.449489742783178},"237":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"280":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"238":{"tf":1.0}}}},"u":{"df":2,"docs":{"185":{"tf":1.0},"250":{"tf":1.0}},"t":{"df":1,"docs":{"66":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"264":{"tf":1.0},"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":4,"docs":{"231":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"13":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"x":{"df":2,"docs":{"109":{"tf":1.0},"312":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":2.0}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":4,"docs":{"68":{"tf":1.4142135623730951},"89":{"tf":1.4142135623730951},"91":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":1,"docs":{"275":{"tf":1.0}},"e":{"df":1,"docs":{"31":{"tf":1.7320508075688772}},"r":{"df":1,"docs":{"322":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":17,"docs":{"108":{"tf":1.0},"110":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"275":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"89":{"tf":1.0}}}},"df":16,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"180":{"tf":1.0},"193":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":2.0},"266":{"tf":2.449489742783178},"275":{"tf":2.0},"279":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951}},"e":{"'":{"df":1,"docs":{"266":{"tf":1.0}}},".":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"d":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}},"u":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"315":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":33,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"13":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.7320508075688772},"206":{"tf":1.0},"21":{"tf":1.0},"232":{"tf":1.0},"255":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"35":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"139":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":6,"docs":{"161":{"tf":1.0},"217":{"tf":1.0},"277":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"42":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"'":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"258":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"146":{"tf":1.0},"312":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"l":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"104":{"tf":1.0},"135":{"tf":1.0},"182":{"tf":1.0},"219":{"tf":1.0},"244":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"42":{"tf":1.0}},"i":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"144":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"145":{"tf":2.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.4142135623730951},"161":{"tf":1.0},"162":{"tf":1.0},"240":{"tf":2.449489742783178},"40":{"tf":2.0}},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"145":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}},"df":26,"docs":{"107":{"tf":1.4142135623730951},"118":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":2.23606797749979},"150":{"tf":1.0},"153":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"177":{"tf":1.0},"230":{"tf":3.0},"240":{"tf":3.1622776601683795},"249":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"48":{"tf":1.7320508075688772},"88":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":1,"docs":{"6":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"205":{"tf":1.0}}}},"df":0,"docs":{}}},"df":6,"docs":{"243":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"276":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"258":{"tf":1.0},"283":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"250":{"tf":1.0}}},"x":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"233":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"296":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"0":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}},"e":{"(":{"1":{"df":1,"docs":{"170":{"tf":1.0}}},"a":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"313":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"222":{"tf":1.4142135623730951},"299":{"tf":1.0},"313":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":3,"docs":{"240":{"tf":1.0},"265":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":37,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"134":{"tf":1.0},"141":{"tf":2.449489742783178},"145":{"tf":1.0},"148":{"tf":1.0},"159":{"tf":1.0},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"179":{"tf":1.7320508075688772},"180":{"tf":1.0},"189":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"194":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"281":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"46":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}},"v":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"16":{"tf":1.0},"326":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":7,"docs":{"115":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":32,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"212":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"249":{"tf":1.0},"26":{"tf":1.7320508075688772},"268":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"280":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"185":{"tf":1.4142135623730951},"247":{"tf":1.0},"280":{"tf":1.7320508075688772}}}},"df":1,"docs":{"244":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"141":{"tf":1.0},"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"204":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":7,"docs":{"13":{"tf":2.0},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"19":{"tf":3.1622776601683795},"20":{"tf":1.0},"235":{"tf":1.0},"46":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0}}}}},"w":{"(":{"_":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}},"df":28,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.4142135623730951},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":2,"docs":{"122":{"tf":1.0},"124":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.0},"174":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"41":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"266":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"131":{"tf":1.0},"133":{"tf":1.0}}}}},"n":{"c":{"df":1,"docs":{"204":{"tf":2.449489742783178}}},"df":12,"docs":{"136":{"tf":1.0},"232":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"284":{"tf":1.0},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.4142135623730951},"182":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":26,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"42":{"tf":1.0},"60":{"tf":2.449489742783178},"7":{"tf":1.0}}},"h":{"df":2,"docs":{"13":{"tf":1.0},"17":{"tf":1.0}}},"i":{"c":{"df":5,"docs":{"18":{"tf":1.0},"279":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":50,"docs":{"17":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"219":{"tf":1.0},"223":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.4142135623730951},"231":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"268":{"tf":1.7320508075688772},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":2.23606797749979},"288":{"tf":1.7320508075688772},"292":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":2.6457513110645907},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"35":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":24,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.7320508075688772},"134":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.4142135623730951},"16":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"191":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"233":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}}}},"df":1,"docs":{"249":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"196":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"299":{"tf":1.0},"305":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":10,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.449489742783178},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"243":{"tf":1.0},"283":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"55":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"323":{"tf":1.7320508075688772},"49":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"240":{"tf":1.4142135623730951}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"141":{"tf":1.0},"173":{"tf":1.0},"255":{"tf":1.0}}}}},"n":{"c":{"df":6,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0},"273":{"tf":1.0},"34":{"tf":1.0},"57":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":25,"docs":{"0":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":2.0},"13":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"181":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"233":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"64":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"223":{"tf":1.0},"9":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"15":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"224":{"tf":1.0},"27":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"174":{"tf":2.449489742783178},"175":{"tf":1.7320508075688772},"184":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":29,"docs":{"105":{"tf":1.0},"113":{"tf":2.0},"146":{"tf":1.0},"153":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":2.0},"182":{"tf":2.0},"183":{"tf":1.4142135623730951},"184":{"tf":2.0},"185":{"tf":2.23606797749979},"187":{"tf":1.0},"192":{"tf":1.0},"200":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951},"52":{"tf":1.0},"69":{"tf":1.0},"89":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"212":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"249":{"tf":1.0},"292":{"tf":1.4142135623730951},"309":{"tf":2.0},"51":{"tf":1.0},"68":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"292":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":7,"docs":{"115":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.7320508075688772},"25":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"141":{"tf":1.0},"153":{"tf":1.0},"173":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"43":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":7,"docs":{"215":{"tf":1.0},"240":{"tf":2.23606797749979},"275":{"tf":1.0},"287":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"68":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.0}}},"x":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"275":{"tf":1.0}}}},"df":3,"docs":{"255":{"tf":1.0},"321":{"tf":1.0},"53":{"tf":1.0}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"268":{"tf":1.0},"287":{"tf":1.0},"324":{"tf":1.0},"42":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"141":{"tf":1.0},"19":{"tf":1.0},"212":{"tf":1.4142135623730951},"219":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"16":{"tf":1.0},"19":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":15,"docs":{"12":{"tf":1.0},"141":{"tf":1.0},"18":{"tf":1.0},"219":{"tf":1.0},"25":{"tf":1.0},"277":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":2.23606797749979},"84":{"tf":1.0},"9":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"193":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"279":{"tf":1.0},"41":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"280":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":8,"docs":{"166":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.0},"43":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"280":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"280":{"tf":1.0}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"309":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}}}},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}},"p":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"q":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":2,"docs":{"131":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951}}}},"1":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"275":{"tf":1.0}}},"2":{"5":{"6":{"df":1,"docs":{"52":{"tf":1.4142135623730951}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}}},"x":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"275":{"tf":1.0}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"23":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":3,"docs":{"18":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":10,"docs":{"20":{"tf":1.0},"220":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"r":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},".":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"146":{"tf":1.0},"243":{"tf":1.7320508075688772},"281":{"tf":1.0},"41":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"c":{"(":{"0":{"df":0,"docs":{},"x":{"3":{"2":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"171":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":2.0},"294":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":25,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"115":{"tf":1.0},"132":{"tf":1.4142135623730951},"141":{"tf":4.0},"144":{"tf":2.0},"152":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"243":{"tf":1.4142135623730951},"255":{"tf":2.0},"283":{"tf":1.0},"312":{"tf":2.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":1.7320508075688772},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"266":{"tf":1.0},"309":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":5,"docs":{"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"284":{"tf":1.0}}},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}},"s":{"df":3,"docs":{"246":{"tf":1.0},"266":{"tf":2.449489742783178},"279":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":2,"docs":{"284":{"tf":1.0},"304":{"tf":1.0}}}}},"t":{"df":6,"docs":{"130":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"277":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"213":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"281":{"tf":1.0}}},"s":{"df":22,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.7320508075688772},"145":{"tf":1.0},"18":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"313":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"t":{"df":1,"docs":{"19":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":9,"docs":{"170":{"tf":1.7320508075688772},"180":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"253":{"tf":1.0},"266":{"tf":1.4142135623730951},"288":{"tf":1.0},"30":{"tf":1.0},"34":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"133":{"tf":1.0},"170":{"tf":2.449489742783178},"240":{"tf":3.0},"329":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}}}}},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"40":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"52":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":3,"docs":{"131":{"tf":1.0},"240":{"tf":2.0},"27":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"219":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":16,"docs":{"18":{"tf":1.0},"187":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.0},"313":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.4142135623730951},"43":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"137":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"271":{"tf":1.0},"277":{"tf":1.4142135623730951},"310":{"tf":1.0}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"321":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"272":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"135":{"tf":1.0},"249":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}},"r":{"@":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"200":{"tf":1.4142135623730951},"215":{"tf":1.0},"22":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"n":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"213":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"=":{"4":{"7":{"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}}}},"y":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"57":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"1":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"131":{"tf":1.0},"178":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0}}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.4142135623730951}}}}}}}}},"1":{"df":1,"docs":{"178":{"tf":1.0}}},"2":{"df":1,"docs":{"178":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"131":{"tf":1.4142135623730951},"160":{"tf":1.0},"178":{"tf":2.0},"19":{"tf":1.4142135623730951},"22":{"tf":1.0},"240":{"tf":2.23606797749979},"244":{"tf":1.0},"258":{"tf":2.449489742783178},"275":{"tf":2.8284271247461903},"279":{"tf":1.0},"3":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"201":{"tf":1.7320508075688772},"203":{"tf":1.7320508075688772},"204":{"tf":1.0},"207":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"131":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"24":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"144":{"tf":1.0},"173":{"tf":1.0},"191":{"tf":1.4142135623730951},"321":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":1.0},"143":{"tf":1.0},"187":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.0},"277":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"287":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":3,"docs":{"287":{"tf":1.0},"323":{"tf":1.0},"54":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.4142135623730951}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"113":{"tf":1.0},"136":{"tf":1.7320508075688772},"157":{"tf":1.0},"158":{"tf":2.6457513110645907},"296":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"68":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"287":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"220":{"tf":1.0},"230":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":2.6457513110645907}},"e":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"107":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"271":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"141":{"tf":1.0},"145":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.0},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"138":{"tf":1.0},"240":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"164":{"tf":1.0},"313":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"285":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"17":{"tf":1.0},"255":{"tf":1.0},"309":{"tf":1.7320508075688772}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"u":{"df":12,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":14,"docs":{"219":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":2.0},"265":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"=":{"1":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"268":{"tf":1.0},"312":{"tf":2.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"182":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"287":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"222":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"285":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":15,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"241":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":2.0},"321":{"tf":1.4142135623730951},"326":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":3,"docs":{"143":{"tf":1.0},"210":{"tf":1.0},"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"214":{"tf":1.0},"45":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":8,"docs":{"115":{"tf":1.0},"146":{"tf":1.0},"174":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.7320508075688772},"222":{"tf":1.0},"309":{"tf":2.23606797749979},"8":{"tf":1.0}},"t":{"df":2,"docs":{"115":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"187":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"219":{"tf":1.0}}},"df":24,"docs":{"10":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"213":{"tf":1.4142135623730951},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"29":{"tf":2.23606797749979},"30":{"tf":2.449489742783178},"31":{"tf":2.449489742783178},"317":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"312":{"tf":1.0}}}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"25":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"241":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"288":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":2.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":17,"docs":{"108":{"tf":1.0},"132":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"173":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"301":{"tf":1.0},"304":{"tf":1.7320508075688772},"326":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":89,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":3.0},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.0},"189":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"196":{"tf":2.0},"2":{"tf":1.0},"222":{"tf":1.7320508075688772},"230":{"tf":1.7320508075688772},"231":{"tf":2.23606797749979},"234":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":5.291502622129181},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":2.449489742783178},"272":{"tf":1.0},"275":{"tf":2.449489742783178},"279":{"tf":1.4142135623730951},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.605551275463989},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":3.4641016151377544},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{":":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":21,"docs":{"13":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.449489742783178},"20":{"tf":1.0},"231":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"281":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.0}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":4,"docs":{"140":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"62":{"tf":1.7320508075688772},"63":{"tf":1.0}}}},"t":{"df":3,"docs":{"212":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"131":{"tf":1.0}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"152":{"tf":1.0},"2":{"tf":1.0},"243":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}}},"q":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":1,"docs":{"240":{"tf":1.0}},"u":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"130":{"tf":1.0},"193":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"143":{"tf":1.0},"18":{"tf":1.4142135623730951},"266":{"tf":1.0},"287":{"tf":1.0},"44":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"297":{"tf":1.0},"330":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":5,"docs":{"228":{"tf":1.0},"301":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"124":{"tf":1.7320508075688772},"287":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"313":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":1,"docs":{"222":{"tf":1.0}},"g":{"df":6,"docs":{"115":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"70":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"276":{"tf":1.0},"79":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"271":{"tf":1.0},"279":{"tf":1.0}}}},"df":9,"docs":{"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"230":{"tf":1.0},"26":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"d":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":25,"docs":{"10":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":3.3166247903554},"15":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"155":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"21":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"240":{"tf":1.4142135623730951},"258":{"tf":1.0},"308":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.7320508075688772},"56":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"df":1,"docs":{"230":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"230":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"230":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"i":{"df":5,"docs":{"13":{"tf":1.0},"212":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}}},"m":{"df":1,"docs":{"317":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"36":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"119":{"tf":1.0},"191":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"v":{"df":7,"docs":{"148":{"tf":1.0},"258":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"255":{"tf":1.7320508075688772},"279":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"212":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"69":{"tf":1.0},"70":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":2.23606797749979}},"e":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"64":{"tf":1.0}}}}}}}},"df":3,"docs":{"266":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"222":{"tf":1.0},"27":{"tf":1.0},"297":{"tf":1.0},"306":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"145":{"tf":1.4142135623730951},"187":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.4142135623730951},"21":{"tf":1.0},"237":{"tf":1.0},"287":{"tf":1.0},"316":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"317":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"256":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"269":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"313":{"tf":1.0}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"158":{"tf":1.0},"231":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"250":{"tf":2.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"305":{"tf":2.0},"309":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"322":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":2,"docs":{"203":{"tf":1.0},"207":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":14,"docs":{"193":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"238":{"tf":1.0},"240":{"tf":1.4142135623730951},"315":{"tf":2.0},"318":{"tf":1.0},"56":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":2.0},"61":{"tf":1.7320508075688772},"62":{"tf":1.0},"63":{"tf":2.0},"64":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"215":{"tf":1.0}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"182":{"tf":1.0}}},"df":5,"docs":{"120":{"tf":1.4142135623730951},"141":{"tf":1.0},"195":{"tf":1.0},"289":{"tf":1.0},"296":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":7,"docs":{"227":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"297":{"tf":1.0},"322":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"24":{"tf":1.0},"240":{"tf":1.0},"314":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"65":{"tf":1.0},"66":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":3,"docs":{"19":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"210":{"tf":1.4142135623730951},"215":{"tf":1.7320508075688772},"25":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"324":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"211":{"tf":1.4142135623730951},"212":{"tf":1.0},"216":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":13,"docs":{"105":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.0},"280":{"tf":1.0},"302":{"tf":1.0},"323":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"277":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":1.7320508075688772},"326":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":20,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"174":{"tf":1.0},"19":{"tf":1.0},"215":{"tf":1.0},"233":{"tf":1.7320508075688772},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"279":{"tf":1.0},"30":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"89":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"117":{"tf":1.0},"119":{"tf":1.4142135623730951},"120":{"tf":1.0},"250":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}},"v":{"df":8,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"204":{"tf":1.4142135623730951},"216":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"272":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"141":{"tf":1.0},"216":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":7,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.0},"324":{"tf":1.0},"45":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"240":{"tf":1.4142135623730951},"287":{"tf":1.0},"308":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":17,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.4142135623730951},"250":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"313":{"tf":1.4142135623730951},"33":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":4,"docs":{"252":{"tf":1.0},"271":{"tf":1.0},"42":{"tf":1.0},"69":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"144":{"tf":1.4142135623730951},"151":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":80,"docs":{"10":{"tf":2.0},"102":{"tf":1.4142135623730951},"106":{"tf":1.4142135623730951},"110":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":2.0},"135":{"tf":1.0},"141":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.7320508075688772},"164":{"tf":3.1622776601683795},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.23606797749979},"170":{"tf":2.0},"173":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.0},"189":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"243":{"tf":3.0},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":1.0},"258":{"tf":2.6457513110645907},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"281":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.7320508075688772},"304":{"tf":3.7416573867739413},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":1.0},"48":{"tf":2.0},"71":{"tf":1.4142135623730951},"76":{"tf":1.4142135623730951},"81":{"tf":1.4142135623730951},"86":{"tf":1.4142135623730951},"91":{"tf":1.4142135623730951},"97":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"164":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}},"df":25,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":3.872983346207417},"164":{"tf":2.0},"171":{"tf":1.4142135623730951},"212":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.23606797749979},"288":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"41":{"tf":3.1622776601683795},"43":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":2.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"143":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"247":{"tf":1.0},"292":{"tf":1.0},"322":{"tf":1.0},"40":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"305":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"1":{"6":{"0":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"79":{"tf":1.4142135623730951},"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"279":{"tf":1.0},"312":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"u":{"8":{"(":{"2":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":6,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"222":{"tf":1.0},"266":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"d":{"df":4,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"182":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"c":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":2.0},"219":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":6,"docs":{"123":{"tf":1.0},"146":{"tf":1.0},"233":{"tf":2.0},"241":{"tf":1.0},"37":{"tf":1.0},"59":{"tf":1.0}}}},"n":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":26,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.0},"243":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"287":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"a":{"c":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"(":{"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":2.0},"243":{"tf":2.23606797749979}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":6,"docs":{"139":{"tf":1.0},"204":{"tf":1.0},"219":{"tf":2.449489742783178},"227":{"tf":1.0},"314":{"tf":1.0},"40":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"233":{"tf":1.0},"275":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"40":{"tf":1.0},"57":{"tf":1.7320508075688772}}}}}},"s":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}}},"df":5,"docs":{"1":{"tf":1.0},"192":{"tf":1.0},"227":{"tf":1.0},"279":{"tf":1.7320508075688772},"9":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}},"s":{"a":{"df":1,"docs":{"266":{"tf":2.23606797749979}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"df":16,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"152":{"tf":1.0},"17":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.0},"233":{"tf":1.7320508075688772},"255":{"tf":1.0},"272":{"tf":1.0},"281":{"tf":1.0},"309":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"52":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"247":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"230":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"266":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":7,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"323":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":10,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"141":{"tf":1.0},"171":{"tf":1.0},"191":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"p":{"2":{"5":{"6":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"14":{"tf":1.0},"200":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"292":{"tf":1.4142135623730951},"35":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"e":{"df":14,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.4142135623730951},"219":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.0},"330":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":1,"docs":{"212":{"tf":1.0}}}},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"206":{"tf":1.0},"316":{"tf":1.7320508075688772}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"28":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"=":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"[":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"2":{"=":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}},"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"z":{"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{".":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"243":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"d":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"(":{"5":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":4,"docs":{"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":4,"docs":{"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"48":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.4142135623730951}},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"163":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"1":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"258":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"[":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"x":{"df":1,"docs":{"258":{"tf":2.0}}}},"df":1,"docs":{"258":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"[":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"5":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}}}}},"u":{"df":0,"docs":{},"m":{"(":{"[":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"173":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":3,"docs":{"231":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":36,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.0},"144":{"tf":1.4142135623730951},"146":{"tf":2.6457513110645907},"148":{"tf":1.0},"152":{"tf":2.6457513110645907},"153":{"tf":1.4142135623730951},"156":{"tf":1.0},"16":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":2.0},"240":{"tf":3.0},"249":{"tf":1.0},"275":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.0}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"158":{"tf":1.0},"59":{"tf":1.0}}}}}},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"258":{"tf":1.0},"42":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":13,"docs":{"135":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"'":{"df":2,"docs":{"148":{"tf":1.0},"42":{"tf":1.0}}},"df":4,"docs":{"141":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"41":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"t":{"df":4,"docs":{"189":{"tf":1.0},"240":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":8,"docs":{"124":{"tf":1.0},"132":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"290":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"19":{"tf":2.23606797749979},"235":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"19":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":18,"docs":{"105":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.7320508075688772},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"315":{"tf":1.0},"328":{"tf":1.0}}}}},"v":{"df":2,"docs":{"211":{"tf":1.4142135623730951},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}}},"t":{"df":14,"docs":{"126":{"tf":1.4142135623730951},"139":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":2.0},"266":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.7320508075688772},"43":{"tf":1.0},"52":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"19":{"tf":1.0},"255":{"tf":1.0},"40":{"tf":1.0}}}}},"x":{"df":1,"docs":{"320":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"74":{"tf":1.4142135623730951},"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"315":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"182":{"tf":1.4142135623730951},"247":{"tf":1.0},"27":{"tf":1.4142135623730951},"280":{"tf":2.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"287":{"tf":1.0}}}}},"df":2,"docs":{"197":{"tf":1.0},"272":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"2":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.4142135623730951},"271":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":2,"docs":{"146":{"tf":1.0},"287":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"272":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"132":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"283":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":17,"docs":{"135":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":2.0},"18":{"tf":1.7320508075688772},"190":{"tf":1.0},"240":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"9":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"204":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":11,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}},"i":{"df":7,"docs":{"18":{"tf":1.4142135623730951},"203":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"19":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0},"255":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"327":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":5,"docs":{"21":{"tf":1.0},"243":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"=":{"5":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":16,"docs":{"113":{"tf":1.0},"131":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.0},"250":{"tf":1.7320508075688772},"268":{"tf":2.0},"279":{"tf":1.0},"292":{"tf":3.0},"299":{"tf":1.0},"312":{"tf":2.23606797749979},"320":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"164":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"t":{"df":6,"docs":{"161":{"tf":1.0},"177":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"256":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"40":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"c":{"df":3,"docs":{"237":{"tf":1.0},"26":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"240":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"318":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"143":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"m":{"df":0,"docs":{},"e":{"_":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"168":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":2.0}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"233":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"137":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.4142135623730951}}}},"df":1,"docs":{"178":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"169":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951}}}}}},"v":{"df":1,"docs":{"145":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.0},"249":{"tf":1.0},"275":{"tf":1.0},"35":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":8,"docs":{"130":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":1.7320508075688772},"266":{"tf":1.7320508075688772},"275":{"tf":1.0},"277":{"tf":1.0}},"e":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"200":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"277":{"tf":1.0},"293":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"317":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"139":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":15,"docs":{"1":{"tf":1.0},"113":{"tf":1.4142135623730951},"132":{"tf":1.0},"136":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.4142135623730951},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"26":{"tf":1.0},"289":{"tf":1.0},"40":{"tf":2.0},"44":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":12,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"161":{"tf":1.0},"173":{"tf":1.0},"233":{"tf":1.0},"255":{"tf":2.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"30":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"177":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"130":{"tf":1.0},"226":{"tf":1.0},"275":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"113":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":11,"docs":{"113":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":2.6457513110645907},"207":{"tf":1.4142135623730951},"213":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":6,"docs":{"16":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"r":{"d":{"df":12,"docs":{"132":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":15,"docs":{"127":{"tf":2.0},"13":{"tf":1.0},"15":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"273":{"tf":1.0},"29":{"tf":1.0},"305":{"tf":1.0},"315":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"5":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":24,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":1.7320508075688772},"139":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"7":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":27,"docs":{"113":{"tf":3.7416573867739413},"136":{"tf":1.0},"157":{"tf":3.7416573867739413},"158":{"tf":2.0},"159":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"161":{"tf":1.7320508075688772},"162":{"tf":2.0},"163":{"tf":2.449489742783178},"164":{"tf":2.0},"165":{"tf":2.0},"166":{"tf":1.7320508075688772},"167":{"tf":1.4142135623730951},"168":{"tf":2.23606797749979},"169":{"tf":2.23606797749979},"170":{"tf":1.7320508075688772},"171":{"tf":2.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"288":{"tf":2.0},"289":{"tf":1.0},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"n":{"df":1,"docs":{"157":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":8,"docs":{"1":{"tf":1.0},"119":{"tf":1.0},"175":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"252":{"tf":1.0},"293":{"tf":1.0},"316":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"320":{"tf":1.0}}}}},"d":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"230":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{":":{":":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"230":{"tf":1.0},"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"273":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"14":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":1.0},"279":{"tf":1.0},"61":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"21":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"266":{"tf":1.0},"287":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":34,"docs":{"10":{"tf":2.0},"113":{"tf":1.7320508075688772},"137":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":2.449489742783178},"152":{"tf":1.4142135623730951},"153":{"tf":1.7320508075688772},"155":{"tf":1.0},"156":{"tf":1.0},"161":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.0},"202":{"tf":1.4142135623730951},"203":{"tf":2.0},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"219":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"312":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"135":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"197":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":2.6457513110645907},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"268":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":1,"docs":{"306":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"'":{"df":1,"docs":{"197":{"tf":1.0}}},"1":{"0":{"0":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"312":{"tf":1.0},"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"<":{"1":{"0":{"0":{"df":11,"docs":{"10":{"tf":2.449489742783178},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"296":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},">":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"296":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"133":{"tf":1.0},"197":{"tf":1.0},"243":{"tf":1.4142135623730951},"296":{"tf":1.0}}},"4":{"0":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"293":{"tf":1.0}}},"df":1,"docs":{"197":{"tf":1.0}}},"3":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":1.0}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"126":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":24,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"124":{"tf":1.4142135623730951},"126":{"tf":1.7320508075688772},"139":{"tf":1.0},"171":{"tf":1.7320508075688772},"18":{"tf":1.0},"181":{"tf":1.4142135623730951},"187":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"304":{"tf":2.0},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"33":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"296":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"3":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":46,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":3.0},"132":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":2.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"163":{"tf":1.7320508075688772},"172":{"tf":1.0},"176":{"tf":1.0},"178":{"tf":1.4142135623730951},"187":{"tf":1.0},"193":{"tf":3.4641016151377544},"195":{"tf":1.0},"196":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"253":{"tf":1.0},"258":{"tf":2.0},"265":{"tf":1.0},"268":{"tf":2.6457513110645907},"269":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":2.0},"312":{"tf":2.8284271247461903},"41":{"tf":2.449489742783178},"43":{"tf":2.0},"48":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"130":{"tf":1.0},"191":{"tf":1.4142135623730951},"243":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"216":{"tf":1.0},"243":{"tf":1.0},"46":{"tf":1.0}}}}}},"u":{"b":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"25":{"tf":1.0}}},"df":5,"docs":{"233":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"29":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"308":{"tf":1.0}}}},"t":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"182":{"tf":1.0},"312":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"280":{"tf":1.0},"284":{"tf":1.0}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"h":{"df":19,"docs":{"10":{"tf":1.0},"136":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.4142135623730951},"151":{"tf":1.0},"19":{"tf":1.4142135623730951},"197":{"tf":1.7320508075688772},"21":{"tf":1.0},"213":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"27":{"tf":1.0},"299":{"tf":1.0},"316":{"tf":1.4142135623730951},"321":{"tf":1.0},"40":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}},"i":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"m":{"df":8,"docs":{"141":{"tf":1.0},"166":{"tf":2.0},"167":{"tf":2.0},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"243":{"tf":1.7320508075688772},"299":{"tf":1.0},"309":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"df":2,"docs":{"20":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"292":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":28,"docs":{"160":{"tf":1.0},"22":{"tf":1.0},"226":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.7320508075688772},"246":{"tf":1.0},"249":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"279":{"tf":2.0},"287":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":3.4641016151377544},"316":{"tf":2.23606797749979},"318":{"tf":1.0},"50":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"19":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"182":{"tf":1.0},"183":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{},"x":{"df":49,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"308":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":10,"docs":{"113":{"tf":1.0},"186":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"57":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}},"l":{"df":3,"docs":{"146":{"tf":1.0},"182":{"tf":1.0},"287":{"tf":1.0}}}},"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":5,"docs":{"210":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.0},"62":{"tf":1.7320508075688772},"63":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":16,"docs":{"108":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":2.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"284":{"tf":1.0},"312":{"tf":1.4142135623730951},"322":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"250":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"w":{"df":3,"docs":{"176":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0}}}},"df":13,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"132":{"tf":1.0},"192":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"243":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"210":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"16":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"249":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"n":{"df":4,"docs":{"159":{"tf":1.7320508075688772},"17":{"tf":1.0},"279":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":5,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"275":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"26":{"tf":1.0},"45":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"33":{"tf":1.0}},"e":{"c":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}},"df":1,"docs":{"222":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":23,"docs":{"13":{"tf":2.23606797749979},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"222":{"tf":3.7416573867739413},"223":{"tf":1.4142135623730951},"230":{"tf":2.23606797749979},"233":{"tf":2.23606797749979},"241":{"tf":1.0},"26":{"tf":1.4142135623730951},"275":{"tf":1.0},"281":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":3.0},"44":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.23606797749979},"61":{"tf":1.0},"62":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":2,"docs":{"19":{"tf":1.4142135623730951},"5":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"216":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"146":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}}}},"y":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":8,"docs":{"115":{"tf":1.0},"130":{"tf":1.0},"240":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"69":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"280":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"200":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"132":{"tf":1.0},"141":{"tf":1.0},"24":{"tf":1.0},"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"w":{"df":1,"docs":{"296":{"tf":1.0}},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"u":{"df":4,"docs":{"240":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"e":{"df":22,"docs":{"1":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"139":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":2.449489742783178},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"1":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"205":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":8,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.4142135623730951},"19":{"tf":1.0},"305":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"212":{"tf":1.0},"249":{"tf":1.0},"38":{"tf":1.0},"50":{"tf":1.0}}}},"p":{"df":2,"docs":{"130":{"tf":1.0},"141":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"182":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"160":{"tf":1.0},"206":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"132":{"tf":1.0}}},"df":9,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":3.605551275463989},"233":{"tf":2.0},"237":{"tf":2.0},"240":{"tf":3.1622776601683795},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.4142135623730951},"16":{"tf":2.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"249":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"330":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"308":{"tf":1.0},"313":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951}}}},"i":{"df":5,"docs":{"10":{"tf":1.4142135623730951},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"9":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"266":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":26,"docs":{"106":{"tf":1.0},"112":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":2.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.4142135623730951},"240":{"tf":2.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"272":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":25,"docs":{"102":{"tf":1.0},"113":{"tf":1.4142135623730951},"131":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":4.47213595499958},"175":{"tf":1.0},"178":{"tf":1.0},"187":{"tf":1.0},"191":{"tf":3.7416573867739413},"195":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"296":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.7320508075688772},"97":{"tf":1.0}},"e":{"'":{"df":1,"docs":{"191":{"tf":1.0}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"160":{"tf":1.7320508075688772}}}}}}}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"191":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"240":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"224":{"tf":1.0},"235":{"tf":1.0},"35":{"tf":1.7320508075688772},"36":{"tf":1.0},"37":{"tf":1.0},"46":{"tf":1.0},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}}}}},"o":{"'":{"df":1,"docs":{"190":{"tf":1.0}}},"df":10,"docs":{"117":{"tf":1.0},"130":{"tf":1.4142135623730951},"247":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.0}}}},"x":{".":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":3,"docs":{"19":{"tf":1.0},"231":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}}},"df":88,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"113":{"tf":3.7416573867739413},"119":{"tf":1.0},"127":{"tf":2.23606797749979},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":3.0},"133":{"tf":2.0},"134":{"tf":3.1622776601683795},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"159":{"tf":1.4142135623730951},"16":{"tf":1.0},"160":{"tf":1.0},"164":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":2.23606797749979},"177":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":1.0},"184":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":3.3166247903554},"188":{"tf":1.7320508075688772},"189":{"tf":2.449489742783178},"190":{"tf":2.23606797749979},"191":{"tf":4.69041575982343},"192":{"tf":2.0},"193":{"tf":2.8284271247461903},"194":{"tf":1.7320508075688772},"195":{"tf":1.4142135623730951},"196":{"tf":2.8284271247461903},"197":{"tf":2.23606797749979},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.7320508075688772},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":2.449489742783178},"244":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":2.23606797749979},"281":{"tf":1.0},"283":{"tf":2.449489742783178},"287":{"tf":2.449489742783178},"290":{"tf":1.0},"292":{"tf":2.23606797749979},"293":{"tf":1.7320508075688772},"296":{"tf":2.0},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"c":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"+":{"0":{"0":{"3":{"0":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"127":{"tf":1.0}}}},"7":{"8":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"2":{"8":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"5":{"5":{"3":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"115":{"tf":1.0},"190":{"tf":1.0},"243":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},",":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":2,"docs":{"101":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"[":{"1":{"0":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"3":{"df":3,"docs":{"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":92,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"127":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":4.47213595499958},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":2.23606797749979},"175":{"tf":1.4142135623730951},"177":{"tf":2.0},"178":{"tf":2.6457513110645907},"179":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"193":{"tf":1.7320508075688772},"196":{"tf":2.23606797749979},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":3.0},"243":{"tf":2.8284271247461903},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"258":{"tf":3.7416573867739413},"262":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":3.0},"269":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":2.449489742783178},"283":{"tf":2.23606797749979},"287":{"tf":1.0},"288":{"tf":2.0},"292":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":2.0},"304":{"tf":4.69041575982343},"308":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"312":{"tf":4.69041575982343},"313":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":3.0},"70":{"tf":2.0},"72":{"tf":2.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":2.449489742783178},"92":{"tf":1.7320508075688772},"95":{"tf":2.0},"96":{"tf":2.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"180":{"tf":1.0},"190":{"tf":1.0},"240":{"tf":2.0},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"275":{"tf":2.449489742783178}}},"df":0,"docs":{}},"8":{"(":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"0":{"0":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":3,"docs":{"230":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"[":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"292":{"tf":1.4142135623730951}}}},"df":19,"docs":{"115":{"tf":1.0},"134":{"tf":1.0},"162":{"tf":1.7320508075688772},"163":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"237":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"243":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"283":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":3.872983346207417},"309":{"tf":2.6457513110645907},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"279":{"tf":1.0}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"185":{"tf":2.23606797749979},"250":{"tf":1.0},"287":{"tf":1.0}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":2,"docs":{"171":{"tf":1.0},"30":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"237":{"tf":1.0}},"n":{"df":2,"docs":{"296":{"tf":1.0},"304":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":2.0},"249":{"tf":1.0},"271":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"310":{"tf":1.0}},"v":{"3":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":13,"docs":{"164":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.4142135623730951},"187":{"tf":1.0},"191":{"tf":2.449489742783178},"196":{"tf":1.0},"198":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"271":{"tf":1.0},"302":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0}}},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"269":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"326":{"tf":1.0}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"222":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":2.8284271247461903},"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"190":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.7320508075688772},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"327":{"tf":1.0},"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"160":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"326":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"153":{"tf":1.0},"211":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":2.0},"66":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":9,"docs":{"13":{"tf":1.0},"217":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0},"312":{"tf":1.0},"41":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"139":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"237":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"316":{"tf":1.0}}}},"df":117,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"130":{"tf":2.449489742783178},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"136":{"tf":1.0},"139":{"tf":1.0},"14":{"tf":1.7320508075688772},"140":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"15":{"tf":1.7320508075688772},"152":{"tf":1.7320508075688772},"153":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.7320508075688772},"165":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"191":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"200":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"211":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"222":{"tf":1.7320508075688772},"223":{"tf":1.0},"230":{"tf":2.449489742783178},"231":{"tf":1.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"250":{"tf":1.0},"255":{"tf":2.0},"256":{"tf":1.0},"258":{"tf":2.449489742783178},"26":{"tf":2.0},"265":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":2.23606797749979},"28":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"29":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":1.0},"30":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.0},"315":{"tf":1.0},"32":{"tf":1.7320508075688772},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"33":{"tf":1.4142135623730951},"38":{"tf":1.0},"40":{"tf":3.605551275463989},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.4142135623730951},"45":{"tf":2.23606797749979},"46":{"tf":2.23606797749979},"48":{"tf":1.0},"49":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.23606797749979},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"84":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":17,"docs":{"1":{"tf":1.0},"187":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"211":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":2.0},"44":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"/":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"d":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"197":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"277":{"tf":1.7320508075688772},"314":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"32":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"0":{".":{"8":{".":{"0":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"212":{"tf":2.23606797749979}}},"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.0}}}}}},"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"v":{"df":3,"docs":{"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"1":{"df":4,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0}}},"2":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"288":{"tf":1.0}}},"3":{"df":1,"docs":{"160":{"tf":1.0}}},"4":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"160":{"tf":1.0}}},"6":{"df":1,"docs":{"160":{"tf":1.0}}},"7":{"df":1,"docs":{"160":{"tf":1.0}}},"8":{")":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"313":{"tf":1.0}}},"2":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"165":{"tf":1.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":2.0},"255":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}},"i":{"d":{"df":7,"docs":{"197":{"tf":1.0},"237":{"tf":1.0},"289":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"43":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":67,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":3.3166247903554},"146":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":2.0},"179":{"tf":1.0},"181":{"tf":1.0},"187":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"192":{"tf":1.0},"196":{"tf":2.449489742783178},"197":{"tf":2.0},"200":{"tf":1.7320508075688772},"201":{"tf":2.0},"203":{"tf":2.0},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"230":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":3.4641016151377544},"265":{"tf":1.0},"271":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":2.23606797749979},"313":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":2.6457513110645907}},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"299":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}}}}}},"[":{"5":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":22,"docs":{"130":{"tf":1.4142135623730951},"137":{"tf":1.7320508075688772},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.0},"309":{"tf":1.0},"40":{"tf":3.605551275463989},"41":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}},"e":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"297":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":4,"docs":{"127":{"tf":1.0},"191":{"tf":1.0},"289":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":7,"docs":{"196":{"tf":1.0},"230":{"tf":1.0},"25":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.7320508075688772},"109":{"tf":1.4142135623730951},"110":{"tf":1.0}}}}}},"df":1,"docs":{"27":{"tf":1.0}},"r":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"164":{"tf":1.0},"219":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0}},"f":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":4,"docs":{"219":{"tf":2.6457513110645907},"296":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"=":{"0":{".":{"2":{"3":{".":{"0":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"119":{"tf":1.0},"136":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"19":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"237":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"312":{"tf":1.0},"315":{"tf":1.0},"330":{"tf":1.0},"59":{"tf":1.4142135623730951},"60":{"tf":1.4142135623730951},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}}}}}}}},"i":{"a":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.0},"191":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"316":{"tf":1.0},"323":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"119":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":2.23606797749979},"135":{"tf":1.4142135623730951},"138":{"tf":1.0},"160":{"tf":1.0},"193":{"tf":1.0},"241":{"tf":1.0},"265":{"tf":1.0},"308":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"27":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":4,"docs":{"215":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":1.0},"50":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"42":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.0},"35":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"240":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"46":{"tf":1.0}},"n":{"df":6,"docs":{"113":{"tf":1.0},"171":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"241":{"tf":1.0},"269":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":15,"docs":{"152":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"209":{"tf":1.0},"219":{"tf":1.0},"250":{"tf":1.0},"268":{"tf":1.4142135623730951},"276":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"8":{"tf":1.0}}}},"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"276":{"tf":1.0}}}},"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"19":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"i":{"df":6,"docs":{"149":{"tf":1.0},"255":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"21":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"126":{"tf":1.0},"138":{"tf":1.0},"20":{"tf":1.0},"240":{"tf":1.0},"327":{"tf":1.0},"41":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":3,"docs":{"145":{"tf":1.0},"177":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":1,"docs":{"159":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"106":{"tf":1.0},"143":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"167":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"197":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"(":{"_":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.0}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"313":{"tf":1.0}},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"48":{"tf":1.0}}}}}},"df":3,"docs":{"37":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"141":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"18":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.7320508075688772},"292":{"tf":1.0},"305":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.0},"23":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"302":{"tf":1.0},"313":{"tf":2.0},"321":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"272":{"tf":1.0},"296":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":2,"docs":{"197":{"tf":1.0},"250":{"tf":1.0}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"113":{"tf":1.0},"152":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":2.0},"230":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":2,"docs":{"26":{"tf":1.0},"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"53":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":16,"docs":{"1":{"tf":1.7320508075688772},"12":{"tf":1.0},"141":{"tf":1.4142135623730951},"146":{"tf":2.8284271247461903},"152":{"tf":1.0},"153":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"227":{"tf":1.0},"233":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"9":{"tf":1.0}},"r":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"107":{"tf":3.4641016151377544},"230":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"135":{"tf":1.0},"164":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.0},"192":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.4142135623730951},"30":{"tf":1.0},"326":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"255":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"16":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"146":{"tf":1.0}}}}},"x":{"1":{"df":3,"docs":{"178":{"tf":1.0},"240":{"tf":1.0},"95":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"8":{"6":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"100":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"115":{"tf":2.8284271247461903},"131":{"tf":1.0},"141":{"tf":2.23606797749979},"178":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":2.23606797749979},"244":{"tf":1.0},"25":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":2.0},"6":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}}}}},"y":{"1":{"df":4,"docs":{"240":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":1,"docs":{"250":{"tf":1.0}}}},"df":17,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"141":{"tf":2.449489742783178},"178":{"tf":1.4142135623730951},"185":{"tf":1.0},"240":{"tf":2.23606797749979},"243":{"tf":2.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"265":{"tf":1.7320508075688772},"275":{"tf":2.23606797749979},"296":{"tf":1.4142135623730951},"312":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"119":{"tf":1.0},"141":{"tf":1.0},"185":{"tf":1.7320508075688772},"293":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"u":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"v":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"l":{"'":{"df":2,"docs":{"247":{"tf":1.0},"271":{"tf":1.0}}},"c":{"df":1,"docs":{"294":{"tf":1.0}}},"df":12,"docs":{"1":{"tf":1.0},"223":{"tf":1.0},"250":{"tf":1.4142135623730951},"271":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.7320508075688772},"288":{"tf":1.0},"309":{"tf":1.4142135623730951},"310":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.7320508075688772},"57":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}}}}}},"z":{"df":4,"docs":{"115":{"tf":1.0},"120":{"tf":2.449489742783178},"185":{"tf":1.0},"296":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":9,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"191":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"breadcrumbs":{"root":{"0":{".":{"1":{".":{"0":{"df":3,"docs":{"158":{"tf":1.0},"296":{"tf":1.0},"315":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":2,"docs":{"247":{"tf":1.0},"248":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":2,"docs":{"236":{"tf":1.4142135623730951},"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"59":{"tf":1.0},"60":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":2,"docs":{"225":{"tf":1.4142135623730951},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.4142135623730951}}},"1":{"8":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{".":{".":{"0":{"0":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"|":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"267":{"tf":2.0},"315":{"tf":1.4142135623730951}}},"2":{"df":4,"docs":{"236":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"274":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951}}},"3":{"df":3,"docs":{"218":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951}}},"4":{"df":3,"docs":{"232":{"tf":1.4142135623730951},"254":{"tf":2.0},"303":{"tf":1.4142135623730951}}},"5":{"df":6,"docs":{"232":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"251":{"tf":2.0},"298":{"tf":1.4142135623730951}}},"6":{"df":3,"docs":{"229":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951}}},"7":{"df":2,"docs":{"242":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951}}},"8":{"df":2,"docs":{"225":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951}}},"9":{"df":1,"docs":{"282":{"tf":1.4142135623730951}}},"b":{"1":{"1":{"1":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"1":{"1":{"_":{"1":{"0":{"0":{"1":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"127":{"tf":1.0}},"i":{"6":{"4":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":30,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.4142135623730951},"127":{"tf":2.0},"16":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.4142135623730951},"190":{"tf":2.449489742783178},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":3.0},"237":{"tf":1.0},"240":{"tf":2.449489742783178},"243":{"tf":2.23606797749979},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.7320508075688772}},"o":{"7":{"0":{"df":1,"docs":{"127":{"tf":1.0}}},"7":{"df":2,"docs":{"124":{"tf":1.0},"299":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"1":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"1":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"6":{"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"112":{"tf":4.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"…":{"0":{"0":{"2":{"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"204":{"tf":1.4142135623730951},"206":{"tf":1.4142135623730951}}},"1":{"df":3,"docs":{"171":{"tf":1.0},"204":{"tf":1.0},"292":{"tf":1.0}}},"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"c":{"3":{"7":{"9":{"a":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"1":{"0":{"5":{"8":{"a":{"3":{"1":{"4":{"1":{"8":{"2":{"2":{"9":{"8":{"5":{"7":{"3":{"3":{"c":{"b":{"d":{"d":{"d":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"d":{"0":{"df":0,"docs":{},"f":{"d":{"8":{"d":{"6":{"c":{"1":{"0":{"4":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"0":{"b":{"df":0,"docs":{},"f":{"5":{"a":{"b":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"9":{"a":{"b":{"1":{"6":{"3":{"b":{"c":{"7":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"3":{"4":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}},"9":{"7":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"0":{"4":{"7":{"1":{"b":{"0":{"9":{"df":0,"docs":{},"f":{"a":{"9":{"3":{"c":{"a":{"a":{"df":0,"docs":{},"f":{"1":{"3":{"c":{"b":{"df":0,"docs":{},"f":{"4":{"4":{"3":{"c":{"1":{"a":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"0":{"9":{"c":{"c":{"4":{"3":{"2":{"8":{"df":0,"docs":{},"f":{"5":{"a":{"6":{"2":{"a":{"a":{"d":{"4":{"5":{"df":0,"docs":{},"f":{"4":{"0":{"df":0,"docs":{},"e":{"c":{"1":{"3":{"3":{"df":0,"docs":{},"e":{"b":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"6":{"c":{"3":{"df":0,"docs":{},"e":{"2":{"b":{"8":{"c":{"6":{"8":{"0":{"5":{"9":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"9":{"b":{"b":{"4":{"7":{"6":{"df":0,"docs":{},"f":{"6":{"b":{"9":{"df":0,"docs":{},"e":{"4":{"4":{"df":0,"docs":{},"e":{"2":{"a":{"3":{"2":{"2":{"3":{"4":{"d":{"a":{"8":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"6":{"1":{"c":{"d":{"6":{"3":{"9":{"1":{"9":{"3":{"5":{"4":{"b":{"c":{"0":{"6":{"a":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"1":{"df":0,"docs":{},"e":{"3":{"c":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"e":{"b":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"126":{"tf":1.0}}}},"2":{"2":{"6":{"0":{"6":{"8":{"4":{"5":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"8":{"6":{"7":{"9":{"3":{"9":{"1":{"4":{"df":0,"docs":{},"e":{"0":{"3":{"df":0,"docs":{},"e":{"2":{"1":{"d":{"df":0,"docs":{},"f":{"5":{"4":{"4":{"c":{"3":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"2":{"df":0,"docs":{},"f":{"2":{"df":0,"docs":{},"f":{"3":{"5":{"0":{"4":{"d":{"df":0,"docs":{},"e":{"8":{"a":{"7":{"9":{"d":{"9":{"1":{"5":{"9":{"df":0,"docs":{},"e":{"c":{"a":{"2":{"d":{"9":{"8":{"d":{"9":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"a":{"8":{"df":0,"docs":{},"e":{"b":{"0":{"b":{"0":{"9":{"9":{"6":{"2":{"5":{"2":{"c":{"b":{"5":{"4":{"8":{"a":{"4":{"4":{"8":{"7":{"d":{"a":{"9":{"7":{"b":{"0":{"2":{"4":{"2":{"2":{"df":0,"docs":{},"e":{"b":{"c":{"0":{"df":0,"docs":{},"e":{"8":{"3":{"4":{"6":{"1":{"3":{"df":0,"docs":{},"f":{"9":{"5":{"4":{"d":{"df":0,"docs":{},"e":{"6":{"c":{"7":{"df":0,"docs":{},"e":{"0":{"a":{"df":0,"docs":{},"f":{"d":{"c":{"1":{"df":0,"docs":{},"f":{"c":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"2":{"3":{"a":{"df":0,"docs":{},"f":{"9":{"a":{"5":{"c":{"df":0,"docs":{},"e":{"2":{"b":{"a":{"2":{"7":{"9":{"6":{"c":{"1":{"df":0,"docs":{},"f":{"4":{"df":0,"docs":{},"e":{"4":{"5":{"3":{"a":{"3":{"7":{"0":{"df":0,"docs":{},"e":{"b":{"0":{"a":{"df":0,"docs":{},"f":{"8":{"c":{"2":{"1":{"2":{"d":{"9":{"d":{"c":{"9":{"a":{"c":{"d":{"8":{"df":0,"docs":{},"f":{"c":{"0":{"2":{"c":{"2":{"df":0,"docs":{},"e":{"9":{"0":{"7":{"b":{"a":{"df":0,"docs":{},"e":{"a":{"2":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"3":{"6":{"8":{"df":0,"docs":{},"e":{"2":{"8":{"3":{"8":{"1":{"df":0,"docs":{},"e":{"8":{"df":0,"docs":{},"e":{"c":{"c":{"b":{"5":{"df":0,"docs":{},"f":{"a":{"8":{"1":{"df":0,"docs":{},"f":{"c":{"2":{"6":{"c":{"df":0,"docs":{},"f":{"3":{"df":0,"docs":{},"f":{"0":{"4":{"8":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"a":{"9":{"a":{"b":{"df":0,"docs":{},"f":{"d":{"d":{"8":{"5":{"d":{"7":{"df":0,"docs":{},"e":{"d":{"3":{"a":{"b":{"3":{"6":{"9":{"8":{"d":{"6":{"3":{"df":0,"docs":{},"e":{"4":{"df":0,"docs":{},"f":{"9":{"0":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"8":{"9":{"4":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"f":{"3":{"6":{"df":0,"docs":{},"e":{"3":{"c":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"0":{"df":0,"docs":{},"f":{"0":{"0":{"1":{"df":0,"docs":{},"f":{"5":{"2":{"1":{"1":{"0":{"c":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"6":{"9":{"1":{"0":{"8":{"9":{"2":{"4":{"9":{"2":{"6":{"df":0,"docs":{},"e":{"4":{"5":{"df":0,"docs":{},"f":{"0":{"b":{"0":{"c":{"8":{"6":{"8":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"e":{"7":{"b":{"d":{"df":0,"docs":{},"e":{"1":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"1":{"6":{"d":{"3":{"2":{"4":{"2":{"d":{"c":{"7":{"1":{"5":{"df":0,"docs":{},"f":{"6":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"4":{"4":{"4":{"9":{"9":{"d":{"5":{"d":{"2":{"7":{"b":{"b":{"1":{"8":{"6":{"3":{"0":{"8":{"b":{"7":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"df":0,"docs":{},"f":{"0":{"2":{"a":{"c":{"5":{"b":{"c":{"9":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"b":{"6":{"a":{"3":{"d":{"1":{"4":{"7":{"c":{"1":{"8":{"6":{"b":{"2":{"1":{"df":0,"docs":{},"f":{"b":{"1":{"b":{"7":{"6":{"df":0,"docs":{},"e":{"1":{"8":{"d":{"a":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"0":{"2":{"df":0,"docs":{},"e":{"4":{"7":{"8":{"8":{"7":{"5":{"0":{"7":{"a":{"d":{"df":0,"docs":{},"f":{"0":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"1":{"7":{"4":{"3":{"c":{"b":{"a":{"c":{"6":{"b":{"a":{"2":{"9":{"1":{"df":0,"docs":{},"e":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"9":{"b":{"df":0,"docs":{},"e":{"6":{"b":{"d":{"7":{"6":{"3":{"9":{"5":{"0":{"b":{"b":{"1":{"6":{"0":{"4":{"1":{"a":{"0":{"a":{"8":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"3":{"0":{"6":{"4":{"4":{"df":0,"docs":{},"e":{"7":{"2":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"a":{"0":{"2":{"9":{"b":{"8":{"5":{"0":{"4":{"5":{"b":{"6":{"8":{"1":{"8":{"1":{"5":{"8":{"5":{"d":{"9":{"7":{"8":{"1":{"6":{"a":{"9":{"1":{"6":{"8":{"7":{"1":{"c":{"a":{"8":{"d":{"3":{"c":{"2":{"0":{"8":{"c":{"1":{"6":{"d":{"8":{"7":{"c":{"df":0,"docs":{},"f":{"d":{"4":{"5":{"df":1,"docs":{"107":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"b":{"c":{"df":0,"docs":{},"e":{"a":{"0":{"a":{"7":{"7":{"8":{"0":{"1":{"c":{"1":{"5":{"b":{"b":{"7":{"5":{"3":{"4":{"b":{"df":0,"docs":{},"e":{"a":{"b":{"9":{"df":0,"docs":{},"e":{"3":{"3":{"d":{"c":{"b":{"6":{"1":{"3":{"c":{"9":{"3":{"c":{"b":{"df":0,"docs":{},"e":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"2":{"d":{"7":{"df":0,"docs":{},"f":{"9":{"2":{"df":0,"docs":{},"e":{"4":{"b":{"df":0,"docs":{},"e":{"5":{"df":0,"docs":{},"e":{"c":{"a":{"b":{"8":{"c":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"b":{"4":{"1":{"a":{"4":{"1":{"7":{"7":{"d":{"7":{"df":0,"docs":{},"e":{"b":{"6":{"6":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"8":{"1":{"4":{"9":{"5":{"9":{"b":{"2":{"c":{"1":{"4":{"7":{"3":{"6":{"6":{"b":{"6":{"3":{"2":{"3":{"df":0,"docs":{},"f":{"1":{"7":{"b":{"6":{"df":0,"docs":{},"f":{"7":{"0":{"6":{"0":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"4":{"2":{"4":{"b":{"5":{"8":{"d":{"df":0,"docs":{},"f":{"7":{"6":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"a":{"7":{"c":{"a":{"8":{"4":{"8":{"5":{"a":{"df":0,"docs":{},"e":{"6":{"7":{"b":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"b":{"d":{"df":0,"docs":{},"e":{"2":{"a":{"9":{"9":{"4":{"b":{"df":0,"docs":{},"f":{"2":{"d":{"df":0,"docs":{},"e":{"c":{"8":{"c":{"1":{"1":{"df":0,"docs":{},"f":{"b":{"0":{"3":{"9":{"0":{"df":0,"docs":{},"e":{"9":{"d":{"7":{"df":0,"docs":{},"f":{"b":{"c":{"0":{"df":0,"docs":{},"f":{"a":{"1":{"1":{"5":{"0":{"df":0,"docs":{},"f":{"5":{"df":0,"docs":{},"e":{"a":{"b":{"8":{"df":0,"docs":{},"f":{"3":{"3":{"c":{"1":{"3":{"0":{"b":{"4":{"5":{"6":{"1":{"0":{"5":{"2":{"6":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"4":{"2":{"df":1,"docs":{"88":{"tf":1.0}}},"5":{"6":{"df":0,"docs":{},"e":{"9":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"df":0,"docs":{},"e":{"1":{"9":{"7":{"a":{"1":{"df":0,"docs":{},"f":{"1":{"a":{"df":0,"docs":{},"f":{"7":{"a":{"3":{"df":0,"docs":{},"e":{"8":{"5":{"a":{"3":{"2":{"1":{"2":{"df":0,"docs":{},"f":{"a":{"4":{"0":{"4":{"9":{"a":{"3":{"b":{"a":{"3":{"4":{"c":{"2":{"2":{"8":{"9":{"b":{"4":{"c":{"8":{"6":{"0":{"df":0,"docs":{},"f":{"c":{"0":{"b":{"0":{"c":{"6":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"3":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"8":{"c":{"9":{"b":{"d":{"df":0,"docs":{},"f":{"2":{"6":{"7":{"df":0,"docs":{},"e":{"6":{"0":{"9":{"6":{"a":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"4":{"2":{"0":{"6":{"5":{"6":{"df":0,"docs":{},"e":{"6":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"7":{"6":{"8":{"2":{"0":{"4":{"5":{"7":{"4":{"6":{"8":{"6":{"5":{"7":{"2":{"2":{"0":{"7":{"0":{"7":{"2":{"6":{"df":0,"docs":{},"f":{"7":{"6":{"6":{"9":{"6":{"4":{"6":{"5":{"6":{"4":{"2":{"df":0,"docs":{},"e":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"f":{"8":{"a":{"df":0,"docs":{},"e":{"3":{"b":{"d":{"7":{"5":{"3":{"5":{"2":{"4":{"8":{"d":{"0":{"b":{"d":{"4":{"4":{"8":{"2":{"9":{"8":{"c":{"c":{"2":{"df":0,"docs":{},"e":{"2":{"0":{"7":{"1":{"df":0,"docs":{},"e":{"5":{"6":{"9":{"9":{"2":{"d":{"0":{"7":{"7":{"4":{"d":{"c":{"3":{"4":{"0":{"c":{"3":{"6":{"8":{"a":{"df":0,"docs":{},"e":{"9":{"5":{"0":{"8":{"5":{"2":{"a":{"d":{"a":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"5":{"df":0,"docs":{},"f":{"b":{"d":{"b":{"2":{"3":{"1":{"5":{"6":{"7":{"8":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"b":{"3":{"6":{"7":{"df":0,"docs":{},"f":{"0":{"3":{"2":{"d":{"9":{"3":{"df":0,"docs":{},"f":{"6":{"4":{"2":{"df":0,"docs":{},"f":{"6":{"4":{"1":{"8":{"0":{"a":{"a":{"3":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"6":{"0":{"0":{"0":{"8":{".":{".":{"7":{"6":{"b":{"9":{"0":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"6":{"2":{"6":{"3":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"1":{"7":{"5":{"4":{"7":{"4":{"df":0,"docs":{},"e":{"8":{"9":{"0":{"9":{"4":{"c":{"4":{"4":{"d":{"a":{"9":{"8":{"b":{"9":{"5":{"4":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"a":{"c":{"4":{"9":{"5":{"2":{"7":{"1":{"d":{"0":{"df":0,"docs":{},"f":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"d":{"4":{"1":{"df":0,"docs":{},"f":{"b":{"a":{"b":{"d":{"9":{"8":{"3":{"1":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"0":{"b":{"6":{"a":{"6":{"0":{"c":{"df":0,"docs":{},"e":{"7":{"df":0,"docs":{},"e":{"a":{"a":{"df":0,"docs":{},"e":{"a":{"5":{"6":{"df":0,"docs":{},"f":{"0":{"6":{"5":{"7":{"5":{"3":{"d":{"8":{"d":{"c":{"b":{"9":{"6":{"5":{"3":{"d":{"b":{"a":{"d":{"3":{"5":{"df":1,"docs":{"45":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"1":{"7":{"df":0,"docs":{},"e":{"1":{"3":{"1":{"9":{"c":{"d":{"df":0,"docs":{},"e":{"0":{"5":{"b":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"126":{"tf":1.0}}}},"8":{"1":{"0":{"c":{"b":{"d":{"4":{"3":{"6":{"5":{"3":{"9":{"6":{"1":{"6":{"5":{"8":{"7":{"4":{"c":{"0":{"5":{"4":{"d":{"0":{"1":{"b":{"1":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"e":{"4":{"c":{"c":{"2":{"4":{"9":{"2":{"6":{"5":{"df":2,"docs":{"17":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"2":{"4":{"2":{"6":{"8":{"5":{"b":{"df":0,"docs":{},"f":{"1":{"6":{"1":{"7":{"9":{"3":{"c":{"c":{"2":{"5":{"6":{"0":{"3":{"c":{"2":{"3":{"1":{"b":{"c":{"2":{"df":0,"docs":{},"f":{"5":{"6":{"8":{"df":0,"docs":{},"e":{"b":{"6":{"3":{"0":{"df":0,"docs":{},"e":{"a":{"1":{"6":{"a":{"a":{"1":{"3":{"7":{"d":{"2":{"6":{"6":{"4":{"a":{"c":{"8":{"0":{"3":{"8":{"8":{"2":{"5":{"6":{"0":{"8":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"0":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"7":{"a":{"1":{"4":{"2":{"d":{"2":{"6":{"7":{"c":{"1":{"df":0,"docs":{},"f":{"3":{"6":{"7":{"1":{"4":{"df":0,"docs":{},"e":{"4":{"a":{"8":{"df":0,"docs":{},"f":{"7":{"5":{"6":{"1":{"2":{"df":0,"docs":{},"f":{"2":{"0":{"a":{"7":{"9":{"7":{"2":{"0":{"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":1,"docs":{"45":{"tf":1.4142135623730951}}},"b":{"2":{"8":{"6":{"8":{"9":{"8":{"4":{"8":{"4":{"a":{"df":0,"docs":{},"e":{"7":{"3":{"7":{"d":{"2":{"2":{"8":{"3":{"8":{"df":0,"docs":{},"e":{"2":{"7":{"b":{"2":{"9":{"8":{"9":{"9":{"b":{"3":{"2":{"7":{"8":{"0":{"4":{"df":0,"docs":{},"e":{"c":{"4":{"5":{"3":{"0":{"9":{"df":0,"docs":{},"e":{"4":{"7":{"a":{"7":{"5":{"b":{"1":{"8":{"c":{"df":0,"docs":{},"f":{"d":{"7":{"d":{"5":{"9":{"5":{"c":{"c":{"7":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":2,"docs":{"141":{"tf":1.0},"173":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"7":{"c":{"0":{"b":{"5":{"7":{"8":{"2":{"2":{"c":{"5":{"df":0,"docs":{},"f":{"6":{"d":{"d":{"4":{"df":0,"docs":{},"f":{"b":{"d":{"3":{"a":{"7":{"df":0,"docs":{},"e":{"9":{"df":0,"docs":{},"e":{"a":{"d":{"b":{"5":{"9":{"4":{"b":{"8":{"4":{"d":{"7":{"7":{"0":{"df":0,"docs":{},"f":{"5":{"6":{"df":0,"docs":{},"f":{"3":{"9":{"3":{"df":0,"docs":{},"f":{"1":{"3":{"7":{"7":{"8":{"5":{"a":{"5":{"2":{"7":{"0":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"1":{"8":{"2":{"df":0,"docs":{},"e":{"6":{"a":{"d":{"7":{"df":0,"docs":{},"f":{"5":{"2":{"0":{"df":0,"docs":{},"e":{"5":{"1":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"a":{"d":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"f":{"b":{"a":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"127":{"tf":1.4142135623730951},"45":{"tf":1.0}},"f":{"0":{"a":{"d":{"b":{"b":{"9":{"df":0,"docs":{},"e":{"d":{"4":{"1":{"3":{"5":{"d":{"1":{"5":{"0":{"9":{"a":{"d":{"0":{"3":{"9":{"5":{"0":{"5":{"b":{"a":{"d":{"a":{"9":{"4":{"2":{"d":{"1":{"8":{"7":{"5":{"5":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"3":{"6":{"1":{"d":{"5":{"df":0,"docs":{},"f":{"3":{"a":{"df":0,"docs":{},"f":{"5":{"4":{"df":0,"docs":{},"f":{"a":{"5":{"df":1,"docs":{"112":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"233":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":2,"docs":{"141":{"tf":1.0},"233":{"tf":1.0}}}}}}}},"f":{"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.0},"299":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0}}}}}},"1":{")":{".":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"0":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"177":{"tf":1.0}}},"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"144":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}},"1":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"_":{"0":{"0":{"0":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":14,"docs":{"131":{"tf":1.0},"134":{"tf":1.4142135623730951},"141":{"tf":1.0},"178":{"tf":1.0},"18":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"207":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"296":{"tf":1.0},"45":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}}}}}},"1":{"5":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"182":{"tf":1.0}}},"df":25,"docs":{"131":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"205":{"tf":1.0},"221":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"240":{"tf":2.0},"243":{"tf":1.7320508075688772},"258":{"tf":2.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"278":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"299":{"tf":1.0},"45":{"tf":1.4142135623730951},"93":{"tf":1.0}}},"1":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"df":4,"docs":{"131":{"tf":1.0},"183":{"tf":2.449489742783178},"218":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951}}},"2":{"3":{"df":2,"docs":{"127":{"tf":1.0},"183":{"tf":1.4142135623730951}}},"7":{".":{"0":{".":{"0":{".":{"1":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"280":{"tf":1.0}}},"8":{"df":2,"docs":{"132":{"tf":1.0},"280":{"tf":1.7320508075688772}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":7,"docs":{"112":{"tf":1.0},"182":{"tf":1.7320508075688772},"183":{"tf":1.7320508075688772},"239":{"tf":1.4142135623730951},"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"275":{"tf":1.0}}},"3":{"4":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"68":{"tf":1.0}}},"5":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}},"6":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"1":{"df":1,"docs":{"230":{"tf":1.0}}},"2":{"df":1,"docs":{"317":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"9":{"df":1,"docs":{"318":{"tf":1.0}}},"df":4,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"182":{"tf":1.0},"233":{"tf":1.0}}},"7":{"2":{"df":1,"docs":{"316":{"tf":1.0}}},"3":{"df":1,"docs":{"316":{"tf":1.0}}},"7":{"df":1,"docs":{"317":{"tf":1.0}}},"8":{"df":1,"docs":{"318":{"tf":1.0}}},"9":{"df":1,"docs":{"310":{"tf":1.0}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"5":{"df":1,"docs":{"317":{"tf":1.0}}},"6":{"9":{"9":{"2":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"40":{"tf":1.0}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"2":{"3":{"4":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":42,"docs":{"103":{"tf":1.0},"115":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.7320508075688772},"160":{"tf":2.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"17":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":2.449489742783178},"175":{"tf":1.4142135623730951},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"190":{"tf":3.4641016151377544},"191":{"tf":1.0},"210":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"280":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"326":{"tf":1.4142135623730951},"93":{"tf":1.7320508075688772},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"1":{"8":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}},"2":{".":{"0":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":1,"docs":{"258":{"tf":1.7320508075688772}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"1":{"df":12,"docs":{"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951}}},"2":{"df":8,"docs":{"239":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"251":{"tf":1.4142135623730951},"254":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"267":{"tf":2.0}}},"3":{"df":6,"docs":{"218":{"tf":1.4142135623730951},"221":{"tf":1.4142135623730951},"225":{"tf":1.4142135623730951},"229":{"tf":1.4142135623730951},"232":{"tf":1.4142135623730951},"236":{"tf":1.4142135623730951}}},"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"df":1,"docs":{"314":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"193":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951},"40":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"7":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"4":{"df":1,"docs":{"268":{"tf":1.0}}},"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"8":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"313":{"tf":1.0}}},"df":1,"docs":{"182":{"tf":1.0}}},"2":{"2":{"df":1,"docs":{"309":{"tf":1.0}}},"5":{"5":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"190":{"tf":1.0}}},"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"3":{"1":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"190":{"tf":1.0}}},"9":{"df":1,"docs":{"312":{"tf":1.0}}},"df":1,"docs":{"183":{"tf":1.0}}},"4":{"1":{"df":2,"docs":{"252":{"tf":1.0},"253":{"tf":1.0}}},"3":{"df":1,"docs":{"314":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"9":{"df":1,"docs":{"249":{"tf":1.0}}},"df":1,"docs":{"307":{"tf":1.4142135623730951}}},"5":{"0":{"df":2,"docs":{"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"1":{"df":1,"docs":{"314":{"tf":1.0}}},"3":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":2,"docs":{"240":{"tf":1.0},"312":{"tf":1.0}}},"6":{"df":7,"docs":{"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"68":{"tf":1.0}}},"df":2,"docs":{"173":{"tf":1.0},"182":{"tf":1.7320508075688772}}},"6":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"313":{"tf":1.0}}},"3":{"df":1,"docs":{"190":{"tf":1.4142135623730951}}},"4":{"df":2,"docs":{"190":{"tf":1.0},"312":{"tf":1.0}}},"5":{"df":1,"docs":{"312":{"tf":1.0}}},"6":{"df":1,"docs":{"312":{"tf":1.0}}},"7":{"5":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"312":{"tf":1.0}}},"df":6,"docs":{"221":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"248":{"tf":1.4142135623730951},"283":{"tf":1.0}}},"7":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"308":{"tf":1.0}}},"6":{"df":1,"docs":{"308":{"tf":1.0}}},"df":6,"docs":{"190":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"8":{"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":5,"docs":{"190":{"tf":1.0},"230":{"tf":1.0},"236":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"73":{"tf":1.0}}},"9":{"6":{"df":1,"docs":{"308":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"182":{"tf":1.0},"282":{"tf":1.4142135623730951}}},"a":{"df":1,"docs":{"222":{"tf":1.0}}},"df":23,"docs":{"103":{"tf":1.4142135623730951},"109":{"tf":1.0},"111":{"tf":1.0},"13":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"165":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.0},"182":{"tf":1.7320508075688772},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"211":{"tf":1.4142135623730951},"231":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":2.23606797749979},"327":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"8":{"df":1,"docs":{"308":{"tf":1.0}}},"df":2,"docs":{"299":{"tf":1.4142135623730951},"70":{"tf":1.0}}},"1":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"3":{"df":1,"docs":{"308":{"tf":1.0}}},"5":{"df":1,"docs":{"310":{"tf":1.0}}},"7":{"df":1,"docs":{"309":{"tf":1.0}}},"df":5,"docs":{"227":{"tf":1.0},"267":{"tf":2.0},"270":{"tf":2.0},"278":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951}}},"2":{"0":{"df":2,"docs":{"231":{"tf":1.0},"309":{"tf":1.0}}},"3":{"df":1,"docs":{"309":{"tf":1.0}}},"4":{"df":1,"docs":{"309":{"tf":1.0}}},"7":{"df":1,"docs":{"310":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":3,"docs":{"141":{"tf":1.0},"230":{"tf":1.7320508075688772},"258":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"305":{"tf":1.0}}},"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"299":{"tf":1.0}}},"5":{"df":1,"docs":{"305":{"tf":1.0}}},"8":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"4":{"2":{"df":1,"docs":{"306":{"tf":1.0}}},"3":{"df":1,"docs":{"268":{"tf":1.0}}},"6":{"df":1,"docs":{"304":{"tf":1.0}}},"7":{"df":1,"docs":{"306":{"tf":1.0}}},"df":0,"docs":{}},"5":{"2":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"7":{"8":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"7":{"6":{"7":{"5":{"9":{"6":{"7":{"2":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"8":{"4":{"df":1,"docs":{"107":{"tf":1.0}}},"7":{"df":1,"docs":{"302":{"tf":1.0}}},"8":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"302":{"tf":1.0}}},"4":{"df":1,"docs":{"301":{"tf":1.0}}},"7":{"df":1,"docs":{"255":{"tf":1.0}}},"8":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":11,"docs":{"161":{"tf":1.0},"17":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"18":{"tf":1.0},"182":{"tf":2.23606797749979},"192":{"tf":1.0},"212":{"tf":1.4142135623730951},"243":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.0},"328":{"tf":1.4142135623730951}}},"4":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":1,"docs":{"300":{"tf":1.0}}},"3":{"df":1,"docs":{"301":{"tf":1.0}}},"6":{"df":2,"docs":{"299":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"1":{"5":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"2":{"4":{"df":1,"docs":{"182":{"tf":1.0}}},"9":{"df":1,"docs":{"296":{"tf":1.0}}},"df":12,"docs":{"130":{"tf":1.4142135623730951},"189":{"tf":1.0},"201":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":2.449489742783178},"233":{"tf":1.0},"243":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.4142135623730951},"283":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"1":{"df":1,"docs":{"296":{"tf":1.0}}},"2":{"df":1,"docs":{"296":{"tf":1.0}}},"5":{"df":1,"docs":{"296":{"tf":1.0}}},"7":{"df":1,"docs":{"297":{"tf":1.0}}},"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"292":{"tf":1.0}}},"2":{"df":1,"docs":{"249":{"tf":1.0}}},"4":{"df":1,"docs":{"293":{"tf":1.0}}},"5":{"df":1,"docs":{"293":{"tf":1.0}}},"8":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"5":{"9":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"292":{"tf":1.0}}},"8":{"df":2,"docs":{"287":{"tf":1.0},"288":{"tf":1.0}}},"9":{"df":1,"docs":{"293":{"tf":1.0}}},"df":0,"docs":{}},"7":{"1":{"1":{"df":2,"docs":{"279":{"tf":1.0},"302":{"tf":1.0}}},"df":0,"docs":{}},"2":{"df":2,"docs":{"292":{"tf":1.0},"294":{"tf":1.0}}},"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"8":{"5":{"df":1,"docs":{"290":{"tf":1.0}}},"8":{"df":1,"docs":{"272":{"tf":1.0}}},"9":{"df":1,"docs":{"289":{"tf":1.0}}},"df":0,"docs":{}},"9":{"2":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"288":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":7,"docs":{"160":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.4142135623730951},"213":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"329":{"tf":1.4142135623730951}}},"5":{"0":{"0":{"0":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}},"df":2,"docs":{"178":{"tf":1.0},"312":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"252":{"tf":1.0}}},"9":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"288":{"tf":1.0}}},"4":{"df":1,"docs":{"289":{"tf":1.0}}},"7":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"2":{"0":{"df":1,"docs":{"283":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"287":{"tf":1.0}}},"df":2,"docs":{"189":{"tf":1.4142135623730951},"312":{"tf":1.0}}},"3":{"1":{"df":1,"docs":{"284":{"tf":1.0}}},"4":{"df":1,"docs":{"284":{"tf":1.0}}},"5":{"df":1,"docs":{"284":{"tf":1.0}}},"9":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"df":1,"docs":{"285":{"tf":1.0}}},"3":{"df":1,"docs":{"64":{"tf":1.0}}},"6":{"df":1,"docs":{"284":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"276":{"tf":1.0}}},"1":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"279":{"tf":1.0}}},"9":{"df":1,"docs":{"279":{"tf":1.0}}},"b":{"c":{"7":{"5":{"df":0,"docs":{},"e":{"2":{"d":{"6":{"3":{"1":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"1":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.0}}},"4":{"df":1,"docs":{"280":{"tf":1.0}}},"5":{"df":1,"docs":{"280":{"tf":1.0}}},"6":{"df":1,"docs":{"279":{"tf":1.0}}},"7":{"df":1,"docs":{"275":{"tf":1.0}}},"8":{"df":2,"docs":{"280":{"tf":1.0},"281":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"277":{"tf":1.0}}},"df":0,"docs":{}},"9":{"0":{"df":1,"docs":{"250":{"tf":1.0}}},"6":{"df":2,"docs":{"276":{"tf":1.0},"277":{"tf":1.0}}},"df":0,"docs":{}},"df":9,"docs":{"163":{"tf":1.0},"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"181":{"tf":1.0},"182":{"tf":1.0},"243":{"tf":1.4142135623730951},"272":{"tf":1.0},"288":{"tf":1.0}}},"6":{"0":{"1":{"df":1,"docs":{"273":{"tf":1.0}}},"3":{"df":1,"docs":{"271":{"tf":1.0}}},"6":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"1":{"9":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}},"2":{"1":{"df":1,"docs":{"268":{"tf":1.0}}},"2":{"df":1,"docs":{"268":{"tf":1.0}}},"3":{"df":1,"docs":{"269":{"tf":1.0}}},"8":{"df":1,"docs":{"266":{"tf":1.0}}},"9":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"3":{"3":{"df":1,"docs":{"269":{"tf":1.0}}},"5":{"df":1,"docs":{"243":{"tf":1.0}}},"6":{"df":1,"docs":{"258":{"tf":1.0}}},"8":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"5":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"6":{"5":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"7":{"7":{"df":1,"docs":{"265":{"tf":1.0}}},"9":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"8":{"1":{"df":1,"docs":{"250":{"tf":1.0}}},"2":{"df":1,"docs":{"250":{"tf":1.0}}},"4":{"df":1,"docs":{"256":{"tf":1.0}}},"df":0,"docs":{}},"9":{"4":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"182":{"tf":2.0},"275":{"tf":1.0}}},"7":{"0":{"3":{"df":1,"docs":{"243":{"tf":1.0}}},"5":{"df":1,"docs":{"249":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"246":{"tf":1.0}}},"df":0,"docs":{}},"2":{"2":{"df":1,"docs":{"247":{"tf":1.0}}},"3":{"df":1,"docs":{"247":{"tf":1.0}}},"6":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"4":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"4":{"5":{"df":1,"docs":{"244":{"tf":1.0}}},"7":{"df":1,"docs":{"243":{"tf":1.0}}},"9":{"df":1,"docs":{"244":{"tf":1.0}}},"df":0,"docs":{}},"5":{"7":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"df":2,"docs":{"240":{"tf":1.0},"241":{"tf":1.0}}},"9":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"7":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"3":{"df":1,"docs":{"241":{"tf":1.0}}},"5":{"df":1,"docs":{"241":{"tf":1.0}}},"6":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"240":{"tf":1.0}}},"9":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"8":{"3":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.0}}},"8":{"0":{"1":{"df":1,"docs":{"241":{"tf":1.0}}},"3":{"df":1,"docs":{"237":{"tf":1.0}}},"5":{"df":1,"docs":{"240":{"tf":1.0}}},"7":{"df":1,"docs":{"233":{"tf":1.0}}},"df":1,"docs":{"258":{"tf":1.0}}},"1":{"5":{"df":1,"docs":{"241":{"tf":1.0}}},"df":0,"docs":{}},"3":{"6":{"]":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"8":{"3":{"6":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"df":2,"docs":{"163":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"5":{"3":{"df":1,"docs":{"235":{"tf":1.0}}},"4":{"5":{"df":2,"docs":{"15":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"1":{"df":1,"docs":{"234":{"tf":1.0}}},"3":{"df":1,"docs":{"233":{"tf":1.0}}},"4":{"df":1,"docs":{"233":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"7":{"df":1,"docs":{"231":{"tf":1.0}}},"df":0,"docs":{}},"8":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"df":1,"docs":{"231":{"tf":1.0}}},"5":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"9":{"8":{"df":1,"docs":{"227":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"10":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.4142135623730951},"112":{"tf":1.0},"130":{"tf":1.0},"182":{"tf":1.0},"197":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.0},"280":{"tf":1.4142135623730951},"40":{"tf":1.0},"93":{"tf":1.0}}},"9":{"0":{"8":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":1,"docs":{"228":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"9":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"2":{"6":{"df":1,"docs":{"223":{"tf":1.0}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"224":{"tf":1.0}}},"3":{"df":1,"docs":{"222":{"tf":1.0}}},"7":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}},"4":{"4":{"df":1,"docs":{"220":{"tf":1.0}}},"7":{"df":1,"docs":{"219":{"tf":1.0}}},"8":{"df":1,"docs":{"219":{"tf":1.0}}},"df":0,"docs":{}},"8":{"_":{"2":{"2":{"2":{"df":1,"docs":{"124":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"120":{"tf":1.4142135623730951},"127":{"tf":1.4142135623730951},"182":{"tf":1.0},"93":{"tf":1.0}}},"_":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"_":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"268":{"tf":1.0}}}}}}},"df":3,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0}}},"df":0,"docs":{}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"139":{"tf":1.0},"231":{"tf":1.0},"40":{"tf":1.0},"48":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{",":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":4,"docs":{"139":{"tf":2.23606797749979},"296":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"(":{"a":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"(":{"0":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":11,"docs":{"120":{"tf":2.6457513110645907},"124":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":2.0},"170":{"tf":1.0},"173":{"tf":1.0},"187":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"255":{"tf":2.0}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"137":{"tf":1.0},"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"a":{".":{"df":0,"docs":{},"k":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"b":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{",":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"131":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"213":{"tf":1.0}}},"df":14,"docs":{"131":{"tf":1.0},"146":{"tf":2.449489742783178},"240":{"tf":1.0},"241":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0},"294":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"9":{"tf":1.0}},"l":{"df":2,"docs":{"141":{"tf":1.0},"275":{"tf":1.0}}}},"o":{"df":0,"docs":{},"v":{"df":10,"docs":{"143":{"tf":1.0},"164":{"tf":1.0},"223":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"119":{"tf":1.0},"14":{"tf":1.0},"230":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"324":{"tf":1.0}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"296":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"41":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.7320508075688772},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.4142135623730951},"249":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"288":{"tf":1.0}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"216":{"tf":1.0},"275":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"323":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"320":{"tf":1.0},"323":{"tf":1.0},"38":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"43":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"327":{"tf":1.0}}}},"v":{"df":1,"docs":{"171":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":5,"docs":{"164":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"215":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"330":{"tf":1.0}}}}},"d":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"141":{"tf":1.0}}},"6":{"df":1,"docs":{"141":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":2,"docs":{"141":{"tf":1.4142135623730951},"255":{"tf":1.0}}},"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}},"x":{"df":1,"docs":{"141":{"tf":1.0}}}},"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"279":{"tf":1.0}}},"x":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":21,"docs":{"10":{"tf":1.7320508075688772},"135":{"tf":1.0},"148":{"tf":1.0},"19":{"tf":1.0},"211":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"312":{"tf":2.23606797749979},"40":{"tf":2.0},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.0},"9":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":7,"docs":{"182":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"94":{"tf":1.0}}}},"r":{"df":4,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":0,"docs":{},"x":{"7":{"1":{"5":{"6":{"5":{"2":{"6":{"df":0,"docs":{},"f":{"b":{"d":{"7":{"a":{"3":{"c":{"7":{"2":{"9":{"6":{"9":{"b":{"5":{"4":{"df":0,"docs":{},"f":{"6":{"4":{"df":0,"docs":{},"e":{"4":{"2":{"c":{"1":{"0":{"df":0,"docs":{},"f":{"b":{"b":{"7":{"6":{"8":{"c":{"8":{"a":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":4,"docs":{"189":{"tf":1.0},"230":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":53,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"143":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":2.23606797749979},"163":{"tf":2.0},"164":{"tf":2.0},"17":{"tf":1.7320508075688772},"173":{"tf":2.0},"177":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"187":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"19":{"tf":1.4142135623730951},"195":{"tf":3.0},"196":{"tf":2.6457513110645907},"200":{"tf":1.4142135623730951},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":2.23606797749979},"243":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.449489742783178},"268":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"292":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":3.0},"321":{"tf":1.0},"323":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":2.0},"42":{"tf":2.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":3.3166247903554},"46":{"tf":1.4142135623730951},"48":{"tf":2.449489742783178},"52":{"tf":1.0},"69":{"tf":1.0},"7":{"tf":1.4142135623730951},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}}},"s":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":33,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"252":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"289":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951},"317":{"tf":1.0},"35":{"tf":1.0},"45":{"tf":1.0},"68":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"27":{"tf":1.0},"296":{"tf":1.0},"321":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"42":{"tf":1.0},"43":{"tf":1.0},"61":{"tf":1.0},"9":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"18":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"289":{"tf":1.0},"306":{"tf":1.0},"34":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":1,"docs":{"320":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"231":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"329":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"213":{"tf":1.0},"22":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"m":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0}}}},"l":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"19":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":3,"docs":{"108":{"tf":1.0},"67":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}}}}}},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}},"s":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"134":{"tf":2.0},"292":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"322":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"206":{"tf":1.7320508075688772},"227":{"tf":1.0},"256":{"tf":1.0}}},"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":22,"docs":{"124":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"143":{"tf":1.0},"153":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"193":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"279":{"tf":1.4142135623730951},"28":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"328":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0},"9":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"120":{"tf":1.0},"143":{"tf":1.0},"69":{"tf":1.0}},"g":{"df":4,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"36":{"tf":1.0},"64":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":23,"docs":{"232":{"tf":1.0},"236":{"tf":1.4142135623730951},"239":{"tf":1.4142135623730951},"242":{"tf":1.4142135623730951},"245":{"tf":1.4142135623730951},"248":{"tf":1.4142135623730951},"25":{"tf":1.0},"251":{"tf":1.4142135623730951},"254":{"tf":1.4142135623730951},"257":{"tf":1.4142135623730951},"267":{"tf":2.0},"270":{"tf":2.0},"274":{"tf":1.4142135623730951},"278":{"tf":1.4142135623730951},"282":{"tf":1.4142135623730951},"286":{"tf":1.4142135623730951},"291":{"tf":1.4142135623730951},"295":{"tf":1.4142135623730951},"298":{"tf":1.4142135623730951},"303":{"tf":1.4142135623730951},"307":{"tf":1.4142135623730951},"311":{"tf":1.4142135623730951},"315":{"tf":2.0}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":4,"docs":{"14":{"tf":1.0},"309":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"143":{"tf":1.4142135623730951}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":13,"docs":{"16":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.0},"211":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":2,"docs":{"279":{"tf":1.0},"3":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"149":{"tf":1.4142135623730951},"212":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.23606797749979},"42":{"tf":2.0},"43":{"tf":1.0},"48":{"tf":2.6457513110645907}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":5,"docs":{"266":{"tf":1.7320508075688772},"281":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"52":{"tf":1.0}}}},"z":{"df":15,"docs":{"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"283":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.7320508075688772},"297":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.4142135623730951},"309":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{":":{":":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"133":{"tf":1.4142135623730951}}}},"n":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"10":{"tf":1.0},"115":{"tf":1.0},"141":{"tf":1.0},"144":{"tf":1.0},"180":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":3,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"330":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":6,"docs":{"15":{"tf":2.23606797749979},"16":{"tf":1.0},"17":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"19":{"tf":1.0},"2":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":3,"docs":{"266":{"tf":1.0},"315":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"299":{"tf":1.0}}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"18":{"tf":1.0},"193":{"tf":1.0},"281":{"tf":1.0},"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":2,"docs":{"321":{"tf":1.0},"326":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"144":{"tf":1.0},"243":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"i":{"df":0,"docs":{},"x":{"df":1,"docs":{"135":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"163":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"163":{"tf":1.0}}}}}}}}}}}},"df":1,"docs":{"9":{"tf":1.0}}},"df":3,"docs":{"184":{"tf":1.0},"288":{"tf":1.0},"323":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"211":{"tf":1.0},"213":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"215":{"tf":1.0},"216":{"tf":1.0},"315":{"tf":1.0},"322":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"t":{"df":2,"docs":{"24":{"tf":1.0},"26":{"tf":2.0}}}},"r":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"74":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"193":{"tf":1.0},"212":{"tf":1.0}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"277":{"tf":1.0},"316":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":21,"docs":{"108":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":2.0},"143":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":2.0},"185":{"tf":1.7320508075688772},"234":{"tf":1.0},"246":{"tf":1.0},"255":{"tf":3.0},"265":{"tf":1.0},"269":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.0}}}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":1.0},"182":{"tf":2.0},"292":{"tf":1.4142135623730951}},"i":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}}},"m":{"df":4,"docs":{"170":{"tf":1.0},"22":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"288":{"tf":1.0}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"326":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"<":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"3":{"2":{"df":2,"docs":{"250":{"tf":1.0},"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"192":{"tf":1.0}}},"u":{"2":{"5":{"6":{"df":11,"docs":{"161":{"tf":1.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"192":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"4":{"df":4,"docs":{"109":{"tf":1.7320508075688772},"110":{"tf":1.0},"111":{"tf":2.0},"112":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":4,"docs":{"134":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":21,"docs":{"10":{"tf":1.0},"113":{"tf":1.0},"131":{"tf":1.0},"161":{"tf":1.0},"166":{"tf":1.4142135623730951},"175":{"tf":2.0},"177":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":3.3166247903554},"196":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.4142135623730951},"269":{"tf":1.0},"271":{"tf":1.7320508075688772},"275":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"8":{"tf":1.0}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"192":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"219":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":7,"docs":{"120":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"269":{"tf":1.0},"287":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.0},"9":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"107":{"tf":1.0},"113":{"tf":1.0},"157":{"tf":1.0},"171":{"tf":3.1622776601683795},"223":{"tf":1.4142135623730951},"230":{"tf":4.123105625617661},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":1.4142135623730951},"258":{"tf":4.47213595499958},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"292":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"312":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"171":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":14,"docs":{"113":{"tf":1.4142135623730951},"157":{"tf":1.4142135623730951},"161":{"tf":2.8284271247461903},"162":{"tf":2.449489742783178},"177":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":2.0},"250":{"tf":1.0},"265":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"304":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":2.23606797749979},"41":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"162":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"df":8,"docs":{"168":{"tf":1.0},"169":{"tf":1.0},"196":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.7320508075688772},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":6,"docs":{"148":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"24":{"tf":1.4142135623730951},"271":{"tf":1.0},"281":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}}},"t":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":4,"docs":{"266":{"tf":1.0},"285":{"tf":1.0},"306":{"tf":1.4142135623730951},"310":{"tf":1.0}}},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"277":{"tf":1.0},"63":{"tf":1.0}}},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"130":{"tf":1.0},"43":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"212":{"tf":1.0},"321":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":1.0},"178":{"tf":2.6457513110645907},"189":{"tf":1.4142135623730951},"191":{"tf":1.0},"240":{"tf":1.0},"246":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"330":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"40":{"tf":1.7320508075688772},"48":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"41":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":15,"docs":{"224":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":2.449489742783178},"37":{"tf":2.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":3.1622776601683795},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"y":{"c":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"43":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"157":{"tf":1.0},"162":{"tf":2.23606797749979},"304":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"219":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"144":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"31":{"tf":1.0},"43":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":13,"docs":{"12":{"tf":1.0},"197":{"tf":1.0},"206":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"330":{"tf":1.4142135623730951},"60":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"327":{"tf":1.0},"46":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"y":{"df":2,"docs":{"40":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"b":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"2":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"39":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"26":{"tf":1.7320508075688772},"318":{"tf":1.0},"57":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"124":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"d":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"o":{"df":1,"docs":{"269":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":6,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"279":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}},"e":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"(":{"a":{"c":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"177":{"tf":1.0}},"u":{"df":1,"docs":{"293":{"tf":1.0}}}},"n":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":2.0},"329":{"tf":1.7320508075688772}}},"r":{"'":{"df":1,"docs":{"204":{"tf":1.0}}},"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"161":{"tf":1.0},"231":{"tf":1.0}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"250":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"170":{"tf":1.0},"250":{"tf":1.0},"283":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":4,"docs":{"165":{"tf":1.0},"171":{"tf":1.4142135623730951},"288":{"tf":1.0},"316":{"tf":1.0}},"u":{"df":3,"docs":{"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}},".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"252":{"tf":1.0}}}}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":27,"docs":{"159":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.0},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"231":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":2.23606797749979},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"275":{"tf":1.0},"280":{"tf":1.4142135623730951},"305":{"tf":1.0},"308":{"tf":2.23606797749979},"309":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951}},"k":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"133":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"b":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"133":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"187":{"tf":1.0},"201":{"tf":1.4142135623730951},"203":{"tf":1.0},"212":{"tf":1.0},"240":{"tf":1.0},"252":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"287":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0},"52":{"tf":1.0},"90":{"tf":1.0}}},"i":{"c":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}},"df":8,"docs":{"258":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"29":{"tf":1.0},"312":{"tf":1.0},"46":{"tf":1.4142135623730951},"57":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"179":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"174":{"tf":1.4142135623730951}}}}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"177":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"283":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"178":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"2":{"6":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"0":{"0":{"]":{"[":{"0":{"df":0,"docs":{},"x":{"0":{"1":{"df":1,"docs":{"204":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"175":{"tf":1.0},"180":{"tf":1.0},"196":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.7320508075688772},"279":{"tf":1.0},"288":{"tf":1.0}}}},"df":14,"docs":{"115":{"tf":2.23606797749979},"162":{"tf":3.4641016151377544},"170":{"tf":1.4142135623730951},"196":{"tf":2.0},"240":{"tf":2.23606797749979},"250":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.4142135623730951},"304":{"tf":4.795831523312719},"312":{"tf":2.23606797749979},"90":{"tf":1.7320508075688772},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":8,"docs":{"24":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"308":{"tf":1.0},"41":{"tf":1.0},"56":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"148":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"241":{"tf":1.0},"256":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"288":{"tf":1.0},"321":{"tf":1.0},"41":{"tf":1.4142135623730951},"90":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":7,"docs":{"212":{"tf":1.0},"231":{"tf":1.0},"26":{"tf":1.0},"280":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"136":{"tf":1.0},"167":{"tf":1.0},"206":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"13":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":8,"docs":{"182":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"324":{"tf":1.0},"326":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"215":{"tf":1.0},"3":{"tf":1.0},"310":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"250":{"tf":1.0},"275":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"37":{"tf":1.0},"40":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"48":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":3,"docs":{"40":{"tf":1.7320508075688772},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"1":{"tf":1.0},"321":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"317":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":7,"docs":{"126":{"tf":1.0},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.4142135623730951},"290":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}}}},"i":{":":{":":{"b":{"a":{":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"253":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"37":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"40":{"tf":2.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}},"df":8,"docs":{"36":{"tf":1.4142135623730951},"37":{"tf":2.0},"40":{"tf":1.7320508075688772},"41":{"tf":4.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":2.6457513110645907},"46":{"tf":1.0}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}}}}}}}}}}}}}},"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":12,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"162":{"tf":1.4142135623730951},"182":{"tf":1.4142135623730951},"217":{"tf":1.0},"26":{"tf":1.7320508075688772},"306":{"tf":1.0},"318":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"133":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"_":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"79":{"tf":1.0}}}}}},"df":7,"docs":{"10":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"40":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"227":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":2,"docs":{"182":{"tf":1.7320508075688772},"185":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"2":{"b":{"df":1,"docs":{"108":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"68":{"tf":1.4142135623730951}}}},"_":{"2":{"df":0,"docs":{},"f":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"111":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"108":{"tf":1.7320508075688772},"110":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"312":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"143":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":26,"docs":{"13":{"tf":2.0},"135":{"tf":2.0},"137":{"tf":1.0},"138":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"15":{"tf":1.7320508075688772},"150":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.7320508075688772},"2":{"tf":1.0},"20":{"tf":1.0},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":19,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"115":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.0},"151":{"tf":2.0},"16":{"tf":1.0},"160":{"tf":1.0},"167":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"279":{"tf":1.4142135623730951},"283":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}}}},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"210":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0}}},"df":0,"docs":{}}},"b":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"i":{"df":11,"docs":{"132":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.0},"255":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":6,"docs":{"10":{"tf":2.0},"135":{"tf":2.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"134":{"tf":1.4142135623730951}}}}}},"l":{"[":{"3":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"178":{"tf":1.0}}},"df":0,"docs":{}},"df":34,"docs":{"106":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"141":{"tf":1.7320508075688772},"152":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":1.7320508075688772},"178":{"tf":1.7320508075688772},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.4142135623730951},"191":{"tf":1.4142135623730951},"196":{"tf":1.7320508075688772},"222":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"312":{"tf":3.1622776601683795},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.7320508075688772}},"e":{"a":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"125":{"tf":1.0},"170":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":15,"docs":{"113":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"167":{"tf":1.0},"171":{"tf":1.4142135623730951},"172":{"tf":1.0},"181":{"tf":1.4142135623730951},"184":{"tf":2.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.7320508075688772},"196":{"tf":1.0},"240":{"tf":1.0},"272":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"184":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"(":{"1":{".":{"6":{"5":{"df":1,"docs":{"57":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"57":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":13,"docs":{"12":{"tf":1.0},"20":{"tf":1.0},"204":{"tf":1.0},"237":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"289":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"132":{"tf":1.0},"192":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"271":{"tf":1.4142135623730951},"316":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"30":{"tf":1.0}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"177":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"212":{"tf":1.4142135623730951},"216":{"tf":1.0},"272":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":6,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"126":{"tf":1.0},"157":{"tf":1.0},"168":{"tf":3.1622776601683795},"212":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"168":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"w":{"df":2,"docs":{"23":{"tf":1.0},"57":{"tf":1.0}}}},"o":{"a":{"d":{"df":1,"docs":{"146":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}}}}},"df":5,"docs":{"230":{"tf":2.0},"75":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"g":{"df":13,"docs":{"211":{"tf":1.0},"244":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"269":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"313":{"tf":1.0},"315":{"tf":1.0},"51":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"238":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"253":{"tf":1.4142135623730951},"256":{"tf":1.4142135623730951},"269":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"276":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951},"284":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"300":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":16,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.4142135623730951},"212":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"26":{"tf":2.8284271247461903},"277":{"tf":1.0},"312":{"tf":1.0},"4":{"tf":1.0},"45":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":3.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"s":{"df":1,"docs":{"312":{"tf":1.0}}},"v":{"a":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":6,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"26":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"131":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"53":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.4142135623730951}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":9,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"219":{"tf":3.3166247903554},"3":{"tf":1.4142135623730951},"312":{"tf":1.0},"45":{"tf":2.0},"57":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"105":{"tf":1.0},"131":{"tf":1.0},"134":{"tf":1.0},"18":{"tf":1.4142135623730951},"195":{"tf":1.0},"197":{"tf":1.7320508075688772},"227":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772},"312":{"tf":1.0},"40":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"90":{"tf":1.7320508075688772},"91":{"tf":1.0}},"s":{"1":{"0":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"1":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"z":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"a":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"279":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.7320508075688772}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":53,"docs":{"113":{"tf":1.0},"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"138":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"141":{"tf":2.8284271247461903},"144":{"tf":2.0},"15":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":3.1622776601683795},"174":{"tf":1.0},"175":{"tf":1.0},"18":{"tf":2.0},"19":{"tf":1.0},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"20":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.7320508075688772},"243":{"tf":1.4142135623730951},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"269":{"tf":1.0},"273":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":2.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.0},"304":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"45":{"tf":2.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"255":{"tf":1.0}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"173":{"tf":1.0}}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.0}}}}}}},"n":{"'":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.4142135623730951},"308":{"tf":1.0},"313":{"tf":1.0}}}},"_":{"a":{"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"24":{"tf":1.0}}}}},"p":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"115":{"tf":1.0},"237":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":3,"docs":{"158":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"57":{"tf":2.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"df":1,"docs":{"189":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":14,"docs":{"141":{"tf":1.4142135623730951},"163":{"tf":1.0},"171":{"tf":1.0},"241":{"tf":1.0},"255":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}},"t":{"df":12,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"189":{"tf":1.0},"19":{"tf":1.0},"233":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.4142135623730951},"312":{"tf":1.0},"320":{"tf":1.0},"45":{"tf":3.0}},"r":{"df":0,"docs":{},"o":{"df":2,"docs":{"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":5,"docs":{"133":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"203":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"117":{"tf":1.0},"146":{"tf":1.7320508075688772},"281":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"313":{"tf":1.0}}}}},"s":{"df":14,"docs":{"144":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"244":{"tf":1.0},"250":{"tf":1.7320508075688772},"269":{"tf":1.0},"276":{"tf":1.0},"296":{"tf":1.0},"3":{"tf":1.0},"63":{"tf":1.0}}}}},"d":{"df":1,"docs":{"26":{"tf":1.0}}},"df":3,"docs":{"240":{"tf":2.0},"296":{"tf":1.4142135623730951},"309":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":8,"docs":{"136":{"tf":1.0},"143":{"tf":1.0},"241":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"151":{"tf":1.0},"240":{"tf":1.0},"312":{"tf":1.0},"52":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":51,"docs":{"10":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":2.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.7320508075688772},"266":{"tf":1.7320508075688772},"272":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"288":{"tf":1.0},"290":{"tf":1.4142135623730951},"292":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"308":{"tf":2.0},"310":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"313":{"tf":2.0},"314":{"tf":1.4142135623730951},"315":{"tf":1.4142135623730951},"316":{"tf":1.0},"318":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"42":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":3,"docs":{"213":{"tf":1.0},"327":{"tf":1.0},"52":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"10":{"tf":1.0},"301":{"tf":1.0}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":9,"docs":{"115":{"tf":2.23606797749979},"120":{"tf":2.23606797749979},"124":{"tf":1.0},"126":{"tf":1.7320508075688772},"127":{"tf":1.7320508075688772},"197":{"tf":1.0},"45":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"146":{"tf":1.0},"320":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"269":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"45":{"tf":1.0}},"e":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"d":{"df":1,"docs":{"45":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"44":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"155":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":25,"docs":{"19":{"tf":1.0},"192":{"tf":1.0},"219":{"tf":1.0},"227":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"255":{"tf":1.0},"26":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"289":{"tf":1.0},"292":{"tf":2.23606797749979},"302":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":2.0},"313":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"43":{"tf":1.7320508075688772},"45":{"tf":2.23606797749979}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":1,"docs":{"22":{"tf":1.0}}}},"m":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"19":{"tf":1.0},"255":{"tf":1.0}}}}}},"i":{"df":4,"docs":{"289":{"tf":1.0},"302":{"tf":1.0},"318":{"tf":1.0},"63":{"tf":1.0}},"r":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"272":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"226":{"tf":1.0},"305":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"146":{"tf":1.0},"326":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"329":{"tf":1.0},"40":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"1":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}},"r":{"df":2,"docs":{"143":{"tf":1.4142135623730951},"255":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}},"df":5,"docs":{"243":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"34":{"tf":1.0},"57":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":3,"docs":{"26":{"tf":1.4142135623730951},"316":{"tf":1.0},"317":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"41":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"277":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":74,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.7320508075688772},"13":{"tf":1.0},"135":{"tf":1.4142135623730951},"136":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":2.23606797749979},"18":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"223":{"tf":1.0},"228":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"234":{"tf":1.0},"241":{"tf":1.4142135623730951},"243":{"tf":1.0},"244":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.4142135623730951},"269":{"tf":1.0},"27":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.4142135623730951},"28":{"tf":2.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.7320508075688772},"289":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"319":{"tf":1.7320508075688772},"32":{"tf":1.0},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.7320508075688772},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"330":{"tf":2.0},"38":{"tf":1.0},"4":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"64":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.7320508075688772}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"223":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"132":{"tf":1.0},"222":{"tf":1.0},"28":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"281":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"138":{"tf":1.0},"146":{"tf":1.0},"162":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":6,"docs":{"141":{"tf":1.4142135623730951},"275":{"tf":1.0},"35":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"67":{"tf":1.0}}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"m":{"a":{"df":5,"docs":{"171":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0}},"n":{"d":{"df":14,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"113":{"tf":1.0},"128":{"tf":1.7320508075688772},"240":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"216":{"tf":1.0},"322":{"tf":1.0},"52":{"tf":1.0},"60":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"13":{"tf":1.0},"330":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"139":{"tf":1.0},"67":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"df":15,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951},"322":{"tf":1.7320508075688772},"323":{"tf":1.7320508075688772},"324":{"tf":1.4142135623730951},"325":{"tf":1.4142135623730951},"326":{"tf":1.7320508075688772},"327":{"tf":1.4142135623730951},"328":{"tf":2.0},"329":{"tf":1.7320508075688772},"330":{"tf":1.0},"4":{"tf":1.0},"52":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"146":{"tf":1.0},"170":{"tf":1.0},"25":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"183":{"tf":2.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}}}}}}}},"t":{"df":2,"docs":{"119":{"tf":1.0},"292":{"tf":1.0}}}},"df":1,"docs":{"244":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":56,"docs":{"0":{"tf":1.0},"1":{"tf":1.4142135623730951},"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"123":{"tf":1.0},"135":{"tf":1.7320508075688772},"136":{"tf":1.7320508075688772},"143":{"tf":1.0},"144":{"tf":1.0},"158":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"223":{"tf":1.7320508075688772},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.4142135623730951},"237":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"266":{"tf":1.0},"269":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"276":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":2.449489742783178},"289":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":2.0},"313":{"tf":2.0},"316":{"tf":1.0},"45":{"tf":1.0},"53":{"tf":1.0},"57":{"tf":2.0},"64":{"tf":2.0},"65":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{":":{"1":{":":{"6":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"190":{"tf":1.0}}}}}},"t":{"df":6,"docs":{"13":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.0},"27":{"tf":1.0}}},"x":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":7,"docs":{"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.4142135623730951},"28":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"292":{"tf":1.0},"57":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"108":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{">":{"(":{"_":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":10,"docs":{"0":{"tf":1.0},"13":{"tf":1.0},"132":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.0},"22":{"tf":1.0},"243":{"tf":1.7320508075688772},"256":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"132":{"tf":1.0},"243":{"tf":1.4142135623730951}}}}}}},">":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"36":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"165":{"tf":1.0},"167":{"tf":2.0},"19":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":13,"docs":{"213":{"tf":1.0},"319":{"tf":1.7320508075688772},"320":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"324":{"tf":1.0},"325":{"tf":1.4142135623730951},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"330":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"13":{"tf":1.0}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":6,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"45":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"216":{"tf":1.0},"283":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"146":{"tf":1.4142135623730951},"158":{"tf":1.0},"175":{"tf":1.0}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":5,"docs":{"10":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"19":{"tf":1.7320508075688772},"212":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}},"i":{"d":{"df":6,"docs":{"19":{"tf":1.0},"22":{"tf":1.0},"280":{"tf":1.0},"297":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":8,"docs":{"123":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"171":{"tf":1.0},"181":{"tf":1.0},"190":{"tf":1.4142135623730951},"292":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"33":{"tf":1.0}}}},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"159":{"tf":1.4142135623730951},"197":{"tf":1.0},"203":{"tf":2.0},"244":{"tf":1.0},"260":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":2.0},"279":{"tf":1.4142135623730951}}}}},"df":14,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":2.6457513110645907},"184":{"tf":1.0},"233":{"tf":1.4142135623730951},"244":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"269":{"tf":1.0},"279":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"193":{"tf":1.0},"268":{"tf":1.0},"321":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":9,"docs":{"139":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":3.0},"41":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"159":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"141":{"tf":1.0},"222":{"tf":1.0},"238":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"40":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"130":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"289":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":0,"docs":{},"t":{".":{"a":{"d":{"d":{"_":{"df":1,"docs":{"302":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":1.7320508075688772},"142":{"tf":2.0},"143":{"tf":2.449489742783178},"144":{"tf":3.3166247903554},"145":{"tf":2.6457513110645907},"146":{"tf":4.358898943540674},"147":{"tf":1.0},"148":{"tf":2.0},"149":{"tf":1.7320508075688772},"150":{"tf":1.7320508075688772},"151":{"tf":1.7320508075688772},"152":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"258":{"tf":3.1622776601683795},"271":{"tf":1.0},"304":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":3.3166247903554},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}},"u":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"45":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":7,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"127":{"tf":2.0},"157":{"tf":1.0},"169":{"tf":3.1622776601683795},"20":{"tf":1.0},"327":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"'":{"df":6,"docs":{"135":{"tf":1.0},"189":{"tf":1.0},"219":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}},".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"_":{"b":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":119,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"10":{"tf":2.0},"11":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"12":{"tf":1.7320508075688772},"129":{"tf":1.0},"13":{"tf":2.449489742783178},"130":{"tf":2.0},"135":{"tf":4.47213595499958},"136":{"tf":1.4142135623730951},"137":{"tf":2.23606797749979},"138":{"tf":3.0},"139":{"tf":2.0},"14":{"tf":1.7320508075688772},"140":{"tf":2.0},"141":{"tf":2.0},"142":{"tf":1.0},"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":3.4641016151377544},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"152":{"tf":2.449489742783178},"153":{"tf":2.0},"155":{"tf":1.7320508075688772},"156":{"tf":1.7320508075688772},"159":{"tf":1.4142135623730951},"16":{"tf":2.8284271247461903},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":2.23606797749979},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"18":{"tf":1.7320508075688772},"180":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":3.3166247903554},"19":{"tf":3.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"20":{"tf":2.0},"203":{"tf":1.0},"204":{"tf":1.0},"21":{"tf":1.0},"219":{"tf":3.1622776601683795},"230":{"tf":1.4142135623730951},"231":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"244":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":2.8284271247461903},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"271":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"28":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":1.7320508075688772},"299":{"tf":1.4142135623730951},"3":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.4142135623730951},"308":{"tf":2.449489742783178},"309":{"tf":2.449489742783178},"310":{"tf":1.0},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"33":{"tf":2.23606797749979},"36":{"tf":1.7320508075688772},"39":{"tf":1.7320508075688772},"40":{"tf":4.69041575982343},"41":{"tf":2.449489742783178},"42":{"tf":2.0},"43":{"tf":1.4142135623730951},"44":{"tf":2.0},"45":{"tf":3.605551275463989},"46":{"tf":2.0},"47":{"tf":1.7320508075688772},"48":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772},"7":{"tf":2.8284271247461903},"8":{"tf":2.449489742783178},"9":{"tf":2.23606797749979}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"135":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":13,"docs":{"208":{"tf":2.0},"209":{"tf":1.7320508075688772},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"213":{"tf":1.0},"214":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.4142135623730951},"320":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0},"4":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"r":{"df":16,"docs":{"266":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"290":{"tf":1.4142135623730951},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951},"319":{"tf":1.4142135623730951},"320":{"tf":1.0},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"143":{"tf":1.0},"167":{"tf":1.0},"169":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":2,"docs":{"191":{"tf":1.0},"255":{"tf":1.0}}},"t":{"df":2,"docs":{"240":{"tf":1.0},"40":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.0}}},"t":{"df":4,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}}}},"y":{"df":1,"docs":{"130":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"141":{"tf":1.0},"255":{"tf":1.0}}}}}},"df":0,"docs":{}},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"100":{"tf":1.4142135623730951},"95":{"tf":2.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"i":{"df":6,"docs":{"10":{"tf":1.7320508075688772},"205":{"tf":1.0},"240":{"tf":1.4142135623730951},"275":{"tf":1.0},"316":{"tf":1.7320508075688772},"84":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"79":{"tf":1.0}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":8,"docs":{"118":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.4142135623730951},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"65":{"tf":1.0},"69":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"233":{"tf":1.0},"284":{"tf":1.0},"292":{"tf":1.0},"65":{"tf":1.0}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"133":{"tf":1.0},"141":{"tf":1.4142135623730951},"173":{"tf":1.0},"266":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"44":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"q":{"df":1,"docs":{"330":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"2":{"/":{"0":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"319":{"tf":1.4142135623730951},"330":{"tf":1.0}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"306":{"tf":1.0}}}},"i":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":8,"docs":{"234":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"269":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"290":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":36,"docs":{"13":{"tf":1.0},"133":{"tf":1.0},"135":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"15":{"tf":1.4142135623730951},"150":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.0},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"29":{"tf":1.4142135623730951},"301":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.7320508075688772}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.7320508075688772}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"2":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"189":{"tf":1.0}}}}}},"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":3,"docs":{"189":{"tf":1.0},"305":{"tf":1.0},"312":{"tf":1.0}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"150":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"266":{"tf":1.0},"312":{"tf":1.0}}}},"v":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"79":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"108":{"tf":1.0},"69":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}},"x":{".":{"b":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"252":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":6,"docs":{"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"151":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"(":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"d":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":2,"docs":{"43":{"tf":1.0},"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}},"m":{"df":0,"docs":{},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"222":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":2,"docs":{"135":{"tf":1.0},"240":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"145":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}}},"df":3,"docs":{"240":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"<":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{">":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"148":{"tf":1.0},"240":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"230":{"tf":1.0}},"l":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"258":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":4,"docs":{"149":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":23,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.7320508075688772},"148":{"tf":1.0},"149":{"tf":1.0},"16":{"tf":1.0},"189":{"tf":1.0},"2":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":1.7320508075688772},"249":{"tf":1.0},"258":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":2.23606797749979},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"243":{"tf":1.0},"30":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":24,"docs":{"10":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.0},"164":{"tf":1.0},"169":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"312":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"57":{"tf":1.0},"64":{"tf":1.0},"68":{"tf":1.0}}}}}},"v":{"df":9,"docs":{"1":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"17":{"tf":1.0},"292":{"tf":1.4142135623730951},"32":{"tf":1.0}}}}}},"á":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"c":{"df":0,"docs":{},"l":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"141":{"tf":1.0}}}}},"d":{"a":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"195":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"130":{"tf":2.0}}}},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}},"t":{"a":{"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"19":{"tf":1.0}}}},"df":0,"docs":{}},"df":36,"docs":{"113":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.7320508075688772},"148":{"tf":1.0},"150":{"tf":1.0},"163":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"193":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"200":{"tf":2.449489742783178},"201":{"tf":1.0},"202":{"tf":1.4142135623730951},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"250":{"tf":1.4142135623730951},"28":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"67":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0}}},"df":0,"docs":{}},"y":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"c":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"df":1,"docs":{"45":{"tf":1.0}},"i":{"d":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.7320508075688772},"45":{"tf":1.0}}},"s":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"r":{"df":15,"docs":{"130":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"137":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"160":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.7320508075688772},"316":{"tf":1.7320508075688772},"40":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"d":{"df":4,"docs":{"279":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.0},"44":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"322":{"tf":1.0},"325":{"tf":1.0},"326":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":11,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"255":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"287":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":31,"docs":{"126":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"134":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"144":{"tf":1.0},"152":{"tf":1.4142135623730951},"163":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"287":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"68":{"tf":1.0},"9":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":18,"docs":{"130":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"146":{"tf":1.0},"173":{"tf":1.0},"250":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"27":{"tf":1.0},"277":{"tf":1.0},"287":{"tf":2.0},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"273":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}}}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"310":{"tf":1.0},"7":{"tf":1.0}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":7,"docs":{"19":{"tf":1.0},"240":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0},"33":{"tf":1.0}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"184":{"tf":1.4142135623730951},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"287":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":11,"docs":{"138":{"tf":1.0},"159":{"tf":1.0},"226":{"tf":1.7320508075688772},"24":{"tf":1.0},"250":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.4142135623730951},"277":{"tf":2.0},"30":{"tf":2.449489742783178},"305":{"tf":1.0},"57":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"y":{"_":{"1":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":24,"docs":{"10":{"tf":1.0},"11":{"tf":1.7320508075688772},"12":{"tf":1.0},"13":{"tf":2.449489742783178},"135":{"tf":1.4142135623730951},"139":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":2.0},"16":{"tf":2.6457513110645907},"17":{"tf":2.0},"18":{"tf":1.4142135623730951},"19":{"tf":3.1622776601683795},"2":{"tf":1.0},"20":{"tf":1.7320508075688772},"219":{"tf":2.23606797749979},"235":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":2.0},"46":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"64":{"tf":1.0},"66":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":3,"docs":{"146":{"tf":1.0},"204":{"tf":1.0},"249":{"tf":1.0}}}},"o":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":3,"docs":{"181":{"tf":1.4142135623730951},"200":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"255":{"tf":1.0},"317":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"13":{"tf":1.0}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"296":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":10,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"15":{"tf":1.0},"211":{"tf":1.0},"215":{"tf":1.0},"232":{"tf":1.0},"275":{"tf":1.0},"3":{"tf":1.0},"39":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"250":{"tf":1.0},"288":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":10,"docs":{"191":{"tf":1.0},"203":{"tf":1.0},"249":{"tf":1.0},"266":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"31":{"tf":1.0},"325":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}}}}},"v":{"df":1,"docs":{"26":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":28,"docs":{"0":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"136":{"tf":1.0},"14":{"tf":2.449489742783178},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"21":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.0},"22":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"315":{"tf":1.4142135623730951},"40":{"tf":1.0},"56":{"tf":2.0},"57":{"tf":1.0},"58":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}}}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":11,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.4142135623730951},"16":{"tf":1.0},"178":{"tf":1.0},"191":{"tf":1.0},"20":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"321":{"tf":1.0},"64":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":2,"docs":{"255":{"tf":1.0},"281":{"tf":1.0}}}}}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"127":{"tf":2.8284271247461903},"69":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"g":{"/":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},":":{":":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":9,"docs":{"123":{"tf":1.0},"14":{"tf":1.0},"159":{"tf":1.0},"181":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"2":{"tf":1.0},"268":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":10,"docs":{"211":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"25":{"tf":1.0},"275":{"tf":1.4142135623730951},"28":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}}}}},"df":0,"docs":{}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"292":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":4,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"283":{"tf":1.0},"302":{"tf":1.0}}}}}},"m":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"272":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":4,"docs":{"212":{"tf":1.0},"213":{"tf":1.4142135623730951},"215":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":1,"docs":{"281":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"171":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0}}}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}},"i":{"d":{"df":3,"docs":{"117":{"tf":1.0},"292":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":1,"docs":{"182":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"308":{"tf":1.0}}}}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"279":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"275":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}},"c":{"df":6,"docs":{"211":{"tf":2.0},"222":{"tf":1.0},"4":{"tf":1.0},"64":{"tf":2.0},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"113":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"211":{"tf":1.0},"220":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"289":{"tf":2.0},"301":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.4142135623730951},"4":{"tf":1.0},"49":{"tf":1.0},"64":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":10,"docs":{"13":{"tf":1.0},"18":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":2.0},"272":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.0}}}}}}}}},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"=":{"2":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"g":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"'":{"df":0,"docs":{},"t":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"25":{"tf":1.0},"271":{"tf":1.0},"8":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":5,"docs":{"14":{"tf":1.0},"20":{"tf":1.0},"212":{"tf":1.0},"25":{"tf":1.0},"296":{"tf":1.0}}},"g":{".":{"df":0,"docs":{},"f":{"df":2,"docs":{"130":{"tf":1.0},"275":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"240":{"tf":1.4142135623730951},"271":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":5,"docs":{"217":{"tf":1.0},"24":{"tf":1.7320508075688772},"6":{"tf":2.0},"64":{"tf":1.0},"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"16":{"tf":1.0},"250":{"tf":1.0}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"273":{"tf":1.0}}}}},"p":{"df":1,"docs":{"200":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"204":{"tf":1.0},"312":{"tf":1.0},"328":{"tf":1.0},"40":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"y":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":4,"docs":{"1":{"tf":1.4142135623730951},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":26,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"152":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"244":{"tf":1.4142135623730951},"246":{"tf":1.0},"249":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.7320508075688772},"253":{"tf":1.0},"255":{"tf":1.0},"275":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"40":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}},"a":{"c":{"df":0,"docs":{},"h":{"df":11,"docs":{"132":{"tf":1.0},"191":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"27":{"tf":1.0},"43":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"181":{"tf":1.0},"250":{"tf":1.0}}}}}}},"s":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":2,"docs":{"13":{"tf":1.4142135623730951},"143":{"tf":1.0}}}}},"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"96":{"tf":1.0}}},"df":0,"docs":{}}},"df":3,"docs":{"68":{"tf":1.4142135623730951},"94":{"tf":1.7320508075688772},"97":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"101":{"tf":1.0}}}},"df":3,"docs":{"102":{"tf":1.0},"68":{"tf":1.4142135623730951},"99":{"tf":1.7320508075688772}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"104":{"tf":1.7320508075688772},"106":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":3,"docs":{"68":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"71":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"72":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":1,"docs":{"84":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"320":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"322":{"tf":1.4142135623730951},"63":{"tf":1.7320508075688772}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":2.0}}}}}},"u":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}},"df":4,"docs":{"323":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"314":{"tf":1.0},"52":{"tf":1.4142135623730951},"84":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"271":{"tf":1.7320508075688772},"284":{"tf":1.0}}},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"163":{"tf":1.0},"292":{"tf":1.0},"68":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"166":{"tf":1.0},"192":{"tf":1.4142135623730951},"203":{"tf":1.4142135623730951},"207":{"tf":1.4142135623730951},"243":{"tf":1.0},"269":{"tf":1.0},"296":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":7,"docs":{"104":{"tf":1.0},"105":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.4142135623730951},"89":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}}},"b":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"0":{"tf":1.0},"16":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":16,"docs":{"143":{"tf":1.7320508075688772},"144":{"tf":1.0},"146":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":1.7320508075688772},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"41":{"tf":2.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.0}},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":9,"docs":{"269":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"302":{"tf":1.0},"308":{"tf":1.7320508075688772},"313":{"tf":1.0},"38":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"187":{"tf":1.0}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"130":{"tf":1.0},"136":{"tf":1.0},"146":{"tf":1.0},"19":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"52":{"tf":1.0},"57":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":5,"docs":{"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"177":{"tf":1.0},"237":{"tf":1.0}}}}},"o":{"d":{"df":14,"docs":{"131":{"tf":1.7320508075688772},"163":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":2.23606797749979},"294":{"tf":1.0},"304":{"tf":1.0},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":2.23606797749979}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"df":1,"docs":{"141":{"tf":1.7320508075688772}}}}}},"df":2,"docs":{"104":{"tf":1.0},"141":{"tf":1.0}}}}}}},"d":{"_":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"45":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":11,"docs":{"160":{"tf":1.0},"266":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"43":{"tf":2.6457513110645907},"44":{"tf":1.0},"48":{"tf":1.0},"8":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":2.0}}}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":9,"docs":{"233":{"tf":1.0},"241":{"tf":1.0},"316":{"tf":1.0},"322":{"tf":1.7320508075688772},"324":{"tf":1.7320508075688772},"325":{"tf":1.4142135623730951},"327":{"tf":1.0},"328":{"tf":1.0},"330":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":15,"docs":{"219":{"tf":1.0},"227":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"289":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"60":{"tf":1.0},"65":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"r":{"df":2,"docs":{"39":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"42":{"tf":1.0},"43":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":9,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"133":{"tf":3.1622776601683795},"135":{"tf":1.0},"170":{"tf":1.0},"187":{"tf":1.0},"194":{"tf":2.23606797749979},"240":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"133":{"tf":1.7320508075688772}}}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"133":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"16":{"tf":1.0},"26":{"tf":1.0},"321":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"46":{"tf":1.0}}}}}}},"o":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":13,"docs":{"131":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"173":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":1.0},"183":{"tf":2.0},"191":{"tf":1.0},"201":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"191":{"tf":1.4142135623730951},"2":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"c":{"1":{"1":{"5":{"5":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"2":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"\"":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"0":{"df":0,"docs":{},"x":{"1":{"0":{"0":{"df":1,"docs":{"279":{"tf":1.0}}},"1":{"df":1,"docs":{"279":{"tf":1.0}}},"3":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"df":37,"docs":{"10":{"tf":1.4142135623730951},"14":{"tf":1.0},"140":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"163":{"tf":1.0},"171":{"tf":1.4142135623730951},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.4142135623730951},"269":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.4142135623730951},"287":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":2.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.4142135623730951},"300":{"tf":1.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":1.0},"313":{"tf":2.0},"316":{"tf":1.0},"48":{"tf":1.0},"9":{"tf":1.0}}}}}},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"124":{"tf":1.7320508075688772},"126":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"146":{"tf":1.0},"210":{"tf":1.0},"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"c":{"df":7,"docs":{"146":{"tf":1.0},"195":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"h":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"44":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":10,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"250":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":2.0},"43":{"tf":1.0},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.7320508075688772},"304":{"tf":1.0}},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"'":{"df":2,"docs":{"16":{"tf":1.0},"69":{"tf":1.0}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":17,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.0},"16":{"tf":1.0},"187":{"tf":1.0},"19":{"tf":1.4142135623730951},"195":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"52":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772},"79":{"tf":1.0},"8":{"tf":1.4142135623730951}}}}},"s":{"c":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"320":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"170":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":10,"docs":{"123":{"tf":1.7320508075688772},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"167":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"178":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":5,"docs":{"241":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0}},"t":{"df":15,"docs":{"118":{"tf":1.0},"140":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"323":{"tf":1.0},"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"52":{"tf":1.0}},"u":{"df":1,"docs":{"173":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"320":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"14":{"tf":1.0},"26":{"tf":1.0}}}}}}},"m":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"(":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":16,"docs":{"0":{"tf":1.7320508075688772},"135":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":2.0},"16":{"tf":1.0},"2":{"tf":1.7320508075688772},"200":{"tf":1.0},"220":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":1.0},"280":{"tf":1.0},"3":{"tf":1.7320508075688772},"57":{"tf":1.0},"68":{"tf":1.0}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"197":{"tf":1.0},"271":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"60":{"tf":1.0},"8":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":122,"docs":{"10":{"tf":1.0},"103":{"tf":1.4142135623730951},"107":{"tf":1.4142135623730951},"112":{"tf":1.4142135623730951},"115":{"tf":1.0},"124":{"tf":2.0},"127":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"137":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":2.449489742783178},"143":{"tf":1.4142135623730951},"147":{"tf":1.4142135623730951},"148":{"tf":1.0},"152":{"tf":1.0},"154":{"tf":1.4142135623730951},"155":{"tf":1.0},"156":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.4142135623730951},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"17":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":1.4142135623730951},"191":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.4142135623730951},"195":{"tf":1.4142135623730951},"196":{"tf":1.0},"197":{"tf":1.0},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.0},"223":{"tf":1.4142135623730951},"226":{"tf":1.0},"230":{"tf":2.23606797749979},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.0},"243":{"tf":2.449489742783178},"249":{"tf":1.0},"255":{"tf":1.7320508075688772},"258":{"tf":2.23606797749979},"26":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":1.7320508075688772},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"275":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979},"280":{"tf":2.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":2.0},"299":{"tf":1.4142135623730951},"30":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":2.23606797749979},"312":{"tf":3.7416573867739413},"317":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"33":{"tf":1.0},"35":{"tf":1.0},"47":{"tf":1.7320508075688772},"48":{"tf":1.0},"53":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"73":{"tf":1.4142135623730951},"78":{"tf":1.4142135623730951},"83":{"tf":1.4142135623730951},"88":{"tf":1.4142135623730951},"93":{"tf":1.4142135623730951},"98":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"130":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}},"c":{"df":0,"docs":{},"e":{"df":5,"docs":{"201":{"tf":1.0},"207":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"41":{"tf":1.0}},"e":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"268":{"tf":1.0}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":17,"docs":{"0":{"tf":1.4142135623730951},"135":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.4142135623730951},"16":{"tf":1.0},"165":{"tf":1.0},"167":{"tf":1.0},"170":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"233":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":2.23606797749979},"268":{"tf":1.0},"288":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":14,"docs":{"13":{"tf":1.0},"130":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"140":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.0},"309":{"tf":1.0}}}},"t":{"df":1,"docs":{"244":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.0},"21":{"tf":1.0},"215":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.0},"281":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"33":{"tf":1.4142135623730951},"40":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"1":{"tf":1.0},"17":{"tf":1.0},"20":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.4142135623730951},"321":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"45":{"tf":1.0}}}},"l":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"n":{"df":2,"docs":{"211":{"tf":1.0},"326":{"tf":1.0}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"313":{"tf":1.4142135623730951}}}}}}}}},"df":7,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"164":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"321":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"10":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"164":{"tf":1.0},"268":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"90":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":3,"docs":{"182":{"tf":1.0},"308":{"tf":1.0},"89":{"tf":1.0}}}}}}},"s":{"df":7,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"23":{"tf":1.0},"42":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":46,"docs":{"1":{"tf":1.4142135623730951},"113":{"tf":2.8284271247461903},"123":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":2.0},"162":{"tf":4.69041575982343},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"165":{"tf":1.7320508075688772},"166":{"tf":1.4142135623730951},"167":{"tf":2.6457513110645907},"170":{"tf":1.4142135623730951},"171":{"tf":2.8284271247461903},"172":{"tf":3.4641016151377544},"173":{"tf":3.3166247903554},"174":{"tf":4.242640687119285},"175":{"tf":3.605551275463989},"176":{"tf":2.0},"177":{"tf":2.6457513110645907},"178":{"tf":3.0},"179":{"tf":2.449489742783178},"180":{"tf":2.23606797749979},"181":{"tf":2.23606797749979},"182":{"tf":4.898979485566356},"183":{"tf":3.605551275463989},"184":{"tf":2.23606797749979},"185":{"tf":2.23606797749979},"191":{"tf":1.7320508075688772},"193":{"tf":1.0},"204":{"tf":1.4142135623730951},"243":{"tf":1.0},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"269":{"tf":1.0},"272":{"tf":1.4142135623730951},"288":{"tf":1.0},"289":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"312":{"tf":1.0},"316":{"tf":1.0},"320":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":5,"docs":{"135":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":2.0},"50":{"tf":1.0},"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":21,"docs":{"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"144":{"tf":1.4142135623730951},"193":{"tf":1.0},"243":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.0},"32":{"tf":1.0},"327":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"7":{"tf":1.0}}}}},"r":{"a":{"df":2,"docs":{"146":{"tf":1.0},"227":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{},"x":{"df":1,"docs":{"296":{"tf":1.4142135623730951}}}},"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"222":{"tf":1.4142135623730951},"223":{"tf":1.4142135623730951},"266":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"9":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"310":{"tf":1.4142135623730951}}}}},"r":{"df":1,"docs":{"322":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"266":{"tf":1.0}}}},"l":{"df":0,"docs":{},"s":{"df":21,"docs":{"106":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"160":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"167":{"tf":1.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"174":{"tf":1.7320508075688772},"175":{"tf":1.4142135623730951},"184":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":1.0},"262":{"tf":1.0}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"2":{"tf":1.0}}}},"df":1,"docs":{"191":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"304":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":1,"docs":{"330":{"tf":1.0}}},"r":{"df":1,"docs":{"240":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"217":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"266":{"tf":1.0},"284":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"df":9,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"127":{"tf":1.4142135623730951},"133":{"tf":1.0},"185":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0}},"e":{"'":{"df":2,"docs":{"132":{"tf":1.0},"2":{"tf":1.0}}},".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":3,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0}}}}}}},"_":{"a":{"df":0,"docs":{},"m":{"d":{"6":{"4":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"24":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":38,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"246":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951},"252":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"259":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"268":{"tf":1.4142135623730951},"27":{"tf":1.0},"271":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"283":{"tf":1.4142135623730951},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"57":{"tf":1.7320508075688772}}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}}},"df":107,"docs":{"0":{"tf":2.23606797749979},"1":{"tf":2.449489742783178},"10":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"117":{"tf":1.0},"119":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":2.23606797749979},"140":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"146":{"tf":1.4142135623730951},"152":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"187":{"tf":1.0},"19":{"tf":1.0},"2":{"tf":2.23606797749979},"20":{"tf":1.7320508075688772},"208":{"tf":1.0},"21":{"tf":2.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":2.8284271247461903},"215":{"tf":1.4142135623730951},"216":{"tf":1.4142135623730951},"217":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"222":{"tf":2.23606797749979},"23":{"tf":2.23606797749979},"232":{"tf":1.0},"233":{"tf":1.4142135623730951},"24":{"tf":2.23606797749979},"240":{"tf":2.0},"243":{"tf":2.6457513110645907},"25":{"tf":2.8284271247461903},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"26":{"tf":3.1622776601683795},"266":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":2.0},"279":{"tf":1.4142135623730951},"28":{"tf":2.0},"281":{"tf":1.7320508075688772},"285":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.7320508075688772},"290":{"tf":1.7320508075688772},"292":{"tf":1.0},"294":{"tf":1.4142135623730951},"297":{"tf":1.4142135623730951},"3":{"tf":2.0},"30":{"tf":1.0},"301":{"tf":1.4142135623730951},"302":{"tf":1.4142135623730951},"306":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.0},"310":{"tf":1.4142135623730951},"314":{"tf":2.0},"315":{"tf":1.0},"318":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"36":{"tf":1.7320508075688772},"37":{"tf":1.0},"38":{"tf":2.23606797749979},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":1.4142135623730951},"5":{"tf":1.0},"50":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772},"52":{"tf":3.0},"53":{"tf":2.23606797749979},"54":{"tf":1.4142135623730951},"55":{"tf":1.7320508075688772},"56":{"tf":1.0},"57":{"tf":1.4142135623730951},"6":{"tf":2.6457513110645907},"63":{"tf":1.0},"64":{"tf":1.4142135623730951},"66":{"tf":1.0},"67":{"tf":1.4142135623730951},"68":{"tf":1.7320508075688772},"7":{"tf":1.4142135623730951},"8":{"tf":2.0},"9":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"266":{"tf":1.0}}}},"d":{"b":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"252":{"tf":1.0}},"l":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"2":{"tf":1.0}}}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}},"w":{"df":3,"docs":{"275":{"tf":1.4142135623730951},"45":{"tf":1.0},"66":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":17,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.0},"170":{"tf":1.7320508075688772},"174":{"tf":2.8284271247461903},"191":{"tf":3.1622776601683795},"193":{"tf":1.7320508075688772},"231":{"tf":1.0},"240":{"tf":1.7320508075688772},"247":{"tf":1.0},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"258":{"tf":1.0},"268":{"tf":2.8284271247461903},"309":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":21,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"140":{"tf":1.0},"219":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"25":{"tf":1.4142135623730951},"266":{"tf":3.0},"275":{"tf":2.23606797749979},"276":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.7320508075688772},"287":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.0},"309":{"tf":1.0},"32":{"tf":1.4142135623730951},"38":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":2.8284271247461903}},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"222":{"tf":2.0},"277":{"tf":1.0}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":8,"docs":{"108":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"178":{"tf":1.0},"216":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0}}},"n":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":11,"docs":{"13":{"tf":1.0},"203":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"26":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":2,"docs":{"10":{"tf":1.0},"255":{"tf":1.0}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"10":{"tf":1.0},"40":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":27,"docs":{"10":{"tf":1.4142135623730951},"108":{"tf":1.0},"12":{"tf":1.0},"120":{"tf":1.4142135623730951},"13":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.4142135623730951},"191":{"tf":1.0},"206":{"tf":1.0},"210":{"tf":1.0},"232":{"tf":1.0},"283":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"5":{"tf":1.4142135623730951},"68":{"tf":1.0},"7":{"tf":2.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"t":{"df":4,"docs":{"240":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"171":{"tf":1.0}}}},"x":{"df":27,"docs":{"131":{"tf":1.0},"192":{"tf":1.0},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.7320508075688772},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"263":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"276":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"284":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":2.0},"289":{"tf":1.0},"293":{"tf":2.23606797749979},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"74":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"306":{"tf":1.0},"310":{"tf":1.0}}}}}}},"l":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"108":{"tf":1.0},"219":{"tf":1.0},"309":{"tf":1.7320508075688772},"40":{"tf":1.0},"9":{"tf":1.0}}},"w":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"n":{"df":105,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":2.23606797749979},"133":{"tf":1.4142135623730951},"135":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.1622776601683795},"143":{"tf":1.4142135623730951},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":2.0},"164":{"tf":2.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.4142135623730951},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":2.0},"197":{"tf":1.0},"2":{"tf":1.0},"201":{"tf":1.0},"207":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":2.6457513110645907},"231":{"tf":2.0},"233":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":3.605551275463989},"241":{"tf":1.4142135623730951},"243":{"tf":3.7416573867739413},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":2.449489742783178},"258":{"tf":3.1622776601683795},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":2.0},"269":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"275":{"tf":2.23606797749979},"279":{"tf":1.7320508075688772},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"296":{"tf":2.0},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.872983346207417},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":2.6457513110645907},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"152":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":1,"docs":{"321":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"12":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":58,"docs":{"115":{"tf":1.0},"120":{"tf":1.0},"130":{"tf":1.4142135623730951},"134":{"tf":1.0},"14":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.4142135623730951},"163":{"tf":1.0},"164":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"196":{"tf":1.0},"201":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":1.4142135623730951},"23":{"tf":1.0},"230":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.7320508075688772},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"288":{"tf":1.4142135623730951},"29":{"tf":1.0},"292":{"tf":2.0},"293":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.4142135623730951},"315":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"325":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"57":{"tf":1.4142135623730951},"59":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}},"w":{"df":1,"docs":{"231":{"tf":1.0}}}}},"o":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{")":{")":{".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"146":{"tf":1.4142135623730951},"258":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"146":{"tf":1.7320508075688772}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{"2":{"df":1,"docs":{"250":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"146":{"tf":1.7320508075688772},"244":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"146":{"tf":1.0}}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"246":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}},"g":{"(":{"4":{"2":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"(":{"a":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.0}}}}},"df":0,"docs":{}},"2":{"(":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"189":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":1,"docs":{"233":{"tf":1.0}}}},":":{":":{"d":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"241":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"241":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"{":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"=":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"0":{"df":1,"docs":{"305":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":55,"docs":{"130":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.7320508075688772},"180":{"tf":1.4142135623730951},"189":{"tf":1.7320508075688772},"192":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"204":{"tf":1.0},"207":{"tf":1.4142135623730951},"222":{"tf":2.0},"223":{"tf":1.0},"230":{"tf":1.7320508075688772},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":2.6457513110645907},"244":{"tf":1.0},"250":{"tf":2.23606797749979},"255":{"tf":1.0},"258":{"tf":3.3166247903554},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"280":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"293":{"tf":2.0},"304":{"tf":1.4142135623730951},"305":{"tf":1.7320508075688772},"308":{"tf":2.449489742783178},"312":{"tf":3.7416573867739413},"313":{"tf":1.4142135623730951}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"r":{"b":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"k":{"df":3,"docs":{"211":{"tf":1.0},"216":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951}}},"m":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"294":{"tf":1.0},"30":{"tf":1.0}}}},"df":9,"docs":{"104":{"tf":1.0},"120":{"tf":1.0},"123":{"tf":1.0},"127":{"tf":1.4142135623730951},"164":{"tf":1.0},"18":{"tf":1.0},"181":{"tf":1.0},"300":{"tf":1.0},"41":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":9,"docs":{"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"235":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":3,"docs":{"127":{"tf":1.0},"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"197":{"tf":1.4142135623730951}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"302":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":3,"docs":{"14":{"tf":1.0},"206":{"tf":1.0},"320":{"tf":1.0}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"142":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"17":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"313":{"tf":1.0}}}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":5,"docs":{"266":{"tf":1.0},"284":{"tf":1.0},"297":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"197":{"tf":1.0},"308":{"tf":1.0},"57":{"tf":1.4142135623730951}},"i":{"df":1,"docs":{"292":{"tf":1.0}}}}},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"'":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":89,"docs":{"10":{"tf":1.4142135623730951},"101":{"tf":1.4142135623730951},"108":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"130":{"tf":2.0},"131":{"tf":1.4142135623730951},"132":{"tf":2.449489742783178},"133":{"tf":1.0},"135":{"tf":1.7320508075688772},"137":{"tf":1.0},"138":{"tf":3.3166247903554},"139":{"tf":2.23606797749979},"141":{"tf":5.830951894845301},"142":{"tf":1.0},"143":{"tf":3.3166247903554},"144":{"tf":2.6457513110645907},"145":{"tf":1.7320508075688772},"146":{"tf":2.23606797749979},"147":{"tf":1.0},"148":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":2.23606797749979},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.0},"173":{"tf":2.23606797749979},"18":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"199":{"tf":1.7320508075688772},"205":{"tf":2.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"240":{"tf":3.7416573867739413},"241":{"tf":1.4142135623730951},"243":{"tf":2.449489742783178},"249":{"tf":1.4142135623730951},"250":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"255":{"tf":2.449489742783178},"258":{"tf":2.23606797749979},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":2.23606797749979},"273":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":2.23606797749979},"279":{"tf":3.0},"281":{"tf":1.0},"283":{"tf":1.7320508075688772},"284":{"tf":1.0},"287":{"tf":1.4142135623730951},"288":{"tf":1.7320508075688772},"302":{"tf":1.0},"304":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"309":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":2.0},"40":{"tf":2.0},"42":{"tf":1.0},"44":{"tf":2.23606797749979},"45":{"tf":1.4142135623730951},"68":{"tf":1.0},"69":{"tf":1.0},"72":{"tf":1.4142135623730951},"74":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"79":{"tf":1.0},"82":{"tf":1.4142135623730951},"84":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"89":{"tf":1.0},"9":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951}},"p":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"141":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"132":{"tf":1.0},"141":{"tf":1.4142135623730951}}}}}}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}}}},"d":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"69":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"10":{"tf":1.0},"23":{"tf":1.0},"45":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"191":{"tf":1.0},"64":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":11,"docs":{"10":{"tf":1.0},"119":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"258":{"tf":1.4142135623730951},"266":{"tf":1.0},"27":{"tf":1.0},"277":{"tf":1.0},"312":{"tf":1.0},"315":{"tf":1.0}}}}}}},"g":{"1":{"df":1,"docs":{"105":{"tf":1.0}}},"2":{"df":1,"docs":{"105":{"tf":1.0}}},"a":{"df":5,"docs":{"13":{"tf":1.0},"19":{"tf":1.7320508075688772},"200":{"tf":1.4142135623730951},"279":{"tf":1.7320508075688772},"44":{"tf":1.0}},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"df":1,"docs":{"296":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":20,"docs":{"0":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":2.0},"246":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"262":{"tf":1.4142135623730951},"275":{"tf":1.0},"276":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.0},"296":{"tf":1.0},"310":{"tf":1.0},"60":{"tf":2.23606797749979},"61":{"tf":1.4142135623730951},"74":{"tf":1.0}},"i":{"c":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"173":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"_":{"4":{"2":{"df":2,"docs":{"273":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.7320508075688772},"19":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":3,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0}}}}}}},"df":1,"docs":{"10":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"178":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"3":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"217":{"tf":1.0},"22":{"tf":1.0},"64":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"i":{"b":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}},"t":{"df":2,"docs":{"216":{"tf":1.4142135623730951},"26":{"tf":1.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":10,"docs":{"160":{"tf":1.0},"210":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"26":{"tf":1.4142135623730951},"4":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.7320508075688772},"64":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.4142135623730951},"18":{"tf":1.0},"219":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0},"321":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":17,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"158":{"tf":1.0},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"18":{"tf":1.0},"189":{"tf":1.0},"203":{"tf":1.4142135623730951},"206":{"tf":1.0},"207":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"302":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":6,"docs":{"258":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.7320508075688772},"264":{"tf":1.4142135623730951},"273":{"tf":1.0},"312":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":3,"docs":{"27":{"tf":1.0},"52":{"tf":1.0},"64":{"tf":1.0}},"o":{"d":{"df":4,"docs":{"19":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"22":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"a":{"b":{"df":1,"docs":{"16":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"250":{"tf":1.0},"277":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"171":{"tf":1.0},"183":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":3,"docs":{"115":{"tf":1.0},"140":{"tf":1.0},"28":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"1":{"tf":1.0},"288":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"8":{"tf":2.449489742783178},"9":{"tf":1.0}},"e":{":":{"1":{"0":{":":{"1":{"4":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"i":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"12":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":12,"docs":{"10":{"tf":1.4142135623730951},"12":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.0},"2":{"tf":1.0},"240":{"tf":1.0},"296":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.4142135623730951}}}}}},"df":4,"docs":{"10":{"tf":1.0},"17":{"tf":1.4142135623730951},"296":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":15,"docs":{"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":2.0},"211":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"325":{"tf":1.7320508075688772},"330":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"296":{"tf":1.0},"31":{"tf":1.0},"64":{"tf":1.4142135623730951}},"l":{"df":6,"docs":{"13":{"tf":1.0},"250":{"tf":1.0},"266":{"tf":1.0},"299":{"tf":1.0},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"269":{"tf":1.0}}},"df":5,"docs":{"22":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"9":{"tf":1.0}}}},"i":{"df":1,"docs":{"211":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"320":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0},"329":{"tf":1.0}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"249":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":1,"docs":{"322":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":14,"docs":{"108":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.4142135623730951},"230":{"tf":1.0},"312":{"tf":1.0},"70":{"tf":1.4142135623730951},"73":{"tf":1.0},"74":{"tf":1.4142135623730951},"75":{"tf":1.0},"76":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"85":{"tf":1.0}},"e":{"d":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"130":{"tf":1.0},"250":{"tf":1.4142135623730951},"44":{"tf":1.0}},"n":{"'":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.4142135623730951}}}}}}}},"df":5,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"25":{"tf":1.0}},"e":{"a":{"d":{"df":3,"docs":{"14":{"tf":1.4142135623730951},"169":{"tf":1.0},"30":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":3,"docs":{"124":{"tf":1.0},"181":{"tf":1.0},"33":{"tf":1.4142135623730951}}}},"p":{"df":12,"docs":{"212":{"tf":1.0},"213":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":2.0},"255":{"tf":1.0},"281":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"52":{"tf":1.0}}}},"n":{"c":{"df":1,"docs":{"281":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":3,"docs":{"16":{"tf":1.0},"2":{"tf":1.0},"20":{"tf":1.0}}},"df":13,"docs":{"141":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.4142135623730951},"182":{"tf":1.0},"183":{"tf":1.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.0},"237":{"tf":1.0},"35":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"8":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"191":{"tf":1.0},"193":{"tf":1.0}}}}}}}}},"x":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"1":{".":{".":{"6":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"/":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"/":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":2,"docs":{"304":{"tf":1.0},"8":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":5,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":2.23606797749979}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"135":{"tf":1.0},"42":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"200":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.0}}},"df":5,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.0},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":6,"docs":{"174":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.449489742783178},"45":{"tf":1.7320508075688772}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.7320508075688772}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"10":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"191":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"187":{"tf":1.0},"197":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"a":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"24":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"133":{"tf":1.0}}}},"t":{"_":{"d":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"268":{"tf":2.0},"312":{"tf":2.8284271247461903}},"e":{"(":{"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}},"v":{"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{":":{"/":{"/":{"0":{".":{"0":{".":{"0":{".":{"0":{":":{"8":{"0":{"0":{"0":{"df":1,"docs":{"65":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0}},"s":{":":{"/":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"v":{"0":{".":{"8":{".":{"1":{"1":{"/":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{"df":1,"docs":{"271":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"219":{"tf":1.0}}}}}},"df":0,"docs":{}}},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"301":{"tf":1.0}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"2":{"8":{"4":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"w":{"df":0,"docs":{},"w":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"n":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"159":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"i":{".":{"df":6,"docs":{"143":{"tf":1.0},"204":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.0},"90":{"tf":1.4142135623730951}}},"1":{"2":{"8":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"a":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"279":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"df":0,"docs":{},"~":{"1":{"df":1,"docs":{"185":{"tf":1.0}}},"df":0,"docs":{}}},"[":{"1":{"df":1,"docs":{"276":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"174":{"tf":1.0},"185":{"tf":1.4142135623730951},"190":{"tf":1.0},"243":{"tf":3.1622776601683795},"255":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":8,"docs":{"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"250":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.4142135623730951},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"309":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"8":{"[":{"1":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":8,"docs":{"130":{"tf":1.0},"132":{"tf":1.4142135623730951},"190":{"tf":1.0},"244":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.0},"296":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"c":{"df":7,"docs":{"231":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"250":{"tf":1.0},"264":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"276":{"tf":1.0},"293":{"tf":1.7320508075688772}}},"d":{"df":2,"docs":{"277":{"tf":1.0},"310":{"tf":1.0}},"e":{"a":{"df":2,"docs":{"20":{"tf":1.0},"212":{"tf":1.4142135623730951}},"l":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"158":{"tf":1.0},"16":{"tf":1.0},"281":{"tf":1.0},"320":{"tf":1.4142135623730951},"68":{"tf":1.4142135623730951},"84":{"tf":1.7320508075688772},"86":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":23,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"118":{"tf":1.0},"120":{"tf":2.449489742783178},"131":{"tf":1.4142135623730951},"132":{"tf":1.4142135623730951},"133":{"tf":1.7320508075688772},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"166":{"tf":1.0},"170":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.0},"308":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"120":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"87":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"x":{"df":2,"docs":{"118":{"tf":1.0},"258":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"165":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"284":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"313":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"240":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":3,"docs":{"123":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"10":{"tf":1.0},"153":{"tf":1.0},"240":{"tf":1.4142135623730951},"40":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"330":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":32,"docs":{"1":{"tf":1.0},"132":{"tf":2.6457513110645907},"141":{"tf":1.0},"158":{"tf":1.0},"160":{"tf":1.0},"171":{"tf":1.0},"226":{"tf":1.0},"233":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.7320508075688772},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"285":{"tf":1.0},"287":{"tf":1.4142135623730951},"297":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.4142135623730951},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"69":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"a":{"1":{"df":1,"docs":{"308":{"tf":1.0}}},"2":{"df":1,"docs":{"308":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"132":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"283":{"tf":1.0},"308":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":16,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.7320508075688772},"312":{"tf":1.7320508075688772},"32":{"tf":2.23606797749979},"42":{"tf":1.0},"43":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"288":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"v":{"df":12,"docs":{"211":{"tf":1.7320508075688772},"217":{"tf":1.0},"220":{"tf":1.4142135623730951},"224":{"tf":1.4142135623730951},"227":{"tf":1.4142135623730951},"228":{"tf":1.4142135623730951},"235":{"tf":1.4142135623730951},"249":{"tf":1.0},"289":{"tf":1.7320508075688772},"294":{"tf":1.0},"301":{"tf":1.4142135623730951},"317":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"n":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"280":{"tf":1.0}}},"y":{"[":{"0":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}}}}}}},"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"321":{"tf":1.0},"322":{"tf":1.0},"326":{"tf":1.4142135623730951},"328":{"tf":1.0},"329":{"tf":1.0}}}}}}}}}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"324":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"u":{"d":{"df":24,"docs":{"143":{"tf":1.0},"146":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"196":{"tf":1.0},"212":{"tf":1.0},"223":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"258":{"tf":1.4142135623730951},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"309":{"tf":1.0},"321":{"tf":1.4142135623730951},"323":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0},"79":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":2,"docs":{"320":{"tf":1.0},"52":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"41":{"tf":2.0}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"244":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"233":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":3,"docs":{"191":{"tf":1.0},"200":{"tf":1.4142135623730951},"206":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"306":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"df":8,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"175":{"tf":1.0},"177":{"tf":2.23606797749979},"240":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"41":{"tf":1.0},"48":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"177":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":4,"docs":{"106":{"tf":1.0},"108":{"tf":1.0},"15":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"u":{"df":6,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"312":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"138":{"tf":1.0},"296":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"250":{"tf":1.7320508075688772}}}}},"x":{"df":1,"docs":{"182":{"tf":1.0}}}},"o":{"df":4,"docs":{"135":{"tf":1.0},"144":{"tf":1.4142135623730951},"158":{"tf":1.0},"29":{"tf":1.0}},"r":{"df":0,"docs":{},"m":{"df":12,"docs":{"146":{"tf":2.23606797749979},"148":{"tf":1.0},"15":{"tf":1.0},"151":{"tf":1.0},"16":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"249":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"321":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"266":{"tf":1.0},"275":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"266":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":6,"docs":{"130":{"tf":1.7320508075688772},"233":{"tf":1.4142135623730951},"241":{"tf":1.0},"243":{"tf":1.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"t":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"244":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}},"df":1,"docs":{"312":{"tf":1.0}},"i":{"df":11,"docs":{"135":{"tf":1.0},"139":{"tf":1.0},"174":{"tf":2.8284271247461903},"175":{"tf":1.7320508075688772},"192":{"tf":1.0},"193":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":2.23606797749979},"45":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"159":{"tf":1.0},"279":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":1,"docs":{"243":{"tf":1.4142135623730951}},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"df":1,"docs":{"243":{"tf":1.4142135623730951}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"168":{"tf":1.0},"169":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":7,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"77":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"85":{"tf":1.0},"87":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":10,"docs":{"141":{"tf":1.0},"146":{"tf":1.0},"266":{"tf":1.4142135623730951},"272":{"tf":1.0},"275":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"308":{"tf":1.0},"74":{"tf":1.0},"84":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":2.0},"152":{"tf":1.4142135623730951},"203":{"tf":1.0},"207":{"tf":1.0},"258":{"tf":1.0},"28":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"t":{"a":{"df":1,"docs":{"302":{"tf":1.0}},"l":{"df":13,"docs":{"14":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":2.449489742783178},"23":{"tf":2.0},"24":{"tf":1.7320508075688772},"25":{"tf":1.0},"26":{"tf":2.449489742783178},"27":{"tf":1.7320508075688772},"38":{"tf":2.23606797749979},"57":{"tf":2.0},"6":{"tf":2.23606797749979},"60":{"tf":1.0},"7":{"tf":1.0}}},"n":{"c":{"df":14,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"146":{"tf":1.7320508075688772},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"193":{"tf":1.0},"230":{"tf":1.0},"241":{"tf":1.0},"258":{"tf":1.4142135623730951},"276":{"tf":1.0},"305":{"tf":1.0},"316":{"tf":1.4142135623730951},"324":{"tf":1.0},"40":{"tf":1.4142135623730951}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":4,"docs":{"312":{"tf":1.4142135623730951},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":17,"docs":{"18":{"tf":1.0},"19":{"tf":1.0},"204":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"265":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"284":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"315":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"244":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"269":{"tf":1.0}},"e":{"df":0,"docs":{},"g":{"df":16,"docs":{"124":{"tf":2.0},"127":{"tf":2.0},"181":{"tf":1.0},"182":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.4142135623730951},"192":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.0},"292":{"tf":1.4142135623730951},"296":{"tf":1.0},"308":{"tf":2.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":1.0},"173":{"tf":1.4142135623730951},"181":{"tf":1.0},"192":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"187":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"271":{"tf":1.0},"280":{"tf":1.0},"293":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"14":{"tf":1.0},"143":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"320":{"tf":1.0},"327":{"tf":1.7320508075688772},"328":{"tf":1.7320508075688772},"329":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"130":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"8":{"tf":1.0},"9":{"tf":1.0}}}}},"f":{"a":{"c":{"df":5,"docs":{"130":{"tf":1.0},"132":{"tf":1.0},"135":{"tf":1.0},"189":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"277":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":17,"docs":{"130":{"tf":1.0},"138":{"tf":1.0},"191":{"tf":1.0},"266":{"tf":2.0},"273":{"tf":1.4142135623730951},"277":{"tf":1.4142135623730951},"281":{"tf":1.4142135623730951},"285":{"tf":1.4142135623730951},"288":{"tf":1.0},"290":{"tf":1.4142135623730951},"294":{"tf":1.7320508075688772},"297":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.4142135623730951},"314":{"tf":1.4142135623730951},"318":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":3,"docs":{"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":5,"docs":{"10":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951},"247":{"tf":1.0}},"t":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"13":{"tf":1.4142135623730951},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"293":{"tf":1.0},"305":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"171":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.4142135623730951}}},"t":{"df":2,"docs":{"185":{"tf":1.0},"287":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}},"o":{"c":{"df":1,"docs":{"309":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":5,"docs":{"135":{"tf":1.0},"16":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"40":{"tf":1.0}}},"l":{"df":0,"docs":{},"v":{"df":4,"docs":{"22":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"4":{"tf":1.0}}}}}}},"p":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"57":{"tf":1.0}}},"s":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":2.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"160":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"u":{"df":15,"docs":{"160":{"tf":1.0},"210":{"tf":2.23606797749979},"212":{"tf":1.7320508075688772},"213":{"tf":1.0},"215":{"tf":2.6457513110645907},"230":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"276":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"322":{"tf":1.0},"64":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"'":{"df":5,"docs":{"219":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.4142135623730951},"277":{"tf":1.0}}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"c":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.7320508075688772},"191":{"tf":1.0}}},"1":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}},"2":{"df":1,"docs":{"174":{"tf":1.0}}},"<":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"300":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":45,"docs":{"113":{"tf":1.0},"115":{"tf":2.0},"129":{"tf":1.7320508075688772},"130":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"132":{"tf":1.0},"133":{"tf":1.4142135623730951},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"161":{"tf":1.0},"175":{"tf":1.0},"187":{"tf":1.0},"189":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.4142135623730951},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":1.0},"37":{"tf":1.4142135623730951}}},"r":{"df":2,"docs":{"169":{"tf":1.0},"316":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":5,"docs":{"212":{"tf":1.0},"215":{"tf":1.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"305":{"tf":1.0}}}}}}}},"j":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}},"v":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"14":{"tf":1.0},"219":{"tf":1.0},"240":{"tf":1.0},"308":{"tf":1.0},"316":{"tf":1.0},"8":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.4142135623730951}}}}}}},"df":1,"docs":{"105":{"tf":1.0}},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"e":{"c":{"c":{"a":{"df":0,"docs":{},"k":{"2":{"5":{"6":{"(":{"<":{"b":{"a":{"df":0,"docs":{},"z":{"df":1,"docs":{"204":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"a":{"b":{"df":0,"docs":{},"i":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"v":{"df":1,"docs":{"312":{"tf":1.0}}}},"df":1,"docs":{"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":4,"docs":{"15":{"tf":1.0},"206":{"tf":1.0},"40":{"tf":1.7320508075688772},"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"207":{"tf":1.0}}}},"y":{"df":13,"docs":{"141":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"177":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"40":{"tf":2.0},"41":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":2.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":21,"docs":{"113":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":2.0},"118":{"tf":2.0},"119":{"tf":2.449489742783178},"120":{"tf":1.0},"131":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"240":{"tf":1.4142135623730951},"250":{"tf":1.0},"287":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"9":{"tf":1.0}}},"df":0,"docs":{}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"315":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"321":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"130":{"tf":1.0},"40":{"tf":1.0}},"n":{"df":6,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"191":{"tf":1.0},"292":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0}}}}}},"w":{"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"118":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"118":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"x":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":2,"docs":{"115":{"tf":1.0},"118":{"tf":1.0}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}}},"n":{"df":1,"docs":{"118":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"118":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"118":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"119":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"118":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"119":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"119":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"119":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"118":{"tf":1.0}}}}}}},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":6,"docs":{"141":{"tf":3.4641016151377544},"173":{"tf":1.4142135623730951},"255":{"tf":3.4641016151377544},"265":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0}}}}},"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"330":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"301":{"tf":1.0}}},"df":0,"docs":{},"g":{".":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":4,"docs":{"301":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"/":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":17,"docs":{"0":{"tf":2.0},"1":{"tf":1.4142135623730951},"113":{"tf":1.4142135623730951},"135":{"tf":1.0},"14":{"tf":1.0},"187":{"tf":1.0},"212":{"tf":1.4142135623730951},"215":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"27":{"tf":1.4142135623730951},"273":{"tf":1.0},"3":{"tf":1.7320508075688772},"321":{"tf":1.0},"326":{"tf":1.0},"41":{"tf":1.0},"67":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"43":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"41":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"64":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":11,"docs":{"113":{"tf":1.0},"193":{"tf":1.0},"200":{"tf":1.7320508075688772},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"289":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":11,"docs":{"244":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"320":{"tf":1.0},"322":{"tf":1.4142135623730951},"324":{"tf":1.4142135623730951},"325":{"tf":1.0},"326":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"13":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"321":{"tf":1.0},"36":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}}}},"v":{"df":4,"docs":{"164":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"255":{"tf":1.0},"280":{"tf":1.7320508075688772},"292":{"tf":1.0},"296":{"tf":1.0}}}},"n":{"df":1,"docs":{"230":{"tf":1.0}},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":9,"docs":{"191":{"tf":1.0},"193":{"tf":1.7320508075688772},"243":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.0},"40":{"tf":1.7320508075688772},"74":{"tf":1.0},"8":{"tf":1.0},"90":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"s":{"df":4,"docs":{"183":{"tf":1.4142135623730951},"201":{"tf":1.0},"3":{"tf":1.0},"312":{"tf":1.0}}}},"t":{"'":{"df":6,"docs":{"280":{"tf":1.0},"45":{"tf":1.0},"5":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.7320508075688772}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"120":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":12,"docs":{"0":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"3":{"tf":1.0},"320":{"tf":1.0}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"115":{"tf":1.4142135623730951},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0}}}},"i":{"c":{"df":13,"docs":{"113":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"26":{"tf":1.4142135623730951},"57":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":4,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":57,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"132":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"271":{"tf":1.0},"273":{"tf":1.0},"275":{"tf":1.0},"31":{"tf":1.4142135623730951},"314":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":2.0},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.4142135623730951},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"308":{"tf":1.0}}}},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}}}}},"k":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.4142135623730951},"187":{"tf":1.0},"268":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"128":{"tf":1.0}}}}},"df":0,"docs":{}},"df":6,"docs":{"122":{"tf":1.0},"126":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"293":{"tf":1.0},"302":{"tf":1.0}}},"k":{"df":12,"docs":{"19":{"tf":1.0},"228":{"tf":1.0},"24":{"tf":1.0},"28":{"tf":1.0},"49":{"tf":2.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"64":{"tf":1.0}}},"u":{"df":0,"docs":{},"x":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"df":4,"docs":{"22":{"tf":1.0},"23":{"tf":1.0},"243":{"tf":1.4142135623730951},"26":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":18,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"144":{"tf":1.4142135623730951},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":3.1622776601683795},"187":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"216":{"tf":1.0},"269":{"tf":1.0},"299":{"tf":1.0},"30":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"175":{"tf":1.4142135623730951}}},"n":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"175":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"181":{"tf":1.0}}}}}}}}}}},"df":20,"docs":{"113":{"tf":1.0},"123":{"tf":2.0},"124":{"tf":1.4142135623730951},"125":{"tf":1.4142135623730951},"126":{"tf":2.0},"127":{"tf":2.8284271247461903},"172":{"tf":1.0},"181":{"tf":2.23606797749979},"192":{"tf":1.0},"197":{"tf":1.0},"223":{"tf":1.0},"233":{"tf":1.0},"287":{"tf":1.4142135623730951},"296":{"tf":2.0},"299":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":2.0}}}},"t":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":8,"docs":{"13":{"tf":1.7320508075688772},"15":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.7320508075688772},"51":{"tf":1.4142135623730951}}}}},"o":{"a":{"d":{"df":5,"docs":{"159":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.0},"280":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"255":{"tf":1.0}}}},"c":{"a":{"df":0,"docs":{},"l":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"260":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"13":{"tf":1.4142135623730951},"15":{"tf":2.449489742783178},"16":{"tf":1.0},"179":{"tf":1.0},"18":{"tf":1.4142135623730951},"180":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"211":{"tf":1.0},"219":{"tf":1.7320508075688772},"260":{"tf":1.4142135623730951},"261":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"65":{"tf":1.7320508075688772}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{"8":{"5":{"4":{"5":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":12,"docs":{"10":{"tf":1.0},"130":{"tf":1.0},"144":{"tf":1.0},"178":{"tf":1.0},"200":{"tf":1.0},"203":{"tf":1.4142135623730951},"204":{"tf":1.4142135623730951},"207":{"tf":1.0},"233":{"tf":1.0},"25":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":13,"docs":{"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"215":{"tf":1.0},"222":{"tf":2.449489742783178},"281":{"tf":1.0},"284":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0}},"i":{"c":{"df":8,"docs":{"162":{"tf":1.4142135623730951},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"182":{"tf":1.0},"184":{"tf":1.4142135623730951},"41":{"tf":2.0}}},"df":0,"docs":{}},"s":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"313":{"tf":1.0}}},"g":{"df":2,"docs":{"141":{"tf":1.0},"288":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":5,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"255":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"k":{"df":7,"docs":{"143":{"tf":1.4142135623730951},"17":{"tf":1.0},"2":{"tf":1.0},"40":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":2,"docs":{"19":{"tf":1.0},"42":{"tf":1.0}}}}},"p":{"df":5,"docs":{"166":{"tf":1.4142135623730951},"167":{"tf":2.449489742783178},"168":{"tf":2.449489742783178},"169":{"tf":2.449489742783178},"316":{"tf":1.0}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"243":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"315":{"tf":1.4142135623730951}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"w":{"df":3,"docs":{"258":{"tf":1.0},"271":{"tf":1.0},"273":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"247":{"tf":1.4142135623730951},"269":{"tf":1.0},"284":{"tf":1.0},"302":{"tf":1.0},"40":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"206":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"p":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}},"m":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":3,"docs":{"90":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0}}}}}}},"a":{"c":{"df":3,"docs":{"23":{"tf":1.0},"230":{"tf":1.7320508075688772},"318":{"tf":1.4142135623730951}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"0":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}}},"o":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"119":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":6,"docs":{"163":{"tf":1.0},"216":{"tf":1.4142135623730951},"243":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"323":{"tf":1.0}}},"n":{".":{"df":0,"docs":{},"f":{"df":4,"docs":{"130":{"tf":1.4142135623730951},"226":{"tf":1.0},"243":{"tf":1.0},"275":{"tf":1.0}}},"s":{"a":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":4,"docs":{"211":{"tf":1.0},"266":{"tf":1.0},"31":{"tf":1.7320508075688772},"41":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"51":{"tf":1.4142135623730951}}}}}}},"k":{"df":0,"docs":{},"e":{"df":30,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"119":{"tf":1.0},"13":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"153":{"tf":1.0},"16":{"tf":1.7320508075688772},"19":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"266":{"tf":1.0},"288":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"320":{"tf":1.0},"40":{"tf":1.7320508075688772},"42":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"60":{"tf":1.4142135623730951},"61":{"tf":1.4142135623730951},"62":{"tf":1.4142135623730951},"65":{"tf":1.0},"66":{"tf":1.4142135623730951}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"14":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"266":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":7,"docs":{"19":{"tf":1.0},"212":{"tf":1.0},"258":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"49":{"tf":1.0},"79":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"226":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"240":{"tf":1.0},"60":{"tf":1.0},"63":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"<":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":17,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"16":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.7320508075688772},"2":{"tf":1.0},"204":{"tf":1.7320508075688772},"240":{"tf":1.0},"255":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"48":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":1,"docs":{"196":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"196":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":13,"docs":{"113":{"tf":1.4142135623730951},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"177":{"tf":1.7320508075688772},"187":{"tf":1.0},"196":{"tf":2.0},"204":{"tf":2.0},"256":{"tf":1.0},"296":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"240":{"tf":1.7320508075688772},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":14,"docs":{"118":{"tf":1.0},"133":{"tf":1.4142135623730951},"136":{"tf":1.0},"141":{"tf":1.0},"157":{"tf":1.0},"170":{"tf":2.6457513110645907},"191":{"tf":1.0},"219":{"tf":1.4142135623730951},"240":{"tf":2.6457513110645907},"255":{"tf":1.0},"275":{"tf":1.0},"293":{"tf":1.0},"33":{"tf":1.0},"45":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"13":{"tf":1.0},"272":{"tf":1.0}}}}}},"x":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"240":{"tf":1.0}}}}}}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"m":{"df":3,"docs":{"1":{"tf":1.0},"143":{"tf":1.0},"3":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":5,"docs":{"190":{"tf":1.4142135623730951},"197":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"8":{"tf":1.0}}}}}}}},"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"211":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":7,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"90":{"tf":1.4142135623730951},"92":{"tf":1.0},"93":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.0},"146":{"tf":1.0},"183":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"233":{"tf":1.0},"269":{"tf":1.0},"280":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"191":{"tf":1.0}}}}},"t":{"df":1,"docs":{"136":{"tf":1.0}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"249":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"24":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":1,"docs":{"250":{"tf":1.0}}},"j":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":16,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.4142135623730951},"141":{"tf":1.0},"187":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":2.8284271247461903},"207":{"tf":2.449489742783178},"230":{"tf":1.0},"250":{"tf":1.4142135623730951},"256":{"tf":1.0},"280":{"tf":1.4142135623730951},"316":{"tf":1.7320508075688772}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":17,"docs":{"105":{"tf":1.0},"107":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.0},"75":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"80":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.4142135623730951},"88":{"tf":1.0},"90":{"tf":2.449489742783178},"91":{"tf":1.0},"92":{"tf":2.0}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"227":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"u":{"8":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":4,"docs":{"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":3,"docs":{"107":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"230":{"tf":2.23606797749979},"88":{"tf":1.0},"93":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":2.23606797749979}}}}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"215":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"133":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":2,"docs":{"212":{"tf":1.0},"216":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":29,"docs":{"10":{"tf":2.0},"108":{"tf":1.0},"109":{"tf":1.0},"135":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"2":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"304":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"69":{"tf":1.0},"7":{"tf":1.0},"70":{"tf":1.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":2,"docs":{"249":{"tf":1.0},"30":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":19,"docs":{"10":{"tf":1.7320508075688772},"135":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"48":{"tf":1.0},"9":{"tf":2.449489742783178}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"132":{"tf":2.449489742783178},"237":{"tf":2.23606797749979}},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"2":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"190":{"tf":1.4142135623730951},"280":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"238":{"tf":1.0}}}},"u":{"df":2,"docs":{"185":{"tf":1.0},"250":{"tf":1.0}},"t":{"df":1,"docs":{"66":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"264":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":4,"docs":{"231":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"t":{"a":{"df":0,"docs":{},"k":{"df":2,"docs":{"13":{"tf":1.0},"321":{"tf":1.0}}}},"df":0,"docs":{}}},"x":{"df":2,"docs":{"109":{"tf":1.0},"312":{"tf":1.0}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":2.0}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":4,"docs":{"68":{"tf":1.4142135623730951},"89":{"tf":1.7320508075688772},"91":{"tf":1.0},"92":{"tf":1.0}}}}}},"df":1,"docs":{"275":{"tf":1.0}},"e":{"df":1,"docs":{"31":{"tf":2.0}},"r":{"df":1,"docs":{"322":{"tf":1.0}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":17,"docs":{"108":{"tf":1.0},"110":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.7320508075688772},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"193":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"265":{"tf":1.0},"268":{"tf":1.0},"275":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"89":{"tf":1.0}}}},"df":16,"docs":{"130":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"141":{"tf":1.0},"180":{"tf":1.0},"193":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0},"258":{"tf":1.0},"265":{"tf":2.0},"266":{"tf":2.449489742783178},"275":{"tf":2.0},"279":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.4142135623730951}},"e":{"'":{"df":1,"docs":{"266":{"tf":1.0}}},".":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"312":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"d":{":":{":":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"266":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}},"u":{"df":1,"docs":{"90":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"315":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":33,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"13":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"158":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.7320508075688772},"206":{"tf":1.0},"21":{"tf":1.0},"232":{"tf":1.0},"255":{"tf":1.0},"27":{"tf":1.0},"279":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"304":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"35":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.0},"68":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":3,"docs":{"139":{"tf":1.0},"266":{"tf":1.0},"275":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":6,"docs":{"161":{"tf":1.0},"217":{"tf":1.0},"277":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"42":{"tf":1.0}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"a":{"'":{"df":1,"docs":{"330":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"258":{"tf":1.4142135623730951},"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"292":{"tf":1.0},"308":{"tf":1.0}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":3,"docs":{"312":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":3,"docs":{"141":{"tf":1.4142135623730951},"146":{"tf":1.0},"312":{"tf":1.0}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"(":{"0":{"df":0,"docs":{},"x":{"2":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"c":{"df":0,"docs":{},"h":{"df":3,"docs":{"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"l":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}},"p":{"df":0,"docs":{},"l":{"df":10,"docs":{"104":{"tf":1.0},"135":{"tf":1.0},"182":{"tf":1.0},"219":{"tf":1.0},"244":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"42":{"tf":1.0}},"i":{"df":2,"docs":{"100":{"tf":1.0},"99":{"tf":1.0}}},"y":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"144":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":10,"docs":{"145":{"tf":2.23606797749979},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"153":{"tf":1.7320508075688772},"161":{"tf":1.0},"162":{"tf":1.0},"240":{"tf":2.449489742783178},"40":{"tf":2.0}},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"145":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}}},"df":26,"docs":{"107":{"tf":1.4142135623730951},"118":{"tf":1.0},"131":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":2.23606797749979},"150":{"tf":1.0},"153":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"177":{"tf":1.0},"230":{"tf":3.0},"240":{"tf":3.1622776601683795},"249":{"tf":1.4142135623730951},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"48":{"tf":1.7320508075688772},"88":{"tf":1.0},"93":{"tf":1.0}}}},"v":{"df":1,"docs":{"6":{"tf":1.0}}},"y":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"1":{"df":1,"docs":{"312":{"tf":1.0}}},"2":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"205":{"tf":1.0}}}},"df":0,"docs":{}}},"df":6,"docs":{"243":{"tf":1.7320508075688772},"262":{"tf":1.4142135623730951},"276":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"304":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"8":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"d":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}},":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"180":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":3,"docs":{"258":{"tf":1.0},"283":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"226":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"250":{"tf":1.0}}},"x":{"df":1,"docs":{"250":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"233":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"296":{"tf":1.4142135623730951},"304":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"0":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"u":{"2":{"5":{"6":{"df":1,"docs":{"130":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"250":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{":":{":":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}},"e":{"(":{"1":{"df":1,"docs":{"170":{"tf":1.0}}},"a":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"313":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":3,"docs":{"222":{"tf":1.4142135623730951},"299":{"tf":1.0},"313":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":3,"docs":{"240":{"tf":1.0},"265":{"tf":1.0},"299":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"/":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"=":{"\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":37,"docs":{"113":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.4142135623730951},"134":{"tf":1.0},"141":{"tf":2.449489742783178},"145":{"tf":1.0},"148":{"tf":1.0},"159":{"tf":1.0},"172":{"tf":1.4142135623730951},"173":{"tf":1.7320508075688772},"179":{"tf":2.23606797749979},"180":{"tf":1.0},"189":{"tf":1.0},"191":{"tf":1.4142135623730951},"193":{"tf":1.0},"194":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"24":{"tf":1.7320508075688772},"240":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"258":{"tf":1.7320508075688772},"268":{"tf":1.0},"281":{"tf":2.23606797749979},"283":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"30":{"tf":1.0},"309":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.4142135623730951},"46":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"179":{"tf":1.0}}}}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}},"v":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"1":{"tf":1.0},"16":{"tf":1.0},"326":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}}}}},"df":7,"docs":{"115":{"tf":1.4142135623730951},"124":{"tf":1.0},"126":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":4,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":32,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"212":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"249":{"tf":1.0},"26":{"tf":1.7320508075688772},"268":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.7320508075688772},"28":{"tf":1.4142135623730951},"280":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":2.6457513110645907},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"6":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"64":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}},"g":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"185":{"tf":1.4142135623730951},"247":{"tf":1.0},"280":{"tf":1.7320508075688772}}}},"df":1,"docs":{"244":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"141":{"tf":1.0},"160":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"204":{"tf":1.0},"243":{"tf":1.4142135623730951},"244":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":2.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":7,"docs":{"13":{"tf":2.0},"15":{"tf":2.449489742783178},"16":{"tf":1.0},"19":{"tf":3.3166247903554},"20":{"tf":1.0},"235":{"tf":1.0},"46":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0}}}}},"w":{"(":{"_":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}}}}},"df":28,"docs":{"1":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"189":{"tf":1.4142135623730951},"19":{"tf":1.0},"193":{"tf":1.0},"211":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"243":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"268":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"29":{"tf":1.4142135623730951},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.0},"63":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"45":{"tf":1.0}},"n":{"df":2,"docs":{"122":{"tf":1.4142135623730951},"124":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"t":{"df":8,"docs":{"0":{"tf":1.0},"10":{"tf":1.0},"14":{"tf":1.0},"174":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"41":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"288":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"146":{"tf":1.0},"68":{"tf":1.4142135623730951}}}}},"o":{"d":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":8,"docs":{"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":2.23606797749979},"266":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"131":{"tf":1.0},"133":{"tf":1.0}}}}},"n":{"c":{"df":1,"docs":{"204":{"tf":2.449489742783178}}},"df":12,"docs":{"136":{"tf":1.0},"232":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"284":{"tf":1.0},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}},"p":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"t":{"df":4,"docs":{"113":{"tf":1.0},"114":{"tf":1.7320508075688772},"115":{"tf":1.7320508075688772},"182":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":117,"docs":{"10":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"19":{"tf":1.0},"197":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"217":{"tf":1.7320508075688772},"218":{"tf":1.0},"219":{"tf":1.0},"22":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.4142135623730951},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.4142135623730951},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.0},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.0},"239":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.4142135623730951},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.4142135623730951},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"278":{"tf":1.0},"279":{"tf":1.7320508075688772},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.4142135623730951},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"312":{"tf":1.7320508075688772},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.0},"42":{"tf":1.0},"60":{"tf":2.6457513110645907},"7":{"tf":1.0}}},"h":{"df":2,"docs":{"13":{"tf":1.0},"17":{"tf":1.0}}},"i":{"c":{"df":5,"docs":{"18":{"tf":1.0},"279":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"df":50,"docs":{"17":{"tf":1.0},"19":{"tf":1.4142135623730951},"20":{"tf":1.0},"219":{"tf":1.0},"223":{"tf":1.0},"227":{"tf":1.0},"230":{"tf":1.4142135623730951},"231":{"tf":1.0},"233":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":1.7320508075688772},"249":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"258":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"266":{"tf":2.23606797749979},"268":{"tf":1.7320508075688772},"271":{"tf":1.0},"275":{"tf":1.4142135623730951},"276":{"tf":1.0},"277":{"tf":1.4142135623730951},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":2.23606797749979},"288":{"tf":1.7320508075688772},"292":{"tf":1.7320508075688772},"293":{"tf":1.4142135623730951},"296":{"tf":2.449489742783178},"297":{"tf":1.0},"299":{"tf":1.4142135623730951},"302":{"tf":1.7320508075688772},"305":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":2.6457513110645907},"310":{"tf":1.0},"312":{"tf":1.7320508075688772},"315":{"tf":1.0},"316":{"tf":1.4142135623730951},"35":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":24,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"124":{"tf":1.7320508075688772},"134":{"tf":1.0},"139":{"tf":1.0},"143":{"tf":1.0},"151":{"tf":1.7320508075688772},"16":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"181":{"tf":1.0},"191":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"233":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"309":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"61":{"tf":1.0},"70":{"tf":1.0},"90":{"tf":1.0}}}}},"df":1,"docs":{"249":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"185":{"tf":1.0},"187":{"tf":1.0},"190":{"tf":1.7320508075688772},"191":{"tf":1.0},"196":{"tf":1.0},"237":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"299":{"tf":1.0},"305":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.7320508075688772},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":10,"docs":{"141":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":2.6457513110645907},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"243":{"tf":1.0},"283":{"tf":1.0},"40":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":1,"docs":{"324":{"tf":1.0}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":4,"docs":{"143":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"127":{"tf":1.4142135623730951}},"|":{"_":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"127":{"tf":1.4142135623730951}}}}}}}},"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"127":{"tf":1.4142135623730951},"309":{"tf":1.0}}}},"df":0,"docs":{}}},"df":1,"docs":{"55":{"tf":1.0}},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}},"i":{"c":{"df":0,"docs":{},"i":{"df":2,"docs":{"323":{"tf":1.7320508075688772},"49":{"tf":1.0}}}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"323":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"292":{"tf":1.0},"304":{"tf":1.0}}}}}}},"k":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"240":{"tf":1.4142135623730951}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"141":{"tf":1.0},"173":{"tf":1.0},"255":{"tf":1.0}}}}},"n":{"c":{"df":6,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.0},"273":{"tf":1.0},"34":{"tf":1.0},"57":{"tf":1.0}},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"219":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":25,"docs":{"0":{"tf":1.0},"115":{"tf":1.0},"120":{"tf":1.0},"127":{"tf":2.0},"13":{"tf":1.0},"158":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"181":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"233":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"3":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"315":{"tf":1.0},"36":{"tf":1.0},"42":{"tf":1.0},"64":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"323":{"tf":1.0},"64":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"223":{"tf":1.0},"9":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":19,"docs":{"15":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"224":{"tf":1.0},"27":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"45":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"47":{"tf":1.0},"48":{"tf":1.0}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"279":{"tf":1.0}}}}}}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"174":{"tf":2.449489742783178},"175":{"tf":1.7320508075688772},"184":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0}}},"df":0,"docs":{}}},"df":29,"docs":{"105":{"tf":1.0},"113":{"tf":2.0},"146":{"tf":1.0},"153":{"tf":1.0},"162":{"tf":1.4142135623730951},"172":{"tf":2.0},"182":{"tf":2.449489742783178},"183":{"tf":2.0},"184":{"tf":2.449489742783178},"185":{"tf":2.6457513110645907},"187":{"tf":1.0},"192":{"tf":1.0},"200":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"287":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.4142135623730951},"52":{"tf":1.0},"69":{"tf":1.0},"89":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"212":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":5,"docs":{"249":{"tf":1.0},"292":{"tf":1.4142135623730951},"309":{"tf":2.0},"51":{"tf":1.0},"68":{"tf":1.0}},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"=":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"292":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"n":{"df":7,"docs":{"115":{"tf":1.0},"136":{"tf":1.0},"141":{"tf":1.4142135623730951},"171":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.7320508075688772},"25":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"141":{"tf":1.0},"153":{"tf":1.0},"173":{"tf":1.0},"25":{"tf":1.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"43":{"tf":1.0},"57":{"tf":1.0}}}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"21":{"tf":1.0},"28":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"320":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":7,"docs":{"215":{"tf":1.0},"240":{"tf":2.23606797749979},"275":{"tf":1.0},"287":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"68":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"233":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.0}}},"x":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"275":{"tf":1.0}}}},"df":3,"docs":{"255":{"tf":1.0},"321":{"tf":1.0},"53":{"tf":1.4142135623730951}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"268":{"tf":1.0},"287":{"tf":1.0},"324":{"tf":1.0},"42":{"tf":1.0}}}}}}}}},"u":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{}}},"df":11,"docs":{"141":{"tf":1.0},"19":{"tf":1.0},"212":{"tf":1.4142135623730951},"219":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"271":{"tf":1.0},"277":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.4142135623730951}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"a":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"45":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"16":{"tf":1.0},"19":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":15,"docs":{"12":{"tf":1.0},"141":{"tf":1.0},"18":{"tf":1.0},"219":{"tf":1.0},"25":{"tf":1.0},"277":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"31":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"45":{"tf":1.0},"8":{"tf":2.23606797749979},"84":{"tf":1.0},"9":{"tf":2.449489742783178}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"193":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.4142135623730951},"279":{"tf":1.0},"41":{"tf":1.0},"49":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":3,"docs":{"280":{"tf":1.4142135623730951},"308":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}},"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"df":8,"docs":{"166":{"tf":1.4142135623730951},"197":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"292":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.4142135623730951},"316":{"tf":1.0},"43":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"280":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"317":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"119":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":1,"docs":{"280":{"tf":1.0}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"309":{"tf":2.23606797749979},"9":{"tf":2.449489742783178}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}}}}},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"133":{"tf":1.0}}},"n":{"df":2,"docs":{"152":{"tf":1.0},"40":{"tf":1.0}}}}},"p":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"q":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"x":{"df":2,"docs":{"131":{"tf":1.4142135623730951},"240":{"tf":1.4142135623730951}}}},"1":{".":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"p":{"2":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"5":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"275":{"tf":1.0}}},"2":{"5":{"6":{"df":1,"docs":{"52":{"tf":1.4142135623730951}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"3":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"275":{"tf":1.0}}},"x":{"df":1,"docs":{"275":{"tf":1.0}}}},"df":1,"docs":{"275":{"tf":1.0}}},"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"26":{"tf":1.0}}}},"df":0,"docs":{}}},"d":{"df":3,"docs":{"18":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.7320508075688772}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":10,"docs":{"20":{"tf":1.0},"220":{"tf":1.0},"24":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.0}}}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"r":{"(":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},".":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"df":1,"docs":{"243":{"tf":1.0}}},"2":{"df":1,"docs":{"243":{"tf":1.0}}},"3":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":6,"docs":{"104":{"tf":1.0},"106":{"tf":1.0},"146":{"tf":1.0},"243":{"tf":1.7320508075688772},"281":{"tf":1.0},"41":{"tf":1.0}}}},"n":{"df":0,"docs":{},"i":{"c":{"(":{"0":{"df":0,"docs":{},"x":{"3":{"2":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}},"9":{"9":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"2":{"5":{"6":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":10,"docs":{"171":{"tf":1.0},"269":{"tf":1.0},"271":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":2.0},"294":{"tf":1.0},"297":{"tf":1.0},"310":{"tf":1.0},"312":{"tf":1.0}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":25,"docs":{"100":{"tf":1.4142135623730951},"105":{"tf":1.4142135623730951},"108":{"tf":1.0},"109":{"tf":1.4142135623730951},"115":{"tf":1.0},"132":{"tf":1.4142135623730951},"141":{"tf":4.0},"144":{"tf":2.0},"152":{"tf":1.0},"173":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.4142135623730951},"240":{"tf":2.449489742783178},"243":{"tf":1.4142135623730951},"255":{"tf":2.0},"283":{"tf":1.0},"312":{"tf":2.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.4142135623730951},"70":{"tf":2.0},"75":{"tf":1.4142135623730951},"80":{"tf":1.4142135623730951},"85":{"tf":1.4142135623730951},"90":{"tf":1.4142135623730951},"95":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"266":{"tf":1.0},"309":{"tf":1.0}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":5,"docs":{"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"284":{"tf":1.0}}},"t":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}},"s":{"df":3,"docs":{"246":{"tf":1.0},"266":{"tf":2.449489742783178},"279":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"r":{"df":2,"docs":{"284":{"tf":1.0},"304":{"tf":1.0}}}}},"t":{"df":6,"docs":{"130":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"277":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}},"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":3,"docs":{"213":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"281":{"tf":1.0}}},"s":{"df":22,"docs":{"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.7320508075688772},"145":{"tf":1.0},"18":{"tf":1.0},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"243":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"255":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.4142135623730951},"296":{"tf":1.0},"299":{"tf":1.7320508075688772},"302":{"tf":1.0},"308":{"tf":1.4142135623730951},"313":{"tf":1.0},"37":{"tf":1.0},"40":{"tf":2.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"t":{"df":1,"docs":{"19":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"226":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":9,"docs":{"170":{"tf":1.7320508075688772},"180":{"tf":1.7320508075688772},"222":{"tf":1.0},"226":{"tf":1.0},"253":{"tf":1.0},"266":{"tf":1.4142135623730951},"288":{"tf":1.0},"30":{"tf":1.0},"34":{"tf":1.0}},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"180":{"tf":1.0}}}}}}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"133":{"tf":1.0},"170":{"tf":2.449489742783178},"240":{"tf":3.0},"329":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}}}}},"y":{"a":{"b":{"df":0,"docs":{},"l":{"df":4,"docs":{"118":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":3,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"40":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"43":{"tf":1.0},"52":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}},"df":3,"docs":{"131":{"tf":1.0},"240":{"tf":2.0},"27":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":4,"docs":{"40":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"48":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":6,"docs":{"219":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"7":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"df":2,"docs":{"37":{"tf":1.0},"40":{"tf":1.0}},"f":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":16,"docs":{"18":{"tf":1.0},"187":{"tf":1.0},"227":{"tf":1.4142135623730951},"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":1.0},"313":{"tf":1.0},"44":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"o":{"d":{"df":3,"docs":{"327":{"tf":1.0},"328":{"tf":1.4142135623730951},"43":{"tf":1.0}}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"n":{"df":4,"docs":{"137":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"25":{"tf":1.7320508075688772},"321":{"tf":1.0},"6":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":3,"docs":{"271":{"tf":1.0},"277":{"tf":1.4142135623730951},"310":{"tf":1.0}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"321":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"272":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":2,"docs":{"135":{"tf":1.0},"249":{"tf":1.0}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}},"r":{"@":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"324":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}}}}},"df":0,"docs":{}}}}},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":9,"docs":{"136":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.4142135623730951},"162":{"tf":1.0},"200":{"tf":1.4142135623730951},"215":{"tf":1.0},"22":{"tf":1.0},"268":{"tf":1.0},"292":{"tf":1.0}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"n":{"df":2,"docs":{"277":{"tf":1.0},"279":{"tf":1.0}}},"t":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"213":{"tf":1.0},"22":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"=":{"4":{"7":{"1":{"1":{"df":1,"docs":{"292":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"292":{"tf":1.0}}}}}}}}}}}},"y":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"212":{"tf":1.0},"213":{"tf":1.0},"215":{"tf":1.4142135623730951},"216":{"tf":1.7320508075688772},"57":{"tf":1.0}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":2.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"x":{"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"1":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"131":{"tf":1.0},"178":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"275":{"tf":1.0}}}},".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.4142135623730951}}}}}}}}},"1":{"df":1,"docs":{"178":{"tf":1.0}}},"2":{"df":1,"docs":{"178":{"tf":1.0}}},":":{":":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"275":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"131":{"tf":1.4142135623730951},"160":{"tf":1.0},"178":{"tf":2.0},"19":{"tf":1.4142135623730951},"22":{"tf":1.0},"240":{"tf":2.23606797749979},"244":{"tf":1.0},"258":{"tf":2.449489742783178},"275":{"tf":2.8284271247461903},"279":{"tf":1.0},"3":{"tf":1.4142135623730951},"315":{"tf":1.0},"317":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.0},"8":{"tf":1.0},"94":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":6,"docs":{"10":{"tf":1.0},"201":{"tf":1.7320508075688772},"203":{"tf":1.7320508075688772},"204":{"tf":1.0},"207":{"tf":1.7320508075688772},"316":{"tf":1.4142135623730951}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"240":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"131":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"1":{"tf":1.0},"24":{"tf":1.0}}}},"df":1,"docs":{"203":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"258":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"144":{"tf":1.0},"173":{"tf":1.0},"191":{"tf":1.4142135623730951},"321":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":8,"docs":{"139":{"tf":1.0},"143":{"tf":1.0},"187":{"tf":1.0},"233":{"tf":1.0},"240":{"tf":1.0},"277":{"tf":1.0},"308":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"287":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":3,"docs":{"287":{"tf":1.0},"323":{"tf":1.0},"54":{"tf":1.4142135623730951}},"i":{"d":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"a":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"90":{"tf":1.4142135623730951}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":5,"docs":{"113":{"tf":1.0},"136":{"tf":2.0},"157":{"tf":1.0},"158":{"tf":3.0},"296":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"158":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"68":{"tf":1.0}}}}}}},"c":{"df":0,"docs":{},"e":{"d":{"df":2,"docs":{"287":{"tf":1.0},"292":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":48,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"220":{"tf":1.0},"230":{"tf":1.0},"67":{"tf":1.0},"68":{"tf":3.0},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{":":{":":{"b":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"112":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"(":{"df":0,"docs":{},"x":{"1":{"df":1,"docs":{"98":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"103":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"107":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":2,"docs":{"230":{"tf":1.0},"73":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{")":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"88":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"93":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"83":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"78":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"d":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"271":{"tf":1.0},"9":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"141":{"tf":1.0},"145":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.4142135623730951},"60":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":3,"docs":{"138":{"tf":1.0},"240":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{},"t":{"df":2,"docs":{"164":{"tf":1.0},"313":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"285":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"17":{"tf":1.0},"255":{"tf":1.0},"309":{"tf":1.7320508075688772}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.7320508075688772}}}},"o":{"df":0,"docs":{},"u":{"df":12,"docs":{"16":{"tf":1.0},"19":{"tf":1.0},"191":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"63":{"tf":1.0}},"s":{"df":14,"docs":{"219":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.4142135623730951},"241":{"tf":1.4142135623730951},"244":{"tf":1.4142135623730951},"249":{"tf":1.0},"250":{"tf":2.0},"265":{"tf":1.0},"288":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.4142135623730951},"313":{"tf":1.4142135623730951},"316":{"tf":1.4142135623730951}}}}}}}},"i":{"c":{"df":0,"docs":{},"e":{"=":{"1":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"268":{"tf":1.0},"312":{"tf":2.0},"36":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"240":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"123":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"182":{"tf":1.0},"240":{"tf":1.4142135623730951},"241":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"126":{"tf":1.0},"287":{"tf":1.0}},"e":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":5,"docs":{"222":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.7320508075688772},"26":{"tf":1.0},"285":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"141":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}}},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":4,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.7320508075688772},"324":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":15,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.0},"19":{"tf":1.4142135623730951},"241":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":2.0},"321":{"tf":1.4142135623730951},"326":{"tf":1.0},"328":{"tf":1.0},"45":{"tf":2.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"288":{"tf":1.0},"64":{"tf":1.0}}}},"df":3,"docs":{"143":{"tf":1.0},"210":{"tf":1.0},"3":{"tf":1.4142135623730951}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"14":{"tf":1.0},"214":{"tf":1.4142135623730951},"45":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"u":{"c":{"df":8,"docs":{"115":{"tf":1.0},"146":{"tf":1.0},"174":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.7320508075688772},"222":{"tf":1.0},"309":{"tf":2.23606797749979},"8":{"tf":1.0}},"t":{"df":2,"docs":{"115":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"187":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"113":{"tf":1.0},"315":{"tf":1.7320508075688772}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"219":{"tf":1.0}}},"df":25,"docs":{"10":{"tf":1.0},"19":{"tf":1.0},"21":{"tf":1.4142135623730951},"210":{"tf":1.4142135623730951},"211":{"tf":1.0},"213":{"tf":1.4142135623730951},"216":{"tf":1.0},"219":{"tf":1.0},"222":{"tf":1.4142135623730951},"226":{"tf":1.4142135623730951},"243":{"tf":1.4142135623730951},"25":{"tf":1.7320508075688772},"28":{"tf":2.0},"29":{"tf":2.6457513110645907},"30":{"tf":2.6457513110645907},"31":{"tf":2.8284271247461903},"317":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":2.23606797749979},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"324":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"e":{"df":2,"docs":{"14":{"tf":1.0},"312":{"tf":1.0}}}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"280":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"25":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":7,"docs":{"241":{"tf":1.0},"247":{"tf":1.4142135623730951},"250":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"288":{"tf":1.0},"305":{"tf":1.7320508075688772},"309":{"tf":2.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"40":{"tf":1.0},"43":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"27":{"tf":1.0}}}}},"df":0,"docs":{}}},"v":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"d":{"df":17,"docs":{"108":{"tf":1.0},"132":{"tf":1.0},"141":{"tf":1.0},"16":{"tf":1.0},"166":{"tf":1.0},"173":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"301":{"tf":1.0},"304":{"tf":1.7320508075688772},"326":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"b":{"df":89,"docs":{"10":{"tf":2.0},"101":{"tf":1.0},"111":{"tf":1.0},"115":{"tf":1.0},"118":{"tf":1.0},"130":{"tf":3.0},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"144":{"tf":1.0},"145":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.4142135623730951},"160":{"tf":1.0},"161":{"tf":1.0},"163":{"tf":1.4142135623730951},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.7320508075688772},"179":{"tf":1.0},"180":{"tf":1.0},"189":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"196":{"tf":2.0},"2":{"tf":1.0},"222":{"tf":1.7320508075688772},"230":{"tf":1.7320508075688772},"231":{"tf":2.23606797749979},"234":{"tf":1.0},"240":{"tf":3.0},"241":{"tf":1.0},"243":{"tf":5.291502622129181},"244":{"tf":1.4142135623730951},"250":{"tf":2.449489742783178},"255":{"tf":1.4142135623730951},"258":{"tf":3.4641016151377544},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.7320508075688772},"268":{"tf":2.449489742783178},"272":{"tf":1.0},"275":{"tf":2.449489742783178},"279":{"tf":1.4142135623730951},"280":{"tf":2.449489742783178},"283":{"tf":1.7320508075688772},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.4142135623730951},"304":{"tf":3.4641016151377544},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":3.605551275463989},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":2.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.7320508075688772},"48":{"tf":3.4641016151377544},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"9":{"tf":1.7320508075688772},"92":{"tf":1.0},"96":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"c":{":":{"df":0,"docs":{},"i":{"3":{"2":{"df":1,"docs":{"265":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":21,"docs":{"13":{"tf":1.4142135623730951},"130":{"tf":1.4142135623730951},"138":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"20":{"tf":1.0},"231":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"281":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"328":{"tf":1.4142135623730951},"329":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"321":{"tf":1.0}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.23606797749979}}}},"r":{"df":0,"docs":{},"e":{"df":5,"docs":{"119":{"tf":1.0},"143":{"tf":1.0},"146":{"tf":1.4142135623730951},"240":{"tf":1.0},"241":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":4,"docs":{"140":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"62":{"tf":2.0},"63":{"tf":1.0}}}},"t":{"df":3,"docs":{"212":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.4142135623730951}}}},"x":{"df":1,"docs":{"131":{"tf":1.0}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"1":{"tf":1.0},"152":{"tf":1.0},"2":{"tf":1.0},"243":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0}}}}}}}},"q":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":1,"docs":{"240":{"tf":1.0}},"u":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"130":{"tf":1.0},"193":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"143":{"tf":1.0},"18":{"tf":1.4142135623730951},"266":{"tf":1.0},"287":{"tf":1.0},"44":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"297":{"tf":1.0},"330":{"tf":1.0}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"13":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":19,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"228":{"tf":1.0},"301":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.7320508075688772},"6":{"tf":1.7320508075688772},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"124":{"tf":1.7320508075688772},"287":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"126":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"r":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":4,"docs":{"211":{"tf":1.0},"216":{"tf":1.0},"313":{"tf":1.0},"90":{"tf":1.4142135623730951}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"df":1,"docs":{"222":{"tf":1.0}},"g":{"df":6,"docs":{"115":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"313":{"tf":1.0},"70":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"276":{"tf":1.0},"79":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"w":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"271":{"tf":1.0},"279":{"tf":1.0}}}},"df":9,"docs":{"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"230":{"tf":1.0},"26":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"d":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"196":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"l":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"249":{"tf":1.0},"3":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":25,"docs":{"10":{"tf":1.7320508075688772},"136":{"tf":1.0},"138":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.4142135623730951},"142":{"tf":1.0},"144":{"tf":1.4142135623730951},"145":{"tf":1.0},"146":{"tf":3.3166247903554},"15":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"155":{"tf":1.4142135623730951},"177":{"tf":1.4142135623730951},"18":{"tf":2.0},"21":{"tf":1.0},"217":{"tf":1.0},"232":{"tf":1.0},"240":{"tf":1.4142135623730951},"258":{"tf":1.0},"308":{"tf":1.0},"4":{"tf":1.0},"40":{"tf":1.7320508075688772},"56":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"u":{"1":{"2":{"8":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"2":{"5":{"6":{"df":1,"docs":{"230":{"tf":2.23606797749979}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":1,"docs":{"230":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":2,"docs":{"230":{"tf":1.4142135623730951},"93":{"tf":1.0}}}},"i":{"df":5,"docs":{"13":{"tf":1.0},"212":{"tf":1.0},"38":{"tf":1.0},"45":{"tf":1.0},"6":{"tf":1.0}}},"m":{"df":1,"docs":{"317":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"13":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"36":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"143":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":6,"docs":{"119":{"tf":1.0},"191":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"321":{"tf":1.0},"322":{"tf":1.0}}}}}},"b":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"216":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"143":{"tf":1.0}}}},"v":{"df":7,"docs":{"148":{"tf":1.0},"258":{"tf":1.7320508075688772},"33":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":3,"docs":{"141":{"tf":1.0},"255":{"tf":1.7320508075688772},"279":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"212":{"tf":1.0},"268":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}}}}},"r":{"d":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"69":{"tf":1.0},"70":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"193":{"tf":2.23606797749979}},"e":{"(":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":1,"docs":{"64":{"tf":1.0}}}}}}}},"df":3,"docs":{"266":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"222":{"tf":1.0},"27":{"tf":1.0},"297":{"tf":1.0},"306":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":17,"docs":{"10":{"tf":1.0},"123":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"145":{"tf":1.4142135623730951},"187":{"tf":1.0},"201":{"tf":1.0},"205":{"tf":1.0},"207":{"tf":1.4142135623730951},"21":{"tf":1.0},"237":{"tf":1.0},"287":{"tf":1.0},"316":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"317":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"320":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"227":{"tf":1.0},"256":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"231":{"tf":1.0},"247":{"tf":1.4142135623730951},"269":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"313":{"tf":1.0}}}},"df":0,"docs":{}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":11,"docs":{"136":{"tf":1.0},"158":{"tf":1.0},"231":{"tf":1.7320508075688772},"241":{"tf":2.23606797749979},"250":{"tf":2.0},"284":{"tf":1.0},"288":{"tf":1.4142135623730951},"305":{"tf":2.0},"309":{"tf":2.23606797749979},"316":{"tf":1.7320508075688772},"322":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":2,"docs":{"203":{"tf":1.0},"207":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"s":{"df":113,"docs":{"193":{"tf":1.0},"217":{"tf":1.7320508075688772},"218":{"tf":1.0},"219":{"tf":1.0},"220":{"tf":1.0},"221":{"tf":1.0},"222":{"tf":1.0},"223":{"tf":1.0},"224":{"tf":1.0},"225":{"tf":1.0},"226":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"229":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.0},"232":{"tf":1.4142135623730951},"233":{"tf":1.0},"234":{"tf":1.0},"235":{"tf":1.0},"236":{"tf":1.0},"237":{"tf":1.0},"238":{"tf":1.4142135623730951},"239":{"tf":1.0},"240":{"tf":1.7320508075688772},"241":{"tf":1.0},"242":{"tf":1.0},"243":{"tf":1.0},"244":{"tf":1.0},"245":{"tf":1.0},"246":{"tf":1.0},"247":{"tf":1.0},"248":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"251":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"254":{"tf":1.0},"255":{"tf":1.0},"256":{"tf":1.0},"257":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0},"266":{"tf":1.0},"267":{"tf":1.0},"268":{"tf":1.0},"269":{"tf":1.0},"270":{"tf":1.0},"271":{"tf":1.0},"272":{"tf":1.0},"273":{"tf":1.0},"274":{"tf":1.0},"275":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.0},"278":{"tf":1.0},"279":{"tf":1.0},"280":{"tf":1.0},"281":{"tf":1.0},"282":{"tf":1.0},"283":{"tf":1.0},"284":{"tf":1.0},"285":{"tf":1.0},"286":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.0},"289":{"tf":1.0},"290":{"tf":1.0},"291":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.0},"294":{"tf":1.0},"295":{"tf":1.0},"296":{"tf":1.0},"297":{"tf":1.0},"298":{"tf":1.0},"299":{"tf":1.0},"300":{"tf":1.0},"301":{"tf":1.0},"302":{"tf":1.0},"303":{"tf":1.0},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"307":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.0},"310":{"tf":1.0},"311":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.0},"314":{"tf":1.0},"315":{"tf":2.23606797749979},"316":{"tf":1.0},"317":{"tf":1.0},"318":{"tf":1.4142135623730951},"56":{"tf":1.0},"58":{"tf":1.7320508075688772},"59":{"tf":1.0},"60":{"tf":2.449489742783178},"61":{"tf":2.23606797749979},"62":{"tf":1.7320508075688772},"63":{"tf":2.449489742783178},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{},"v":{"df":1,"docs":{"215":{"tf":1.0}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"320":{"tf":1.0}}}}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"182":{"tf":1.0}}},"df":5,"docs":{"120":{"tf":1.4142135623730951},"141":{"tf":1.0},"195":{"tf":1.0},"289":{"tf":1.0},"296":{"tf":1.0}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":7,"docs":{"227":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"297":{"tf":1.0},"322":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":3,"docs":{"24":{"tf":1.0},"240":{"tf":1.0},"314":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"65":{"tf":1.0},"66":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"20":{"tf":1.0},"243":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}},"e":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}},"l":{"a":{"c":{"df":3,"docs":{"19":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":9,"docs":{"210":{"tf":1.7320508075688772},"215":{"tf":2.0},"25":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"324":{"tf":1.4142135623730951},"41":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":6,"docs":{"211":{"tf":1.4142135623730951},"212":{"tf":1.0},"216":{"tf":1.0},"26":{"tf":1.4142135623730951},"62":{"tf":1.0},"66":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":13,"docs":{"105":{"tf":1.0},"115":{"tf":1.0},"122":{"tf":1.0},"134":{"tf":1.0},"140":{"tf":1.0},"152":{"tf":1.0},"195":{"tf":1.0},"197":{"tf":1.0},"280":{"tf":1.0},"302":{"tf":1.0},"323":{"tf":1.7320508075688772},"40":{"tf":1.4142135623730951},"8":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"277":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0}}}}}}},"i":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":5,"docs":{"19":{"tf":1.0},"211":{"tf":1.0},"213":{"tf":1.0},"216":{"tf":2.0},"326":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":20,"docs":{"138":{"tf":1.4142135623730951},"143":{"tf":1.0},"145":{"tf":1.4142135623730951},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.4142135623730951},"158":{"tf":1.4142135623730951},"174":{"tf":1.0},"19":{"tf":1.0},"215":{"tf":1.0},"233":{"tf":1.7320508075688772},"240":{"tf":1.0},"243":{"tf":1.7320508075688772},"255":{"tf":1.4142135623730951},"279":{"tf":1.0},"30":{"tf":1.4142135623730951},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"45":{"tf":1.0},"89":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"v":{"df":4,"docs":{"117":{"tf":1.0},"119":{"tf":1.7320508075688772},"120":{"tf":1.0},"250":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"281":{"tf":1.0}}}},"v":{"df":8,"docs":{"179":{"tf":1.4142135623730951},"180":{"tf":1.0},"204":{"tf":1.4142135623730951},"216":{"tf":1.0},"234":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"272":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"281":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"49":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"141":{"tf":1.0},"216":{"tf":1.0},"321":{"tf":1.0},"324":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":7,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"321":{"tf":1.0},"322":{"tf":2.23606797749979},"324":{"tf":1.0},"45":{"tf":1.0}}}}}},"t":{"df":3,"docs":{"15":{"tf":1.0},"24":{"tf":1.0},"240":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"119":{"tf":1.0},"132":{"tf":1.4142135623730951},"197":{"tf":1.0},"240":{"tf":1.4142135623730951},"287":{"tf":1.0},"308":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":17,"docs":{"105":{"tf":1.0},"112":{"tf":1.0},"223":{"tf":1.0},"230":{"tf":1.4142135623730951},"250":{"tf":1.0},"271":{"tf":1.0},"280":{"tf":2.0},"281":{"tf":1.0},"288":{"tf":1.4142135623730951},"292":{"tf":1.0},"313":{"tf":1.4142135623730951},"33":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":4,"docs":{"252":{"tf":1.0},"271":{"tf":1.0},"42":{"tf":1.0},"69":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":2,"docs":{"144":{"tf":1.4142135623730951},"151":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"293":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":80,"docs":{"10":{"tf":2.0},"102":{"tf":1.7320508075688772},"106":{"tf":1.7320508075688772},"110":{"tf":1.7320508075688772},"113":{"tf":1.0},"118":{"tf":1.0},"124":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":2.0},"135":{"tf":1.0},"141":{"tf":3.0},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"155":{"tf":1.0},"157":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.7320508075688772},"164":{"tf":3.4641016151377544},"165":{"tf":1.4142135623730951},"166":{"tf":1.0},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.23606797749979},"170":{"tf":2.0},"173":{"tf":1.0},"175":{"tf":1.0},"178":{"tf":1.0},"189":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":2.6457513110645907},"243":{"tf":3.0},"244":{"tf":1.4142135623730951},"250":{"tf":2.0},"255":{"tf":1.0},"258":{"tf":2.6457513110645907},"266":{"tf":1.0},"268":{"tf":1.7320508075688772},"271":{"tf":1.4142135623730951},"272":{"tf":1.4142135623730951},"275":{"tf":1.7320508075688772},"279":{"tf":1.4142135623730951},"280":{"tf":1.7320508075688772},"281":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"288":{"tf":1.7320508075688772},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.4142135623730951},"299":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.7320508075688772},"304":{"tf":3.7416573867739413},"305":{"tf":1.0},"308":{"tf":2.8284271247461903},"309":{"tf":1.4142135623730951},"312":{"tf":4.123105625617661},"313":{"tf":1.7320508075688772},"316":{"tf":1.0},"33":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"44":{"tf":1.7320508075688772},"45":{"tf":1.0},"48":{"tf":2.0},"71":{"tf":1.7320508075688772},"76":{"tf":1.7320508075688772},"81":{"tf":1.7320508075688772},"86":{"tf":1.7320508075688772},"91":{"tf":1.7320508075688772},"97":{"tf":1.7320508075688772}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"164":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"m":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}},"df":25,"docs":{"113":{"tf":1.0},"118":{"tf":1.0},"157":{"tf":1.0},"163":{"tf":4.123105625617661},"164":{"tf":2.0},"171":{"tf":1.4142135623730951},"212":{"tf":1.0},"230":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"250":{"tf":1.4142135623730951},"269":{"tf":1.7320508075688772},"271":{"tf":1.0},"272":{"tf":1.4142135623730951},"279":{"tf":2.0},"280":{"tf":2.23606797749979},"288":{"tf":1.0},"292":{"tf":2.0},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"312":{"tf":1.4142135623730951},"41":{"tf":3.1622776601683795},"43":{"tf":2.0},"46":{"tf":1.0},"48":{"tf":2.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"163":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"324":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"143":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"182":{"tf":1.0},"247":{"tf":1.0},"292":{"tf":1.0},"322":{"tf":1.0},"40":{"tf":1.4142135623730951}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"288":{"tf":1.4142135623730951},"305":{"tf":1.0}}}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"1":{"6":{"0":{"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"6":{"0":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"82":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"79":{"tf":1.7320508075688772},"81":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":2,"docs":{"279":{"tf":1.0},"312":{"tf":1.0}},"s":{"=":{"df":0,"docs":{},"u":{"8":{"(":{"2":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"t":{"df":6,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"222":{"tf":1.0},"266":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"n":{"d":{"df":4,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.4142135623730951},"112":{"tf":1.0},"182":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"c":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"219":{"tf":1.0}}}}},"df":0,"docs":{}},"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":2.0},"219":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":6,"docs":{"123":{"tf":1.0},"146":{"tf":1.0},"233":{"tf":2.0},"241":{"tf":1.0},"37":{"tf":1.4142135623730951},"59":{"tf":1.0}}}},"n":{"<":{"df":0,"docs":{},"t":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"234":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"230":{"tf":1.0},"240":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}}},"df":26,"docs":{"15":{"tf":1.7320508075688772},"16":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.4142135623730951},"22":{"tf":1.0},"222":{"tf":2.0},"243":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"287":{"tf":1.0},"30":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.7320508075688772},"37":{"tf":1.0},"40":{"tf":1.0},"57":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.4142135623730951},"62":{"tf":1.0},"63":{"tf":1.0},"65":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"(":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"m":{"a":{"c":{"df":2,"docs":{"230":{"tf":1.0},"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},":":{":":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"(":{"df":0,"docs":{},"m":{"a":{"c":{"df":1,"docs":{"234":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":2.0},"243":{"tf":2.23606797749979}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":6,"docs":{"139":{"tf":1.0},"204":{"tf":1.0},"219":{"tf":2.449489742783178},"227":{"tf":1.0},"314":{"tf":1.0},"40":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"'":{"df":2,"docs":{"233":{"tf":1.0},"275":{"tf":1.0}}},"df":5,"docs":{"1":{"tf":1.4142135623730951},"2":{"tf":1.0},"26":{"tf":1.4142135623730951},"40":{"tf":1.0},"57":{"tf":1.7320508075688772}}}}}},"s":{"a":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"247":{"tf":1.0}}},"df":0,"docs":{}}}},"df":5,"docs":{"1":{"tf":1.0},"192":{"tf":1.0},"227":{"tf":1.0},"279":{"tf":1.7320508075688772},"9":{"tf":1.0}},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}},"s":{"a":{"df":1,"docs":{"266":{"tf":2.23606797749979}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"189":{"tf":1.0},"312":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"df":16,"docs":{"119":{"tf":1.0},"130":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"152":{"tf":1.0},"17":{"tf":1.0},"191":{"tf":1.0},"219":{"tf":1.0},"233":{"tf":1.7320508075688772},"255":{"tf":1.0},"272":{"tf":1.0},"281":{"tf":1.0},"309":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.0},"45":{"tf":1.0}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"312":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"52":{"tf":2.0}}},"df":0,"docs":{}}},"r":{"df":1,"docs":{"247":{"tf":1.0}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":2,"docs":{"106":{"tf":1.0},"230":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"219":{"tf":1.0},"266":{"tf":1.0}}}},"y":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"315":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":7,"docs":{"137":{"tf":1.0},"138":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"309":{"tf":1.4142135623730951},"312":{"tf":1.0},"323":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":10,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"103":{"tf":1.0},"230":{"tf":1.0},"237":{"tf":1.0},"296":{"tf":1.0},"69":{"tf":1.4142135623730951},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"141":{"tf":1.0},"171":{"tf":1.0},"191":{"tf":1.0},"293":{"tf":1.0},"40":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"p":{"2":{"5":{"6":{"df":0,"docs":{},"r":{"1":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"14":{"tf":1.0},"200":{"tf":1.0},"21":{"tf":1.0},"222":{"tf":1.0},"292":{"tf":1.4142135623730951},"35":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"324":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"e":{"df":14,"docs":{"13":{"tf":1.0},"135":{"tf":1.0},"15":{"tf":1.4142135623730951},"219":{"tf":1.0},"243":{"tf":1.0},"26":{"tf":1.0},"308":{"tf":1.4142135623730951},"309":{"tf":1.0},"330":{"tf":1.0},"39":{"tf":1.0},"45":{"tf":1.7320508075688772},"6":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.4142135623730951}},"k":{"df":1,"docs":{"212":{"tf":1.0}}}},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"206":{"tf":1.0},"316":{"tf":1.7320508075688772}}}}}}},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.0},"28":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"304":{"tf":1.0}}}}}},"df":0,"docs":{}},"f":{".":{"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"=":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"=":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"139":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"312":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":4,"docs":{"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"b":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"e":{"[":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":1,"docs":{"141":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"141":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"141":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"283":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"2":{"=":{"1":{"df":1,"docs":{"288":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},".":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"308":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"x":{"df":1,"docs":{"231":{"tf":1.0}}}},"df":0,"docs":{}}}}},"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"231":{"tf":1.0}}},"z":{"[":{"a":{"]":{"[":{"b":{"df":1,"docs":{"196":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"40":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"b":{".":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"280":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"280":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.4142135623730951},"243":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"d":{"[":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"255":{"tf":1.0}}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":3,"docs":{"43":{"tf":1.7320508075688772},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"v":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"f":{"(":{"5":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"296":{"tf":1.0}},"o":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"308":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"175":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"255":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":4,"docs":{"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"48":{"tf":1.7320508075688772}}},"df":4,"docs":{"41":{"tf":2.23606797749979},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"48":{"tf":2.8284271247461903}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}}}},"v":{"a":{"c":{"df":1,"docs":{"268":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"i":{"df":2,"docs":{"240":{"tf":1.0},"275":{"tf":1.4142135623730951}},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"163":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"164":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"240":{"tf":1.0}}},"1":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"148":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"o":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"[":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"]":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"135":{"tf":1.0},"16":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":1,"docs":{"10":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"y":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"b":{"a":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"258":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"258":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"[":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":1,"docs":{"258":{"tf":2.0}}},"x":{"df":1,"docs":{"258":{"tf":2.0}}}},"df":1,"docs":{"258":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"258":{"tf":2.0}}},"1":{"df":1,"docs":{"258":{"tf":2.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}}}},"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"258":{"tf":1.4142135623730951},"304":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"[":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"42":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"i":{"d":{"d":{"df":2,"docs":{"41":{"tf":1.0},"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"[":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"[":{"5":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"244":{"tf":1.4142135623730951}}}}}}},"u":{"df":0,"docs":{},"m":{"(":{"[":{"1":{"0":{"df":1,"docs":{"299":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"141":{"tf":1.4142135623730951},"152":{"tf":1.0},"173":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"155":{"tf":1.0},"156":{"tf":1.0}}}}},"df":0,"docs":{}},"x":{"df":3,"docs":{"231":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.4142135623730951}}}},"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"279":{"tf":1.0}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"271":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"df":38,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":1.7320508075688772},"133":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.4142135623730951},"139":{"tf":1.0},"141":{"tf":3.0},"144":{"tf":1.4142135623730951},"146":{"tf":2.6457513110645907},"148":{"tf":1.0},"152":{"tf":3.0},"153":{"tf":1.7320508075688772},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.4142135623730951},"16":{"tf":1.0},"161":{"tf":1.0},"177":{"tf":1.0},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"222":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"237":{"tf":2.0},"240":{"tf":3.0},"249":{"tf":1.0},"275":{"tf":1.4142135623730951},"283":{"tf":1.0},"288":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":2.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"284":{"tf":1.0},"314":{"tf":1.0}}}}},"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"158":{"tf":1.0},"59":{"tf":1.0}}}}}},"n":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"258":{"tf":1.0},"42":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":13,"docs":{"135":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.7320508075688772},"17":{"tf":1.7320508075688772},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"279":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"45":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"r":{"'":{"df":2,"docs":{"148":{"tf":1.0},"42":{"tf":1.0}}},"df":4,"docs":{"141":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"41":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"279":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"t":{"df":4,"docs":{"189":{"tf":1.0},"240":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"197":{"tf":1.0}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":8,"docs":{"124":{"tf":1.0},"132":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"191":{"tf":1.0},"290":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"19":{"tf":2.23606797749979},"235":{"tf":1.0}},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"19":{"tf":2.449489742783178}}}}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":18,"docs":{"105":{"tf":1.0},"113":{"tf":1.0},"115":{"tf":1.0},"123":{"tf":1.0},"126":{"tf":1.4142135623730951},"127":{"tf":1.7320508075688772},"134":{"tf":1.4142135623730951},"187":{"tf":1.0},"192":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":2.23606797749979},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":2,"docs":{"315":{"tf":1.0},"328":{"tf":1.0}}}}},"v":{"df":2,"docs":{"211":{"tf":1.4142135623730951},"65":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"266":{"tf":1.0},"27":{"tf":1.0}}}}}},"t":{"df":14,"docs":{"126":{"tf":1.4142135623730951},"139":{"tf":1.0},"14":{"tf":1.0},"141":{"tf":1.4142135623730951},"15":{"tf":1.0},"160":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"258":{"tf":2.0},"266":{"tf":1.0},"321":{"tf":1.0},"40":{"tf":1.7320508075688772},"43":{"tf":1.0},"52":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"19":{"tf":1.0},"255":{"tf":1.0},"40":{"tf":1.0}}}}},"x":{"df":1,"docs":{"320":{"tf":1.0}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"320":{"tf":1.0},"321":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"(":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":1,"docs":{"77":{"tf":1.0}}}}},"df":0,"docs":{}},"df":3,"docs":{"68":{"tf":1.0},"74":{"tf":1.7320508075688772},"76":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"68":{"tf":1.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.0},"315":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":4,"docs":{"182":{"tf":1.4142135623730951},"247":{"tf":1.0},"27":{"tf":1.4142135623730951},"280":{"tf":2.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"287":{"tf":1.0}}}}},"df":2,"docs":{"197":{"tf":1.0},"272":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"2":{"df":1,"docs":{"280":{"tf":1.4142135623730951}}},"df":1,"docs":{"280":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"244":{"tf":1.4142135623730951},"271":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":2,"docs":{"146":{"tf":1.0},"287":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"272":{"tf":1.4142135623730951},"296":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"135":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.0},"9":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.4142135623730951},"18":{"tf":1.0},"19":{"tf":1.0}}}}}},"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":18,"docs":{"101":{"tf":1.4142135623730951},"111":{"tf":1.4142135623730951},"132":{"tf":1.0},"138":{"tf":1.0},"143":{"tf":1.7320508075688772},"146":{"tf":1.0},"18":{"tf":1.4142135623730951},"249":{"tf":1.0},"258":{"tf":1.0},"283":{"tf":1.0},"52":{"tf":1.4142135623730951},"69":{"tf":1.7320508075688772},"72":{"tf":1.4142135623730951},"77":{"tf":1.4142135623730951},"82":{"tf":1.4142135623730951},"87":{"tf":1.4142135623730951},"92":{"tf":1.4142135623730951},"96":{"tf":1.4142135623730951}}}}}},"df":17,"docs":{"135":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"17":{"tf":2.23606797749979},"18":{"tf":1.7320508075688772},"190":{"tf":1.0},"240":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"269":{"tf":1.0},"279":{"tf":1.0},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"9":{"tf":2.449489742783178}},"e":{"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"69":{"tf":1.0}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"1":{"tf":1.0},"233":{"tf":1.0},"279":{"tf":1.0},"296":{"tf":1.0},"45":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"204":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":11,"docs":{"141":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0},"219":{"tf":1.0},"33":{"tf":1.0},"36":{"tf":1.0},"44":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"d":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"219":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"266":{"tf":1.0}}}}},"i":{"df":7,"docs":{"18":{"tf":1.4142135623730951},"203":{"tf":1.0},"37":{"tf":1.0},"44":{"tf":1.0},"6":{"tf":1.0},"8":{"tf":1.0},"84":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"19":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"133":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":10,"docs":{"123":{"tf":1.0},"135":{"tf":1.0},"18":{"tf":1.0},"24":{"tf":1.0},"255":{"tf":1.0},"273":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"287":{"tf":1.0},"327":{"tf":1.0}},"e":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"197":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"df":5,"docs":{"21":{"tf":1.0},"243":{"tf":1.0},"64":{"tf":1.0},"65":{"tf":1.4142135623730951},"66":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"=":{"5":{"0":{"0":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":16,"docs":{"113":{"tf":1.0},"131":{"tf":1.4142135623730951},"141":{"tf":1.4142135623730951},"175":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.4142135623730951},"201":{"tf":1.4142135623730951},"203":{"tf":2.0},"207":{"tf":1.0},"250":{"tf":1.7320508075688772},"268":{"tf":2.0},"279":{"tf":1.0},"292":{"tf":3.0},"299":{"tf":1.0},"312":{"tf":2.23606797749979},"320":{"tf":1.0}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":4,"docs":{"16":{"tf":1.0},"164":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"t":{"df":6,"docs":{"161":{"tf":1.0},"177":{"tf":1.4142135623730951},"200":{"tf":1.4142135623730951},"206":{"tf":1.7320508075688772},"207":{"tf":1.0},"256":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":12,"docs":{"0":{"tf":2.0},"1":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"142":{"tf":1.0},"143":{"tf":1.4142135623730951},"21":{"tf":1.0},"25":{"tf":1.0},"28":{"tf":1.0},"3":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"@":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"25":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":2,"docs":{"40":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"115":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"323":{"tf":1.0},"327":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":1,"docs":{"320":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"c":{"df":3,"docs":{"237":{"tf":1.0},"26":{"tf":1.7320508075688772},"57":{"tf":2.23606797749979}}},"df":0,"docs":{},"i":{"d":{"df":8,"docs":{"240":{"tf":1.0},"281":{"tf":1.0},"292":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"318":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"57":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":2,"docs":{"143":{"tf":1.0},"3":{"tf":1.7320508075688772}}}},"m":{"df":0,"docs":{},"e":{"_":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"168":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"161":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"309":{"tf":2.0}}},"df":0,"docs":{}}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"233":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"b":{"df":1,"docs":{"137":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"x":{"df":1,"docs":{"178":{"tf":1.4142135623730951}}}},"df":1,"docs":{"178":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"169":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.4142135623730951}},"e":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":2,"docs":{"174":{"tf":1.0},"178":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"243":{"tf":1.4142135623730951},"280":{"tf":1.4142135623730951}}}}}},"v":{"df":1,"docs":{"145":{"tf":1.0}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"195":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"309":{"tf":1.7320508075688772}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"258":{"tf":1.4142135623730951}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"243":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"df":4,"docs":{"21":{"tf":1.0},"249":{"tf":1.0},"275":{"tf":1.0},"35":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":8,"docs":{"130":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":2.449489742783178},"243":{"tf":1.0},"26":{"tf":2.0},"266":{"tf":1.7320508075688772},"275":{"tf":1.0},"277":{"tf":1.0}},"e":{"d":{"b":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"266":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":4,"docs":{"200":{"tf":1.4142135623730951},"323":{"tf":1.4142135623730951},"327":{"tf":1.0},"35":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":2,"docs":{"277":{"tf":1.0},"293":{"tf":1.0}}},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"c":{"df":3,"docs":{"217":{"tf":1.0},"289":{"tf":1.0},"317":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"139":{"tf":1.0},"268":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":105,"docs":{"1":{"tf":1.0},"113":{"tf":2.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.4142135623730951},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.4142135623730951},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.7320508075688772},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":1.0},"26":{"tf":1.0},"289":{"tf":1.0},"40":{"tf":2.0},"44":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":12,"docs":{"130":{"tf":1.4142135623730951},"141":{"tf":1.7320508075688772},"161":{"tf":1.0},"173":{"tf":1.0},"233":{"tf":1.0},"255":{"tf":2.0},"292":{"tf":1.0},"293":{"tf":1.0},"296":{"tf":1.0},"30":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"243":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"316":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"177":{"tf":1.0},"193":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":4,"docs":{"130":{"tf":1.0},"226":{"tf":1.0},"275":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"113":{"tf":1.0}}}},"c":{"df":0,"docs":{},"k":{"df":11,"docs":{"113":{"tf":1.0},"141":{"tf":1.0},"161":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":3.0},"207":{"tf":1.4142135623730951},"213":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":6,"docs":{"16":{"tf":1.0},"269":{"tf":1.0},"281":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"313":{"tf":1.4142135623730951}}}},"n":{"d":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"266":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"266":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"r":{"d":{"df":56,"docs":{"100":{"tf":1.0},"101":{"tf":1.0},"102":{"tf":1.0},"103":{"tf":1.0},"104":{"tf":1.0},"105":{"tf":1.0},"106":{"tf":1.0},"107":{"tf":1.0},"108":{"tf":1.0},"109":{"tf":1.0},"110":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"132":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":1.4142135623730951},"268":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.4142135623730951},"322":{"tf":1.0},"328":{"tf":1.0},"329":{"tf":1.0},"53":{"tf":1.4142135623730951},"67":{"tf":2.0},"68":{"tf":1.7320508075688772},"69":{"tf":1.0},"70":{"tf":1.0},"71":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0},"74":{"tf":1.0},"75":{"tf":1.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"79":{"tf":1.0},"80":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"84":{"tf":1.0},"85":{"tf":1.0},"86":{"tf":1.0},"87":{"tf":1.0},"88":{"tf":1.0},"89":{"tf":1.0},"90":{"tf":1.0},"91":{"tf":1.0},"92":{"tf":1.0},"93":{"tf":1.0},"94":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"97":{"tf":1.0},"98":{"tf":1.0},"99":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":15,"docs":{"127":{"tf":2.0},"13":{"tf":1.0},"15":{"tf":1.0},"217":{"tf":1.0},"22":{"tf":1.0},"273":{"tf":1.0},"29":{"tf":1.0},"305":{"tf":1.0},"315":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"46":{"tf":1.0},"5":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":24,"docs":{"108":{"tf":1.4142135623730951},"109":{"tf":1.0},"110":{"tf":1.0},"13":{"tf":1.0},"130":{"tf":1.4142135623730951},"137":{"tf":2.0},"139":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"163":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"240":{"tf":2.0},"258":{"tf":1.0},"317":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"46":{"tf":1.0},"48":{"tf":1.0},"7":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":27,"docs":{"113":{"tf":3.7416573867739413},"136":{"tf":1.0},"157":{"tf":4.0},"158":{"tf":2.6457513110645907},"159":{"tf":2.23606797749979},"160":{"tf":2.23606797749979},"161":{"tf":2.449489742783178},"162":{"tf":2.6457513110645907},"163":{"tf":3.0},"164":{"tf":2.6457513110645907},"165":{"tf":2.6457513110645907},"166":{"tf":2.449489742783178},"167":{"tf":2.23606797749979},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"170":{"tf":2.449489742783178},"171":{"tf":2.6457513110645907},"240":{"tf":1.7320508075688772},"243":{"tf":1.0},"244":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.7320508075688772},"288":{"tf":2.0},"289":{"tf":1.0},"296":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"n":{"df":1,"docs":{"157":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.4142135623730951}}}}}},"i":{"c":{"df":8,"docs":{"1":{"tf":1.0},"119":{"tf":1.0},"175":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"252":{"tf":1.0},"293":{"tf":1.0},"316":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":3,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"320":{"tf":1.0}}}}},"d":{".":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}},"df":0,"docs":{}},":":{":":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"230":{"tf":1.0}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"240":{"tf":1.0},"243":{"tf":1.0},"258":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"m":{":":{":":{"b":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"258":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"0":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"258":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"230":{"tf":1.0},"258":{"tf":1.4142135623730951}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"273":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"230":{"tf":1.0},"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.0}}}},"df":0,"docs":{}},"{":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":2,"docs":{"237":{"tf":1.4142135623730951},"273":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":7,"docs":{"14":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"215":{"tf":1.0},"219":{"tf":1.0},"279":{"tf":1.0},"61":{"tf":1.0}}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":8,"docs":{"21":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"277":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"266":{"tf":1.0},"287":{"tf":1.0}}},"r":{"a":{"df":0,"docs":{},"g":{"df":34,"docs":{"10":{"tf":2.0},"113":{"tf":1.7320508075688772},"137":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":2.449489742783178},"152":{"tf":1.4142135623730951},"153":{"tf":1.7320508075688772},"155":{"tf":1.4142135623730951},"156":{"tf":1.4142135623730951},"161":{"tf":1.0},"19":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"195":{"tf":1.0},"200":{"tf":1.4142135623730951},"201":{"tf":1.0},"202":{"tf":2.0},"203":{"tf":2.6457513110645907},"204":{"tf":2.23606797749979},"205":{"tf":1.4142135623730951},"219":{"tf":1.0},"231":{"tf":1.0},"240":{"tf":1.0},"241":{"tf":1.0},"249":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":1.0},"268":{"tf":1.0},"280":{"tf":1.4142135623730951},"312":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":17,"docs":{"135":{"tf":1.0},"137":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0},"192":{"tf":1.4142135623730951},"193":{"tf":1.4142135623730951},"197":{"tf":1.0},"200":{"tf":2.23606797749979},"201":{"tf":2.6457513110645907},"202":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"268":{"tf":1.0},"312":{"tf":1.0},"314":{"tf":1.0},"9":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":1,"docs":{"306":{"tf":1.0}},"i":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"117":{"tf":1.0},"118":{"tf":1.4142135623730951},"119":{"tf":1.0},"120":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"'":{"df":1,"docs":{"197":{"tf":1.0}}},"1":{"0":{"0":{"(":{"\"":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"312":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":2,"docs":{"312":{"tf":1.0},"313":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"df":1,"docs":{"312":{"tf":1.0}}},"<":{"1":{"0":{"0":{"df":11,"docs":{"10":{"tf":2.449489742783178},"135":{"tf":2.0},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"16":{"tf":1.7320508075688772},"197":{"tf":1.0},"2":{"tf":1.4142135623730951},"240":{"tf":1.7320508075688772},"296":{"tf":1.0},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}},">":{"(":{"\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":1,"docs":{"296":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"133":{"tf":1.0},"197":{"tf":1.0},"243":{"tf":1.4142135623730951},"296":{"tf":1.0}}},"4":{"0":{"df":1,"docs":{"287":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"293":{"tf":1.0}}},"df":1,"docs":{"197":{"tf":1.0}}},"3":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"df":3,"docs":{"197":{"tf":1.4142135623730951},"293":{"tf":1.0},"296":{"tf":1.0}}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"126":{"tf":1.0},"181":{"tf":1.0}}}}}}}},"df":24,"docs":{"113":{"tf":1.0},"115":{"tf":1.4142135623730951},"120":{"tf":1.0},"124":{"tf":1.4142135623730951},"126":{"tf":2.0},"139":{"tf":1.0},"171":{"tf":1.7320508075688772},"18":{"tf":1.0},"181":{"tf":1.4142135623730951},"187":{"tf":1.0},"197":{"tf":1.7320508075688772},"223":{"tf":1.0},"241":{"tf":1.0},"287":{"tf":1.4142135623730951},"292":{"tf":1.4142135623730951},"293":{"tf":1.4142135623730951},"304":{"tf":2.0},"305":{"tf":1.0},"306":{"tf":1.4142135623730951},"312":{"tf":1.7320508075688772},"33":{"tf":1.0},"45":{"tf":1.0},"74":{"tf":1.0},"8":{"tf":1.0}},"n":{"df":1,"docs":{"296":{"tf":1.0}}}}},"v":{"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"3":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":46,"docs":{"113":{"tf":1.4142135623730951},"118":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.4142135623730951},"131":{"tf":3.3166247903554},"132":{"tf":1.0},"135":{"tf":1.4142135623730951},"140":{"tf":2.23606797749979},"141":{"tf":1.7320508075688772},"145":{"tf":1.0},"152":{"tf":1.4142135623730951},"153":{"tf":1.0},"163":{"tf":1.7320508075688772},"172":{"tf":1.0},"176":{"tf":1.7320508075688772},"178":{"tf":1.4142135623730951},"187":{"tf":1.0},"193":{"tf":3.7416573867739413},"195":{"tf":1.0},"196":{"tf":1.0},"222":{"tf":1.0},"230":{"tf":1.0},"231":{"tf":1.7320508075688772},"237":{"tf":1.0},"240":{"tf":2.23606797749979},"241":{"tf":1.0},"243":{"tf":3.4641016151377544},"249":{"tf":1.0},"250":{"tf":2.8284271247461903},"253":{"tf":1.0},"258":{"tf":2.0},"265":{"tf":1.0},"268":{"tf":2.6457513110645907},"269":{"tf":1.0},"275":{"tf":1.4142135623730951},"277":{"tf":1.0},"280":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":2.0},"312":{"tf":2.8284271247461903},"41":{"tf":2.449489742783178},"43":{"tf":2.0},"48":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"131":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"r":{"df":17,"docs":{"113":{"tf":1.0},"116":{"tf":1.7320508075688772},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"130":{"tf":1.0},"191":{"tf":1.4142135623730951},"243":{"tf":1.0},"67":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"27":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"243":{"tf":1.0}}}}},"df":0,"docs":{}},"df":1,"docs":{"243":{"tf":1.0}}}},"p":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":3,"docs":{"216":{"tf":1.0},"243":{"tf":1.0},"46":{"tf":1.0}}}}}},"u":{"b":{"(":{"a":{"df":1,"docs":{"304":{"tf":1.0}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"d":{"(":{"df":1,"docs":{"25":{"tf":1.0}}},"df":5,"docs":{"233":{"tf":1.0},"243":{"tf":1.0},"25":{"tf":1.4142135623730951},"29":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":2,"docs":{"174":{"tf":1.0},"308":{"tf":1.0}}}},"t":{"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"212":{"tf":1.0}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"182":{"tf":1.0},"312":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":2,"docs":{"280":{"tf":1.0},"284":{"tf":1.0}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"45":{"tf":1.0}},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"222":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{},"h":{"df":19,"docs":{"10":{"tf":1.0},"136":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.4142135623730951},"151":{"tf":1.0},"19":{"tf":1.4142135623730951},"197":{"tf":1.7320508075688772},"21":{"tf":1.0},"213":{"tf":1.0},"24":{"tf":1.0},"249":{"tf":1.0},"27":{"tf":1.0},"299":{"tf":1.0},"316":{"tf":1.4142135623730951},"321":{"tf":1.0},"40":{"tf":1.0},"46":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"40":{"tf":1.0}},"i":{"df":1,"docs":{"255":{"tf":1.0}}}},"df":0,"docs":{}}}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"m":{"df":8,"docs":{"141":{"tf":1.0},"166":{"tf":2.0},"167":{"tf":2.0},"168":{"tf":2.8284271247461903},"169":{"tf":2.8284271247461903},"243":{"tf":1.7320508075688772},"299":{"tf":1.0},"309":{"tf":1.4142135623730951}},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}},"i":{"df":2,"docs":{"20":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.4142135623730951}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"119":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"292":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":28,"docs":{"160":{"tf":1.0},"22":{"tf":1.0},"226":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.0},"243":{"tf":1.7320508075688772},"246":{"tf":1.0},"249":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.0},"260":{"tf":1.4142135623730951},"261":{"tf":1.4142135623730951},"262":{"tf":1.4142135623730951},"265":{"tf":1.0},"268":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951},"279":{"tf":2.0},"287":{"tf":1.4142135623730951},"296":{"tf":1.4142135623730951},"299":{"tf":1.4142135623730951},"304":{"tf":1.7320508075688772},"306":{"tf":1.0},"308":{"tf":1.7320508075688772},"312":{"tf":3.4641016151377544},"316":{"tf":2.23606797749979},"318":{"tf":1.0},"50":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"19":{"tf":1.0},"216":{"tf":1.0},"24":{"tf":1.0},"57":{"tf":1.0},"59":{"tf":1.0},"62":{"tf":1.0},"66":{"tf":1.0},"9":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}}},"df":0,"docs":{}}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"64":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"182":{"tf":1.0},"183":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"df":1,"docs":{"134":{"tf":1.0}}}}}},"t":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"115":{"tf":1.0},"166":{"tf":1.0}}}},"df":0,"docs":{},"x":{"df":49,"docs":{"1":{"tf":1.0},"115":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"141":{"tf":1.0},"146":{"tf":1.0},"158":{"tf":1.4142135623730951},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"173":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0},"178":{"tf":1.4142135623730951},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"191":{"tf":1.4142135623730951},"192":{"tf":1.0},"2":{"tf":1.0},"240":{"tf":1.4142135623730951},"252":{"tf":1.0},"258":{"tf":1.4142135623730951},"265":{"tf":1.0},"266":{"tf":1.4142135623730951},"27":{"tf":1.7320508075688772},"275":{"tf":1.4142135623730951},"308":{"tf":1.0},"316":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":23,"docs":{"113":{"tf":1.0},"186":{"tf":1.7320508075688772},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"215":{"tf":1.0},"24":{"tf":1.0},"26":{"tf":1.0},"275":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"57":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"/":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"15":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":2,"docs":{"124":{"tf":1.0},"287":{"tf":1.0}},"l":{"df":3,"docs":{"146":{"tf":1.0},"182":{"tf":1.0},"287":{"tf":1.0}}}},"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":5,"docs":{"210":{"tf":1.0},"212":{"tf":1.0},"219":{"tf":1.0},"62":{"tf":2.0},"63":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":16,"docs":{"108":{"tf":1.0},"141":{"tf":2.0},"144":{"tf":1.0},"146":{"tf":1.0},"152":{"tf":1.0},"234":{"tf":1.0},"240":{"tf":2.0},"255":{"tf":1.4142135623730951},"275":{"tf":1.4142135623730951},"280":{"tf":1.0},"284":{"tf":1.0},"312":{"tf":1.4142135623730951},"322":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"26":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"f":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":3,"docs":{"250":{"tf":1.0},"293":{"tf":1.0},"312":{"tf":1.0}}}}}}},"b":{"df":0,"docs":{},"w":{"df":3,"docs":{"176":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0}}}},"df":13,"docs":{"108":{"tf":1.0},"109":{"tf":1.0},"111":{"tf":1.0},"112":{"tf":1.0},"115":{"tf":1.0},"124":{"tf":1.0},"126":{"tf":1.0},"132":{"tf":1.0},"192":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.4142135623730951},"234":{"tf":1.0},"243":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"210":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"215":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":3,"docs":{"16":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"33":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"249":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}}},"n":{"df":4,"docs":{"159":{"tf":1.7320508075688772},"17":{"tf":1.0},"279":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":5,"docs":{"130":{"tf":1.0},"213":{"tf":1.0},"275":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":6,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"26":{"tf":1.0},"45":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"272":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"33":{"tf":1.0}},"e":{"c":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"230":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"222":{"tf":1.0}}}}}},".":{"df":0,"docs":{},"f":{"df":1,"docs":{"222":{"tf":1.4142135623730951}}}},"df":1,"docs":{"222":{"tf":1.7320508075688772}}}}},"r":{"a":{"df":0,"docs":{},"w":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"230":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":23,"docs":{"13":{"tf":2.23606797749979},"19":{"tf":2.0},"20":{"tf":1.0},"212":{"tf":1.0},"216":{"tf":1.0},"222":{"tf":3.7416573867739413},"223":{"tf":1.4142135623730951},"230":{"tf":2.23606797749979},"233":{"tf":2.23606797749979},"241":{"tf":1.0},"26":{"tf":1.4142135623730951},"275":{"tf":1.0},"281":{"tf":1.7320508075688772},"306":{"tf":1.4142135623730951},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"33":{"tf":3.1622776601683795},"44":{"tf":1.0},"56":{"tf":1.0},"57":{"tf":2.6457513110645907},"61":{"tf":1.0},"62":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"19":{"tf":1.0}}},"df":11,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.7320508075688772},"20":{"tf":1.0},"5":{"tf":1.0}}}}}}}},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"216":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"'":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"0":{"tf":1.0},"146":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}}}},"y":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"277":{"tf":1.0}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":5,"docs":{"146":{"tf":1.0},"240":{"tf":1.0},"275":{"tf":1.0},"40":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":8,"docs":{"115":{"tf":1.0},"130":{"tf":1.0},"240":{"tf":1.0},"271":{"tf":1.0},"321":{"tf":1.0},"327":{"tf":1.0},"328":{"tf":1.0},"69":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"280":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"322":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"200":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":4,"docs":{"132":{"tf":1.0},"141":{"tf":1.0},"24":{"tf":1.0},"327":{"tf":1.0}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"w":{"df":1,"docs":{"296":{"tf":1.0}},"n":{"df":1,"docs":{"250":{"tf":1.0}}}}}},"u":{"df":4,"docs":{"240":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"266":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"146":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"187":{"tf":1.0}}}}}}},"m":{"df":0,"docs":{},"e":{"df":22,"docs":{"1":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"139":{"tf":1.0},"144":{"tf":1.0},"16":{"tf":1.0},"197":{"tf":1.0},"203":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"292":{"tf":1.0},"309":{"tf":2.23606797749979},"327":{"tf":1.0},"328":{"tf":1.0},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":2.449489742783178},"42":{"tf":1.0},"45":{"tf":1.4142135623730951},"49":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":2,"docs":{"40":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"_":{"a":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"1":{"0":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":7,"docs":{"10":{"tf":1.4142135623730951},"113":{"tf":1.0},"205":{"tf":2.0},"231":{"tf":1.4142135623730951},"241":{"tf":1.0},"316":{"tf":1.0},"317":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":12,"docs":{"113":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"121":{"tf":1.7320508075688772},"122":{"tf":1.4142135623730951},"123":{"tf":1.7320508075688772},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"19":{"tf":1.0},"305":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"o":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":6,"docs":{"14":{"tf":1.4142135623730951},"20":{"tf":1.0},"212":{"tf":1.0},"249":{"tf":1.0},"38":{"tf":1.0},"50":{"tf":1.4142135623730951}}}},"p":{"df":2,"docs":{"130":{"tf":1.0},"141":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"222":{"tf":1.0}}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"182":{"tf":1.0},"321":{"tf":1.0},"329":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"60":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":6,"docs":{"160":{"tf":1.0},"206":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"40":{"tf":2.23606797749979},"41":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"t":{"'":{"df":1,"docs":{"132":{"tf":1.0}}},"df":9,"docs":{"113":{"tf":1.0},"119":{"tf":1.0},"132":{"tf":3.872983346207417},"233":{"tf":2.0},"237":{"tf":2.0},"240":{"tf":3.1622776601683795},"241":{"tf":1.0},"243":{"tf":2.23606797749979},"290":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"132":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":14,"docs":{"130":{"tf":1.4142135623730951},"135":{"tf":1.0},"141":{"tf":1.0},"143":{"tf":1.0},"148":{"tf":1.4142135623730951},"16":{"tf":2.23606797749979},"17":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"249":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"16":{"tf":1.0},"17":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{"0":{"df":1,"docs":{"255":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":4,"docs":{"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"173":{"tf":1.0},"255":{"tf":1.4142135623730951}}}},"n":{"d":{"df":1,"docs":{"258":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":8,"docs":{"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"149":{"tf":1.7320508075688772},"255":{"tf":1.0},"258":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0}},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"(":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"57":{"tf":1.0}}}}}},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"22":{"tf":1.0},"3":{"tf":1.0},"330":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"275":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"280":{"tf":1.0},"308":{"tf":1.0},"313":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"275":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951}}}},"i":{"df":5,"docs":{"10":{"tf":1.4142135623730951},"293":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"9":{"tf":1.0}},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"266":{"tf":1.0},"41":{"tf":1.4142135623730951},"43":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"321":{"tf":1.0}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"df":1,"docs":{"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":26,"docs":{"106":{"tf":1.0},"112":{"tf":1.0},"118":{"tf":1.0},"125":{"tf":1.0},"141":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.4142135623730951},"169":{"tf":1.4142135623730951},"170":{"tf":1.0},"174":{"tf":2.0},"175":{"tf":1.0},"181":{"tf":1.0},"184":{"tf":1.4142135623730951},"185":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.4142135623730951},"240":{"tf":2.0},"244":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"272":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"243":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":25,"docs":{"102":{"tf":1.0},"113":{"tf":1.4142135623730951},"131":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"172":{"tf":1.0},"174":{"tf":4.69041575982343},"175":{"tf":1.0},"178":{"tf":1.0},"187":{"tf":1.0},"191":{"tf":4.0},"195":{"tf":1.0},"196":{"tf":1.0},"240":{"tf":1.0},"258":{"tf":1.4142135623730951},"284":{"tf":1.0},"288":{"tf":1.0},"292":{"tf":1.0},"293":{"tf":1.7320508075688772},"296":{"tf":1.0},"300":{"tf":1.0},"302":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.7320508075688772},"97":{"tf":1.0}},"e":{"'":{"df":1,"docs":{"191":{"tf":1.0}}},"(":{"df":0,"docs":{},"u":{"3":{"2":{"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"133":{"tf":1.4142135623730951},"174":{"tf":1.4142135623730951}}},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"174":{"tf":1.0}}}}}}}}},"p":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"170":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"160":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"160":{"tf":1.7320508075688772}}}}}}}}}}},"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"191":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"240":{"tf":1.0},"280":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":18,"docs":{"14":{"tf":1.4142135623730951},"15":{"tf":1.0},"16":{"tf":1.4142135623730951},"224":{"tf":1.0},"235":{"tf":1.0},"35":{"tf":2.23606797749979},"36":{"tf":1.4142135623730951},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"213":{"tf":1.0}}}}}}},"o":{"'":{"df":1,"docs":{"190":{"tf":1.0}}},"df":10,"docs":{"117":{"tf":1.0},"130":{"tf":1.4142135623730951},"247":{"tf":1.0},"268":{"tf":1.0},"279":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"313":{"tf":1.0},"40":{"tf":1.4142135623730951},"69":{"tf":1.0}}}},"x":{".":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"312":{"tf":1.0}}}}}}}}},"df":3,"docs":{"19":{"tf":1.0},"231":{"tf":1.7320508075688772},"312":{"tf":1.0}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"134":{"tf":1.0}}},"df":0,"docs":{}}}},"df":88,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"113":{"tf":3.7416573867739413},"119":{"tf":1.0},"127":{"tf":2.23606797749979},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.4142135623730951},"132":{"tf":3.0},"133":{"tf":2.0},"134":{"tf":3.4641016151377544},"135":{"tf":1.7320508075688772},"141":{"tf":2.0},"146":{"tf":1.4142135623730951},"148":{"tf":1.0},"159":{"tf":1.4142135623730951},"16":{"tf":1.0},"160":{"tf":1.0},"164":{"tf":1.0},"166":{"tf":1.0},"17":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":2.23606797749979},"177":{"tf":2.0},"181":{"tf":1.7320508075688772},"182":{"tf":1.0},"184":{"tf":1.0},"186":{"tf":1.7320508075688772},"187":{"tf":3.7416573867739413},"188":{"tf":2.6457513110645907},"189":{"tf":3.1622776601683795},"190":{"tf":3.0},"191":{"tf":5.0990195135927845},"192":{"tf":2.8284271247461903},"193":{"tf":3.4641016151377544},"194":{"tf":2.6457513110645907},"195":{"tf":2.449489742783178},"196":{"tf":3.4641016151377544},"197":{"tf":3.0},"198":{"tf":2.23606797749979},"199":{"tf":2.23606797749979},"200":{"tf":1.0},"201":{"tf":1.7320508075688772},"202":{"tf":1.0},"203":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":2.23606797749979},"231":{"tf":1.4142135623730951},"233":{"tf":1.0},"237":{"tf":1.7320508075688772},"240":{"tf":2.449489742783178},"241":{"tf":1.7320508075688772},"243":{"tf":2.449489742783178},"244":{"tf":1.0},"247":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.4142135623730951},"266":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":2.23606797749979},"281":{"tf":1.0},"283":{"tf":2.449489742783178},"287":{"tf":2.449489742783178},"290":{"tf":1.0},"292":{"tf":2.23606797749979},"293":{"tf":1.7320508075688772},"296":{"tf":2.0},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"304":{"tf":1.0},"305":{"tf":1.0},"306":{"tf":1.0},"309":{"tf":1.7320508075688772},"312":{"tf":2.0},"313":{"tf":1.4142135623730951},"316":{"tf":2.23606797749979},"40":{"tf":2.449489742783178},"41":{"tf":1.0},"46":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"o":{"df":0,"docs":{},"f":{"df":1,"docs":{"119":{"tf":1.0}}}}},"i":{"c":{"df":1,"docs":{"271":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"+":{"0":{"0":{"3":{"0":{"df":1,"docs":{"127":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"2":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":1,"docs":{"127":{"tf":1.0}}}},"7":{"8":{"df":1,"docs":{"127":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"2":{"8":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"190":{"tf":1.0}}},"df":0,"docs":{}},"6":{"(":{"1":{"0":{"0":{"0":{"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"5":{"5":{"3":{"5":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"b":{"1":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"316":{"tf":1.0}}}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":7,"docs":{"115":{"tf":1.0},"190":{"tf":1.0},"243":{"tf":1.0},"279":{"tf":1.4142135623730951},"296":{"tf":1.0},"309":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"5":{"6":{"(":{"1":{"df":1,"docs":{"240":{"tf":1.0}}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"268":{"tf":1.0}}}},"df":0,"docs":{}},"df":2,"docs":{"170":{"tf":1.0},"240":{"tf":1.0}}},"b":{"a":{"df":0,"docs":{},"r":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"258":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},",":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":2,"docs":{"101":{"tf":1.0},"96":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"[":{"1":{"0":{"df":1,"docs":{"316":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"175":{"tf":1.0}}},"3":{"df":3,"docs":{"299":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"df":92,"docs":{"100":{"tf":1.7320508075688772},"101":{"tf":1.7320508075688772},"102":{"tf":1.7320508075688772},"103":{"tf":1.4142135623730951},"127":{"tf":2.23606797749979},"130":{"tf":1.4142135623730951},"131":{"tf":1.7320508075688772},"132":{"tf":1.4142135623730951},"137":{"tf":1.0},"139":{"tf":1.4142135623730951},"141":{"tf":4.47213595499958},"143":{"tf":1.0},"144":{"tf":1.4142135623730951},"146":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"155":{"tf":1.4142135623730951},"156":{"tf":1.0},"159":{"tf":1.7320508075688772},"160":{"tf":1.7320508075688772},"161":{"tf":1.7320508075688772},"163":{"tf":1.4142135623730951},"164":{"tf":1.4142135623730951},"165":{"tf":1.4142135623730951},"166":{"tf":1.4142135623730951},"167":{"tf":1.4142135623730951},"168":{"tf":2.0},"169":{"tf":2.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"174":{"tf":2.23606797749979},"175":{"tf":1.4142135623730951},"177":{"tf":2.0},"178":{"tf":2.6457513110645907},"179":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"193":{"tf":1.7320508075688772},"196":{"tf":2.23606797749979},"201":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.4142135623730951},"222":{"tf":1.4142135623730951},"230":{"tf":1.0},"231":{"tf":1.4142135623730951},"234":{"tf":1.0},"240":{"tf":3.0},"243":{"tf":2.8284271247461903},"249":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.23606797749979},"258":{"tf":3.7416573867739413},"262":{"tf":1.0},"265":{"tf":1.4142135623730951},"268":{"tf":3.0},"269":{"tf":1.4142135623730951},"272":{"tf":1.7320508075688772},"275":{"tf":1.0},"279":{"tf":2.449489742783178},"283":{"tf":2.23606797749979},"287":{"tf":1.0},"288":{"tf":2.0},"292":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":2.0},"304":{"tf":4.69041575982343},"308":{"tf":1.4142135623730951},"309":{"tf":1.4142135623730951},"312":{"tf":4.69041575982343},"313":{"tf":1.0},"40":{"tf":3.1622776601683795},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":3.0},"70":{"tf":2.0},"72":{"tf":2.0},"76":{"tf":1.0},"77":{"tf":1.0},"78":{"tf":1.0},"81":{"tf":1.0},"82":{"tf":1.0},"83":{"tf":1.0},"90":{"tf":2.449489742783178},"92":{"tf":1.7320508075688772},"95":{"tf":2.0},"96":{"tf":2.0},"97":{"tf":1.7320508075688772},"98":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":6,"docs":{"109":{"tf":1.0},"111":{"tf":1.0},"180":{"tf":1.0},"190":{"tf":1.0},"240":{"tf":2.0},"250":{"tf":1.7320508075688772}}},"df":0,"docs":{}},"6":{"4":{":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"230":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":2,"docs":{"190":{"tf":1.0},"275":{"tf":2.449489742783178}}},"df":0,"docs":{}},"8":{"(":{"0":{"df":1,"docs":{"230":{"tf":1.0}}},"1":{"0":{"0":{"0":{"df":1,"docs":{"316":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"5":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"6":{"df":1,"docs":{"230":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"279":{"tf":1.0}}},"df":0,"docs":{}},":":{":":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"x":{"df":3,"docs":{"230":{"tf":1.4142135623730951},"237":{"tf":1.0},"240":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"237":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"[":{"1":{"0":{"0":{"df":1,"docs":{"134":{"tf":1.0}}},"df":1,"docs":{"296":{"tf":1.0}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{},"n":{"df":1,"docs":{"292":{"tf":1.4142135623730951}}}},"df":19,"docs":{"115":{"tf":1.0},"134":{"tf":1.0},"162":{"tf":1.7320508075688772},"163":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.4142135623730951},"237":{"tf":1.7320508075688772},"240":{"tf":1.7320508075688772},"243":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.7320508075688772},"283":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.4142135623730951},"304":{"tf":3.872983346207417},"309":{"tf":2.6457513110645907},"312":{"tf":1.0},"313":{"tf":1.0},"316":{"tf":1.4142135623730951}}},"df":0,"docs":{},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"10":{"tf":1.0},"279":{"tf":1.0}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"321":{"tf":1.0},"324":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"113":{"tf":1.0},"172":{"tf":1.0},"185":{"tf":2.6457513110645907},"250":{"tf":1.0},"287":{"tf":1.0}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"185":{"tf":1.0}}}}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"309":{"tf":1.0}}}}},"r":{"df":2,"docs":{"171":{"tf":1.0},"30":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"292":{"tf":1.0},"312":{"tf":1.4142135623730951}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"237":{"tf":1.0}},"n":{"df":2,"docs":{"296":{"tf":1.0},"304":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":4,"docs":{"127":{"tf":2.0},"249":{"tf":1.0},"271":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"74":{"tf":1.0}}}},"s":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"310":{"tf":1.0}},"v":{"3":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"t":{"df":13,"docs":{"164":{"tf":1.0},"170":{"tf":1.0},"174":{"tf":1.4142135623730951},"187":{"tf":1.0},"191":{"tf":2.449489742783178},"196":{"tf":1.0},"198":{"tf":1.7320508075688772},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"271":{"tf":1.0},"302":{"tf":1.0},"33":{"tf":1.0},"40":{"tf":1.0}}},"x":{"df":1,"docs":{"40":{"tf":1.0}}}},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"281":{"tf":1.0}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"141":{"tf":1.0},"144":{"tf":1.0},"40":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"41":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"269":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"326":{"tf":1.0}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"f":{"df":6,"docs":{"222":{"tf":1.0},"230":{"tf":1.0},"258":{"tf":2.8284271247461903},"268":{"tf":1.0},"271":{"tf":1.4142135623730951},"279":{"tf":2.23606797749979}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":6,"docs":{"190":{"tf":1.0},"197":{"tf":1.0},"250":{"tf":1.7320508075688772},"292":{"tf":1.0},"312":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"327":{"tf":1.0},"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"160":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"326":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":13,"docs":{"153":{"tf":1.0},"211":{"tf":1.0},"26":{"tf":1.0},"266":{"tf":1.0},"302":{"tf":1.0},"312":{"tf":1.0},"318":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":2.23606797749979},"66":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"312":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"156":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":9,"docs":{"13":{"tf":1.0},"217":{"tf":1.0},"266":{"tf":1.0},"280":{"tf":1.0},"294":{"tf":1.0},"312":{"tf":1.0},"41":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"237":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"138":{"tf":1.0},"139":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"62":{"tf":1.0},"66":{"tf":1.0}}}},"df":0,"docs":{}}}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"280":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"l":{"df":5,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"219":{"tf":1.0}}}},"s":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"240":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":4,"docs":{"237":{"tf":1.0},"240":{"tf":1.0},"25":{"tf":1.0},"316":{"tf":1.0}}}},"df":133,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.7320508075688772},"115":{"tf":1.0},"118":{"tf":1.7320508075688772},"119":{"tf":1.7320508075688772},"130":{"tf":2.449489742783178},"131":{"tf":1.0},"132":{"tf":1.4142135623730951},"133":{"tf":1.4142135623730951},"135":{"tf":1.7320508075688772},"136":{"tf":1.0},"139":{"tf":1.0},"14":{"tf":1.7320508075688772},"140":{"tf":1.7320508075688772},"141":{"tf":1.7320508075688772},"142":{"tf":1.4142135623730951},"143":{"tf":1.4142135623730951},"146":{"tf":1.0},"15":{"tf":1.7320508075688772},"152":{"tf":1.7320508075688772},"153":{"tf":1.4142135623730951},"158":{"tf":1.0},"159":{"tf":1.0},"16":{"tf":1.0},"164":{"tf":1.7320508075688772},"165":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"17":{"tf":1.4142135623730951},"171":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"185":{"tf":1.0},"189":{"tf":1.0},"19":{"tf":2.6457513110645907},"191":{"tf":1.4142135623730951},"196":{"tf":1.4142135623730951},"2":{"tf":1.0},"20":{"tf":1.4142135623730951},"200":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"212":{"tf":1.0},"215":{"tf":1.0},"216":{"tf":1.0},"219":{"tf":2.23606797749979},"22":{"tf":1.0},"222":{"tf":1.7320508075688772},"223":{"tf":1.0},"23":{"tf":1.0},"230":{"tf":2.449489742783178},"231":{"tf":1.0},"233":{"tf":1.0},"235":{"tf":1.0},"237":{"tf":1.4142135623730951},"24":{"tf":1.0},"240":{"tf":2.449489742783178},"241":{"tf":1.4142135623730951},"243":{"tf":1.7320508075688772},"25":{"tf":1.0},"250":{"tf":1.0},"255":{"tf":2.0},"256":{"tf":1.0},"258":{"tf":2.449489742783178},"26":{"tf":2.23606797749979},"265":{"tf":1.7320508075688772},"266":{"tf":1.0},"269":{"tf":1.0},"27":{"tf":1.0},"271":{"tf":1.4142135623730951},"273":{"tf":1.4142135623730951},"275":{"tf":1.0},"277":{"tf":1.0},"279":{"tf":2.23606797749979},"28":{"tf":1.7320508075688772},"281":{"tf":1.4142135623730951},"287":{"tf":1.0},"288":{"tf":1.0},"29":{"tf":1.7320508075688772},"292":{"tf":1.4142135623730951},"293":{"tf":1.7320508075688772},"296":{"tf":1.7320508075688772},"299":{"tf":1.0},"30":{"tf":2.0},"302":{"tf":1.4142135623730951},"305":{"tf":1.0},"306":{"tf":1.0},"308":{"tf":1.0},"309":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"312":{"tf":2.0},"313":{"tf":1.0},"315":{"tf":1.0},"32":{"tf":2.23606797749979},"321":{"tf":1.0},"323":{"tf":1.0},"326":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.0},"40":{"tf":3.7416573867739413},"41":{"tf":2.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.7320508075688772},"44":{"tf":1.7320508075688772},"45":{"tf":2.449489742783178},"46":{"tf":2.449489742783178},"47":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":2.23606797749979},"50":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"57":{"tf":1.4142135623730951},"67":{"tf":1.0},"68":{"tf":1.0},"69":{"tf":2.23606797749979},"79":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"84":{"tf":1.0},"9":{"tf":1.4142135623730951}},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"b":{"df":1,"docs":{"262":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":17,"docs":{"1":{"tf":1.0},"187":{"tf":1.4142135623730951},"19":{"tf":1.0},"21":{"tf":1.7320508075688772},"211":{"tf":1.0},"240":{"tf":1.0},"266":{"tf":1.4142135623730951},"279":{"tf":1.0},"287":{"tf":1.0},"293":{"tf":1.0},"313":{"tf":1.4142135623730951},"40":{"tf":1.0},"41":{"tf":1.7320508075688772},"42":{"tf":2.0},"44":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"s":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"x":{"df":1,"docs":{"143":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"r":{"/":{"df":0,"docs":{},"s":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"d":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"u":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"f":{"df":1,"docs":{"197":{"tf":1.0}}},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"277":{"tf":1.7320508075688772},"314":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"32":{"tf":1.0}}}},":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"4":{"2":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"0":{".":{"8":{".":{"0":{"df":1,"docs":{"318":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"df":1,"docs":{"212":{"tf":2.23606797749979}}},"a":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"=":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.0}}}}}},"df":2,"docs":{"268":{"tf":1.0},"312":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}},"e":{"(":{"df":0,"docs":{},"v":{"df":3,"docs":{"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"1":{"df":4,"docs":{"160":{"tf":1.0},"161":{"tf":1.4142135623730951},"175":{"tf":1.4142135623730951},"177":{"tf":1.0}}},"2":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"288":{"tf":1.0}}},"3":{"df":1,"docs":{"160":{"tf":1.0}}},"4":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"df":1,"docs":{"160":{"tf":1.0}}},"6":{"df":1,"docs":{"160":{"tf":1.0}}},"7":{"df":1,"docs":{"160":{"tf":1.0}}},"8":{")":{")":{":":{"(":{"df":0,"docs":{},"u":{"2":{"5":{"6":{"df":1,"docs":{"160":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"1":{"df":1,"docs":{"313":{"tf":1.0}}},"2":{"df":1,"docs":{"313":{"tf":1.0}}},"df":0,"docs":{}},"df":13,"docs":{"165":{"tf":1.0},"170":{"tf":1.7320508075688772},"171":{"tf":1.4142135623730951},"173":{"tf":1.0},"230":{"tf":1.0},"234":{"tf":1.0},"243":{"tf":2.0},"255":{"tf":2.0},"279":{"tf":1.0},"280":{"tf":1.0},"288":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}},"i":{"d":{"df":7,"docs":{"197":{"tf":1.0},"237":{"tf":1.0},"289":{"tf":1.0},"302":{"tf":1.0},"310":{"tf":1.0},"43":{"tf":1.0},"66":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":67,"docs":{"10":{"tf":1.7320508075688772},"113":{"tf":1.0},"123":{"tf":1.0},"13":{"tf":1.4142135623730951},"133":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":3.3166247903554},"146":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"159":{"tf":1.0},"161":{"tf":1.7320508075688772},"162":{"tf":1.0},"163":{"tf":1.4142135623730951},"164":{"tf":2.0},"166":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"174":{"tf":1.4142135623730951},"175":{"tf":1.0},"177":{"tf":2.0},"179":{"tf":1.0},"181":{"tf":1.0},"187":{"tf":1.7320508075688772},"189":{"tf":1.7320508075688772},"19":{"tf":1.0},"191":{"tf":2.23606797749979},"192":{"tf":1.0},"196":{"tf":2.449489742783178},"197":{"tf":2.0},"200":{"tf":1.7320508075688772},"201":{"tf":2.0},"203":{"tf":2.449489742783178},"204":{"tf":1.4142135623730951},"205":{"tf":1.0},"206":{"tf":1.4142135623730951},"207":{"tf":1.0},"230":{"tf":1.7320508075688772},"233":{"tf":1.0},"240":{"tf":1.4142135623730951},"243":{"tf":1.0},"256":{"tf":1.0},"258":{"tf":3.4641016151377544},"265":{"tf":1.4142135623730951},"271":{"tf":1.4142135623730951},"275":{"tf":1.0},"279":{"tf":1.4142135623730951},"280":{"tf":2.8284271247461903},"292":{"tf":1.7320508075688772},"299":{"tf":1.0},"302":{"tf":1.4142135623730951},"308":{"tf":1.0},"309":{"tf":1.0},"312":{"tf":2.23606797749979},"313":{"tf":1.0},"314":{"tf":1.0},"316":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"37":{"tf":1.0},"40":{"tf":2.8284271247461903},"41":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":2.6457513110645907}},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"299":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"299":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":1,"docs":{"279":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"299":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"302":{"tf":1.0}}}}}},"s":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"0":{"df":1,"docs":{"161":{"tf":1.0}}},"df":0,"docs":{}}}}}},"[":{"5":{"df":1,"docs":{"177":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":22,"docs":{"130":{"tf":1.4142135623730951},"137":{"tf":2.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"148":{"tf":1.0},"152":{"tf":1.4142135623730951},"160":{"tf":1.7320508075688772},"161":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"187":{"tf":1.0},"240":{"tf":1.4142135623730951},"255":{"tf":1.0},"281":{"tf":1.0},"283":{"tf":1.4142135623730951},"287":{"tf":1.0},"309":{"tf":1.0},"40":{"tf":3.7416573867739413},"41":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}},"e":{"d":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"141":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"240":{"tf":1.0},"297":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"u":{"df":4,"docs":{"127":{"tf":1.0},"191":{"tf":1.0},"289":{"tf":1.0},"52":{"tf":1.0}}}}}}},"df":7,"docs":{"196":{"tf":1.0},"230":{"tf":1.0},"25":{"tf":1.0},"69":{"tf":1.0},"70":{"tf":1.0},"72":{"tf":1.0},"73":{"tf":1.0}},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"108":{"tf":1.7320508075688772},"109":{"tf":1.4142135623730951},"110":{"tf":1.0}}}}}},"df":1,"docs":{"27":{"tf":1.0}},"r":{"b":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"164":{"tf":1.0},"219":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":4,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":1.0},"19":{"tf":1.0}},"f":{"df":2,"docs":{"219":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":4,"docs":{"219":{"tf":2.6457513110645907},"296":{"tf":1.0},"52":{"tf":1.0},"69":{"tf":1.4142135623730951}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"=":{"0":{".":{"2":{"3":{".":{"0":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":2,"docs":{"60":{"tf":1.0},"61":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":18,"docs":{"119":{"tf":1.0},"136":{"tf":1.4142135623730951},"158":{"tf":1.7320508075688772},"19":{"tf":1.0},"215":{"tf":1.0},"226":{"tf":1.4142135623730951},"237":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"30":{"tf":2.23606797749979},"312":{"tf":1.0},"315":{"tf":1.0},"330":{"tf":1.0},"59":{"tf":1.7320508075688772},"60":{"tf":1.4142135623730951},"61":{"tf":1.0},"64":{"tf":1.4142135623730951},"65":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"158":{"tf":1.4142135623730951}}}}}}}}}}}}}},"i":{"a":{"df":22,"docs":{"130":{"tf":1.0},"141":{"tf":1.0},"150":{"tf":1.0},"152":{"tf":1.0},"16":{"tf":1.0},"160":{"tf":1.0},"174":{"tf":1.7320508075688772},"175":{"tf":1.0},"191":{"tf":1.0},"22":{"tf":1.0},"222":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.4142135623730951},"240":{"tf":2.0},"241":{"tf":1.0},"243":{"tf":1.0},"252":{"tf":1.0},"253":{"tf":1.0},"27":{"tf":1.0},"281":{"tf":1.0},"316":{"tf":1.0},"323":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":5,"docs":{"119":{"tf":1.0},"146":{"tf":2.0},"240":{"tf":1.0},"44":{"tf":1.4142135623730951},"64":{"tf":1.0}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"321":{"tf":1.0}}}}}}}}},"o":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":5,"docs":{"325":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.4142135623730951},"328":{"tf":1.4142135623730951},"329":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"119":{"tf":1.0},"143":{"tf":1.0},"16":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":11,"docs":{"113":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":2.6457513110645907},"135":{"tf":1.4142135623730951},"138":{"tf":1.0},"160":{"tf":1.0},"193":{"tf":1.0},"241":{"tf":1.0},"265":{"tf":1.0},"308":{"tf":1.0},"320":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":1,"docs":{"65":{"tf":1.0}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"124":{"tf":1.0},"27":{"tf":1.4142135623730951},"312":{"tf":1.0}}}},"df":0,"docs":{}}}},"s":{"df":4,"docs":{"215":{"tf":1.0},"228":{"tf":1.0},"27":{"tf":1.0},"50":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}},"w":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"k":{"df":1,"docs":{"42":{"tf":1.0}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"21":{"tf":1.0},"35":{"tf":1.0}}}}}}}}}}},"n":{"df":0,"docs":{},"t":{"df":10,"docs":{"240":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.0},"45":{"tf":1.0},"63":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":1,"docs":{"46":{"tf":1.0}},"n":{"df":6,"docs":{"113":{"tf":1.0},"171":{"tf":1.0},"277":{"tf":1.0},"315":{"tf":1.0},"326":{"tf":1.0},"327":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":2,"docs":{"241":{"tf":1.0},"269":{"tf":1.0}}}},"df":0,"docs":{}},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"35":{"tf":1.0}}}},"df":0,"docs":{}},"y":{"df":15,"docs":{"152":{"tf":1.0},"18":{"tf":1.0},"187":{"tf":1.0},"209":{"tf":1.4142135623730951},"219":{"tf":1.0},"250":{"tf":1.0},"268":{"tf":1.4142135623730951},"276":{"tf":1.0},"306":{"tf":1.0},"320":{"tf":1.0},"36":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":2,"docs":{"240":{"tf":1.0},"8":{"tf":1.0}}}},"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"276":{"tf":1.0}}}},"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":4,"docs":{"19":{"tf":1.0},"64":{"tf":1.7320508075688772},"65":{"tf":1.0},"66":{"tf":1.7320508075688772}}}}}},"df":0,"docs":{},"i":{"df":6,"docs":{"149":{"tf":1.0},"255":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"45":{"tf":1.4142135623730951},"48":{"tf":1.4142135623730951}}},"l":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":5,"docs":{"21":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":1.0},"320":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"df":6,"docs":{"126":{"tf":1.0},"138":{"tf":1.0},"20":{"tf":1.0},"240":{"tf":1.0},"327":{"tf":1.0},"41":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":3,"docs":{"145":{"tf":1.0},"177":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{},"v":{"df":1,"docs":{"159":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":8,"docs":{"106":{"tf":1.0},"143":{"tf":1.0},"240":{"tf":1.4142135623730951},"249":{"tf":1.0},"40":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"43":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951}}}}}}},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"141":{"tf":1.0},"167":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"197":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"243":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"283":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"193":{"tf":1.0}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"322":{"tf":1.0}}}},"l":{"d":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"(":{"_":{"df":1,"docs":{"240":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.4142135623730951}}}}}},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"22":{"tf":1.7320508075688772},"23":{"tf":1.0}}}}},"df":1,"docs":{"37":{"tf":1.0}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"48":{"tf":1.0}}}}}},"p":{"df":95,"docs":{"113":{"tf":1.0},"114":{"tf":1.0},"115":{"tf":1.0},"116":{"tf":1.0},"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0},"120":{"tf":1.0},"121":{"tf":1.0},"122":{"tf":1.0},"123":{"tf":1.0},"124":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"128":{"tf":1.0},"129":{"tf":1.0},"130":{"tf":1.0},"131":{"tf":1.0},"132":{"tf":1.0},"133":{"tf":1.0},"134":{"tf":1.0},"135":{"tf":1.0},"136":{"tf":1.0},"137":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"140":{"tf":1.0},"141":{"tf":1.0},"142":{"tf":1.0},"143":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0},"146":{"tf":1.0},"147":{"tf":1.0},"148":{"tf":1.0},"149":{"tf":1.0},"150":{"tf":1.0},"151":{"tf":1.0},"152":{"tf":1.0},"153":{"tf":1.0},"154":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0},"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"200":{"tf":1.0},"201":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0},"205":{"tf":1.0},"206":{"tf":1.0},"207":{"tf":1.0}}},"t":{"df":1,"docs":{"313":{"tf":1.0}},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"48":{"tf":1.0}}}}}},"df":3,"docs":{"37":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":2.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"130":{"tf":1.7320508075688772},"138":{"tf":1.0},"141":{"tf":1.0},"168":{"tf":2.0},"169":{"tf":2.0},"18":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"279":{"tf":1.7320508075688772},"292":{"tf":1.0},"305":{"tf":1.0},"323":{"tf":1.0},"329":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":16,"docs":{"1":{"tf":1.0},"141":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"171":{"tf":1.0},"174":{"tf":1.0},"23":{"tf":1.0},"249":{"tf":1.0},"250":{"tf":1.7320508075688772},"302":{"tf":1.0},"313":{"tf":2.0},"321":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"64":{"tf":1.0},"9":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"'":{"df":0,"docs":{},"t":{"df":4,"docs":{"13":{"tf":1.0},"272":{"tf":1.0},"296":{"tf":1.0},"64":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":2,"docs":{"197":{"tf":1.0},"250":{"tf":1.0}}},"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"316":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":14,"docs":{"113":{"tf":1.0},"152":{"tf":1.0},"210":{"tf":1.0},"212":{"tf":2.0},"230":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"275":{"tf":1.0},"28":{"tf":1.0},"293":{"tf":1.0},"3":{"tf":1.0},"316":{"tf":1.0},"40":{"tf":1.0},"9":{"tf":1.0}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":2,"docs":{"26":{"tf":1.0},"57":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"df":4,"docs":{"13":{"tf":1.0},"19":{"tf":1.0},"53":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"b":{"a":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}},"z":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"196":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":18,"docs":{"1":{"tf":1.7320508075688772},"10":{"tf":1.0},"12":{"tf":1.0},"141":{"tf":1.4142135623730951},"146":{"tf":2.8284271247461903},"152":{"tf":1.0},"153":{"tf":1.0},"156":{"tf":1.4142135623730951},"16":{"tf":1.0},"177":{"tf":1.0},"227":{"tf":1.0},"233":{"tf":1.0},"33":{"tf":1.0},"39":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"7":{"tf":2.23606797749979},"8":{"tf":1.0},"9":{"tf":1.4142135623730951}},"r":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"107":{"tf":3.4641016151377544},"230":{"tf":3.4641016151377544}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":2,"docs":{"107":{"tf":1.0},"230":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":13,"docs":{"135":{"tf":1.0},"164":{"tf":1.0},"174":{"tf":1.0},"182":{"tf":1.0},"192":{"tf":1.0},"20":{"tf":1.0},"275":{"tf":1.0},"281":{"tf":1.4142135623730951},"30":{"tf":1.0},"326":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"8":{"tf":1.7320508075688772}}}}}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"255":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"16":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"23":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"146":{"tf":1.0}}}}},"x":{"1":{"df":3,"docs":{"178":{"tf":1.0},"240":{"tf":1.0},"95":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"8":{"6":{"df":1,"docs":{"22":{"tf":1.0}}},"df":0,"docs":{}},"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"240":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{".":{".":{"b":{"df":1,"docs":{"115":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":27,"docs":{"100":{"tf":1.4142135623730951},"103":{"tf":1.4142135623730951},"115":{"tf":2.8284271247461903},"131":{"tf":1.0},"141":{"tf":2.23606797749979},"178":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0},"188":{"tf":1.0},"231":{"tf":1.4142135623730951},"240":{"tf":2.23606797749979},"243":{"tf":2.23606797749979},"244":{"tf":1.0},"25":{"tf":1.4142135623730951},"250":{"tf":1.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.7320508075688772},"265":{"tf":1.4142135623730951},"271":{"tf":1.0},"275":{"tf":2.0},"279":{"tf":1.0},"287":{"tf":1.0},"296":{"tf":1.0},"312":{"tf":2.0},"6":{"tf":1.0},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"182":{"tf":1.0}}}}},"y":{"1":{"df":4,"docs":{"240":{"tf":1.0},"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"2":{"df":3,"docs":{"95":{"tf":1.0},"96":{"tf":1.0},"98":{"tf":1.0}}},"=":{"0":{"df":1,"docs":{"275":{"tf":1.0}}},"2":{"0":{"0":{"df":1,"docs":{"258":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"275":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"231":{"tf":1.0}}}}}}},"df":1,"docs":{"250":{"tf":1.0}}}},"df":17,"docs":{"100":{"tf":1.4142135623730951},"101":{"tf":1.0},"103":{"tf":1.4142135623730951},"131":{"tf":1.4142135623730951},"141":{"tf":2.449489742783178},"178":{"tf":1.4142135623730951},"185":{"tf":1.0},"240":{"tf":2.23606797749979},"243":{"tf":2.0},"255":{"tf":1.4142135623730951},"258":{"tf":1.4142135623730951},"265":{"tf":1.7320508075688772},"275":{"tf":2.23606797749979},"296":{"tf":1.4142135623730951},"312":{"tf":2.449489742783178},"95":{"tf":1.4142135623730951},"98":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"135":{"tf":1.0},"68":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"df":4,"docs":{"119":{"tf":1.0},"141":{"tf":1.0},"185":{"tf":1.7320508075688772},"293":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"u":{"'":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}}}},"v":{"df":2,"docs":{"18":{"tf":1.0},"19":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"l":{"'":{"df":2,"docs":{"247":{"tf":1.0},"271":{"tf":1.0}}},"c":{"df":1,"docs":{"294":{"tf":1.0}}},"df":12,"docs":{"1":{"tf":1.0},"223":{"tf":1.0},"250":{"tf":1.4142135623730951},"271":{"tf":1.0},"276":{"tf":1.0},"277":{"tf":1.7320508075688772},"288":{"tf":1.0},"309":{"tf":1.4142135623730951},"310":{"tf":1.0},"312":{"tf":1.0},"313":{"tf":1.7320508075688772},"57":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"277":{"tf":1.4142135623730951}}}}}}}},"z":{"df":4,"docs":{"115":{"tf":1.0},"120":{"tf":2.449489742783178},"185":{"tf":1.0},"296":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":9,"docs":{"141":{"tf":1.0},"177":{"tf":1.4142135623730951},"18":{"tf":1.4142135623730951},"182":{"tf":1.0},"191":{"tf":1.0},"241":{"tf":1.0},"292":{"tf":1.4142135623730951},"42":{"tf":1.0},"45":{"tf":1.4142135623730951}}}}},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}}},"title":{"root":{"0":{".":{"1":{".":{"0":{"df":1,"docs":{"315":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"278":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"274":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"270":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"267":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"257":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"254":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"251":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"248":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"245":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"242":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"311":{"tf":1.0}}},"df":0,"docs":{}},"0":{".":{"0":{"df":1,"docs":{"239":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"236":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"0":{"df":1,"docs":{"232":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"229":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"225":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"221":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"218":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"307":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{".":{"0":{"df":1,"docs":{"303":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"0":{"df":1,"docs":{"298":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"df":1,"docs":{"295":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"0":{"df":1,"docs":{"291":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{".":{"0":{"df":1,"docs":{"286":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"0":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"df":3,"docs":{"229":{"tf":1.0},"267":{"tf":1.4142135623730951},"315":{"tf":1.0}}},"2":{"df":4,"docs":{"236":{"tf":1.0},"257":{"tf":1.0},"274":{"tf":1.0},"311":{"tf":1.0}}},"3":{"df":3,"docs":{"218":{"tf":1.0},"257":{"tf":1.0},"307":{"tf":1.0}}},"4":{"df":3,"docs":{"232":{"tf":1.0},"254":{"tf":1.4142135623730951},"303":{"tf":1.0}}},"5":{"df":6,"docs":{"232":{"tf":1.0},"239":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.4142135623730951},"298":{"tf":1.0}}},"6":{"df":3,"docs":{"229":{"tf":1.0},"242":{"tf":1.0},"295":{"tf":1.0}}},"7":{"df":2,"docs":{"242":{"tf":1.0},"291":{"tf":1.0}}},"8":{"df":2,"docs":{"225":{"tf":1.0},"286":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"df":0,"docs":{}},"1":{"0":{"df":4,"docs":{"221":{"tf":1.0},"225":{"tf":1.0},"278":{"tf":1.0},"295":{"tf":1.0}}},"1":{"df":1,"docs":{"218":{"tf":1.0}}},"2":{"df":3,"docs":{"239":{"tf":1.0},"270":{"tf":1.4142135623730951},"274":{"tf":1.0}}},"df":2,"docs":{"210":{"tf":1.0},"326":{"tf":1.0}}},"2":{"0":{"2":{"1":{"df":12,"docs":{"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"2":{"df":8,"docs":{"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951}}},"3":{"df":6,"docs":{"218":{"tf":1.0},"221":{"tf":1.0},"225":{"tf":1.0},"229":{"tf":1.0},"232":{"tf":1.0},"236":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"315":{"tf":1.0}}},"4":{"df":1,"docs":{"307":{"tf":1.0}}},"6":{"df":2,"docs":{"221":{"tf":1.0},"248":{"tf":1.0}}},"7":{"df":4,"docs":{"245":{"tf":1.0},"291":{"tf":1.0},"298":{"tf":1.0},"311":{"tf":1.0}}},"8":{"df":2,"docs":{"236":{"tf":1.0},"303":{"tf":1.0}}},"9":{"df":1,"docs":{"282":{"tf":1.0}}},"df":2,"docs":{"211":{"tf":1.0},"327":{"tf":1.0}}},"3":{"1":{"df":4,"docs":{"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"278":{"tf":1.0},"286":{"tf":1.0}}},"df":2,"docs":{"212":{"tf":1.0},"328":{"tf":1.0}}},"4":{"df":2,"docs":{"213":{"tf":1.0},"329":{"tf":1.0}}},"_":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"_":{"df":1,"docs":{"139":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"a":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"146":{"tf":1.0}}}},"d":{"d":{"df":3,"docs":{"10":{"tf":1.0},"25":{"tf":1.0},"9":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"195":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"s":{"df":1,"docs":{"134":{"tf":1.0}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"h":{"a":{"df":21,"docs":{"236":{"tf":1.0},"239":{"tf":1.0},"242":{"tf":1.0},"245":{"tf":1.0},"248":{"tf":1.0},"251":{"tf":1.0},"254":{"tf":1.0},"257":{"tf":1.0},"267":{"tf":1.4142135623730951},"270":{"tf":1.4142135623730951},"274":{"tf":1.0},"278":{"tf":1.0},"282":{"tf":1.0},"286":{"tf":1.0},"291":{"tf":1.0},"295":{"tf":1.0},"298":{"tf":1.0},"303":{"tf":1.0},"307":{"tf":1.0},"311":{"tf":1.0},"315":{"tf":1.0}}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"315":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"182":{"tf":1.0}}}}}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"192":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"171":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":3,"docs":{"161":{"tf":1.0},"162":{"tf":1.0},"265":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"178":{"tf":1.0},"330":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":3,"docs":{"36":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0}}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"162":{"tf":1.0}}}}}}}}},"b":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"328":{"tf":1.0},"329":{"tf":1.0}}}},"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}},"l":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"_":{"2":{"df":0,"docs":{},"f":{"df":1,"docs":{"108":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"151":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":1,"docs":{"54":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":3,"docs":{"125":{"tf":1.0},"184":{"tf":1.0},"188":{"tf":1.0}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"311":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"k":{"df":1,"docs":{"168":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"263":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":21,"docs":{"223":{"tf":1.0},"231":{"tf":1.0},"234":{"tf":1.0},"238":{"tf":1.0},"241":{"tf":1.0},"244":{"tf":1.0},"247":{"tf":1.0},"250":{"tf":1.0},"253":{"tf":1.0},"256":{"tf":1.0},"269":{"tf":1.0},"272":{"tf":1.0},"276":{"tf":1.0},"280":{"tf":1.0},"284":{"tf":1.0},"288":{"tf":1.0},"293":{"tf":1.0},"300":{"tf":1.0},"305":{"tf":1.0},"309":{"tf":1.0},"313":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"df":3,"docs":{"26":{"tf":1.0},"45":{"tf":1.0},"57":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"307":{"tf":1.0}}}}}},"df":0,"docs":{},"l":{"df":1,"docs":{"173":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":13,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"128":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"213":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"183":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"n":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"319":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"146":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":6,"docs":{"203":{"tf":1.0},"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0}}}}},"df":1,"docs":{"159":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"142":{"tf":1.0},"144":{"tf":1.0},"145":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"169":{"tf":1.0}}}}},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":12,"docs":{"11":{"tf":1.0},"135":{"tf":1.0},"138":{"tf":1.0},"155":{"tf":1.0},"156":{"tf":1.0},"189":{"tf":1.0},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"45":{"tf":1.0},"47":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"208":{"tf":1.0},"209":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":14,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"319":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"326":{"tf":1.0}}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"319":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"29":{"tf":1.0},"8":{"tf":1.0}},"e":{"/":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"2":{"df":1,"docs":{"150":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"200":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"40":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"y":{"df":6,"docs":{"11":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"19":{"tf":1.0},"45":{"tf":1.0},"66":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":3,"docs":{"14":{"tf":1.0},"212":{"tf":1.0},"56":{"tf":1.0}}}}}}}},"o":{"c":{"df":3,"docs":{"211":{"tf":1.0},"64":{"tf":1.0},"66":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":7,"docs":{"220":{"tf":1.0},"224":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":2,"docs":{"24":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"c":{"_":{"a":{"d":{"d":{"df":1,"docs":{"94":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"99":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"104":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"69":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"63":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"27":{"tf":1.0}}}}}}},"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"322":{"tf":1.0},"324":{"tf":1.0},"325":{"tf":1.0}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"213":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":2,"docs":{"133":{"tf":1.0},"194":{"tf":1.0}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"14":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.0}}}}}},"x":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":13,"docs":{"103":{"tf":1.0},"107":{"tf":1.0},"112":{"tf":1.0},"124":{"tf":1.0},"147":{"tf":1.0},"154":{"tf":1.0},"47":{"tf":1.0},"73":{"tf":1.0},"78":{"tf":1.0},"83":{"tf":1.0},"88":{"tf":1.0},"93":{"tf":1.0},"98":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":12,"docs":{"172":{"tf":1.0},"173":{"tf":1.0},"174":{"tf":1.0},"175":{"tf":1.0},"176":{"tf":1.0},"177":{"tf":1.0},"178":{"tf":1.0},"179":{"tf":1.0},"180":{"tf":1.0},"181":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"49":{"tf":1.0}}}}}}}},"f":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":27,"docs":{"219":{"tf":1.0},"222":{"tf":1.0},"226":{"tf":1.0},"230":{"tf":1.0},"233":{"tf":1.0},"237":{"tf":1.0},"240":{"tf":1.0},"243":{"tf":1.0},"246":{"tf":1.0},"249":{"tf":1.0},"252":{"tf":1.0},"255":{"tf":1.0},"258":{"tf":1.0},"259":{"tf":1.0},"268":{"tf":1.0},"271":{"tf":1.0},"275":{"tf":1.0},"279":{"tf":1.0},"283":{"tf":1.0},"287":{"tf":1.0},"292":{"tf":1.0},"296":{"tf":1.0},"299":{"tf":1.0},"304":{"tf":1.0},"308":{"tf":1.0},"312":{"tf":1.0},"316":{"tf":1.0}}}}}},"df":24,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"113":{"tf":1.0},"2":{"tf":1.0},"212":{"tf":1.0},"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"28":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"3":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0},"48":{"tf":1.0},"6":{"tf":1.0},"67":{"tf":1.0},"7":{"tf":1.0}},"l":{"d":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"295":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.0}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"x":{"df":4,"docs":{"210":{"tf":1.0},"263":{"tf":1.0},"264":{"tf":1.0},"265":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":14,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"138":{"tf":1.0},"139":{"tf":1.0},"141":{"tf":1.0},"199":{"tf":1.0},"205":{"tf":1.0},"44":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"g":{"a":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"291":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"262":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"63":{"tf":1.0}}},"df":0,"docs":{}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"115":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{".":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}}},"i":{"d":{"df":1,"docs":{"21":{"tf":1.0}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"325":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"h":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"x":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"286":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}}}}}},"i":{"c":{"df":2,"docs":{"264":{"tf":1.0},"265":{"tf":1.0}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"84":{"tf":1.0}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"120":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"32":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":9,"docs":{"211":{"tf":1.0},"220":{"tf":1.0},"224":{"tf":1.0},"227":{"tf":1.0},"228":{"tf":1.0},"235":{"tf":1.0},"289":{"tf":1.0},"301":{"tf":1.0},"317":{"tf":1.0}}}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"177":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"22":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"127":{"tf":1.0}}},"r":{"df":0,"docs":{},"n":{"df":13,"docs":{"266":{"tf":1.0},"273":{"tf":1.0},"277":{"tf":1.0},"281":{"tf":1.0},"285":{"tf":1.0},"290":{"tf":1.0},"294":{"tf":1.0},"297":{"tf":1.0},"302":{"tf":1.0},"306":{"tf":1.0},"310":{"tf":1.0},"314":{"tf":1.0},"318":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":2,"docs":{"210":{"tf":1.0},"215":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"129":{"tf":1.0}}}}}},"k":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"274":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"117":{"tf":1.0},"118":{"tf":1.0},"119":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"113":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"200":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"116":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"67":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":1,"docs":{"49":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"175":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"123":{"tf":1.0},"125":{"tf":1.0},"126":{"tf":1.0},"127":{"tf":1.0},"181":{"tf":1.0}}}}}},"o":{"c":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"260":{"tf":1.0},"65":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":2,"docs":{"196":{"tf":1.0},"204":{"tf":1.0}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"170":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"206":{"tf":1.0},"207":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":2,"docs":{"10":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"264":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"p":{"df":1,"docs":{"89":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":1,"docs":{"148":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"145":{"tf":1.0},"153":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":1,"docs":{"179":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"15":{"tf":1.0},"19":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"122":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"114":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"217":{"tf":1.0},"60":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"151":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"190":{"tf":1.0}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"144":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"182":{"tf":1.0},"183":{"tf":1.0},"184":{"tf":1.0},"185":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":9,"docs":{"100":{"tf":1.0},"105":{"tf":1.0},"109":{"tf":1.0},"70":{"tf":1.0},"75":{"tf":1.0},"80":{"tf":1.0},"85":{"tf":1.0},"90":{"tf":1.0},"95":{"tf":1.0}}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"180":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":1,"docs":{"227":{"tf":1.0}}}}}},"m":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"329":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"25":{"tf":1.0}}}}}}}},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"320":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"m":{"a":{"df":2,"docs":{"136":{"tf":1.0},"158":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"68":{"tf":1.0}}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"65":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"v":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"214":{"tf":1.0}}}}}},"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"28":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"216":{"tf":1.0}}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"62":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"z":{"df":1,"docs":{"248":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"216":{"tf":1.0}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"143":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":3,"docs":{"10":{"tf":1.0},"155":{"tf":1.0},"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"s":{"df":6,"docs":{"217":{"tf":1.0},"58":{"tf":1.0},"60":{"tf":1.0},"61":{"tf":1.0},"62":{"tf":1.0},"63":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"210":{"tf":1.0},"215":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"216":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"119":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"322":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":10,"docs":{"102":{"tf":1.0},"106":{"tf":1.0},"110":{"tf":1.0},"164":{"tf":1.0},"71":{"tf":1.0},"76":{"tf":1.0},"81":{"tf":1.0},"86":{"tf":1.0},"91":{"tf":1.0},"97":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"163":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"d":{"_":{"1":{"6":{"0":{"df":1,"docs":{"79":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"b":{"df":0,"docs":{},"i":{"df":1,"docs":{"245":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":1,"docs":{"37":{"tf":1.0}}}},"n":{"df":1,"docs":{"34":{"tf":1.0}}}}},"s":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"323":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"152":{"tf":1.0}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"207":{"tf":1.0}}},"df":0,"docs":{}}}}}},"h":{"a":{"2":{"_":{"2":{"5":{"6":{"df":1,"docs":{"74":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":9,"docs":{"101":{"tf":1.0},"111":{"tf":1.0},"18":{"tf":1.0},"72":{"tf":1.0},"77":{"tf":1.0},"82":{"tf":1.0},"87":{"tf":1.0},"92":{"tf":1.0},"96":{"tf":1.0}}}}}},"df":2,"docs":{"17":{"tf":1.0},"9":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"65":{"tf":1.0}}}},"z":{"df":0,"docs":{},"e":{"df":1,"docs":{"203":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"3":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"113":{"tf":1.0}}}}},"df":0,"docs":{}}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"201":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"321":{"tf":1.0},"67":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"4":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"137":{"tf":1.0}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":15,"docs":{"157":{"tf":1.0},"158":{"tf":1.0},"159":{"tf":1.0},"160":{"tf":1.0},"161":{"tf":1.0},"162":{"tf":1.0},"163":{"tf":1.0},"164":{"tf":1.0},"165":{"tf":1.0},"166":{"tf":1.0},"167":{"tf":1.0},"168":{"tf":1.0},"169":{"tf":1.0},"170":{"tf":1.0},"171":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"155":{"tf":1.0},"156":{"tf":1.0},"202":{"tf":1.0},"203":{"tf":1.0},"204":{"tf":1.0}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"118":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"126":{"tf":1.0},"197":{"tf":1.0}}}}},"u":{"c":{"df":0,"docs":{},"t":{"df":4,"docs":{"131":{"tf":1.0},"140":{"tf":1.0},"176":{"tf":1.0},"193":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"116":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"20":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"242":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":4,"docs":{"260":{"tf":1.0},"261":{"tf":1.0},"262":{"tf":1.0},"27":{"tf":1.0}}}}}}}},"y":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"x":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"186":{"tf":1.0}}}}}}}},"t":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"62":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"328":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.0},"33":{"tf":1.0},"57":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"205":{"tf":1.0}}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"121":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"50":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"132":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"149":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"174":{"tf":1.0},"191":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"35":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"265":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":17,"docs":{"134":{"tf":1.0},"186":{"tf":1.0},"187":{"tf":1.0},"188":{"tf":1.0},"189":{"tf":1.0},"190":{"tf":1.0},"191":{"tf":1.0},"192":{"tf":1.0},"193":{"tf":1.0},"194":{"tf":1.0},"195":{"tf":1.0},"196":{"tf":1.0},"197":{"tf":1.0},"198":{"tf":1.0},"199":{"tf":1.0},"207":{"tf":1.0},"264":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"185":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"198":{"tf":1.0}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"64":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":2,"docs":{"48":{"tf":1.0},"49":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"21":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":2,"docs":{"203":{"tf":1.0},"265":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"137":{"tf":1.0},"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"59":{"tf":1.0}}}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"44":{"tf":1.0}}}},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"130":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"c":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"232":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"327":{"tf":1.0}}}},"y":{"df":1,"docs":{"209":{"tf":1.0}}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"64":{"tf":1.0},"66":{"tf":1.0}}}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"229":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"d":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"156":{"tf":1.0},"39":{"tf":1.0},"7":{"tf":1.0}}}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"225":{"tf":1.0}}}}}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"221":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"z":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"218":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}} \ No newline at end of file diff --git a/docs/spec/comments.html b/docs/spec/comments.html new file mode 100644 index 0000000000..1732ffb35c --- /dev/null +++ b/docs/spec/comments.html @@ -0,0 +1,233 @@ + + + + + + Comments - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Comments

+
+

Lexer
+LINE_COMMENT :
+      // *

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/data_layout/index.html b/docs/spec/data_layout/index.html new file mode 100644 index 0000000000..19cafec520 --- /dev/null +++ b/docs/spec/data_layout/index.html @@ -0,0 +1,238 @@ + + + + + + Data Layout - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Data Layout

+

There are three places where data can be stored on the EVM:

+
    +
  • stack: 256-bit values placed on the stack that are loaded using DUP operations.
  • +
  • storage: 256-bit address space where 256-bit values can be stored. Accessing higher +storage slots does not increase gas cost.
  • +
  • memory: 256-bit address space where 256-bit values can be stored. Accessing higher +memory slots increases gas cost.
  • +
+

Each data type can be stored in these locations. How data is stored is +described in this section.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/data_layout/memory/index.html b/docs/spec/data_layout/memory/index.html new file mode 100644 index 0000000000..4139121c27 --- /dev/null +++ b/docs/spec/data_layout/memory/index.html @@ -0,0 +1,233 @@ + + + + + + Memory - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Memory

+

Only sequence types can be stored in memory.

+

The first memory slot (0x00) is used to keep track of the lowest available memory slot. Newly +allocated segments begin at the value given by this slot. When more memory has been allocated, +the value stored in 0x00 is increased.

+

We do not free memory after it is allocated.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/data_layout/memory/sequence_types_in_memory.html b/docs/spec/data_layout/memory/sequence_types_in_memory.html new file mode 100644 index 0000000000..09ce395091 --- /dev/null +++ b/docs/spec/data_layout/memory/sequence_types_in_memory.html @@ -0,0 +1,237 @@ + + + + + + Sequence types in memory - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Sequence types in memory

+

Sequence type values may exceed the 256-bit stack slot size, so we store them in memory and +reference them using pointers kept on the stack.

+

Example:

+
fn f() {
+    let foo: Array<u256, 100> = [0; 100] // foo is a pointer that references 100 * 256 bits in memory.
+}
+
+

To find an element inside of a sequence type, the relative location of the element is added to the +given pointer.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/data_layout/stack.html b/docs/spec/data_layout/stack.html new file mode 100644 index 0000000000..e9db4fd4e1 --- /dev/null +++ b/docs/spec/data_layout/stack.html @@ -0,0 +1,241 @@ + + + + + + Stack - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Stack

+

The following can be stored on the stack:

+
    +
  • base type values
  • +
  • pointers to reference type values
  • +
+

The size of each value stored on the stack must not exceed 256 bits. Since all base types are less +than or equal to 256 bits in size, we store them on the stack. Pointers to values stored in memory or storage may also be stored on the stack.

+

Example:

+
fn f() {
+    let foo: u256 = 42 // foo is stored on the stack
+    let bar: Array<u256, 100> = [0; 100] // bar is a memory pointer stored on the stack
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/data_layout/storage/constant_size_values_in_storage.html b/docs/spec/data_layout/storage/constant_size_values_in_storage.html new file mode 100644 index 0000000000..c04aef505f --- /dev/null +++ b/docs/spec/data_layout/storage/constant_size_values_in_storage.html @@ -0,0 +1,238 @@ + + + + + + Constant size values in storage - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Constant size values in storage

+

Storage pointers for constant size values are determined at compile time.

+

Example:

+
contract Cats {
+   population: u256 // assigned a static location by the compiler
+}
+
+

The value of a base type in storage is found by simply loading the value from storage at the +given pointer.

+

To find an element inside of a sequence type, the relative location of the element is added to the +given pointer.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/data_layout/storage/index.html b/docs/spec/data_layout/storage/index.html new file mode 100644 index 0000000000..66d2dca9a6 --- /dev/null +++ b/docs/spec/data_layout/storage/index.html @@ -0,0 +1,229 @@ + + + + + + Storage - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Storage

+

All data types can be stored in storage.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/data_layout/storage/maps_in_storage.html b/docs/spec/data_layout/storage/maps_in_storage.html new file mode 100644 index 0000000000..bdca2a3824 --- /dev/null +++ b/docs/spec/data_layout/storage/maps_in_storage.html @@ -0,0 +1,239 @@ + + + + + + Maps in storage - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Maps in storage

+

Maps are not assigned pointers, because they do not have a location in storage. They are instead +assigned a nonce that is used to derive the location of keyed values during runtime.

+

Example:

+
contract Foo {
+  bar: Map<address, u256> // bar is assigned a static nonce by the compiler
+  baz: Map<address, Map<address, u256>> // baz is assigned a static nonce by the compiler
+}
+
+

The expression bar[0x00] would resolve to the hash of both bar's nonce and the key value +.i.e. keccak256(<bar nonce>, 0x00). Similarly, the expression baz[0x00][0x01] would resolve to +a nested hash i.e. keccak256(keccak256(<baz nonce>, 0x00), 0x01).

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/data_layout/storage/to_mem_function.html b/docs/spec/data_layout/storage/to_mem_function.html new file mode 100644 index 0000000000..7adda2f4f2 --- /dev/null +++ b/docs/spec/data_layout/storage/to_mem_function.html @@ -0,0 +1,232 @@ + + + + + + to_mem() function - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

The to_mem function

+

Reference type values can be copied from storage and into memory using the to_mem function.

+

Example:

+
let my_array_var: Array<u256, 10> = self.my_array_field.to_mem()
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/arithmetic_operators.html b/docs/spec/expressions/arithmetic_operators.html new file mode 100644 index 0000000000..d60aa64a35 --- /dev/null +++ b/docs/spec/expressions/arithmetic_operators.html @@ -0,0 +1,274 @@ + + + + + + Arithmetic Operators - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Arithmetic Operators

+
+

Syntax
+ArithmeticExpression :
+     Expression + Expression
+   | Expression - Expression
+   | Expression * Expression
+   | Expression / Expression
+   | Expression % Expression
+   | Expression ** Expression
+   | Expression & Expression
+   | Expression | Expression
+   | Expression ^ Expression
+   | Expression << Expression
+   | Expression >> Expression

+
+

Binary operators expressions are all written with infix notation. +This table summarizes the behavior of arithmetic and logical binary operators on +primitive types.

+
+ + + + + + + + + + + +
SymbolInteger
+Addition
-Subtraction
*Multiplication
/Division*
%Remainder
**Exponentiation
&Bitwise AND
|Bitwise OR
^Bitwise XOR
<<Left Shift
>>Right Shift
+
+

* Integer division rounds towards zero.

+

Here are examples of these operators being used.

+
3 + 6 == 9
+6 - 3 == 3
+2 * 3 == 6
+6 / 3 == 2
+5 % 4 == 1
+2 ** 4 == 16
+12 & 25 == 8
+12 | 25 == 29
+12 ^ 25 == 21
+212 << 1 == 424
+212 >> 1 == 106
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/attribute.html b/docs/spec/expressions/attribute.html new file mode 100644 index 0000000000..dde20edf3f --- /dev/null +++ b/docs/spec/expressions/attribute.html @@ -0,0 +1,258 @@ + + + + + + Attribute expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Attribute expressions

+
+

Syntax
+AttributeExpression :
+   Expression . IDENTIFIER

+
+

An attribute expression evaluates to the location of an attribute of a struct, tuple or contract.

+

The syntax for an attribute expression is an expression, then a . and finally an identifier.

+

Examples:

+
struct Point {
+    pub x: u256
+    pub y: u256
+}
+
+contract Foo {
+    some_point: Point
+    some_tuple: (bool, u256)
+
+    fn get_point() -> Point {
+        return Point(x: 100, y: 500)
+    }
+
+    pub fn baz(some_point: Point, some_tuple: (bool, u256)) {
+        // Different examples of attribute expressions
+        let bool_1: bool = some_tuple.item0
+        let x1: u256 = some_point.x
+        let point1: u256 = get_point().x
+        let point2: u256 = some_point.x
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/boolean_operators.html b/docs/spec/expressions/boolean_operators.html new file mode 100644 index 0000000000..6e2efeeac0 --- /dev/null +++ b/docs/spec/expressions/boolean_operators.html @@ -0,0 +1,238 @@ + + + + + + Boolean Operators - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Boolean Operators

+
+

Syntax
+BooleanExpression :
+     Expression or Expression
+   | Expression and Expression

+
+

The operators or and and may be applied to operands of boolean type. The or operator denotes logical 'or', and the and operator denotes logical 'and'.

+

Example:

+
const x: bool = false or true // true
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/call.html b/docs/spec/expressions/call.html new file mode 100644 index 0000000000..39c8d65067 --- /dev/null +++ b/docs/spec/expressions/call.html @@ -0,0 +1,254 @@ + + + + + + Call expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Call expressions

+
+

Syntax
+CallExpression :
+   Expression GenericArgs? ( CallParams? )

+

GenericArgs :
+   < IDENTIFIER | INTEGER_LITERAL (, IDENTIFIER | INTEGER_LITERAL)* >

+

CallParams :
+   CallArg ( , CallArg )* ,?

+

CallArg :
+   (CallArgLabel =)? Expression

+

CallArgLabel :
+   IDENTIFIERLabel must correspond to the name of the called function argument at the given position. It can be omitted if parameter name and the name of the called function argument are equal.

+
+

A call expression calls a function. The syntax of a call expression is an expression, followed by a parenthesized comma-separated list of call arguments. Call arguments are expressions, and must be labeled and provided in the order specified in the function definition. If the function eventually returns, then the expression completes.

+

Example:

+
contract Foo {
+
+    pub fn demo(self) {
+        let ann: address = 0xaa
+        let bob: address = 0xbb
+        self.transfer(from: ann, to: bob, 25)
+    }
+
+    pub fn transfer(self, from: address, to: address, _ val: u256) {}
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/comparison_operators.html b/docs/spec/expressions/comparison_operators.html new file mode 100644 index 0000000000..99e69aea1c --- /dev/null +++ b/docs/spec/expressions/comparison_operators.html @@ -0,0 +1,255 @@ + + + + + + Comparison Operators - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Comparison Operators

+
+

Syntax
+ComparisonExpression :
+      Expression == Expression
+   | Expression != Expression
+   | Expression > Expression
+   | Expression < Expression
+   | Expression >= Expression
+   | Expression <= Expression

+
+
+ + + + + + +
SymbolMeaning
==Equal
!=Not equal
>Greater than
<Less than
>=Greater than or equal to
<=Less than or equal to
+
+

Here are examples of the comparison operators being used.

+
123 == 123
+23 != -12
+12 > 11
+11 >= 11
+11 < 12
+11 <= 11
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/index.html b/docs/spec/expressions/index.html new file mode 100644 index 0000000000..e836b9d0ff --- /dev/null +++ b/docs/spec/expressions/index.html @@ -0,0 +1,243 @@ + + + + + + Expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/indexing.html b/docs/spec/expressions/indexing.html new file mode 100644 index 0000000000..1fa92eeeae --- /dev/null +++ b/docs/spec/expressions/indexing.html @@ -0,0 +1,254 @@ + + + + + + Index expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Index expressions

+
+

Syntax
+IndexExpression :
+   Expression [ Expression ]

+
+

Array and Map types can be indexed by by writing a square-bracket-enclosed expression after them. For arrays, the type of the index key has to be u256 whereas for Map types it has to be equal to the key type of the map.

+

Example:

+
contract Foo {
+
+    balances: Map<address, u256>
+
+
+    pub fn baz(mut self, mut values: Array<u256, 10>) {
+        // Assign value at slot 5
+        values[5] = 1000
+        // Read value at slot 5
+        let val1: u256 = values[5]
+
+        // Assign value for address zero
+        self.balances[address(0)] = 10000
+
+        // Read balance of address zero
+        let bal: u256 = self.balances[address(0)]
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/list.html b/docs/spec/expressions/list.html new file mode 100644 index 0000000000..ad38467cad --- /dev/null +++ b/docs/spec/expressions/list.html @@ -0,0 +1,258 @@ + + + + + + List expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

List expressions

+
+

Syntax
+ListExpression :
+   [ ListElements? ]

+

ListElements :
+   Expression (, Expression)* ,?

+
+

A list expression constructs array values.

+

The syntax for list expressions is a parenthesized, comma separated list of expressions, called the list initializer operands. The number of list initializer operands must be equal to the static size of the array type. The types of all list initializer operands must conform to the type of the array.

+

Examples of tuple expressions and their types:

+
+ + +
ExpressionType
[1, self.get_number()]u256[2]
[true, false, false]bool[3]
+
+

An array item can be accessed via an index expression.

+

Example:

+
contract Foo {
+
+    fn get_val3() -> u256 {
+        return 3
+    }
+
+    pub fn baz() {
+        let val1: u256 = 2
+        // A list expression
+        let foo: Array<u256, 3> = [1, val1, get_val3()]
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/literal.html b/docs/spec/expressions/literal.html new file mode 100644 index 0000000000..dcfef94cd6 --- /dev/null +++ b/docs/spec/expressions/literal.html @@ -0,0 +1,241 @@ + + + + + + Literal expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Literal expressions

+
+

Syntax
+LiteralExpression :
+   | STRING_LITERAL
+   | INTEGER_LITERAL
+   | BOOLEAN_LITERAL

+
+

A literal expression consists of one of the literal forms described earlier. +It directly describes a number, string or boolean value.

+
"hello"   // string type
+5         // integer type
+true      // boolean type
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/name.html b/docs/spec/expressions/name.html new file mode 100644 index 0000000000..3c2de09351 --- /dev/null +++ b/docs/spec/expressions/name.html @@ -0,0 +1,242 @@ + + + + + + Name expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Name expressions

+
+

Syntax
+NameExpression :
+   IDENTIFIER

+
+

A name expression resolves to a local variable.

+

Example:

+
contract Foo {
+    pub fn baz(foo: u256) {
+        // name expression resolving to the value of `foo`
+        foo
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/path.html b/docs/spec/expressions/path.html new file mode 100644 index 0000000000..97ccef1ceb --- /dev/null +++ b/docs/spec/expressions/path.html @@ -0,0 +1,242 @@ + + + + + + Path expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Path expressions

+
+

Syntax
+PathExpression :
+   IDENTIFIER ( :: IDENTIFIER )*

+
+

A name expression resolves to a local variable.

+

Example:

+
contract Foo {
+    pub fn baz() {
+        // CONST_VALUE is defined in another module `my_mod`.
+        let foo: u32 = my_mod::CONST_VALUE
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/struct.html b/docs/spec/expressions/struct.html new file mode 100644 index 0000000000..1793f827fc --- /dev/null +++ b/docs/spec/expressions/struct.html @@ -0,0 +1,229 @@ + + + + + + Struct expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Struct expressions

+

TBW

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/tuple.html b/docs/spec/expressions/tuple.html new file mode 100644 index 0000000000..2f6ee3381b --- /dev/null +++ b/docs/spec/expressions/tuple.html @@ -0,0 +1,262 @@ + + + + + + Tuple expressions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Tuple expressions

+
+

Syntax
+TupleExpression :
+   ( TupleElements? )

+

TupleElements :
+   ( Expression , )+ Expression?

+
+

A tuple expression constructs tuple values.

+

The syntax for tuple expressions is a parenthesized, comma separated list of expressions, called the tuple initializer operands. The number of tuple initializer operands is the arity of the constructed tuple.

+

1-ary tuple expressions require a comma after their tuple initializer operand to be disambiguated with a parenthetical expression.

+

Tuple expressions without any tuple initializer operands produce the unit tuple.

+

For other tuple expressions, the first written tuple initializer operand initializes the field item0 and subsequent operands initializes the next highest field.

+

For example, in the tuple expression (true, false, 1), true initializes the value of the field item0, false field item1, and 1 field item2.

+

Examples of tuple expressions and their types:

+
+ + + + +
ExpressionType
()() (unit)
(0, 4)(u256, u256)
(true, )(bool, )
(true, -1, 1)(bool, i256, u256)
+
+

A tuple field can be accessed via an attribute expression.

+

Example:

+
contract Foo {
+    pub fn bar() {
+        // Creating a tuple via a tuple expression
+        let some_tuple: (u256, bool) = (1, false)
+
+        // Accessing the first tuple field via the `item0` field
+        baz(input: some_tuple.item0)
+    }
+    pub fn baz(input: u256) {}
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/expressions/unary_operators.html b/docs/spec/expressions/unary_operators.html new file mode 100644 index 0000000000..7a4591280b --- /dev/null +++ b/docs/spec/expressions/unary_operators.html @@ -0,0 +1,243 @@ + + + + + + Unary Operators - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Unary Operators

+
+

Syntax
+UnaryExpression :
+     not Expression
+   | - Expression
+   | ~ Expression

+
+

The unary operators are used to negate expressions. The unary - (minus) operator yields the negation of its numeric argument. The unary ~ (invert) operator yields the bitwise inversion of its integer argument. The unary not operator yields the inversion of its boolean argument.

+

Example:

+
fn f() {
+  let x: bool = not true  // false
+  let y: i256 = -1
+  let z: i256 = i256(~1)  // -2
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/index.html b/docs/spec/index.html new file mode 100644 index 0000000000..a028784771 --- /dev/null +++ b/docs/spec/index.html @@ -0,0 +1,325 @@ + + + + + + Specification (WIP) - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/contracts.html b/docs/spec/items/contracts.html new file mode 100644 index 0000000000..496d5a96d7 --- /dev/null +++ b/docs/spec/items/contracts.html @@ -0,0 +1,302 @@ + + + + + + Contracts - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Contracts

+
+

Syntax
+Contract :
+   contract IDENTIFIER {
+  ContractMember*
+  _}

+

ContractMember:
+   Visibility?
+   (
+         ContractField
+      | Function
+      | Struct
+      | Enum
+   )

+

Visibility :
+   pub?

+

ContractField :
+   IDENTIFIER : Type

+
+

A contract is a piece of executable code stored at an address on the blockchain. See Appendix A. in the Yellow Paper for more info. Contracts can be written in high level languages, like Fe, and then compiled to EVM bytecode for deployment to the blockchain.

+

Once the code is deployed to the blockchain, the contract's functions can be invoked by sending a transaction to the contract address (or a call, for functions that do not modify blockchain data).

+

In Fe, contracts are defined in files with .fe extensions and compiled using fe build.

+

A contract is denoted using the contract keyword. A contract definition adds a new contract type to the module. This contract type may be used for calling existing contracts with the same interface or initializing new contracts with the create methods.

+

An example of a contract:

+
struct Signed {
+    pub book_msg: String<100>
+}
+
+contract GuestBook {
+    messages: Map<address, String<100>>
+
+    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
+        self.messages[ctx.msg_sender()] = book_msg
+        ctx.emit(Signed(book_msg: book_msg))
+    }
+
+    pub fn get_msg(self, addr: address) -> String<100> {
+        return self.messages[addr].to_mem()
+    }
+}
+
+

Multiple contracts can be compiled from a single .fe contract file.

+

pragma

+

An optional pragma statement can be placed at the beginning of a contract. They are used to enable developers to express that certain code is meant to be compiled with a specific compiler version such that non-matching compiler versions will reject it.

+

Read more on pragma

+

State variables

+

State variables are permanently stored in the contract storage on the blockchain. State variables must be declared inside the contract body but outside the scope of any individual contract function.

+
pub contract Example {
+    some_number: u256
+    _some_string: String<100>
+}
+
+

Contract functions

+

Functions are executable blocks of code. Contract functions are defined inside the body of a contract, but functions defined at module scope (outside of any contract) can be called from within a contract as well.

+

Individual functions can be called internally or externally depending upon their visibility (either private or public).

+

Functions can modify either (or neither) the contract instance or the blockchain. This can be inferred from the function signature by the presence of combinations of mut, self and Context. If a function modifies the contract instance it requires mut self as its first argument. If a function modifies the blockchain it requires Context as an argument.

+

Read more on functions.

+

The __init__() function

+

The __init__ function is a special contract function that can only be called at contract deployment time. It is mostly used to set initial values to state variables upon deployment. In other contexts, __init__() is commonly referred to as the constructor function.

+
pub contract Example {
+
+    _some_number: u256
+    _some_string: String<100>
+
+    pub fn __init__(mut self, number: u256, string: String<100>)  {
+        self._some_number=number;
+        self._some_string=string;
+    }
+}
+
+

It is not possible to call __init__ at runtime.

+

Structs

+

Structs might also exist inside a contract file. These are declared outside of the contract body and are used to define a group of variables that can be used for some specific purpose inside the contract. In Fe structs are also used to represent an Event or an Error.

+

Read more on structs.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/enums.html b/docs/spec/items/enums.html new file mode 100644 index 0000000000..bb90e03fa5 --- /dev/null +++ b/docs/spec/items/enums.html @@ -0,0 +1,282 @@ + + + + + + Enums - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Enum

+
+

Syntax
+Enumeration :
+   enum IDENTIFIER {
+      EnumField*
+      EnumMethod*
+   }

+

EnumField :
+   IDENTIFIER | IDENTIFIER(TupleElements?)

+

EnumMethod :
+   Function

+

TupleElements :
+   Type ( , Type )*

+
+

An enum, also referred to as enumeration is a simultaneous definition of a +nominal Enum type, that can be used to create or pattern-match values of the corresponding type.

+

Enumerations are declared with the keyword enum.

+

An example of an enum item and its use:

+
enum Animal {
+    Dog
+    Cat
+    Bird(BirdType)
+    
+    pub fn bark(self) -> String<10> {
+        match self {
+            Animal::Dog => {
+                return "bow"
+            }
+
+            Animal::Cat => {
+                return "meow"
+            }
+            
+            Animal::Bird(BirdType::Duck) => {
+                return "quack"
+            }
+            
+            Animal::Bird(BirdType::Owl) => {
+                return "hoot"
+            }
+        }
+    }
+}
+
+enum BirdType {
+    Duck
+    Owl
+}
+
+fn f() {
+    let barker: Animal = Animal::Dog
+    barker.bark()
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/functions/context.html b/docs/spec/items/functions/context.html new file mode 100644 index 0000000000..3320f7674c --- /dev/null +++ b/docs/spec/items/functions/context.html @@ -0,0 +1,318 @@ + + + + + + Context - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Context

+

Context is used frequently in Fe smart contracts. It is used to gate access to EVM features for reading and modifying the blockchain.

+

Rationale

+

Smart contracts execute on the Ethereum Virtual Machine (EVM). The EVM exposes features that allow smart contracts to query or change some of the blockchain data, for example emitting logs that are included in transaction receipts, creating contracts, obtaining the current block number and altering the data stored at certain addresses.

+

To make Fe maximally explicit and as easy as possible to audit, these functions are gated behind a Context object. This is passed as an argument to functions, making it clear whether a function interacts with EVM features from the function signature alone.

+

For example, the following function looks pure from its signature (i.e. it is not expected to alter any blockchain data) but in reality it does modify the blockchain (by emitting a log).

+
pub fn looks_pure_but_isnt() {
+  // COMPILE ERROR
+  block_number()
+}
+
+

Using Context to control access to EVM functions such as emit solves this problem by requiring an instance of Context to be passed explicitly to the function, making it clear from the function signature that the function executes some blockchain interaction. The function above, rewritten using Context, looks as follows:

+
pub fn uses_context(ctx: Context) -> u256 {
+    return ctx.block_number()
+}
+
+

The Context object

+

The Context object gates access to features such as:

+
    +
  • emitting logs
  • +
  • creating contracts
  • +
  • transferring ether
  • +
  • reading message info
  • +
  • reading block info
  • +
+

The Context object needs to be passed as a parameter to the function. The Context object has a defined location in the parameter list. It is the first parameter unless the function also takes self. Context or self appearing at any other position in the parameter list causes a compile time error.

+

The Context object is automatically injected when a function is called externally but it has to be passed explicitly when the function is called from another Fe function e.g.

+
// The context object is automatically injected when this is called externally
+pub fn multiply_block_number(ctx: Context) -> u256 {
+  // but it has to be passed along in this function call
+  return retrieves_blocknumber(ctx) * 1000
+}
+
+fn retrieves_blocknumber(ctx: Context) -> u256 {
+  return ctx.block_number()
+}
+
+

Context mutability

+

All functionality that modifies the blockchain such as creating logs or contracts or transferring ether would require a mutable Context reference whereas read-only access such as ctx.block_number() does not need require a mutable reference to the context. To pass a mutable Context object, prepend the object name with mut in the function definition, e.g.:

+
struct SomeEvent{
+}
+
+pub fn mutable(mut ctx: Context) {
+    ctx.emit(SomeEvent())
+}
+
+

ABI conformity

+

The use of Context enables tighter rules and extra clarity compared wth the existing function categories in the ABI, especially when paired with self. The following table shows how combinations of self, mut self, Context and mut Context map to ABI function types.

+
+ + + + + + + + + +
CategoryCharacteristicsFe SyntaxABI
PureCan only operate on input arguments and not produce any information besides its return value. Can not take self and therefore has no access to things that would make it impurefoo(val: u256)pure
Read ContractReading information from the contract instance (broad definition includes reading constants from contract code)foo(self)view
Storage WritingWriting to contract storage (own or that of other contracts)foo(mut self)payable or nonpayable
Context ReadingReading contextual information from the blockchain (msg, block etc)foo(ctx: Context)view
Context ModifyingEmitting logs, transferring ether, creating contractsfoo(ctx: mut Context)payable or nonpayable
Read Contract & ContextReading information from the contract instance and Contextfoo(self, ctx:Context)view
Read Contract & write ContextReading information from the contract instance and modify Contextfoo(self, ctx: mut Context)view
Storage Writing & read ContextWriting to contract storage and read from Contextfoo(mut self, ctx: Context)payable or nonpayable
Storage Writing & write ContextWriting to contract storage and Contextfoo(mut self, ctx: mut Context)payable or nonpayable
+
+

This means Fe has nine different categories of function that can be derived from the function signatures that map to four different ABI types.

+

Examples

+

msg_sender and msg_value

+

Context includes information about inbound transactions. For example, the following function receives ether and adds the sender's address and the +transaction value to a mapping. No blockchain data is being changed, so Context does not need to be mutable.

+
#![allow(unused)]
+fn main() {
+// assumes existence of state variable named 'ledger' with type Map<address, u256>
+pub fn add_to_ledger(mut self, ctx: Context) {
+    self.ledger[ctx.msg_sender()] = ctx.msg_value();
+}
+}
+

Transferring ether

+

Transferring ether modifies the blockchain state, so it requires access to a mutable Context object.

+
pub fn send_ether(mut ctx: Context, _addr: address, amount: u256) {
+    ctx.send_value(to: _addr, wei: amount)
+}
+
+

create/create2

+

Creating a contract via create/create2 requires access to a mutable Context object because it modifies the blockchain state data:

+
#![allow(unused)]
+fn main() {
+pub fn creates_contract(ctx: mut Context):
+  ctx.create2(...)
+}
+

block number

+

Reading block chain information such as the current block number requires Context (but does not require it to be mutable).

+
pub fn retrieves_blocknumber(ctx: Context) {
+  ctx.block_number()
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/functions/index.html b/docs/spec/items/functions/index.html new file mode 100644 index 0000000000..61ee780439 --- /dev/null +++ b/docs/spec/items/functions/index.html @@ -0,0 +1,350 @@ + + + + + + Functions - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Functions

+

Constant size values stored on the stack or in memory can be passed into and returned by functions.

+
+

Syntax
+Function :
+   FunctionQualifiers fn IDENTIFIER
+      ( FunctionParameters? )
+      FunctionReturnType?
+      {
+      FunctionStatements*
+      }

+

FunctionQualifiers :
+   pub?

+

FunctionStatements :
+         ReturnStatement
+      | VariableDeclarationStatement
+      | AssignStatement
+      | AugmentedAssignStatement
+      | ForStatement
+      | WhileStatement
+      | IfStatement
+      | AssertStatement
+      | BreakStatement
+      | ContinueStatement
+      | RevertStatement
+      | Expression

+

FunctionParameters :
+   self? | self,? FunctionParam (, FunctionParam)* ,?

+

FunctionParam :
+   FunctionParamLabel? IDENTIFIER : Types

+

FunctionParamLabel :
+   _ | IDENTIFIER

+

FunctionReturnType :
+   -> Types

+
+

A function definition consists of name and code block along with an optional +list of parameters and return value. Functions are declared with the +keyword fn. Functions may declare a set of input parameters, +through which the caller passes arguments into the function, and +the output type of the value the function will return to its caller +on completion.

+

When referred to, a function yields a first-class value of the +corresponding zero-sized function type, which +when called evaluates to a direct call to the function.

+

A function header prepends a set or curly brackets {...} which contain the function body.

+

For example, this is a simple function:

+
fn add(x: u256, y: u256) -> u256 {
+    return x + y
+}
+
+

Functions can be defined inside of a contract, inside of a struct, or at the +"top level" of a module (that is, not nested within another item).

+

Example:

+
fn add(_ x: u256, _ y: u256) -> u256 {
+    return x + y
+}
+
+contract CoolCoin {
+    balance: Map<address, u256>
+
+    fn transfer(mut self, from sender: address, to recipient: address, value: u256) -> bool {
+        if self.balance[sender] < value {
+            return false
+        }
+        self.balance[sender] -= value
+        self.balance[recipient] += value
+        return true
+    }
+    pub fn demo(mut self) {
+        let ann: address = 0xaa
+        let bob: address = 0xbb
+        self.balance[ann] = 100
+
+        let bonus: u256 = 2
+        let value: u256 = add(10, bonus)
+        let ok: bool = self.transfer(from: ann, to: bob, value)
+    }
+}
+
+

Function parameters have optional labels. When a function is called, the +arguments must be labeled and provided in the order specified in the +function definition.

+

The label of a parameter defaults to the parameter name; a different label +can be specified by adding an explicit label prior to the parameter name. +For example:

+
fn encrypt(msg cleartext: u256, key: u256) -> u256 {
+    return cleartext ^ key
+}
+
+fn demo() {
+    let out: u256 = encrypt(msg: 0xdecafbad, key: 0xfefefefe)
+}
+
+

Here, the first parameter of the encrypt function has the label msg, +which is used when calling the function, while the parameter name is +cleartext, which is used inside the function body. The parameter name +is an implementation detail of the function, and can be changed without +modifying any function calls, as long as the label remains the same.

+

When calling a function, a label can be omitted when the argument is +a variable with a name that matches the parameter label. Example:

+
let msg: u256 = 0xdecafbad
+let cyf: u256 = encrypt(msg, key: 0x1234)
+
+

A parameter can also be specified to have no label, by using _ in place of a +label in the function definition. In this case, when calling the function, the +corresponding argument must not be labeled. Example:

+
fn add(_ x: u256, _ y: u256) -> u256 {
+    return x + y
+}
+fn demo() {
+    let sum: u256 = add(16, 32)
+}
+
+

Functions defined inside of a contract or struct may take self as a +parameter. This gives the function the ability to read and write contract +storage or struct fields, respectively. If a function takes self +as a parameter, the function must be called via self. For example:

+
let ok: bool = self.transfer(from, to, value)
+
+

self is expected to come first parameter in the function's parameter list.

+

Functions can also take a Context object which gives access to EVM features that read or write +blockchain and transaction data. Context is expected to be first in the function's parameter list +unless the function takes self, in which case Context should come second.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/functions/self.html b/docs/spec/items/functions/self.html new file mode 100644 index 0000000000..3db5fd0da3 --- /dev/null +++ b/docs/spec/items/functions/self.html @@ -0,0 +1,260 @@ + + + + + + Self - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Self

+

self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. self in the context of classes in Python, or this in Javascript. self gives access to constants from the contract code and state variables from contract storage.

+
+

Note: Here we focus on functions defined inside a contract, giving access to contract storage; however, self can also be used to read and write struct fields where functions are defined inside structs.

+
+

If a function takes self as a parameter, the function must be called via self. For example:

+
#![allow(unused)]
+fn main() {
+let ok: bool = self.transfer(from, to, value)
+}
+

Mutability

+

self is immutable and can be used for read-only operations on the contract storage (or struct fields). In order to write to the contract storage, you must use mut self. This makes the contract instance mutable and allows the contract storage to be updated.

+

Examples

+

Reading contract storage

+
contract example {
+
+    value: u256;
+
+    pub fn check_value(self) -> u256 {
+        return self.value;
+    }
+}
+
+

Writing contract storage

+
contract example {
+
+    value: u256;
+
+    pub fn update_value(mut self) {
+        self.value += 1;
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/index.html b/docs/spec/items/index.html new file mode 100644 index 0000000000..bbe3505511 --- /dev/null +++ b/docs/spec/items/index.html @@ -0,0 +1,235 @@ + + + + + + Items - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/structs.html b/docs/spec/items/structs.html new file mode 100644 index 0000000000..9259cdd10f --- /dev/null +++ b/docs/spec/items/structs.html @@ -0,0 +1,257 @@ + + + + + + Structs - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Structs

+
+

Syntax
+Struct :
+   struct IDENTIFIER {
+      StructField*
+      StructMethod*
+   }

+

StructField :
+   pub? IDENTIFIER : Type

+

StructMethod :
+   Function

+
+

A struct is a nominal struct type defined with the keyword struct.

+

An example of a struct item and its use:

+
struct Point {
+    pub x: u256
+    pub y: u256
+}
+
+fn pointy_stuff() {
+    let mut p: Point = Point(x: 10, y: 11)
+    let px: u256 = p.x
+    p.x = 100
+}
+
+

Builtin functions:

+
    +
  • abi_encode() encodes the struct as an ABI tuple and returns the encoded data as a fixed-size byte array that is equal in size to the encoding.
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/traits.html b/docs/spec/items/traits.html new file mode 100644 index 0000000000..bb7cddca4b --- /dev/null +++ b/docs/spec/items/traits.html @@ -0,0 +1,264 @@ + + + + + + Traits - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Traits

+
+

Syntax
+Trait :
+   trait IDENTIFIER {
+      TraitMethod*
+   }

+

TraitMethod :
+   fn IDENTIFIER
+      ( FunctionParameters? )
+      FunctionReturnType? ;

+
+

A trait is a collection of function signatures that a type can implement. Traits are implemented for specific types through separate implementations. A type can implement a trait by providing a function body for each of the trait's functions. Traits can be used as type bounds for generic functions to restrict the types that can be used with the function.

+

All traits define an implicit type parameter Self that refers to "the type that is implementing this interface".

+

Example of the Min trait from Fe's standard library:

+
pub trait Min {
+  fn min() -> Self;
+}
+
+

Example of the i8 type implementing the Min trait:

+
impl Min for i8 {
+  fn min() -> Self {
+    return -128
+  }
+}
+
+

Example of a function restricting a generic parameter to types implementing the Compute trait:

+
pub trait Compute {
+  fn compute(self) -> u256;
+}
+
+struct Example {
+  fn do_something<T: Compute>(val: T) -> u256 {
+    return val.compute()
+  }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/type_aliases.html b/docs/spec/items/type_aliases.html new file mode 100644 index 0000000000..d0951f0366 --- /dev/null +++ b/docs/spec/items/type_aliases.html @@ -0,0 +1,239 @@ + + + + + + Type Aliases - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Type aliases

+
+

Syntax
+TypeAlias :
+   type IDENTIFIER = Type

+
+

A type alias defines a new name for an existing type. Type aliases are +declared with the keyword type.

+

For example, the following defines the type BookMsg as a synonym for the type +u8[100], a sequence of 100 u8 numbers which is how sequences of bytes are represented in Fe.

+
type BookMsg = Array<u8, 100>
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/items/visibility_and_privacy.html b/docs/spec/items/visibility_and_privacy.html new file mode 100644 index 0000000000..86db172e4a --- /dev/null +++ b/docs/spec/items/visibility_and_privacy.html @@ -0,0 +1,265 @@ + + + + + + Visibility and Privacy - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Visibility and Privacy

+

These two terms are often used interchangeably, and what they are attempting to convey is the answer to the question "Can this item be used at this location?"

+

Fe knows two different types of visibility for functions and state variables: public and private. Visibility of private is the default and is used if no other visibility is specified.

+

Public: External functions are part of the contract interface, which means they can be called from other contracts and via transactions.

+

Private: Those functions and state variables can only be accessed internally from within the same contract. This is the default visibility.

+

For example, this is a function that can be called externally from a transaction:

+
pub fn answer_to_life_the_universe_and_everything() -> u256 {
+    return 42
+}
+
+

Top-level definitions in a Fe source file can also be specified as pub if the file exists within the context of an Ingot. Declaring a definition as pub enables other modules within an Ingot to use the definition.

+

For example, given an Ingot with the following structure:

+
example_ingot
+└── src
+    ├── ding
+    │   └── dong.fe
+    └── main.fe
+
+

With ding/dong.fe having the following contents:

+
pub struct Dang {
+    pub my_address: address
+    pub my_u256: u256
+    pub my_i8: i8
+}
+
+

Then main.fe can use the Dang struct since it is pub-qualified:

+
use ding::dong::Dang
+
+contract Foo {
+    pub fn hot_dang() -> Dang {
+        return Dang(
+            my_address: 8,
+            my_u256: 42,
+            my_i8: -1
+        )
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/lexical_structure/identifiers.html b/docs/spec/lexical_structure/identifiers.html new file mode 100644 index 0000000000..e7dffcb197 --- /dev/null +++ b/docs/spec/lexical_structure/identifiers.html @@ -0,0 +1,247 @@ + + + + + + Identifiers - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Identifiers

+
+

Lexer:
+IDENTIFIER_OR_KEYWORD :
+      [a-z A-Z] [a-z A-Z 0-9 _]*
+   | _ [a-z A-Z 0-9 _]+ +Except a strict or reserved keyword

+
+

An identifier is any nonempty ASCII string of the following form:

+

Either

+
    +
  • The first character is a letter.
  • +
  • The remaining characters are alphanumeric or _.
  • +
+

Or

+
    +
  • The first character is _.
  • +
  • The identifier is more than one character. _ alone is not an identifier.
  • +
  • The remaining characters are alphanumeric or _.
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/lexical_structure/index.html b/docs/spec/lexical_structure/index.html new file mode 100644 index 0000000000..52a9fc6ec5 --- /dev/null +++ b/docs/spec/lexical_structure/index.html @@ -0,0 +1,233 @@ + + + + + + Lexical Structure - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Lexical Structure

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/lexical_structure/keywords.html b/docs/spec/lexical_structure/keywords.html new file mode 100644 index 0000000000..f8c26f4ce3 --- /dev/null +++ b/docs/spec/lexical_structure/keywords.html @@ -0,0 +1,295 @@ + + + + + + Keywords - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Keywords

+

Fe divides keywords into two categories:

+ +

Strict keywords

+

These keywords can only be used in their correct contexts. They cannot +be used as the identifiers.

+
+

Lexer:
+KW_AS : as
+KW_BREAK : break
+KW_CONST : const
+KW_CONTINUE : continue
+KW_CONST : contract
+KW_FN : fn
+KW_ELSE : else
+KW_ENUM : enum
+KW_EVENT : event
+KW_FALSE : false
+KW_FOR : for
+KW_IDX : idx
+KW_IF : if
+KW_IN : in
+KW_LET : let
+KW_MATCH : match
+KW_MUT : mut
+KW_NONPAYABLE : nonpayable
+KW_PAYABLE : payable
+KW_PUB : pub
+KW_RETURN : return
+KW_REVERT : revert
+KW_SELFVALUE : self
+KW_STRUCT : struct
+KW_TRUE : true
+KW_USE : use
+KW_WHILE : while
+KW_ADDRESS : address

+
+

Reserved keywords

+

These keywords aren't used yet, but they are reserved for future use. They have +the same restrictions as strict keywords. The reasoning behind this is to make +current programs forward compatible with future versions of Fe by forbidding +them to use these keywords.

+
+

Lexer:
+KW_ABSTRACT : abstract
+KW_ASYNC : async
+KW_AWAIT : await
+KW_DO : do
+KW_EXTERNAL : external
+KW_FINAL : final
+KW_IMPL : impl
+KW_MACRO : macro
+KW_OVERRIDE : override
+KW_PURE : pure
+KW_SELFTYPE : Self
+KW_STATIC : static
+KW_SUPER : super
+KW_TRAIT : trait
+KW_TYPE : type
+KW_TYPEOF : typeof
+KW_VIEW : view
+KW_VIRTUAL : virtual
+KW_WHERE : where
+KW_YIELD : yield

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/lexical_structure/tokens.html b/docs/spec/lexical_structure/tokens.html new file mode 100644 index 0000000000..04624d4bb2 --- /dev/null +++ b/docs/spec/lexical_structure/tokens.html @@ -0,0 +1,327 @@ + + + + + + Tokens - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Tokens

+

NEWLINE

+

A token that represents a new line.

+

Literals

+

A literal is an expression consisting of a single token, rather than a sequence +of tokens, that immediately and directly denotes the value it evaluates to, +rather than referring to it by name or some other evaluation rule. A literal is +a form of constant expression, so is evaluated (primarily) at compile time.

+

Examples

+

Strings

+
+ +
ExampleCharactersEscapes
String"hello"ASCII subsetQuote & ASCII
+
+

ASCII escapes

+
+ + + + +
Name
\nNewline
\rCarriage return
\tTab
\\Backslash
+
+

Quote escapes

+
+ +
Name
\"Double quote
+
+

Numbers

+
+ + + + +
Number literals*Example
Decimal integer98_222
Hex integer0xff
Octal integer0o77
Binary integer0b1111_0000
+
+

* All number literals allow _ as a visual separator: 1_234

+

Boolean literals

+
+

Lexer
+BOOLEAN_LITERAL :
+   true | false

+
+

String literals

+
+

Lexer
+STRING_LITERAL :
+   " (
+      PRINTABLE_ASCII_CHAR
+      | QUOTE_ESCAPE
+      | ASCII_ESCAPE
+   )* "

+

PRINTABLE_ASCII_CHAR :
+   Any ASCII character between 0x1F and 0x7E

+

QUOTE_ESCAPE :
+   \"

+

ASCII_ESCAPE :
+   | \n | \r | \t | \\

+
+

A string literal is a sequence of any characters that are in the set of +printable ASCII characters as well as a set of defined escape sequences.

+

Line breaks are allowed in string literals.

+

Integer literals

+
+

Lexer
+INTEGER_LITERAL :
+   ( DEC_LITERAL | BIN_LITERAL | OCT_LITERAL | HEX_LITERAL )

+

DEC_LITERAL :
+   DEC_DIGIT (DEC_DIGIT|_)*

+

BIN_LITERAL :
+   0b (BIN_DIGIT|_)* BIN_DIGIT (BIN_DIGIT|_)*

+

OCT_LITERAL :
+   0o (OCT_DIGIT|_)* OCT_DIGIT (OCT_DIGIT|_)*

+

HEX_LITERAL :
+   0x (HEX_DIGIT|_)* HEX_DIGIT (HEX_DIGIT|_)*

+

BIN_DIGIT : [0-1]

+

OCT_DIGIT : [0-7]

+

DEC_DIGIT : [0-9]

+

HEX_DIGIT : [0-9 a-f A-F]

+
+

An integer literal has one of four forms:

+
    +
  • A decimal literal starts with a decimal digit and continues with any +mixture of decimal digits and underscores.
  • +
  • A hex literal starts with the character sequence U+0030 U+0078 +(0x) and continues as any mixture (with at least one digit) of hex digits +and underscores.
  • +
  • An octal literal starts with the character sequence U+0030 U+006F +(0o) and continues as any mixture (with at least one digit) of octal digits +and underscores.
  • +
  • A binary literal starts with the character sequence U+0030 U+0062 +(0b) and continues as any mixture (with at least one digit) of binary digits +and underscores.
  • +
+

Examples of integer literals of various forms:

+
123                      // type u256
+0xff                     // type u256
+0o70                     // type u256
+0b1111_1111_1001_0000    // type u256
+0b1111_1111_1001_0000i64 // type u256
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/notation.html b/docs/spec/notation.html new file mode 100644 index 0000000000..34ea1012a1 --- /dev/null +++ b/docs/spec/notation.html @@ -0,0 +1,246 @@ + + + + + + Notation - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Notation

+

Grammar

+

The following notations are used by the Lexer and Syntax grammar snippets:

+
+ + + + + + + + + + + + + + +
NotationExamplesMeaning
CAPITALKW_IFA token produced by the lexer
ItalicCamelCaseItemA syntactical production
stringx, while, *The exact character(s)
\x\n, \r, \t, \0The character represented by this escape
x?pub?An optional item
x*OuterAttribute*0 or more of x
x+MacroMatch+1 or more of x
xa..bHEX_DIGIT1..6a to b repetitions of x
|u8 | u16, Block | ItemEither one or another
[ ][b B]Any of the characters listed
[ - ][a-z]Any of the characters in the range
~[ ]~[b B]Any characters, except those listed
~string~\n, ~*/Any characters, except this sequence
( )(, Parameter)Groups items
+
+
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/assert.html b/docs/spec/statements/assert.html new file mode 100644 index 0000000000..9791c02eb7 --- /dev/null +++ b/docs/spec/statements/assert.html @@ -0,0 +1,254 @@ + + + + + + assert Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

assert statement

+
+

Syntax
+AssertStatement :
+   assert Expression (, Expression)?

+
+

The assert statement is used express invariants in the code. It consists of a boolean expression optionally followed by a comma followed by a string expression.

+

If the boolean expression evaluates to false, the code reverts with a panic code of 0x01. In the case that the first expression evaluates to false and a second string expression is given, the code reverts with the given string as the error code.

+
+

Warning: +The current implementation of assert is under active discussion and likely to change.

+
+

An example of a assert statement without the optional message:

+
contract Foo {
+    fn bar(val: u256) {
+        assert val > 5
+    }
+}
+
+

An example of a assert statement with an error message:

+
contract Foo {
+
+    fn bar(val: u256) {
+        assert val > 5, "Must be greater than five"
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/assign.html b/docs/spec/statements/assign.html new file mode 100644 index 0000000000..32eb9292bc --- /dev/null +++ b/docs/spec/statements/assign.html @@ -0,0 +1,253 @@ + + + + + + Assignment Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Assignment statement

+
+

Syntax
+AssignmentStatement :
+   Expression = Expression

+
+

An assignment statement moves a value into a specified place. An assignment statement consists of an expression that holds a mutable place, followed by an equals sign (=) and a value expression.

+

Example:

+
contract Foo {
+  some_array: Array<u256, 10>
+
+
+  pub fn bar(mut self) {
+    let mut val1: u256 = 10
+    // Assignment of stack variable
+    val1 = 10
+
+    let mut values: (u256, u256) = (1, 2)
+    // Assignment of tuple item
+    values.item0 = 3
+
+    // Assignment of storage array slot
+    self.some_array[5] = 1000
+  }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/augassign.html b/docs/spec/statements/augassign.html new file mode 100644 index 0000000000..59605bd106 --- /dev/null +++ b/docs/spec/statements/augassign.html @@ -0,0 +1,262 @@ + + + + + + Augmenting Assignment Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Augmenting Assignment statement

+
+

Syntax
+AssignmentStatement :
+      Expression = Expression
+   | Expression += Expression
+   | Expression -= Expression
+   | Expression %= Expression
+   | Expression **= Expression
+   | Expression <<= Expression
+   | Expression >>= Expression
+   | Expression |= Expression
+   | Expression ^= Expression
+   | Expression &= Expression

+
+

Augmenting assignment statements combine arithmetic and logical binary operators with assignment statements.

+

An augmenting assignment statement consists of an expression that holds a mutable place, followed by one of the arithmetic or logical binary operators, followed by an equals sign (=) and a value expression.

+

Example:

+
fn example() -> u8 {
+    let mut a: u8 = 1
+    let b: u8 = 2
+    a += b
+    a -= b
+    a *= b
+    a /= b
+    a %= b
+    a **= b
+    a <<= b
+    a >>= b
+    a |= b
+    a ^= b
+    a &= b
+    return a
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/break.html b/docs/spec/statements/break.html new file mode 100644 index 0000000000..678ad7449a --- /dev/null +++ b/docs/spec/statements/break.html @@ -0,0 +1,277 @@ + + + + + + break Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

break statement

+
+

Syntax
+BreakStatement :
+   break

+
+

The break statement can only be used within a for or while loop and causes the immediate termination of the loop.

+

If used within nested loops the break statement is associated with the innermost enclosing loop.

+

An example of a break statement used within a while loop.

+
contract Foo {
+
+    pub fn bar() -> u256 {
+        let mut sum: u256 = 0
+        while sum < 10 {
+            sum += 1
+
+            if some_abort_condition() {
+                break
+            }
+        }
+        return sum
+    }
+
+    fn some_abort_condition() -> bool {
+        // some complex logic
+        return true
+    }
+}
+
+

An example of a break statement used within a for loop.

+
contract Foo {
+
+    pub fn bar(values: Array<u256, 10>) -> u256 {
+        let mut sum: u256 = 0
+        for i in values {
+            sum = sum + i
+
+            if some_abort_condition() {
+                break
+            }
+        }
+        return sum
+    }
+
+    fn some_abort_condition() -> bool {
+        // some complex logic
+        return true
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/const.html b/docs/spec/statements/const.html new file mode 100644 index 0000000000..ca258e59cf --- /dev/null +++ b/docs/spec/statements/const.html @@ -0,0 +1,244 @@ + + + + + + const Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

const statement

+
+

Syntax
+ConstStatement :
+   const IDENTIFIER: Type = Expression

+
+

A const statement introduces a named constant value. Constants are either directly inlined wherever they are used or loaded from the contract code depending on their type.

+

Example:

+
const TEN: u256 = 10
+const HUNDO: u256 = TEN * TEN
+
+contract Foo {
+  pub fn bar() -> u256 {
+    return HUNDO
+  }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/continue.html b/docs/spec/statements/continue.html new file mode 100644 index 0000000000..ca75ddaa2c --- /dev/null +++ b/docs/spec/statements/continue.html @@ -0,0 +1,278 @@ + + + + + + continue Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

continue statement

+
+

Syntax
+ContinueStatement :
+   continue

+
+

The continue statement can only be used within a for or while loop and causes the immediate termination of the current iteration, returning control to the loop head.

+

If used within nested loops the continue statement is associated with the innermost enclosing loop.

+

An example of a continue statement used within a while loop.

+
contract Foo {
+
+    pub fn bar() -> u256 {
+        let mut sum: u256 = 0
+        while sum < 10 {
+            sum += 1
+
+            if some_skip_condition() {
+                continue
+            }
+        }
+
+        return sum
+    }
+
+    fn some_skip_condition() -> bool {
+        // some complex logic
+        return true
+    }
+}
+
+

An example of a continue statement used within a for loop.

+
contract Foo {
+
+    pub fn bar(values: Array<u256, 10>) -> u256 {
+        let mut sum: u256 = 0
+        for i in values {
+            sum = sum + i
+
+            if some_skip_condition() {
+                continue
+            }
+        }
+        return sum
+    }
+
+    fn some_skip_condition() -> bool {
+        // some complex logic
+        return true
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/for.html b/docs/spec/statements/for.html new file mode 100644 index 0000000000..a94a16ae8c --- /dev/null +++ b/docs/spec/statements/for.html @@ -0,0 +1,249 @@ + + + + + + for Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

for statement

+
+

Syntax
+ForStatement :
+   for IDENTIFIER in Expression {
+   (Statement | Expression)+
+   }

+
+

A for statement is a syntactic construct for looping over elements provided by an array type.

+

An example of a for loop over the contents of an array:

+

Example:

+
contract Foo {
+
+    pub fn bar(values: Array<u256, 10>) -> u256 {
+        let mut sum: u256 = 0
+        for i in values {
+            sum = sum + i
+        }
+        return sum
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/if.html b/docs/spec/statements/if.html new file mode 100644 index 0000000000..295b3ad31a --- /dev/null +++ b/docs/spec/statements/if.html @@ -0,0 +1,250 @@ + + + + + + if Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

if statement

+
+

Syntax
+IfStatement :
+   if Expression{ +   (Statement | Expression)+
+   }
+   (else {
+   (Statement | Expression)+
+   })?

+
+

Example:

+
contract Foo {
+    pub fn bar(val: u256) -> u256 {
+        if val > 5 {
+            return 1
+        } else {
+            return 2
+        }
+    }
+}
+
+

The if statement is used for conditional execution.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/index.html b/docs/spec/statements/index.html new file mode 100644 index 0000000000..05037b6a02 --- /dev/null +++ b/docs/spec/statements/index.html @@ -0,0 +1,244 @@ + + + + + + Statements - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/let.html b/docs/spec/statements/let.html new file mode 100644 index 0000000000..db5104fc03 --- /dev/null +++ b/docs/spec/statements/let.html @@ -0,0 +1,252 @@ + + + + + + let Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

let statement

+
+

Syntax
+LetStatement :
+   let IDENTIFIER | TupleTarget : Type = Expression

+

TupleTarget :
+   ( TupleTargetItem (, TupleTargetItem) + )

+

TupleTargetItem :
+   IDENTIFIER | TupleTarget

+
+

A let statement introduces a new set of variables. Any variables introduced by a variable declaration are visible from the point of declaration until the end of the enclosing block scope.

+
+

Note: Support for nested tuples isn't yet implemented but can be tracked via this GitHub issue.

+
+

Example:

+
contract Foo {
+
+  pub fn bar() {
+    let val1: u256 = 1
+    let (val2):(u256) = (1,)
+    let (val3, val4):(u256, bool) = (1, false)
+    let (val5, val6, (val7, val8)):(u256, bool, (u256, u256)) = (1, false, (2, 4))
+  }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/match.html b/docs/spec/statements/match.html new file mode 100644 index 0000000000..b7a6d4e8b1 --- /dev/null +++ b/docs/spec/statements/match.html @@ -0,0 +1,277 @@ + + + + + + match Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

match statement

+
+

Syntax
+MatchStatement :
+   match Expression {
+      ( Pattern => { Statement* } )+
+   }

+

Pattern :
+   PatternElem ( | PatternElem )*

+

PatternElem :
+   IDENTIFIER | BOOLEAN_LITERAL | _ | .. | Path |
+   Path( TuplePatterns? ) |( TuplePatterns? ) |
+   Path{ StructPatterns? }

+

TuplePatterns :
+   Pattern ( , Pattern )*

+

StructPatterns :
+   Field ( , Field)*(, ..)?

+

Field :
+   IDENTIFIER : Pattern

+
+

A match statements compares expression with patterns, then executes body of the matched arm.

+

Example:

+
enum MyEnum {
+    Unit
+    Tuple(u32, u256, bool)
+}
+
+contract Foo {
+    pub fn bar(self) -> u256 {
+        let val: MyEnum = MyEnum::Tuple(1, 10, false)
+        return self.eval(val)
+    }
+    
+    fn eval(self, val: MyEnum) -> u256 {
+        match val {
+            MyEnum::Unit => {
+                return 0
+            }
+            
+            MyEnum::Tuple(.., false) => {
+                return 1
+            }
+            
+            MyEnum::Tuple(a, b, true) => {
+                return u256(a) + b
+            }
+        }
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/pragma.html b/docs/spec/statements/pragma.html new file mode 100644 index 0000000000..c551033be6 --- /dev/null +++ b/docs/spec/statements/pragma.html @@ -0,0 +1,240 @@ + + + + + + pragma Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

pragma statement

+
+

Syntax
+PragmaStatement :
+   pragma VersionRequirement

+

VersionRequirement :Following the semver implementation by cargo

+
+

The pragma statement is denoted with the keyword pragma. Evaluating a pragma +statement will cause the compiler to reject compilation if the version of the compiler does not conform to the given version requirement.

+

An example of a pragma statement:

+
pragma ^0.1.0
+
+

The version requirement syntax is identical to the one that is used by cargo (more info).

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/return.html b/docs/spec/statements/return.html new file mode 100644 index 0000000000..08346d3d5c --- /dev/null +++ b/docs/spec/statements/return.html @@ -0,0 +1,262 @@ + + + + + + return Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

return statement

+
+

Syntax
+ReturnStatement :
+   return Expression?

+
+

The return statement is denoted with the keyword return. A return statement leaves the current function call with a return value which is either the value of the evaluated expression (if present) or () (unit type) if return is not followed by an expression explicitly.

+

An example of a return statement without explicit use of an expression:

+
contract Foo {
+    fn transfer(self, to: address, value: u256) {
+        if not self.in_whitelist(to) {
+            return
+        }
+    }
+
+    fn in_whitelist(self, to: address) -> bool {
+        // revert used as placeholder for actual logic
+        revert
+    }
+}
+
+

The above can also be written in a slightly more verbose form:

+
contract Foo {
+    fn transfer(self, to: address, value: u256) -> () {
+        if not self.in_whitelist(to) {
+            return ()
+        }
+    }
+
+    fn in_whitelist(self, to: address) -> bool {
+        // revert used as placeholder for actual logic
+        revert
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/revert.html b/docs/spec/statements/revert.html new file mode 100644 index 0000000000..347cb1bdbb --- /dev/null +++ b/docs/spec/statements/revert.html @@ -0,0 +1,267 @@ + + + + + + revert Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

revert statement

+
+

Syntax
+RevertStatement :
+   revert Expression?

+
+

The revert statement is denoted with the keyword revert. Evaluating a revert +statement will cause to revert all state changes made by the call and return with an revert error to the caller. A revert statement may be followed by an expression that evaluates to a struct in which case the struct is encoded as revert data as defined by EIP-838.

+

An example of a revert statement without revert data:

+
contract Foo {
+    fn transfer(self, to: address, value: u256) {
+        if not self.in_whitelist(addr: to) {
+            revert
+        }
+        // more logic here
+    }
+
+    fn in_whitelist(self, addr: address) -> bool {
+        return false
+    }
+}
+
+

An example of a revert statement with revert data:

+
struct ApplicationError {
+    pub code: u8
+}
+
+contract Foo {
+    pub fn transfer(self, to: address, value: u256) {
+        if not self.in_whitelist(addr: to) {
+            revert ApplicationError(code: 5)
+        }
+        // more logic here
+    }
+
+    fn in_whitelist(self, addr: address) -> bool {
+        return false
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/statements/while.html b/docs/spec/statements/while.html new file mode 100644 index 0000000000..ea163cc1a7 --- /dev/null +++ b/docs/spec/statements/while.html @@ -0,0 +1,248 @@ + + + + + + while Statement - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

while statement

+
+

Syntax
+WhileStatement :
+   while Expression {
+   (Statement | Expression)+
+   }

+
+

A while loop begins by evaluation the boolean loop conditional expression. If the loop conditional expression evaluates to true, the loop body block executes, then control returns to the loop conditional expression. If the loop conditional expression evaluates to false, the while expression completes.

+

Example:

+
contract Foo {
+
+    pub fn bar() -> u256 {
+        let mut sum: u256 = 0
+        while sum < 10 {
+            sum += 1
+        }
+        return sum
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/index.html b/docs/spec/type_system/index.html new file mode 100644 index 0000000000..f39f5cd22d --- /dev/null +++ b/docs/spec/type_system/index.html @@ -0,0 +1,228 @@ + + + + + + Type System - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Type System

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/address.html b/docs/spec/type_system/types/address.html new file mode 100644 index 0000000000..cf273691b0 --- /dev/null +++ b/docs/spec/type_system/types/address.html @@ -0,0 +1,240 @@ + + + + + + Address Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Address Type

+

The address type represents a 20 byte Ethereum address.

+

Example:

+
contract Example {
+  // An address in storage
+  someone: address
+
+  fn do_something() {
+    // A plain address (not part of a tuple, struct etc) remains on the stack
+    let dai_contract: address = 0x6b175474e89094c44da98b954eedeac495271d0f
+  }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/array.html b/docs/spec/type_system/types/array.html new file mode 100644 index 0000000000..af17d89f1b --- /dev/null +++ b/docs/spec/type_system/types/array.html @@ -0,0 +1,249 @@ + + + + + + Array Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Array types

+
+

Syntax
+ArrayType :
+   Array<Type, INTEGER_LITERAL>

+
+

An array is a fixed-size sequence of N elements of type T. The array type +is written as Array<T, N>. The size is an integer literal.

+

Arrays are either stored in storage or memory but are never stored directly on the stack.

+

Examples:

+
contract Foo {
+  // An array in storage
+  bar: Array<u8, 10>
+
+  fn do_something() {
+    // An array in memory
+    let values: Array<u256, 3> = [10, 100, 100]
+  }
+}
+
+

All elements of arrays are always initialized, and access to an array is +always bounds-checked in safe methods and operators.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/boolean.html b/docs/spec/type_system/types/boolean.html new file mode 100644 index 0000000000..0548687561 --- /dev/null +++ b/docs/spec/type_system/types/boolean.html @@ -0,0 +1,232 @@ + + + + + + Boolean Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Boolean type

+

The bool type is a data type which can be either true or false.

+

Example:

+
let x: bool = true
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/contract.html b/docs/spec/type_system/types/contract.html new file mode 100644 index 0000000000..62498c33e6 --- /dev/null +++ b/docs/spec/type_system/types/contract.html @@ -0,0 +1,248 @@ + + + + + + Contract Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Contract types

+

An contract type is the type denoted by the name of an contract item.

+

A value of a given contract type carries the contract's public interface as +attribute functions. A new contract value can be created by either casting +an address to a contract type or by creating a new contract using the type +attribute functions create or create2.

+

Example:

+
contract Foo {
+    pub fn get_my_num() -> u256 {
+        return 42
+    }
+}
+
+contract FooFactory {
+    pub fn create2_foo(mut ctx: Context) -> address {
+        // `0` is the value being sent and `52` is the address salt
+        let foo: Foo = Foo.create2(ctx, 0, 52)
+        return address(foo)
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/enum.html b/docs/spec/type_system/types/enum.html new file mode 100644 index 0000000000..379dc9500e --- /dev/null +++ b/docs/spec/type_system/types/enum.html @@ -0,0 +1,229 @@ + + + + + + Enum Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Enum types

+

An enum type is the type denoted by the name of an enum item.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/function.html b/docs/spec/type_system/types/function.html new file mode 100644 index 0000000000..533d245ead --- /dev/null +++ b/docs/spec/type_system/types/function.html @@ -0,0 +1,229 @@ + + + + + + Function Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Function Types

+

TBW

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/index.html b/docs/spec/type_system/types/index.html new file mode 100644 index 0000000000..08697ae64d --- /dev/null +++ b/docs/spec/type_system/types/index.html @@ -0,0 +1,269 @@ + + + + + + Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Types

+

Every variable, item, and value in a Fe program has a type. The _ of a +value defines the interpretation of the memory holding it and the operations +that may be performed on the value.

+

Built-in types are tightly integrated into the language, in nontrivial ways +that are not possible to emulate in user-defined types. User-defined types have +limited capabilities.

+

The list of types is:

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/map.html b/docs/spec/type_system/types/map.html new file mode 100644 index 0000000000..8143902354 --- /dev/null +++ b/docs/spec/type_system/types/map.html @@ -0,0 +1,259 @@ + + + + + + Map Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Map type

+

The type Map<K, V> is used to associate key values with data.

+

The following types can be used as key:

+ +

The values can be of any type including other maps, structs, tuples or arrays.

+

Example:

+
contract Foo {
+    bar: Map<address, Map<address, u256>>
+    baz: Map<address, Map<u256, bool>>
+
+    pub fn read_bar(self, a: address, b: address) -> u256 {
+        return self.bar[a][b]
+    }
+
+    pub fn write_bar(mut self, a: address, b: address, value: u256) {
+        self.bar[a][b] = value
+    }
+
+    pub fn read_baz(self, a: address, b: u256) -> bool {
+        return self.baz[a][b]
+    }
+
+    pub fn write_baz(mut self, a: address, b: u256, value: bool) {
+        self.baz[a][b] = value
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/numeric.html b/docs/spec/type_system/types/numeric.html new file mode 100644 index 0000000000..5bd13c3fd9 --- /dev/null +++ b/docs/spec/type_system/types/numeric.html @@ -0,0 +1,247 @@ + + + + + + Numeric Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Numeric types

+

The unsigned integer types consist of:

+
+ + + + + + +
TypeMinimumMaximum
u8028-1
u160216-1
u320232-1
u640264-1
u12802128-1
u25602256-1
+
+

The signed two's complement integer types consist of:

+
+ + + + + + +
TypeMinimumMaximum
i8-(27)27-1
i16-(215)215-1
i32-(231)231-1
i64-(263)263-1
i128-(2127)2127-1
i256-(2255)2255-1
+
+
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/string.html b/docs/spec/type_system/types/string.html new file mode 100644 index 0000000000..bff78b40e9 --- /dev/null +++ b/docs/spec/type_system/types/string.html @@ -0,0 +1,240 @@ + + + + + + String Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

String Type

+

A value of type String<N> represents a sequence of unsigned bytes with the assumption that the data is valid UTF-8.

+

The String<N> type is generic over a constant value that has to be an integer literal. That value N constraints the maximum number of bytes that are available for storing the string's characters.

+

Note that the value of N does not restrict the type to hold exactly that number of bytes at all times which means that a type such as String<10> can hold a short word such as "fox" but it can not hold a full sentence such as "The brown fox jumps over the white fence".

+

Example:

+
contract Foo {
+
+  fn bar() {
+    let single_byte_string: String<1> = "a"
+    let longer_string: String<100> = "foo"
+  }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/struct.html b/docs/spec/type_system/types/struct.html new file mode 100644 index 0000000000..dc7d4f7057 --- /dev/null +++ b/docs/spec/type_system/types/struct.html @@ -0,0 +1,254 @@ + + + + + + Struct Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Struct types

+

A struct type is the type denoted by the name of an struct item. +A struct type is a heterogeneous product of other types, called the +fields of the type.

+

New instances of a struct can be constructed with a struct expression.

+

Struct types are either stored in storage or memory but are never stored directly on the stack.

+

Examples:

+
struct Rectangle {
+  pub width: u256
+  pub length: u256
+}
+
+contract Example {
+  // A Rectangle in storage
+  area: Rectangle
+
+  fn do_something() {
+    let length: u256 = 20
+    // A rectangle in memory
+    let square: Rectangle = Rectangle(width: 10, length)
+  }
+}
+
+

All fields of struct types are always initialized.

+

The data layout of a struct is not part of its external API and may be changed in any release.

+

The fields of a struct may be qualified by visibility modifiers, to allow +access to data in a struct outside a module.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/tuple.html b/docs/spec/type_system/types/tuple.html new file mode 100644 index 0000000000..03cd84c3ca --- /dev/null +++ b/docs/spec/type_system/types/tuple.html @@ -0,0 +1,260 @@ + + + + + + Tuple Types - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Tuple Types

+
+

Syntax
+TupleType :
+      ( )
+   | ( ( Type , )+ Type? )

+
+

Tuple types are a family of structural types1 for heterogeneous lists of other types.

+

The syntax for a tuple type is a parenthesized, comma-separated list of types.

+

A tuple type has a number of fields equal to the length of the list of types. +This number of fields determines the arity of the tuple. +A tuple with n fields is called an n-ary tuple. +For example, a tuple with 2 fields is a 2-ary tuple.

+

Fields of tuples are named using increasing numeric names matching their position in the list of types. +The first field is item0. +The second field is item1. +And so on. +The type of each field is the type of the same position in the tuple's list of types.

+

For convenience and historical reasons, the tuple type with no fields (()) is often called unit or the unit type. +Its one value is also called unit or the unit value.

+

Some examples of tuple types:

+
    +
  • () (also known as the unit or zero-sized type)
  • +
  • (u8, u8)
  • +
  • (bool, i32)
  • +
  • (i32, bool) (different type from the previous example)
  • +
+

Values of this type are constructed using a tuple expression. +Furthermore, various expressions will produce the unit value if there is no other meaningful value for it to evaluate to. +Tuple fields can be accessed via an attribute expression.

+
1 +

Structural types are always equivalent if their internal types are equivalent.

+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/spec/type_system/types/unit.html b/docs/spec/type_system/types/unit.html new file mode 100644 index 0000000000..6d444532a1 --- /dev/null +++ b/docs/spec/type_system/types/unit.html @@ -0,0 +1,229 @@ + + + + + + Unit Type - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Unit type

+

TBW

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/std/index.html b/docs/std/index.html new file mode 100644 index 0000000000..5c1f6ae685 --- /dev/null +++ b/docs/std/index.html @@ -0,0 +1,232 @@ + + + + + + Standard Library - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Fe Standard Library

+

The standard library includes commonly used algorithms and data structures that come bundled as part of the language.

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/std/precompiles.html b/docs/std/precompiles.html new file mode 100644 index 0000000000..66b949a50a --- /dev/null +++ b/docs/std/precompiles.html @@ -0,0 +1,465 @@ + + + + + + Precompiles - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Precompiles

+

Precompiles are EVM functions that are prebuilt and optimized as part of the Fe standard library. There are currently nine precompiles available in Fe. The first four precompiles were defined in the original Ethereum Yellow Paper (ec_recover, SHA2_256, ripemd_160, identity). Four more were added during the Byzantium fork (mod_exp, ec_add, ec_mul and ec_pairing). A final precompile, blake2f was added in EIP-152 during the Istanbul fork.

+

The nine precompiles available in the Fe standard library are:

+ +

These precompiles are imported as follows:

+
use std::precompiles
+
+

ec_recover

+

ec_recover is a cryptographic function that retrieves a signer's address from a signed message. It is the fundamental operation used for verifying signatures in Ethereum. Ethereum uses the Elliptic Curve Digital Signature Algorithm (ECDSA) for verifying signatures. This algorithm uses two parameters, r and s. Ethereum's implementation also uses an additional 'recovery identifier' parameter, v, which is used to identify the correct elliptic curve point from those that can be calculated from r and s alone.

+

Parameters

+
    +
  • hash: the hash of the signed message, u256
  • +
  • v: the recovery identifier, a number in the range 27-30, u256
  • +
  • r: elliptic curve parameter, u256
  • +
  • s: elliptic curve parameter, u256
  • +
+

Returns

+

ec_recover returns an address.

+

Function signature

+
pub fn ec_recover(hash: u256, v: u256, r: u256, s: u256) -> address
+
+

Example

+
let result: address = precompiles::ec_recover(
+    hash: 0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3,
+    v: 28,
+    r: 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608,
+    s: 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada
+)
+
+

SHA2_256

+

SHA2_256 is a hash function. a hash function generates a unique string of characters of fixed length from arbitrary input data.

+

Parameters

+
    +
  • buf: a sequence of bytes to hash, MemoryBuffer
  • +
+

Returns

+

SHA2_256 returns a hash as a u256

+

Function signature

+
pub fn sha2_256(buf input_buf: MemoryBuffer) -> u256
+
+

Example

+
let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)
+let result: u256 = precompiles::sha2_256(buf)
+
+

ripemd_160

+

ripemd_160 is a hash function that is rarely used in Ethereum, but is included in many crypto libraries as it is used in Bitcoin core.

+

Parameters

+
    +
  • input_buf: a sequence of bytes to hash, MemoryBuffer
  • +
+

Returns

+

ripemd_160 returns a hash as a u256

+

Function signature

+
pub fn ripemd_160(buf input_buf: MemoryBuffer) -> u256
+
+
+

Example

+
let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0xff)
+let result: u256 = precompiles::ripemd_160(buf)
+
+

identity

+

identity is a function that simply echoes the input of the function as its output. This can be used for efficient data copying.

+

Parameters

+
    +
  • input_buf: a sequence of bytes to hash, MemoryBuffer
  • +
+

Returns

+

identity returns a sequence of bytes, MemoryBuffer

+

Function signature

+
pub fn identity(buf input_buf: MemoryBuffer) -> MemoryBuffer
+
+
+

Example

+
let buf: MemoryBuffer = MemoryBuffer::from_u8(value: 0x42)
+let mut result: MemoryBufferReader = precompiles::identity(buf).reader()
+
+

mod_exp

+

mod_exp is a modular exponentiation function required for elliptic curve operations.

+

Parameters

+
    +
  • b: MemoryBuffer: the base (i.e. the number being raised to a power), MemoryBuffer
  • +
  • e: MemoryBuffer: the exponent (i.e. the power b is raised to), MemoryBuffer
  • +
  • m: MemoryBuffer: the modulus, MemoryBuffer
  • +
  • b_size: u256: the length of b in bytes, u256
  • +
  • e_size: u256: the length of e in bytes, u256
  • +
  • m_size: u256: then length of m in bytes, u256
  • +
+

Returns

+

mod_exp returns a sequence of bytes, MemoryBuffer

+

Function signature

+
pub fn mod_exp(
+    b_size: u256,
+    e_size: u256,
+    m_size: u256,
+    b: MemoryBuffer,
+    e: MemoryBuffer,
+    m: MemoryBuffer,
+) -> MemoryBuffer
+
+
+

Example

+
let mut result: MemoryBufferReader = precompiles::mod_exp(
+    b_size: 1,
+    e_size: 1,
+    m_size: 1,
+    b: MemoryBuffer::from_u8(value: 8),
+    e: MemoryBuffer::from_u8(value: 9),
+    m: MemoryBuffer::from_u8(value: 10),
+).reader()
+
+

ec_add

+

ec_add does point addition on elliptic curves.

+

Parameters

+
    +
  • x1: x-coordinate 1, u256
  • +
  • y1: y coordinate 1, u256
  • +
  • x2: x coordinate 2, u256
  • +
  • y2: y coordinate 2, u256
  • +
+

Function signature

+
pub fn ec_add(x1: u256, y1: u256, x2: u256, y2: u256)-> (u256,u256)
+
+

Returns

+

ec_add returns a tuple of u256, (u256, u256).

+

Example

+
let (x, y): (u256, u256) = precompiles::ec_add(x1: 1, y1: 2, x2: 1, y2: 2)
+
+

ec_mul

+

ec_mul is for multiplying elliptic curve points.

+

Parameters

+
    +
  • x: x-coordinate, u256
  • +
  • y: y coordinate, u256
  • +
  • s: multiplier, u256
  • +
+

Function signature

+
pub fn ec_mul(x: u256, y: u256, s: u256)-> (u256,u256)
+
+

Returns

+

ec_mul returns a tuple of u256, (u256, u256).

+

Example

+
let (x, y): (u256, u256) = precompiles::ec_mul(
+    x: 1,
+    y: 2,
+    s: 2
+)
+
+

ec_pairing

+

ec_pairing does elliptic curve pairing - a form of encrypted multiplication.

+

Parameters

+
    +
  • input_buf: sequence of bytes representing the result of the elliptic curve operation (G1 * G2) ^ k, as MemoryBuffer
  • +
+

Returns

+

ec_pairing returns a bool indicating whether the pairing is satisfied (true) or not (false).

+

Example

+
    let mut input_buf: MemoryBuffer = MemoryBuffer::new(len: 384)
+    let mut writer: MemoryBufferWriter = buf.writer()
+
+    writer.write(value: 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da)
+    writer.write(value: 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6)
+    writer.write(value: 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc)
+    writer.write(value: 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9)
+    writer.write(value: 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90)
+    writer.write(value: 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e)
+    writer.write(value: 0x0000000000000000000000000000000000000000000000000000000000000001)
+    writer.write(value: 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45)
+    writer.write(value: 0x1971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4)
+    writer.write(value: 0x091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc7)
+    writer.write(value: 0x2a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea2)
+    writer.write(value: 0x23a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc)
+
+    assert precompiles::ec_pairing(buf)
+}
+
+

blake_2f

+

blake_2f is a compression algorithm for the cryptographic hash function BLAKE2b. It takes as an argument the state vector h, message block vector m, offset counter t, final block indicator flag f, and number of rounds rounds. The state vector provided as the first parameter is modified by the function.

+

Parameters

+
    +
  • h: the state vector, Array<u64, 8>
  • +
  • m: message block vector, Array<u64, 16>
  • +
  • t: offset counter, Array<u64, 2>
  • +
  • f: bool
  • +
  • rounds: number of rounds of mixing, u32
  • +
+

Returns

+

blake_2f returns a modified state vector, Array<u64, 8>

+

Function signature

+
pub fn blake_2f(rounds: u32, h: Array<u64, 8>, m: Array<u64, 16>, t: Array<u64, 2>, f: bool) ->  Array<u64, 8>
+
+

Example

+
let result: Array<u64, 8> = precompiles::blake_2f(
+    rounds: 12,
+    h: [
+        0x48c9bdf267e6096a,
+        0x3ba7ca8485ae67bb,
+        0x2bf894fe72f36e3c,
+        0xf1361d5f3af54fa5,
+        0xd182e6ad7f520e51,
+        0x1f6c3e2b8c68059b,
+        0x6bbd41fbabd9831f,
+        0x79217e1319cde05b,
+    ],
+    m: [
+        0x6162630000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+        0x0000000000000000,
+    ],
+    t: [
+        0x0300000000000000,
+        0x0000000000000000,
+    ],
+    f: true
+)
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/theme/custom-highlight.js b/docs/theme/custom-highlight.js new file mode 100644 index 0000000000..034e475b8e --- /dev/null +++ b/docs/theme/custom-highlight.js @@ -0,0 +1,87 @@ +function highlight_fe(hljs) { + const KEYWORDS = [ + "and", + "break", + "const", + "continue", + "contract", + "ingot", + "else", + "emit", + "enum", + "event", + "false", + "fn", + "for", + "idx", + "if", + "impl", + "in", + "let", + "loop", + "match", + "mut", + "or", + "not", + "pragma", + "pub", + "return", + "revert", + "self", + "Self", + "struct", + "trait", + "true", + "type", + "unsafe", + "use", + "where", + "while" + ]; + + const TYPES = [ + "address", + "i8", + "i16", + "i32", + "i64", + "i128", + "i256", + "u8", + "u16", + "u32", + "u64", + "u128", + "u256", + "bool", + "Context", + "Option", + "Result", + "String", + "Array", + "Map" + ]; + + return { + name: "Fe", + keywords: { + keyword: KEYWORDS.join(' '), + built_in: TYPES.join(' '), + literal: "false true", + }, + contains: [ + hljs.QUOTE_STRING_MODE, + hljs.C_NUMBER_MODE, + { + scope: "string", + begin: '"', + end: '"', + contains: [{ begin: "\\\\." }], + }, + hljs.COMMENT("//", "\n"), + ], + } +} + +hljs.registerLanguage("fe", highlight_fe); +hljs.initHighlightingOnLoad(); diff --git a/docs/theme/reference.css b/docs/theme/reference.css new file mode 100644 index 0000000000..ba64b1431c --- /dev/null +++ b/docs/theme/reference.css @@ -0,0 +1,64 @@ +/* +.parenthetical class used to keep e.g. "less-than symbol (<)" from wrapping +the end parenthesis onto its own line. Use in a span between the last word and +the parenthetical. So for this example, you'd use +```less-than symbol (`<`)``` +*/ +.parenthetical { + white-space: nowrap; +} + +/* +Warnings and notes: + +Write the
s on their own line. E.g. + +
+ +Warning: This is bad! + +
+*/ +main .warning p { + padding: 10px 20px; + margin: 20px 0; +} + +main .warning p::before { + content: "⚠️ "; +} + +.light main .warning p, +.rust main .warning p { + border: 2px solid red; + background: #ffcece; +} + +.rust main .warning p { + /* overrides previous declaration */ + border-color: #961717; +} + +.coal main .warning p, +.navy main .warning p, +.ayu main .warning p { + background: #542626 +} + +/* Make the links higher contrast on dark themes */ +.coal main .warning p a, +.navy main .warning p a, +.ayu main .warning p a { + color: #80d0d0 +} + +/* add consistent whitespace around code blocks*/ +.pre code { + white-space: pre; +} + +pre { + display: block; + margin-top: 4rem; + margin-bottom: 4rem; +} \ No newline at end of file diff --git a/docs/tomorrow-night.css b/docs/tomorrow-night.css new file mode 100644 index 0000000000..81fe276e7f --- /dev/null +++ b/docs/tomorrow-night.css @@ -0,0 +1,102 @@ +/* Tomorrow Night Theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +} diff --git a/docs/user-guide/example_contracts/auction_contract.html b/docs/user-guide/example_contracts/auction_contract.html new file mode 100644 index 0000000000..44b62982ea --- /dev/null +++ b/docs/user-guide/example_contracts/auction_contract.html @@ -0,0 +1,324 @@ + + + + + + Open auction - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+
// errors
+struct AuctionAlreadyEnded {
+}
+
+struct AuctionNotYetEnded {
+}
+
+struct AuctionEndAlreadyCalled {}
+
+struct BidNotHighEnough {
+    pub highest_bid: u256
+}
+
+// events
+struct HighestBidIncreased {
+    #indexed
+    pub bidder: address
+    pub amount: u256
+}
+
+struct AuctionEnded {
+    #indexed
+    pub winner: address
+    pub amount: u256
+}
+
+contract Auction {
+    // states
+    auction_end_time: u256
+    beneficiary: address
+
+    highest_bidder: address
+    highest_bid: u256
+
+    pending_returns: Map<address, u256>
+
+    ended: bool
+
+    // constructor
+    pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) {
+        self.beneficiary = beneficiary_addr
+        self.auction_end_time = ctx.block_timestamp() + bidding_time
+    }
+
+    //method
+    pub fn bid(mut self, mut ctx: Context) {
+        if ctx.block_timestamp() > self.auction_end_time {
+            revert AuctionAlreadyEnded()
+        }
+        if ctx.msg_value() <= self.highest_bid {
+            revert BidNotHighEnough(highest_bid: self.highest_bid)
+        }
+        if self.highest_bid != 0 {
+            self.pending_returns[self.highest_bidder] += self.highest_bid
+        }
+        self.highest_bidder = ctx.msg_sender()
+        self.highest_bid = ctx.msg_value()
+
+        ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))
+    }
+
+    pub fn withdraw(mut self, mut ctx: Context) -> bool {
+        let amount: u256 = self.pending_returns[ctx.msg_sender()]
+
+        if amount > 0 {
+            self.pending_returns[ctx.msg_sender()] = 0
+            ctx.send_value(to: ctx.msg_sender(), wei: amount)
+        }
+        return true
+    }
+
+    pub fn auction_end(mut self, mut ctx: Context) {
+        if ctx.block_timestamp() <= self.auction_end_time {
+            revert AuctionNotYetEnded()
+        }
+        if self.ended {
+            revert AuctionEndAlreadyCalled()
+        }
+        self.ended = true
+        ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid))
+
+        ctx.send_value(to: self.beneficiary, wei: self.highest_bid)
+    }
+
+    pub fn check_highest_bidder(self) -> address {
+        return self.highest_bidder;
+    }
+
+    pub fn check_highest_bid(self) -> u256 {
+        return self.highest_bid;
+    }
+
+    pub fn check_ended(self) -> bool {
+        return self.ended;
+    }
+}
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/user-guide/example_contracts/index.html b/docs/user-guide/example_contracts/index.html new file mode 100644 index 0000000000..31b7ad9d32 --- /dev/null +++ b/docs/user-guide/example_contracts/index.html @@ -0,0 +1,231 @@ + + + + + + Example Contracts - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Example Contracts

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/user-guide/external_links.html b/docs/user-guide/external_links.html new file mode 100644 index 0000000000..c3643c37a4 --- /dev/null +++ b/docs/user-guide/external_links.html @@ -0,0 +1,289 @@ + + + + + + Useful external links - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Useful external links

+

There are not many resources for Fe outside of the official documentation at this time. This section lists useful links to external resources.

+

Tools

+ +

Projects

+
    +
  • Bountiful - Bug bounty platform written in Fe, live on Mainnet
  • +
  • Simple DAO - A Simple DAO written in Fe - live on Mainnet and Optimism
  • +
+

Hackathon projects

+

These are community projects written in Fe at various hackathons.

+
    +
  • +

    Fixed-Point Numerical Library - A fixed-point number representation and mathematical operations tailored for Fe. It can be used in financial computations, scientific simulations, and data analysis.

    +
  • +
  • +

    p256verifier - Secp256r1 (a.k.a p256) curve signature verifier which allows for verification of a P256 signature in fe.

    +
  • +
  • +

    Account Storage with Efficient Sparse Merkle Trees - Efficient Sparse Merkle Trees in Fe! SMTs enable inclusion and exclusion proofs for the entire set of Ethereum addresses.

    +
  • +
  • +

    Tic Tac Toe - An implementation of the classic tic tac toe game in Fe with a Python frontend.

    +
  • +
  • +

    Fecret Santa - Fecret Santa is an onchain Secret Santa event based on a "chain": gift a collectible (ERC721 or ERC1155) to the last Santa and you'll be the next to receive a gift!

    +
  • +
  • +

    Go do it - A commitment device to help you achieve your goals.

    +
  • +
  • +

    Powerbald - On chain lottery written in Fe

    +
  • +
  • +

    sspc-flutter-fe - Stupid Simple Payment Channel written in Fe

    +
  • +
+

Others

+ +

Blog posts

+ +

Videos

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/user-guide/index.html b/docs/user-guide/index.html new file mode 100644 index 0000000000..7fc98a6870 --- /dev/null +++ b/docs/user-guide/index.html @@ -0,0 +1,236 @@ + + + + + + Using Fe - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

User guide

+

Welcome to the Fe user guide!

+

Here you can find information about how to use Fe to develop smart contracts.

+

Read more about:

+ +

We are still building this section of the site, but you can expect to find other materials such as reference documentation, project examples and walkthrough guides here soon!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/user-guide/installation.html b/docs/user-guide/installation.html new file mode 100644 index 0000000000..5fb65478ea --- /dev/null +++ b/docs/user-guide/installation.html @@ -0,0 +1,295 @@ + + + + + + Installation - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Installation

+

At this point Fe is available for Linux and MacOS natively but can also be installed on Windows via WSL.

+
+

Note: If you happen to be a Windows developer, consider getting involved +and help us to support the Windows platform natively. Here would be a good place to start.

+
+

On a computer with MacOS and an ARM chip, you need to install Rosetta, Apple's x86-to-ARM translator, to be able to run the executable.

+
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
+
+

Package managers

+

Fe can be installed from Homebrew. Homebrew is available for Mac, Linux and Windows (via WSL). The following command installs Fe and exposes it as fe without any further configuration necessary:

+
brew install fe-lang/tap/fe
+
+

Download the compiler

+

Fe is distributed via a single executable file linked from the home page. In the future we will make sure it can be installed through a variety of popular package managers such as apt.

+

Depending on your operating system, the file that you download is either named fe_amd64 or fe_mac.

+
+

Note: We will rename the file to fe and assume that name for the rest of the guide. In the future when Fe can be installed via other mechanisms we can assume fe to become the canonical command name.

+
+

Add permission to execute

+

In order to be able to execute the Fe compiler we will have to make the file executable. This can be done by navigating to the directory where the file is located and executing chmod + x <filename> (e.g. chmod +x fe).

+

After we have set the proper permissions we should be able to run ./fe and an output that should be roughly comparable to:

+
fe 0.21.0-alpha
+The Fe Developers <snakecharmers@ethereum.org>
+An implementation of the Fe smart contract language
+
+USAGE:
+    fe_amd64_latest <SUBCOMMAND>
+
+OPTIONS:
+    -h, --help       Print help information
+    -V, --version    Print version information
+
+SUBCOMMANDS:
+    build    Build the current project
+    check    Analyze the current project and report errors, but don't build artifacts
+    help     Print this message or the help of the given subcommand(s)
+    new      Create new fe project
+
+

Building from source

+

You can also build Fe from the source code provided in our Github repository. To do this you will need to have Rust installed. Then, clone the github repository using:

+
git clone https://github.com/ethereum/fe.git
+
+

Depending on your environment you may need to install some additional packages before building the Fe binary, specifically libboost-all-dev, libclang and cmake. For example, on a Linux system:

+
sudo apt-get update &&\
+ apt-get install libboost-all-dev &&\
+ apt-get install libclang-dev &&\
+ apt-get install cmake
+
+

Navigate to the folder containing the Fe source code.

+
cd fe
+
+

Now, use Rust to build the Fe binary. To run Fe, you need to build using solc-backend.

+
cargo build -r --feature solc-backend
+
+

You will now find your Fe binary in /target/release. Check the build with:

+
./target/release/fe --version
+
+

If everything worked, you should see the Fe version printed to the terminal:

+
fe 0.24.0
+
+

You can run the built-in tests using:

+
cargo test --workspace --features solc-backend
+
+

Editor support & Syntax highlighting

+

Fe is a new language and editor support is still in its early days. However, basic syntax highlighting is available for Visual Studio Code via this VS Code extension.

+

In Visual Studio Code open the extension sidebar (Ctrl-Shift-P / Cmd-Shift-P, then "Install Extension") and search for fe-lang.code-ve. Click on the extension and then click on the Install button.

+

We are currently working on a Language Server Protocol (LSP), which in the future will enable more advanced editor features such as code completion, go-to definition and refactoring.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/user-guide/projects.html b/docs/user-guide/projects.html new file mode 100644 index 0000000000..8f7d720482 --- /dev/null +++ b/docs/user-guide/projects.html @@ -0,0 +1,287 @@ + + + + + + Using projects - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Fe projects

+

A project is a collection of files containing Fe code and configuration data. Often, smart contract development can become too complex to contain all the necessary code inside a single file. In these cases, it is useful to organize your work into multiple files and directories. This allows you to group thematically linked code and selectively import the code you need when you need it.

+

Creating a project

+

You can start a project using the new subcommand:

+

$ fe new <my_project>

+

This will generate a template project containing the following:

+
    +
  • A src directory containing two .fe files.
  • +
  • A fe.toml manifest with basic project info and some local project imports.
  • +
+

Manifest

+

The fe.toml file is known as a manifest. The manifest is written in TOML format. The purpose of this file is to provide all the metadata that is required for the project to compile. The file begins with definitions for the project name and version, then the project dependencies are listed under a heading [dependencies]. Dependencies are files in the local filesystem that are required for your project to run.

+

For example:

+
name="my-project"
+version = "1.0"
+
+[dependencies]
+dependency_1 = "../lib"
+
+

You can also specify which version of a particular dependency you want to use, using curly braces:

+
name="my-project"
+version = "1.0"
+
+[dependencies]
+dependency_1 = {path = "../lib", version = "1.0"}
+
+

Project modes

+

There are two project modes: main and lib.

+

Main projects can import libraries and have code output.

+

Libraries on the other hand cannot import main projects and do not have code outputs. Their purpose is to be imported into other projects.

+

The mode of a project is determined automatically by the presence of either src/main.fe or src/lib.fe.

+

Importing

+

You can import code from external files with the following syntax:

+
#![allow(unused)]
+fn main() {
+use utils::get_42
+}
+

This will import the get_42 function from the file utils.fe.

+

You can also import using a custom name/alias:

+
#![allow(unused)]
+fn main() {
+use utils::get_42 as get_42
+}
+

Tests

+

The templates created using fe new include a simple test demonstrating the test syntax.

+

To write a unit test, create a function with a name beginning with test_. The function should instantiate your contract and call the contract function you want to test. You can use assert to check that the returned value matches an expected value.

+

For example, to test the say_hello function on Contract which is expected to return the string "hello":

+
#![allow(unused)]
+fn main() {
+fn test_contract(mut ctx: Context) {
+    let contract: Contract = Contract.create(ctx, 0)
+    assert main.say_hello() == "hello"
+}
+}
+

You can run all the tests in a project by running the following command:

+
fe test <project-root>
+
+

You will receive test results directly to the console.

+

Running your project

+

Once you have created a project, you can run the usual Fe CLI subcommands against the project path.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/user-guide/tutorials/auction.html b/docs/user-guide/tutorials/auction.html new file mode 100644 index 0000000000..ca7a85a28c --- /dev/null +++ b/docs/user-guide/tutorials/auction.html @@ -0,0 +1,454 @@ + + + + + + Open auction - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Auction contract

+

This tutorial aims to implement a simple auction contract in Fe. Along the way you will learn some foundational Fe concepts.

+

An open auction is one where prices are determined in real-time by live bidding. The winner is the participant who has made the highest bid at the time the auction ends.

+

The auction rules

+

To run an open auction, you need an item for sale, a seller, a pool of buyers and a deadline after which no more bids will be recognized. In this tutorial we will not have an item per se, the buyers are simply bidding to win! The highest bidder is provably crowned the winner, and the value of their bid is passed to the beneficiary. Bidders can also withdraw their bids at any time.

+

Get Started

+

To follow this guide you should have Fe installed on your computer. If you haven't installed Fe yet, follow the instructions on the Installation page.

+

With Fe installed, you can create a project folder, auction that will act as your project root. In that folder, create an empty file called auction.fe.

+

Now you are ready to start coding in Fe!

+

You will also need Foundry installed to follow the deployment instructions in this guide - you can use your alternative tooling for this if you prefer.

+

Writing the Contract

+

You can see the entire contract here. You can refer back to this at any time to check implementation details.

+

Defining the Contract and initializing variables

+

A contract in Fe is defined using the contract keyword. A contract requires a constructor function to initialize any state variables used by the contract. If no constructor is defined, Fe will add a default with no state variables. The skeleton of the contract can look as follows:

+
#![allow(unused)]
+fn main() {
+contract Auction {
+    pub fn __init__() {}
+}
+}
+

To run the auction you will need several state variables, some of which can be initialized at the time the contract is instantiated. +You will need to track the address of the beneficiary so you know who to pay out to. You will also need to keep track of the highest bidder, and the amount they have bid. You will also need to keep track of how much each specific address has sent into the contract, so you can refund them the right amount if they decide to withdraw. You will also need a flag that tracks whether or not the auction has ended. The following list of variables will suffice:

+
auction_end_time: u256
+beneficiary: address
+highest_bidder: address
+highest_bid: u256
+pending_returns: Map<address, u256>
+ended: bool
+
+

Notice that variables are named using snake case (lower case, underscore separated, like_this). +Addresses have their own type in Fe - it represents 20 hex-encoded bytes as per the Ethereum specification.

+

The variables that expect numbers are given the u256 type. This is an unsigned integer of length 256 bits. There are other choices for integers too, with both signed and unsigned integers between 8 and 256 bits in length.

+

The ended variable will be used to check whether the auction is live or not. If it has finished ended will be set to true. There are only two possible states for this, so it makes sense to declare it as a bool - i.e. true/false.

+

The pending_returns variable is a mapping between N keys and N values, with user addresses as the keys and their bids as values. For this, a Map type is used. In Fe, you define the types for the key and value in the Map definition - in this case, it is Map<address, u256>. Keys can be any numeric type, address, boolean or unit.

+

Now you should decide which of these variables will have values that are known at the time the contract is instantiated. It makes sense to set the beneficiary right away, so you can add that to the constructor arguments.

+

The other thing to consider here is how the contract will keep track of time. On its own, the contract has no concept of time. However, the contract does have access to the current block timestamp which is measured in seconds since the Unix epoch (Jan 1st 1970). This can be used to measure the time elapsed in a smart contract. In this contract, you can use this concept to set a deadline on the auction. By passing a length of time in seconds to the constructor, you can then add that value to the current block timestamp and create a deadline for bidding to end. Therefore, you should add a bidding_time argument to the constructor. Its type can be u256.

+

When you have implemented all this, your contract should look like this:

+
contract Auction {
+    // states
+    auction_end_time: u256
+    beneficiary: address
+    highest_bidder: address
+    highest_bid: u256
+    pending_returns: Map<address, u256>
+    ended: bool
+
+    // constructor
+    pub fn __init__(mut self, ctx: Context, bidding_time: u256, beneficiary_addr: address) {
+        self.beneficiary = beneficiary_addr
+        self.auction_end_time = ctx.block_timestamp() + bidding_time
+    }
+}
+
+

Notice that the constructor receives values for bidding_time and beneficiary_addr and uses them to initialize the contract's auction_end_time and beneficiary variables.

+

The other thing to notice about the constructor is that there are two additional arguments passed to the constructor: mut self and ctx: Context.

+

self

+

self is used to represent the specific instance of a Contract. It is used to access variables that are owned by that specific instance. This works the same way for Fe contracts as for, e.g. 'self' in the context of classes in Python, or this in Javascript.

+

Here, you are not only using self but you are prepending it with mut. mut is a keyword inherited from Rust that indicates that the value can be overwritten - i.e. it is "mutable". Variables are not mutable by default - this is a safety feature that helps protect developers from unintended changes during runtime. If you do not make self mutable, then you will not be able to update the values it contains.

+

Context

+

Context is used to gate access to certain features including emitting logs, creating contracts, reading messages and transferring ETH. It is conventional to name the context object ctx. The Context object needs to be passed as the first parameter to a function unless the function also takes self, in which case the Context object should be passed as the second parameter. Context must be explicitly made mutable if it will invoke functions that changes the blockchain data, whereas an immutable reference to Context can be used where read-only access to the blockchain is needed.

+

Read more on Context in Fe

+

In Fe contracts ctx is where you can find transaction data such as msg.sender, msg.value, block.timestamp etc.

+

Bidding

+

Now that you have your contract constructor and state variables, you can implement some logic for receiving bids. To do this, you will create a method called bid. To handle a bid, you will first need to determine whether the auction is still open. If it has closed then the bid should revert. If the auction is open you need to record the address of the bidder and the amount and determine whether their bid was the highest. If their bid is highest, then their address should be assigned to the highest_bidder variable and the amount they sent recorded in the highest_bid variable.

+

This logic can be implemented as follows:

+
#![allow(unused)]
+fn main() {
+pub fn bid(mut self, mut ctx: Context) {
+    if ctx.block_timestamp() > self.auction_end_time {
+        revert AuctionAlreadyEnded()
+    }
+    if ctx.msg_value() <= self.highest_bid {
+        revert BidNotHighEnough(highest_bid: self.highest_bid)
+    }
+    if self.highest_bid != 0 {
+        self.pending_returns[self.highest_bidder] += self.highest_bid
+    }
+    self.highest_bidder = ctx.msg_sender()
+    self.highest_bid = ctx.msg_value()
+
+    ctx.emit(HighestBidIncreased(bidder: ctx.msg_sender(), amount: ctx.msg_value()))
+}
+}
+

The method first checks that the current block timestamp is not later than the contract's aution_end_time variable. If it is later, then the contract reverts. This is triggered using the revert keyword. The revert can accept a struct that becomes encoded as revert data. Here you can just revert without any arguments. Add the following definition somewhere in Auction.fe outside the main contract definition:

+
struct AuctionAlreadyEnded {
+}
+
+

The next check is whether the incoming bid exceeds the current highest bid. If not, the bid has failed and it may as well revert. We can repeat the same logic as for AuctionAlreadyEnded. We can also report the current highest bid in the revert message to help the user reprice if they want to. Add the following to auction.fe:

+
struct BidNotHighEnough {
+    pub highest_bid: u256
+}
+
+
+

Notice that the value being checked is msg.value which is included in the ctx object. ctx is where you can access incoming transaction data.

+
+

Next, if the incoming transaction is the highest bid, you need to track how much the sender should receive as a payout if their bid ends up being exceeded by another user (i.e. if they get outbid, they get their ETH back). To do this, you add a key-value pair to the pending_returns mapping, with the user address as the key and the transaction amount as the value. Both of these come from ctx in the form of msg.sender and msg.value.

+

Finally, if the incoming bid is the highest, you can emit an event. Events are useful because they provide a cheap way to return data from a contract as they use logs instead of contract storage. Unlike other smart contract languages, there is no emit keyword or Event type. Instead, you trigger an event by calling the emit method on the ctx object. You can pass this method a struct that defines the emitted message. You can add the following struct for this event:

+
struct HighestBidIncreased {
+    #indexed
+    pub bidder: address
+    pub amount: u256
+}
+
+

You have now implemented all the logic to handle a bid!

+

Withdrawing

+

A previous high-bidder will want to retrieve their ETH from the contract so they can either walk away or bid again. You therefore need to create a withdraw method that the user can call. The function will lookup the user address in pending_returns. If there is a non-zero value associated with the user's address, the contract should send that amount back to the sender's address. It is important to first update the value in pending_returns and then send the ETH to the user, otherwise you are exposing a re-entrancy vulnerability (where a user can repeatedly call the contract and receive the ETH multiple times).

+

Add the following to the contract to implement the withdraw method:

+
#![allow(unused)]
+fn main() {
+pub fn withdraw(mut self, mut ctx: Context) -> bool {
+    let amount: u256 = self.pending_returns[ctx.msg_sender()]
+
+    if amount > 0 {
+        self.pending_returns[ctx.msg_sender()] = 0
+        ctx.send_value(to: ctx.msg_sender(), wei: amount)
+    }
+    return true
+}
+}
+
+

Note that in this case mut is used with ctx because send_value is making changes to the blockchain (it is moving ETH from one address to another).

+
+

End the auction

+

Finally, you need to add a way to end the auction. This will check whether the bidding period is over, and if it is, automatically trigger the payment to the beneficiary and emit the address of the winner in an event.

+

First, check the auction is not still live - if the auction is live you cannot end it early. If an attempt to end the auction early is made, it should revert using a AuctionNotYetEnded struct, which can look as follows:

+
struct AuctionNotYetEnded {
+}
+
+

You should also check whether the auction was already ended by a previous valid call to this method. In this case, revert with a AuctionEndAlreadyCalled struct:

+
struct AuctionEndAlreadyCalled {}
+
+

If the auction is still live, you can end it. First set self.ended to true to update the contract state. Then emit the event using ctx.emit(). Then, send the ETH to the beneficiary. Again, the order is important - you should always send value last to protect against re-entrancy. +Your method can look as follows:

+
#![allow(unused)]
+fn main() {
+pub fn action_end(mut self, mut ctx: Context) {
+    if ctx.block_timestamp() <= self.auction_end_time {
+        revert AuctionNotYetEnded()
+    }
+    if self.ended {
+        revert AuctionEndAlreadyCalled()
+    }
+    self.ended = true
+    ctx.emit(AuctionEnded(winner: self.highest_bidder, amount: self.highest_bid))
+
+    ctx.send_value(to: self.beneficiary, wei: self.highest_bid)
+}
+}
+

Congratulations! You just wrote an open auction contract in Fe!

+

View functions

+

To help test the contract without having to decode transaction logs, you can add some simple functions to the contract that simply report the current values for some key state variables (specifically, highest_bidder, highest_bid and ended). This will allow a user to use eth_call to query these values in the contract. eth_call is used for functions that do not update the state of the blockchain and costs no gas because the queries can be performed on local data.

+

You can add the following functions to the contract:

+
#![allow(unused)]
+fn main() {
+pub fn check_highest_bidder(self) -> address {
+    return self.highest_bidder;
+}
+
+pub fn check_highest_bid(self) -> u256 {
+    return self.highest_bid;
+}
+
+pub fn check_ended(self) -> bool {
+    return self.ended;
+}
+}
+

Build and deploy the contract

+

Your contract is now ready to use! Compile it using

+
fe build auction.fe
+
+

You will find the contract ABI and bytecode in the newly created outputs directory.

+

Start a local blockchain to deploy your contract to:

+
anvil
+
+

There are constructor arguments (bidding_time: u256, beneficiary_addr: address) that have to be added to the contract bytecode so that the contract is instantiated with your desired values. To add constructor arguments you can encode them into bytecode and append them to the contract bytecode.

+

First, hex encode the value you want to pass to bidding_time. In this case, we will use a value of 10:

+
cast --to_hex(10)
+
+>> 0xa // this is 10 in hex
+
+

Ethereum addresses are already hex, so there is no further encoding required. The following command will take the constructor function and the hex-encoded arguments and concatenate them into a contiguous hex string and then deploy the contract with the constructor arguments.

+
cast send --from <your-address> --private-key <your-private-key> --create $(cat output/Auction/Auction.bin) $(cast abi-encode "__init__(uint256,address)" 0xa 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720)
+
+

You will see the contract address reported in your terminal.

+

Now you can interact with your contract. Start by sending an initial bid, let's say 100 ETH. For contract address 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35:

+
cast send 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "bid()" --value "100ether" --private-key <your-private-key> --from 0xa0Ee7A142d267C1f36714E4a8F75612F20a79720
+
+

You can check whether this was successful by calling the check_highest_bidder() function:

+
cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "check_highest_bidder()"
+
+

You will see a response looking similar to:

+
0x000000000000000000000000a0Ee7A142d267C1f36714E4a8F75612F20a79720
+
+

The characters after the leading zeros are the address for the highest bidder (notice they match the characters after the 0x in the bidding address).

+

You can do the same to check the highest bid:

+
cast call 0x700b6A60ce7EaaEA56F065753d8dcB9653dbAD35 "check_highest_bid()"
+
+

This returns:

+
0x0000000000000000000000000000000000000000000000056bc75e2d63100000
+
+

Converting the non-zero characters to binary gives the decimal value of your bid (in wei - divide by 1e18 to get the value in ETH):

+
cast --to-dec 56bc75e2d63100000
+
+>> 100000000000000000000 // 100 ETH in wei
+
+

Now you can repeat this process, outbidding the initial bid from another address and check the highest_bidder() and highest_bid() to confirm. Do this a few times, then call end_auction() to see the value of the highest bid get transferred to the beneficiary_addr. You can always check the balance of each address using:

+
cast balance <address>
+
+

And check whether the auction open time has expired using

+
cast <contract-address> "check_ended()"
+
+

Summary

+

Congratulations! You wrote an open auction contract in Fe and deployed it to a local blockchain!

+

If you are using a local Anvil blockchain, you can use the ten ephemeral addresses created when the network started to simulate a bidding war!

+

By following this tutorial, you learned:

+
    +
  • basic Fe types, such as bool, address, map and u256
  • +
  • basic Fe styles, such as snake case for variable names
  • +
  • how to create a contract with a constructor
  • +
  • how to revert
  • +
  • how to handle state variables
  • +
  • how to avoid reentrancy
  • +
  • how to use ctx to handle transaction data
  • +
  • how to emit events using ctx.emit
  • +
  • how to deploy a contract with constructor arguments using Foundry
  • +
  • how to interact with your contract
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/user-guide/tutorials/index.html b/docs/user-guide/tutorials/index.html new file mode 100644 index 0000000000..b2aa52bdb0 --- /dev/null +++ b/docs/user-guide/tutorials/index.html @@ -0,0 +1,234 @@ + + + + + + Tutorials - The Fe Guide + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Tutorials

+

Welcome to the Tutorials section. We will be adding walkthrough guides for example Fe projects here!

+

For now, you can get started with:

+ +

Watch this space for more tutorials coming soon!

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/logo/fe_svg/fe_source_small_size.svg b/fe-logo-small.svg similarity index 100% rename from logo/fe_svg/fe_source_small_size.svg rename to fe-logo-small.svg diff --git a/logo/fe_svg/fe_source.svg b/fe-logo.svg similarity index 100% rename from logo/fe_svg/fe_source.svg rename to fe-logo.svg diff --git a/fe.toml b/fe.toml deleted file mode 100644 index 41569a037a..0000000000 --- a/fe.toml +++ /dev/null @@ -1,7 +0,0 @@ -[workspace] -name = "Fe" -version = "0.1.0" -members = [ - { path = "ingots/core", name = "core" }, - { path = "ingots/std", name = "std" }, -] diff --git a/feup/feup.sh b/feup/feup.sh deleted file mode 100755 index bce888ac8b..0000000000 --- a/feup/feup.sh +++ /dev/null @@ -1,386 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -REPO="argotorg/fe" -FE_HOME="${FE_HOME:-$HOME/.fe}" -FE_BIN_DIR="$FE_HOME/bin" -MODIFY_PATH=true -REQUESTED_VERSION="" - -# --- Colors --- - -setup_colors() { - if [ -t 1 ]; then - BOLD="\033[1m" - GREEN="\033[0;32m" - YELLOW="\033[0;33m" - RED="\033[0;31m" - CYAN="\033[0;36m" - RESET="\033[0m" - else - BOLD="" - GREEN="" - YELLOW="" - RED="" - CYAN="" - RESET="" - fi -} - -say() { - printf "%b\n" "${GREEN}${BOLD}feup${RESET}: $1" -} - -warn() { - printf "%b\n" "${YELLOW}${BOLD}warning${RESET}: $1" >&2 -} - -err() { - printf "%b\n" "${RED}${BOLD}error${RESET}: $1" >&2 - exit 1 -} - -# --- Dependency checks --- - -need_cmd() { - if ! command -v "$1" > /dev/null 2>&1; then - err "need '$1' (command not found)" - fi -} - -# --- Usage --- - -usage() { - cat </dev/null | grep -q 1; then - warn "running under Rosetta 2 — installing native arm64 binary" - ARCH="arm64" - else - ARCH="amd64" - fi - ;; - aarch64|arm64) - ARCH="arm64" - ;; - *) err "unsupported architecture: $arch" ;; - esac -} - -# --- Version resolution --- - -resolve_version() { - if [ -n "$REQUESTED_VERSION" ]; then - # Ensure version starts with 'v' - case "$REQUESTED_VERSION" in - v*) VERSION="$REQUESTED_VERSION" ;; - *) VERSION="v${REQUESTED_VERSION}" ;; - esac - return - fi - - say "fetching latest release..." - - local curl_args=(-sL --fail) - if [ -n "${GITHUB_TOKEN:-}" ]; then - curl_args+=(-H "Authorization: token $GITHUB_TOKEN") - fi - - # Get the most recent release (including pre-releases) via the API - local api_response - api_response=$(curl "${curl_args[@]}" "https://api.github.com/repos/${REPO}/releases?per_page=1") || { - err "failed to fetch release info from GitHub. If rate-limited, set GITHUB_TOKEN" - } - - if command -v jq >/dev/null 2>&1; then - VERSION=$(printf '%s' "$api_response" | jq -r 'map(select(.draft == false))[0].tag_name // empty') - else - VERSION=$(printf '%s' "$api_response" | grep -o '"tag_name":[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"tag_name":[[:space:]]*"//;s/"//') - fi - - if [ -z "$VERSION" ]; then - err "could not determine latest version from GitHub API" - fi -} - -# --- Download --- - -download_fe() { - local asset_name="fe_${OS}_${ARCH}" - local url="https://github.com/${REPO}/releases/download/${VERSION}/${asset_name}" - - say "installing Fe ${CYAN}${VERSION}${RESET}" - say " platform: ${CYAN}${OS}_${ARCH}${RESET}" - say " url: ${CYAN}${url}${RESET}" - - mkdir -p "$FE_BIN_DIR" - - local tmp_file - tmp_file=$(mktemp) - trap 'rm -f "$tmp_file"' EXIT - - local curl_args=(-L --fail --progress-bar -o "$tmp_file") - if [ -n "${GITHUB_TOKEN:-}" ]; then - curl_args+=(-H "Authorization: token $GITHUB_TOKEN") - fi - - curl "${curl_args[@]}" "$url" || { - rm -f "$tmp_file" - err "download failed — check that version '${VERSION}' exists and has an asset for ${OS}_${ARCH} - url: ${url}" - } - - chmod +x "$tmp_file" - - # macOS quarantines binaries downloaded via curl; remove the flag so the - # binary can execute without Gatekeeper killing it (Abort trap: 6). - if [ "$OS" = "mac" ]; then - xattr -d com.apple.quarantine "$tmp_file" 2>/dev/null || true - fi - - mv "$tmp_file" "$FE_BIN_DIR/fe" - trap - EXIT - - say " installed to: ${CYAN}${FE_BIN_DIR}/fe${RESET}" -} - -# --- Install feup itself --- - -install_feup() { - # Place this script into FE_BIN_DIR so `feup` is available for future updates. - local target="$FE_BIN_DIR/feup" - local self - local script_ref="${VERSION}" - local script_url - local fallback_url - self="$(cd "$(dirname "$0")" 2>/dev/null && pwd)/$(basename "$0")" - - if [ -f "$self" ]; then - # Running from a file — copy it (unless it IS the target already). - local self_abs target_abs - self_abs="$(cd "$(dirname "$self")" && pwd -P)/$(basename "$self")" - target_abs="$(cd "$(dirname "$target")" 2>/dev/null && pwd -P)/$(basename "$target")" 2>/dev/null || true - if [ "$self_abs" = "$target_abs" ]; then - return - fi - cp "$self" "$target" - else - # Running via pipe (curl | bash) — prefer matching version, then fall back to master. - script_url="https://raw.githubusercontent.com/${REPO}/${script_ref}/feup/feup.sh" - fallback_url="https://raw.githubusercontent.com/${REPO}/master/feup/feup.sh" - say "downloading feup script (${script_ref})..." - local curl_args=(-fsSL -o "$target") - if [ -n "${GITHUB_TOKEN:-}" ]; then - curl_args+=(-H "Authorization: token $GITHUB_TOKEN") - fi - if ! curl "${curl_args[@]}" "$script_url"; then - warn "could not download feup script from ${script_url}" - if [ "$script_ref" != "main" ]; then - say "falling back to feup script (master)..." - if ! curl "${curl_args[@]}" "$fallback_url"; then - rm -f "$target" - warn "could not download feup script from ${fallback_url} — 'feup' command won't be available" - return 0 - fi - else - rm -f "$target" - warn "'feup' command won't be available" - return 0 - fi - fi - fi - - chmod +x "$target" -} - -# --- PATH configuration --- - -create_env_file() { - local env_file="$FE_HOME/env" - - cat > "$env_file" </dev/null; then - cat > "$fish_conf" </dev/null; then - continue - fi - printf '\n# Fe toolchain\n%s\n' "$source_line" >> "$profile" - modified=true - say " modified: ${CYAN}${profile}${RESET}" - done - - if [ "$modified" = true ]; then - say "" - say "restart your shell or run:" - say " ${CYAN}source \"$FE_HOME/env\"${RESET}" - fi -} - -# --- Main --- - -main() { - setup_colors - parse_args "$@" - - need_cmd curl - need_cmd chmod - need_cmd mkdir - need_cmd uname - - printf "\n" - say "${BOLD}feup${RESET} — the Fe toolchain installer" - printf "\n" - - detect_platform - resolve_version - download_fe - install_feup - create_env_file - modify_shell_profile - - printf "\n" - say "${GREEN}done!${RESET} Fe ${CYAN}${VERSION}${RESET} is installed at ${CYAN}${FE_BIN_DIR}/fe${RESET}" - - # Verify the installation - if "$FE_BIN_DIR/fe" --version > /dev/null 2>&1; then - local installed_version - installed_version=$("$FE_BIN_DIR/fe" --version 2>&1 || true) - say " ${installed_version}" - fi - - printf "\n" -} - -main "$@" diff --git a/funding.json b/funding.json deleted file mode 100644 index aa9d704e31..0000000000 --- a/funding.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "opRetro": { - "projectId": "0x541b7b08401d799b87f583c102a6c94cee7105f1b29dc630de5edbbd966d7c13" - } -} diff --git a/index.html b/index.html new file mode 100644 index 0000000000..6bb9aaa081 --- /dev/null +++ b/index.html @@ -0,0 +1,351 @@ + + + + + + + Fe - A next generation, statically typed, future-proof smart contract language for the Ethereum Virtual Machine + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ Fe Programming Language +
+
+ +
+
+ +
+
+
+
+ +
+

The next generation
smart contract language for Ethereum

+

Create decentralized applications in a powerful, future-proof and statically typed language that is easy to learn.

+

+
+
+
+
+
+ + + +

Beautiful and elegant

+

The syntax of Fe is largely inspired by Rust. It is easy to learn, even for those who have never dealt with the EVM before. Fe is designed to be safe and equipped with the tooling needed to validate contracts.

+
+
+ + + +

+ Simple yet powerful +

+

Fe seeks to restrict dynamic behavior without limiting expressiveness. Equipped with traits and generics you write clean code without sacrificing compile-time guarantees. +

+
+
+ + + +

Efficient

+

While currently YUL is used as IR, in the near future Fe will use the new LLVM-inspired compiler backend sonatina, which enables much more aggressive optimizations.

+
+
+
+

Explore some advanced contracts written in Fe

+ See examples → +
+
+ +
+
+

The next generation smart contract language.

+

Fe is an evolving smart contract language that strives to make EVM development safer, simpler and more fun.

+
+
+
+
+

+ + + + Static typing +

+

Statically typed and equipped with a powerful compiler, Fe guides us to write robust code and avoid bugs.

+
+
+

+ + + + Improved decidability +

+

Fe limits dynamic program behavior to improve decidability and allow more precise gas cost estimation.

+
+
+

+ + + + Standard library +

+

Fe aspires to offer a rich standard library to assist with common tasks of smart contract development.

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+                      
+                      
+// Structs can be emitted as events
+struct Signed {
+    pub book_msg: String<100>
+}
+
+// The `contract` keyword defines a new contract type
+contract GuestBook {
+    // Strings are generic over a constant number
+    // that restricts its maximum size
+    messages: Map<address, String<100>>
+
+    // Context is a struct provided by the standard library
+    // that gives access to various features of the EVM
+    pub fn sign(mut self, mut ctx: Context, book_msg: String<100>) {
+        // All storage access is explicit using `self.<some-key>`
+        self.messages[ctx.msg_sender()] = book_msg
+
+        // Emit the `Signed` event.
+        ctx.emit(Signed(book_msg))
+    }
+
+    pub fn get_msg(self, addr: address) -> String<100> {
+        // Copying data from storage to memory
+        // has to be done explicitly via `to_mem()`
+        return self.messages[addr].to_mem()
+    }
+}
+
+                    
+
+
+
+
+
+
+
+
+
+
+

Get involved

+ +

Fe is evolving at a rapid pace. Now is a great time to get involved with the next generation smart contract language.

+ + +
+
+ +
+ + + + + + + diff --git a/ingots/core/fe.toml b/ingots/core/fe.toml deleted file mode 100644 index c3ee6a2494..0000000000 --- a/ingots/core/fe.toml +++ /dev/null @@ -1,3 +0,0 @@ -[ingot] -name = "core" -version = "0.1.0" diff --git a/ingots/core/src/abi.fe b/ingots/core/src/abi.fe deleted file mode 100644 index d71b88d6dc..0000000000 --- a/ingots/core/src/abi.fe +++ /dev/null @@ -1,928 +0,0 @@ -use ingot::Copy -use ingot::num::IntDowncast - -/// Errors returned by ABI decoding/encoding helpers. -pub enum AbiError { - InputTooShort, - OutOfBounds, - InvalidSelector, - InvalidOffset, - NonCanonical, - InvalidBool, - InvalidUtf8, - LengthOverflow, - AllocationFailed, -} - -/// Generic read-only byte input for ABI decoding. -/// -/// Implementations may return padded values (e.g. EVM calldata loads) so callers -/// must use `len()` to enforce bounds/canonicality. -pub trait ByteInput: Copy { - fn len(self) -> u256 - fn word_at(self, byte_offset: u256) -> u256 - fn byte_at(self, byte_offset: u256) -> u8 -} - -/// First-word prefix used for fast dispatch. -pub struct Prefix { - pub len: u256, - pub word0: u256, -} - -pub fn prefix(input: I) -> Prefix { - Prefix { - len: input.len(), - word0: input.word_at(0), - } -} - -/// Generic cursor over a `ByteInput`. -pub struct Cursor { - pub input: I, - pub pos: u256, -} - -impl Cursor - where I: ByteInput -{ - pub fn new(input: own I) -> Self { - Cursor { - input, - pos: 0, - } - } - - pub fn fork(self, pos: u256) -> Self { - Cursor { - input: self.input, - pos, - } - } - - pub fn read_u8(mut self) -> u8 { - let b = self.input.byte_at(self.pos) - self.pos = self.pos + 1 - b - } - - pub fn read_word(mut self) -> u256 { - let w = self.input.word_at(self.pos) - self.pos = self.pos + 32 - w - } - - pub fn peek_word(self, at: u256) -> u256 { - self.input.word_at(at) - } -} - -/// ABI definition (selector width/format). -pub trait Abi { - type Selector - /// Higher-kinded type constructor for a decoder over some `ByteInput`. - type Decoder: * -> * - /// ABI encoder type. - type Encoder: AbiEncoder - - /// Size of the selector in bytes. - const SELECTOR_SIZE: u256 - - fn selector_from_prefix(_: u256) -> Self::Selector - - fn decoder_new(_: own I) -> Self::Decoder - fn decoder_with_base(_: own I, base: u256) -> Self::Decoder - - fn encoder_new() -> Self::Encoder -} - -/// ABI decoder with cursor state and an allocation hook. -pub trait AbiDecoder { - type Input: ByteInput - - fn input(self) -> Self::Input - fn base(self) -> u256 - fn pos(self) -> u256 - fn set_pos(mut self, new_pos: u256) - - fn read_u8(mut self) -> u8 - fn read_word(mut self) -> u256 - fn peek_word(self, at: u256) -> u256 - - fn alloc(mut self, size: u256) -> u256 -} - -/// ABI encoder with cursor state and dynamic tail allocation. -pub trait AbiEncoder { - fn base(self) -> u256 - fn pos(self) -> u256 - fn set_pos(mut self, new_pos: u256) - - fn write_u8(mut self, v: u8) - fn write_word(mut self, v: u256) - fn write_word_at(mut self, at: u256, v: u256) - - fn reserve_head(mut self, bytes: u256) -> u256 - fn append_tail(mut self, bytes: u256) -> u256 - - fn finish(self) -> (u256, u256) -} - -/// ABI static encoded size in bytes. -/// -/// This is the fixed (compile-time) encoded size for a type under Fe's ABI model. -pub trait AbiSize { - const ENCODED_SIZE: u256 -} - -pub trait Decode { - fn decode>(_: mut D) -> Self -} - -pub trait Encode { - fn encode>(own self, _: mut E) -} - -pub fn decode_or_revert(d: mut D) -> T - where T: Decode, D: AbiDecoder -{ - T::decode(d) -} - -pub struct BytesView { - pub input: I, - pub start: u256, - pub len: u256, -} - -impl BytesView - where I: ByteInput -{ - pub fn byte_at(self, offset: u256) -> u8 { - self.input.byte_at(self.start + offset) - } - - pub fn word_at(self, offset: u256) -> u256 { - self.input.word_at(self.start + offset) - } -} - -pub struct StringView { - pub bytes: BytesView, -} - -impl AbiSize for u256 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for String { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for bool { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for u8 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for u16 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for u32 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for u64 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for u128 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for i8 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for i16 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for i32 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for i64 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for i128 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for i256 { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for usize { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for isize { - const ENCODED_SIZE: u256 = 32 -} - -impl AbiSize for () { - const ENCODED_SIZE: u256 = 0 -} - -impl AbiSize for (T0,) - where T0: AbiSize -{ - const ENCODED_SIZE: u256 = T0::ENCODED_SIZE -} - -impl AbiSize for (T0, T1) - where T0: AbiSize, T1: AbiSize -{ - const ENCODED_SIZE: u256 = T0::ENCODED_SIZE + T1::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2) - where T0: AbiSize, T1: AbiSize, T2: AbiSize -{ - const ENCODED_SIZE: u256 = T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2, T3) - where T0: AbiSize, T1: AbiSize, T2: AbiSize, T3: AbiSize -{ - const ENCODED_SIZE: u256 = - T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE + T3::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2, T3, T4) - where T0: AbiSize, - T1: AbiSize, - T2: AbiSize, - T3: AbiSize, - T4: AbiSize -{ - const ENCODED_SIZE: u256 = - T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE + T3::ENCODED_SIZE + T4::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2, T3, T4, T5) - where T0: AbiSize, - T1: AbiSize, - T2: AbiSize, - T3: AbiSize, - T4: AbiSize, - T5: AbiSize -{ - const ENCODED_SIZE: u256 = - T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE + T3::ENCODED_SIZE + T4::ENCODED_SIZE + T5::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2, T3, T4, T5, T6) - where T0: AbiSize, - T1: AbiSize, - T2: AbiSize, - T3: AbiSize, - T4: AbiSize, - T5: AbiSize, - T6: AbiSize -{ - const ENCODED_SIZE: u256 = - T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE + T3::ENCODED_SIZE + T4::ENCODED_SIZE + T5::ENCODED_SIZE + T6::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2, T3, T4, T5, T6, T7) - where T0: AbiSize, - T1: AbiSize, - T2: AbiSize, - T3: AbiSize, - T4: AbiSize, - T5: AbiSize, - T6: AbiSize, - T7: AbiSize -{ - const ENCODED_SIZE: u256 = - T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE + T3::ENCODED_SIZE + T4::ENCODED_SIZE + T5::ENCODED_SIZE + T6::ENCODED_SIZE + T7::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2, T3, T4, T5, T6, T7, T8) - where T0: AbiSize, - T1: AbiSize, - T2: AbiSize, - T3: AbiSize, - T4: AbiSize, - T5: AbiSize, - T6: AbiSize, - T7: AbiSize, - T8: AbiSize -{ - const ENCODED_SIZE: u256 = - T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE + T3::ENCODED_SIZE + T4::ENCODED_SIZE + T5::ENCODED_SIZE + T6::ENCODED_SIZE + T7::ENCODED_SIZE + T8::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) - where T0: AbiSize, - T1: AbiSize, - T2: AbiSize, - T3: AbiSize, - T4: AbiSize, - T5: AbiSize, - T6: AbiSize, - T7: AbiSize, - T8: AbiSize, - T9: AbiSize -{ - const ENCODED_SIZE: u256 = - T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE + T3::ENCODED_SIZE + T4::ENCODED_SIZE + T5::ENCODED_SIZE + T6::ENCODED_SIZE + T7::ENCODED_SIZE + T8::ENCODED_SIZE + T9::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) - where T0: AbiSize, - T1: AbiSize, - T2: AbiSize, - T3: AbiSize, - T4: AbiSize, - T5: AbiSize, - T6: AbiSize, - T7: AbiSize, - T8: AbiSize, - T9: AbiSize, - T10: AbiSize -{ - const ENCODED_SIZE: u256 = - T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE + T3::ENCODED_SIZE + T4::ENCODED_SIZE + T5::ENCODED_SIZE + T6::ENCODED_SIZE + T7::ENCODED_SIZE + T8::ENCODED_SIZE + T9::ENCODED_SIZE + T10::ENCODED_SIZE -} - -impl AbiSize for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) - where T0: AbiSize, - T1: AbiSize, - T2: AbiSize, - T3: AbiSize, - T4: AbiSize, - T5: AbiSize, - T6: AbiSize, - T7: AbiSize, - T8: AbiSize, - T9: AbiSize, - T10: AbiSize, - T11: AbiSize -{ - const ENCODED_SIZE: u256 = - T0::ENCODED_SIZE + T1::ENCODED_SIZE + T2::ENCODED_SIZE + T3::ENCODED_SIZE + T4::ENCODED_SIZE + T5::ENCODED_SIZE + T6::ENCODED_SIZE + T7::ENCODED_SIZE + T8::ENCODED_SIZE + T9::ENCODED_SIZE + T10::ENCODED_SIZE + T11::ENCODED_SIZE -} - -impl Decode for u256 { - fn decode>(_ d: mut D) -> Self { - d.read_word() - } -} - -impl Encode for u256 { - fn encode>(own self, _ e: mut E) { - e.write_word(self) - } -} - -impl Decode for String { - fn decode>(_ d: mut D) -> Self { - super::todo() // TODO: string decoding - } -} - -impl Encode for String { - fn encode>(own self, _ e: mut E) { - e.write_word(super::addr_of(self)) - } -} - -impl Decode for bool { - fn decode>(_ d: mut D) -> Self { - d.read_word() != 0 - } -} - -impl Encode for bool { - fn encode>(own self, _ e: mut E) { - if self { - e.write_word(1) - } else { - e.write_word(0) - } - } -} - -impl Decode for u8 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for u8 { - fn encode>(own self, _ e: mut E) { - e.write_word(self as u256) - } -} - -impl Decode for u16 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for u16 { - fn encode>(own self, _ e: mut E) { - e.write_word(self as u256) - } -} - -impl Decode for u32 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for u32 { - fn encode>(own self, _ e: mut E) { - e.write_word(self as u256) - } -} - -impl Decode for u64 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for u64 { - fn encode>(own self, _ e: mut E) { - e.write_word(self as u256) - } -} - -impl Decode for u128 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for u128 { - fn encode>(own self, _ e: mut E) { - e.write_word(self as u256) - } -} - -impl Decode for i8 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for i8 { - fn encode>(own self, _ e: mut E) { - e.write_word(self.downcast_unchecked()) - } -} - -impl Decode for i16 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for i16 { - fn encode>(own self, _ e: mut E) { - e.write_word(self.downcast_unchecked()) - } -} - -impl Decode for i32 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for i32 { - fn encode>(own self, _ e: mut E) { - e.write_word(self.downcast_unchecked()) - } -} - -impl Decode for i64 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for i64 { - fn encode>(own self, _ e: mut E) { - e.write_word(self.downcast_unchecked()) - } -} - -impl Decode for i128 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for i128 { - fn encode>(own self, _ e: mut E) { - e.write_word(self.downcast_unchecked()) - } -} - -impl Decode for i256 { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for i256 { - fn encode>(own self, _ e: mut E) { - e.write_word(self.downcast_unchecked()) - } -} - -impl Decode for usize { - fn decode>(_ d: mut D) -> Self { - d.read_word() as usize - } -} - -impl Encode for usize { - fn encode>(own self, _ e: mut E) { - e.write_word(self as u256) - } -} - -impl Decode for isize { - fn decode>(_ d: mut D) -> Self { - d.read_word().downcast_unchecked() - } -} - -impl Encode for isize { - fn encode>(own self, _ e: mut E) { - e.write_word(self.downcast_unchecked()) - } -} - -impl Decode for () { - fn decode>(_ d: mut D) -> Self { - () - } -} - -impl Encode for () { - fn encode>(own self, _ e: mut E) { - } -} - -impl Decode for (T0,) - where T0: Decode -{ - fn decode>(_ d: mut D) -> Self { - (T0::decode(mut d),) - } -} - -impl Encode for (T0,) - where T0: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - } -} - -impl Decode for (T0, T1) - where T0: Decode, T1: Decode -{ - fn decode>(_ d: mut D) -> Self { - (T0::decode(mut d), T1::decode(mut d)) - } -} - -impl Encode for (T0, T1) - where T0: Encode, T1: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - } -} - -impl Decode for (T0, T1, T2) - where T0: Decode, T1: Decode, T2: Decode -{ - fn decode>(_ d: mut D) -> Self { - (T0::decode(mut d), T1::decode(mut d), T2::decode(mut d)) - } -} - -impl Encode for (T0, T1, T2) - where T0: Encode, T1: Encode, T2: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - } -} - -impl Decode for (T0, T1, T2, T3) - where T0: Decode, T1: Decode, T2: Decode, T3: Decode -{ - fn decode>(_ d: mut D) -> Self { - (T0::decode(mut d), T1::decode(mut d), T2::decode(mut d), T3::decode(mut d)) - } -} - -impl Encode for (T0, T1, T2, T3) - where T0: Encode, T1: Encode, T2: Encode, T3: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - self.3.encode(mut e) - } -} - -impl Decode for (T0, T1, T2, T3, T4) - where T0: Decode, T1: Decode, T2: Decode, T3: Decode, T4: Decode -{ - fn decode>(_ d: mut D) -> Self { - ( - T0::decode(mut d), - T1::decode(mut d), - T2::decode(mut d), - T3::decode(mut d), - T4::decode(mut d), - ) - } -} - -impl Encode for (T0, T1, T2, T3, T4) - where T0: Encode, T1: Encode, T2: Encode, T3: Encode, T4: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - self.3.encode(mut e) - self.4.encode(mut e) - } -} - -impl Decode for (T0, T1, T2, T3, T4, T5) - where T0: Decode, T1: Decode, T2: Decode, T3: Decode, T4: Decode, T5: Decode -{ - fn decode>(_ d: mut D) -> Self { - ( - T0::decode(mut d), - T1::decode(mut d), - T2::decode(mut d), - T3::decode(mut d), - T4::decode(mut d), - T5::decode(mut d), - ) - } -} - -impl Encode for (T0, T1, T2, T3, T4, T5) - where T0: Encode, T1: Encode, T2: Encode, T3: Encode, T4: Encode, T5: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - self.3.encode(mut e) - self.4.encode(mut e) - self.5.encode(mut e) - } -} - -impl Decode for (T0, T1, T2, T3, T4, T5, T6) - where T0: Decode, T1: Decode, T2: Decode, T3: Decode, T4: Decode, T5: Decode, T6: Decode -{ - fn decode>(_ d: mut D) -> Self { - ( - T0::decode(mut d), - T1::decode(mut d), - T2::decode(mut d), - T3::decode(mut d), - T4::decode(mut d), - T5::decode(mut d), - T6::decode(mut d), - ) - } -} - -impl Encode for (T0, T1, T2, T3, T4, T5, T6) - where T0: Encode, T1: Encode, T2: Encode, T3: Encode, T4: Encode, T5: Encode, T6: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - self.3.encode(mut e) - self.4.encode(mut e) - self.5.encode(mut e) - self.6.encode(mut e) - } -} - -impl Decode for (T0, T1, T2, T3, T4, T5, T6, T7) - where T0: Decode, T1: Decode, T2: Decode, T3: Decode, T4: Decode, T5: Decode, T6: Decode, T7: Decode -{ - fn decode>(_ d: mut D) -> Self { - ( - T0::decode(mut d), - T1::decode(mut d), - T2::decode(mut d), - T3::decode(mut d), - T4::decode(mut d), - T5::decode(mut d), - T6::decode(mut d), - T7::decode(mut d), - ) - } -} - -impl Encode for (T0, T1, T2, T3, T4, T5, T6, T7) - where T0: Encode, T1: Encode, T2: Encode, T3: Encode, T4: Encode, T5: Encode, T6: Encode, T7: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - self.3.encode(mut e) - self.4.encode(mut e) - self.5.encode(mut e) - self.6.encode(mut e) - self.7.encode(mut e) - } -} - -impl Decode for (T0, T1, T2, T3, T4, T5, T6, T7, T8) - where T0: Decode, T1: Decode, T2: Decode, T3: Decode, T4: Decode, T5: Decode, T6: Decode, T7: Decode, T8: Decode -{ - fn decode>(_ d: mut D) -> Self { - ( - T0::decode(mut d), - T1::decode(mut d), - T2::decode(mut d), - T3::decode(mut d), - T4::decode(mut d), - T5::decode(mut d), - T6::decode(mut d), - T7::decode(mut d), - T8::decode(mut d), - ) - } -} - -impl Encode for (T0, T1, T2, T3, T4, T5, T6, T7, T8) - where T0: Encode, T1: Encode, T2: Encode, T3: Encode, T4: Encode, T5: Encode, T6: Encode, T7: Encode, T8: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - self.3.encode(mut e) - self.4.encode(mut e) - self.5.encode(mut e) - self.6.encode(mut e) - self.7.encode(mut e) - self.8.encode(mut e) - } -} - -impl Decode - for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) - where T0: Decode, T1: Decode, T2: Decode, T3: Decode, T4: Decode, T5: Decode, T6: Decode, T7: Decode, T8: Decode, T9: Decode -{ - fn decode>(_ d: mut D) -> Self { - ( - T0::decode(mut d), - T1::decode(mut d), - T2::decode(mut d), - T3::decode(mut d), - T4::decode(mut d), - T5::decode(mut d), - T6::decode(mut d), - T7::decode(mut d), - T8::decode(mut d), - T9::decode(mut d), - ) - } -} - -impl Encode - for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) - where T0: Encode, T1: Encode, T2: Encode, T3: Encode, T4: Encode, T5: Encode, T6: Encode, T7: Encode, T8: Encode, T9: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - self.3.encode(mut e) - self.4.encode(mut e) - self.5.encode(mut e) - self.6.encode(mut e) - self.7.encode(mut e) - self.8.encode(mut e) - self.9.encode(mut e) - } -} - -impl Decode - for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) - where T0: Decode, T1: Decode, T2: Decode, T3: Decode, T4: Decode, T5: Decode, T6: Decode, T7: Decode, T8: Decode, T9: Decode, T10: Decode -{ - fn decode>(_ d: mut D) -> Self { - ( - T0::decode(mut d), - T1::decode(mut d), - T2::decode(mut d), - T3::decode(mut d), - T4::decode(mut d), - T5::decode(mut d), - T6::decode(mut d), - T7::decode(mut d), - T8::decode(mut d), - T9::decode(mut d), - T10::decode(mut d), - ) - } -} - -impl Encode - for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) - where T0: Encode, T1: Encode, T2: Encode, T3: Encode, T4: Encode, T5: Encode, T6: Encode, T7: Encode, T8: Encode, T9: Encode, T10: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - self.3.encode(mut e) - self.4.encode(mut e) - self.5.encode(mut e) - self.6.encode(mut e) - self.7.encode(mut e) - self.8.encode(mut e) - self.9.encode(mut e) - self.10.encode(mut e) - } -} - -impl Decode - for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) - where T0: Decode, T1: Decode, T2: Decode, T3: Decode, T4: Decode, T5: Decode, T6: Decode, T7: Decode, T8: Decode, T9: Decode, T10: Decode, T11: Decode -{ - fn decode>(_ d: mut D) -> Self { - ( - T0::decode(mut d), - T1::decode(mut d), - T2::decode(mut d), - T3::decode(mut d), - T4::decode(mut d), - T5::decode(mut d), - T6::decode(mut d), - T7::decode(mut d), - T8::decode(mut d), - T9::decode(mut d), - T10::decode(mut d), - T11::decode(mut d), - ) - } -} - -impl Encode - for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) - where T0: Encode, T1: Encode, T2: Encode, T3: Encode, T4: Encode, T5: Encode, T6: Encode, T7: Encode, T8: Encode, T9: Encode, T10: Encode, T11: Encode -{ - fn encode>(own self, _ e: mut E) { - self.0.encode(mut e) - self.1.encode(mut e) - self.2.encode(mut e) - self.3.encode(mut e) - self.4.encode(mut e) - self.5.encode(mut e) - self.6.encode(mut e) - self.7.encode(mut e) - self.8.encode(mut e) - self.9.encode(mut e) - self.10.encode(mut e) - self.11.encode(mut e) - } -} diff --git a/ingots/core/src/bytes.fe b/ingots/core/src/bytes.fe deleted file mode 100644 index bea61ad668..0000000000 --- a/ingots/core/src/bytes.fe +++ /dev/null @@ -1,446 +0,0 @@ -use super::intrinsic - -pub trait AsBytes { - const N: usize - const fn as_bytes(self) -> [u8; Self::N] -} - -impl AsBytes for [u8; LEN] { - const N: usize = LEN - const fn as_bytes(self) -> [u8; Self::N] { self } -} - -impl AsBytes for String { - const N: usize = LEN - const fn as_bytes(self) -> [u8; Self::N] { intrinsic::__as_bytes(self) } -} - -impl AsBytes for u256 { - const N: usize = 32 - const fn as_bytes(self) -> [u8; Self::N] { intrinsic::__as_bytes(self) } -} - -impl AsBytes for (T0,) - where T0: AsBytes -{ - const N: usize = T0::N - const fn as_bytes(self) -> [u8; Self::N] { self.0.as_bytes() } -} - -impl AsBytes for (T0, T1) - where T0: AsBytes, - T1: AsBytes -{ - const N: usize = T0::N + T1::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b)) - out - } -} - -impl AsBytes for (T0, T1, T2) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes -{ - const N: usize = T0::N + T1::N + T2::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes -{ - const N: usize = T0::N + T1::N + T2::N + T3::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes -{ - const N: usize = T0::N + T1::N + T2::N + T3::N + T4::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes -{ - const N: usize = T0::N + T1::N + T2::N + T3::N + T4::N + T5::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes -{ - const N: usize = T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6, T7) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes, - T7: AsBytes -{ - const N: usize = T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N + T7::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let h: [u8; T7::N] = self.7.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g, h)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6, T7, T8) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes, - T7: AsBytes, - T8: AsBytes -{ - const N: usize = - T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N + T7::N + T8::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let h: [u8; T7::N] = self.7.as_bytes() - let i: [u8; T8::N] = self.8.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g, h, i)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes, - T7: AsBytes, - T8: AsBytes, - T9: AsBytes -{ - const N: usize = - T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N + T7::N + T8::N + T9::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let h: [u8; T7::N] = self.7.as_bytes() - let i: [u8; T8::N] = self.8.as_bytes() - let j: [u8; T9::N] = self.9.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g, h, i, j)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes, - T7: AsBytes, - T8: AsBytes, - T9: AsBytes, - T10: AsBytes -{ - const N: usize = - T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N + T7::N + T8::N + T9::N + T10::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let h: [u8; T7::N] = self.7.as_bytes() - let i: [u8; T8::N] = self.8.as_bytes() - let j: [u8; T9::N] = self.9.as_bytes() - let k: [u8; T10::N] = self.10.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g, h, i, j, k)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes, - T7: AsBytes, - T8: AsBytes, - T9: AsBytes, - T10: AsBytes, - T11: AsBytes -{ - const N: usize = - T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N + T7::N + T8::N + T9::N + T10::N + T11::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let h: [u8; T7::N] = self.7.as_bytes() - let i: [u8; T8::N] = self.8.as_bytes() - let j: [u8; T9::N] = self.9.as_bytes() - let k: [u8; T10::N] = self.10.as_bytes() - let l: [u8; T11::N] = self.11.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g, h, i, j, k, l)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes, - T7: AsBytes, - T8: AsBytes, - T9: AsBytes, - T10: AsBytes, - T11: AsBytes, - T12: AsBytes -{ - const N: usize = - T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N + T7::N + T8::N + T9::N + T10::N + T11::N + T12::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let h: [u8; T7::N] = self.7.as_bytes() - let i: [u8; T8::N] = self.8.as_bytes() - let j: [u8; T9::N] = self.9.as_bytes() - let k: [u8; T10::N] = self.10.as_bytes() - let l: [u8; T11::N] = self.11.as_bytes() - let m: [u8; T12::N] = self.12.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g, h, i, j, k, l, m)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes, - T7: AsBytes, - T8: AsBytes, - T9: AsBytes, - T10: AsBytes, - T11: AsBytes, - T12: AsBytes, - T13: AsBytes -{ - const N: usize = - T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N + T7::N + T8::N + T9::N + T10::N + T11::N + T12::N + T13::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let h: [u8; T7::N] = self.7.as_bytes() - let i: [u8; T8::N] = self.8.as_bytes() - let j: [u8; T9::N] = self.9.as_bytes() - let k: [u8; T10::N] = self.10.as_bytes() - let l: [u8; T11::N] = self.11.as_bytes() - let m: [u8; T12::N] = self.12.as_bytes() - let n: [u8; T13::N] = self.13.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g, h, i, j, k, l, m, n)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes, - T7: AsBytes, - T8: AsBytes, - T9: AsBytes, - T10: AsBytes, - T11: AsBytes, - T12: AsBytes, - T13: AsBytes, - T14: AsBytes -{ - const N: usize = - T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N + T7::N + T8::N + T9::N + T10::N + T11::N + T12::N + T13::N + T14::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let h: [u8; T7::N] = self.7.as_bytes() - let i: [u8; T8::N] = self.8.as_bytes() - let j: [u8; T9::N] = self.9.as_bytes() - let k: [u8; T10::N] = self.10.as_bytes() - let l: [u8; T11::N] = self.11.as_bytes() - let m: [u8; T12::N] = self.12.as_bytes() - let n: [u8; T13::N] = self.13.as_bytes() - let o: [u8; T14::N] = self.14.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)) - out - } -} - -impl AsBytes for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) - where T0: AsBytes, - T1: AsBytes, - T2: AsBytes, - T3: AsBytes, - T4: AsBytes, - T5: AsBytes, - T6: AsBytes, - T7: AsBytes, - T8: AsBytes, - T9: AsBytes, - T10: AsBytes, - T11: AsBytes, - T12: AsBytes, - T13: AsBytes, - T14: AsBytes, - T15: AsBytes -{ - const N: usize = - T0::N + T1::N + T2::N + T3::N + T4::N + T5::N + T6::N + T7::N + T8::N + T9::N + T10::N + T11::N + T12::N + T13::N + T14::N + T15::N - const fn as_bytes(self) -> [u8; Self::N] { - let a: [u8; T0::N] = self.0.as_bytes() - let b: [u8; T1::N] = self.1.as_bytes() - let c: [u8; T2::N] = self.2.as_bytes() - let d: [u8; T3::N] = self.3.as_bytes() - let e: [u8; T4::N] = self.4.as_bytes() - let f: [u8; T5::N] = self.5.as_bytes() - let g: [u8; T6::N] = self.6.as_bytes() - let h: [u8; T7::N] = self.7.as_bytes() - let i: [u8; T8::N] = self.8.as_bytes() - let j: [u8; T9::N] = self.9.as_bytes() - let k: [u8; T10::N] = self.10.as_bytes() - let l: [u8; T11::N] = self.11.as_bytes() - let m: [u8; T12::N] = self.12.as_bytes() - let n: [u8; T13::N] = self.13.as_bytes() - let o: [u8; T14::N] = self.14.as_bytes() - let p: [u8; T15::N] = self.15.as_bytes() - let out: [u8; Self::N] = intrinsic::__as_bytes((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)) - out - } -} - -pub const fn keccak(x: T) -> u256 { - let bytes: [u8; T::N] = x.as_bytes() - intrinsic::__keccak256(bytes) -} diff --git a/ingots/core/src/clone.fe b/ingots/core/src/clone.fe deleted file mode 100644 index 2d940df41e..0000000000 --- a/ingots/core/src/clone.fe +++ /dev/null @@ -1,13 +0,0 @@ -use ingot::Copy - -pub trait Clone { - fn clone(self) -> Self -} - -impl Clone for T -where T: Copy -{ - fn clone(self) -> Self { - self - } -} diff --git a/ingots/core/src/contracts.fe b/ingots/core/src/contracts.fe deleted file mode 100644 index 7c94c1318a..0000000000 --- a/ingots/core/src/contracts.fe +++ /dev/null @@ -1,57 +0,0 @@ -use super::abi::{Abi, AbiEncoder, AbiSize, ByteInput, Encode} -use super::effect_ref::StorPtr - -/// Host interface required by compiler-generated contract entrypoints. -/// -/// This trait is implemented by the target's root effect type (e.g. `std::evm::effects::Evm`). -pub trait ContractHost { - /// ABI input source (e.g. EVM calldata). - type Input: ByteInput - - /// ABI input source for contract initialization (e.g. constructor args). - type InitInput: ByteInput - - fn input(self) -> Self::Input - fn init_input(mut self, runtime: F) -> Self::InitInput - - fn field(mut self, slot: u256) -> StorPtr - fn init_field(mut self, slot: u256) -> StorPtr { - self.field(slot) - } - - fn create_contract(mut self, runtime: F) -> ! - fn abort(self) -> ! - - fn return_bytes(self, ptr: u256, len: u256) -> ! - fn return_unit(self) -> ! { - self.return_bytes(0, 0) - } - - fn runtime_selector(self) -> A::Selector { - let input = self.input() - if input.len() < A::SELECTOR_SIZE { - self.abort() - } - A::selector_from_prefix(input.word_at(0)) - } - - fn runtime_decoder(mut self) -> A::Decoder { - A::decoder_with_base(self.input(), A::SELECTOR_SIZE) - } - - fn return_value(mut self, value: own T) -> ! - where T: Encode + AbiSize - { - let mut enc = A::encoder_new() - enc.reserve_head(T::ENCODED_SIZE) - value.encode(mut enc) - let out: (u256, u256) = enc.finish() - self.return_bytes(out.0, out.1) - } -} - -/// Target configuration used by compiler-generated contract entrypoints. -pub trait Target { - type RootEffect: ContractHost - type DefaultAbi: Abi -} diff --git a/ingots/core/src/default.fe b/ingots/core/src/default.fe deleted file mode 100644 index 9093eba86c..0000000000 --- a/ingots/core/src/default.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub trait Default { - fn default() -> Self -} diff --git a/ingots/core/src/effect_ref.fe b/ingots/core/src/effect_ref.fe deleted file mode 100644 index 1df574de5a..0000000000 --- a/ingots/core/src/effect_ref.fe +++ /dev/null @@ -1,109 +0,0 @@ -/// Effect reference traits. -/// -/// Fe models effects as implicit "provider" generic parameters. The `EffectRef` marker traits -/// express that a provider type can satisfy a read-only (or mutable) effect whose domain is `T`, -/// while `EffectHandle` captures concrete pointer/handle providers with a runtime representation. -/// -/// Backends may define their own concrete provider types, but `core` also provides a small set of -/// general-purpose provider types (`MemPtr`, `StorPtr`) that backends can map onto their -/// runtime model. - -/// Effect provider address-space marker. -pub struct Memory {} - -/// Effect provider address-space marker: indicates the provider points into immutable calldata. -/// -/// Backends may interpret this as an input byte buffer (e.g. EVM calldata via CALLDATALOAD). -pub struct Calldata {} - -/// Effect provider address-space marker: indicates the provider points into the target's persistent -/// storage/state. -/// -/// Backends decide what "storage" means for their runtime model. -pub struct Storage {} - -/// Effect provider address-space marker: indicates the provider points into transient storage. -/// -/// Backends may interpret this as a temporary key/value store scoped to a call frame (e.g. EVM -/// transient storage via TLOAD/TSTORE). -pub struct TransientStorage {} - -/// Target-specific domain markers (e.g. calldata, transient storage) belong in the target's -/// standard library, not in `core`. - -/// Memory pointer to a value of type `T`. -/// -/// This is a general-purpose effect provider type. Backends decide how the raw -/// handle maps to runtime memory. -pub struct MemPtr { - addr: u256 -} - -/// Pointer/handle to a contract field of type `T`. -/// -/// This is a general-purpose effect provider type. Backends decide how the raw -/// handle maps to persistent contract state (e.g. EVM storage slots). -pub struct StorPtr { - handle: u256 -} - -/// Marker: `Self` can satisfy a read-only effect whose domain is `Target`. -pub trait EffectRef {} - -/// Marker: `Self` can satisfy a *mutable* effect whose domain is `Target`. -pub trait EffectRefMut: EffectRef {} - -/// A concrete pointer/handle provider with a runtime representation. -/// -/// This is the place to keep `from_raw`/`raw` and address-space metadata. -pub trait EffectHandle { - type Target - type AddressSpace - - /// Construct the effect provider from the raw pointer/handle used by the backend. - fn from_raw(raw: u256) -> Self - - /// Return the raw pointer/handle used by the backend (e.g. memory address or storage slot). - fn raw(self) -> u256 -} - -/// Marker: a handle that supports mutable access. -pub trait EffectHandleMut: EffectHandle {} - -impl EffectRef for T {} -// Mutability is checked at the term level. -impl EffectRefMut for T {} - -impl EffectHandle for MemPtr { - type Target = T - type AddressSpace = Memory - - fn from_raw(raw: u256) -> Self { - Self { addr: raw } - } - - fn raw(self) -> u256 { - self.addr - } -} -impl EffectHandleMut for MemPtr {} - -impl EffectRef for MemPtr {} -impl EffectRefMut for MemPtr {} - -impl EffectHandle for StorPtr { - type Target = T - type AddressSpace = Storage - - fn from_raw(raw: u256) -> Self { - Self { handle: raw } - } - - fn raw(self) -> u256 { - self.handle - } -} -impl EffectHandleMut for StorPtr {} - -impl EffectRef for StorPtr {} -impl EffectRefMut for StorPtr {} diff --git a/ingots/core/src/functional.fe b/ingots/core/src/functional.fe deleted file mode 100644 index 123731b872..0000000000 --- a/ingots/core/src/functional.fe +++ /dev/null @@ -1,40 +0,0 @@ -/// Core functional abstractions built around higher-kinded types. -/// -/// This module defines: -/// - `Fn`: a trait representing callable values. -/// - `Functor`: type constructors that can be mapped over. -/// - `Applicative`: type constructors that support `pure` and `<*>`. -/// - `Monad`: type constructors that support `bind`/`flat_map`. -/// -/// These traits are designed for types of kind `* -> *`, such as `Option` -/// or partially applied types like `Result`. - -/// A callable value from `T` to `U`. -pub trait Fn { - fn call(self, _ value: own T) -> U -} - -/// A type constructor that can be mapped over. -pub trait Functor - where Self: * -> * -{ - fn map>(self: own Self, _ func: F) -> Self -} - -/// A type constructor that supports `pure` and function application. -pub trait Applicative: Functor - where Self: * -> * -{ - fn pure(_ value: own T) -> Self - - fn ap>(self: own Self, _ value: own Self) -> Self -} - -/// A monad in the sense of functional programming. -/// -/// `bind` is also known as `flat_map` in some ecosystems. -pub trait Monad: Applicative - where Self: * -> * -{ - fn bind>>(self: own Self, _ func: F) -> Self -} diff --git a/ingots/core/src/intrinsic.fe b/ingots/core/src/intrinsic.fe deleted file mode 100644 index 8fc9ec0eda..0000000000 --- a/ingots/core/src/intrinsic.fe +++ /dev/null @@ -1,24 +0,0 @@ -/// Backend-agnostic compiler intrinsics. -extern { - /// Return the address of a pointer-like value as `u256`. - pub fn addr_of(_: T) -> u256 - - /// Return the byte size of a type at compile time. - pub const fn size_of() -> u256 - - /// Converts a value into its byte representation. - /// - /// This is intended for compiler-generated code. Prefer using `core::AsBytes`. - pub const fn __as_bytes(_: T) -> [u8; N] - - /// Computes `keccak256` over a compile-time byte array. - /// - /// This is intended for compiler-generated code. Prefer using `core::keccak`. - pub const fn __keccak256(_: [u8; N]) -> u256 - - /// Returns the fixed storage slot offset (in 32-byte slots) for the given contract field - /// index within the current contract. - /// - /// This is intended for compiler-generated code; the backend replaces this with a literal. - pub fn contract_field_slot(field_idx: u256) -> u256 -} diff --git a/ingots/core/src/lib.fe b/ingots/core/src/lib.fe deleted file mode 100644 index 1128fa00f9..0000000000 --- a/ingots/core/src/lib.fe +++ /dev/null @@ -1,20 +0,0 @@ -pub use option::Option -pub use result::Result -pub use default::Default -pub use clone::Clone -pub use marker::Copy -pub use abi::{self, *} -pub use message::MsgVariant -pub use ops::{self, *} -pub use bytes::{AsBytes, keccak} -pub use intrinsic::{addr_of, contract_field_slot, size_of} -pub use functional::{Fn, Functor, Applicative, Monad} -pub use effect_ref::{EffectHandle, EffectHandleMut, EffectRef, EffectRefMut, MemPtr, StorPtr} -pub use contracts::{self, *} -pub use range::{Bound, Known, Unknown, Range} -pub use seq::Seq - -extern { - pub fn panic() -> ! - pub fn todo() -> ! -} diff --git a/ingots/core/src/marker.fe b/ingots/core/src/marker.fe deleted file mode 100644 index 86773422a7..0000000000 --- a/ingots/core/src/marker.fe +++ /dev/null @@ -1,29 +0,0 @@ -// Marker traits for language-level behavior. -// -// `Copy` is used by the compiler's ownership model: values of `Copy` types can be -// duplicated implicitly (e.g. when assigning from a place or passing to an `own` -// parameter). Values of non-`Copy` types are moved (consumed) implicitly when -// used in an owned context. - -pub trait Copy {} - -// Built-in primitive types are trivially copyable. -impl Copy for () {} - -impl Copy for bool {} - -impl Copy for u8 {} -impl Copy for u16 {} -impl Copy for u32 {} -impl Copy for u64 {} -impl Copy for u128 {} -impl Copy for u256 {} -impl Copy for usize {} - -impl Copy for i8 {} -impl Copy for i16 {} -impl Copy for i32 {} -impl Copy for i64 {} -impl Copy for i128 {} -impl Copy for i256 {} -impl Copy for isize {} diff --git a/ingots/core/src/message.fe b/ingots/core/src/message.fe deleted file mode 100644 index 832108340c..0000000000 --- a/ingots/core/src/message.fe +++ /dev/null @@ -1,10 +0,0 @@ -use ingot::abi::{Abi, Decode, Encode} - -/// Trait implemented by message variants in a `msg` block. -/// -/// Each variant in a `msg` definition desugars to a struct that implements -/// this trait for a specific ABI (default in desugaring: `std::abi::Sol`). -pub trait MsgVariant: Encode + Decode { - const SELECTOR: A::Selector - type Return: Decode -} diff --git a/ingots/core/src/num.fe b/ingots/core/src/num.fe deleted file mode 100644 index 618ffbd28a..0000000000 --- a/ingots/core/src/num.fe +++ /dev/null @@ -1,1157 +0,0 @@ -use super::ops::* -use super::default::Default -use super::option::Option::{self, *} - -// Generic bitcast intrinsic - reinterprets bits between any two primitive integer types -extern { - fn __bitcast(value: From) -> To -} - -// Extern intrinsics for u8 -extern { - fn __add_u8(_: u8, _: u8) -> u8 - fn __sub_u8(_: u8, _: u8) -> u8 - fn __mul_u8(_: u8, _: u8) -> u8 - fn __div_u8(_: u8, _: u8) -> u8 - fn __rem_u8(_: u8, _: u8) -> u8 - fn __pow_u8(_: u8, _: u8) -> u8 - fn __shl_u8(_: u8, _: u8) -> u8 - fn __shr_u8(_: u8, _: u8) -> u8 - fn __bitand_u8(_: u8, _: u8) -> u8 - fn __bitor_u8(_: u8, _: u8) -> u8 - fn __bitxor_u8(_: u8, _: u8) -> u8 - - fn __eq_u8(_: u8, _: u8) -> bool - fn __ne_u8(_: u8, _: u8) -> bool - fn __lt_u8(_: u8, _: u8) -> bool - fn __le_u8(_: u8, _: u8) -> bool - fn __gt_u8(_: u8, _: u8) -> bool - fn __ge_u8(_: u8, _: u8) -> bool - - fn __bitnot_u8(_: u8) -> u8 -} - -// Extern intrinsics for i8 -extern { - fn __add_i8(_: i8, _: i8) -> i8 - fn __sub_i8(_: i8, _: i8) -> i8 - fn __mul_i8(_: i8, _: i8) -> i8 - fn __div_i8(_: i8, _: i8) -> i8 - fn __rem_i8(_: i8, _: i8) -> i8 - fn __pow_i8(_: i8, _: i8) -> i8 - fn __shl_i8(_: i8, _: i8) -> i8 - fn __shr_i8(_: i8, _: i8) -> i8 - fn __bitand_i8(_: i8, _: i8) -> i8 - fn __bitor_i8(_: i8, _: i8) -> i8 - fn __bitxor_i8(_: i8, _: i8) -> i8 - - fn __eq_i8(_: i8, _: i8) -> bool - fn __ne_i8(_: i8, _: i8) -> bool - fn __lt_i8(_: i8, _: i8) -> bool - fn __le_i8(_: i8, _: i8) -> bool - fn __gt_i8(_: i8, _: i8) -> bool - fn __ge_i8(_: i8, _: i8) -> bool - - fn __neg_i8(_: i8) -> i8 - fn __bitnot_i8(_: i8) -> i8 -} - -// Extern intrinsics for i16 -extern { - fn __add_i16(_: i16, _: i16) -> i16 - fn __sub_i16(_: i16, _: i16) -> i16 - fn __mul_i16(_: i16, _: i16) -> i16 - fn __div_i16(_: i16, _: i16) -> i16 - fn __rem_i16(_: i16, _: i16) -> i16 - fn __pow_i16(_: i16, _: i16) -> i16 - fn __shl_i16(_: i16, _: i16) -> i16 - fn __shr_i16(_: i16, _: i16) -> i16 - fn __bitand_i16(_: i16, _: i16) -> i16 - fn __bitor_i16(_: i16, _: i16) -> i16 - fn __bitxor_i16(_: i16, _: i16) -> i16 - - fn __eq_i16(_: i16, _: i16) -> bool - fn __ne_i16(_: i16, _: i16) -> bool - fn __lt_i16(_: i16, _: i16) -> bool - fn __le_i16(_: i16, _: i16) -> bool - fn __gt_i16(_: i16, _: i16) -> bool - fn __ge_i16(_: i16, _: i16) -> bool - - fn __neg_i16(_: i16) -> i16 - fn __bitnot_i16(_: i16) -> i16 -} - -// Extern intrinsics for u16 -extern { - fn __add_u16(_: u16, _: u16) -> u16 - fn __sub_u16(_: u16, _: u16) -> u16 - fn __mul_u16(_: u16, _: u16) -> u16 - fn __div_u16(_: u16, _: u16) -> u16 - fn __rem_u16(_: u16, _: u16) -> u16 - fn __pow_u16(_: u16, _: u16) -> u16 - fn __shl_u16(_: u16, _: u16) -> u16 - fn __shr_u16(_: u16, _: u16) -> u16 - fn __bitand_u16(_: u16, _: u16) -> u16 - fn __bitor_u16(_: u16, _: u16) -> u16 - fn __bitxor_u16(_: u16, _: u16) -> u16 - - fn __eq_u16(_: u16, _: u16) -> bool - fn __ne_u16(_: u16, _: u16) -> bool - fn __lt_u16(_: u16, _: u16) -> bool - fn __le_u16(_: u16, _: u16) -> bool - fn __gt_u16(_: u16, _: u16) -> bool - fn __ge_u16(_: u16, _: u16) -> bool - - fn __bitnot_u16(_: u16) -> u16 -} - -// Extern intrinsics for i32 -extern { - fn __add_i32(_: i32, _: i32) -> i32 - fn __sub_i32(_: i32, _: i32) -> i32 - fn __mul_i32(_: i32, _: i32) -> i32 - fn __div_i32(_: i32, _: i32) -> i32 - fn __rem_i32(_: i32, _: i32) -> i32 - fn __pow_i32(_: i32, _: i32) -> i32 - fn __shl_i32(_: i32, _: i32) -> i32 - fn __shr_i32(_: i32, _: i32) -> i32 - fn __bitand_i32(_: i32, _: i32) -> i32 - fn __bitor_i32(_: i32, _: i32) -> i32 - fn __bitxor_i32(_: i32, _: i32) -> i32 - - fn __eq_i32(_: i32, _: i32) -> bool - fn __ne_i32(_: i32, _: i32) -> bool - fn __lt_i32(_: i32, _: i32) -> bool - fn __le_i32(_: i32, _: i32) -> bool - fn __gt_i32(_: i32, _: i32) -> bool - fn __ge_i32(_: i32, _: i32) -> bool - - fn __neg_i32(_: i32) -> i32 - fn __bitnot_i32(_: i32) -> i32 -} - -// Extern intrinsics for u32 -extern { - fn __add_u32(_: u32, _: u32) -> u32 - fn __sub_u32(_: u32, _: u32) -> u32 - fn __mul_u32(_: u32, _: u32) -> u32 - fn __div_u32(_: u32, _: u32) -> u32 - fn __rem_u32(_: u32, _: u32) -> u32 - fn __pow_u32(_: u32, _: u32) -> u32 - fn __shl_u32(_: u32, _: u32) -> u32 - fn __shr_u32(_: u32, _: u32) -> u32 - fn __bitand_u32(_: u32, _: u32) -> u32 - fn __bitor_u32(_: u32, _: u32) -> u32 - fn __bitxor_u32(_: u32, _: u32) -> u32 - - fn __eq_u32(_: u32, _: u32) -> bool - fn __ne_u32(_: u32, _: u32) -> bool - fn __lt_u32(_: u32, _: u32) -> bool - fn __le_u32(_: u32, _: u32) -> bool - fn __gt_u32(_: u32, _: u32) -> bool - fn __ge_u32(_: u32, _: u32) -> bool - - fn __bitnot_u32(_: u32) -> u32 -} - -// Extern intrinsics for i64 -extern { - fn __add_i64(_: i64, _: i64) -> i64 - fn __sub_i64(_: i64, _: i64) -> i64 - fn __mul_i64(_: i64, _: i64) -> i64 - fn __div_i64(_: i64, _: i64) -> i64 - fn __rem_i64(_: i64, _: i64) -> i64 - fn __pow_i64(_: i64, _: i64) -> i64 - fn __shl_i64(_: i64, _: i64) -> i64 - fn __shr_i64(_: i64, _: i64) -> i64 - fn __bitand_i64(_: i64, _: i64) -> i64 - fn __bitor_i64(_: i64, _: i64) -> i64 - fn __bitxor_i64(_: i64, _: i64) -> i64 - - fn __eq_i64(_: i64, _: i64) -> bool - fn __ne_i64(_: i64, _: i64) -> bool - fn __lt_i64(_: i64, _: i64) -> bool - fn __le_i64(_: i64, _: i64) -> bool - fn __gt_i64(_: i64, _: i64) -> bool - fn __ge_i64(_: i64, _: i64) -> bool - - fn __neg_i64(_: i64) -> i64 - fn __bitnot_i64(_: i64) -> i64 -} - -// Extern intrinsics for i128 -extern { - fn __add_i128(_: i128, _: i128) -> i128 - fn __sub_i128(_: i128, _: i128) -> i128 - fn __mul_i128(_: i128, _: i128) -> i128 - fn __div_i128(_: i128, _: i128) -> i128 - fn __rem_i128(_: i128, _: i128) -> i128 - fn __pow_i128(_: i128, _: i128) -> i128 - fn __shl_i128(_: i128, _: i128) -> i128 - fn __shr_i128(_: i128, _: i128) -> i128 - fn __bitand_i128(_: i128, _: i128) -> i128 - fn __bitor_i128(_: i128, _: i128) -> i128 - fn __bitxor_i128(_: i128, _: i128) -> i128 - - fn __eq_i128(_: i128, _: i128) -> bool - fn __ne_i128(_: i128, _: i128) -> bool - fn __lt_i128(_: i128, _: i128) -> bool - fn __le_i128(_: i128, _: i128) -> bool - fn __gt_i128(_: i128, _: i128) -> bool - fn __ge_i128(_: i128, _: i128) -> bool - - fn __neg_i128(_: i128) -> i128 - fn __bitnot_i128(_: i128) -> i128 -} - -// Extern intrinsics for u64 -extern { - fn __add_u64(_: u64, _: u64) -> u64 - fn __sub_u64(_: u64, _: u64) -> u64 - fn __mul_u64(_: u64, _: u64) -> u64 - fn __div_u64(_: u64, _: u64) -> u64 - fn __rem_u64(_: u64, _: u64) -> u64 - fn __pow_u64(_: u64, _: u64) -> u64 - fn __shl_u64(_: u64, _: u64) -> u64 - fn __shr_u64(_: u64, _: u64) -> u64 - fn __bitand_u64(_: u64, _: u64) -> u64 - fn __bitor_u64(_: u64, _: u64) -> u64 - fn __bitxor_u64(_: u64, _: u64) -> u64 - - fn __eq_u64(_: u64, _: u64) -> bool - fn __ne_u64(_: u64, _: u64) -> bool - fn __lt_u64(_: u64, _: u64) -> bool - fn __le_u64(_: u64, _: u64) -> bool - fn __gt_u64(_: u64, _: u64) -> bool - fn __ge_u64(_: u64, _: u64) -> bool - - fn __bitnot_u64(_: u64) -> u64 -} - -// Extern intrinsics for u128 -extern { - fn __add_u128(_: u128, _: u128) -> u128 - fn __sub_u128(_: u128, _: u128) -> u128 - fn __mul_u128(_: u128, _: u128) -> u128 - fn __div_u128(_: u128, _: u128) -> u128 - fn __rem_u128(_: u128, _: u128) -> u128 - fn __pow_u128(_: u128, _: u128) -> u128 - fn __shl_u128(_: u128, _: u128) -> u128 - fn __shr_u128(_: u128, _: u128) -> u128 - fn __bitand_u128(_: u128, _: u128) -> u128 - fn __bitor_u128(_: u128, _: u128) -> u128 - fn __bitxor_u128(_: u128, _: u128) -> u128 - - fn __eq_u128(_: u128, _: u128) -> bool - fn __ne_u128(_: u128, _: u128) -> bool - fn __lt_u128(_: u128, _: u128) -> bool - fn __le_u128(_: u128, _: u128) -> bool - fn __gt_u128(_: u128, _: u128) -> bool - fn __ge_u128(_: u128, _: u128) -> bool - - fn __bitnot_u128(_: u128) -> u128 -} - -// Extern intrinsics for usize -extern { - fn __add_usize(_: usize, _: usize) -> usize - fn __sub_usize(_: usize, _: usize) -> usize - fn __mul_usize(_: usize, _: usize) -> usize - fn __div_usize(_: usize, _: usize) -> usize - fn __rem_usize(_: usize, _: usize) -> usize - fn __pow_usize(_: usize, _: usize) -> usize - fn __shl_usize(_: usize, _: usize) -> usize - fn __shr_usize(_: usize, _: usize) -> usize - fn __bitand_usize(_: usize, _: usize) -> usize - fn __bitor_usize(_: usize, _: usize) -> usize - fn __bitxor_usize(_: usize, _: usize) -> usize - - fn __eq_usize(_: usize, _: usize) -> bool - fn __ne_usize(_: usize, _: usize) -> bool - fn __lt_usize(_: usize, _: usize) -> bool - fn __le_usize(_: usize, _: usize) -> bool - fn __gt_usize(_: usize, _: usize) -> bool - fn __ge_usize(_: usize, _: usize) -> bool - - fn __bitnot_usize(_: usize) -> usize -} - -// Extern intrinsics for i256 -extern { - fn __add_i256(_: i256, _: i256) -> i256 - fn __sub_i256(_: i256, _: i256) -> i256 - fn __mul_i256(_: i256, _: i256) -> i256 - fn __div_i256(_: i256, _: i256) -> i256 - fn __rem_i256(_: i256, _: i256) -> i256 - fn __pow_i256(_: i256, _: i256) -> i256 - fn __shl_i256(_: i256, _: i256) -> i256 - fn __shr_i256(_: i256, _: i256) -> i256 - fn __bitand_i256(_: i256, _: i256) -> i256 - fn __bitor_i256(_: i256, _: i256) -> i256 - fn __bitxor_i256(_: i256, _: i256) -> i256 - - fn __eq_i256(_: i256, _: i256) -> bool - fn __ne_i256(_: i256, _: i256) -> bool - fn __lt_i256(_: i256, _: i256) -> bool - fn __le_i256(_: i256, _: i256) -> bool - fn __gt_i256(_: i256, _: i256) -> bool - fn __ge_i256(_: i256, _: i256) -> bool - - fn __neg_i256(_: i256) -> i256 - fn __bitnot_i256(_: i256) -> i256 -} - -// Extern intrinsics for u256 -extern { - fn __add_u256(_: u256, _: u256) -> u256 - fn __sub_u256(_: u256, _: u256) -> u256 - fn __mul_u256(_: u256, _: u256) -> u256 - fn __div_u256(_: u256, _: u256) -> u256 - fn __rem_u256(_: u256, _: u256) -> u256 - fn __pow_u256(_: u256, _: u256) -> u256 - fn __shl_u256(_: u256, _: u256) -> u256 - fn __shr_u256(_: u256, _: u256) -> u256 - fn __bitand_u256(_: u256, _: u256) -> u256 - fn __bitor_u256(_: u256, _: u256) -> u256 - fn __bitxor_u256(_: u256, _: u256) -> u256 - - fn __eq_u256(_: u256, _: u256) -> bool - fn __ne_u256(_: u256, _: u256) -> bool - fn __lt_u256(_: u256, _: u256) -> bool - fn __le_u256(_: u256, _: u256) -> bool - fn __gt_u256(_: u256, _: u256) -> bool - fn __ge_u256(_: u256, _: u256) -> bool - - fn __bitnot_u256(_: u256) -> u256 -} - -// Extern intrinsics for isize -extern { - fn __add_isize(_: isize, _: isize) -> isize - fn __sub_isize(_: isize, _: isize) -> isize - fn __mul_isize(_: isize, _: isize) -> isize - fn __div_isize(_: isize, _: isize) -> isize - fn __rem_isize(_: isize, _: isize) -> isize - fn __pow_isize(_: isize, _: isize) -> isize - fn __shl_isize(_: isize, _: isize) -> isize - fn __shr_isize(_: isize, _: isize) -> isize - fn __bitand_isize(_: isize, _: isize) -> isize - fn __bitor_isize(_: isize, _: isize) -> isize - fn __bitxor_isize(_: isize, _: isize) -> isize - - fn __eq_isize(_: isize, _: isize) -> bool - fn __ne_isize(_: isize, _: isize) -> bool - fn __lt_isize(_: isize, _: isize) -> bool - fn __le_isize(_: isize, _: isize) -> bool - fn __gt_isize(_: isize, _: isize) -> bool - fn __ge_isize(_: isize, _: isize) -> bool - - fn __neg_isize(_: isize) -> isize - fn __bitnot_isize(_: isize) -> isize -} - -// Extern intrinsics for bool -extern { - fn __not_bool(_: bool) -> bool - fn __bitand_bool(_: bool, _: bool) -> bool - fn __bitor_bool(_: bool, _: bool) -> bool - fn __bitxor_bool(_: bool, _: bool) -> bool - fn __eq_bool(_: bool, _: bool) -> bool - fn __ne_bool(_: bool, _: bool) -> bool -} - -// Masks used to truncate a 256-bit word down to the requested primitive width. -const U8_MASK: u256 = 0xff -const U16_MASK: u256 = 0xffff -const U32_MASK: u256 = 0xffffffff -const U64_MASK: u256 = 0xffffffffffffffff -const U128_MASK: u256 = 0xffffffffffffffffffffffffffffffff -const U256_MASK: u256 = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff - -// Sign bits used when performing two's-complement sign extension per width. -const I8_SIGN_BIT: u256 = 0x80 -const I16_SIGN_BIT: u256 = 0x8000 -const I32_SIGN_BIT: u256 = 0x80000000 -const I64_SIGN_BIT: u256 = 0x8000000000000000 -const I128_SIGN_BIT: u256 = 0x80000000000000000000000000000000 -const I256_SIGN_BIT: u256 = 0x8000000000000000000000000000000000000000000000000000000000000000 - -pub trait IntDowncast { - fn downcast(own self) -> Option - fn downcast_truncate(own self) -> T - fn downcast_saturate(own self) -> T - fn downcast_unchecked(own self) -> T -} - -trait IntWord { - const MASK: u256 - const SIGN_BIT: u256 - const IS_SIGNED: bool - - fn to_word(own self) -> u256 - fn from_word(word: u256) -> Self -} - -impl IntWord for u8 { - const MASK: u256 = U8_MASK - const SIGN_BIT: u256 = 0 - const IS_SIGNED: bool = false - - fn to_word(own self) -> u256 { self as u256 } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for u16 { - const MASK: u256 = U16_MASK - const SIGN_BIT: u256 = 0 - const IS_SIGNED: bool = false - - fn to_word(own self) -> u256 { self as u256 } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for u32 { - const MASK: u256 = U32_MASK - const SIGN_BIT: u256 = 0 - const IS_SIGNED: bool = false - - fn to_word(own self) -> u256 { self as u256 } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for u64 { - const MASK: u256 = U64_MASK - const SIGN_BIT: u256 = 0 - const IS_SIGNED: bool = false - - fn to_word(own self) -> u256 { self as u256 } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for u128 { - const MASK: u256 = U128_MASK - const SIGN_BIT: u256 = 0 - const IS_SIGNED: bool = false - - fn to_word(own self) -> u256 { self as u256 } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for u256 { - const MASK: u256 = U256_MASK - const SIGN_BIT: u256 = 0 - const IS_SIGNED: bool = false - - fn to_word(own self) -> u256 { self } - fn from_word(word: u256) -> Self { word } -} - -impl IntWord for usize { - const MASK: u256 = U256_MASK - const SIGN_BIT: u256 = 0 - const IS_SIGNED: bool = false - - fn to_word(own self) -> u256 { self as u256 } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for i8 { - const MASK: u256 = U8_MASK - const SIGN_BIT: u256 = I8_SIGN_BIT - const IS_SIGNED: bool = true - - fn to_word(own self) -> u256 { __bitcast(self as i256) } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for i16 { - const MASK: u256 = U16_MASK - const SIGN_BIT: u256 = I16_SIGN_BIT - const IS_SIGNED: bool = true - - fn to_word(own self) -> u256 { __bitcast(self as i256) } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for i32 { - const MASK: u256 = U32_MASK - const SIGN_BIT: u256 = I32_SIGN_BIT - const IS_SIGNED: bool = true - - fn to_word(own self) -> u256 { __bitcast(self as i256) } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for i64 { - const MASK: u256 = U64_MASK - const SIGN_BIT: u256 = I64_SIGN_BIT - const IS_SIGNED: bool = true - - fn to_word(own self) -> u256 { __bitcast(self as i256) } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for i128 { - const MASK: u256 = U128_MASK - const SIGN_BIT: u256 = I128_SIGN_BIT - const IS_SIGNED: bool = true - - fn to_word(own self) -> u256 { __bitcast(self as i256) } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for i256 { - const MASK: u256 = U256_MASK - const SIGN_BIT: u256 = I256_SIGN_BIT - const IS_SIGNED: bool = true - - fn to_word(own self) -> u256 { __bitcast(self) } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntWord for isize { - const MASK: u256 = U256_MASK - const SIGN_BIT: u256 = I256_SIGN_BIT - const IS_SIGNED: bool = true - - fn to_word(own self) -> u256 { __bitcast(self as i256) } - fn from_word(word: u256) -> Self { __bitcast(word) } -} - -impl IntDowncast for S { - fn downcast(own self) -> Option { - let word = self.to_word() - if T::IS_SIGNED { - let t_min_word = sign_extend(T::SIGN_BIT, T::MASK, T::SIGN_BIT) - let t_max_word = T::SIGN_BIT - 1 - let t_min: i256 = __bitcast(t_min_word) - let t_max: i256 = __bitcast(t_max_word) - - if !S::IS_SIGNED && (word & I256_SIGN_BIT != 0) { - Option::None - } else { - let x: i256 = __bitcast(word) - if x < t_min { - Option::None - } else if x > t_max { - Option::None - } else { - Option::Some(T::from_word(word)) - } - } - } else { - if S::IS_SIGNED && (word & I256_SIGN_BIT != 0) { - Option::None - } else if word > T::MASK { - Option::None - } else { - Option::Some(T::from_word(word)) - } - } - } - - fn downcast_truncate(own self) -> T { - let word = self.to_word() - if T::IS_SIGNED { - T::from_word(sign_extend(word, T::MASK, T::SIGN_BIT)) - } else { - T::from_word(word & T::MASK) - } - } - - fn downcast_saturate(own self) -> T { - let word = self.to_word() - if !T::IS_SIGNED { - let mut unsigned_word = word - if S::IS_SIGNED && (word & I256_SIGN_BIT != 0) { - unsigned_word = 0 - } - - if unsigned_word > T::MASK { - T::from_word(T::MASK) - } else { - T::from_word(unsigned_word) - } - } else { - let t_min_word = sign_extend(T::SIGN_BIT, T::MASK, T::SIGN_BIT) - let t_max_word = T::SIGN_BIT - 1 - let t_min: i256 = __bitcast(t_min_word) - let t_max: i256 = __bitcast(t_max_word) - - if S::IS_SIGNED { - let x: i256 = __bitcast(word) - if x < t_min { - T::from_word(t_min_word) - } else if x > t_max { - T::from_word(t_max_word) - } else { - T::from_word(word) - } - } else { - if word & I256_SIGN_BIT != 0 { - T::from_word(t_max_word) - } else { - let x: i256 = __bitcast(word) - if x > t_max { - T::from_word(t_max_word) - } else { - T::from_word(word) - } - } - } - } - } - - fn downcast_unchecked(own self) -> T { - let word = self.to_word() - T::from_word(word) - } -} - -/// Performs two's-complement sign extension within the provided mask/sign bit. -fn sign_extend(word: u256, _ mask: u256, _ sign_bit: u256) -> u256 { - let value = word & mask - if value & sign_bit != 0 { - value | (!mask) - } else { - value - } -} - -// u8 impls -impl BitNot for u8 { fn bit_not(own self) -> u8 { __bitnot_u8(self) } } -impl Not for u8 { fn not(own self) -> u8 { __bitnot_u8(self) } } -impl Add for u8 { fn add(own self, _ other: own u8) -> u8 { __add_u8(self, other) } } -impl Sub for u8 { fn sub(own self, _ other: own u8) -> u8 { __sub_u8(self, other) } } -impl Mul for u8 { fn mul(own self, _ other: own u8) -> u8 { __mul_u8(self, other) } } -impl Div for u8 { fn div(own self, _ other: own u8) -> u8 { __div_u8(self, other) } } -impl Rem for u8 { fn rem(own self, _ other: own u8) -> u8 { __rem_u8(self, other) } } -impl Pow for u8 { fn pow(own self, _ other: own u8) -> u8 { __pow_u8(self, other) } } -impl Shl for u8 { fn shl(own self, _ other: own u8) -> u8 { __shl_u8(self, other) } } -impl Shr for u8 { fn shr(own self, _ other: own u8) -> u8 { __shr_u8(self, other) } } -impl BitAnd for u8 { fn bitand(own self, _ other: own u8) -> u8 { __bitand_u8(self, other) } } -impl BitOr for u8 { fn bitor(own self, _ other: own u8) -> u8 { __bitor_u8(self, other) } } -impl BitXor for u8 { fn bitxor(own self, _ other: own u8) -> u8 { __bitxor_u8(self, other) } } -impl Eq for u8 { - fn eq(self, _ other: u8) -> bool { __eq_u8(self, other) } - fn ne(self, _ other: u8) -> bool { __ne_u8(self, other) } -} -impl Ord for u8 { - fn lt(self, _ other: u8) -> bool { __lt_u8(self, other) } - fn le(self, _ other: u8) -> bool { __le_u8(self, other) } - fn gt(self, _ other: u8) -> bool { __gt_u8(self, other) } - fn ge(self, _ other: u8) -> bool { __ge_u8(self, other) } -} -impl AddAssign for u8 { fn add_assign(mut self, _ other: own u8) { self = self + other } } -impl SubAssign for u8 { fn sub_assign(mut self, _ other: own u8) { self = self - other } } -impl MulAssign for u8 { fn mul_assign(mut self, _ other: own u8) { self = self * other } } -impl DivAssign for u8 { fn div_assign(mut self, _ other: own u8) { self = self / other } } -impl RemAssign for u8 { fn rem_assign(mut self, _ other: own u8) { self = self % other } } -impl PowAssign for u8 { fn pow_assign(mut self, _ other: own u8) { self = self ** other } } -impl ShlAssign for u8 { fn shl_assign(mut self, _ other: own u8) { self = self << other } } -impl ShrAssign for u8 { fn shr_assign(mut self, _ other: own u8) { self = self >> other } } -impl BitAndAssign for u8 { fn bitand_assign(mut self, _ other: own u8) { self = self & other } } -impl BitOrAssign for u8 { fn bitor_assign(mut self, _ other: own u8) { self = self | other } } -impl BitXorAssign for u8 { fn bitxor_assign(mut self, _ other: own u8) { self = self ^ other } } -impl Default for u8 { fn default() -> Self { 0 } } - -// i8 impls -impl Neg for i8 { fn neg(own self) -> i8 { __neg_i8(self) } } -impl BitNot for i8 { fn bit_not(own self) -> i8 { __bitnot_i8(self) } } -impl Not for i8 { fn not(own self) -> i8 { __bitnot_i8(self) } } -impl Add for i8 { fn add(own self, _ other: own i8) -> i8 { __add_i8(self, other) } } -impl Sub for i8 { fn sub(own self, _ other: own i8) -> i8 { __sub_i8(self, other) } } -impl Mul for i8 { fn mul(own self, _ other: own i8) -> i8 { __mul_i8(self, other) } } -impl Div for i8 { fn div(own self, _ other: own i8) -> i8 { __div_i8(self, other) } } -impl Rem for i8 { fn rem(own self, _ other: own i8) -> i8 { __rem_i8(self, other) } } -impl Pow for i8 { fn pow(own self, _ other: own i8) -> i8 { __pow_i8(self, other) } } -impl Shl for i8 { fn shl(own self, _ other: own i8) -> i8 { __shl_i8(self, other) } } -impl Shr for i8 { fn shr(own self, _ other: own i8) -> i8 { __shr_i8(self, other) } } -impl BitAnd for i8 { fn bitand(own self, _ other: own i8) -> i8 { __bitand_i8(self, other) } } -impl BitOr for i8 { fn bitor(own self, _ other: own i8) -> i8 { __bitor_i8(self, other) } } -impl BitXor for i8 { fn bitxor(own self, _ other: own i8) -> i8 { __bitxor_i8(self, other) } } -impl Eq for i8 { - fn eq(self, _ other: i8) -> bool { __eq_i8(self, other) } - fn ne(self, _ other: i8) -> bool { __ne_i8(self, other) } -} -impl Ord for i8 { - fn lt(self, _ other: i8) -> bool { __lt_i8(self, other) } - fn le(self, _ other: i8) -> bool { __le_i8(self, other) } - fn gt(self, _ other: i8) -> bool { __gt_i8(self, other) } - fn ge(self, _ other: i8) -> bool { __ge_i8(self, other) } -} -impl AddAssign for i8 { fn add_assign(mut self, _ other: own i8) { self = self + other } } -impl SubAssign for i8 { fn sub_assign(mut self, _ other: own i8) { self = self - other } } -impl MulAssign for i8 { fn mul_assign(mut self, _ other: own i8) { self = self * other } } -impl DivAssign for i8 { fn div_assign(mut self, _ other: own i8) { self = self / other } } -impl RemAssign for i8 { fn rem_assign(mut self, _ other: own i8) { self = self % other } } -impl PowAssign for i8 { fn pow_assign(mut self, _ other: own i8) { self = self ** other } } -impl ShlAssign for i8 { fn shl_assign(mut self, _ other: own i8) { self = self << other } } -impl ShrAssign for i8 { fn shr_assign(mut self, _ other: own i8) { self = self >> other } } -impl BitAndAssign for i8 { fn bitand_assign(mut self, _ other: own i8) { self = self & other } } -impl BitOrAssign for i8 { fn bitor_assign(mut self, _ other: own i8) { self = self | other } } -impl BitXorAssign for i8 { fn bitxor_assign(mut self, _ other: own i8) { self = self ^ other } } -impl Default for i8 { fn default() -> Self { 0 } } - -// i16 impls -impl Neg for i16 { fn neg(own self) -> i16 { __neg_i16(self) } } -impl BitNot for i16 { fn bit_not(own self) -> i16 { __bitnot_i16(self) } } -impl Not for i16 { fn not(own self) -> i16 { __bitnot_i16(self) } } -impl Add for i16 { fn add(own self, _ other: own i16) -> i16 { __add_i16(self, other) } } -impl Sub for i16 { fn sub(own self, _ other: own i16) -> i16 { __sub_i16(self, other) } } -impl Mul for i16 { fn mul(own self, _ other: own i16) -> i16 { __mul_i16(self, other) } } -impl Div for i16 { fn div(own self, _ other: own i16) -> i16 { __div_i16(self, other) } } -impl Rem for i16 { fn rem(own self, _ other: own i16) -> i16 { __rem_i16(self, other) } } -impl Pow for i16 { fn pow(own self, _ other: own i16) -> i16 { __pow_i16(self, other) } } -impl Shl for i16 { fn shl(own self, _ other: own i16) -> i16 { __shl_i16(self, other) } } -impl Shr for i16 { fn shr(own self, _ other: own i16) -> i16 { __shr_i16(self, other) } } -impl BitAnd for i16 { fn bitand(own self, _ other: own i16) -> i16 { __bitand_i16(self, other) } } -impl BitOr for i16 { fn bitor(own self, _ other: own i16) -> i16 { __bitor_i16(self, other) } } -impl BitXor for i16 { fn bitxor(own self, _ other: own i16) -> i16 { __bitxor_i16(self, other) } } -impl Eq for i16 { - fn eq(self, _ other: i16) -> bool { __eq_i16(self, other) } - fn ne(self, _ other: i16) -> bool { __ne_i16(self, other) } -} -impl Ord for i16 { - fn lt(self, _ other: i16) -> bool { __lt_i16(self, other) } - fn le(self, _ other: i16) -> bool { __le_i16(self, other) } - fn gt(self, _ other: i16) -> bool { __gt_i16(self, other) } - fn ge(self, _ other: i16) -> bool { __ge_i16(self, other) } -} -impl AddAssign for i16 { fn add_assign(mut self, _ other: own i16) { self = self + other } } -impl SubAssign for i16 { fn sub_assign(mut self, _ other: own i16) { self = self - other } } -impl MulAssign for i16 { fn mul_assign(mut self, _ other: own i16) { self = self * other } } -impl DivAssign for i16 { fn div_assign(mut self, _ other: own i16) { self = self / other } } -impl RemAssign for i16 { fn rem_assign(mut self, _ other: own i16) { self = self % other } } -impl PowAssign for i16 { fn pow_assign(mut self, _ other: own i16) { self = self ** other } } -impl ShlAssign for i16 { fn shl_assign(mut self, _ other: own i16) { self = self << other } } -impl ShrAssign for i16 { fn shr_assign(mut self, _ other: own i16) { self = self >> other } } -impl BitAndAssign for i16 { fn bitand_assign(mut self, _ other: own i16) { self = self & other } } -impl BitOrAssign for i16 { fn bitor_assign(mut self, _ other: own i16) { self = self | other } } -impl BitXorAssign for i16 { fn bitxor_assign(mut self, _ other: own i16) { self = self ^ other } } -impl Default for i16 { fn default() -> Self { 0 } } - -// u16 impls -impl BitNot for u16 { fn bit_not(own self) -> u16 { __bitnot_u16(self) } } -impl Not for u16 { fn not(own self) -> u16 { __bitnot_u16(self) } } -impl Add for u16 { fn add(own self, _ other: own u16) -> u16 { __add_u16(self, other) } } -impl Sub for u16 { fn sub(own self, _ other: own u16) -> u16 { __sub_u16(self, other) } } -impl Mul for u16 { fn mul(own self, _ other: own u16) -> u16 { __mul_u16(self, other) } } -impl Div for u16 { fn div(own self, _ other: own u16) -> u16 { __div_u16(self, other) } } -impl Rem for u16 { fn rem(own self, _ other: own u16) -> u16 { __rem_u16(self, other) } } -impl Pow for u16 { fn pow(own self, _ other: own u16) -> u16 { __pow_u16(self, other) } } -impl Shl for u16 { fn shl(own self, _ other: own u16) -> u16 { __shl_u16(self, other) } } -impl Shr for u16 { fn shr(own self, _ other: own u16) -> u16 { __shr_u16(self, other) } } -impl BitAnd for u16 { fn bitand(own self, _ other: own u16) -> u16 { __bitand_u16(self, other) } } -impl BitOr for u16 { fn bitor(own self, _ other: own u16) -> u16 { __bitor_u16(self, other) } } -impl BitXor for u16 { fn bitxor(own self, _ other: own u16) -> u16 { __bitxor_u16(self, other) } } -impl Eq for u16 { - fn eq(self, _ other: u16) -> bool { __eq_u16(self, other) } - fn ne(self, _ other: u16) -> bool { __ne_u16(self, other) } -} -impl Ord for u16 { - fn lt(self, _ other: u16) -> bool { __lt_u16(self, other) } - fn le(self, _ other: u16) -> bool { __le_u16(self, other) } - fn gt(self, _ other: u16) -> bool { __gt_u16(self, other) } - fn ge(self, _ other: u16) -> bool { __ge_u16(self, other) } -} -impl AddAssign for u16 { fn add_assign(mut self, _ other: own u16) { self = self + other } } -impl SubAssign for u16 { fn sub_assign(mut self, _ other: own u16) { self = self - other } } -impl MulAssign for u16 { fn mul_assign(mut self, _ other: own u16) { self = self * other } } -impl DivAssign for u16 { fn div_assign(mut self, _ other: own u16) { self = self / other } } -impl RemAssign for u16 { fn rem_assign(mut self, _ other: own u16) { self = self % other } } -impl PowAssign for u16 { fn pow_assign(mut self, _ other: own u16) { self = self ** other } } -impl ShlAssign for u16 { fn shl_assign(mut self, _ other: own u16) { self = self << other } } -impl ShrAssign for u16 { fn shr_assign(mut self, _ other: own u16) { self = self >> other } } -impl BitAndAssign for u16 { fn bitand_assign(mut self, _ other: own u16) { self = self & other } } -impl BitOrAssign for u16 { fn bitor_assign(mut self, _ other: own u16) { self = self | other } } -impl BitXorAssign for u16 { fn bitxor_assign(mut self, _ other: own u16) { self = self ^ other } } -impl Default for u16 { fn default() -> Self { 0 } } - - -// i32 impls -impl Neg for i32 { fn neg(own self) -> i32 { __neg_i32(self) } } -impl BitNot for i32 { fn bit_not(own self) -> i32 { __bitnot_i32(self) } } -impl Not for i32 { fn not(own self) -> i32 { __bitnot_i32(self) } } -impl Add for i32 { fn add(own self, _ other: own i32) -> i32 { __add_i32(self, other) } } -impl Sub for i32 { fn sub(own self, _ other: own i32) -> i32 { __sub_i32(self, other) } } -impl Mul for i32 { fn mul(own self, _ other: own i32) -> i32 { __mul_i32(self, other) } } -impl Div for i32 { fn div(own self, _ other: own i32) -> i32 { __div_i32(self, other) } } -impl Rem for i32 { fn rem(own self, _ other: own i32) -> i32 { __rem_i32(self, other) } } -impl Pow for i32 { fn pow(own self, _ other: own i32) -> i32 { __pow_i32(self, other) } } -impl Shl for i32 { fn shl(own self, _ other: own i32) -> i32 { __shl_i32(self, other) } } -impl Shr for i32 { fn shr(own self, _ other: own i32) -> i32 { __shr_i32(self, other) } } -impl BitAnd for i32 { fn bitand(own self, _ other: own i32) -> i32 { __bitand_i32(self, other) } } -impl BitOr for i32 { fn bitor(own self, _ other: own i32) -> i32 { __bitor_i32(self, other) } } -impl BitXor for i32 { fn bitxor(own self, _ other: own i32) -> i32 { __bitxor_i32(self, other) } } -impl Eq for i32 { - fn eq(self, _ other: i32) -> bool { __eq_i32(self, other) } - fn ne(self, _ other: i32) -> bool { __ne_i32(self, other) } -} -impl Ord for i32 { - fn lt(self, _ other: i32) -> bool { __lt_i32(self, other) } - fn le(self, _ other: i32) -> bool { __le_i32(self, other) } - fn gt(self, _ other: i32) -> bool { __gt_i32(self, other) } - fn ge(self, _ other: i32) -> bool { __ge_i32(self, other) } -} -impl AddAssign for i32 { fn add_assign(mut self, _ other: own i32) { self = self + other } } -impl SubAssign for i32 { fn sub_assign(mut self, _ other: own i32) { self = self - other } } -impl MulAssign for i32 { fn mul_assign(mut self, _ other: own i32) { self = self * other } } -impl DivAssign for i32 { fn div_assign(mut self, _ other: own i32) { self = self / other } } -impl RemAssign for i32 { fn rem_assign(mut self, _ other: own i32) { self = self % other } } -impl PowAssign for i32 { fn pow_assign(mut self, _ other: own i32) { self = self ** other } } -impl ShlAssign for i32 { fn shl_assign(mut self, _ other: own i32) { self = self << other } } -impl ShrAssign for i32 { fn shr_assign(mut self, _ other: own i32) { self = self >> other } } -impl BitAndAssign for i32 { fn bitand_assign(mut self, _ other: own i32) { self = self & other } } -impl BitOrAssign for i32 { fn bitor_assign(mut self, _ other: own i32) { self = self | other } } -impl BitXorAssign for i32 { fn bitxor_assign(mut self, _ other: own i32) { self = self ^ other } } -impl Default for i32 { fn default() -> Self { 0 } } - -// u32 impls -impl BitNot for u32 { fn bit_not(own self) -> u32 { __bitnot_u32(self) } } -impl Not for u32 { fn not(own self) -> u32 { __bitnot_u32(self) } } -impl Add for u32 { fn add(own self, _ other: own u32) -> u32 { __add_u32(self, other) } } -impl Sub for u32 { fn sub(own self, _ other: own u32) -> u32 { __sub_u32(self, other) } } -impl Mul for u32 { fn mul(own self, _ other: own u32) -> u32 { __mul_u32(self, other) } } -impl Div for u32 { fn div(own self, _ other: own u32) -> u32 { __div_u32(self, other) } } -impl Rem for u32 { fn rem(own self, _ other: own u32) -> u32 { __rem_u32(self, other) } } -impl Pow for u32 { fn pow(own self, _ other: own u32) -> u32 { __pow_u32(self, other) } } -impl Shl for u32 { fn shl(own self, _ other: own u32) -> u32 { __shl_u32(self, other) } } -impl Shr for u32 { fn shr(own self, _ other: own u32) -> u32 { __shr_u32(self, other) } } -impl BitAnd for u32 { fn bitand(own self, _ other: own u32) -> u32 { __bitand_u32(self, other) } } -impl BitOr for u32 { fn bitor(own self, _ other: own u32) -> u32 { __bitor_u32(self, other) } } -impl BitXor for u32 { fn bitxor(own self, _ other: own u32) -> u32 { __bitxor_u32(self, other) } } -impl Eq for u32 { - fn eq(self, _ other: u32) -> bool { __eq_u32(self, other) } - fn ne(self, _ other: u32) -> bool { __ne_u32(self, other) } -} -impl Ord for u32 { - fn lt(self, _ other: u32) -> bool { __lt_u32(self, other) } - fn le(self, _ other: u32) -> bool { __le_u32(self, other) } - fn gt(self, _ other: u32) -> bool { __gt_u32(self, other) } - fn ge(self, _ other: u32) -> bool { __ge_u32(self, other) } -} -impl AddAssign for u32 { fn add_assign(mut self, _ other: own u32) { self = self + other } } -impl SubAssign for u32 { fn sub_assign(mut self, _ other: own u32) { self = self - other } } -impl MulAssign for u32 { fn mul_assign(mut self, _ other: own u32) { self = self * other } } -impl DivAssign for u32 { fn div_assign(mut self, _ other: own u32) { self = self / other } } -impl RemAssign for u32 { fn rem_assign(mut self, _ other: own u32) { self = self % other } } -impl PowAssign for u32 { fn pow_assign(mut self, _ other: own u32) { self = self ** other } } -impl ShlAssign for u32 { fn shl_assign(mut self, _ other: own u32) { self = self << other } } -impl ShrAssign for u32 { fn shr_assign(mut self, _ other: own u32) { self = self >> other } } -impl BitAndAssign for u32 { fn bitand_assign(mut self, _ other: own u32) { self = self & other } } -impl BitOrAssign for u32 { fn bitor_assign(mut self, _ other: own u32) { self = self | other } } -impl BitXorAssign for u32 { fn bitxor_assign(mut self, _ other: own u32) { self = self ^ other } } -impl Default for u32 { fn default() -> Self { 0 } } - -// i64 impls -impl Neg for i64 { fn neg(own self) -> i64 { __neg_i64(self) } } -impl BitNot for i64 { fn bit_not(own self) -> i64 { __bitnot_i64(self) } } -impl Not for i64 { fn not(own self) -> i64 { __bitnot_i64(self) } } -impl Add for i64 { fn add(own self, _ other: own i64) -> i64 { __add_i64(self, other) } } -impl Sub for i64 { fn sub(own self, _ other: own i64) -> i64 { __sub_i64(self, other) } } -impl Mul for i64 { fn mul(own self, _ other: own i64) -> i64 { __mul_i64(self, other) } } -impl Div for i64 { fn div(own self, _ other: own i64) -> i64 { __div_i64(self, other) } } -impl Rem for i64 { fn rem(own self, _ other: own i64) -> i64 { __rem_i64(self, other) } } -impl Pow for i64 { fn pow(own self, _ other: own i64) -> i64 { __pow_i64(self, other) } } -impl Shl for i64 { fn shl(own self, _ other: own i64) -> i64 { __shl_i64(self, other) } } -impl Shr for i64 { fn shr(own self, _ other: own i64) -> i64 { __shr_i64(self, other) } } -impl BitAnd for i64 { fn bitand(own self, _ other: own i64) -> i64 { __bitand_i64(self, other) } } -impl BitOr for i64 { fn bitor(own self, _ other: own i64) -> i64 { __bitor_i64(self, other) } } -impl BitXor for i64 { fn bitxor(own self, _ other: own i64) -> i64 { __bitxor_i64(self, other) } } -impl Eq for i64 { - fn eq(self, _ other: i64) -> bool { __eq_i64(self, other) } - fn ne(self, _ other: i64) -> bool { __ne_i64(self, other) } -} -impl Ord for i64 { - fn lt(self, _ other: i64) -> bool { __lt_i64(self, other) } - fn le(self, _ other: i64) -> bool { __le_i64(self, other) } - fn gt(self, _ other: i64) -> bool { __gt_i64(self, other) } - fn ge(self, _ other: i64) -> bool { __ge_i64(self, other) } -} -impl AddAssign for i64 { fn add_assign(mut self, _ other: own i64) { self = self + other } } -impl SubAssign for i64 { fn sub_assign(mut self, _ other: own i64) { self = self - other } } -impl MulAssign for i64 { fn mul_assign(mut self, _ other: own i64) { self = self * other } } -impl DivAssign for i64 { fn div_assign(mut self, _ other: own i64) { self = self / other } } -impl RemAssign for i64 { fn rem_assign(mut self, _ other: own i64) { self = self % other } } -impl PowAssign for i64 { fn pow_assign(mut self, _ other: own i64) { self = self ** other } } -impl ShlAssign for i64 { fn shl_assign(mut self, _ other: own i64) { self = self << other } } -impl ShrAssign for i64 { fn shr_assign(mut self, _ other: own i64) { self = self >> other } } -impl BitAndAssign for i64 { fn bitand_assign(mut self, _ other: own i64) { self = self & other } } -impl BitOrAssign for i64 { fn bitor_assign(mut self, _ other: own i64) { self = self | other } } -impl BitXorAssign for i64 { fn bitxor_assign(mut self, _ other: own i64) { self = self ^ other } } -impl Default for i64 { fn default() -> Self { 0 } } - -// i128 impls -impl Neg for i128 { fn neg(own self) -> i128 { __neg_i128(self) } } -impl BitNot for i128 { fn bit_not(own self) -> i128 { __bitnot_i128(self) } } -impl Not for i128 { fn not(own self) -> i128 { __bitnot_i128(self) } } -impl Add for i128 { fn add(own self, _ other: own i128) -> i128 { __add_i128(self, other) } } -impl Sub for i128 { fn sub(own self, _ other: own i128) -> i128 { __sub_i128(self, other) } } -impl Mul for i128 { fn mul(own self, _ other: own i128) -> i128 { __mul_i128(self, other) } } -impl Div for i128 { fn div(own self, _ other: own i128) -> i128 { __div_i128(self, other) } } -impl Rem for i128 { fn rem(own self, _ other: own i128) -> i128 { __rem_i128(self, other) } } -impl Pow for i128 { fn pow(own self, _ other: own i128) -> i128 { __pow_i128(self, other) } } -impl Shl for i128 { fn shl(own self, _ other: own i128) -> i128 { __shl_i128(self, other) } } -impl Shr for i128 { fn shr(own self, _ other: own i128) -> i128 { __shr_i128(self, other) } } -impl BitAnd for i128 { fn bitand(own self, _ other: own i128) -> i128 { __bitand_i128(self, other) } } -impl BitOr for i128 { fn bitor(own self, _ other: own i128) -> i128 { __bitor_i128(self, other) } } -impl BitXor for i128 { fn bitxor(own self, _ other: own i128) -> i128 { __bitxor_i128(self, other) } } -impl Eq for i128 { - fn eq(self, _ other: i128) -> bool { __eq_i128(self, other) } - fn ne(self, _ other: i128) -> bool { __ne_i128(self, other) } -} -impl Ord for i128 { - fn lt(self, _ other: i128) -> bool { __lt_i128(self, other) } - fn le(self, _ other: i128) -> bool { __le_i128(self, other) } - fn gt(self, _ other: i128) -> bool { __gt_i128(self, other) } - fn ge(self, _ other: i128) -> bool { __ge_i128(self, other) } -} -impl AddAssign for i128 { fn add_assign(mut self, _ other: own i128) { self = self + other } } -impl SubAssign for i128 { fn sub_assign(mut self, _ other: own i128) { self = self - other } } -impl MulAssign for i128 { fn mul_assign(mut self, _ other: own i128) { self = self * other } } -impl DivAssign for i128 { fn div_assign(mut self, _ other: own i128) { self = self / other } } -impl RemAssign for i128 { fn rem_assign(mut self, _ other: own i128) { self = self % other } } -impl PowAssign for i128 { fn pow_assign(mut self, _ other: own i128) { self = self ** other } } -impl ShlAssign for i128 { fn shl_assign(mut self, _ other: own i128) { self = self << other } } -impl ShrAssign for i128 { fn shr_assign(mut self, _ other: own i128) { self = self >> other } } -impl BitAndAssign for i128 { fn bitand_assign(mut self, _ other: own i128) { self = self & other } } -impl BitOrAssign for i128 { fn bitor_assign(mut self, _ other: own i128) { self = self | other } } -impl BitXorAssign for i128 { fn bitxor_assign(mut self, _ other: own i128) { self = self ^ other } } -impl Default for i128 { fn default() -> Self { 0 } } - -// u64 impls -impl BitNot for u64 { fn bit_not(own self) -> u64 { __bitnot_u64(self) } } -impl Not for u64 { fn not(own self) -> u64 { __bitnot_u64(self) } } -impl Add for u64 { fn add(own self, _ other: own u64) -> u64 { __add_u64(self, other) } } -impl Sub for u64 { fn sub(own self, _ other: own u64) -> u64 { __sub_u64(self, other) } } -impl Mul for u64 { fn mul(own self, _ other: own u64) -> u64 { __mul_u64(self, other) } } -impl Div for u64 { fn div(own self, _ other: own u64) -> u64 { __div_u64(self, other) } } -impl Rem for u64 { fn rem(own self, _ other: own u64) -> u64 { __rem_u64(self, other) } } -impl Pow for u64 { fn pow(own self, _ other: own u64) -> u64 { __pow_u64(self, other) } } -impl Shl for u64 { fn shl(own self, _ other: own u64) -> u64 { __shl_u64(self, other) } } -impl Shr for u64 { fn shr(own self, _ other: own u64) -> u64 { __shr_u64(self, other) } } -impl BitAnd for u64 { fn bitand(own self, _ other: own u64) -> u64 { __bitand_u64(self, other) } } -impl BitOr for u64 { fn bitor(own self, _ other: own u64) -> u64 { __bitor_u64(self, other) } } -impl BitXor for u64 { fn bitxor(own self, _ other: own u64) -> u64 { __bitxor_u64(self, other) } } -impl Eq for u64 { - fn eq(self, _ other: u64) -> bool { __eq_u64(self, other) } - fn ne(self, _ other: u64) -> bool { __ne_u64(self, other) } -} -impl Ord for u64 { - fn lt(self, _ other: u64) -> bool { __lt_u64(self, other) } - fn le(self, _ other: u64) -> bool { __le_u64(self, other) } - fn gt(self, _ other: u64) -> bool { __gt_u64(self, other) } - fn ge(self, _ other: u64) -> bool { __ge_u64(self, other) } -} -impl AddAssign for u64 { fn add_assign(mut self, _ other: own u64) { self = self + other } } -impl SubAssign for u64 { fn sub_assign(mut self, _ other: own u64) { self = self - other } } -impl MulAssign for u64 { fn mul_assign(mut self, _ other: own u64) { self = self * other } } -impl DivAssign for u64 { fn div_assign(mut self, _ other: own u64) { self = self / other } } -impl RemAssign for u64 { fn rem_assign(mut self, _ other: own u64) { self = self % other } } -impl PowAssign for u64 { fn pow_assign(mut self, _ other: own u64) { self = self ** other } } -impl ShlAssign for u64 { fn shl_assign(mut self, _ other: own u64) { self = self << other } } -impl ShrAssign for u64 { fn shr_assign(mut self, _ other: own u64) { self = self >> other } } -impl BitAndAssign for u64 { fn bitand_assign(mut self, _ other: own u64) { self = self & other } } -impl BitOrAssign for u64 { fn bitor_assign(mut self, _ other: own u64) { self = self | other } } -impl BitXorAssign for u64 { fn bitxor_assign(mut self, _ other: own u64) { self = self ^ other } } -impl Default for u64 { fn default() -> Self { 0 } } - -// u128 impls -impl BitNot for u128 { fn bit_not(own self) -> u128 { __bitnot_u128(self) } } -impl Not for u128 { fn not(own self) -> u128 { __bitnot_u128(self) } } -impl Add for u128 { fn add(own self, _ other: own u128) -> u128 { __add_u128(self, other) } } -impl Sub for u128 { fn sub(own self, _ other: own u128) -> u128 { __sub_u128(self, other) } } -impl Mul for u128 { fn mul(own self, _ other: own u128) -> u128 { __mul_u128(self, other) } } -impl Div for u128 { fn div(own self, _ other: own u128) -> u128 { __div_u128(self, other) } } -impl Rem for u128 { fn rem(own self, _ other: own u128) -> u128 { __rem_u128(self, other) } } -impl Pow for u128 { fn pow(own self, _ other: own u128) -> u128 { __pow_u128(self, other) } } -impl Shl for u128 { fn shl(own self, _ other: own u128) -> u128 { __shl_u128(self, other) } } -impl Shr for u128 { fn shr(own self, _ other: own u128) -> u128 { __shr_u128(self, other) } } -impl BitAnd for u128 { fn bitand(own self, _ other: own u128) -> u128 { __bitand_u128(self, other) } } -impl BitOr for u128 { fn bitor(own self, _ other: own u128) -> u128 { __bitor_u128(self, other) } } -impl BitXor for u128 { fn bitxor(own self, _ other: own u128) -> u128 { __bitxor_u128(self, other) } } -impl Eq for u128 { - fn eq(self, _ other: u128) -> bool { __eq_u128(self, other) } - fn ne(self, _ other: u128) -> bool { __ne_u128(self, other) } -} -impl Ord for u128 { - fn lt(self, _ other: u128) -> bool { __lt_u128(self, other) } - fn le(self, _ other: u128) -> bool { __le_u128(self, other) } - fn gt(self, _ other: u128) -> bool { __gt_u128(self, other) } - fn ge(self, _ other: u128) -> bool { __ge_u128(self, other) } -} -impl AddAssign for u128 { fn add_assign(mut self, _ other: own u128) { self = self + other } } -impl SubAssign for u128 { fn sub_assign(mut self, _ other: own u128) { self = self - other } } -impl MulAssign for u128 { fn mul_assign(mut self, _ other: own u128) { self = self * other } } -impl DivAssign for u128 { fn div_assign(mut self, _ other: own u128) { self = self / other } } -impl RemAssign for u128 { fn rem_assign(mut self, _ other: own u128) { self = self % other } } -impl PowAssign for u128 { fn pow_assign(mut self, _ other: own u128) { self = self ** other } } -impl ShlAssign for u128 { fn shl_assign(mut self, _ other: own u128) { self = self << other } } -impl ShrAssign for u128 { fn shr_assign(mut self, _ other: own u128) { self = self >> other } } -impl BitAndAssign for u128 { fn bitand_assign(mut self, _ other: own u128) { self = self & other } } -impl BitOrAssign for u128 { fn bitor_assign(mut self, _ other: own u128) { self = self | other } } -impl BitXorAssign for u128 { fn bitxor_assign(mut self, _ other: own u128) { self = self ^ other } } -impl Default for u128 { fn default() -> Self { 0 } } - -// usize impls -impl BitNot for usize { fn bit_not(own self) -> usize { __bitnot_usize(self) } } -impl Not for usize { fn not(own self) -> usize { __bitnot_usize(self) } } -impl Add for usize { fn add(own self, _ other: own usize) -> usize { __add_usize(self, other) } } -impl Sub for usize { fn sub(own self, _ other: own usize) -> usize { __sub_usize(self, other) } } -impl Mul for usize { fn mul(own self, _ other: own usize) -> usize { __mul_usize(self, other) } } -impl Div for usize { fn div(own self, _ other: own usize) -> usize { __div_usize(self, other) } } -impl Rem for usize { fn rem(own self, _ other: own usize) -> usize { __rem_usize(self, other) } } -impl Pow for usize { fn pow(own self, _ other: own usize) -> usize { __pow_usize(self, other) } } -impl Shl for usize { fn shl(own self, _ other: own usize) -> usize { __shl_usize(self, other) } } -impl Shr for usize { fn shr(own self, _ other: own usize) -> usize { __shr_usize(self, other) } } -impl BitAnd for usize { fn bitand(own self, _ other: own usize) -> usize { __bitand_usize(self, other) } } -impl BitOr for usize { fn bitor(own self, _ other: own usize) -> usize { __bitor_usize(self, other) } } -impl BitXor for usize { fn bitxor(own self, _ other: own usize) -> usize { __bitxor_usize(self, other) } } -impl Eq for usize { - fn eq(self, _ other: usize) -> bool { __eq_usize(self, other) } - fn ne(self, _ other: usize) -> bool { __ne_usize(self, other) } -} -impl Ord for usize { - fn lt(self, _ other: usize) -> bool { __lt_usize(self, other) } - fn le(self, _ other: usize) -> bool { __le_usize(self, other) } - fn gt(self, _ other: usize) -> bool { __gt_usize(self, other) } - fn ge(self, _ other: usize) -> bool { __ge_usize(self, other) } -} -impl AddAssign for usize { fn add_assign(mut self, _ other: own usize) { self = self + other } } -impl SubAssign for usize { fn sub_assign(mut self, _ other: own usize) { self = self - other } } -impl MulAssign for usize { fn mul_assign(mut self, _ other: own usize) { self = self * other } } -impl DivAssign for usize { fn div_assign(mut self, _ other: own usize) { self = self / other } } -impl RemAssign for usize { fn rem_assign(mut self, _ other: own usize) { self = self % other } } -impl PowAssign for usize { fn pow_assign(mut self, _ other: own usize) { self = self ** other } } -impl ShlAssign for usize { fn shl_assign(mut self, _ other: own usize) { self = self << other } } -impl ShrAssign for usize { fn shr_assign(mut self, _ other: own usize) { self = self >> other } } -impl BitAndAssign for usize { fn bitand_assign(mut self, _ other: own usize) { self = self & other } } -impl BitOrAssign for usize { fn bitor_assign(mut self, _ other: own usize) { self = self | other } } -impl BitXorAssign for usize { fn bitxor_assign(mut self, _ other: own usize) { self = self ^ other } } -impl Default for usize { fn default() -> Self { 0 } } - -// i256 impls -impl Neg for i256 { fn neg(own self) -> i256 { __neg_i256(self) } } -impl BitNot for i256 { fn bit_not(own self) -> i256 { __bitnot_i256(self) } } -impl Not for i256 { fn not(own self) -> i256 { __bitnot_i256(self) } } -impl Add for i256 { fn add(own self, _ other: own i256) -> i256 { __add_i256(self, other) } } -impl Sub for i256 { fn sub(own self, _ other: own i256) -> i256 { __sub_i256(self, other) } } -impl Mul for i256 { fn mul(own self, _ other: own i256) -> i256 { __mul_i256(self, other) } } -impl Div for i256 { fn div(own self, _ other: own i256) -> i256 { __div_i256(self, other) } } -impl Rem for i256 { fn rem(own self, _ other: own i256) -> i256 { __rem_i256(self, other) } } -impl Pow for i256 { fn pow(own self, _ other: own i256) -> i256 { __pow_i256(self, other) } } -impl Shl for i256 { fn shl(own self, _ other: own i256) -> i256 { __shl_i256(self, other) } } -impl Shr for i256 { fn shr(own self, _ other: own i256) -> i256 { __shr_i256(self, other) } } -impl BitAnd for i256 { fn bitand(own self, _ other: own i256) -> i256 { __bitand_i256(self, other) } } -impl BitOr for i256 { fn bitor(own self, _ other: own i256) -> i256 { __bitor_i256(self, other) } } -impl BitXor for i256 { fn bitxor(own self, _ other: own i256) -> i256 { __bitxor_i256(self, other) } } -impl Eq for i256 { - fn eq(self, _ other: i256) -> bool { __eq_i256(self, other) } - fn ne(self, _ other: i256) -> bool { __ne_i256(self, other) } -} -impl Ord for i256 { - fn lt(self, _ other: i256) -> bool { __lt_i256(self, other) } - fn le(self, _ other: i256) -> bool { __le_i256(self, other) } - fn gt(self, _ other: i256) -> bool { __gt_i256(self, other) } - fn ge(self, _ other: i256) -> bool { __ge_i256(self, other) } -} -impl AddAssign for i256 { fn add_assign(mut self, _ other: own i256) { self = self + other } } -impl SubAssign for i256 { fn sub_assign(mut self, _ other: own i256) { self = self - other } } -impl MulAssign for i256 { fn mul_assign(mut self, _ other: own i256) { self = self * other } } -impl DivAssign for i256 { fn div_assign(mut self, _ other: own i256) { self = self / other } } -impl RemAssign for i256 { fn rem_assign(mut self, _ other: own i256) { self = self % other } } -impl PowAssign for i256 { fn pow_assign(mut self, _ other: own i256) { self = self ** other } } -impl ShlAssign for i256 { fn shl_assign(mut self, _ other: own i256) { self = self << other } } -impl ShrAssign for i256 { fn shr_assign(mut self, _ other: own i256) { self = self >> other } } -impl BitAndAssign for i256 { fn bitand_assign(mut self, _ other: own i256) { self = self & other } } -impl BitOrAssign for i256 { fn bitor_assign(mut self, _ other: own i256) { self = self | other } } -impl BitXorAssign for i256 { fn bitxor_assign(mut self, _ other: own i256) { self = self ^ other } } -impl Default for i256 { fn default() -> Self { 0 } } - -// u256 impls -impl BitNot for u256 { fn bit_not(own self) -> u256 { __bitnot_u256(self) } } -impl Not for u256 { fn not(own self) -> u256 { __bitnot_u256(self) } } -impl Add for u256 { fn add(own self, _ other: own u256) -> u256 { __add_u256(self, other) } } -impl Sub for u256 { fn sub(own self, _ other: own u256) -> u256 { __sub_u256(self, other) } } -impl Mul for u256 { fn mul(own self, _ other: own u256) -> u256 { __mul_u256(self, other) } } -impl Div for u256 { fn div(own self, _ other: own u256) -> u256 { __div_u256(self, other) } } -impl Rem for u256 { fn rem(own self, _ other: own u256) -> u256 { __rem_u256(self, other) } } -impl Pow for u256 { fn pow(own self, _ other: own u256) -> u256 { __pow_u256(self, other) } } -impl Shl for u256 { fn shl(own self, _ other: own u256) -> u256 { __shl_u256(self, other) } } -impl Shr for u256 { fn shr(own self, _ other: own u256) -> u256 { __shr_u256(self, other) } } -impl BitAnd for u256 { fn bitand(own self, _ other: own u256) -> u256 { __bitand_u256(self, other) } } -impl BitOr for u256 { fn bitor(own self, _ other: own u256) -> u256 { __bitor_u256(self, other) } } -impl BitXor for u256 { fn bitxor(own self, _ other: own u256) -> u256 { __bitxor_u256(self, other) } } -impl Eq for u256 { - fn eq(self, _ other: u256) -> bool { __eq_u256(self, other) } - fn ne(self, _ other: u256) -> bool { __ne_u256(self, other) } -} -impl Ord for u256 { - fn lt(self, _ other: u256) -> bool { __lt_u256(self, other) } - fn le(self, _ other: u256) -> bool { __le_u256(self, other) } - fn gt(self, _ other: u256) -> bool { __gt_u256(self, other) } - fn ge(self, _ other: u256) -> bool { __ge_u256(self, other) } -} -impl AddAssign for u256 { fn add_assign(mut self, _ other: own u256) { self = self + other } } -impl SubAssign for u256 { fn sub_assign(mut self, _ other: own u256) { self = self - other } } -impl MulAssign for u256 { fn mul_assign(mut self, _ other: own u256) { self = self * other } } -impl DivAssign for u256 { fn div_assign(mut self, _ other: own u256) { self = self / other } } -impl RemAssign for u256 { fn rem_assign(mut self, _ other: own u256) { self = self % other } } -impl PowAssign for u256 { fn pow_assign(mut self, _ other: own u256) { self = self ** other } } -impl ShlAssign for u256 { fn shl_assign(mut self, _ other: own u256) { self = self << other } } -impl ShrAssign for u256 { fn shr_assign(mut self, _ other: own u256) { self = self >> other } } -impl BitAndAssign for u256 { fn bitand_assign(mut self, _ other: own u256) { self = self & other } } -impl BitOrAssign for u256 { fn bitor_assign(mut self, _ other: own u256) { self = self | other } } -impl BitXorAssign for u256 { fn bitxor_assign(mut self, _ other: own u256) { self = self ^ other } } -impl Default for u256 { fn default() -> Self { 0 } } - -// isize impls -impl Neg for isize { fn neg(own self) -> isize { __neg_isize(self) } } -impl BitNot for isize { fn bit_not(own self) -> isize { __bitnot_isize(self) } } -impl Not for isize { fn not(own self) -> isize { __bitnot_isize(self) } } -impl Add for isize { fn add(own self, _ other: own isize) -> isize { __add_isize(self, other) } } -impl Sub for isize { fn sub(own self, _ other: own isize) -> isize { __sub_isize(self, other) } } -impl Mul for isize { fn mul(own self, _ other: own isize) -> isize { __mul_isize(self, other) } } -impl Div for isize { fn div(own self, _ other: own isize) -> isize { __div_isize(self, other) } } -impl Rem for isize { fn rem(own self, _ other: own isize) -> isize { __rem_isize(self, other) } } -impl Pow for isize { fn pow(own self, _ other: own isize) -> isize { __pow_isize(self, other) } } -impl Shl for isize { fn shl(own self, _ other: own isize) -> isize { __shl_isize(self, other) } } -impl Shr for isize { fn shr(own self, _ other: own isize) -> isize { __shr_isize(self, other) } } -impl BitAnd for isize { fn bitand(own self, _ other: own isize) -> isize { __bitand_isize(self, other) } } -impl BitOr for isize { fn bitor(own self, _ other: own isize) -> isize { __bitor_isize(self, other) } } -impl BitXor for isize { fn bitxor(own self, _ other: own isize) -> isize { __bitxor_isize(self, other) } } -impl Eq for isize { - fn eq(self, _ other: isize) -> bool { __eq_isize(self, other) } - fn ne(self, _ other: isize) -> bool { __ne_isize(self, other) } -} -impl Ord for isize { - fn lt(self, _ other: isize) -> bool { __lt_isize(self, other) } - fn le(self, _ other: isize) -> bool { __le_isize(self, other) } - fn gt(self, _ other: isize) -> bool { __gt_isize(self, other) } - fn ge(self, _ other: isize) -> bool { __ge_isize(self, other) } -} -impl AddAssign for isize { fn add_assign(mut self, _ other: own isize) { self = self + other } } -impl SubAssign for isize { fn sub_assign(mut self, _ other: own isize) { self = self - other } } -impl MulAssign for isize { fn mul_assign(mut self, _ other: own isize) { self = self * other } } -impl DivAssign for isize { fn div_assign(mut self, _ other: own isize) { self = self / other } } -impl RemAssign for isize { fn rem_assign(mut self, _ other: own isize) { self = self % other } } -impl PowAssign for isize { fn pow_assign(mut self, _ other: own isize) { self = self ** other } } -impl ShlAssign for isize { fn shl_assign(mut self, _ other: own isize) { self = self << other } } -impl ShrAssign for isize { fn shr_assign(mut self, _ other: own isize) { self = self >> other } } -impl BitAndAssign for isize { fn bitand_assign(mut self, _ other: own isize) { self = self & other } } -impl BitOrAssign for isize { fn bitor_assign(mut self, _ other: own isize) { self = self | other } } -impl BitXorAssign for isize { fn bitxor_assign(mut self, _ other: own isize) { self = self ^ other } } -impl Default for isize { fn default() -> Self { 0 } } - -// bool impls -impl Not for bool { fn not(own self) -> bool { __not_bool(self) } } -impl BitAnd for bool { fn bitand(own self, _ other: own bool) -> bool { __bitand_bool(self, other) } } -impl BitOr for bool { fn bitor(own self, _ other: own bool) -> bool { __bitor_bool(self, other) } } -impl BitXor for bool { fn bitxor(own self, _ other: own bool) -> bool { __bitxor_bool(self, other) } } -impl BitOrAssign for bool { fn bitor_assign(mut self, _ other: own bool) { self = self | other } } -impl Eq for bool { - fn eq(self, _ other: bool) -> bool { __eq_bool(self, other) } - fn ne(self, _ other: bool) -> bool { __ne_bool(self, other) } -} -impl Default for bool { fn default() -> Self { false } } diff --git a/ingots/core/src/ops.fe b/ingots/core/src/ops.fe deleted file mode 100644 index 449d79fceb..0000000000 --- a/ingots/core/src/ops.fe +++ /dev/null @@ -1,152 +0,0 @@ -pub trait Add { - type Output = Self - - fn add(own self, _ other: own T) -> Self::Output -} - -// Arithmetic binary operators -pub trait Sub { - type Output = Self - - fn sub(own self, _ other: own T) -> Self::Output -} - -pub trait Mul { - type Output = Self - fn mul(own self, _ other: own T) -> Self::Output -} - -pub trait Div { - type Output = Self - - fn div(own self, _ other: own T) -> Self::Output -} - -pub trait Rem { - type Output = Self - - fn rem(own self, _ other: own T) -> Self::Output -} - -pub trait Pow { - type Output = Self - - fn pow(own self, _ other: own T) -> Self::Output -} - -// Bitwise binary operators -pub trait BitAnd { - type Output = Self - - fn bitand(own self, _ other: own T) -> Self::Output -} - -pub trait BitOr { - type Output = Self - - fn bitor(own self, _ other: own T) -> Self::Output -} - -pub trait BitXor { - type Output = Self - - fn bitxor(own self, _ other: own T) -> Self::Output -} - -// Shift operators -pub trait Shl { - type Output = Self - - fn shl(own self, _ other: own T) -> Self::Output -} - -pub trait Shr { - type Output = Self - - fn shr(own self, _ other: own T) -> Self::Output -} - -pub trait Neg { - type Output = Self - - fn neg(own self) -> Self::Output -} - -pub trait Not { - type Output = Self - - fn not(own self) -> Self::Output -} - -pub trait BitNot { - type Output = Self - - fn bit_not(own self) -> Self::Output -} - -// Comparison operators -pub trait Eq { - fn eq(self, _ other: T) -> bool - fn ne(self, _ other: T) -> bool { - !self.eq(other) - } -} - -pub trait Ord { - fn lt(self, _ other: T) -> bool - fn le(self, _ other: T) -> bool - fn gt(self, _ other: T) -> bool - fn ge(self, _ other: T) -> bool -} - -// Indexing operator -pub trait Index { - type Output - - fn index(self, _ index: I) -> Self::Output -} - -// Augmented assignment operators (return unit) -pub trait AddAssign { - fn add_assign(mut self, _ other: own T) -} - -pub trait SubAssign { - fn sub_assign(mut self, _ other: own T) -} - -pub trait MulAssign { - fn mul_assign(mut self, _ other: own T) -} - -pub trait DivAssign { - fn div_assign(mut self, _ other: own T) -} - -pub trait RemAssign { - fn rem_assign(mut self, _ other: own T) -} - -pub trait PowAssign { - fn pow_assign(mut self, _ other: own T) -} - -pub trait ShlAssign { - fn shl_assign(mut self, _ other: own T) -} - -pub trait ShrAssign { - fn shr_assign(mut self, _ other: own T) -} - -pub trait BitAndAssign { - fn bitand_assign(mut self, _ other: own T) -} - -pub trait BitOrAssign { - fn bitor_assign(mut self, _ other: own T) -} - -pub trait BitXorAssign { - fn bitxor_assign(mut self, _ other: own T) -} diff --git a/ingots/core/src/option.fe b/ingots/core/src/option.fe deleted file mode 100644 index f1c0c3bed2..0000000000 --- a/ingots/core/src/option.fe +++ /dev/null @@ -1,105 +0,0 @@ -use ingot::Default -use ingot::Fn -use ingot::Functor -use ingot::Applicative -use ingot::Monad -use ingot::panic - -pub enum Option { - Some(T), - None -} - -impl Option { - pub fn is_some(own self) -> bool { - match self { - Self::Some(_) => true - Self::None => false - } - } - - pub fn is_none(own self) -> bool { - !self.is_some() - } - - pub fn map>(own self, _ func: F) -> Option { - match self { - Self::Some(value) => Option::Some(func.call(value)) - Self::None => Option::None - } - } - - pub fn and_then>>(own self, _ func: F) -> Option { - match self { - Self::Some(value) => func.call(value) - Self::None => Option::None - } - } - - pub fn unwrap(own self) -> T { - match self { - Self::Some(t) => t - Self::None => panic() - } - } - - pub fn unwrap_or(own self, default: own T) -> T { - match self { - Self::Some(x) => x - Self::None => default - } - } - - pub fn unwrap_or_else>(own self, _ default_func: F) -> T { - match self { - Self::Some(value) => value - Self::None => default_func.call(()) - } - } -} - -impl Option where T: Default { - pub fn unwrap_or_default(own self) -> T { - match self { - Self::Some(x) => x - Self::None => T::default() - } - } -} - -impl Default for Option { - fn default() -> Self { - Self::None - } -} - -impl Functor for Option { - fn map>(self: own Self, _ func: F) -> Self { - match self { - Option::Some(value) => Option::Some(func.call(value)) - Option::None => Option::None - } - } -} - -impl Applicative for Option { - fn pure(_ value: own T) -> Self { - Option::Some(value) - } - - fn ap>(self: own Self, _ value: own Self) -> Self { - match (self, value) { - (Option::Some(func), Option::Some(arg)) => Option::Some(func.call(arg)) - _ => Option::None - } - } -} - -impl Monad for Option { - fn bind>>(self: own Self, _ func: F) -> Self { - match self { - Option::Some(value) => func.call(value) - Option::None => Option::None - } - } -} diff --git a/ingots/core/src/prelude.fe b/ingots/core/src/prelude.fe deleted file mode 100644 index 354a87b374..0000000000 --- a/ingots/core/src/prelude.fe +++ /dev/null @@ -1,10 +0,0 @@ -pub use super::{ - clone::Clone, - default::Default, - marker::Copy, - message::MsgVariant, - num::IntDowncast, - option::Option::{self, *}, - result::Result::{self, *}, - todo, panic, -} diff --git a/ingots/core/src/range.fe b/ingots/core/src/range.fe deleted file mode 100644 index b919b60d73..0000000000 --- a/ingots/core/src/range.fe +++ /dev/null @@ -1,102 +0,0 @@ -use ingot::seq::Seq - -/// Trait for range bounds - either compile-time known or runtime. -pub trait Bound { - /// The runtime representation of this bound. - /// `()` for Known (value is in the type), `usize` for Unknown. - type Repr -} - -/// A compile-time known bound value. -pub struct Known {} - -/// A runtime bound value. -pub struct Unknown {} - -impl Bound for Known { - type Repr = () -} - -impl Bound for Unknown { - type Repr = usize -} - -/// A range from start to end (exclusive). -/// -/// The bounds can be either compile-time known (`Known`) or runtime (`Unknown`). -/// This allows for zero-cost ranges when bounds are known at compile time: -/// - `Range, Known<10>>` - 0 words (fully const) -/// - `Range, Unknown>` - 1 word (common `0..n` pattern) -/// - `Range` - 2 words (fully dynamic) -pub struct Range { - pub start: ::Repr, - pub end: ::Repr, -} - -/// Fully const range: `Known..Known` -impl Seq for Range, Known> { - type Item = usize - - fn len(self) -> usize { - if E < S { - 0 - } else { - E - S - } - } - - fn get(self, i: usize) -> usize { - S + i - } -} - -/// Const start, dynamic end: `Known..n` (common `0..n` pattern) -impl Seq for Range, Unknown> { - type Item = usize - - fn len(self) -> usize { - if self.end < S { - 0 - } else { - self.end - S - } - } - - fn get(self, i: usize) -> usize { - S + i - } -} - -/// Dynamic start, const end: `n..Known` -impl Seq for Range> { - type Item = usize - - fn len(self) -> usize { - if E < self.start { - 0 - } else { - E - self.start - } - } - - fn get(self, i: usize) -> usize { - self.start + i - } -} - -/// Fully dynamic range: `start..end` -impl Seq for Range { - type Item = usize - - fn len(self) -> usize { - if self.end < self.start { - 0 - } else { - self.end - self.start - } - } - - fn get(self, i: usize) -> usize { - self.start + i - } -} diff --git a/ingots/core/src/result.fe b/ingots/core/src/result.fe deleted file mode 100644 index 18765c7776..0000000000 --- a/ingots/core/src/result.fe +++ /dev/null @@ -1,135 +0,0 @@ -use ingot::Default -use ingot::Fn -use ingot::Functor -use ingot::Applicative -use ingot::Monad -use ingot::Option -use ingot::panic - -pub enum Result { - Err(E), - Ok(T), -} - -impl Result { - pub fn is_ok(own self) -> bool { - match self { - Self::Ok(_) => true - Self::Err(_) => false - } - } - - pub fn is_err(own self) -> bool { - !self.is_ok() - } - - pub fn ok(own self) -> Option { - match self { - Self::Ok(value) => Option::Some(value) - Self::Err(_) => Option::None - } - } - - pub fn err(own self) -> Option { - match self { - Self::Err(error) => Option::Some(error) - Self::Ok(_) => Option::None - } - } - - pub fn unwrap(own self) -> T { - match self { - Self::Ok(value) => value - Self::Err(_) => panic() - } - } - - pub fn unwrap_err(own self) -> E { - match self { - Self::Err(error) => error - Self::Ok(_) => panic() - } - } - - pub fn unwrap_or(own self, default: own T) -> T { - match self { - Self::Ok(value) => value - Self::Err(_) => default - } - } - - pub fn map>(own self, _ func: F) -> Result { - match self { - Self::Ok(value) => Result::Ok(func.call(value)) - Self::Err(error) => Result::Err(error) - } - } - - pub fn map_err>(own self, _ func: F) -> Result { - match self { - Self::Ok(value) => Result::Ok(value) - Self::Err(error) => Result::Err(func.call(error)) - } - } - - pub fn and_then>>(own self, _ func: F) -> Result { - match self { - Self::Ok(value) => func.call(value) - Self::Err(error) => Result::Err(error) - } - } - - pub fn or_else>>(own self, _ func: F) -> Result { - match self { - Self::Ok(value) => Result::Ok(value) - Self::Err(error) => func.call(error) - } - } -} - -impl Result where T: Default { - pub fn unwrap_or_default(own self) -> T { - match self { - Self::Ok(value) => value - Self::Err(_) => T::default() - } - } -} - -impl Default for Result where T: Default { - fn default() -> Self { - Result::Ok(T::default()) - } -} - -impl Functor for Result { - fn map>(self: own Self, _ func: F) -> Self { - match self { - Result::Ok(value) => Result::Ok(func.call(value)) - Result::Err(error) => Result::Err(error) - } - } -} - -impl Applicative for Result { - fn pure(_ value: own T) -> Self { - Result::Ok(value) - } - - fn ap>(self: own Self, _ value: own Self) -> Self { - match (self, value) { - (Result::Ok(func), Result::Ok(arg)) => Result::Ok(func.call(arg)) - (Result::Err(error), _) => Result::Err(error) - (_, Result::Err(error)) => Result::Err(error) - } - } -} - -impl Monad for Result { - fn bind>>(self: own Self, _ func: F) -> Self { - match self { - Result::Ok(value) => func.call(value) - Result::Err(error) => Result::Err(error) - } - } -} diff --git a/ingots/core/src/seq.fe b/ingots/core/src/seq.fe deleted file mode 100644 index cd85b52c61..0000000000 --- a/ingots/core/src/seq.fe +++ /dev/null @@ -1,28 +0,0 @@ -use ingot::Copy - -/// Trait for types that can be iterated over. -pub trait Seq { - /// The element type of this sequence. - type Item - - /// Returns the length of the sequence. - fn len(self) -> usize - - /// Returns the element at the given index. - fn get(self, i: usize) -> Self::Item -} - -/// Array implementation of Seq. -impl Seq for [T; N] - where T: Copy -{ - type Item = T - - fn len(self) -> usize { - N - } - - fn get(self, i: usize) -> T { - self[i] - } -} diff --git a/ingots/std/fe.toml b/ingots/std/fe.toml deleted file mode 100644 index 39a7a9a21e..0000000000 --- a/ingots/std/fe.toml +++ /dev/null @@ -1,3 +0,0 @@ -[ingot] -name = "std" -version = "0.1.0" diff --git a/ingots/std/src/abi.fe b/ingots/std/src/abi.fe deleted file mode 100644 index 24c66d257b..0000000000 --- a/ingots/std/src/abi.fe +++ /dev/null @@ -1,2 +0,0 @@ -pub use sol::{self, *} - diff --git a/ingots/std/src/abi/sol.fe b/ingots/std/src/abi/sol.fe deleted file mode 100644 index 78716787fb..0000000000 --- a/ingots/std/src/abi/sol.fe +++ /dev/null @@ -1,931 +0,0 @@ -use core::abi::{Abi, AbiDecoder, AbiEncoder, ByteInput, Cursor, Encode} -use core::{AsBytes, keccak} -use ingot::evm::mem -use ingot::evm::ops::{mstore, mstore8, revert} -use ingot::evm::Address -use ingot::evm::TopicValue - -pub struct Sol {} - -/// Compute the 4-byte Solidity selector for a signature string. -/// -/// For example, `sol("transfer(address,uint256)") == 0xa9059cbb`. -pub const fn sol(sig: T) -> u32 { - (keccak(sig) >> 224) as u32 -} - -extern { - pub const fn encoded_size() -> u256 -} - -impl Abi for Sol { - type Selector = u32 - type Decoder = SolDecoder - type Encoder = SolEncoder - const SELECTOR_SIZE: u256 = 4 - - fn selector_from_prefix(_ prefix: u256) -> Self::Selector { - (prefix >> 224).downcast_unchecked() - } - - fn decoder_new(_ input: own I) -> Self::Decoder { - SolDecoder::new(input) - } - - fn decoder_with_base(_ input: own I, base: u256) -> Self::Decoder { - SolDecoder::with_base(input, base) - } - - fn encoder_new() -> Self::Encoder { - SolEncoder::new() - } -} - -pub struct SolDecoder { - pub cur: Cursor, - pub base: u256, -} - -impl SolDecoder - where I: ByteInput -{ - pub fn new(input: own I) -> Self { - SolDecoder { - cur: Cursor::new(input), - base: 0, - } - } - - pub fn with_base(input: own I, base: u256) -> Self { - SolDecoder { - cur: Cursor::new(input).fork(base), - base, - } - } -} - -impl AbiDecoder for SolDecoder - where I: ByteInput -{ - type Input = I - - fn input(self) -> Self::Input { - self.cur.input - } - - fn base(self) -> u256 { - self.base - } - - fn pos(self) -> u256 { - self.cur.pos - } - - fn set_pos(mut self, new_pos: u256) { - self.cur.pos = new_pos - } - - fn read_u8(mut self) -> u8 { - let len = self.cur.input.len() - let new_pos = self.cur.pos + 1 - if new_pos < self.cur.pos || new_pos > len { - revert(0, 0) - } - let b = self.cur.input.byte_at(self.cur.pos) - self.cur.pos = new_pos - b - } - - fn read_word(mut self) -> u256 { - let len = self.cur.input.len() - let new_pos = self.cur.pos + 32 - if new_pos < self.cur.pos || new_pos > len { - revert(0, 0) - } - let w = self.cur.input.word_at(self.cur.pos) - self.cur.pos = new_pos - w - } - - fn peek_word(self, at: u256) -> u256 { - let len = self.cur.input.len() - let end = at + 32 - if end < at || end > len { - revert(0, 0) - } - self.cur.input.word_at(at) - } - - fn alloc(mut self, size: u256) -> u256 { - mem::alloc(size) - } -} - -pub struct SolEncoder { - pub start: u256, - pub pos: u256, - pub end: u256, -} - -impl SolEncoder { - pub fn new() -> Self { - SolEncoder { - start: 0, - pos: 0, - end: 0, - } - } - - fn ensure_init(mut self, bytes: u256) { - if self.start == 0 { - let ptr = mem::alloc(bytes) - self.start = ptr - self.pos = ptr - self.end = ptr + bytes - } - } -} - -impl AbiEncoder for SolEncoder { - fn base(self) -> u256 { - self.start - } - - fn pos(self) -> u256 { - self.pos - } - - fn set_pos(mut self, new_pos: u256) { - self.pos = new_pos - } - - fn write_u8(mut self, v: u8) { - mstore8(self.pos, v) - self.pos = self.pos + 1 - } - - fn write_word(mut self, v: u256) { - let p = self.pos - mstore(p, v) - self.pos = p + 32 - } - - fn write_word_at(mut self, at: u256, v: u256) { - mstore(at, v) - } - - fn reserve_head(mut self, bytes: u256) -> u256 { - if self.start == 0 { - let ptr = mem::alloc(bytes) - self.start = ptr - self.pos = ptr - self.end = ptr + bytes - } - self.start - } - - fn append_tail(mut self, bytes: u256) -> u256 { - let ptr = mem::alloc(bytes) - self.end = ptr + bytes - ptr - } - - fn finish(self) -> (u256, u256) { - let start = self.start - (start, self.end - start) - } -} - -// --------------------------------------------------------------------------- -// SolCompat trait – maps Fe types to Solidity ABI type names -// --------------------------------------------------------------------------- - -/// Maps a Fe type to its Solidity ABI type name. -/// -/// The compiler uses this trait to build event signatures at compile time. -/// For example, `u256::SOL_TYPE` is `"uint256"` and `Address::SOL_TYPE` is -/// `"address"`. The `#[event]` desugaring generates a `TOPIC0` constant -/// from these values: -/// -/// ``` -/// const TOPIC0: u256 = keccak((Transfer::SOL_TYPE, "(", Address::SOL_TYPE, ",", u256::SOL_TYPE, ")")) -/// ``` -/// -/// Implement this trait for custom types to use them as event fields. -pub trait SolCompat { - type S: AsBytes - const SOL_TYPE: Self::S -} - -// Primitive unsigned integer implementations -impl SolCompat for u8 { - type S = String<5> - const SOL_TYPE: Self::S = "uint8" -} -impl SolCompat for u16 { - type S = String<6> - const SOL_TYPE: Self::S = "uint16" -} -impl SolCompat for u32 { - type S = String<6> - const SOL_TYPE: Self::S = "uint32" -} -impl SolCompat for u64 { - type S = String<6> - const SOL_TYPE: Self::S = "uint64" -} -impl SolCompat for u128 { - type S = String<7> - const SOL_TYPE: Self::S = "uint128" -} -impl SolCompat for u256 { - type S = String<7> - const SOL_TYPE: Self::S = "uint256" -} - -// Primitive signed integer implementations -impl SolCompat for i8 { - type S = String<4> - const SOL_TYPE: Self::S = "int8" -} -impl SolCompat for i16 { - type S = String<5> - const SOL_TYPE: Self::S = "int16" -} -impl SolCompat for i32 { - type S = String<5> - const SOL_TYPE: Self::S = "int32" -} -impl SolCompat for i64 { - type S = String<5> - const SOL_TYPE: Self::S = "int64" -} -impl SolCompat for i128 { - type S = String<6> - const SOL_TYPE: Self::S = "int128" -} -impl SolCompat for i256 { - type S = String<6> - const SOL_TYPE: Self::S = "int256" -} - -// Address implementation -impl SolCompat for Address { - type S = String<7> - const SOL_TYPE: Self::S = "address" -} - -// Bool implementation -impl SolCompat for bool { - type S = String<4> - const SOL_TYPE: Self::S = "bool" -} - -// --------------------------------------------------------------------------- -// TopicValue – converts indexed event field values to u256 log topics -// --------------------------------------------------------------------------- - -impl TopicValue for u8 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for u16 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for u32 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for u64 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for u128 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for u256 { - fn as_topic(self) -> u256 { self } -} -impl TopicValue for i8 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for i16 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for i32 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for i64 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for i128 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for i256 { - fn as_topic(self) -> u256 { self.downcast_unchecked() } -} -impl TopicValue for Address { - fn as_topic(self) -> u256 { self.inner } -} -impl TopicValue for bool { - fn as_topic(self) -> u256 { if self { 1 } else { 0 } } -} - -// --------------------------------------------------------------------------- -// Newtype wrappers for non-native Solidity integer types -// -// Solidity has integer types at every 8-bit width (uint24, int160, etc.) -// but Fe only has u8/u16/u32/u64/u128/u256 and their signed counterparts. -// These newtypes bridge the gap so that event signatures use the correct -// Solidity type names. Each wraps the smallest Fe integer that fits. -// --------------------------------------------------------------------------- - -// Unsigned newtypes wrapping u32 -pub struct Uint24 { pub val: u32 } -impl SolCompat for Uint24 { - type S = String<6> - const SOL_TYPE: Self::S = "uint24" -} -impl Encode for Uint24 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} - -// Unsigned newtypes wrapping u64 -pub struct Uint40 { pub val: u64 } -impl SolCompat for Uint40 { - type S = String<6> - const SOL_TYPE: Self::S = "uint40" -} -impl Encode for Uint40 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} -pub struct Uint48 { pub val: u64 } -impl SolCompat for Uint48 { - type S = String<6> - const SOL_TYPE: Self::S = "uint48" -} -impl Encode for Uint48 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} -pub struct Uint56 { pub val: u64 } -impl SolCompat for Uint56 { - type S = String<6> - const SOL_TYPE: Self::S = "uint56" -} -impl Encode for Uint56 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} - -// Unsigned newtypes wrapping u128 -pub struct Uint72 { pub val: u128 } -impl SolCompat for Uint72 { - type S = String<6> - const SOL_TYPE: Self::S = "uint72" -} -impl Encode for Uint72 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} -pub struct Uint80 { pub val: u128 } -impl SolCompat for Uint80 { - type S = String<6> - const SOL_TYPE: Self::S = "uint80" -} -impl Encode for Uint80 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} -pub struct Uint88 { pub val: u128 } -impl SolCompat for Uint88 { - type S = String<6> - const SOL_TYPE: Self::S = "uint88" -} -impl Encode for Uint88 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} -pub struct Uint96 { pub val: u128 } -impl SolCompat for Uint96 { - type S = String<6> - const SOL_TYPE: Self::S = "uint96" -} -impl Encode for Uint96 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} -pub struct Uint104 { pub val: u128 } -impl SolCompat for Uint104 { - type S = String<7> - const SOL_TYPE: Self::S = "uint104" -} -impl Encode for Uint104 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} -pub struct Uint112 { pub val: u128 } -impl SolCompat for Uint112 { - type S = String<7> - const SOL_TYPE: Self::S = "uint112" -} -impl Encode for Uint112 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} -pub struct Uint120 { pub val: u128 } -impl SolCompat for Uint120 { - type S = String<7> - const SOL_TYPE: Self::S = "uint120" -} -impl Encode for Uint120 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val as u256) } -} - -// Unsigned newtypes wrapping u256 -pub struct Uint136 { pub val: u256 } -impl SolCompat for Uint136 { - type S = String<7> - const SOL_TYPE: Self::S = "uint136" -} -impl Encode for Uint136 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint144 { pub val: u256 } -impl SolCompat for Uint144 { - type S = String<7> - const SOL_TYPE: Self::S = "uint144" -} -impl Encode for Uint144 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint152 { pub val: u256 } -impl SolCompat for Uint152 { - type S = String<7> - const SOL_TYPE: Self::S = "uint152" -} -impl Encode for Uint152 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint160 { pub val: u256 } -impl SolCompat for Uint160 { - type S = String<7> - const SOL_TYPE: Self::S = "uint160" -} -impl Encode for Uint160 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint168 { pub val: u256 } -impl SolCompat for Uint168 { - type S = String<7> - const SOL_TYPE: Self::S = "uint168" -} -impl Encode for Uint168 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint176 { pub val: u256 } -impl SolCompat for Uint176 { - type S = String<7> - const SOL_TYPE: Self::S = "uint176" -} -impl Encode for Uint176 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint184 { pub val: u256 } -impl SolCompat for Uint184 { - type S = String<7> - const SOL_TYPE: Self::S = "uint184" -} -impl Encode for Uint184 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint192 { pub val: u256 } -impl SolCompat for Uint192 { - type S = String<7> - const SOL_TYPE: Self::S = "uint192" -} -impl Encode for Uint192 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint200 { pub val: u256 } -impl SolCompat for Uint200 { - type S = String<7> - const SOL_TYPE: Self::S = "uint200" -} -impl Encode for Uint200 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint208 { pub val: u256 } -impl SolCompat for Uint208 { - type S = String<7> - const SOL_TYPE: Self::S = "uint208" -} -impl Encode for Uint208 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint216 { pub val: u256 } -impl SolCompat for Uint216 { - type S = String<7> - const SOL_TYPE: Self::S = "uint216" -} -impl Encode for Uint216 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint224 { pub val: u256 } -impl SolCompat for Uint224 { - type S = String<7> - const SOL_TYPE: Self::S = "uint224" -} -impl Encode for Uint224 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint232 { pub val: u256 } -impl SolCompat for Uint232 { - type S = String<7> - const SOL_TYPE: Self::S = "uint232" -} -impl Encode for Uint232 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint240 { pub val: u256 } -impl SolCompat for Uint240 { - type S = String<7> - const SOL_TYPE: Self::S = "uint240" -} -impl Encode for Uint240 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} -pub struct Uint248 { pub val: u256 } -impl SolCompat for Uint248 { - type S = String<7> - const SOL_TYPE: Self::S = "uint248" -} -impl Encode for Uint248 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val) } -} - -// Signed newtypes wrapping i32 -pub struct Int24 { pub val: i32 } -impl SolCompat for Int24 { - type S = String<5> - const SOL_TYPE: Self::S = "int24" -} -impl Encode for Int24 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} - -// Signed newtypes wrapping i64 -pub struct Int40 { pub val: i64 } -impl SolCompat for Int40 { - type S = String<5> - const SOL_TYPE: Self::S = "int40" -} -impl Encode for Int40 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int48 { pub val: i64 } -impl SolCompat for Int48 { - type S = String<5> - const SOL_TYPE: Self::S = "int48" -} -impl Encode for Int48 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int56 { pub val: i64 } -impl SolCompat for Int56 { - type S = String<5> - const SOL_TYPE: Self::S = "int56" -} -impl Encode for Int56 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} - -// Signed newtypes wrapping i128 -pub struct Int72 { pub val: i128 } -impl SolCompat for Int72 { - type S = String<5> - const SOL_TYPE: Self::S = "int72" -} -impl Encode for Int72 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int80 { pub val: i128 } -impl SolCompat for Int80 { - type S = String<5> - const SOL_TYPE: Self::S = "int80" -} -impl Encode for Int80 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int88 { pub val: i128 } -impl SolCompat for Int88 { - type S = String<5> - const SOL_TYPE: Self::S = "int88" -} -impl Encode for Int88 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int96 { pub val: i128 } -impl SolCompat for Int96 { - type S = String<5> - const SOL_TYPE: Self::S = "int96" -} -impl Encode for Int96 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int104 { pub val: i128 } -impl SolCompat for Int104 { - type S = String<6> - const SOL_TYPE: Self::S = "int104" -} -impl Encode for Int104 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int112 { pub val: i128 } -impl SolCompat for Int112 { - type S = String<6> - const SOL_TYPE: Self::S = "int112" -} -impl Encode for Int112 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int120 { pub val: i128 } -impl SolCompat for Int120 { - type S = String<6> - const SOL_TYPE: Self::S = "int120" -} -impl Encode for Int120 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} - -// Signed newtypes wrapping i256 -pub struct Int136 { pub val: i256 } -impl SolCompat for Int136 { - type S = String<6> - const SOL_TYPE: Self::S = "int136" -} -impl Encode for Int136 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int144 { pub val: i256 } -impl SolCompat for Int144 { - type S = String<6> - const SOL_TYPE: Self::S = "int144" -} -impl Encode for Int144 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int152 { pub val: i256 } -impl SolCompat for Int152 { - type S = String<6> - const SOL_TYPE: Self::S = "int152" -} -impl Encode for Int152 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int160 { pub val: i256 } -impl SolCompat for Int160 { - type S = String<6> - const SOL_TYPE: Self::S = "int160" -} -impl Encode for Int160 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int168 { pub val: i256 } -impl SolCompat for Int168 { - type S = String<6> - const SOL_TYPE: Self::S = "int168" -} -impl Encode for Int168 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int176 { pub val: i256 } -impl SolCompat for Int176 { - type S = String<6> - const SOL_TYPE: Self::S = "int176" -} -impl Encode for Int176 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int184 { pub val: i256 } -impl SolCompat for Int184 { - type S = String<6> - const SOL_TYPE: Self::S = "int184" -} -impl Encode for Int184 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int192 { pub val: i256 } -impl SolCompat for Int192 { - type S = String<6> - const SOL_TYPE: Self::S = "int192" -} -impl Encode for Int192 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int200 { pub val: i256 } -impl SolCompat for Int200 { - type S = String<6> - const SOL_TYPE: Self::S = "int200" -} -impl Encode for Int200 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int208 { pub val: i256 } -impl SolCompat for Int208 { - type S = String<6> - const SOL_TYPE: Self::S = "int208" -} -impl Encode for Int208 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int216 { pub val: i256 } -impl SolCompat for Int216 { - type S = String<6> - const SOL_TYPE: Self::S = "int216" -} -impl Encode for Int216 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int224 { pub val: i256 } -impl SolCompat for Int224 { - type S = String<6> - const SOL_TYPE: Self::S = "int224" -} -impl Encode for Int224 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int232 { pub val: i256 } -impl SolCompat for Int232 { - type S = String<6> - const SOL_TYPE: Self::S = "int232" -} -impl Encode for Int232 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int240 { pub val: i256 } -impl SolCompat for Int240 { - type S = String<6> - const SOL_TYPE: Self::S = "int240" -} -impl Encode for Int240 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} -pub struct Int248 { pub val: i256 } -impl SolCompat for Int248 { - type S = String<6> - const SOL_TYPE: Self::S = "int248" -} -impl Encode for Int248 { - fn encode>(own self, _ e: mut E) { e.write_word(self.val.downcast_unchecked()) } -} - -// --------------------------------------------------------------------------- -// TopicValue implementations for newtype wrappers -// --------------------------------------------------------------------------- - -impl TopicValue for Uint24 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint40 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint48 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint56 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint72 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint80 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint88 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint96 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint104 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint112 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint120 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint136 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint144 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint152 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint160 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint168 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint176 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint184 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint192 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint200 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint208 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint216 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint224 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint232 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint240 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Uint248 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int24 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int40 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int48 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int56 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int72 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int80 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int88 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int96 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int104 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int112 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int120 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int136 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int144 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int152 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int160 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int168 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int176 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int184 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int192 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int200 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int208 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int216 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int224 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int232 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int240 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} -impl TopicValue for Int248 { - fn as_topic(self) -> u256 { self.val.downcast_unchecked() } -} diff --git a/ingots/std/src/evm.fe b/ingots/std/src/evm.fe deleted file mode 100644 index bb3b9f9609..0000000000 --- a/ingots/std/src/evm.fe +++ /dev/null @@ -1,10 +0,0 @@ -pub use calldata::{self, *} -pub use memory_input::{self, *} -pub use effects::{self, *} -pub use event::{self, *} -pub use target::{self, *} -pub use intrinsic::{code_region_len, code_region_offset, contract_field_slot} -pub use mem::{self, *} -pub use mutex::{self, *} -pub use storage_map::{StorageKey, StorageMap} -pub use word::{self, *} diff --git a/ingots/std/src/evm/calldata.fe b/ingots/std/src/evm/calldata.fe deleted file mode 100644 index fe9fd72711..0000000000 --- a/ingots/std/src/evm/calldata.fe +++ /dev/null @@ -1,28 +0,0 @@ -use core::abi::ByteInput -use core::Copy -use core::num::IntDowncast -use ingot::evm::ops::{calldataload, calldatasize} - -pub struct CallData { - pub base: u256, -} - -impl Copy for CallData {} - -impl ByteInput for CallData { - fn len(self) -> u256 { - calldatasize() - self.base - } - - fn word_at(self, byte_offset: u256) -> u256 { - calldataload(self.base + byte_offset) - } - - fn byte_at(self, byte_offset: u256) -> u8 { - let word_offset = byte_offset - (byte_offset % 32) - let word = calldataload(self.base + word_offset) - let idx = byte_offset - word_offset - let shift = (31 - idx) * 8 - (word >> shift).downcast_truncate() - } -} diff --git a/ingots/std/src/evm/effects.fe b/ingots/std/src/evm/effects.fe deleted file mode 100644 index 60fb0cf6f5..0000000000 --- a/ingots/std/src/evm/effects.fe +++ /dev/null @@ -1,534 +0,0 @@ -use core::effect_ref::{EffectHandle, EffectHandleMut, EffectRef, EffectRefMut} -use core::{size_of} -use core::abi::{Abi, AbiDecoder, AbiEncoder, AbiSize, Decode, Encode} -use core::contracts::ContractHost -use core::message::MsgVariant - -use ingot::evm::intrinsic::{ - code_region_len as intrinsic_code_region_len, - code_region_offset as intrinsic_code_region_offset, -} -use ingot::abi::Sol -use ingot::abi::sol::{encoded_size, SolDecoder, SolEncoder} -use super::calldata::CallData -use super::contract_field_slot -use ingot::evm::mem -use ingot::evm::memory_input::MemoryBytes -use ingot::evm::ops - -// ----------------------------------------------------------------------------- -// Value types -// ----------------------------------------------------------------------------- - -/// EVM address (20 bytes). -/// -/// Represented as a single `u256` ABI word with the address stored in the low -/// 160 bits. -pub struct Address { - pub inner: u256 -} - -impl Address { - pub fn zero() -> Self { - Address { inner: 0 } - } -} - -impl core::ops::Eq for Address { - fn eq(self, _ other: Address) -> bool { - self.inner == other.inner - } -} - -impl Copy for Address {} - -impl AbiSize for Address { - const ENCODED_SIZE: u256 = 32 -} - -impl Decode for Address { - fn decode>(_ d: mut D) -> Self { - Address { inner: d.read_word() } - } -} - -impl Encode for Address { - fn encode>(own self, _ e: mut E) { - e.write_word(self.inner) - } -} - -/// Convert an EVM `Address` into its ABI word representation (`u256`). -pub fn address_to_word(addr: Address) -> u256 { - addr.inner -} - -// ----------------------------------------------------------------------------- -// Effect pointer providers -// ----------------------------------------------------------------------------- - -/// Memory pointer to a value of type `T`. -pub use core::effect_ref::MemPtr - -/// Storage pointer/handle to a value of type `T`. -pub use core::effect_ref::StorPtr - -/// Calldata pointer to a value of type `T` (read-only). -pub struct CalldataPtr { - pub offset: u256 -} - -impl EffectHandle for CalldataPtr { - type Target = T - type AddressSpace = core::effect_ref::Calldata - - fn from_raw(raw: u256) -> Self { - Self { offset: raw } - } - - fn raw(self) -> u256 { - self.offset - } -} - -impl EffectRef for CalldataPtr {} -// no EffectRefMut for calldata - -/// Transient storage pointer/handle to a value of type `T`. -/// -/// This is like `StorPtr`, but reads/writes are intended to compile to -/// EVM transient storage operations (TLOAD/TSTORE). -pub struct TStorPtr { - pub slot: u256 -} - -impl EffectHandle for TStorPtr { - type Target = T - type AddressSpace = core::effect_ref::TransientStorage - - fn from_raw(raw: u256) -> Self { - Self { slot: raw } - } - - fn raw(self) -> u256 { - self.slot - } -} - -impl EffectHandleMut for TStorPtr {} - -impl EffectRef for TStorPtr {} -impl EffectRefMut for TStorPtr {} - -// ----------------------------------------------------------------------------- -// EVM effects -// ----------------------------------------------------------------------------- - -/// EVM execution context (env access). -pub trait Ctx { - fn address(self) -> Address - fn caller(self) -> Address - fn value(self) -> u256 - fn timestamp(self) -> u256 - fn block_number(self) -> u256 -} - -/// Low-level raw memory operations. -pub trait RawMem { - fn mload(self, addr: u256) -> u256 - fn mstore(mut self, addr: u256, value: u256) - fn mstore8(mut self, addr: u256, value: u8) - fn mem_ptr(self, addr: u256) -> MemPtr { - MemPtr::from_raw(addr) - } -} - -/// Low-level raw storage operations. -pub trait RawStorage { - fn sload(self, slot: u256) -> u256 - fn sstore(mut self, slot: u256, value: u256) - fn stor_ptr(self, slot: u256) -> StorPtr { - StorPtr::from_raw(slot) - } -} - -/// Access to low-level EVM op functions (Yul-exposed builtins, excluding raw stack ops). -pub trait RawOps: RawMem + RawStorage { - fn calldataload(self, offset: u256) -> u256 - fn calldatasize(self) -> u256 - fn calldatacopy(mut self, dest: u256, offset: u256, len: u256) - - fn returndatasize(self) -> u256 - fn returndatacopy(mut self, dest: u256, offset: u256, len: u256) - - fn codecopy(mut self, dest: u256, offset: u256, len: u256) - fn codesize(self) -> u256 - - fn keccak256(self, offset: u256, len: u256) -> u256 - - fn revert(self, offset: u256, len: u256) -> ! - fn return_data(self, offset: u256, len: u256) -> ! - - fn code_region_offset(self, f: F) -> u256 - fn code_region_len(self, f: F) -> u256 -} - -pub trait Log { - fn log0(mut self, offset: u256, len: u256) - fn log1(mut self, offset: u256, len: u256, topic0: u256) - fn log2(mut self, offset: u256, len: u256, topic0: u256, topic1: u256) - fn log3(mut self, offset: u256, len: u256, topic0: u256, topic1: u256, topic2: u256) - fn log4(mut self, offset: u256, len: u256, topic0: u256, topic1: u256, topic2: u256, topic3: u256) - - /// Emit a Solidity-compatible event log (`log1`-`log4`). - /// - /// This delegates to the `std::evm::Event` implementation generated for - /// `#[event]` structs. - fn emit(mut self, event: E) - where E: super::event::Event - { - event.emit(self) - } -} - -/// Metadata for deployable high-level contracts. -/// -/// The compiler synthesizes an implementation of this trait for each high-level -/// `contract` item, enabling typed `CREATE`/`CREATE2` from within other -/// contracts. -pub trait Contract { - /// Constructor argument tuple, ABI-encodable under the default ABI. - type InitArgs: Encode - - /// Offset of this contract's initcode within the current artifact. - fn init_code_offset() -> u256 - - /// Length (in bytes) of this contract's initcode within the current artifact. - fn init_code_len() -> u256 -} - -pub trait Create { - /// Low-level `CREATE` opcode. - fn create_raw(mut self, value: u256, offset: u256, len: u256) -> Address { - Address { inner: ops::create(value, offset, len) } - } - - /// Low-level `CREATE2` opcode. - fn create2_raw(mut self, value: u256, offset: u256, len: u256, salt: u256) -> Address { - Address { inner: ops::create2(value, offset, len, salt) } - } - - /// Deploy a high-level contract using `CREATE`, bubbling revert data on failure. - fn create(mut self, value: u256, args: own C::InitArgs) -> Address { - let init_len = C::init_code_len() - let init_off = C::init_code_offset() - let args_len = encoded_size() - let total_len = init_len + args_len - - // Build `initcode || abi.encode(args)` contiguously. - let init_ptr = mem::alloc(total_len) - ops::codecopy(dest: init_ptr, offset: init_off, len: init_len) - let args_ptr = init_ptr + init_len - let mut enc = SolEncoder { start: args_ptr, pos: args_ptr, end: args_ptr + args_len } - args.encode(mut enc) - - let addr = self.create_raw(value, init_ptr, total_len) - - // Solidity-style behavior: bubble revert data if creation fails. - if addr.inner == 0 { - let ret_len = ops::returndatasize() - let ret_ptr = mem::alloc(ret_len) - ops::returndatacopy(dest: ret_ptr, offset: 0, len: ret_len) - ops::revert(ret_ptr, ret_len) - } - - addr - } - - /// Deploy a high-level contract using `CREATE2`, bubbling revert data on failure. - fn create2(mut self, value: u256, args: own C::InitArgs, salt: u256) -> Address { - let init_len = C::init_code_len() - let init_off = C::init_code_offset() - let args_len = encoded_size() - let total_len = init_len + args_len - - // Build `initcode || abi.encode(args)` contiguously. - let init_ptr = mem::alloc(total_len) - ops::codecopy(dest: init_ptr, offset: init_off, len: init_len) - let args_ptr = init_ptr + init_len - let mut enc = SolEncoder { start: args_ptr, pos: args_ptr, end: args_ptr + args_len } - args.encode(mut enc) - - let addr = self.create2_raw(value, init_ptr, total_len, salt) - - // Solidity-style behavior: bubble revert data if creation fails. - if addr.inner == 0 { - let ret_len = ops::returndatasize() - let ret_ptr = mem::alloc(ret_len) - ops::returndatacopy(dest: ret_ptr, offset: 0, len: ret_len) - ops::revert(ret_ptr, ret_len) - } - - addr - } -} - -/// High-level contract calls with ABI encoding/decoding. -pub trait Call { - fn call(mut self, addr: own Address, gas: u256, value: u256, message: own M) -> M::Return - where M: MsgVariant + Encode, - M::Return: Decode - - fn static(mut self, addr: own Address, gas: u256, message: own M) -> M::Return - where M: MsgVariant + Encode, - M::Return: Decode - - fn delegate(mut self, addr: own Address, gas: u256, message: own M) -> M::Return - where M: MsgVariant + Encode, - M::Return: Decode -} - -impl Address { - /// Call a contract at this address with a typed message. - /// - /// Forwards all available gas and sends no value. Reverts on failure. - pub fn call(self, _ message: own M) -> M::Return uses (call: mut Call) - where M: MsgVariant + Encode, - M::Return: Decode - { - call.call(addr: self, gas: ops::gas(), value: 0, message) - } -} - -/// Combined EVM capability: provides all EVM effects. -pub trait Super: Ctx + RawOps + Log + Create + Call {} - -struct Private {} - -/// Default EVM effect provider (zero-sized). -pub struct Evm { - seal: Private -} - -impl Ctx for Evm { - fn address(self) -> Address { Address { inner: ops::address() } } - fn caller(self) -> Address { Address { inner: ops::caller() } } - fn value(self) -> u256 { ops::callvalue() } - fn timestamp(self) -> u256 { ops::timestamp() } - fn block_number(self) -> u256 { ops::number() } -} - -impl RawMem for Evm { - fn mload(self, addr: u256) -> u256 { ops::mload(addr) } - fn mstore(mut self, addr: u256, value: u256) { ops::mstore(addr, value) } - fn mstore8(mut self, addr: u256, value: u8) { ops::mstore8(addr, value) } -} - -impl RawStorage for Evm { - fn sload(self, slot: u256) -> u256 { ops::sload(slot) } - fn sstore(mut self, slot: u256, value: u256) { ops::sstore(slot: slot, value: value) } -} - -impl RawOps for Evm { - fn calldataload(self, offset: u256) -> u256 { ops::calldataload(offset) } - fn calldatasize(self) -> u256 { ops::calldatasize() } - fn calldatacopy(mut self, dest: u256, offset: u256, len: u256) { - ops::calldatacopy(dest: dest, offset: offset, len: len) - } - - fn returndatasize(self) -> u256 { ops::returndatasize() } - fn returndatacopy(mut self, dest: u256, offset: u256, len: u256) { - ops::returndatacopy(dest: dest, offset: offset, len: len) - } - - fn codecopy(mut self, dest: u256, offset: u256, len: u256) { - ops::codecopy(dest: dest, offset: offset, len: len) - } - - fn codesize(self) -> u256 { ops::codesize() } - - fn keccak256(self, offset: u256, len: u256) -> u256 { ops::keccak256(offset, len) } - - fn revert(self, offset: u256, len: u256) -> ! { ops::revert(offset, len) } - fn return_data(self, offset: u256, len: u256) -> ! { ops::return_data(offset, len) } - - fn code_region_offset(self, f: F) -> u256 { intrinsic_code_region_offset(f) } - fn code_region_len(self, f: F) -> u256 { intrinsic_code_region_len(f) } -} - -impl Log for Evm { - // Logging opcodes. - fn log0(mut self, offset: u256, len: u256) { ops::log0(offset: offset, len: len) } - fn log1(mut self, offset: u256, len: u256, topic0: u256) { ops::log1(offset: offset, len: len, topic0: topic0) } - fn log2(mut self, offset: u256, len: u256, topic0: u256, topic1: u256) { ops::log2(offset: offset, len: len, topic0: topic0, topic1: topic1) } - fn log3(mut self, offset: u256, len: u256, topic0: u256, topic1: u256, topic2: u256) { ops::log3(offset: offset, len: len, topic0: topic0, topic1: topic1, topic2: topic2) } - fn log4(mut self, offset: u256, len: u256, topic0: u256, topic1: u256, topic2: u256, topic3: u256) { ops::log4(offset: offset, len: len, topic0: topic0, topic1: topic1, topic2: topic2, topic3: topic3) } -} - -impl Create for Evm { - fn create_raw(mut self, value: u256, offset: u256, len: u256) -> Address { - Address { inner: ops::create(value, offset, len) } - } - fn create2_raw(mut self, value: u256, offset: u256, len: u256, salt: u256) -> Address { - Address { inner: ops::create2(value, offset, len, salt) } - } -} - -fn encode_calldata(selector: u32, message: own M) -> (u256, u256) - where M: Encode -{ - let selector_size = size_of() - let head_size = selector_size + encoded_size() - - let mut enc = SolEncoder::new() - let base = enc.reserve_head(head_size) - - // Encode the 4-byte selector into the first word (big-endian), - // leaving the remaining 28 bytes as zeros. - let selector_word = (selector as u256) << 224 - ops::mstore(base, selector_word) - - enc.set_pos(base + selector_size) - message.encode(mut enc) - enc.finish() -} - -fn decode_returndata(ptr: u256, len: u256) -> R - where R: Decode -{ - if len < encoded_size() { - ops::revert(0, 0) - } - - let input = MemoryBytes { base: ptr, len: len } - let mut d = SolDecoder::new(input) - R::decode(mut d) -} - -impl Call for Evm { - fn call(mut self, addr: own Address, gas: u256, value: u256, message: own M) -> M::Return - where M: MsgVariant + Encode, - M::Return: Decode - { - let out: (u256, u256) = encode_calldata(>::SELECTOR, message) - let ok = ops::call( - gas: gas, - addr: addr.inner, - value: value, - args_offset: out.0, - args_len: out.1, - ret_offset: 0, - ret_len: 0, - ) - - let ret_len = ops::returndatasize() - let ret_ptr = mem::alloc(ret_len) - ops::returndatacopy(dest: ret_ptr, offset: 0, len: ret_len) - - if ok == 0 { - ops::revert(ret_ptr, ret_len) - } - - decode_returndata(ret_ptr, ret_len) - } - - fn static(mut self, addr: own Address, gas: u256, message: own M) -> M::Return - where M: MsgVariant + Encode, - M::Return: Decode - { - let out: (u256, u256) = encode_calldata(>::SELECTOR, message) - let ok = ops::staticcall( - gas: gas, - addr: addr.inner, - args_offset: out.0, - args_len: out.1, - ret_offset: 0, - ret_len: 0, - ) - - let ret_len = ops::returndatasize() - let ret_ptr = mem::alloc(ret_len) - ops::returndatacopy(dest: ret_ptr, offset: 0, len: ret_len) - - if ok == 0 { - ops::revert(ret_ptr, ret_len) - } - - decode_returndata(ret_ptr, ret_len) - } - - fn delegate(mut self, addr: own Address, gas: u256, message: own M) -> M::Return - where M: MsgVariant + Encode, - M::Return: Decode - { - let out: (u256, u256) = encode_calldata(>::SELECTOR, message) - let ok = ops::delegatecall( - gas: gas, - addr: addr.inner, - args_offset: out.0, - args_len: out.1, - ret_offset: 0, - ret_len: 0, - ) - - let ret_len = ops::returndatasize() - let ret_ptr = mem::alloc(ret_len) - ops::returndatacopy(dest: ret_ptr, offset: 0, len: ret_len) - - if ok == 0 { - ops::revert(ret_ptr, ret_len) - } - - decode_returndata(ret_ptr, ret_len) - } -} - -pub fn assert(_ b: own bool) { - if !b { - ops::revert(0, 0) - } -} - -impl Super for Evm {} - -impl ContractHost for Evm { - type Input = CallData - type InitInput = MemoryBytes - - fn input(self) -> Self::Input { - CallData { base: 0 } - } - - fn init_input(mut self, runtime: F) -> Self::InitInput { - let offset = self.code_region_offset(runtime) - let len = self.code_region_len(runtime) - let args_offset = offset + len - let code_size = self.codesize() - if code_size < args_offset { - self.abort() - } - let args_len = code_size - args_offset - let args_ptr = mem::alloc(args_len) - self.codecopy(args_ptr, args_offset, args_len) - MemoryBytes { base: args_ptr, len: args_len } - } - - fn field(mut self, slot: u256) -> core::effect_ref::StorPtr { - self.stor_ptr(slot) - } - - fn create_contract(mut self, runtime: F) -> ! { - let len = self.code_region_len(runtime) - let offset = self.code_region_offset(runtime) - self.codecopy(0, offset, len) - self.return_data(0, len) - } - - fn abort(self) -> ! { - self.revert(0, 0) - } - - fn return_bytes(self, ptr: u256, len: u256) -> ! { - self.return_data(ptr, len) - } -} diff --git a/ingots/std/src/evm/event.fe b/ingots/std/src/evm/event.fe deleted file mode 100644 index 857849e906..0000000000 --- a/ingots/std/src/evm/event.fe +++ /dev/null @@ -1,26 +0,0 @@ -use super::effects::Log - -/// Trait implemented by `#[event]` structs. -/// -/// `Event.emit(self, log)` emits an EVM log whose first topic (`topic0`) is the -/// keccak256 hash of the Solidity-compatible event signature, followed by up to -/// 3 indexed field topics, and ABI-encoded data for any non-indexed fields. -/// -/// The ergonomic API is `std::evm::Log::emit(log, event)`, which delegates to -/// this method for `#[event]` structs. -pub trait Event { - /// The keccak256 hash of the Solidity-compatible event signature. - const TOPIC0: u256 - - /// Emit this event using the given EVM effect provider. - fn emit(self, log: mut L) -} - -/// Converts an indexed event field value to a `u256` log topic. -/// -/// The `#[event]` desugaring generates `value.as_topic()` calls for each -/// `#[indexed]` field. Implement this trait for custom types to use them as -/// indexed event fields. -pub trait TopicValue { - fn as_topic(self) -> u256 -} diff --git a/ingots/std/src/evm/intrinsic.fe b/ingots/std/src/evm/intrinsic.fe deleted file mode 100644 index 6f4f4406da..0000000000 --- a/ingots/std/src/evm/intrinsic.fe +++ /dev/null @@ -1,16 +0,0 @@ -/// EVM-related compiler intrinsics (not Yul builtins). -/// -/// These are provided by the compiler backend and/or resolved at compile time. -extern { - /// Return the code offset/size for the call graph rooted at `func`. - /// - /// Lowered to `dataoffset/datasize` during codegen. - pub fn code_region_offset(_: F) -> u256 - pub fn code_region_len(_: F) -> u256 - - /// Returns the fixed storage slot offset (in 32-byte slots) for the given contract field - /// index within the current contract. - /// - /// This is intended for compiler-generated code; the backend replaces this with a literal. - pub fn contract_field_slot(field_idx: u256) -> u256 -} diff --git a/ingots/std/src/evm/mem.fe b/ingots/std/src/evm/mem.fe deleted file mode 100644 index e2505ef693..0000000000 --- a/ingots/std/src/evm/mem.fe +++ /dev/null @@ -1,11 +0,0 @@ -/// Dynamic memory allocation in EVM linear memory. -/// -/// This is a compiler intrinsic: backend-specific lowering is handled in codegen. -extern { - /// Allocates `size` bytes and returns the start pointer (byte offset). - /// - /// - Yul backend: uses the free-memory pointer at `0x40` and clamps it to `>= 0x2000` - /// (to stay above backend-reserved memory regions). - /// - Sonatina backend: lowered to `evm_malloc`. - pub fn alloc(size: u256) -> u256 -} diff --git a/ingots/std/src/evm/memory_input.fe b/ingots/std/src/evm/memory_input.fe deleted file mode 100644 index 87e0edb423..0000000000 --- a/ingots/std/src/evm/memory_input.fe +++ /dev/null @@ -1,29 +0,0 @@ -use core::abi::ByteInput -use core::Copy -use core::num::IntDowncast -use ingot::evm::ops::mload - -pub struct MemoryBytes { - pub base: u256, - pub len: u256, -} - -impl Copy for MemoryBytes {} - -impl ByteInput for MemoryBytes { - fn len(self) -> u256 { - self.len - } - - fn word_at(self, byte_offset: u256) -> u256 { - mload(self.base + byte_offset) - } - - fn byte_at(self, byte_offset: u256) -> u8 { - let word_offset = byte_offset - (byte_offset % 32) - let word = mload(self.base + word_offset) - let idx = byte_offset - word_offset - let shift = (31 - idx) * 8 - (word >> shift).downcast_truncate() - } -} diff --git a/ingots/std/src/evm/mutex.fe b/ingots/std/src/evm/mutex.fe deleted file mode 100644 index 5bf45fde52..0000000000 --- a/ingots/std/src/evm/mutex.fe +++ /dev/null @@ -1,61 +0,0 @@ -use core::effect_ref::EffectHandle - -use super::effects::{TStorPtr, assert} - -/// A storage-backed value guarded by a transient reentrancy lock. -/// -/// `LOCK_SLOT` identifies the transient storage slot used for the lock bit. -pub struct Mutex { - pub value: T -} - -fn lock_get() -> bool uses (lock: bool) { - lock -} - -fn lock_set(value: bool) uses (lock: mut bool) { - lock = value -} - -impl Mutex { - fn lock_ptr() -> TStorPtr { - TStorPtr::from_raw(LOCK_SLOT) - } - - pub fn lock(mut self) -> mut T { - let mut lock = Self::lock_ptr() - with (lock) { - if lock_get() { - assert(false) - } - lock_set(value: true) - mut self.value - } - } - - pub fn try_lock(mut self) -> Option { - let mut lock = Self::lock_ptr() - with (lock) { - if lock_get() { - Option::None - } else { - lock_set(value: true) - Option::Some(mut self.value) - } - } - } - - pub fn unlock(mut self) { - let mut lock = Self::lock_ptr() - with (lock) { - lock_set(value: false) - } - } - - pub fn is_locked(self) -> bool { - let lock = Self::lock_ptr() - with (lock) { - lock_get() - } - } -} diff --git a/ingots/std/src/evm/ops.fe b/ingots/std/src/evm/ops.fe deleted file mode 100644 index 16739776ad..0000000000 --- a/ingots/std/src/evm/ops.fe +++ /dev/null @@ -1,104 +0,0 @@ -/// Low-level EVM/Yul builtins exposed as `extern` functions. -/// -/// This module is intended to be internal to `std` (it should not be re-exported -/// to non-std ingots). Higher-level access is provided via `std::evm::effects`. -extern { - // ------------------------------------------------------------------------- - // Memory - // ------------------------------------------------------------------------- - pub fn mload(_: u256) -> u256 - pub fn mstore(_: u256, _: u256) - pub fn mstore8(_: u256, _: u8) - pub fn msize() -> u256 - - // ------------------------------------------------------------------------- - // Storage - // ------------------------------------------------------------------------- - pub fn sload(_: u256) -> u256 - pub fn sstore(slot: u256, value: u256) - - // ------------------------------------------------------------------------- - // Calldata / returndata - // ------------------------------------------------------------------------- - pub fn calldataload(_: u256) -> u256 - pub fn calldatacopy(dest: u256, offset: u256, len: u256) - pub fn calldatasize() -> u256 - pub fn returndatacopy(dest: u256, offset: u256, len: u256) - pub fn returndatasize() -> u256 - - // ------------------------------------------------------------------------- - // Code / hashing - // ------------------------------------------------------------------------- - pub fn codecopy(dest: u256, offset: u256, len: u256) - pub fn codesize() -> u256 - pub fn keccak256(_: u256, _: u256) -> u256 - pub fn addmod(a: u256, b: u256, m: u256) -> u256 - pub fn mulmod(a: u256, b: u256, m: u256) -> u256 - - // ------------------------------------------------------------------------- - // Environment - // ------------------------------------------------------------------------- - pub fn address() -> u256 - pub fn caller() -> u256 - pub fn callvalue() -> u256 - pub fn origin() -> u256 - pub fn gasprice() -> u256 - pub fn coinbase() -> u256 - pub fn timestamp() -> u256 - pub fn number() -> u256 - pub fn prevrandao() -> u256 - pub fn gaslimit() -> u256 - pub fn chainid() -> u256 - pub fn basefee() -> u256 - pub fn selfbalance() -> u256 - pub fn blockhash(_: u256) -> u256 - pub fn gas() -> u256 - - // ------------------------------------------------------------------------- - // Calls / create - // ------------------------------------------------------------------------- - pub fn call( - gas: u256, - addr: u256, - value: u256, - args_offset: u256, - args_len: u256, - ret_offset: u256, - ret_len: u256, - ) -> u256 - pub fn staticcall( - gas: u256, - addr: u256, - args_offset: u256, - args_len: u256, - ret_offset: u256, - ret_len: u256, - ) -> u256 - pub fn delegatecall( - gas: u256, - addr: u256, - args_offset: u256, - args_len: u256, - ret_offset: u256, - ret_len: u256, - ) -> u256 - pub fn create(value: u256, offset: u256, len: u256) -> u256 - pub fn create2(value: u256, offset: u256, len: u256, salt: u256) -> u256 - - // ------------------------------------------------------------------------- - // Logs - // ------------------------------------------------------------------------- - pub fn log0(offset: u256, len: u256) - pub fn log1(offset: u256, len: u256, topic0: u256) - pub fn log2(offset: u256, len: u256, topic0: u256, topic1: u256) - pub fn log3(offset: u256, len: u256, topic0: u256, topic1: u256, topic2: u256) - pub fn log4(offset: u256, len: u256, topic0: u256, topic1: u256, topic2: u256, topic3: u256) - - // ------------------------------------------------------------------------- - // Control flow - // ------------------------------------------------------------------------- - pub fn revert(_: u256, _: u256) -> ! - pub fn return_data(_: u256, _: u256) -> ! - pub fn selfdestruct(_: u256) -> ! - pub fn stop() -> ! -} diff --git a/ingots/std/src/evm/storage_map.fe b/ingots/std/src/evm/storage_map.fe deleted file mode 100644 index 84a128b23f..0000000000 --- a/ingots/std/src/evm/storage_map.fe +++ /dev/null @@ -1,83 +0,0 @@ -use super::effects::Address -use super::mem -use ingot::evm::ops::{keccak256, mstore, sload, sstore} -use ingot::evm::word::WordRepr -use core::{EffectRef, EffectRefMut} - -/// Keys that can be written into the mapping preimage for keccak hashing. -pub trait StorageKey { - /// Writes the key bytes at `ptr` and returns the length written. - fn write_key(ptr: u256, self) -> u256 -} - -impl StorageKey for u256 { - fn write_key(ptr: u256, self) -> u256 { - mstore(ptr, self) - 32 - } -} - -impl StorageKey for Address { - fn write_key(ptr: u256, self) -> u256 { - u256::write_key(ptr, self.inner) - } -} - -/// A storage-backed mapping from keys `K` to values `V`. -/// -/// `SALT` is the mapping's slot seed (the `slot` component in -/// `keccak256(key ++ slot)`), chosen explicitly for each mapping instance to -/// prevent collisions. -pub struct StorageMap {} - -fn storagemap_storage_slot_with_salt(key: K, salt: u256) -> u256 - where K: StorageKey -{ - // keccak256(key ++ slot) - standard Solidity mapping layout - // Use the current heap pointer as scratch to avoid clobbering live heap data. - // `mem::alloc(0)` also ensures we stay above any backend-reserved zones. - let ptr = mem::alloc(0) - let key_len = K::write_key(ptr, key) - mstore(ptr + key_len, salt) - keccak256(ptr, key_len + 32) -} - -fn storagemap_get_word_with_salt(key: K, salt: u256) -> u256 - where K: StorageKey -{ - let storage_slot = storagemap_storage_slot_with_salt(key, salt) - sload(storage_slot) -} - -fn storagemap_set_word_with_salt(key: K, salt: u256, word: u256) - where K: StorageKey -{ - let storage_slot = storagemap_storage_slot_with_salt(key, salt) - sstore(storage_slot, word) -} - -impl StorageMap { - pub fn new() -> Self { - Self {} - } - - pub fn get(self, key: K) -> V { - V::from_word(word: storagemap_get_word_with_salt(key, SALT)) - } - - pub fn set(self, key: K, value: own V) { - storagemap_set_word_with_salt(key, SALT, value.to_word()) - } -} - - - -impl StorageKey for (A, B) -where A: StorageKey, - B: StorageKey { - fn write_key(ptr: u256, self) -> u256 { - let a_len = A::write_key(ptr, self.0) - let b_len = B::write_key(ptr + a_len, self.1) - a_len + b_len - } -} diff --git a/ingots/std/src/evm/target.fe b/ingots/std/src/evm/target.fe deleted file mode 100644 index fb6e1f447b..0000000000 --- a/ingots/std/src/evm/target.fe +++ /dev/null @@ -1,9 +0,0 @@ -use core::contracts::Target -use super::effects::Evm - -pub struct EvmTarget {} - -impl Target for EvmTarget { - type RootEffect = Evm - type DefaultAbi = super::super::abi::Sol -} diff --git a/ingots/std/src/evm/word.fe b/ingots/std/src/evm/word.fe deleted file mode 100644 index c89ae66dd0..0000000000 --- a/ingots/std/src/evm/word.fe +++ /dev/null @@ -1,145 +0,0 @@ -use core::num::* - -/// A value that can round-trip through an EVM word (`u256`). -/// -/// This replaces the older `LoadableScalar` / `StorableScalar` split with a -/// single trait that supports both primitives and user-defined newtypes. -pub trait WordRepr { - fn from_word(word: u256) -> Self - fn to_word(own self) -> u256 -} - -impl WordRepr for u8 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self as u256 - } -} - -impl WordRepr for u16 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self as u256 - } -} - -impl WordRepr for u32 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self as u256 - } -} - -impl WordRepr for u64 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self as u256 - } -} - -impl WordRepr for u128 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self as u256 - } -} - -impl WordRepr for u256 { - fn from_word(word: u256) -> Self { - word - } - fn to_word(own self) -> u256 { - self - } -} - -impl WordRepr for usize { - fn from_word(word: u256) -> Self { - word as usize - } - fn to_word(own self) -> u256 { - self as u256 - } -} - -impl WordRepr for bool { - fn from_word(word: u256) -> Self { - word != 0 - } - fn to_word(own self) -> u256 { - if self { 1 } else { 0 } - } -} - -impl WordRepr for i8 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self.downcast_unchecked() - } -} - -impl WordRepr for i16 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self.downcast_unchecked() - } -} - -impl WordRepr for i32 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self.downcast_unchecked() - } -} - -impl WordRepr for i64 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self.downcast_unchecked() - } -} - -impl WordRepr for i128 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self.downcast_unchecked() - } -} - -impl WordRepr for i256 { - fn from_word(word: u256) -> Self { - word.downcast_truncate() - } - fn to_word(own self) -> u256 { - self.downcast_unchecked() - } -} - -impl WordRepr for isize { - fn from_word(word: u256) -> Self { - word.downcast_unchecked() - } - fn to_word(own self) -> u256 { - self.downcast_unchecked() - } -} diff --git a/ingots/std/src/lib.fe b/ingots/std/src/lib.fe deleted file mode 100644 index a439527086..0000000000 --- a/ingots/std/src/lib.fe +++ /dev/null @@ -1,3 +0,0 @@ -pub use abi::{self, *} -pub use evm -pub use prelude diff --git a/ingots/std/src/prelude.fe b/ingots/std/src/prelude.fe deleted file mode 100644 index 6dca09b78a..0000000000 --- a/ingots/std/src/prelude.fe +++ /dev/null @@ -1,9 +0,0 @@ -// Re-export everything from the core prelude. -pub use core::prelude::* - -// ABI encoding traits and the Solidity ABI provider. -pub use core::abi::{Abi, AbiEncoder, AbiSize, Encode} -pub use super::abi::Sol - -// Common EVM types. -pub use super::evm::{Evm, Address, Call, Ctx, StorageMap, Create, Log, assert} diff --git a/logo/README.md b/logo/README.md deleted file mode 100644 index 3920eb6e4d..0000000000 --- a/logo/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Fe Programming Language Logo Design - -![](https://raw.githubusercontent.com/argotorg/fe/master/logo/fe_svg/fe_source.svg) - -## Background - -'Fe' is iron's symbol in the periodic table which in turn is the abbreviation -for the latin word ferrum that means firmness. - -Iron is Earth's 4th most abundant element while it is found in its core, -it is also naturally found as sedimentary rocks. These are rocks that formed -millions of years ago when Earth first started its oxygenation process -oxidizing iron particles in the atmosphere and sea. - - -## Fe Programming Language - -Iron is used to build durable things. The idea of making smart contracts out of iron -implies that they are also durable. This reinforces the notion of compiler correctness. \ No newline at end of file diff --git a/logo/fe_png/fe_favicon.png b/logo/fe_png/fe_favicon.png deleted file mode 100644 index 4b03fca54c..0000000000 Binary files a/logo/fe_png/fe_favicon.png and /dev/null differ diff --git a/logo/fe_png/fe_source_small_size.png b/logo/fe_png/fe_source_small_size.png deleted file mode 100644 index 924d8f7b44..0000000000 Binary files a/logo/fe_png/fe_source_small_size.png and /dev/null differ diff --git a/logo/fe_svg/fe_favicon.svg b/logo/fe_svg/fe_favicon.svg deleted file mode 100644 index 6dae1e6cb7..0000000000 --- a/logo/fe_svg/fe_favicon.svg +++ /dev/null @@ -1,10562 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/newsfragments/README.md b/newsfragments/README.md deleted file mode 100644 index 3b65e33471..0000000000 --- a/newsfragments/README.md +++ /dev/null @@ -1,27 +0,0 @@ -This directory collects "newsfragments": short files that each contains -a snippet of markdown formatted text that will be added to the next -release notes. This should be a description of aspects of the change -(if any) that are relevant to users. (This contrasts with the -commit message and PR description, which are a description of the change as -relevant to people working on the code itself.) - -Each file should be named like `..md`, where -`` is an issue numbers, and `` is one of: - -* `feature` -* `bugfix` -* `performance` -* `doc` -* `internal` -* `removal` -* `misc` - -So for example: `123.feature.md`, `456.bugfix.md` - -If the PR fixes an issue, use that number here. If there is no issue, -then open up the PR first and use the PR number for the newsfragment. - -Note that the `towncrier` tool will automatically -reflow your text, so don't try to do any fancy formatting. Run - `towncrier --draft` to get a preview of what the release notes entry - will look like in the final release notes. diff --git a/newsfragments/validate_files.py b/newsfragments/validate_files.py deleted file mode 100755 index 98fdf537bb..0000000000 --- a/newsfragments/validate_files.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python3 - -# Towncrier silently ignores files that do not match the expected ending. -# We use this script to ensure we catch these as errors in CI. - -import os -import pathlib -import sys - -ALLOWED_EXTENSIONS = { - '.bugfix.md', - '.doc.md', - '.feature.md', - '.internal.md', - '.misc.md', - '.performance.md', - '.removal.md', -} - -ALLOWED_FILES = { - 'validate_files.py', - 'README.md', -} - -THIS_DIR = pathlib.Path(__file__).parent - -num_args = len(sys.argv) - 1 -assert num_args in {0, 1} -if num_args == 1: - assert sys.argv[1] in ('is-empty', ) - -def ends_with_newline(file): - with open(file, 'r') as file: - return file.read().endswith('\n') - -for fragment_file in THIS_DIR.iterdir(): - if fragment_file.name in ALLOWED_FILES: - continue - elif num_args == 0: - full_extension = "".join(fragment_file.suffixes) - if full_extension not in ALLOWED_EXTENSIONS: - raise Exception(f"Unexpected file: {fragment_file}") - elif not ends_with_newline(fragment_file): - raise Exception( - f"Fragment files need to end with new line but { fragment_file.name } does not." - ) - elif sys.argv[1] == 'is-empty': - raise Exception(f"Unexpected file: {fragment_file}") - else: - raise RuntimeError("Strange: arguments {sys.argv} were validated, but not found") \ No newline at end of file diff --git a/privacy-policy.docx b/privacy-policy.docx new file mode 100644 index 0000000000..284936d717 Binary files /dev/null and b/privacy-policy.docx differ diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 86e9e86437..0000000000 --- a/pyproject.toml +++ /dev/null @@ -1,44 +0,0 @@ -[tool.towncrier] -# Read https://github.com/argotorg/fe/newsfragments/README.md for instructions -# package = "fe" -filename = "docs/src/release_notes.md" -directory = "newsfragments" -underlines = ["", ""] -issue_format = "[#{issue}](https://github.com/argotorg/fe/issues/{issue})" -start_string = "[//]: # (towncrier release notes start)" -title_format = "## {version} ({project_date})" - -[[tool.towncrier.type]] -directory = "feature" -name = "### Features" -showcontent = true - -[[tool.towncrier.type]] -directory = "bugfix" -name = "### Bugfixes" -showcontent = true - -[[tool.towncrier.type]] -directory = "performance" -name = "### Performance improvements" -showcontent = true - -[[tool.towncrier.type]] -directory = "doc" -name = "### Improved Documentation" -showcontent = true - -[[tool.towncrier.type]] -directory = "removal" -name = "### Deprecations and Removals" -showcontent = true - -[[tool.towncrier.type]] -directory = "internal" -name = "### Internal Changes - for Fe Contributors" -showcontent = true - -[[tool.towncrier.type]] -directory = "misc" -name = "### Miscellaneous changes" -showcontent = false \ No newline at end of file diff --git a/release.toml b/release.toml deleted file mode 100644 index e50592c62a..0000000000 --- a/release.toml +++ /dev/null @@ -1,4 +0,0 @@ -push-remote = "upstream" -publish = false -consolidate-commits = true -pre-release-commit-message = "Cutting new release"